Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 117 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Cast Vote | 16224892 | 1131 days ago | IN | 0 ETH | 0.00123118 | ||||
| Cast Vote | 16215430 | 1133 days ago | IN | 0 ETH | 0.00117853 | ||||
| Cast Vote | 16215422 | 1133 days ago | IN | 0 ETH | 0.00123514 | ||||
| Cast Vote | 16212760 | 1133 days ago | IN | 0 ETH | 0.00160138 | ||||
| Cast Vote | 16212758 | 1133 days ago | IN | 0 ETH | 0.00164575 | ||||
| Execute | 16189605 | 1136 days ago | IN | 0 ETH | 0.00170271 | ||||
| Execute | 16189268 | 1136 days ago | IN | 0 ETH | 0.00175713 | ||||
| Execute | 16183446 | 1137 days ago | IN | 0 ETH | 0.00214441 | ||||
| Execute | 16178527 | 1138 days ago | IN | 0 ETH | 0.00244899 | ||||
| Propose | 16177258 | 1138 days ago | IN | 0 ETH | 0.01209679 | ||||
| Propose | 16172724 | 1139 days ago | IN | 0 ETH | 0.00764033 | ||||
| Cast Vote | 16167217 | 1139 days ago | IN | 0 ETH | 0.00150369 | ||||
| Cast Vote | 16167215 | 1139 days ago | IN | 0 ETH | 0.00116316 | ||||
| Cast Vote | 16167212 | 1139 days ago | IN | 0 ETH | 0.00122891 | ||||
| Cast Vote | 16167210 | 1139 days ago | IN | 0 ETH | 0.00115895 | ||||
| Cast Vote | 16167208 | 1139 days ago | IN | 0 ETH | 0.00114742 | ||||
| Execute | 16163930 | 1140 days ago | IN | 0 ETH | 0.00192297 | ||||
| Cast Vote | 16163927 | 1140 days ago | IN | 0 ETH | 0.00132733 | ||||
| Cast Vote | 16163029 | 1140 days ago | IN | 0 ETH | 0.00128217 | ||||
| Cast Vote | 16155215 | 1141 days ago | IN | 0 ETH | 0.00220645 | ||||
| Cast Vote | 16155135 | 1141 days ago | IN | 0 ETH | 0.00150085 | ||||
| Propose | 16154032 | 1141 days ago | IN | 0 ETH | 0.00595033 | ||||
| Execute | 16148105 | 1142 days ago | IN | 0 ETH | 0.00331349 | ||||
| Execute | 16147656 | 1142 days ago | IN | 0 ETH | 0.00529728 | ||||
| Propose | 16147577 | 1142 days ago | IN | 0 ETH | 0.00967095 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
DelegateMultiToken
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BSD-3-Clause
/// @title Federation Multi-Token Delegate
import "@openzeppelin/contracts/utils/Strings.sol";
import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import {NounsTokenLike, NounsDAOStorageV1} from "../external/nouns/governance/NounsDAOInterfaces.sol";
import "../federation.sol";
pragma solidity ^0.8.17;
contract DelegateMultiToken is DelegateEvents {
/// @notice The name of this contract
string public constant name = "federation multi-token delegate";
/// @notice The address of the vetoer
address public vetoer;
/// @notice The total number of delegate actions proposed
uint256 public proposalCount;
/// @notice The window in blocks that a proposal which has met quorum can be executed
uint256 public execWindow;
/// @notice The default quorum for all proposals
uint256 public quorumBPS;
/// @notice The official record of all delegate actions ever proposed
mapping(uint256 => DelegateAction) public proposals;
/// @notice The latest proposal for each proposer
mapping(address => uint256) public latestProposalIds;
/// @notice A mapping of valid tokens providing representation in the DAO
mapping(uint256 => MultiToken) public nounishTokens;
/// @notice Size of the nounishTokens list
uint256 public nounishTokensSize;
/**
* @param _vetoer The address that can manage this contract and veto props
* @param _execWindow The window in blocks that a proposal which has met quorum can be executed
* @param _quorumBPS Quorum BPS for proposals
*/
constructor(address _vetoer, uint256 _execWindow, uint256 _quorumBPS) {
execWindow = _execWindow;
vetoer = _vetoer;
quorumBPS = _quorumBPS;
}
/**
* @notice Function used to propose a new proposal. Sender must have delegates above the proposal threshold
* @param eDAO Target address of the external DAO executor
* @param ePropID The ID of the proposal on the external DAO
* @return Proposal id of internal delegate action
*/
function propose(NounsDAOStorageV1 eDAO, uint256 ePropID) public returns (uint256) {
require(
_multiTokenVotes(msg.sender, block.number - 1) > 0,
"representation required to start a vote"
);
require(
address(eDAO) != address(0),
"external DAO address is not valid"
);
require(
!_alreadyProposed(address(eDAO), ePropID),
"proposal already proposed"
);
// this delegate must have representation before voting can be started
try eDAO.nouns().getPriorVotes(address(this), block.number - 1) returns (uint96 votes) {
require(votes > 0, "delegate does not have external DAO representation");
} catch(bytes memory) {
revert("checking delegate representation on external DAO failed");
}
// check when external proposal ends
uint256 ePropEndBlock;
try this._externalProposal(eDAO, ePropID) returns (uint256 endBlock) {
ePropEndBlock = endBlock;
} catch(bytes memory) {
revert(
string.concat("invalid external proposal id: ",
Strings.toString(ePropID),
" for external DAO: ",
Strings.toHexString(address(eDAO))
)
);
}
require(ePropEndBlock > block.number, "external proposal has already ended or does not exist");
proposalCount++;
DelegateAction storage newProposal = proposals[proposalCount];
newProposal.id = proposalCount;
newProposal.eID = ePropID;
newProposal.eDAO = address(eDAO);
newProposal.proposer = msg.sender;
newProposal.quorumVotes = bps2Uint(
quorumBPS,
_multiTokenSupply()
);
/// @notice immediately open proposal for voting
newProposal.startBlock = block.number;
newProposal.endBlock = ePropEndBlock;
newProposal.forVotes = 0;
newProposal.againstVotes = 0;
newProposal.abstainVotes = 0;
newProposal.executed = false;
newProposal.vetoed = false;
latestProposalIds[newProposal.proposer] = newProposal.id;
emit ProposalCreated(
newProposal.id,
msg.sender,
newProposal.eDAO,
newProposal.eID,
newProposal.startBlock,
newProposal.endBlock,
newProposal.quorumVotes
);
return newProposal.id;
}
/**
* @notice Executes a proposal if it has met quorum
* @param proposalId The id of the proposal to execute
* @dev This function ensures that the proposal has reached quorum through a result check
*/
function execute(uint256 proposalId) external {
require(
state(proposalId) == ProposalState.Active,
"proposal can only be executed if it is active"
);
ProposalResult r = result(proposalId);
require(
r != ProposalResult.Undecided,
"proposal result cannot be undecided"
);
DelegateAction storage proposal = proposals[proposalId];
proposal.executed = true;
require(
block.number >= proposal.endBlock-execWindow,
"proposal can only be executed if it is within the execution window"
);
// untrusted external calls, don't modify any state after this point
// support values 0=against, 1=for, 2=abstain
INounsDAOGovernance eDAO = INounsDAOGovernance(proposal.eDAO);
if (r == ProposalResult.For) {
eDAO.castVote(proposal.eID, 1);
} else if (r == ProposalResult.Against) {
eDAO.castVote(proposal.eID, 0);
} else if (r == ProposalResult.Abstain) {
eDAO.castVote(proposal.eID, 2);
}
emit ProposalExecuted(proposalId);
}
/**
* @notice Vetoes a proposal only if sender is the vetoer and the proposal has not been executed.
* @param proposalId The id of the proposal to veto
*/
function veto(uint256 proposalId) external {
require(vetoer != address(0), "veto power burned");
require(msg.sender == vetoer, "caller not vetoer");
require(
state(proposalId) != ProposalState.Executed,
"cannot veto executed proposal"
);
DelegateAction storage proposal = proposals[proposalId];
proposal.vetoed = true;
emit ProposalVetoed(proposalId);
}
/**
* @notice Cast a vote for a proposal with an optional reason
* @param proposalId The id of the proposal to vote on
* @param support The support value for the vote. 0=against, 1=for, 2=abstain
*/
function castVote(
uint256 proposalId,
uint8 support,
string calldata reason
) external {
require(
state(proposalId) == ProposalState.Active,
"voting is closed"
);
require(support <= 2, "invalid vote type");
DelegateAction storage proposal = proposals[proposalId];
uint96 votes = _multiTokenVotes(msg.sender, proposal.startBlock);
require(votes > 0, "caller does not have votes");
Receipt storage receipt = proposal.receipts[msg.sender];
require(
receipt.hasVoted == false,
"already voted"
);
if (support == 0) {
proposal.againstVotes = proposal.againstVotes + votes;
} else if (support == 1) {
proposal.forVotes = proposal.forVotes + votes;
} else if (support == 2) {
proposal.abstainVotes = proposal.abstainVotes + votes;
}
receipt.hasVoted = true;
receipt.support = support;
receipt.votes = votes;
emit VoteCast(
msg.sender,
proposalId,
support,
votes,
reason
);
}
/**
* @notice Gets the receipt for a voter on a given proposal
* @param proposalId the id of proposal
* @param voter The address of the voter
* @return The voting receipt
*/
function getReceipt(uint256 proposalId, address voter) external view returns (Receipt memory) {
return proposals[proposalId].receipts[voter];
}
/**
* @notice Gets the state of a proposal
* @param proposalId The id of the proposal
* @return Proposal state
*/
function state(uint256 proposalId) public view returns (ProposalState) {
require(proposalCount >= proposalId, "proposal not found");
DelegateAction storage proposal = proposals[proposalId];
if (proposal.vetoed) {
return ProposalState.Vetoed;
} else if (proposal.executed) {
return ProposalState.Executed;
} else if (block.number > proposal.endBlock) {
return ProposalState.Expired;
} else {
return ProposalState.Active;
}
}
/**
* @notice Gets the result of a proposal
* @param proposalId The id of the proposal
* @return Proposal result
*/
function result(uint256 proposalId) public view returns (ProposalResult) {
require(proposalCount >= proposalId, "invalid proposal id");
DelegateAction storage proposal = proposals[proposalId];
uint256 totalVotes = proposal.forVotes + proposal.againstVotes + proposal.abstainVotes ;
if (totalVotes < proposal.quorumVotes) {
return ProposalResult.Undecided;
}
if ((proposal.abstainVotes > proposal.forVotes) && (proposal.abstainVotes > proposal.againstVotes)) {
return ProposalResult.Abstain;
}
if (proposal.againstVotes > proposal.forVotes) {
return ProposalResult.Against;
}
if (proposal.forVotes > proposal.againstVotes) {
return ProposalResult.For;
}
return ProposalResult.Undecided;
}
/**
* @notice Changes quorum BPS for a proposal
* @dev function for updating quorumBPS
*/
function _setQuorumBPS(uint _quorumBPS) external {
require(msg.sender == vetoer, "vetoer only");
emit NewQuorumBPS(quorumBPS, _quorumBPS);
quorumBPS = _quorumBPS;
}
/**
* @notice Changes proposal exec window
* @dev function for updating the exec window of a proposal
*/
function _setExecWindow(uint newExecWindow) external {
require(msg.sender == vetoer, "vetoer only");
emit NewExecWindow(execWindow, newExecWindow);
execWindow = newExecWindow;
}
/**
* @notice Burns veto priviledges
* @dev Vetoer function destroying veto power forever
*/
function _burnVetoPower() external {
require(msg.sender == vetoer, "vetoer only");
_setVetoer(address(0));
}
/**
* @notice Changes vetoer address
* @dev Vetoer function for updating vetoer address
*/
function _setVetoer(address newVetoer) public {
require(msg.sender == vetoer, "vetoer only");
emit NewVetoer(vetoer, newVetoer);
vetoer = newVetoer;
}
/// @notice Structure of MultiToken data
struct MultiToken {
/// @notice use erc721 balance for caller when calculating vote representation
bool useERC721Balance;
/// @notice the address of the NounishToken
address token;
/// @notice voting weight given to token
uint256 weight;
}
/**
* @notice Sets tokens to be used for governing this delegate
*/
function _setNounishTokens(address[] calldata _nounishTokens, uint256[] calldata _weights, bool[] calldata _useERC721Balance) external {
require(msg.sender == vetoer, "vetoer only");
emit TokensChanged(_nounishTokens, _weights, _useERC721Balance);
for (uint256 i = 0; i < _nounishTokens.length; i += 1) {
MultiToken storage mt = nounishTokens[i];
mt.token = _nounishTokens[i];
mt.weight = _weights[i];
mt.useERC721Balance = _useERC721Balance[i];
}
nounishTokensSize = _nounishTokens.length;
}
/**
* @notice Helper function to sum all votes w/ weights for given sender
*/
function _multiTokenVotes(address sender, uint256 startBlock) public view returns (uint96) {
uint96 votes = 0;
for (uint256 i = 0; i < nounishTokensSize; i += 1) {
MultiToken memory mt = nounishTokens[i];
if (mt.useERC721Balance) {
votes += uint96(
IERC721(
nounishTokens[i].token
).balanceOf(sender) * nounishTokens[i].weight
);
} else {
votes += NounsTokenLike(nounishTokens[i].token).getPriorVotes(sender, startBlock) * uint96(nounishTokens[i].weight);
}
}
return votes;
}
/**
* @notice Helper function to sum total supply of tokens set for this delegate
*/
function _multiTokenSupply() public view returns (uint256) {
uint256 supply = 0;
for (uint256 i = 0; i < nounishTokensSize; i += 1) {
supply += NounsTokenLike(nounishTokens[i].token).totalSupply();
}
return supply;
}
/**
* @notice Helper function that parses end block from external proposals.
*/
function _externalProposal(NounsDAOStorageV1 eDAO, uint256 ePropID) public view returns (uint256) {
(,,,,,, uint256 ePropEndBlock,,,,,,) = eDAO.proposals(
ePropID
);
return ePropEndBlock;
}
/**
* @notice Helper function that determines if an external proposal has already been opened
* for vote
*/
function _alreadyProposed(address eDAO, uint256 ePropID) public view returns (bool) {
for (uint i=1; i <= proposalCount; i++){
if (proposals[i].eDAO == eDAO && proposals[i].eID == ePropID) {
return true;
}
}
return false;
}
/**
* @dev Helper function for converting bps
*/
function bps2Uint(uint256 bps, uint256 number) internal pure returns (uint256) {
return (number * bps) / 10000;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
/**
* @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
*/
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
}// 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 adds support for changes made by Nouns DAO to GovernorBravo.sol
// See NounsDAOLogicV1.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
);
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 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
}
}
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 (uint96);
}// SPDX-License-Identifier: BSD-3-Clause
/// @title Federation
// Federation is an on-chain delegated voter which enables communities
// in the Nouns ecosystem to participate in governance with one another
// Built by wiz ⌐◨-◨ ☆゚. * ・ 。゚
pragma solidity ^0.8.17;
import {NounsDAOStorageV1} from "./external/nouns/governance/NounsDAOInterfaces.sol";
/// @notice All possible states that a proposal may be in
enum ProposalState {
Active,
Expired,
Executed,
Vetoed
}
/// @notice All possible results for a proposal
enum ProposalResult {
For,
Against,
Abstain,
Undecided
}
/// @notice A delegate action is a proposal for how the Federation delegate should
/// vote on an external proposal.
struct DelegateAction {
/// @notice Unique id for looking up a proposal
uint256 id;
/// @notice Creator of the proposal
address proposer;
/// @notice Implementation of external DAO proposal reference is for
address eDAO;
/// @notice Id of the external proposal reference in the external DAO
uint256 eID;
/// @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 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 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;
}
contract DelegateEvents {
event ProposalCreated(
uint256 id,
address proposer,
address indexed eDAO,
uint256 indexed ePropID,
uint256 startBlock,
uint256 endBlock,
uint256 quorumVotes
);
/// @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 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 Emitted when vetoer is changed
event NewVetoer(address oldVetoer, address newVetoer);
/// @notice Emitted when exec window is changed
event NewExecWindow(uint256 oldExecWindow, uint256 newExecWindow);
event NewQuorumBPS(
uint256 oldQuorumBPS,
uint256 newQuorumBPS
);
event TokensChanged(
address[] newTokens,
uint256[] weights,
bool[] useERC721Balance
);
}
interface INounsDAOGovernance {
function propose(
address[] memory targets,
uint256[] memory values,
string[] memory signatures,
bytes[] memory calldatas,
string memory description
) external returns (uint256);
function castVote(uint256 proposalId, uint8 support) external;
function queue(uint256 proposalId) external;
function execute(uint256 proposalId) external;
function state(uint256 proposalId) external view returns (NounsDAOStorageV1.ProposalState);
function quorumVotes() external view returns (uint256);
function proposalThreshold() external view returns (uint256);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}{
"viaIR": true,
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_vetoer","type":"address"},{"internalType":"uint256","name":"_execWindow","type":"uint256"},{"internalType":"uint256","name":"_quorumBPS","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldExecWindow","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newExecWindow","type":"uint256"}],"name":"NewExecWindow","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldQuorumBPS","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newQuorumBPS","type":"uint256"}],"name":"NewQuorumBPS","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldVetoer","type":"address"},{"indexed":false,"internalType":"address","name":"newVetoer","type":"address"}],"name":"NewVetoer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"proposer","type":"address"},{"indexed":true,"internalType":"address","name":"eDAO","type":"address"},{"indexed":true,"internalType":"uint256","name":"ePropID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"quorumVotes","type":"uint256"}],"name":"ProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"ProposalExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"ProposalVetoed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"newTokens","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"weights","type":"uint256[]"},{"indexed":false,"internalType":"bool[]","name":"useERC721Balance","type":"bool[]"}],"name":"TokensChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"support","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"votes","type":"uint256"},{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"VoteCast","type":"event"},{"inputs":[{"internalType":"address","name":"eDAO","type":"address"},{"internalType":"uint256","name":"ePropID","type":"uint256"}],"name":"_alreadyProposed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_burnVetoPower","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract NounsDAOStorageV1","name":"eDAO","type":"address"},{"internalType":"uint256","name":"ePropID","type":"uint256"}],"name":"_externalProposal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_multiTokenSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"startBlock","type":"uint256"}],"name":"_multiTokenVotes","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newExecWindow","type":"uint256"}],"name":"_setExecWindow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_nounishTokens","type":"address[]"},{"internalType":"uint256[]","name":"_weights","type":"uint256[]"},{"internalType":"bool[]","name":"_useERC721Balance","type":"bool[]"}],"name":"_setNounishTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quorumBPS","type":"uint256"}],"name":"_setQuorumBPS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newVetoer","type":"address"}],"name":"_setVetoer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"uint8","name":"support","type":"uint8"},{"internalType":"string","name":"reason","type":"string"}],"name":"castVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"execWindow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"execute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"address","name":"voter","type":"address"}],"name":"getReceipt","outputs":[{"components":[{"internalType":"bool","name":"hasVoted","type":"bool"},{"internalType":"uint8","name":"support","type":"uint8"},{"internalType":"uint96","name":"votes","type":"uint96"}],"internalType":"struct Receipt","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"latestProposalIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nounishTokens","outputs":[{"internalType":"bool","name":"useERC721Balance","type":"bool"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"weight","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nounishTokensSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proposalCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposals","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"proposer","type":"address"},{"internalType":"address","name":"eDAO","type":"address"},{"internalType":"uint256","name":"eID","type":"uint256"},{"internalType":"uint256","name":"quorumVotes","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"},{"internalType":"uint256","name":"forVotes","type":"uint256"},{"internalType":"uint256","name":"againstVotes","type":"uint256"},{"internalType":"uint256","name":"abstainVotes","type":"uint256"},{"internalType":"bool","name":"vetoed","type":"bool"},{"internalType":"bool","name":"executed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract NounsDAOStorageV1","name":"eDAO","type":"address"},{"internalType":"uint256","name":"ePropID","type":"uint256"}],"name":"propose","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"quorumBPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"result","outputs":[{"internalType":"enum ProposalResult","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"state","outputs":[{"internalType":"enum ProposalState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"veto","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vetoer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60803461008257601f611ffd38819003918201601f19168301916001600160401b03831184841017610087578084926060946040528339810103126100825780516001600160a01b0381169081900361008257604060208301519201519160025560018060a01b03196000541617600055600355604051611f5f908161009e8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe608060409080825260048036101561001657600080fd5b600091823560e01c908163013cf08b146116925750806306fdde031461163957806317977c61146116015780631d28dec7146114c65780632a57adc1146114945780633c594059146114735780633e4f49e61461144257806345742b2a146113e1578063470b762214611145578063589de5df14610aa85780635b961c3e14610a6f57806360c3233b14610a23578063792d0733146109c25780637b186d89146108f45780637fe088f3146108d557806396300b7d1461085d578063b6f322b41461083e578063bf7a2963146107ce578063d8bff440146107a6578063da35c66414610787578063daac20961461057e578063dd23a2951461055a578063e23a9a52146104b1578063e83223c5146104925763fe0d94c11461013757600080fd5b3461048e576020908160031936011261048a5780359061015682611a44565b61015f81611852565b6104315761016c82611ad1565b9061017682611852565b600382146103e257828552808452858520600a8101805461ff001916610100179055600681015460025481039081116103cf57431061035b5760028101546001600160a01b0316926101c781611852565b80610248575090600386979693920154823b1561023a57604484928389519586948593630acf027160e31b8552840152600160248401525af1801561023e57610226575b5050600080516020611f0a833981519152925b51908152a180f35b61022f9061177a565b61023a57833861020b565b8380fd5b85513d84823e3d90fd5b61025181611852565b600181036102c2575090600386979693920154823b1561023a57604484928389519586948593630acf027160e31b85528401528160248401525af1801561023e576102ae575b5050600080516020611f0a8339815191529261021e565b6102b79061177a565b61023a578338610297565b806102ce600292611852565b146102ed575b505050600080516020611f0a833981519152929361021e565b6003015490823b156103575790604486928389519586948593630acf027160e31b8552840152600260248401525af1801561034d5761032e575b80806102d4565b92610347600080516020611f0a8339815191529461177a565b92610327565b85513d86823e3d90fd5b8580fd5b865162461bcd60e51b8152808301869052604260248201527f70726f706f73616c2063616e206f6e6c7920626520657865637574656420696660448201527f2069742069732077697468696e2074686520657865637574696f6e2077696e646064820152616f7760f01b608482015260a490fd5b634e487b7160e01b875260118352602487fd5b855162461bcd60e51b8152908101849052602360248201527f70726f706f73616c20726573756c742063616e6e6f7420626520756e6465636960448201526219195960ea1b6064820152608490fd5b845162461bcd60e51b8152908101839052602d60248201527f70726f706f73616c2063616e206f6e6c7920626520657865637574656420696660448201526c2069742069732061637469766560981b6064820152608490fd5b8280fd5b5080fd5b82843461048e578160031936011261048e576020906003549051908152f35b5082903461048a578160031936011261048a576024356001600160a01b038116919082900361023a57928291606094828480516104ed81611748565b828152826020820152015280358352602052600b83832001908252602052209080519161051983611748565b5460ff811615159283815260ff836020830192828560081c16845201916001600160601b03809460101c168352845195865251166020850152511690820152f35b82843461048e578160031936011261048e57602090610577611de1565b9051908152f35b50823461048a57606036600319011261048a5767ffffffffffffffff8235818111610783576105b09036908501611898565b9390602492833581811161077f576105cb9036908501611898565b9160443590811161077b576105e39036908601611898565b9060018060a01b03936105fa858c54163314611b93565b8851988a60608b0160608c525260808a0199878d5b8d8110610755575050808b03602082810191909152838c529a6001600160fb1b038411610751578683918d8660051b928391830137018281038d01828401528c810187905201848e5b87811061073157505090807f5b79933b293fd4765d768993c014078a97e2dd15d6c7c5683ea878db1198c4c7920390a18b5b8b8d81831061069a579060075580f35b8284828f600690846106b096525220928b611bcd565b35888116810361072d5781546106c784878b611bcd565b3560018401556106d8848989611bcd565b358015158091036107285760ff1691610100600160a81b039060081b16906affffffffffffffffffffff60a81b1617179055600181018091111561068a57634e487b7160e01b8d5260118952898dfd5b508f80fd5b8e80fd5b9091823590811515809203610728579081528d01918d0190600101610658565b8d80fd5b909b8c359089821680920361077757600191815260208091019d01910161060f565b8f80fd5b8880fd5b8780fd5b8480fd5b82843461048e578160031936011261048e576020906001549051908152f35b82843461048e578160031936011261048e57905490516001600160a01b039091168152602090f35b82843461048e578160031936011261048e578154907fc5644f3588a066b15dcf6b636b74aadca57cfaccf608d9de7d8786364b7a8d02906001600160a01b03831661082333821461081e81611b93565b611b93565b8151908152846020820152a16001600160a01b031916815580f35b82843461048e578160031936011261048e576020906002549051908152f35b82843461048e57602036600319011261048e57610878611837565b82546001600160a01b038082169391927fc5644f3588a066b15dcf6b636b74aadca57cfaccf608d9de7d8786364b7a8d029291906108b7338714611b93565b82519586521693846020820152a16001600160a01b03191617815580f35b82843461048e578160031936011261048e576020906007549051908152f35b50823461048a5761090436611872565b825163013cf08b60e01b8152938401526101a092906001600160a01b039084908390602490829085165afa9384156109b8578594610947575b6020858551908152f35b909180939450813d83116109b1575b61096081836117aa565b8101031261023a5760208201519081160361048a57602092506109a761018060c0830151926109926101408201611e89565b506109a06101608201611e89565b5001611e89565b509083808061093d565b503d610956565b83513d87823e3d90fd5b5082903461048a57602036600319011261048a577f7d1b410a91f91b36a4e774b83dcfe723dc83340a4eee8e7d5eae4ab6767b80ec903591610a0e60018060a01b038554163314611b93565b6002548151908152836020820152a160025580f35b5082903461048a57602036600319011261048a57606092829135815260066020522090600182549201549080519260ff81161515845260018060a01b039060081c166020840152820152f35b82843461048e578060031936011261048e576020906001600160601b03610aa0610a97611837565b60243590611bf8565b915191168152f35b50903461114257610ab836611872565b436000198181019493909291851161112f576001600160601b039182610ade8733611bf8565b16156110dc576001600160a01b0391821692831561108f57610b008285611e96565b61104c5788516305bc8be360e31b81526020979088818b81895afa908115611042579189918b878e958c93611000575b50945163782d6fe160e01b81523091810191825260208201939093529193849283919082906040015b0392165afa879181610fd1575b50610bdc57608489898c610b786118e8565b505162461bcd60e51b815291820152603760248201527f636865636b696e672064656c656761746520726570726573656e746174696f6e60448201527f206f6e2065787465726e616c2044414f206661696c65640000000000000000006064820152fd5b1615610f7357875191637b186d8960e01b8352838884015260249282848201528781604481305afa879181610f44575b50610de0575050610c2590610c1f6118e8565b50611971565b91875193610c3285611748565b602a85528685019589368837855115610dce5760308753855190600191821015610dbc579190607860218801536029925b818411610d535750505050610d125750610d0e938693610cfa93610ceb605194610cc09a519a857f696e76616c69642065787465726e616c2070726f706f73616c2069643a2000008d978801528251928391603e890191016117e8565b840191720103337b91032bc3a32b93730b6102220a79d1606d1b603e840152518093868401906117e8565b010360318101875201856117aa565b5162461bcd60e51b8152928392830161180b565b0390fd5b9250505081606494519362461bcd60e51b85528401528201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b90919293600f81166010811015610daa576f181899199a1a9b1b9c1cb0b131b232b360811b901a610d84868a61194a565b538a1c938015610d98578301929190610c63565b634e487b7160e01b825260118b528582fd5b634e487b7160e01b835260328c528683fd5b634e487b7160e01b815260328a528490fd5b634e487b7160e01b8152603289528390fd5b83898993878a8e959443861115610ee55750938697937f3040467dfbe9e4030b04e5c182272fc38319827bb3a7dda122f52cdc5093207d9360a093600599898b99610e2c600154611918565b9c8d9384600155848352878152600a8484209d8e878155600381019e8f5560028101986001600160601b038e1b90818b5416178a5560018201903390825416179055612710610e84600354610e7f611de1565b611a31565b049a81019a8b55019d8e439055600681019a8b558460078201558460088201558460098201550161ffff1981541690553383525220555416945495549154905490875192898452338b8501528884015260608301526080820152a351908152f35b8460356084928a8a519362461bcd60e51b85528401528201527f65787465726e616c2070726f706f73616c2068617320616c726561647920656e604482015274191959081bdc88191bd95cc81b9bdd08195e1a5cdd605a1b6064820152fd5b9091508881813d8311610f6c575b610f5c81836117aa565b8101031261077f57519038610c0c565b503d610f52565b875162461bcd60e51b8152808801879052603260248201527f64656c656761746520646f6573206e6f7420686176652065787465726e616c206044820152712220a7903932b83932b9b2b73a30ba34b7b760711b6064820152608490fd5b610ff2919250893d8b11610ff9575b610fea81836117aa565b8101906118c9565b9038610b66565b503d610fe0565b9493955050505081813d831161103b575b61101b81836117aa565b8101031261077f5751848116810361077f578a9189918b87610b59610b30565b503d611011565b8b513d8a823e3d90fd5b885162461bcd60e51b81526020818a0152601960248201527f70726f706f73616c20616c72656164792070726f706f736564000000000000006044820152606490fd5b885162461bcd60e51b81526020818a0152602160248201527f65787465726e616c2044414f2061646472657373206973206e6f742076616c696044820152601960fa1b6064820152608490fd5b875162461bcd60e51b8152602081890152602760248201527f726570726573656e746174696f6e20726571756972656420746f207374617274604482015266206120766f746560c81b6064820152608490fd5b634e487b7160e01b845260118652602484fd5b80fd5b50823461048a57606036600319011261048a57813590602490813560ff8116918282036113dd576044359267ffffffffffffffff9687851161077b573660238601121561077b578481013597881161077b573686898701011161077b576111ab87611a44565b6111b481611852565b6113a857600282116113725786895280602052828920936111d9600586015433611bf8565b906001600160601b03821695861561133057338c52600b8101602052858c209360ff8554166112fe575084928b989694926001927fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda49c9b9997156000146112bd5760080161124888825461193d565b90555b61ff006dffffffffffffffffffffffff000085549360101b16926dffffffffffffffffffffffffffff19169160081b16171717905581519687526020870152850152608060608501528260808501520160a08301378360a0848301015260a0813394601f80199101168101030190a280f35b8584036112d9576007016112d288825461193d565b905561124b565b600286146112e8575b5061124b565b6009016112f688825461193d565b90558e6112e2565b606490600d8b60208a519362461bcd60e51b85528401528201526c185b1c9958591e481d9bdd1959609a1b6044820152fd5b855162461bcd60e51b8152602081860152601a818b01527f63616c6c657220646f6573206e6f74206861766520766f7465730000000000006044820152606490fd5b606490601187602086519362461bcd60e51b855284015282015270696e76616c696420766f7465207479706560781b6044820152fd5b606490601087602086519362461bcd60e51b85528401528201526f1d9bdd1a5b99c81a5cc818db1bdcd95960821b6044820152fd5b8680fd5b5082903461048a57602036600319011261048a577f5f6b9a36f0cda802913c0834cfad665f2efc60b4b887a0bf050b62d28d7e087790359161142d60018060a01b038554163314611b93565b6003548151908152836020820152a160035580f35b50919034611142576020366003190112611142575061146360209235611a44565b90519061146f81611852565b8152f35b50919034611142576020366003190112611142575061146360209235611ad1565b82843461048e578060031936011261048e576020906114bd6114b4611837565b60243590611e96565b90519015158152f35b503461048e576020908160031936011261048a578254813591906001600160a01b031680156115ca57330361159357600261150083611a44565b61150981611852565b1461155057938394827fde0cea2a3a0097cc3d981d40c375407760e85bc9c5e69aea449ac3885f8615c695528352600a81862001600160ff1982541617905551908152a180f35b845162461bcd60e51b8152908101839052601d60248201527f63616e6e6f74207665746f2065786563757465642070726f706f73616c0000006044820152606490fd5b845162461bcd60e51b8152908101839052601160248201527031b0b63632b9103737ba103b32ba37b2b960791b6044820152606490fd5b855162461bcd60e51b815280830185905260116024820152701d995d1bc81c1bddd95c88189d5c9b9959607a1b6044820152606490fd5b82843461048e57602036600319011261048e5760209181906001600160a01b03611629611837565b1681526005845220549051908152f35b82843461048e578160031936011261048e57805161168e9161165a8261178e565b601f82527f66656465726174696f6e206d756c74692d746f6b656e2064656c6567617465006020830152519182918261180b565b0390f35b918491503461023a57602036600319011261023a579081816101809560ff9435815282602052209081549260018060a01b0391826001850154169260028501541690600385015490850154600586015491600687015493600788015495600889015497600a60098b01549a01549a8d5260208d01528b015260608a0152608089015260a088015260c087015260e0860152610100850152610120840152818116151561014084015260081c161515610160820152f35b6060810190811067ffffffffffffffff82111761176457604052565b634e487b7160e01b600052604160045260246000fd5b67ffffffffffffffff811161176457604052565b6040810190811067ffffffffffffffff82111761176457604052565b90601f8019910116810190811067ffffffffffffffff82111761176457604052565b67ffffffffffffffff811161176457601f01601f191660200190565b60005b8381106117fb5750506000910152565b81810151838201526020016117eb565b6040916020825261182b81518092816020860152602086860191016117e8565b601f01601f1916010190565b600435906001600160a01b038216820361184d57565b600080fd5b6004111561185c57565b634e487b7160e01b600052602160045260246000fd5b604090600319011261184d576004356001600160a01b038116810361184d579060243590565b9181601f8401121561184d5782359167ffffffffffffffff831161184d576020808501948460051b01011161184d57565b9081602091031261184d57516001600160601b038116810361184d5790565b3d15611913573d906118f9826117cc565b9161190760405193846117aa565b82523d6000602084013e565b606090565b60001981146119275760010190565b634e487b7160e01b600052601160045260246000fd5b9190820180921161192757565b90815181101561195b570160200190565b634e487b7160e01b600052603260045260246000fd5b8015611a135780816000925b6119fd575061198b826117cc565b9161199960405193846117aa565b80835281601f196119a9836117cc565b013660208601375b6119ba57505090565b6000198101908111611927578091600a91603083830681018091116119275760f81b6001600160f81b03191660001a906119f4908661194a565b530490816119b1565b9091611a0a600a91611918565b9291048061197d565b50604051611a208161178e565b60018152600360fc1b602082015290565b8181029291811591840414171561192757565b8060015410611a975760005260046020526040600020600a81015460ff8116600014611a71575050600390565b60081c60ff1615611a825750600290565b60060154431115611a9257600190565b600090565b60405162461bcd60e51b81526020600482015260126024820152711c1c9bdc1bdcd85b081b9bdd08199bdd5b9960721b6044820152606490fd5b8060015410611b5857600052600460205260406000206007810154600882015491611afc838361193d565b906004611b0e6009830154809461193d565b91015411611b5057828282119182611b46575b5050611b3f57808211611b385711611a9257600390565b5050600190565b5050600290565b1190508238611b21565b505050600390565b60405162461bcd60e51b81526020600482015260136024820152721a5b9d985b1a59081c1c9bdc1bdcd85b081a59606a1b6044820152606490fd5b15611b9a57565b60405162461bcd60e51b815260206004820152600b60248201526a7665746f6572206f6e6c7960a81b6044820152606490fd5b919081101561195b5760051b0190565b9190916001600160601b038080941691160191821161192757565b6000918291600754915b828410611c10575050505090565b9091929384600052600660209080825260408060002091815193611c3385611748565b835460ff811615801587526001600160a01b03600892831c811684890152600196870154978601979097528990611d1d57508582918c6000528483528560002054901c169560248551809881936370a0823160e01b83528d1660048301525afa948515611d1257600095611ce1575b5060008a8152919052200154611ccc92916001600160601b0391611cc591611a31565b1690611bdd565b935b6001810180911161192757929190611c02565b90948582813d8311611d0b575b611cf881836117aa565b8101031261114257505193611cc5611ca2565b503d611cee565b83513d6000823e3d90fd5b60008c815284845285902054855163782d6fe160e01b81526001600160a01b0392909216600480840191909152602483018b9052969897919594939283928792604492849291901c165afa938415611d1257600094611dc2575b508a600052526001600160601b0380958192600020015416911602928316928303611dad575090611da791611bdd565b93611cce565b601190634e487b7160e01b6000525260246000fd5b81611dda9295503d8611610ff957610fea81836117aa565b9238611d77565b6000806007545b808210611df457505090565b90918260005260206006815260046040918060018060a01b03846000205460081c168451938480926318160ddd60e01b82525afa928315611e7f5750916001600160601b0391611e509493600092611e62575b5050169061193d565b91600181018091116119275790611de8565b611e789250803d10610ff957610fea81836117aa565b3880611e47565b513d6000823e3d90fd5b5190811515820361184d57565b60019081928254935b84811115611eb1575050505050600090565b600081815260046020526040808220600201546001600160a01b038681169116149184919083611ef9575b505050611ef157611eec90611918565b611e9f565b505050905090565b2060030154149050823880611edc56fe712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291fa26469706673582212205bbe7709602e71ee5069e097ef394cbb9e80664481b1c33b57f952f4b18753fc64736f6c634300081100330000000000000000000000000145398bfe3d478bedc860510cfae4870d27500500000000000000000000000000000000000000000000000000000000000009c400000000000000000000000000000000000000000000000000000000000001f4
Deployed Bytecode
0x608060409080825260048036101561001657600080fd5b600091823560e01c908163013cf08b146116925750806306fdde031461163957806317977c61146116015780631d28dec7146114c65780632a57adc1146114945780633c594059146114735780633e4f49e61461144257806345742b2a146113e1578063470b762214611145578063589de5df14610aa85780635b961c3e14610a6f57806360c3233b14610a23578063792d0733146109c25780637b186d89146108f45780637fe088f3146108d557806396300b7d1461085d578063b6f322b41461083e578063bf7a2963146107ce578063d8bff440146107a6578063da35c66414610787578063daac20961461057e578063dd23a2951461055a578063e23a9a52146104b1578063e83223c5146104925763fe0d94c11461013757600080fd5b3461048e576020908160031936011261048a5780359061015682611a44565b61015f81611852565b6104315761016c82611ad1565b9061017682611852565b600382146103e257828552808452858520600a8101805461ff001916610100179055600681015460025481039081116103cf57431061035b5760028101546001600160a01b0316926101c781611852565b80610248575090600386979693920154823b1561023a57604484928389519586948593630acf027160e31b8552840152600160248401525af1801561023e57610226575b5050600080516020611f0a833981519152925b51908152a180f35b61022f9061177a565b61023a57833861020b565b8380fd5b85513d84823e3d90fd5b61025181611852565b600181036102c2575090600386979693920154823b1561023a57604484928389519586948593630acf027160e31b85528401528160248401525af1801561023e576102ae575b5050600080516020611f0a8339815191529261021e565b6102b79061177a565b61023a578338610297565b806102ce600292611852565b146102ed575b505050600080516020611f0a833981519152929361021e565b6003015490823b156103575790604486928389519586948593630acf027160e31b8552840152600260248401525af1801561034d5761032e575b80806102d4565b92610347600080516020611f0a8339815191529461177a565b92610327565b85513d86823e3d90fd5b8580fd5b865162461bcd60e51b8152808301869052604260248201527f70726f706f73616c2063616e206f6e6c7920626520657865637574656420696660448201527f2069742069732077697468696e2074686520657865637574696f6e2077696e646064820152616f7760f01b608482015260a490fd5b634e487b7160e01b875260118352602487fd5b855162461bcd60e51b8152908101849052602360248201527f70726f706f73616c20726573756c742063616e6e6f7420626520756e6465636960448201526219195960ea1b6064820152608490fd5b845162461bcd60e51b8152908101839052602d60248201527f70726f706f73616c2063616e206f6e6c7920626520657865637574656420696660448201526c2069742069732061637469766560981b6064820152608490fd5b8280fd5b5080fd5b82843461048e578160031936011261048e576020906003549051908152f35b5082903461048a578160031936011261048a576024356001600160a01b038116919082900361023a57928291606094828480516104ed81611748565b828152826020820152015280358352602052600b83832001908252602052209080519161051983611748565b5460ff811615159283815260ff836020830192828560081c16845201916001600160601b03809460101c168352845195865251166020850152511690820152f35b82843461048e578160031936011261048e57602090610577611de1565b9051908152f35b50823461048a57606036600319011261048a5767ffffffffffffffff8235818111610783576105b09036908501611898565b9390602492833581811161077f576105cb9036908501611898565b9160443590811161077b576105e39036908601611898565b9060018060a01b03936105fa858c54163314611b93565b8851988a60608b0160608c525260808a0199878d5b8d8110610755575050808b03602082810191909152838c529a6001600160fb1b038411610751578683918d8660051b928391830137018281038d01828401528c810187905201848e5b87811061073157505090807f5b79933b293fd4765d768993c014078a97e2dd15d6c7c5683ea878db1198c4c7920390a18b5b8b8d81831061069a579060075580f35b8284828f600690846106b096525220928b611bcd565b35888116810361072d5781546106c784878b611bcd565b3560018401556106d8848989611bcd565b358015158091036107285760ff1691610100600160a81b039060081b16906affffffffffffffffffffff60a81b1617179055600181018091111561068a57634e487b7160e01b8d5260118952898dfd5b508f80fd5b8e80fd5b9091823590811515809203610728579081528d01918d0190600101610658565b8d80fd5b909b8c359089821680920361077757600191815260208091019d01910161060f565b8f80fd5b8880fd5b8780fd5b8480fd5b82843461048e578160031936011261048e576020906001549051908152f35b82843461048e578160031936011261048e57905490516001600160a01b039091168152602090f35b82843461048e578160031936011261048e578154907fc5644f3588a066b15dcf6b636b74aadca57cfaccf608d9de7d8786364b7a8d02906001600160a01b03831661082333821461081e81611b93565b611b93565b8151908152846020820152a16001600160a01b031916815580f35b82843461048e578160031936011261048e576020906002549051908152f35b82843461048e57602036600319011261048e57610878611837565b82546001600160a01b038082169391927fc5644f3588a066b15dcf6b636b74aadca57cfaccf608d9de7d8786364b7a8d029291906108b7338714611b93565b82519586521693846020820152a16001600160a01b03191617815580f35b82843461048e578160031936011261048e576020906007549051908152f35b50823461048a5761090436611872565b825163013cf08b60e01b8152938401526101a092906001600160a01b039084908390602490829085165afa9384156109b8578594610947575b6020858551908152f35b909180939450813d83116109b1575b61096081836117aa565b8101031261023a5760208201519081160361048a57602092506109a761018060c0830151926109926101408201611e89565b506109a06101608201611e89565b5001611e89565b509083808061093d565b503d610956565b83513d87823e3d90fd5b5082903461048a57602036600319011261048a577f7d1b410a91f91b36a4e774b83dcfe723dc83340a4eee8e7d5eae4ab6767b80ec903591610a0e60018060a01b038554163314611b93565b6002548151908152836020820152a160025580f35b5082903461048a57602036600319011261048a57606092829135815260066020522090600182549201549080519260ff81161515845260018060a01b039060081c166020840152820152f35b82843461048e578060031936011261048e576020906001600160601b03610aa0610a97611837565b60243590611bf8565b915191168152f35b50903461114257610ab836611872565b436000198181019493909291851161112f576001600160601b039182610ade8733611bf8565b16156110dc576001600160a01b0391821692831561108f57610b008285611e96565b61104c5788516305bc8be360e31b81526020979088818b81895afa908115611042579189918b878e958c93611000575b50945163782d6fe160e01b81523091810191825260208201939093529193849283919082906040015b0392165afa879181610fd1575b50610bdc57608489898c610b786118e8565b505162461bcd60e51b815291820152603760248201527f636865636b696e672064656c656761746520726570726573656e746174696f6e60448201527f206f6e2065787465726e616c2044414f206661696c65640000000000000000006064820152fd5b1615610f7357875191637b186d8960e01b8352838884015260249282848201528781604481305afa879181610f44575b50610de0575050610c2590610c1f6118e8565b50611971565b91875193610c3285611748565b602a85528685019589368837855115610dce5760308753855190600191821015610dbc579190607860218801536029925b818411610d535750505050610d125750610d0e938693610cfa93610ceb605194610cc09a519a857f696e76616c69642065787465726e616c2070726f706f73616c2069643a2000008d978801528251928391603e890191016117e8565b840191720103337b91032bc3a32b93730b6102220a79d1606d1b603e840152518093868401906117e8565b010360318101875201856117aa565b5162461bcd60e51b8152928392830161180b565b0390fd5b9250505081606494519362461bcd60e51b85528401528201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b90919293600f81166010811015610daa576f181899199a1a9b1b9c1cb0b131b232b360811b901a610d84868a61194a565b538a1c938015610d98578301929190610c63565b634e487b7160e01b825260118b528582fd5b634e487b7160e01b835260328c528683fd5b634e487b7160e01b815260328a528490fd5b634e487b7160e01b8152603289528390fd5b83898993878a8e959443861115610ee55750938697937f3040467dfbe9e4030b04e5c182272fc38319827bb3a7dda122f52cdc5093207d9360a093600599898b99610e2c600154611918565b9c8d9384600155848352878152600a8484209d8e878155600381019e8f5560028101986001600160601b038e1b90818b5416178a5560018201903390825416179055612710610e84600354610e7f611de1565b611a31565b049a81019a8b55019d8e439055600681019a8b558460078201558460088201558460098201550161ffff1981541690553383525220555416945495549154905490875192898452338b8501528884015260608301526080820152a351908152f35b8460356084928a8a519362461bcd60e51b85528401528201527f65787465726e616c2070726f706f73616c2068617320616c726561647920656e604482015274191959081bdc88191bd95cc81b9bdd08195e1a5cdd605a1b6064820152fd5b9091508881813d8311610f6c575b610f5c81836117aa565b8101031261077f57519038610c0c565b503d610f52565b875162461bcd60e51b8152808801879052603260248201527f64656c656761746520646f6573206e6f7420686176652065787465726e616c206044820152712220a7903932b83932b9b2b73a30ba34b7b760711b6064820152608490fd5b610ff2919250893d8b11610ff9575b610fea81836117aa565b8101906118c9565b9038610b66565b503d610fe0565b9493955050505081813d831161103b575b61101b81836117aa565b8101031261077f5751848116810361077f578a9189918b87610b59610b30565b503d611011565b8b513d8a823e3d90fd5b885162461bcd60e51b81526020818a0152601960248201527f70726f706f73616c20616c72656164792070726f706f736564000000000000006044820152606490fd5b885162461bcd60e51b81526020818a0152602160248201527f65787465726e616c2044414f2061646472657373206973206e6f742076616c696044820152601960fa1b6064820152608490fd5b875162461bcd60e51b8152602081890152602760248201527f726570726573656e746174696f6e20726571756972656420746f207374617274604482015266206120766f746560c81b6064820152608490fd5b634e487b7160e01b845260118652602484fd5b80fd5b50823461048a57606036600319011261048a57813590602490813560ff8116918282036113dd576044359267ffffffffffffffff9687851161077b573660238601121561077b578481013597881161077b573686898701011161077b576111ab87611a44565b6111b481611852565b6113a857600282116113725786895280602052828920936111d9600586015433611bf8565b906001600160601b03821695861561133057338c52600b8101602052858c209360ff8554166112fe575084928b989694926001927fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda49c9b9997156000146112bd5760080161124888825461193d565b90555b61ff006dffffffffffffffffffffffff000085549360101b16926dffffffffffffffffffffffffffff19169160081b16171717905581519687526020870152850152608060608501528260808501520160a08301378360a0848301015260a0813394601f80199101168101030190a280f35b8584036112d9576007016112d288825461193d565b905561124b565b600286146112e8575b5061124b565b6009016112f688825461193d565b90558e6112e2565b606490600d8b60208a519362461bcd60e51b85528401528201526c185b1c9958591e481d9bdd1959609a1b6044820152fd5b855162461bcd60e51b8152602081860152601a818b01527f63616c6c657220646f6573206e6f74206861766520766f7465730000000000006044820152606490fd5b606490601187602086519362461bcd60e51b855284015282015270696e76616c696420766f7465207479706560781b6044820152fd5b606490601087602086519362461bcd60e51b85528401528201526f1d9bdd1a5b99c81a5cc818db1bdcd95960821b6044820152fd5b8680fd5b5082903461048a57602036600319011261048a577f5f6b9a36f0cda802913c0834cfad665f2efc60b4b887a0bf050b62d28d7e087790359161142d60018060a01b038554163314611b93565b6003548151908152836020820152a160035580f35b50919034611142576020366003190112611142575061146360209235611a44565b90519061146f81611852565b8152f35b50919034611142576020366003190112611142575061146360209235611ad1565b82843461048e578060031936011261048e576020906114bd6114b4611837565b60243590611e96565b90519015158152f35b503461048e576020908160031936011261048a578254813591906001600160a01b031680156115ca57330361159357600261150083611a44565b61150981611852565b1461155057938394827fde0cea2a3a0097cc3d981d40c375407760e85bc9c5e69aea449ac3885f8615c695528352600a81862001600160ff1982541617905551908152a180f35b845162461bcd60e51b8152908101839052601d60248201527f63616e6e6f74207665746f2065786563757465642070726f706f73616c0000006044820152606490fd5b845162461bcd60e51b8152908101839052601160248201527031b0b63632b9103737ba103b32ba37b2b960791b6044820152606490fd5b855162461bcd60e51b815280830185905260116024820152701d995d1bc81c1bddd95c88189d5c9b9959607a1b6044820152606490fd5b82843461048e57602036600319011261048e5760209181906001600160a01b03611629611837565b1681526005845220549051908152f35b82843461048e578160031936011261048e57805161168e9161165a8261178e565b601f82527f66656465726174696f6e206d756c74692d746f6b656e2064656c6567617465006020830152519182918261180b565b0390f35b918491503461023a57602036600319011261023a579081816101809560ff9435815282602052209081549260018060a01b0391826001850154169260028501541690600385015490850154600586015491600687015493600788015495600889015497600a60098b01549a01549a8d5260208d01528b015260608a0152608089015260a088015260c087015260e0860152610100850152610120840152818116151561014084015260081c161515610160820152f35b6060810190811067ffffffffffffffff82111761176457604052565b634e487b7160e01b600052604160045260246000fd5b67ffffffffffffffff811161176457604052565b6040810190811067ffffffffffffffff82111761176457604052565b90601f8019910116810190811067ffffffffffffffff82111761176457604052565b67ffffffffffffffff811161176457601f01601f191660200190565b60005b8381106117fb5750506000910152565b81810151838201526020016117eb565b6040916020825261182b81518092816020860152602086860191016117e8565b601f01601f1916010190565b600435906001600160a01b038216820361184d57565b600080fd5b6004111561185c57565b634e487b7160e01b600052602160045260246000fd5b604090600319011261184d576004356001600160a01b038116810361184d579060243590565b9181601f8401121561184d5782359167ffffffffffffffff831161184d576020808501948460051b01011161184d57565b9081602091031261184d57516001600160601b038116810361184d5790565b3d15611913573d906118f9826117cc565b9161190760405193846117aa565b82523d6000602084013e565b606090565b60001981146119275760010190565b634e487b7160e01b600052601160045260246000fd5b9190820180921161192757565b90815181101561195b570160200190565b634e487b7160e01b600052603260045260246000fd5b8015611a135780816000925b6119fd575061198b826117cc565b9161199960405193846117aa565b80835281601f196119a9836117cc565b013660208601375b6119ba57505090565b6000198101908111611927578091600a91603083830681018091116119275760f81b6001600160f81b03191660001a906119f4908661194a565b530490816119b1565b9091611a0a600a91611918565b9291048061197d565b50604051611a208161178e565b60018152600360fc1b602082015290565b8181029291811591840414171561192757565b8060015410611a975760005260046020526040600020600a81015460ff8116600014611a71575050600390565b60081c60ff1615611a825750600290565b60060154431115611a9257600190565b600090565b60405162461bcd60e51b81526020600482015260126024820152711c1c9bdc1bdcd85b081b9bdd08199bdd5b9960721b6044820152606490fd5b8060015410611b5857600052600460205260406000206007810154600882015491611afc838361193d565b906004611b0e6009830154809461193d565b91015411611b5057828282119182611b46575b5050611b3f57808211611b385711611a9257600390565b5050600190565b5050600290565b1190508238611b21565b505050600390565b60405162461bcd60e51b81526020600482015260136024820152721a5b9d985b1a59081c1c9bdc1bdcd85b081a59606a1b6044820152606490fd5b15611b9a57565b60405162461bcd60e51b815260206004820152600b60248201526a7665746f6572206f6e6c7960a81b6044820152606490fd5b919081101561195b5760051b0190565b9190916001600160601b038080941691160191821161192757565b6000918291600754915b828410611c10575050505090565b9091929384600052600660209080825260408060002091815193611c3385611748565b835460ff811615801587526001600160a01b03600892831c811684890152600196870154978601979097528990611d1d57508582918c6000528483528560002054901c169560248551809881936370a0823160e01b83528d1660048301525afa948515611d1257600095611ce1575b5060008a8152919052200154611ccc92916001600160601b0391611cc591611a31565b1690611bdd565b935b6001810180911161192757929190611c02565b90948582813d8311611d0b575b611cf881836117aa565b8101031261114257505193611cc5611ca2565b503d611cee565b83513d6000823e3d90fd5b60008c815284845285902054855163782d6fe160e01b81526001600160a01b0392909216600480840191909152602483018b9052969897919594939283928792604492849291901c165afa938415611d1257600094611dc2575b508a600052526001600160601b0380958192600020015416911602928316928303611dad575090611da791611bdd565b93611cce565b601190634e487b7160e01b6000525260246000fd5b81611dda9295503d8611610ff957610fea81836117aa565b9238611d77565b6000806007545b808210611df457505090565b90918260005260206006815260046040918060018060a01b03846000205460081c168451938480926318160ddd60e01b82525afa928315611e7f5750916001600160601b0391611e509493600092611e62575b5050169061193d565b91600181018091116119275790611de8565b611e789250803d10610ff957610fea81836117aa565b3880611e47565b513d6000823e3d90fd5b5190811515820361184d57565b60019081928254935b84811115611eb1575050505050600090565b600081815260046020526040808220600201546001600160a01b038681169116149184919083611ef9575b505050611ef157611eec90611918565b611e9f565b505050905090565b2060030154149050823880611edc56fe712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291fa26469706673582212205bbe7709602e71ee5069e097ef394cbb9e80664481b1c33b57f952f4b18753fc64736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000145398bfe3d478bedc860510cfae4870d27500500000000000000000000000000000000000000000000000000000000000009c400000000000000000000000000000000000000000000000000000000000001f4
-----Decoded View---------------
Arg [0] : _vetoer (address): 0x0145398bfE3d478bEDc860510cFaE4870D275005
Arg [1] : _execWindow (uint256): 2500
Arg [2] : _quorumBPS (uint256): 500
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000145398bfe3d478bedc860510cfae4870d275005
Arg [1] : 00000000000000000000000000000000000000000000000000000000000009c4
Arg [2] : 00000000000000000000000000000000000000000000000000000000000001f4
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
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.