Source Code
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x496e2063 | 18127328 | 666 days ago | IN | 69 wei | 0.00083055 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
NounsDAOForkEscrow
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0 /// @title Escrow contract for Nouns to be used to trigger a fork /********************************* * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░█████████░░█████████░░░ * * ░░░░░░██░░░████░░██░░░████░░░ * * ░░██████░░░████████░░░████░░░ * * ░░██░░██░░░████░░██░░░████░░░ * * ░░██░░██░░░████░░██░░░████░░░ * * ░░░░░░█████████░░█████████░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * *********************************/ pragma solidity ^0.8.19; import { NounsTokenLike } from '../NounsDAOInterfaces.sol'; import { IERC721Receiver } from '@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol'; contract NounsDAOForkEscrow is IERC721Receiver { /** * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * ERRORS * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ */ error OnlyDAO(); error OnlyNounsToken(); error NotOwner(); /** * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * IMMUTABLES * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ */ /// @notice Nouns governance contract address public immutable dao; /// @notice Nouns token contract NounsTokenLike public immutable nounsToken; /** * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * STORAGE VARIABLES * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ */ /// @notice Current fork id uint32 public forkId; /// @notice A mapping of which owner escrowed which token for which fork. /// Later used in order to claim tokens in a forked DAO. /// @dev forkId => tokenId => owner mapping(uint32 => mapping(uint256 => address)) public escrowedTokensByForkId; /// @notice Number of tokens in escrow in the current fork contributing to the fork threshold. They can be unescrowed. uint256 public numTokensInEscrow; constructor(address dao_, address nounsToken_) { dao = dao_; nounsToken = NounsTokenLike(nounsToken_); } /** * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * MODIFIERS * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ */ modifier onlyDAO() { if (msg.sender != dao) { revert OnlyDAO(); } _; } /** * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * PUBLIC/EXTERNAL OnlyDAO Txs * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ */ /** * @notice Escrows nouns tokens * @dev Can only be called by the Nouns token contract, and initiated by the DAO contract * @param operator The address which called the `safeTransferFrom` function, can only be the DAO contract * @param from The address which previously owned the token * @param tokenId The id of the token being escrowed */ function onERC721Received( address operator, address from, uint256 tokenId, bytes memory ) public override returns (bytes4) { if (msg.sender != address(nounsToken)) revert OnlyNounsToken(); if (operator != dao) revert OnlyDAO(); escrowedTokensByForkId[forkId][tokenId] = from; numTokensInEscrow++; return IERC721Receiver.onERC721Received.selector; } /** * @notice Unescrows nouns tokens * @dev Can only be called by the DAO contract * @param owner The address which asks to unescrow, must be the address which escrowed the tokens * @param tokenIds The ids of the tokens being unescrowed */ function returnTokensToOwner(address owner, uint256[] calldata tokenIds) external onlyDAO { for (uint256 i = 0; i < tokenIds.length; i++) { if (currentOwnerOf(tokenIds[i]) != owner) revert NotOwner(); nounsToken.transferFrom(address(this), owner, tokenIds[i]); escrowedTokensByForkId[forkId][tokenIds[i]] = address(0); } numTokensInEscrow -= tokenIds.length; } /** * @notice Closes the escrow, and increments the fork id. Once the escrow is closed, all the escrowed tokens * can no longer be unescrowed by the owner, but can be withdrawn by the DAO. * @dev Can only be called by the DAO contract * @return closedForkId The fork id which was closed */ function closeEscrow() external onlyDAO returns (uint32 closedForkId) { numTokensInEscrow = 0; closedForkId = forkId; forkId++; } /** * @notice Withdraws nouns tokens to the DAO * @dev Can only be called by the DAO contract * @param tokenIds The ids of the tokens being withdrawn * @param to The address which will receive the tokens */ function withdrawTokens(uint256[] calldata tokenIds, address to) external onlyDAO { for (uint256 i = 0; i < tokenIds.length; i++) { if (currentOwnerOf(tokenIds[i]) != dao) revert NotOwner(); nounsToken.transferFrom(address(this), to, tokenIds[i]); } } /** * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * VIEW FUNCTIONS * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ */ /** * @notice Returns the number of tokens owned by the DAO, excluding the ones in escrow */ function numTokensOwnedByDAO() external view returns (uint256) { return nounsToken.balanceOf(address(this)) - numTokensInEscrow; } /** * @notice Returns the original owner of a token, when it was escrowed * @param forkId_ The fork id in which the token was escrowed * @param tokenId The id of the token * @return The address of the original owner, or address(0) if not found */ function ownerOfEscrowedToken(uint32 forkId_, uint256 tokenId) external view returns (address) { return escrowedTokensByForkId[forkId_][tokenId]; } /** * @notice Returns the current owner of a token, either the DAO or the account which escrowed it. * If the token is currently in an active escrow, the original owner is still the owner. * Otherwise, the DAO can withdraw it. * @param tokenId The id of the token * @return The address of the current owner, either the original owner or the address of the dao */ function currentOwnerOf(uint256 tokenId) public view returns (address) { address owner = escrowedTokensByForkId[forkId][tokenId]; if (owner == address(0)) { return dao; } else { return owner; } } }
// SPDX-License-Identifier: BSD-3-Clause /// @title Nouns DAO Logic interfaces and events /********************************* * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░█████████░░█████████░░░ * * ░░░░░░██░░░████░░██░░░████░░░ * * ░░██████░░░████████░░░████░░░ * * ░░██░░██░░░████░░██░░░████░░░ * * ░░██░░██░░░████░░██░░░████░░░ * * ░░░░░░█████████░░█████████░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * *********************************/ // LICENSE // NounsDAOInterfaces.sol is a modified version of Compound Lab's GovernorBravoInterfaces.sol: // https://github.com/compound-finance/compound-protocol/blob/b9b14038612d846b83f8a009a82c38974ff2dcfe/contracts/Governance/GovernorBravoInterfaces.sol // // GovernorBravoInterfaces.sol source code Copyright 2020 Compound Labs, Inc. licensed under the BSD-3-Clause license. // With modifications by Nounders DAO. // // Additional conditions of BSD-3-Clause can be found here: https://opensource.org/licenses/BSD-3-Clause // // MODIFICATIONS // NounsDAOEvents, NounsDAOProxyStorage, NounsDAOStorageV1 add support for changes made by Nouns DAO to GovernorBravo.sol // See NounsDAOLogicV1.sol for more details. // NounsDAOStorageV1Adjusted and NounsDAOStorageV2 add support for a dynamic vote quorum. // See NounsDAOLogicV2.sol for more details. // NounsDAOStorageV3 // See NounsDAOLogicV3.sol for more details. pragma solidity ^0.8.6; contract NounsDAOEvents { /// @notice An event emitted when a new proposal is created event ProposalCreated( uint256 id, address proposer, address[] targets, uint256[] values, string[] signatures, bytes[] calldatas, uint256 startBlock, uint256 endBlock, string description ); /// @notice An event emitted when a new proposal is created, which includes additional information event ProposalCreatedWithRequirements( uint256 id, address proposer, address[] targets, uint256[] values, string[] signatures, bytes[] calldatas, uint256 startBlock, uint256 endBlock, uint256 proposalThreshold, uint256 quorumVotes, string description ); /// @notice An event emitted when a vote has been cast on a proposal /// @param voter The address which casted a vote /// @param proposalId The proposal id which was voted on /// @param support Support value for the vote. 0=against, 1=for, 2=abstain /// @param votes Number of votes which were cast by the voter /// @param reason The reason given for the vote by the voter event VoteCast(address indexed voter, uint256 proposalId, uint8 support, uint256 votes, string reason); /// @notice An event emitted when a proposal has been canceled event ProposalCanceled(uint256 id); /// @notice An event emitted when a proposal has been queued in the NounsDAOExecutor event ProposalQueued(uint256 id, uint256 eta); /// @notice An event emitted when a proposal has been executed in the NounsDAOExecutor event ProposalExecuted(uint256 id); /// @notice An event emitted when a proposal has been vetoed by vetoAddress event ProposalVetoed(uint256 id); /// @notice An event emitted when the voting delay is set event VotingDelaySet(uint256 oldVotingDelay, uint256 newVotingDelay); /// @notice An event emitted when the voting period is set event VotingPeriodSet(uint256 oldVotingPeriod, uint256 newVotingPeriod); /// @notice Emitted when implementation is changed event NewImplementation(address oldImplementation, address newImplementation); /// @notice Emitted when proposal threshold basis points is set event ProposalThresholdBPSSet(uint256 oldProposalThresholdBPS, uint256 newProposalThresholdBPS); /// @notice Emitted when quorum votes basis points is set event QuorumVotesBPSSet(uint256 oldQuorumVotesBPS, uint256 newQuorumVotesBPS); /// @notice Emitted when pendingAdmin is changed event NewPendingAdmin(address oldPendingAdmin, address newPendingAdmin); /// @notice Emitted when pendingAdmin is accepted, which means admin is updated event NewAdmin(address oldAdmin, address newAdmin); /// @notice Emitted when vetoer is changed event NewVetoer(address oldVetoer, address newVetoer); } contract NounsDAOEventsV2 is NounsDAOEvents { /// @notice Emitted when minQuorumVotesBPS is set event MinQuorumVotesBPSSet(uint16 oldMinQuorumVotesBPS, uint16 newMinQuorumVotesBPS); /// @notice Emitted when maxQuorumVotesBPS is set event MaxQuorumVotesBPSSet(uint16 oldMaxQuorumVotesBPS, uint16 newMaxQuorumVotesBPS); /// @notice Emitted when quorumCoefficient is set event QuorumCoefficientSet(uint32 oldQuorumCoefficient, uint32 newQuorumCoefficient); /// @notice Emitted when a voter cast a vote requesting a gas refund. event RefundableVote(address indexed voter, uint256 refundAmount, bool refundSent); /// @notice Emitted when admin withdraws the DAO's balance. event Withdraw(uint256 amount, bool sent); /// @notice Emitted when pendingVetoer is changed event NewPendingVetoer(address oldPendingVetoer, address newPendingVetoer); } contract NounsDAOEventsV3 is NounsDAOEventsV2 { /// @notice An event emitted when a new proposal is created, which includes additional information /// @dev V3 adds `signers`, `updatePeriodEndBlock` compared to the V1/V2 event. event ProposalCreatedWithRequirements( uint256 id, address proposer, address[] signers, address[] targets, uint256[] values, string[] signatures, bytes[] calldatas, uint256 startBlock, uint256 endBlock, uint256 updatePeriodEndBlock, uint256 proposalThreshold, uint256 quorumVotes, string description ); /// @notice Emitted when a proposal is created to be executed on timelockV1 event ProposalCreatedOnTimelockV1(uint256 id); /// @notice Emitted when a proposal is updated event ProposalUpdated( uint256 indexed id, address indexed proposer, address[] targets, uint256[] values, string[] signatures, bytes[] calldatas, string description, string updateMessage ); /// @notice Emitted when a proposal's transactions are updated event ProposalTransactionsUpdated( uint256 indexed id, address indexed proposer, address[] targets, uint256[] values, string[] signatures, bytes[] calldatas, string updateMessage ); /// @notice Emitted when a proposal's description is updated event ProposalDescriptionUpdated( uint256 indexed id, address indexed proposer, string description, string updateMessage ); /// @notice Emitted when a proposal is set to have an objection period event ProposalObjectionPeriodSet(uint256 indexed id, uint256 objectionPeriodEndBlock); /// @notice Emitted when someone cancels a signature event SignatureCancelled(address indexed signer, bytes sig); /// @notice An event emitted when the objection period duration is set event ObjectionPeriodDurationSet( uint32 oldObjectionPeriodDurationInBlocks, uint32 newObjectionPeriodDurationInBlocks ); /// @notice An event emitted when the objection period last minute window is set event LastMinuteWindowSet(uint32 oldLastMinuteWindowInBlocks, uint32 newLastMinuteWindowInBlocks); /// @notice An event emitted when the proposal updatable period is set event ProposalUpdatablePeriodSet( uint32 oldProposalUpdatablePeriodInBlocks, uint32 newProposalUpdatablePeriodInBlocks ); /// @notice Emitted when the proposal id at which vote snapshot block changes is set event VoteSnapshotBlockSwitchProposalIdSet( uint256 oldVoteSnapshotBlockSwitchProposalId, uint256 newVoteSnapshotBlockSwitchProposalId ); /// @notice Emitted when the erc20 tokens to include in a fork are set event ERC20TokensToIncludeInForkSet(address[] oldErc20Tokens, address[] newErc20tokens); /// @notice Emitted when the fork DAO deployer is set event ForkDAODeployerSet(address oldForkDAODeployer, address newForkDAODeployer); /// @notice Emitted when the during of the forking period is set event ForkPeriodSet(uint256 oldForkPeriod, uint256 newForkPeriod); /// @notice Emitted when the threhsold for forking is set event ForkThresholdSet(uint256 oldForkThreshold, uint256 newForkThreshold); /// @notice Emitted when the main timelock, timelockV1 and admin are set event TimelocksAndAdminSet(address timelock, address timelockV1, address admin); /// @notice Emitted when someones adds nouns to the fork escrow event EscrowedToFork( uint32 indexed forkId, address indexed owner, uint256[] tokenIds, uint256[] proposalIds, string reason ); /// @notice Emitted when the owner withdraws their nouns from the fork escrow event WithdrawFromForkEscrow(uint32 indexed forkId, address indexed owner, uint256[] tokenIds); /// @notice Emitted when the fork is executed and the forking period begins event ExecuteFork( uint32 indexed forkId, address forkTreasury, address forkToken, uint256 forkEndTimestamp, uint256 tokensInEscrow ); /// @notice Emitted when someone joins a fork during the forking period event JoinFork( uint32 indexed forkId, address indexed owner, uint256[] tokenIds, uint256[] proposalIds, string reason ); /// @notice Emitted when the DAO withdraws nouns from the fork escrow after a fork has been executed event DAOWithdrawNounsFromEscrow(uint256[] tokenIds, address to); /// @notice Emitted when withdrawing nouns from escrow increases adjusted total supply event DAONounsSupplyIncreasedFromEscrow(uint256 numTokens, address to); } contract NounsDAOProxyStorage { /// @notice Administrator for this contract address public admin; /// @notice Pending administrator for this contract address public pendingAdmin; /// @notice Active brains of Governor address public implementation; } /** * @title Storage for Governor Bravo Delegate * @notice For future upgrades, do not change NounsDAOStorageV1. Create a new * contract which implements NounsDAOStorageV1 and following the naming convention * NounsDAOStorageVX. */ contract NounsDAOStorageV1 is NounsDAOProxyStorage { /// @notice Vetoer who has the ability to veto any proposal address public vetoer; /// @notice The delay before voting on a proposal may take place, once proposed, in blocks uint256 public votingDelay; /// @notice The duration of voting on a proposal, in blocks uint256 public votingPeriod; /// @notice The basis point number of votes required in order for a voter to become a proposer. *DIFFERS from GovernerBravo uint256 public proposalThresholdBPS; /// @notice The basis point number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed. *DIFFERS from GovernerBravo uint256 public quorumVotesBPS; /// @notice The total number of proposals uint256 public proposalCount; /// @notice The address of the Nouns DAO Executor NounsDAOExecutor INounsDAOExecutor public timelock; /// @notice The address of the Nouns tokens NounsTokenLike public nouns; /// @notice The official record of all proposals ever proposed mapping(uint256 => Proposal) public proposals; /// @notice The latest proposal for each proposer mapping(address => uint256) public latestProposalIds; struct Proposal { /// @notice Unique id for looking up a proposal uint256 id; /// @notice Creator of the proposal address proposer; /// @notice The number of votes needed to create a proposal at the time of proposal creation. *DIFFERS from GovernerBravo uint256 proposalThreshold; /// @notice The number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed at the time of proposal creation. *DIFFERS from GovernerBravo uint256 quorumVotes; /// @notice The timestamp that the proposal will be available for execution, set once the vote succeeds uint256 eta; /// @notice the ordered list of target addresses for calls to be made address[] targets; /// @notice The ordered list of values (i.e. msg.value) to be passed to the calls to be made uint256[] values; /// @notice The ordered list of function signatures to be called string[] signatures; /// @notice The ordered list of calldata to be passed to each call bytes[] calldatas; /// @notice The block at which voting begins: holders must delegate their votes prior to this block uint256 startBlock; /// @notice The block at which voting ends: votes must be cast prior to this block uint256 endBlock; /// @notice Current number of votes in favor of this proposal uint256 forVotes; /// @notice Current number of votes in opposition to this proposal uint256 againstVotes; /// @notice Current number of votes for abstaining for this proposal uint256 abstainVotes; /// @notice Flag marking whether the proposal has been canceled bool canceled; /// @notice Flag marking whether the proposal has been vetoed bool vetoed; /// @notice Flag marking whether the proposal has been executed bool executed; /// @notice Receipts of ballots for the entire set of voters mapping(address => Receipt) receipts; } /// @notice Ballot receipt record for a voter struct Receipt { /// @notice Whether or not a vote has been cast bool hasVoted; /// @notice Whether or not the voter supports the proposal or abstains uint8 support; /// @notice The number of votes the voter had, which were cast uint96 votes; } /// @notice Possible states that a proposal may be in enum ProposalState { Pending, Active, Canceled, Defeated, Succeeded, Queued, Expired, Executed, Vetoed } } /** * @title Extra fields added to the `Proposal` struct from NounsDAOStorageV1 * @notice The following fields were added to the `Proposal` struct: * - `Proposal.totalSupply` * - `Proposal.creationBlock` */ contract NounsDAOStorageV1Adjusted is NounsDAOProxyStorage { /// @notice Vetoer who has the ability to veto any proposal address public vetoer; /// @notice The delay before voting on a proposal may take place, once proposed, in blocks uint256 public votingDelay; /// @notice The duration of voting on a proposal, in blocks uint256 public votingPeriod; /// @notice The basis point number of votes required in order for a voter to become a proposer. *DIFFERS from GovernerBravo uint256 public proposalThresholdBPS; /// @notice The basis point number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed. *DIFFERS from GovernerBravo uint256 public quorumVotesBPS; /// @notice The total number of proposals uint256 public proposalCount; /// @notice The address of the Nouns DAO Executor NounsDAOExecutor INounsDAOExecutor public timelock; /// @notice The address of the Nouns tokens NounsTokenLike public nouns; /// @notice The official record of all proposals ever proposed mapping(uint256 => Proposal) internal _proposals; /// @notice The latest proposal for each proposer mapping(address => uint256) public latestProposalIds; struct Proposal { /// @notice Unique id for looking up a proposal uint256 id; /// @notice Creator of the proposal address proposer; /// @notice The number of votes needed to create a proposal at the time of proposal creation. *DIFFERS from GovernerBravo uint256 proposalThreshold; /// @notice The number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed at the time of proposal creation. *DIFFERS from GovernerBravo uint256 quorumVotes; /// @notice The timestamp that the proposal will be available for execution, set once the vote succeeds uint256 eta; /// @notice the ordered list of target addresses for calls to be made address[] targets; /// @notice The ordered list of values (i.e. msg.value) to be passed to the calls to be made uint256[] values; /// @notice The ordered list of function signatures to be called string[] signatures; /// @notice The ordered list of calldata to be passed to each call bytes[] calldatas; /// @notice The block at which voting begins: holders must delegate their votes prior to this block uint256 startBlock; /// @notice The block at which voting ends: votes must be cast prior to this block uint256 endBlock; /// @notice Current number of votes in favor of this proposal uint256 forVotes; /// @notice Current number of votes in opposition to this proposal uint256 againstVotes; /// @notice Current number of votes for abstaining for this proposal uint256 abstainVotes; /// @notice Flag marking whether the proposal has been canceled bool canceled; /// @notice Flag marking whether the proposal has been vetoed bool vetoed; /// @notice Flag marking whether the proposal has been executed bool executed; /// @notice Receipts of ballots for the entire set of voters mapping(address => Receipt) receipts; /// @notice The total supply at the time of proposal creation uint256 totalSupply; /// @notice The block at which this proposal was created uint256 creationBlock; } /// @notice Ballot receipt record for a voter struct Receipt { /// @notice Whether or not a vote has been cast bool hasVoted; /// @notice Whether or not the voter supports the proposal or abstains uint8 support; /// @notice The number of votes the voter had, which were cast uint96 votes; } /// @notice Possible states that a proposal may be in enum ProposalState { Pending, Active, Canceled, Defeated, Succeeded, Queued, Expired, Executed, Vetoed } } /** * @title Storage for Governor Bravo Delegate * @notice For future upgrades, do not change NounsDAOStorageV2. Create a new * contract which implements NounsDAOStorageV2 and following the naming convention * NounsDAOStorageVX. */ contract NounsDAOStorageV2 is NounsDAOStorageV1Adjusted { DynamicQuorumParamsCheckpoint[] public quorumParamsCheckpoints; /// @notice Pending new vetoer address public pendingVetoer; struct DynamicQuorumParams { /// @notice The minimum basis point number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed. uint16 minQuorumVotesBPS; /// @notice The maximum basis point number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed. uint16 maxQuorumVotesBPS; /// @notice The dynamic quorum coefficient /// @dev Assumed to be fixed point integer with 6 decimals, i.e 0.2 is represented as 0.2 * 1e6 = 200000 uint32 quorumCoefficient; } /// @notice A checkpoint for storing dynamic quorum params from a given block struct DynamicQuorumParamsCheckpoint { /// @notice The block at which the new values were set uint32 fromBlock; /// @notice The parameter values of this checkpoint DynamicQuorumParams params; } struct ProposalCondensed { /// @notice Unique id for looking up a proposal uint256 id; /// @notice Creator of the proposal address proposer; /// @notice The number of votes needed to create a proposal at the time of proposal creation. *DIFFERS from GovernerBravo uint256 proposalThreshold; /// @notice The minimum number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed at the time of proposal creation. *DIFFERS from GovernerBravo uint256 quorumVotes; /// @notice The timestamp that the proposal will be available for execution, set once the vote succeeds uint256 eta; /// @notice The block at which voting begins: holders must delegate their votes prior to this block uint256 startBlock; /// @notice The block at which voting ends: votes must be cast prior to this block uint256 endBlock; /// @notice Current number of votes in favor of this proposal uint256 forVotes; /// @notice Current number of votes in opposition to this proposal uint256 againstVotes; /// @notice Current number of votes for abstaining for this proposal uint256 abstainVotes; /// @notice Flag marking whether the proposal has been canceled bool canceled; /// @notice Flag marking whether the proposal has been vetoed bool vetoed; /// @notice Flag marking whether the proposal has been executed bool executed; /// @notice The total supply at the time of proposal creation uint256 totalSupply; /// @notice The block at which this proposal was created uint256 creationBlock; } } interface INounsDAOExecutor { function delay() external view returns (uint256); function GRACE_PERIOD() external view returns (uint256); function acceptAdmin() external; function queuedTransactions(bytes32 hash) external view returns (bool); function queueTransaction( address target, uint256 value, string calldata signature, bytes calldata data, uint256 eta ) external returns (bytes32); function cancelTransaction( address target, uint256 value, string calldata signature, bytes calldata data, uint256 eta ) external; function executeTransaction( address target, uint256 value, string calldata signature, bytes calldata data, uint256 eta ) external payable returns (bytes memory); } interface NounsTokenLike { function getPriorVotes(address account, uint256 blockNumber) external view returns (uint96); function totalSupply() external view returns (uint256); function transferFrom( address from, address to, uint256 tokenId ) external; function safeTransferFrom( address from, address to, uint256 tokenId ) external; function balanceOf(address owner) external view returns (uint256 balance); function ownerOf(uint256 tokenId) external view returns (address owner); function minter() external view returns (address); function mint() external returns (uint256); function setApprovalForAll(address operator, bool approved) external; } interface IForkDAODeployer { function deployForkDAO(uint256 forkingPeriodEndTimestamp, INounsDAOForkEscrow forkEscrowAddress) external returns (address treasury, address token); function tokenImpl() external view returns (address); function auctionImpl() external view returns (address); function governorImpl() external view returns (address); function treasuryImpl() external view returns (address); } interface INounsDAOExecutorV2 is INounsDAOExecutor { function sendETH(address recipient, uint256 ethToSend) external; function sendERC20( address recipient, address erc20Token, uint256 tokensToSend ) external; } interface INounsDAOForkEscrow { function markOwner(address owner, uint256[] calldata tokenIds) external; function returnTokensToOwner(address owner, uint256[] calldata tokenIds) external; function closeEscrow() external returns (uint32); function numTokensInEscrow() external view returns (uint256); function numTokensOwnedByDAO() external view returns (uint256); function withdrawTokens(uint256[] calldata tokenIds, address to) external; function forkId() external view returns (uint32); function nounsToken() external view returns (NounsTokenLike); function dao() external view returns (address); function ownerOfEscrowedToken(uint32 forkId_, uint256 tokenId) external view returns (address); } contract NounsDAOStorageV3 { StorageV3 ds; struct StorageV3 { // ================ PROXY ================ // /// @notice Administrator for this contract address admin; /// @notice Pending administrator for this contract address pendingAdmin; /// @notice Active brains of Governor address implementation; // ================ V1 ================ // /// @notice Vetoer who has the ability to veto any proposal address vetoer; /// @notice The delay before voting on a proposal may take place, once proposed, in blocks uint256 votingDelay; /// @notice The duration of voting on a proposal, in blocks uint256 votingPeriod; /// @notice The basis point number of votes required in order for a voter to become a proposer. *DIFFERS from GovernerBravo uint256 proposalThresholdBPS; /// @notice The basis point number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed. *DIFFERS from GovernerBravo uint256 quorumVotesBPS; /// @notice The total number of proposals uint256 proposalCount; /// @notice The address of the Nouns DAO Executor NounsDAOExecutor INounsDAOExecutorV2 timelock; /// @notice The address of the Nouns tokens NounsTokenLike nouns; /// @notice The official record of all proposals ever proposed mapping(uint256 => Proposal) _proposals; /// @notice The latest proposal for each proposer mapping(address => uint256) latestProposalIds; // ================ V2 ================ // DynamicQuorumParamsCheckpoint[] quorumParamsCheckpoints; /// @notice Pending new vetoer address pendingVetoer; // ================ V3 ================ // /// @notice user => sig => isCancelled: signatures that have been cancelled by the signer and are no longer valid mapping(address => mapping(bytes32 => bool)) cancelledSigs; /// @notice The number of blocks before voting ends during which the objection period can be initiated uint32 lastMinuteWindowInBlocks; /// @notice Length of the objection period in blocks uint32 objectionPeriodDurationInBlocks; /// @notice Length of proposal updatable period in block uint32 proposalUpdatablePeriodInBlocks; /// @notice address of the DAO's fork escrow contract INounsDAOForkEscrow forkEscrow; /// @notice address of the DAO's fork deployer contract IForkDAODeployer forkDAODeployer; /// @notice ERC20 tokens to include when sending funds to a deployed fork address[] erc20TokensToIncludeInFork; /// @notice The treasury contract of the last deployed fork address forkDAOTreasury; /// @notice The token contract of the last deployed fork address forkDAOToken; /// @notice Timestamp at which the last fork period ends uint256 forkEndTimestamp; /// @notice Fork period in seconds uint256 forkPeriod; /// @notice Threshold defined in basis points (10,000 = 100%) required for forking uint256 forkThresholdBPS; /// @notice Address of the original timelock INounsDAOExecutor timelockV1; /// @notice The proposal at which to start using `startBlock` instead of `creationBlock` for vote snapshots /// @dev Make sure this stays the last variable in this struct, so we can delete it in the next version /// @dev To be zeroed-out and removed in a V3.1 fix version once the switch takes place uint256 voteSnapshotBlockSwitchProposalId; } struct Proposal { /// @notice Unique id for looking up a proposal uint256 id; /// @notice Creator of the proposal address proposer; /// @notice The number of votes needed to create a proposal at the time of proposal creation. *DIFFERS from GovernerBravo uint256 proposalThreshold; /// @notice The number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed at the time of proposal creation. *DIFFERS from GovernerBravo uint256 quorumVotes; /// @notice The timestamp that the proposal will be available for execution, set once the vote succeeds uint256 eta; /// @notice the ordered list of target addresses for calls to be made address[] targets; /// @notice The ordered list of values (i.e. msg.value) to be passed to the calls to be made uint256[] values; /// @notice The ordered list of function signatures to be called string[] signatures; /// @notice The ordered list of calldata to be passed to each call bytes[] calldatas; /// @notice The block at which voting begins: holders must delegate their votes prior to this block uint256 startBlock; /// @notice The block at which voting ends: votes must be cast prior to this block uint256 endBlock; /// @notice Current number of votes in favor of this proposal uint256 forVotes; /// @notice Current number of votes in opposition to this proposal uint256 againstVotes; /// @notice Current number of votes for abstaining for this proposal uint256 abstainVotes; /// @notice Flag marking whether the proposal has been canceled bool canceled; /// @notice Flag marking whether the proposal has been vetoed bool vetoed; /// @notice Flag marking whether the proposal has been executed bool executed; /// @notice Receipts of ballots for the entire set of voters mapping(address => Receipt) receipts; /// @notice The total supply at the time of proposal creation uint256 totalSupply; /// @notice The block at which this proposal was created uint64 creationBlock; /// @notice The last block which allows updating a proposal's description and transactions uint64 updatePeriodEndBlock; /// @notice Starts at 0 and is set to the block at which the objection period ends when the objection period is initiated uint64 objectionPeriodEndBlock; /// @dev unused for now uint64 placeholder; /// @notice The signers of a proposal, when using proposeBySigs address[] signers; /// @notice When true, a proposal would be executed on timelockV1 instead of the current timelock bool executeOnTimelockV1; } /// @notice Ballot receipt record for a voter struct Receipt { /// @notice Whether or not a vote has been cast bool hasVoted; /// @notice Whether or not the voter supports the proposal or abstains uint8 support; /// @notice The number of votes the voter had, which were cast uint96 votes; } struct ProposerSignature { /// @notice Signature of a proposal bytes sig; /// @notice The address of the signer address signer; /// @notice The timestamp until which the signature is valid uint256 expirationTimestamp; } struct ProposalCondensed { /// @notice Unique id for looking up a proposal uint256 id; /// @notice Creator of the proposal address proposer; /// @notice The number of votes needed to create a proposal at the time of proposal creation. *DIFFERS from GovernerBravo uint256 proposalThreshold; /// @notice The minimum number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed at the time of proposal creation. *DIFFERS from GovernerBravo uint256 quorumVotes; /// @notice The timestamp that the proposal will be available for execution, set once the vote succeeds uint256 eta; /// @notice The block at which voting begins: holders must delegate their votes prior to this block uint256 startBlock; /// @notice The block at which voting ends: votes must be cast prior to this block uint256 endBlock; /// @notice Current number of votes in favor of this proposal uint256 forVotes; /// @notice Current number of votes in opposition to this proposal uint256 againstVotes; /// @notice Current number of votes for abstaining for this proposal uint256 abstainVotes; /// @notice Flag marking whether the proposal has been canceled bool canceled; /// @notice Flag marking whether the proposal has been vetoed bool vetoed; /// @notice Flag marking whether the proposal has been executed bool executed; /// @notice The total supply at the time of proposal creation uint256 totalSupply; /// @notice The block at which this proposal was created uint256 creationBlock; /// @notice The signers of a proposal, when using proposeBySigs address[] signers; /// @notice The last block which allows updating a proposal's description and transactions uint256 updatePeriodEndBlock; /// @notice Starts at 0 and is set to the block at which the objection period ends when the objection period is initiated uint256 objectionPeriodEndBlock; /// @notice When true, a proposal would be executed on timelockV1 instead of the current timelock bool executeOnTimelockV1; } struct DynamicQuorumParams { /// @notice The minimum basis point number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed. uint16 minQuorumVotesBPS; /// @notice The maximum basis point number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed. uint16 maxQuorumVotesBPS; /// @notice The dynamic quorum coefficient /// @dev Assumed to be fixed point integer with 6 decimals, i.e 0.2 is represented as 0.2 * 1e6 = 200000 uint32 quorumCoefficient; } struct NounsDAOParams { uint256 votingPeriod; uint256 votingDelay; uint256 proposalThresholdBPS; uint32 lastMinuteWindowInBlocks; uint32 objectionPeriodDurationInBlocks; uint32 proposalUpdatablePeriodInBlocks; } /// @notice A checkpoint for storing dynamic quorum params from a given block struct DynamicQuorumParamsCheckpoint { /// @notice The block at which the new values were set uint32 fromBlock; /// @notice The parameter values of this checkpoint DynamicQuorumParams params; } /// @notice Possible states that a proposal may be in enum ProposalState { Pending, Active, Canceled, Defeated, Succeeded, Queued, Expired, Executed, Vetoed, ObjectionPeriod, Updatable } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
{ "remappings": [ "@ensdomains/=/Users/david/projects/crypto/nouns/dao-logic-v3/nouns-monorepo/node_modules/@ensdomains/", "@graphprotocol/=/Users/david/projects/crypto/nouns/dao-logic-v3/nouns-monorepo/node_modules/@graphprotocol/", "@nouns/=/Users/david/projects/crypto/nouns/dao-logic-v3/nouns-monorepo/node_modules/@nouns/", "@openzeppelin/=/Users/david/projects/crypto/nouns/dao-logic-v3/nouns-monorepo/node_modules/@openzeppelin/", "base64-sol/=/Users/david/projects/crypto/nouns/dao-logic-v3/nouns-monorepo/node_modules/base64-sol/", "ds-test/=lib/forge-std/lib/ds-test/src/", "eth-gas-reporter/=/Users/david/projects/crypto/nouns/dao-logic-v3/nouns-monorepo/node_modules/eth-gas-reporter/", "forge-std/=lib/forge-std/src/", "hardhat/=/Users/david/projects/crypto/nouns/dao-logic-v3/nouns-monorepo/node_modules/hardhat/", "truffle/=/Users/david/projects/crypto/nouns/dao-logic-v3/nouns-monorepo/node_modules/@graphprotocol/graph-cli/examples/basic-event-handlers/node_modules/truffle/", "lib/forge-std:ds-test/=lib/forge-std/lib/ds-test/src/" ], "optimizer": { "enabled": true, "runs": 200 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "paris", "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"dao_","type":"address"},{"internalType":"address","name":"nounsToken_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"NotOwner","type":"error"},{"inputs":[],"name":"OnlyDAO","type":"error"},{"inputs":[],"name":"OnlyNounsToken","type":"error"},{"inputs":[],"name":"closeEscrow","outputs":[{"internalType":"uint32","name":"closedForkId","type":"uint32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"currentOwnerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dao","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"escrowedTokensByForkId","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forkId","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nounsToken","outputs":[{"internalType":"contract NounsTokenLike","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokensInEscrow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokensOwnedByDAO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"forkId_","type":"uint32"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOfEscrowedToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"returnTokensToOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"address","name":"to","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c060405234801561001057600080fd5b50604051610c55380380610c5583398101604081905261002f91610062565b6001600160a01b039182166080521660a052610095565b80516001600160a01b038116811461005d57600080fd5b919050565b6000806040838503121561007557600080fd5b61007e83610046565b915061008c60208401610046565b90509250929050565b60805160a051610b55610100600039600081816101d90152818161022b015281816103c00152818161055c015261077301526000818161013b0152818161026b01528181610323015281816106080152818161063a015281816106c2015261070d0152610b556000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80639c312ca2116100715780639c312ca21461019b578063aa34213b146101ae578063c163de3d146101b7578063ced9481f146101d4578063d07d804c146101fb578063d7e53db01461020e57600080fd5b8063037c5c65146100b9578063150b7a021461010a5780634162169f146101365780636acff27a1461015d57806378752b7f146101725780639b3c1e2214610185575b600080fd5b6100ed6100c736600461083c565b60016020908152600092835260408084209091529082529020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61011d6101183660046108a3565b61021e565b6040516001600160e01b03199091168152602001610101565b6100ed7f000000000000000000000000000000000000000000000000000000000000000081565b61017061016b3660046109cb565b610318565b005b6100ed61018036600461083c565b610507565b61018d610538565b604051908152602001610101565b6100ed6101a9366004610a1e565b6105d6565b61018d60025481565b6101bf61062d565b60405163ffffffff9091168152602001610101565b6100ed7f000000000000000000000000000000000000000000000000000000000000000081565b610170610209366004610a37565b6106b7565b6000546101bf9063ffffffff1681565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146102695760405163ebdddb3560e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b0316146102bb57604051630999802f60e41b815260040160405180910390fd5b6000805463ffffffff168152600160209081526040808320868452909152812080546001600160a01b0319166001600160a01b038716179055600280549161030283610aa1565b90915550630a85bd0160e11b9695505050505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461036157604051630999802f60e41b815260040160405180910390fd5b60005b818110156104e757836001600160a01b031661039784848481811061038b5761038b610aba565b905060200201356105d6565b6001600160a01b0316146103be576040516330cd747160e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166323b872dd308686868681811061040157610401610aba565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b15801561045857600080fd5b505af115801561046c573d6000803e3d6000fd5b50506000805463ffffffff16815260016020526040812090925090508185858581811061049b5761049b610aba565b90506020020135815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080806104df90610aa1565b915050610364565b5081819050600260008282546104fd9190610ad0565b9091555050505050565b63ffffffff821660009081526001602090815260408083208484529091529020546001600160a01b03165b92915050565b6002546040516370a0823160e01b8152306004820152600091906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156105a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c79190610ae3565b6105d19190610ad0565b905090565b6000805463ffffffff1681526001602090815260408083208484529091528120546001600160a01b03168061053257507f000000000000000000000000000000000000000000000000000000000000000092915050565b6000336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461067857604051630999802f60e41b815260040160405180910390fd5b5060006002819055805463ffffffff169081908061069583610afc565b91906101000a81548163ffffffff021916908363ffffffff1602179055505090565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461070057604051630999802f60e41b815260040160405180910390fd5b60005b82811015610836577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661074a85858481811061038b5761038b610aba565b6001600160a01b031614610771576040516330cd747160e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166323b872dd30848787868181106107b4576107b4610aba565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b15801561080b57600080fd5b505af115801561081f573d6000803e3d6000fd5b50505050808061082e90610aa1565b915050610703565b50505050565b6000806040838503121561084f57600080fd5b823563ffffffff8116811461086357600080fd5b946020939093013593505050565b80356001600160a01b038116811461088857600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600080600080608085870312156108b957600080fd5b6108c285610871565b93506108d060208601610871565b925060408501359150606085013567ffffffffffffffff808211156108f457600080fd5b818701915087601f83011261090857600080fd5b81358181111561091a5761091a61088d565b604051601f8201601f19908116603f011681019083821181831017156109425761094261088d565b816040528281528a602084870101111561095b57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008083601f84011261099157600080fd5b50813567ffffffffffffffff8111156109a957600080fd5b6020830191508360208260051b85010111156109c457600080fd5b9250929050565b6000806000604084860312156109e057600080fd5b6109e984610871565b9250602084013567ffffffffffffffff811115610a0557600080fd5b610a118682870161097f565b9497909650939450505050565b600060208284031215610a3057600080fd5b5035919050565b600080600060408486031215610a4c57600080fd5b833567ffffffffffffffff811115610a6357600080fd5b610a6f8682870161097f565b9094509250610a82905060208501610871565b90509250925092565b634e487b7160e01b600052601160045260246000fd5b600060018201610ab357610ab3610a8b565b5060010190565b634e487b7160e01b600052603260045260246000fd5b8181038181111561053257610532610a8b565b600060208284031215610af557600080fd5b5051919050565b600063ffffffff808316818103610b1557610b15610a8b565b600101939250505056fea26469706673582212201eed2670a84082de2db3b08dcd84978c0701925d35d59313b550cd321b85c82564736f6c634300081300330000000000000000000000006f3e6272a167e8accb32072d08e0957f9c79223d0000000000000000000000009c8ff314c9bc7f6e59a9d9225fb22946427edc03
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80639c312ca2116100715780639c312ca21461019b578063aa34213b146101ae578063c163de3d146101b7578063ced9481f146101d4578063d07d804c146101fb578063d7e53db01461020e57600080fd5b8063037c5c65146100b9578063150b7a021461010a5780634162169f146101365780636acff27a1461015d57806378752b7f146101725780639b3c1e2214610185575b600080fd5b6100ed6100c736600461083c565b60016020908152600092835260408084209091529082529020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61011d6101183660046108a3565b61021e565b6040516001600160e01b03199091168152602001610101565b6100ed7f0000000000000000000000006f3e6272a167e8accb32072d08e0957f9c79223d81565b61017061016b3660046109cb565b610318565b005b6100ed61018036600461083c565b610507565b61018d610538565b604051908152602001610101565b6100ed6101a9366004610a1e565b6105d6565b61018d60025481565b6101bf61062d565b60405163ffffffff9091168152602001610101565b6100ed7f0000000000000000000000009c8ff314c9bc7f6e59a9d9225fb22946427edc0381565b610170610209366004610a37565b6106b7565b6000546101bf9063ffffffff1681565b6000336001600160a01b037f0000000000000000000000009c8ff314c9bc7f6e59a9d9225fb22946427edc0316146102695760405163ebdddb3560e01b815260040160405180910390fd5b7f0000000000000000000000006f3e6272a167e8accb32072d08e0957f9c79223d6001600160a01b0316856001600160a01b0316146102bb57604051630999802f60e41b815260040160405180910390fd5b6000805463ffffffff168152600160209081526040808320868452909152812080546001600160a01b0319166001600160a01b038716179055600280549161030283610aa1565b90915550630a85bd0160e11b9695505050505050565b336001600160a01b037f0000000000000000000000006f3e6272a167e8accb32072d08e0957f9c79223d161461036157604051630999802f60e41b815260040160405180910390fd5b60005b818110156104e757836001600160a01b031661039784848481811061038b5761038b610aba565b905060200201356105d6565b6001600160a01b0316146103be576040516330cd747160e01b815260040160405180910390fd5b7f0000000000000000000000009c8ff314c9bc7f6e59a9d9225fb22946427edc036001600160a01b03166323b872dd308686868681811061040157610401610aba565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b15801561045857600080fd5b505af115801561046c573d6000803e3d6000fd5b50506000805463ffffffff16815260016020526040812090925090508185858581811061049b5761049b610aba565b90506020020135815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080806104df90610aa1565b915050610364565b5081819050600260008282546104fd9190610ad0565b9091555050505050565b63ffffffff821660009081526001602090815260408083208484529091529020546001600160a01b03165b92915050565b6002546040516370a0823160e01b8152306004820152600091906001600160a01b037f0000000000000000000000009c8ff314c9bc7f6e59a9d9225fb22946427edc0316906370a0823190602401602060405180830381865afa1580156105a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c79190610ae3565b6105d19190610ad0565b905090565b6000805463ffffffff1681526001602090815260408083208484529091528120546001600160a01b03168061053257507f0000000000000000000000006f3e6272a167e8accb32072d08e0957f9c79223d92915050565b6000336001600160a01b037f0000000000000000000000006f3e6272a167e8accb32072d08e0957f9c79223d161461067857604051630999802f60e41b815260040160405180910390fd5b5060006002819055805463ffffffff169081908061069583610afc565b91906101000a81548163ffffffff021916908363ffffffff1602179055505090565b336001600160a01b037f0000000000000000000000006f3e6272a167e8accb32072d08e0957f9c79223d161461070057604051630999802f60e41b815260040160405180910390fd5b60005b82811015610836577f0000000000000000000000006f3e6272a167e8accb32072d08e0957f9c79223d6001600160a01b031661074a85858481811061038b5761038b610aba565b6001600160a01b031614610771576040516330cd747160e01b815260040160405180910390fd5b7f0000000000000000000000009c8ff314c9bc7f6e59a9d9225fb22946427edc036001600160a01b03166323b872dd30848787868181106107b4576107b4610aba565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b15801561080b57600080fd5b505af115801561081f573d6000803e3d6000fd5b50505050808061082e90610aa1565b915050610703565b50505050565b6000806040838503121561084f57600080fd5b823563ffffffff8116811461086357600080fd5b946020939093013593505050565b80356001600160a01b038116811461088857600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600080600080608085870312156108b957600080fd5b6108c285610871565b93506108d060208601610871565b925060408501359150606085013567ffffffffffffffff808211156108f457600080fd5b818701915087601f83011261090857600080fd5b81358181111561091a5761091a61088d565b604051601f8201601f19908116603f011681019083821181831017156109425761094261088d565b816040528281528a602084870101111561095b57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008083601f84011261099157600080fd5b50813567ffffffffffffffff8111156109a957600080fd5b6020830191508360208260051b85010111156109c457600080fd5b9250929050565b6000806000604084860312156109e057600080fd5b6109e984610871565b9250602084013567ffffffffffffffff811115610a0557600080fd5b610a118682870161097f565b9497909650939450505050565b600060208284031215610a3057600080fd5b5035919050565b600080600060408486031215610a4c57600080fd5b833567ffffffffffffffff811115610a6357600080fd5b610a6f8682870161097f565b9094509250610a82905060208501610871565b90509250925092565b634e487b7160e01b600052601160045260246000fd5b600060018201610ab357610ab3610a8b565b5060010190565b634e487b7160e01b600052603260045260246000fd5b8181038181111561053257610532610a8b565b600060208284031215610af557600080fd5b5051919050565b600063ffffffff808316818103610b1557610b15610a8b565b600101939250505056fea26469706673582212201eed2670a84082de2db3b08dcd84978c0701925d35d59313b550cd321b85c82564736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000006f3e6272a167e8accb32072d08e0957f9c79223d0000000000000000000000009c8ff314c9bc7f6e59a9d9225fb22946427edc03
-----Decoded View---------------
Arg [0] : dao_ (address): 0x6f3E6272A167e8AcCb32072d08E0957F9c79223d
Arg [1] : nounsToken_ (address): 0x9C8fF314C9Bc7F6e59A9d9225Fb22946427eDC03
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000006f3e6272a167e8accb32072d08e0957f9c79223d
Arg [1] : 0000000000000000000000009c8ff314c9bc7f6e59a9d9225fb22946427edc03
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
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.