Contract Overview
Balance:
0 Ether
EtherValue:
$0.00
More Info
My Name Tag:
Not Available, login to update
Txn Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
0x387bf1d538daafee4697c8405a145ff178df6706052cb27ccf2bbec38238fa50 | Create Proposals... | 15696386 | 122 days 20 hrs ago | 0x7abc3a4430b6c46d7fda69a00a10c321d19b7f26 | IN | 0x6e1a6728829bc0fca82c1a39834c6212c250f1c1 | 0 Ether | 0.01605267 | |
0xbeb4557f4e06b59b86d9f437585ef1410705ead7960676eeb9865b0e6d4728d3 | 0x61012060 | 15623753 | 132 days 23 hrs ago | 0x7abc3a4430b6c46d7fda69a00a10c321d19b7f26 | IN | Create: AutonomousProposalsForGovAdjustments | 0 Ether | 0.00655928 |
[ Download CSV Export ]
View more zero value Internal Transactions in Advanced View mode
Contract Name:
AutonomousProposalsForGovAdjustments
Compiler Version
v0.8.14+commit.80d49f37
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {AaveGovernanceV2, IExecutorWithTimelock, IGovernanceStrategy} from 'aave-address-book/AaveGovernanceV2.sol'; import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; import {SafeERC20} from 'solidity-utils/contracts/oz-common/SafeERC20.sol'; /** * @title AutonomousProposalsForGovAdjustments * @author BGD Labs * @dev Autonomous proposal to simplify delegation, and creation of needed proposals for governance configuration adjustments. * - Introduces a method that on call, will create LongExecutor proposal, and afterwards will also create the EcosystemReserve proposal * needed to use the ecosystem voting power to vote on the LongExecutor Proposal. * With this, anyone can delegate Proposition Power to this contract, and when it reaches enough power, anyone will be able to call * `createProposalsForGovAdjustments` method to create the two proposals. * - `createProposalsForGovAdjustments` can only be called once, while proposals are not created. This is so proposals do not * keep being created, as the contract could maintain the proposition power, while delegators do not withdraw their delegation * - `createProposalsForGovAdjustments` can only be called after specified date. This is to ensure that there is time to amass * enough proposition power into the contract, and that users have time to prepare for the vote. * - The payloads used will be: * - NEW_LONG_EXECUTOR_PAYLOAD: src/contracts/ProposalPayloadNewLongExecutor.sol * - ECOSYSTEM_RESERVE_WITH_VOTING_PAYLOAD: src/contracts/ProposalPayloadAaveEcosystemReserveWithVoting.sol */ contract AutonomousProposalsForGovAdjustments { using SafeERC20 for IERC20; uint256 public constant GRACE_PERIOD = 5 days; address public immutable NEW_LONG_EXECUTOR_PAYLOAD; bytes32 public immutable LVL2_IPFS_HASH; address public immutable ECOSYSTEM_RESERVE_WITH_VOTING_PAYLOAD; bytes32 public immutable RESERVE_ECOSYSTEM_IPFS_HASH; uint256 public immutable CREATION_TIMESTAMP; uint256 public newLongExecutorProposalId; uint256 public ecosystemReserveProposalId; event ProposalsCreated( address executor, uint256 newLongExecutorProposalId, uint256 ecosystemReserveProposalId, address newLongExecutorPayload, bytes32 lvl2IpfsHash, address ecosystemReserveWithVotingPayload, bytes32 reserveEcosystemIpfsHash ); constructor (address newLongExecutorPayload, address ecosystemReserveWithVotingPayload, bytes32 lvl2IpfsHash, bytes32 reserveEcosystemIpfsHash, uint256 creationTimestamp) { require(newLongExecutorPayload != address(0), "NEW_LONG_EXECUTOR_PAYLOAD_ADDRESS_0"); require(lvl2IpfsHash != bytes32(0), "NEW_LONG_EXECUTOR_PAYLOAD_IPFS_HASH_BYTES32_0"); require(ecosystemReserveWithVotingPayload != address(0), "ECOSYSTEM_RESERVE_PAYLOAD_ADDRESS_0"); require(reserveEcosystemIpfsHash != bytes32(0), "ECOSYSTEM_RESERVE_PAYLOAD_IPFS_HASH_BYTES32_0"); require(creationTimestamp > block.timestamp, 'CREATION_TIMESTAMP_TO_EARLY'); NEW_LONG_EXECUTOR_PAYLOAD = newLongExecutorPayload; LVL2_IPFS_HASH = lvl2IpfsHash; ECOSYSTEM_RESERVE_WITH_VOTING_PAYLOAD = ecosystemReserveWithVotingPayload; RESERVE_ECOSYSTEM_IPFS_HASH = reserveEcosystemIpfsHash; CREATION_TIMESTAMP = creationTimestamp; } /// @dev creates the necessary proposals for the governance parameter adjustments function createProposalsForGovAdjustments() external { require(newLongExecutorProposalId == 0 && ecosystemReserveProposalId == 0, 'PROPOSALS_ALREADY_CREATED'); require(block.timestamp > CREATION_TIMESTAMP, 'CREATION_TIMESTAMP_NOT_YET_REACHED'); require(block.timestamp < CREATION_TIMESTAMP + GRACE_PERIOD, 'TIMESTAMP_BIGGER_THAN_GRACE_PERIOD'); newLongExecutorProposalId = _createLvl2Proposal(NEW_LONG_EXECUTOR_PAYLOAD, LVL2_IPFS_HASH); ecosystemReserveProposalId = _createEcosystemReserveProposal(ECOSYSTEM_RESERVE_WITH_VOTING_PAYLOAD, RESERVE_ECOSYSTEM_IPFS_HASH, newLongExecutorProposalId); emit ProposalsCreated(msg.sender, newLongExecutorProposalId, ecosystemReserveProposalId, NEW_LONG_EXECUTOR_PAYLOAD, LVL2_IPFS_HASH, ECOSYSTEM_RESERVE_WITH_VOTING_PAYLOAD, RESERVE_ECOSYSTEM_IPFS_HASH); } /// @dev method to vote on the governance parameters adjustment proposals, in case there is some /// voting power delegation by error function voteOnGovAdjustmentsProposal() external { require(newLongExecutorProposalId != 0 && ecosystemReserveProposalId != 0, 'PROPOSALS_NOT_CREATED'); AaveGovernanceV2.GOV.submitVote(newLongExecutorProposalId, true); AaveGovernanceV2.GOV.submitVote(ecosystemReserveProposalId, true); } function emergencyTokenTransfer( address erc20Token, address to, uint256 amount ) external { require(msg.sender == AaveGovernanceV2.SHORT_EXECUTOR, 'CALLER_NOT_EXECUTOR'); IERC20(erc20Token).safeTransfer(to, amount); } function _createLvl2Proposal(address payload, bytes32 ipfsHash) internal returns (uint256) { address[] memory targets = new address[](1); targets[0] = payload; uint256[] memory values = new uint256[](1); values[0] = 0; string[] memory signatures = new string[](1); signatures[0] = 'execute()'; bytes[] memory calldatas = new bytes[](1); calldatas[0] = ''; bool[] memory withDelegatecalls = new bool[](1); withDelegatecalls[0] = true; return AaveGovernanceV2.GOV.create( IExecutorWithTimelock(AaveGovernanceV2.LONG_EXECUTOR), targets, values, signatures, calldatas, withDelegatecalls, ipfsHash ); } function _createEcosystemReserveProposal(address payload, bytes32 ipfsHash, uint256 proposalId) internal returns (uint256) { address[] memory targets = new address[](1); targets[0] = payload; uint256[] memory values = new uint256[](1); values[0] = 0; string[] memory signatures = new string[](1); signatures[0] = 'execute(uint256)'; bytes[] memory calldatas = new bytes[](1); calldatas[0] = abi.encode(proposalId); bool[] memory withDelegatecalls = new bool[](1); withDelegatecalls[0] = true; return AaveGovernanceV2.GOV.create( IExecutorWithTimelock(AaveGovernanceV2.SHORT_EXECUTOR), targets, values, signatures, calldatas, withDelegatecalls, ipfsHash ); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0; interface IGovernanceStrategy { /** * @dev Returns the Proposition Power of a user at a specific block number. * @param user Address of the user. * @param blockNumber Blocknumber at which to fetch Proposition Power * @return Power number **/ function getPropositionPowerAt(address user, uint256 blockNumber) external view returns (uint256); /** * @dev Returns the total supply of Outstanding Proposition Tokens * @param blockNumber Blocknumber at which to evaluate * @return total supply at blockNumber **/ function getTotalPropositionSupplyAt(uint256 blockNumber) external view returns (uint256); /** * @dev Returns the total supply of Outstanding Voting Tokens * @param blockNumber Blocknumber at which to evaluate * @return total supply at blockNumber **/ function getTotalVotingSupplyAt(uint256 blockNumber) external view returns (uint256); /** * @dev Returns the Vote Power of a user at a specific block number. * @param user Address of the user. * @param blockNumber Blocknumber at which to fetch Vote Power * @return Vote number **/ function getVotingPowerAt(address user, uint256 blockNumber) external view returns (uint256); } interface IExecutorWithTimelock { /** * @dev emitted when a new pending admin is set * @param newPendingAdmin address of the new pending admin **/ event NewPendingAdmin(address newPendingAdmin); /** * @dev emitted when a new admin is set * @param newAdmin address of the new admin **/ event NewAdmin(address newAdmin); /** * @dev emitted when a new delay (between queueing and execution) is set * @param delay new delay **/ event NewDelay(uint256 delay); /** * @dev emitted when a new (trans)action is Queued. * @param actionHash hash of the action * @param target address of the targeted contract * @param value wei value of the transaction * @param signature function signature of the transaction * @param data function arguments of the transaction or callData if signature empty * @param executionTime time at which to execute the transaction * @param withDelegatecall boolean, true = transaction delegatecalls the target, else calls the target **/ event QueuedAction( bytes32 actionHash, address indexed target, uint256 value, string signature, bytes data, uint256 executionTime, bool withDelegatecall ); /** * @dev emitted when an action is Cancelled * @param actionHash hash of the action * @param target address of the targeted contract * @param value wei value of the transaction * @param signature function signature of the transaction * @param data function arguments of the transaction or callData if signature empty * @param executionTime time at which to execute the transaction * @param withDelegatecall boolean, true = transaction delegatecalls the target, else calls the target **/ event CancelledAction( bytes32 actionHash, address indexed target, uint256 value, string signature, bytes data, uint256 executionTime, bool withDelegatecall ); /** * @dev emitted when an action is Cancelled * @param actionHash hash of the action * @param target address of the targeted contract * @param value wei value of the transaction * @param signature function signature of the transaction * @param data function arguments of the transaction or callData if signature empty * @param executionTime time at which to execute the transaction * @param withDelegatecall boolean, true = transaction delegatecalls the target, else calls the target * @param resultData the actual callData used on the target **/ event ExecutedAction( bytes32 actionHash, address indexed target, uint256 value, string signature, bytes data, uint256 executionTime, bool withDelegatecall, bytes resultData ); /** * @dev Getter of the current admin address (should be governance) * @return The address of the current admin **/ function getAdmin() external view returns (address); /** * @dev Getter of the current pending admin address * @return The address of the pending admin **/ function getPendingAdmin() external view returns (address); /** * @dev Getter of the delay between queuing and execution * @return The delay in seconds **/ function getDelay() external view returns (uint256); /** * @dev Returns whether an action (via actionHash) is queued * @param actionHash hash of the action to be checked * keccak256(abi.encode(target, value, signature, data, executionTime, withDelegatecall)) * @return true if underlying action of actionHash is queued **/ function isActionQueued(bytes32 actionHash) external view returns (bool); /** * @dev Checks whether a proposal is over its grace period * @param governance Governance contract * @param proposalId Id of the proposal against which to test * @return true of proposal is over grace period **/ function isProposalOverGracePeriod( IAaveGovernanceV2 governance, uint256 proposalId ) external view returns (bool); /** * @dev Getter of grace period constant * @return grace period in seconds **/ function GRACE_PERIOD() external view returns (uint256); /** * @dev Getter of minimum delay constant * @return minimum delay in seconds **/ function MINIMUM_DELAY() external view returns (uint256); /** * @dev Getter of maximum delay constant * @return maximum delay in seconds **/ function MAXIMUM_DELAY() external view returns (uint256); /** * @dev Function, called by Governance, that queue a transaction, returns action hash * @param target smart contract target * @param value wei value of the transaction * @param signature function signature of the transaction * @param data function arguments of the transaction or callData if signature empty * @param executionTime time at which to execute the transaction * @param withDelegatecall boolean, true = transaction delegatecalls the target, else calls the target **/ function queueTransaction( address target, uint256 value, string memory signature, bytes memory data, uint256 executionTime, bool withDelegatecall ) external returns (bytes32); /** * @dev Function, called by Governance, that cancels a transaction, returns the callData executed * @param target smart contract target * @param value wei value of the transaction * @param signature function signature of the transaction * @param data function arguments of the transaction or callData if signature empty * @param executionTime time at which to execute the transaction * @param withDelegatecall boolean, true = transaction delegatecalls the target, else calls the target **/ function executeTransaction( address target, uint256 value, string memory signature, bytes memory data, uint256 executionTime, bool withDelegatecall ) external payable returns (bytes memory); /** * @dev Function, called by Governance, that cancels a transaction, returns action hash * @param target smart contract target * @param value wei value of the transaction * @param signature function signature of the transaction * @param data function arguments of the transaction or callData if signature empty * @param executionTime time at which to execute the transaction * @param withDelegatecall boolean, true = transaction delegatecalls the target, else calls the target **/ function cancelTransaction( address target, uint256 value, string memory signature, bytes memory data, uint256 executionTime, bool withDelegatecall ) external returns (bytes32); } 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; } /** * @dev emitted when a new proposal is created * @param id Id of the proposal * @param creator address of the creator * @param executor The ExecutorWithTimelock contract that will execute the proposal * @param targets list of contracts called by proposal's associated transactions * @param values list of value in wei for each propoposal's associated transaction * @param signatures list of function signatures (can be empty) to be used when created the callData * @param calldatas list of calldatas: if associated signature empty, calldata ready, else calldata is arguments * @param withDelegatecalls boolean, true = transaction delegatecalls the taget, else calls the target * @param startBlock block number when vote starts * @param endBlock block number when vote ends * @param strategy address of the governanceStrategy contract * @param ipfsHash IPFS hash of the proposal **/ 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 ); /** * @dev emitted when a proposal is canceled * @param id Id of the proposal **/ event ProposalCanceled(uint256 id); /** * @dev emitted when a proposal is queued * @param id Id of the proposal * @param executionTime time when proposal underlying transactions can be executed * @param initiatorQueueing address of the initiator of the queuing transaction **/ event ProposalQueued( uint256 id, uint256 executionTime, address indexed initiatorQueueing ); /** * @dev emitted when a proposal is executed * @param id Id of the proposal * @param initiatorExecution address of the initiator of the execution transaction **/ event ProposalExecuted(uint256 id, address indexed initiatorExecution); /** * @dev emitted when a vote is registered * @param id Id of the proposal * @param voter address of the voter * @param support boolean, true = vote for, false = vote against * @param votingPower Power of the voter/vote **/ 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); /** * @dev Creates a Proposal (needs Proposition Power of creator > Threshold) * @param executor The ExecutorWithTimelock contract that will execute the proposal * @param targets list of contracts called by proposal's associated transactions * @param values list of value in wei for each propoposal's associated transaction * @param signatures list of function signatures (can be empty) to be used when created the callData * @param calldatas list of calldatas: if associated signature empty, calldata ready, else calldata is arguments * @param withDelegatecalls if true, transaction delegatecalls the taget, else calls the target * @param ipfsHash IPFS hash of the proposal **/ function create( IExecutorWithTimelock executor, address[] memory targets, uint256[] memory values, string[] memory signatures, bytes[] memory calldatas, bool[] memory withDelegatecalls, bytes32 ipfsHash ) external returns (uint256); /** * @dev Cancels a Proposal, * either at anytime by guardian * or when proposal is Pending/Active and threshold no longer reached * @param proposalId id of the proposal **/ function cancel(uint256 proposalId) external; /** * @dev Queue the proposal (If Proposal Succeeded) * @param proposalId id of the proposal to queue **/ function queue(uint256 proposalId) external; /** * @dev Execute the proposal (If Proposal Queued) * @param proposalId id of the proposal to execute **/ function execute(uint256 proposalId) external payable; /** * @dev Function allowing msg.sender to vote for/against a proposal * @param proposalId id of the proposal * @param support boolean, true = vote for, false = vote against **/ function submitVote(uint256 proposalId, bool support) external; /** * @dev Function to register the vote of user that has voted offchain via signature * @param proposalId id of the proposal * @param support boolean, true = vote for, false = vote against * @param v v part of the voter signature * @param r r part of the voter signature * @param s s part of the voter signature **/ function submitVoteBySignature( uint256 proposalId, bool support, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Set new GovernanceStrategy * Note: owner should be a timelocked executor, so needs to make a proposal * @param governanceStrategy new Address of the GovernanceStrategy contract **/ function setGovernanceStrategy(address governanceStrategy) external; /** * @dev Set new Voting Delay (delay before a newly created proposal can be voted on) * Note: owner should be a timelocked executor, so needs to make a proposal * @param votingDelay new voting delay in seconds **/ function setVotingDelay(uint256 votingDelay) external; /** * @dev Add new addresses to the list of authorized executors * @param executors list of new addresses to be authorized executors **/ function authorizeExecutors(address[] memory executors) external; /** * @dev Remove addresses to the list of authorized executors * @param executors list of addresses to be removed as authorized executors **/ function unauthorizeExecutors(address[] memory executors) external; /** * @dev Let the guardian abdicate from its priviledged rights **/ function __abdicate() external; /** * @dev Getter of the current GovernanceStrategy address * @return The address of the current GovernanceStrategy contracts **/ function getGovernanceStrategy() external view returns (address); /** * @dev Getter of the current Voting Delay (delay before a created proposal can be voted on) * Different from the voting duration * @return The voting delay in seconds **/ function getVotingDelay() external view returns (uint256); /** * @dev Returns whether an address is an authorized executor * @param executor address to evaluate as authorized executor * @return true if authorized **/ function isExecutorAuthorized(address executor) external view returns (bool); /** * @dev Getter the address of the guardian, that can mainly cancel proposals * @return The address of the guardian **/ function getGuardian() external view returns (address); /** * @dev Getter of the proposal count (the current number of proposals ever created) * @return the proposal count **/ function getProposalsCount() external view returns (uint256); /** * @dev Getter of a proposal by id * @param proposalId id of the proposal to get * @return the proposal as ProposalWithoutVotes memory object **/ function getProposalById(uint256 proposalId) external view returns (ProposalWithoutVotes memory); /** * @dev Getter of the Vote of a voter about a proposal * Note: Vote is a struct: ({bool support, uint248 votingPower}) * @param proposalId id of the proposal * @param voter address of the voter * @return The associated Vote memory object **/ function getVoteOnProposal(uint256 proposalId, address voter) external view returns (Vote memory); /** * @dev Get the current state of a proposal * @param proposalId id of the proposal * @return The current state if the proposal **/ function getProposalState(uint256 proposalId) external view returns (ProposalState); } library AaveGovernanceV2 { IAaveGovernanceV2 internal constant GOV = IAaveGovernanceV2(0xEC568fffba86c094cf06b22134B23074DFE2252c); address public constant SHORT_EXECUTOR = 0xEE56e2B3D491590B5b31738cC34d5232F378a8D5; address public constant LONG_EXECUTOR = 0x61910EcD7e8e942136CE7Fe7943f956cea1CC2f7; address public constant ARC_TIMELOCK = 0xAce1d11d836cb3F51Ef658FD4D353fFb3c301218; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) // From commit https://github.com/OpenZeppelin/openzeppelin-contracts/commit/a035b235b4f2c9af4ba88edc4447f02e37f8d124 pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol) // From commit https://github.com/OpenZeppelin/openzeppelin-contracts/commit/3dac7bbed7b4c0dbf504180c33e8ed8e350b93eb pragma solidity ^0.8.0; import "./interfaces/IERC20.sol"; import "./interfaces/draft-IERC20Permit.sol"; import "./Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) // From commit https://github.com/OpenZeppelin/openzeppelin-contracts/commit/6bd6b76d1156e20e45d1016f355d154141c7e5b9 pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) // From commit https://github.com/OpenZeppelin/openzeppelin-contracts/commit/8b778fa20d6d76340c5fac1ed66c80273f05b95a pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, 'Address: insufficient balance'); (bool success, ) = recipient.call{value: amount}(''); require(success, 'Address: unable to send value, recipient may have reverted'); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, 'Address: low-level call failed'); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, 'Address: insufficient balance for call'); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, 'Address: low-level static call failed'); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), 'Address: call to non-contract'); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
{ "remappings": [ "aave-address-book/=lib/aave-address-book/src/", "aave-helpers/=lib/aave-helpers/src/", "ds-test/=lib/forge-std/lib/ds-test/src/", "forge-std/=lib/forge-std/src/", "solidity-utils/=lib/solidity-utils/src/" ], "optimizer": { "enabled": true, "runs": 200 }, "metadata": { "bytecodeHash": "ipfs" }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "london", "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"newLongExecutorPayload","type":"address"},{"internalType":"address","name":"ecosystemReserveWithVotingPayload","type":"address"},{"internalType":"bytes32","name":"lvl2IpfsHash","type":"bytes32"},{"internalType":"bytes32","name":"reserveEcosystemIpfsHash","type":"bytes32"},{"internalType":"uint256","name":"creationTimestamp","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"executor","type":"address"},{"indexed":false,"internalType":"uint256","name":"newLongExecutorProposalId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ecosystemReserveProposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"newLongExecutorPayload","type":"address"},{"indexed":false,"internalType":"bytes32","name":"lvl2IpfsHash","type":"bytes32"},{"indexed":false,"internalType":"address","name":"ecosystemReserveWithVotingPayload","type":"address"},{"indexed":false,"internalType":"bytes32","name":"reserveEcosystemIpfsHash","type":"bytes32"}],"name":"ProposalsCreated","type":"event"},{"inputs":[],"name":"CREATION_TIMESTAMP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ECOSYSTEM_RESERVE_WITH_VOTING_PAYLOAD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GRACE_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LVL2_IPFS_HASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NEW_LONG_EXECUTOR_PAYLOAD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVE_ECOSYSTEM_IPFS_HASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"createProposalsForGovAdjustments","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ecosystemReserveProposalId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"erc20Token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"emergencyTokenTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"newLongExecutorProposalId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"voteOnGovAdjustmentsProposal","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101206040523480156200001257600080fd5b506040516200142938038062001429833981016040819052620000359162000261565b6001600160a01b0385166200009d5760405162461bcd60e51b815260206004820152602360248201527f4e45575f4c4f4e475f4558454355544f525f5041594c4f41445f4144445245536044820152620535f360ec1b60648201526084015b60405180910390fd5b82620001025760405162461bcd60e51b815260206004820152602d60248201527f4e45575f4c4f4e475f4558454355544f525f5041594c4f41445f495046535f4860448201526c04153485f425954455333325f3609c1b606482015260840162000094565b6001600160a01b038416620001665760405162461bcd60e51b815260206004820152602360248201527f45434f53595354454d5f524553455256455f5041594c4f41445f4144445245536044820152620535f360ec1b606482015260840162000094565b81620001cb5760405162461bcd60e51b815260206004820152602d60248201527f45434f53595354454d5f524553455256455f5041594c4f41445f495046535f4860448201526c04153485f425954455333325f3609c1b606482015260840162000094565b4281116200021c5760405162461bcd60e51b815260206004820152601b60248201527f4352454154494f4e5f54494d455354414d505f544f5f4541524c590000000000604482015260640162000094565b6001600160a01b0394851660805260a0929092529190921660c05260e05261010052620002b4565b80516001600160a01b03811681146200025c57600080fd5b919050565b600080600080600060a086880312156200027a57600080fd5b620002858662000244565b9450620002956020870162000244565b6040870151606088015160809098015196999198509695945092505050565b60805160a05160c05160e051610100516110eb6200033e600039600081816101660152818161024001526102c1015260008181610101015281816103b4015261047701526000818160b301528181610393015261045001526000818161013601528181610364015261042a0152600081816101a001528181610343015261040201526110eb6000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c806395ee1d5c1161007157806395ee1d5c14610161578063a3d5b25514610188578063bf9ece321461019b578063c1a287e2146101c2578063c346578d146101cc578063e49f7660146101d457600080fd5b806311dd44a5146100ae5780631c349f89146100f25780632ce52ee3146100fc57806350e20942146101315780638eb932f014610158575b600080fd5b6100d57f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b6100fa6101dd565b005b6101237f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020016100e9565b6101237f000000000000000000000000000000000000000000000000000000000000000081565b61012360015481565b6101237f000000000000000000000000000000000000000000000000000000000000000081565b6100fa610196366004610dfb565b6104ca565b6100d57f000000000000000000000000000000000000000000000000000000000000000081565b6101236206978081565b6100fa61053c565b61012360005481565b6000541580156101ed5750600154155b61023e5760405162461bcd60e51b815260206004820152601960248201527f50524f504f53414c535f414c52454144595f435245415445440000000000000060448201526064015b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000042116102b85760405162461bcd60e51b815260206004820152602260248201527f4352454154494f4e5f54494d455354414d505f4e4f545f5945545f5245414348604482015261115160f21b6064820152608401610235565b6102e5620697807f0000000000000000000000000000000000000000000000000000000000000000610e37565b421061033e5760405162461bcd60e51b815260206004820152602260248201527f54494d455354414d505f4249474745525f5448414e5f47524143455f5045524960448201526113d160f21b6064820152608401610235565b6103887f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061067b565b6000819055506103db7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006000546108d5565b60018190556000546040805133815260208101929092528101919091526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660608301527f000000000000000000000000000000000000000000000000000000000000000060808301527f00000000000000000000000000000000000000000000000000000000000000001660a08201527f000000000000000000000000000000000000000000000000000000000000000060c08201527fbeeea6931b0bfe7b914d003579d6286d53fdac448cc4dd91298b6dde35fafbb99060e00160405180910390a1565b3373ee56e2b3d491590b5b31738cc34d5232f378a8d5146105235760405162461bcd60e51b815260206004820152601360248201527221a0a62622a92fa727aa2fa2ac22a1aaaa27a960691b6044820152606401610235565b6105376001600160a01b0384168383610b42565b505050565b6000541580159061054e575060015415155b6105925760405162461bcd60e51b8152602060048201526015602482015274141493d413d4d05314d7d393d517d0d49150551151605a1b6044820152606401610235565b6000546040516330962b7d60e11b815260048101919091526001602482015273ec568fffba86c094cf06b22134b23074dfe2252c9063612c56fa90604401600060405180830381600087803b1580156105ea57600080fd5b505af11580156105fe573d6000803e3d6000fd5b5050600180546040516330962b7d60e11b815273ec568fffba86c094cf06b22134b23074dfe2252c945063612c56fa935061064792906004019182521515602082015260400190565b600060405180830381600087803b15801561066157600080fd5b505af1158015610675573d6000803e3d6000fd5b50505050565b6040805160018082528183019092526000918291906020808301908036833701905050905083816000815181106106b4576106b4610e5d565b6001600160a01b03929092166020928302919091019091015260408051600180825281830190925260009181602001602082028036833701905050905060008160008151811061070657610706610e5d565b6020908102919091010152604080516001808252818301909252600091816020015b60608152602001906001900390816107285790505090506040518060400160405280600981526020016865786563757465282960b81b8152508160008151811061077457610774610e5d565b6020908102919091010152604080516001808252818301909252600091816020015b606081526020019060019003908161079657905050905060405180602001604052806000815250816000815181106107d0576107d0610e5d565b602090810291909101015260408051600180825281830190925260009181602001602082028036833701905050905060018160008151811061081457610814610e5d565b60200260200101901515908115158152505073ec568fffba86c094cf06b22134b23074dfe2252c6001600160a01b031663f8741a9c7361910ecd7e8e942136ce7fe7943f956cea1cc2f787878787878e6040518863ffffffff1660e01b81526004016108869796959493929190610f8d565b6020604051808303816000875af11580156108a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c99190611044565b98975050505050505050565b60408051600180825281830190925260009182919060208083019080368337019050509050848160008151811061090e5761090e610e5d565b6001600160a01b03929092166020928302919091019091015260408051600180825281830190925260009181602001602082028036833701905050905060008160008151811061096057610960610e5d565b6020908102919091010152604080516001808252818301909252600091816020015b60608152602001906001900390816109825790505090506040518060400160405280601081526020016f657865637574652875696e743235362960801b815250816000815181106109d5576109d5610e5d565b6020908102919091010152604080516001808252818301909252600091816020015b60608152602001906001900390816109f757505060408051602081018990529192500160405160208183030381529060405281600081518110610a3c57610a3c610e5d565b6020908102919091010152604080516001808252818301909252600091816020016020820280368337019050509050600181600081518110610a8057610a80610e5d565b60200260200101901515908115158152505073ec568fffba86c094cf06b22134b23074dfe2252c6001600160a01b031663f8741a9c73ee56e2b3d491590b5b31738cc34d5232f378a8d587878787878f6040518863ffffffff1660e01b8152600401610af29796959493929190610f8d565b6020604051808303816000875af1158015610b11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b359190611044565b9998505050505050505050565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649084015261053792869291600091610bd2918516908490610c4f565b8051909150156105375780806020019051810190610bf0919061105d565b6105375760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610235565b6060610c5e8484600085610c66565b949350505050565b606082471015610cc75760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610235565b600080866001600160a01b03168587604051610ce39190611086565b60006040518083038185875af1925050503d8060008114610d20576040519150601f19603f3d011682016040523d82523d6000602084013e610d25565b606091505b5091509150610d3687838387610d41565b979650505050505050565b60608315610db0578251600003610da9576001600160a01b0385163b610da95760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610235565b5081610c5e565b610c5e8383815115610dc55781518083602001fd5b8060405162461bcd60e51b815260040161023591906110a2565b80356001600160a01b0381168114610df657600080fd5b919050565b600080600060608486031215610e1057600080fd5b610e1984610ddf565b9250610e2760208501610ddf565b9150604084013590509250925092565b60008219821115610e5857634e487b7160e01b600052601160045260246000fd5b500190565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015610ea357815187529582019590820190600101610e87565b509495945050505050565b60005b83811015610ec9578181015183820152602001610eb1565b838111156106755750506000910152565b60008151808452610ef2816020860160208601610eae565b601f01601f19169290920160200192915050565b600081518084526020808501808196508360051b8101915082860160005b85811015610f4e578284038952610f3c848351610eda565b98850198935090840190600101610f24565b5091979650505050505050565b600081518084526020808501945080840160005b83811015610ea3578151151587529582019590820190600101610f6f565b6001600160a01b03888116825260e0602080840182905289519184018290526000928a820192909190610100860190855b81811015610fdc578551851683529483019491830191600101610fbe565b50508581036040870152610ff0818c610e73565b935050505082810360608401526110078188610f06565b9050828103608084015261101b8187610f06565b905082810360a084015261102f8186610f5b565b9150508260c083015298975050505050505050565b60006020828403121561105657600080fd5b5051919050565b60006020828403121561106f57600080fd5b8151801515811461107f57600080fd5b9392505050565b60008251611098818460208701610eae565b9190910192915050565b60208152600061107f6020830184610eda56fea2646970667358221220e2b15d8afcc94aae096053dd758d0d80464d89b977367f0e235f02c07ff0b78264736f6c634300080e00330000000000000000000000008e1b4169701a4acbf2936ec9e53fdbe8697f9703000000000000000000000000b439ee42954da799bc835b7c9f117aea68c03f904bd95ce6e9a0d76c0dd3154da423f01ee010ea9491bb5ddf5a151e6ef22b674c9c4249b03cdf9c2721b8b69d82a51bac19f35f4adbd09f194cc7d0cc449141d200000000000000000000000000000000000000000000000000000000633c3c60
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000008e1b4169701a4acbf2936ec9e53fdbe8697f9703000000000000000000000000b439ee42954da799bc835b7c9f117aea68c03f904bd95ce6e9a0d76c0dd3154da423f01ee010ea9491bb5ddf5a151e6ef22b674c9c4249b03cdf9c2721b8b69d82a51bac19f35f4adbd09f194cc7d0cc449141d200000000000000000000000000000000000000000000000000000000633c3c60
-----Decoded View---------------
Arg [0] : newLongExecutorPayload (address): 0x8E1B4169701a4ACBF2936EC9E53fdbE8697f9703
Arg [1] : ecosystemReserveWithVotingPayload (address): 0xb439EE42954Da799bC835B7c9f117aea68C03F90
Arg [2] : lvl2IpfsHash (bytes32): 0x4bd95ce6e9a0d76c0dd3154da423f01ee010ea9491bb5ddf5a151e6ef22b674c
Arg [3] : reserveEcosystemIpfsHash (bytes32): 0x9c4249b03cdf9c2721b8b69d82a51bac19f35f4adbd09f194cc7d0cc449141d2
Arg [4] : creationTimestamp (uint256): 1664892000
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000008e1b4169701a4acbf2936ec9e53fdbe8697f9703
Arg [1] : 000000000000000000000000b439ee42954da799bc835b7c9f117aea68c03f90
Arg [2] : 4bd95ce6e9a0d76c0dd3154da423f01ee010ea9491bb5ddf5a151e6ef22b674c
Arg [3] : 9c4249b03cdf9c2721b8b69d82a51bac19f35f4adbd09f194cc7d0cc449141d2
Arg [4] : 00000000000000000000000000000000000000000000000000000000633c3c60
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.