Source Code
Latest 1 from a total of 1 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| 0x496e2063 | 18127328 | 877 days ago | IN | 69 wei | 0.00083055 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
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
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 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.