文件 1 的 11:AaveGovernanceV2.sol
pragma solidity 0.7.5;
pragma abicoder v2;
import {IVotingStrategy} from '../interfaces/IVotingStrategy.sol';
import {IExecutorWithTimelock} from '../interfaces/IExecutorWithTimelock.sol';
import {IProposalValidator} from '../interfaces/IProposalValidator.sol';
import {IGovernanceStrategy} from '../interfaces/IGovernanceStrategy.sol';
import {IAaveGovernanceV2} from '../interfaces/IAaveGovernanceV2.sol';
import {Ownable} from '../dependencies/open-zeppelin/Ownable.sol';
import {SafeMath} from '../dependencies/open-zeppelin/SafeMath.sol';
import {isContract, getChainId} from '../misc/Helpers.sol';
contract AaveGovernanceV2 is Ownable, IAaveGovernanceV2 {
using SafeMath for uint256;
address private _governanceStrategy;
uint256 private _votingDelay;
uint256 private _proposalsCount;
mapping(uint256 => Proposal) private _proposals;
mapping(address => bool) private _authorizedExecutors;
address private _guardian;
bytes32 public constant DOMAIN_TYPEHASH = keccak256(
'EIP712Domain(string name,uint256 chainId,address verifyingContract)'
);
bytes32 public constant VOTE_EMITTED_TYPEHASH = keccak256('VoteEmitted(uint256 id,bool support)');
string public constant NAME = 'Aave Governance v2';
modifier onlyGuardian() {
require(msg.sender == _guardian, 'ONLY_BY_GUARDIAN');
_;
}
constructor(
address governanceStrategy,
uint256 votingDelay,
address guardian,
address[] memory executors
) {
_setGovernanceStrategy(governanceStrategy);
_setVotingDelay(votingDelay);
_guardian = guardian;
authorizeExecutors(executors);
}
struct CreateVars {
uint256 startBlock;
uint256 endBlock;
uint256 previousProposalsCount;
}
function create(
IExecutorWithTimelock executor,
address[] memory targets,
uint256[] memory values,
string[] memory signatures,
bytes[] memory calldatas,
bool[] memory withDelegatecalls,
bytes32 ipfsHash
) external override returns (uint256) {
require(targets.length != 0, 'INVALID_EMPTY_TARGETS');
require(
targets.length == values.length &&
targets.length == signatures.length &&
targets.length == calldatas.length &&
targets.length == withDelegatecalls.length,
'INCONSISTENT_PARAMS_LENGTH'
);
require(isExecutorAuthorized(address(executor)), 'EXECUTOR_NOT_AUTHORIZED');
require(
IProposalValidator(address(executor)).validateCreatorOfProposal(
this,
msg.sender,
block.number - 1
),
'PROPOSITION_CREATION_INVALID'
);
CreateVars memory vars;
vars.startBlock = block.number.add(_votingDelay);
vars.endBlock = vars.startBlock.add(IProposalValidator(address(executor)).VOTING_DURATION());
vars.previousProposalsCount = _proposalsCount;
Proposal storage newProposal = _proposals[vars.previousProposalsCount];
newProposal.id = vars.previousProposalsCount;
newProposal.creator = msg.sender;
newProposal.executor = executor;
newProposal.targets = targets;
newProposal.values = values;
newProposal.signatures = signatures;
newProposal.calldatas = calldatas;
newProposal.withDelegatecalls = withDelegatecalls;
newProposal.startBlock = vars.startBlock;
newProposal.endBlock = vars.endBlock;
newProposal.strategy = _governanceStrategy;
newProposal.ipfsHash = ipfsHash;
_proposalsCount++;
emit ProposalCreated(
vars.previousProposalsCount,
msg.sender,
executor,
targets,
values,
signatures,
calldatas,
withDelegatecalls,
vars.startBlock,
vars.endBlock,
_governanceStrategy,
ipfsHash
);
return newProposal.id;
}
function cancel(uint256 proposalId) external override {
ProposalState state = getProposalState(proposalId);
require(
state != ProposalState.Executed &&
state != ProposalState.Canceled &&
state != ProposalState.Expired,
'ONLY_BEFORE_EXECUTED'
);
Proposal storage proposal = _proposals[proposalId];
require(
msg.sender == _guardian ||
IProposalValidator(address(proposal.executor)).validateProposalCancellation(
this,
proposal.creator,
block.number - 1
),
'PROPOSITION_CANCELLATION_INVALID'
);
proposal.canceled = true;
for (uint256 i = 0; i < proposal.targets.length; i++) {
proposal.executor.cancelTransaction(
proposal.targets[i],
proposal.values[i],
proposal.signatures[i],
proposal.calldatas[i],
proposal.executionTime,
proposal.withDelegatecalls[i]
);
}
emit ProposalCanceled(proposalId);
}
function queue(uint256 proposalId) external override {
require(getProposalState(proposalId) == ProposalState.Succeeded, 'INVALID_STATE_FOR_QUEUE');
Proposal storage proposal = _proposals[proposalId];
uint256 executionTime = block.timestamp.add(proposal.executor.getDelay());
for (uint256 i = 0; i < proposal.targets.length; i++) {
_queueOrRevert(
proposal.executor,
proposal.targets[i],
proposal.values[i],
proposal.signatures[i],
proposal.calldatas[i],
executionTime,
proposal.withDelegatecalls[i]
);
}
proposal.executionTime = executionTime;
emit ProposalQueued(proposalId, executionTime, msg.sender);
}
function execute(uint256 proposalId) external payable override {
require(getProposalState(proposalId) == ProposalState.Queued, 'ONLY_QUEUED_PROPOSALS');
Proposal storage proposal = _proposals[proposalId];
proposal.executed = true;
for (uint256 i = 0; i < proposal.targets.length; i++) {
proposal.executor.executeTransaction{value: proposal.values[i]}(
proposal.targets[i],
proposal.values[i],
proposal.signatures[i],
proposal.calldatas[i],
proposal.executionTime,
proposal.withDelegatecalls[i]
);
}
emit ProposalExecuted(proposalId, msg.sender);
}
function submitVote(uint256 proposalId, bool support) external override {
return _submitVote(msg.sender, proposalId, support);
}
function submitVoteBySignature(
uint256 proposalId,
bool support,
uint8 v,
bytes32 r,
bytes32 s
) external override {
bytes32 digest = keccak256(
abi.encodePacked(
'\x19\x01',
keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(NAME)), getChainId(), address(this))),
keccak256(abi.encode(VOTE_EMITTED_TYPEHASH, proposalId, support))
)
);
address signer = ecrecover(digest, v, r, s);
require(signer != address(0), 'INVALID_SIGNATURE');
return _submitVote(signer, proposalId, support);
}
function setGovernanceStrategy(address governanceStrategy) external override onlyOwner {
_setGovernanceStrategy(governanceStrategy);
}
function setVotingDelay(uint256 votingDelay) external override onlyOwner {
_setVotingDelay(votingDelay);
}
function authorizeExecutors(address[] memory executors) public override onlyOwner {
for (uint256 i = 0; i < executors.length; i++) {
_authorizeExecutor(executors[i]);
}
}
function unauthorizeExecutors(address[] memory executors) public override onlyOwner {
for (uint256 i = 0; i < executors.length; i++) {
_unauthorizeExecutor(executors[i]);
}
}
function __abdicate() external override onlyGuardian {
_guardian = address(0);
}
function getGovernanceStrategy() external view override returns (address) {
return _governanceStrategy;
}
function getVotingDelay() external view override returns (uint256) {
return _votingDelay;
}
function isExecutorAuthorized(address executor) public view override returns (bool) {
return _authorizedExecutors[executor];
}
function getGuardian() external view override returns (address) {
return _guardian;
}
function getProposalsCount() external view override returns (uint256) {
return _proposalsCount;
}
function getProposalById(uint256 proposalId)
external
view
override
returns (ProposalWithoutVotes memory)
{
Proposal storage proposal = _proposals[proposalId];
ProposalWithoutVotes memory proposalWithoutVotes = ProposalWithoutVotes({
id: proposal.id,
creator: proposal.creator,
executor: proposal.executor,
targets: proposal.targets,
values: proposal.values,
signatures: proposal.signatures,
calldatas: proposal.calldatas,
withDelegatecalls: proposal.withDelegatecalls,
startBlock: proposal.startBlock,
endBlock: proposal.endBlock,
executionTime: proposal.executionTime,
forVotes: proposal.forVotes,
againstVotes: proposal.againstVotes,
executed: proposal.executed,
canceled: proposal.canceled,
strategy: proposal.strategy,
ipfsHash: proposal.ipfsHash
});
return proposalWithoutVotes;
}
function getVoteOnProposal(uint256 proposalId, address voter)
external
view
override
returns (Vote memory)
{
return _proposals[proposalId].votes[voter];
}
function getProposalState(uint256 proposalId) public view override returns (ProposalState) {
require(_proposalsCount >= proposalId, 'INVALID_PROPOSAL_ID');
Proposal storage proposal = _proposals[proposalId];
if (proposal.canceled) {
return ProposalState.Canceled;
} else if (block.number <= proposal.startBlock) {
return ProposalState.Pending;
} else if (block.number <= proposal.endBlock) {
return ProposalState.Active;
} else if (!IProposalValidator(address(proposal.executor)).isProposalPassed(this, proposalId)) {
return ProposalState.Failed;
} else if (proposal.executionTime == 0) {
return ProposalState.Succeeded;
} else if (proposal.executed) {
return ProposalState.Executed;
} else if (proposal.executor.isProposalOverGracePeriod(this, proposalId)) {
return ProposalState.Expired;
} else {
return ProposalState.Queued;
}
}
function _queueOrRevert(
IExecutorWithTimelock executor,
address target,
uint256 value,
string memory signature,
bytes memory callData,
uint256 executionTime,
bool withDelegatecall
) internal {
require(
!executor.isActionQueued(
keccak256(abi.encode(target, value, signature, callData, executionTime, withDelegatecall))
),
'DUPLICATED_ACTION'
);
executor.queueTransaction(target, value, signature, callData, executionTime, withDelegatecall);
}
function _submitVote(
address voter,
uint256 proposalId,
bool support
) internal {
require(getProposalState(proposalId) == ProposalState.Active, 'VOTING_CLOSED');
Proposal storage proposal = _proposals[proposalId];
Vote storage vote = proposal.votes[voter];
require(vote.votingPower == 0, 'VOTE_ALREADY_SUBMITTED');
uint256 votingPower = IVotingStrategy(proposal.strategy).getVotingPowerAt(
voter,
proposal.startBlock
);
if (support) {
proposal.forVotes = proposal.forVotes.add(votingPower);
} else {
proposal.againstVotes = proposal.againstVotes.add(votingPower);
}
vote.support = support;
vote.votingPower = uint248(votingPower);
emit VoteEmitted(proposalId, voter, support, votingPower);
}
function _setGovernanceStrategy(address governanceStrategy) internal {
_governanceStrategy = governanceStrategy;
emit GovernanceStrategyChanged(governanceStrategy, msg.sender);
}
function _setVotingDelay(uint256 votingDelay) internal {
_votingDelay = votingDelay;
emit VotingDelayChanged(votingDelay, msg.sender);
}
function _authorizeExecutor(address executor) internal {
_authorizedExecutors[executor] = true;
emit ExecutorAuthorized(executor);
}
function _unauthorizeExecutor(address executor) internal {
_authorizedExecutors[executor] = false;
emit ExecutorUnauthorized(executor);
}
}
文件 2 的 11:Context.sol
pragma solidity 0.7.5;
abstract contract Context {
function _msgSender() internal view virtual returns (address payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this;
return msg.data;
}
}
文件 3 的 11:Helpers.sol
pragma solidity 0.7.5;
pragma abicoder v2;
function getChainId() pure returns (uint256) {
uint256 chainId;
assembly {
chainId := chainid()
}
return chainId;
}
function isContract(address account) view returns (bool) {
bytes32 codehash;
bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
assembly {
codehash := extcodehash(account)
}
return (codehash != accountHash && codehash != 0x0);
}
文件 4 的 11:IAaveGovernanceV2.sol
pragma solidity 0.7.5;
pragma abicoder v2;
import {IExecutorWithTimelock} from './IExecutorWithTimelock.sol';
interface IAaveGovernanceV2 {
enum ProposalState {Pending, Canceled, Active, Failed, Succeeded, Queued, Expired, Executed}
struct Vote {
bool support;
uint248 votingPower;
}
struct Proposal {
uint256 id;
address creator;
IExecutorWithTimelock executor;
address[] targets;
uint256[] values;
string[] signatures;
bytes[] calldatas;
bool[] withDelegatecalls;
uint256 startBlock;
uint256 endBlock;
uint256 executionTime;
uint256 forVotes;
uint256 againstVotes;
bool executed;
bool canceled;
address strategy;
bytes32 ipfsHash;
mapping(address => Vote) votes;
}
struct ProposalWithoutVotes {
uint256 id;
address creator;
IExecutorWithTimelock executor;
address[] targets;
uint256[] values;
string[] signatures;
bytes[] calldatas;
bool[] withDelegatecalls;
uint256 startBlock;
uint256 endBlock;
uint256 executionTime;
uint256 forVotes;
uint256 againstVotes;
bool executed;
bool canceled;
address strategy;
bytes32 ipfsHash;
}
event ProposalCreated(
uint256 id,
address indexed creator,
IExecutorWithTimelock indexed executor,
address[] targets,
uint256[] values,
string[] signatures,
bytes[] calldatas,
bool[] withDelegatecalls,
uint256 startBlock,
uint256 endBlock,
address strategy,
bytes32 ipfsHash
);
event ProposalCanceled(uint256 id);
event ProposalQueued(uint256 id, uint256 executionTime, address indexed initiatorQueueing);
event ProposalExecuted(uint256 id, address indexed initiatorExecution);
event VoteEmitted(uint256 id, address indexed voter, bool support, uint256 votingPower);
event GovernanceStrategyChanged(address indexed newStrategy, address indexed initiatorChange);
event VotingDelayChanged(uint256 newVotingDelay, address indexed initiatorChange);
event ExecutorAuthorized(address executor);
event ExecutorUnauthorized(address executor);
function create(
IExecutorWithTimelock executor,
address[] memory targets,
uint256[] memory values,
string[] memory signatures,
bytes[] memory calldatas,
bool[] memory withDelegatecalls,
bytes32 ipfsHash
) external returns (uint256);
function cancel(uint256 proposalId) external;
function queue(uint256 proposalId) external;
function execute(uint256 proposalId) external payable;
function submitVote(uint256 proposalId, bool support) external;
function submitVoteBySignature(
uint256 proposalId,
bool support,
uint8 v,
bytes32 r,
bytes32 s
) external;
function setGovernanceStrategy(address governanceStrategy) external;
function setVotingDelay(uint256 votingDelay) external;
function authorizeExecutors(address[] memory executors) external;
function unauthorizeExecutors(address[] memory executors) external;
function __abdicate() external;
function getGovernanceStrategy() external view returns (address);
function getVotingDelay() external view returns (uint256);
function isExecutorAuthorized(address executor) external view returns (bool);
function getGuardian() external view returns (address);
function getProposalsCount() external view returns (uint256);
function getProposalById(uint256 proposalId) external view returns (ProposalWithoutVotes memory);
function getVoteOnProposal(uint256 proposalId, address voter) external view returns (Vote memory);
function getProposalState(uint256 proposalId) external view returns (ProposalState);
}
文件 5 的 11:IExecutorWithTimelock.sol
pragma solidity 0.7.5;
pragma abicoder v2;
import {IAaveGovernanceV2} from './IAaveGovernanceV2.sol';
interface IExecutorWithTimelock {
event NewPendingAdmin(address newPendingAdmin);
event NewAdmin(address newAdmin);
event NewDelay(uint256 delay);
event QueuedAction(
bytes32 actionHash,
address indexed target,
uint256 value,
string signature,
bytes data,
uint256 executionTime,
bool withDelegatecall
);
event CancelledAction(
bytes32 actionHash,
address indexed target,
uint256 value,
string signature,
bytes data,
uint256 executionTime,
bool withDelegatecall
);
event ExecutedAction(
bytes32 actionHash,
address indexed target,
uint256 value,
string signature,
bytes data,
uint256 executionTime,
bool withDelegatecall,
bytes resultData
);
function getAdmin() external view returns (address);
function getPendingAdmin() external view returns (address);
function getDelay() external view returns (uint256);
function isActionQueued(bytes32 actionHash) external view returns (bool);
function isProposalOverGracePeriod(IAaveGovernanceV2 governance, uint256 proposalId)
external
view
returns (bool);
function GRACE_PERIOD() external view returns (uint256);
function MINIMUM_DELAY() external view returns (uint256);
function MAXIMUM_DELAY() external view returns (uint256);
function queueTransaction(
address target,
uint256 value,
string memory signature,
bytes memory data,
uint256 executionTime,
bool withDelegatecall
) external returns (bytes32);
function executeTransaction(
address target,
uint256 value,
string memory signature,
bytes memory data,
uint256 executionTime,
bool withDelegatecall
) external payable returns (bytes memory);
function cancelTransaction(
address target,
uint256 value,
string memory signature,
bytes memory data,
uint256 executionTime,
bool withDelegatecall
) external returns (bytes32);
}
文件 6 的 11:IGovernanceStrategy.sol
pragma solidity 0.7.5;
pragma abicoder v2;
interface IGovernanceStrategy {
function getPropositionPowerAt(address user, uint256 blockNumber) external view returns (uint256);
function getTotalPropositionSupplyAt(uint256 blockNumber) external view returns (uint256);
function getTotalVotingSupplyAt(uint256 blockNumber) external view returns (uint256);
function getVotingPowerAt(address user, uint256 blockNumber) external view returns (uint256);
}
文件 7 的 11:IProposalValidator.sol
pragma solidity 0.7.5;
pragma abicoder v2;
import {IAaveGovernanceV2} from './IAaveGovernanceV2.sol';
interface IProposalValidator {
function validateCreatorOfProposal(
IAaveGovernanceV2 governance,
address user,
uint256 blockNumber
) external view returns (bool);
function validateProposalCancellation(
IAaveGovernanceV2 governance,
address user,
uint256 blockNumber
) external view returns (bool);
function isPropositionPowerEnough(
IAaveGovernanceV2 governance,
address user,
uint256 blockNumber
) external view returns (bool);
function getMinimumPropositionPowerNeeded(IAaveGovernanceV2 governance, uint256 blockNumber)
external
view
returns (uint256);
function isProposalPassed(IAaveGovernanceV2 governance, uint256 proposalId)
external
view
returns (bool);
function isQuorumValid(IAaveGovernanceV2 governance, uint256 proposalId)
external
view
returns (bool);
function isVoteDifferentialValid(IAaveGovernanceV2 governance, uint256 proposalId)
external
view
returns (bool);
function getMinimumVotingPowerNeeded(uint256 votingSupply) external view returns (uint256);
function PROPOSITION_THRESHOLD() external view returns (uint256);
function VOTING_DURATION() external view returns (uint256);
function VOTE_DIFFERENTIAL() external view returns (uint256);
function MINIMUM_QUORUM() external view returns (uint256);
function ONE_HUNDRED_WITH_PRECISION() external view returns (uint256);
}
文件 8 的 11:IVotingStrategy.sol
pragma solidity 0.7.5;
pragma abicoder v2;
interface IVotingStrategy {
function getVotingPowerAt(address user, uint256 blockNumber) external view returns (uint256);
}
文件 9 的 11:LyraGovernanceV2.sol
pragma solidity 0.7.5;
pragma abicoder v2;
import "@aave/governance-v2/contracts/governance/AaveGovernanceV2.sol";
contract LyraGovernanceV2 is AaveGovernanceV2 {
constructor(
address governanceStrategy,
uint256 votingDelay,
address guardian,
address[] memory executors
) AaveGovernanceV2(governanceStrategy, votingDelay, guardian, executors) {}
}
文件 10 的 11:Ownable.sol
pragma solidity 0.7.5;
import './Context.sol';
contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
function owner() public view returns (address) {
return _owner;
}
modifier onlyOwner() {
require(_owner == _msgSender(), 'Ownable: caller is not the owner');
_;
}
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), 'Ownable: new owner is the zero address');
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
文件 11 的 11:SafeMath.sol
pragma solidity 0.7.5;
library SafeMath {
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, 'SafeMath: addition overflow');
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, 'SafeMath: subtraction overflow');
}
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, 'SafeMath: multiplication overflow');
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, 'SafeMath: division by zero');
}
function div(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
return c;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, 'SafeMath: modulo by zero');
}
function mod(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
{
"compilationTarget": {
"contracts/LyraGovernanceV2.sol": "LyraGovernanceV2"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"governanceStrategy","type":"address"},{"internalType":"uint256","name":"votingDelay","type":"uint256"},{"internalType":"address","name":"guardian","type":"address"},{"internalType":"address[]","name":"executors","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"executor","type":"address"}],"name":"ExecutorAuthorized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"executor","type":"address"}],"name":"ExecutorUnauthorized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newStrategy","type":"address"},{"indexed":true,"internalType":"address","name":"initiatorChange","type":"address"}],"name":"GovernanceStrategyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"ProposalCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"creator","type":"address"},{"indexed":true,"internalType":"contract IExecutorWithTimelock","name":"executor","type":"address"},{"indexed":false,"internalType":"address[]","name":"targets","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"},{"indexed":false,"internalType":"string[]","name":"signatures","type":"string[]"},{"indexed":false,"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"indexed":false,"internalType":"bool[]","name":"withDelegatecalls","type":"bool[]"},{"indexed":false,"internalType":"uint256","name":"startBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endBlock","type":"uint256"},{"indexed":false,"internalType":"address","name":"strategy","type":"address"},{"indexed":false,"internalType":"bytes32","name":"ipfsHash","type":"bytes32"}],"name":"ProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"initiatorExecution","type":"address"}],"name":"ProposalExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"executionTime","type":"uint256"},{"indexed":true,"internalType":"address","name":"initiatorQueueing","type":"address"}],"name":"ProposalQueued","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"bool","name":"support","type":"bool"},{"indexed":false,"internalType":"uint256","name":"votingPower","type":"uint256"}],"name":"VoteEmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newVotingDelay","type":"uint256"},{"indexed":true,"internalType":"address","name":"initiatorChange","type":"address"}],"name":"VotingDelayChanged","type":"event"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NAME","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VOTE_EMITTED_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"__abdicate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"executors","type":"address[]"}],"name":"authorizeExecutors","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"cancel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IExecutorWithTimelock","name":"executor","type":"address"},{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"string[]","name":"signatures","type":"string[]"},{"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"internalType":"bool[]","name":"withDelegatecalls","type":"bool[]"},{"internalType":"bytes32","name":"ipfsHash","type":"bytes32"}],"name":"create","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"execute","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getGovernanceStrategy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGuardian","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"getProposalById","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"contract IExecutorWithTimelock","name":"executor","type":"address"},{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"string[]","name":"signatures","type":"string[]"},{"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"internalType":"bool[]","name":"withDelegatecalls","type":"bool[]"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"},{"internalType":"uint256","name":"executionTime","type":"uint256"},{"internalType":"uint256","name":"forVotes","type":"uint256"},{"internalType":"uint256","name":"againstVotes","type":"uint256"},{"internalType":"bool","name":"executed","type":"bool"},{"internalType":"bool","name":"canceled","type":"bool"},{"internalType":"address","name":"strategy","type":"address"},{"internalType":"bytes32","name":"ipfsHash","type":"bytes32"}],"internalType":"struct IAaveGovernanceV2.ProposalWithoutVotes","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"getProposalState","outputs":[{"internalType":"enum IAaveGovernanceV2.ProposalState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getProposalsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"address","name":"voter","type":"address"}],"name":"getVoteOnProposal","outputs":[{"components":[{"internalType":"bool","name":"support","type":"bool"},{"internalType":"uint248","name":"votingPower","type":"uint248"}],"internalType":"struct IAaveGovernanceV2.Vote","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVotingDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"executor","type":"address"}],"name":"isExecutorAuthorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"queue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"governanceStrategy","type":"address"}],"name":"setGovernanceStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"votingDelay","type":"uint256"}],"name":"setVotingDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"bool","name":"support","type":"bool"}],"name":"submitVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"bool","name":"support","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"submitVoteBySignature","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"executors","type":"address[]"}],"name":"unauthorizeExecutors","outputs":[],"stateMutability":"nonpayable","type":"function"}]