Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
NounsDAOLogicV2
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 10000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BSD-3-Clause /// @title The CNNouns DAO logic version 2 /********************************* * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░█████████░░█████████░░░ * * ░░░░░░██░░░████░░██░░░████░░░ * * ░░██████░░░████████░░░████░░░ * * ░░██░░██░░░████░░██░░░████░░░ * * ░░██░░██░░░████░░██░░░████░░░ * * ░░░░░░█████████░░█████████░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * *********************************/ // LICENSE // NounsDAOLogicV2.sol is a modified version of Compound Lab's GovernorBravoDelegate.sol: // https://github.com/compound-finance/compound-protocol/blob/b9b14038612d846b83f8a009a82c38974ff2dcfe/contracts/Governance/GovernorBravoDelegate.sol // // GovernorBravoDelegate.sol source code Copyright 2020 Compound Labs, Inc. licensed under the BSD-3-Clause license. // With modifications by Nounders DAO. // With modifications by CNNouns DAO. // // Additional conditions of BSD-3-Clause can be found here: https://opensource.org/licenses/BSD-3-Clause // // MODIFICATIONS // See NounsDAOLogicV1 for initial GovernorBravoDelegate modifications. // NounsDAOLogicV2 adds: // - `quorumParamsCheckpoints`, which store dynamic quorum parameters checkpoints // to be used when calculating the dynamic quorum. // - `_setDynamicQuorumParams(DynamicQuorumParams memory params)`, which allows the // DAO to update the dynamic quorum parameters' values. // - `getDynamicQuorumParamsAt(uint256 blockNumber_)` // - Individual setters of the DynamicQuorumParams members: // - `_setMinQuorumVotesBPS(uint16 newMinQuorumVotesBPS)` // - `_setMaxQuorumVotesBPS(uint16 newMaxQuorumVotesBPS)` // - `_setQuorumCoefficient(uint32 newQuorumCoefficient)` // - `minQuorumVotes` and `maxQuorumVotes`, which returns the current min and // max quorum votes using the current Noun supply. // - New `Proposal` struct member: // - `totalSupply` used in dynamic quorum calculation. // - `creationBlock` used for retrieving checkpoints of votes and dynamic quorum params. This now // allows changing `votingDelay` without affecting the checkpoints lookup. // - `quorumVotes(uint256 proposalId)`, which calculates and returns the dynamic // quorum for a specific proposal. // - `proposals(uint256 proposalId)` instead of the implicit getter, to avoid stack-too-deep error // - `proposalThreshold` storing as fixed value (instead of basis points) // // NounsDAOLogicV2 removes: // - `quorumVotes()` has been replaced by `quorumVotes(uint256 proposalId)`. pragma solidity ^0.8.6; import './NounsDAOInterfaces.sol'; contract NounsDAOLogicV2 is NounsDAOStorageV2, NounsDAOEventsV2 { /// @notice The name of this contract string public constant name = 'Nouns DAO'; /// @notice The minimum setable proposal threshold uint256 public constant MIN_PROPOSAL_THRESHOLD = 1; /// @notice The maximum setable proposal threshold uint256 public constant MAX_PROPOSAL_THRESHOLD = 1_000; /// @notice The minimum setable voting period uint256 public constant MIN_VOTING_PERIOD = 5_760; // About 24 hours /// @notice The max setable voting period uint256 public constant MAX_VOTING_PERIOD = 80_640; // About 2 weeks /// @notice The min setable voting delay uint256 public constant MIN_VOTING_DELAY = 1; /// @notice The max setable voting delay uint256 public constant MAX_VOTING_DELAY = 40_320; // About 1 week /// @notice The lower bound of minimum quorum votes basis points uint256 public constant MIN_QUORUM_VOTES_BPS_LOWER_BOUND = 200; // 200 basis points or 2% /// @notice The upper bound of minimum quorum votes basis points uint256 public constant MIN_QUORUM_VOTES_BPS_UPPER_BOUND = 2_000; // 2,000 basis points or 20% /// @notice The upper bound of maximum quorum votes basis points uint256 public constant MAX_QUORUM_VOTES_BPS_UPPER_BOUND = 6_000; // 4,000 basis points or 60% /// @notice The maximum setable quorum votes basis points uint256 public constant MAX_QUORUM_VOTES_BPS = 2_000; // 2,000 basis points or 20% /// @notice The maximum number of actions that can be included in a proposal uint256 public constant proposalMaxOperations = 10; // 10 actions /// @notice The maximum priority fee used to cap gas refunds in `castRefundableVote` uint256 public constant MAX_REFUND_PRIORITY_FEE = 2 gwei; /// @notice The vote refund gas overhead, including 7K for ETH transfer and 29K for general transaction overhead uint256 public constant REFUND_BASE_GAS = 36000; /// @notice The maximum gas units the DAO will refund voters on; supports about 9,190 characters uint256 public constant MAX_REFUND_GAS_USED = 200_000; /// @notice The maximum basefee the DAO will refund voters on uint256 public constant MAX_REFUND_BASE_FEE = 200 gwei; /// @notice The EIP-712 typehash for the contract's domain bytes32 public constant DOMAIN_TYPEHASH = keccak256('EIP712Domain(string name,uint256 chainId,address verifyingContract)'); /// @notice The EIP-712 typehash for the ballot struct used by the contract bytes32 public constant BALLOT_TYPEHASH = keccak256('Ballot(uint256 proposalId,uint8 support)'); /// @dev Introduced these errors to reduce contract size, to avoid deployment failure error AdminOnly(); error InvalidMinQuorumVotesBPS(); error InvalidMaxQuorumVotesBPS(); error MinQuorumBPSGreaterThanMaxQuorumBPS(); error UnsafeUint16Cast(); error VetoerOnly(); error PendingVetoerOnly(); error VetoerBurned(); error CantVetoExecutedProposal(); error CantCancelExecutedProposal(); /** * @notice Used to initialize the contract during delegator contructor * @param timelock_ The address of the NounsDAOExecutor * @param nouns_ The address of the NOUN tokens * @param vetoer_ The address allowed to unilaterally veto proposals * @param votingPeriod_ The initial voting period * @param votingDelay_ The initial voting delay * @param proposalThreshold_ The initial proposal threshold * @param dynamicQuorumParams_ The initial dynamic quorum parameters */ function initialize( address timelock_, address nouns_, address vetoer_, uint256 votingPeriod_, uint256 votingDelay_, uint256 proposalThreshold_, DynamicQuorumParams calldata dynamicQuorumParams_ ) public virtual { require(address(timelock) == address(0), 'NounsDAO::initialize: can only initialize once'); if (msg.sender != admin) { revert AdminOnly(); } require(timelock_ != address(0), 'NounsDAO::initialize: invalid timelock address'); require(nouns_ != address(0), 'NounsDAO::initialize: invalid nouns address'); require( votingPeriod_ >= MIN_VOTING_PERIOD && votingPeriod_ <= MAX_VOTING_PERIOD, 'NounsDAO::initialize: invalid voting period' ); require( votingDelay_ >= MIN_VOTING_DELAY && votingDelay_ <= MAX_VOTING_DELAY, 'NounsDAO::initialize: invalid voting delay' ); require( proposalThreshold_ >= MIN_PROPOSAL_THRESHOLD && proposalThreshold_ <= MAX_PROPOSAL_THRESHOLD, 'NounsDAO::initialize: invalid proposal threshold' ); emit VotingPeriodSet(votingPeriod, votingPeriod_); emit VotingDelaySet(votingDelay, votingDelay_); emit ProposalThresholdSet(proposalThreshold, proposalThreshold_); timelock = INounsDAOExecutor(timelock_); nouns = NounsTokenLike(nouns_); vetoer = vetoer_; votingPeriod = votingPeriod_; votingDelay = votingDelay_; proposalThreshold = proposalThreshold_; _setDynamicQuorumParams( dynamicQuorumParams_.minQuorumVotesBPS, dynamicQuorumParams_.maxQuorumVotesBPS, dynamicQuorumParams_.quorumCoefficient ); } struct ProposalTemp { uint256 totalSupply; uint256 proposalThreshold; uint256 latestProposalId; uint256 startBlock; uint256 endBlock; } /** * @notice Function used to propose a new proposal. Sender must have delegates above the proposal threshold * @param targets Target addresses for proposal calls * @param values Eth values for proposal calls * @param signatures Function signatures for proposal calls * @param calldatas Calldatas for proposal calls * @param description String description of the proposal * @return Proposal id of new proposal */ function propose( address[] memory targets, uint256[] memory values, string[] memory signatures, bytes[] memory calldatas, string memory description ) public returns (uint256) { ProposalTemp memory temp; temp.totalSupply = nouns.totalSupply(); temp.proposalThreshold = proposalThreshold; require( nouns.getPriorVotes(msg.sender, block.number - 1) >= temp.proposalThreshold, 'NounsDAO::propose: proposer votes below proposal threshold' ); require( targets.length == values.length && targets.length == signatures.length && targets.length == calldatas.length, 'NounsDAO::propose: proposal function information arity mismatch' ); require(targets.length != 0, 'NounsDAO::propose: must provide actions'); require(targets.length <= proposalMaxOperations, 'NounsDAO::propose: too many actions'); temp.latestProposalId = latestProposalIds[msg.sender]; if (temp.latestProposalId != 0) { ProposalState proposersLatestProposalState = state(temp.latestProposalId); require( proposersLatestProposalState != ProposalState.Active, 'NounsDAO::propose: one live proposal per proposer, found an already active proposal' ); require( proposersLatestProposalState != ProposalState.Pending, 'NounsDAO::propose: one live proposal per proposer, found an already pending proposal' ); } temp.startBlock = block.number + votingDelay; temp.endBlock = temp.startBlock + votingPeriod; proposalCount++; Proposal storage newProposal = _proposals[proposalCount]; newProposal.id = proposalCount; newProposal.proposer = msg.sender; newProposal.proposalThreshold = temp.proposalThreshold; newProposal.eta = 0; newProposal.targets = targets; newProposal.values = values; newProposal.signatures = signatures; newProposal.calldatas = calldatas; newProposal.startBlock = temp.startBlock; newProposal.endBlock = temp.endBlock; newProposal.forVotes = 0; newProposal.againstVotes = 0; newProposal.abstainVotes = 0; newProposal.canceled = false; newProposal.executed = false; newProposal.vetoed = false; newProposal.totalSupply = temp.totalSupply; newProposal.creationBlock = block.number; latestProposalIds[newProposal.proposer] = newProposal.id; /// @notice Maintains backwards compatibility with GovernorBravo events emit ProposalCreated( newProposal.id, msg.sender, targets, values, signatures, calldatas, newProposal.startBlock, newProposal.endBlock, description ); /// @notice Updated event with `proposalThreshold` and `minQuorumVotes` /// @notice `minQuorumVotes` is always zero since V2 introduces dynamic quorum with checkpoints emit ProposalCreatedWithRequirements( newProposal.id, msg.sender, targets, values, signatures, calldatas, newProposal.startBlock, newProposal.endBlock, newProposal.proposalThreshold, minQuorumVotes(), description ); return newProposal.id; } /** * @notice Queues a proposal of state succeeded * @param proposalId The id of the proposal to queue */ function queue(uint256 proposalId) external { require( state(proposalId) == ProposalState.Succeeded, 'NounsDAO::queue: proposal can only be queued if it is succeeded' ); Proposal storage proposal = _proposals[proposalId]; uint256 eta = block.timestamp + timelock.delay(); for (uint256 i = 0; i < proposal.targets.length; i++) { queueOrRevertInternal( proposal.targets[i], proposal.values[i], proposal.signatures[i], proposal.calldatas[i], eta ); } proposal.eta = eta; emit ProposalQueued(proposalId, eta); } function queueOrRevertInternal( address target, uint256 value, string memory signature, bytes memory data, uint256 eta ) internal { require( !timelock.queuedTransactions(keccak256(abi.encode(target, value, signature, data, eta))), 'NounsDAO::queueOrRevertInternal: identical proposal action already queued at eta' ); timelock.queueTransaction(target, value, signature, data, eta); } /** * @notice Executes a queued proposal if eta has passed * @param proposalId The id of the proposal to execute */ function execute(uint256 proposalId) external { require( state(proposalId) == ProposalState.Queued, 'NounsDAO::execute: proposal can only be executed if it is queued' ); Proposal storage proposal = _proposals[proposalId]; proposal.executed = true; for (uint256 i = 0; i < proposal.targets.length; i++) { timelock.executeTransaction( proposal.targets[i], proposal.values[i], proposal.signatures[i], proposal.calldatas[i], proposal.eta ); } emit ProposalExecuted(proposalId); } /** * @notice Cancels a proposal only if sender is the proposer, or proposer delegates dropped below proposal threshold * @param proposalId The id of the proposal to cancel */ function cancel(uint256 proposalId) external { if (state(proposalId) == ProposalState.Executed) { revert CantCancelExecutedProposal(); } Proposal storage proposal = _proposals[proposalId]; require( msg.sender == proposal.proposer || nouns.getPriorVotes(proposal.proposer, block.number - 1) < proposal.proposalThreshold, 'NounsDAO::cancel: proposer above threshold' ); proposal.canceled = true; for (uint256 i = 0; i < proposal.targets.length; i++) { timelock.cancelTransaction( proposal.targets[i], proposal.values[i], proposal.signatures[i], proposal.calldatas[i], proposal.eta ); } emit ProposalCanceled(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 { if (vetoer == address(0)) { revert VetoerBurned(); } if (msg.sender != vetoer) { revert VetoerOnly(); } if (state(proposalId) == ProposalState.Executed) { revert CantVetoExecutedProposal(); } Proposal storage proposal = _proposals[proposalId]; proposal.vetoed = true; for (uint256 i = 0; i < proposal.targets.length; i++) { timelock.cancelTransaction( proposal.targets[i], proposal.values[i], proposal.signatures[i], proposal.calldatas[i], proposal.eta ); } emit ProposalVetoed(proposalId); } /** * @notice Gets actions of a proposal * @param proposalId the id of the proposal * @return targets * @return values * @return signatures * @return calldatas */ function getActions(uint256 proposalId) external view returns ( address[] memory targets, uint256[] memory values, string[] memory signatures, bytes[] memory calldatas ) { Proposal storage p = _proposals[proposalId]; return (p.targets, p.values, p.signatures, p.calldatas); } /** * @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, 'NounsDAO::state: invalid proposal id'); Proposal storage proposal = _proposals[proposalId]; if (proposal.vetoed) { return ProposalState.Vetoed; } else if (proposal.canceled) { return ProposalState.Canceled; } else if (block.number <= proposal.startBlock) { return ProposalState.Pending; } else if (block.number <= proposal.endBlock) { return ProposalState.Active; } else if (proposal.forVotes <= proposal.againstVotes || proposal.forVotes < quorumVotes(proposal.id)) { return ProposalState.Defeated; } else if (proposal.eta == 0) { return ProposalState.Succeeded; } else if (proposal.executed) { return ProposalState.Executed; } else if (block.timestamp >= proposal.eta + timelock.GRACE_PERIOD()) { return ProposalState.Expired; } else { return ProposalState.Queued; } } /** * @notice Returns the proposal details given a proposal id. * The `quorumVotes` member holds the *current* quorum, given the current votes. * @param proposalId the proposal id to get the data for * @return A `ProposalCondensed` struct with the proposal data */ function proposals(uint256 proposalId) external view returns (ProposalCondensed memory) { Proposal storage proposal = _proposals[proposalId]; return ProposalCondensed({ id: proposal.id, proposer: proposal.proposer, proposalThreshold: proposal.proposalThreshold, quorumVotes: quorumVotes(proposal.id), eta: proposal.eta, startBlock: proposal.startBlock, endBlock: proposal.endBlock, forVotes: proposal.forVotes, againstVotes: proposal.againstVotes, abstainVotes: proposal.abstainVotes, canceled: proposal.canceled, vetoed: proposal.vetoed, executed: proposal.executed, totalSupply: proposal.totalSupply, creationBlock: proposal.creationBlock }); } /** * @notice Cast a vote for a proposal * @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) external { emit VoteCast(msg.sender, proposalId, support, castVoteInternal(msg.sender, proposalId, support), ''); } /** * @notice Cast a vote for a proposal, asking the DAO to refund gas costs. * Users with > 0 votes receive refunds. Refunds are partial when using a gas priority fee higher than the DAO's cap. * Refunds are partial when the DAO's balance is insufficient. * No refund is sent when the DAO's balance is empty. No refund is sent to users with no votes. * Voting takes place regardless of refund success. * @param proposalId The id of the proposal to vote on * @param support The support value for the vote. 0=against, 1=for, 2=abstain * @dev Reentrancy is defended against in `castVoteInternal` at the `receipt.hasVoted == false` require statement. */ function castRefundableVote(uint256 proposalId, uint8 support) external { castRefundableVoteInternal(proposalId, support, ''); } /** * @notice Cast a vote for a proposal, asking the DAO to refund gas costs. * Users with > 0 votes receive refunds. Refunds are partial when using a gas priority fee higher than the DAO's cap. * Refunds are partial when the DAO's balance is insufficient. * No refund is sent when the DAO's balance is empty. No refund is sent to users with no votes. * Voting takes place regardless of refund success. * @param proposalId The id of the proposal to vote on * @param support The support value for the vote. 0=against, 1=for, 2=abstain * @param reason The reason given for the vote by the voter * @dev Reentrancy is defended against in `castVoteInternal` at the `receipt.hasVoted == false` require statement. */ function castRefundableVoteWithReason( uint256 proposalId, uint8 support, string calldata reason ) external { castRefundableVoteInternal(proposalId, support, reason); } /** * @notice Internal function that carries out refundable voting logic * @param proposalId The id of the proposal to vote on * @param support The support value for the vote. 0=against, 1=for, 2=abstain * @param reason The reason given for the vote by the voter * @dev Reentrancy is defended against in `castVoteInternal` at the `receipt.hasVoted == false` require statement. */ function castRefundableVoteInternal( uint256 proposalId, uint8 support, string memory reason ) internal { uint256 startGas = gasleft(); uint96 votes = castVoteInternal(msg.sender, proposalId, support); emit VoteCast(msg.sender, proposalId, support, votes, reason); if (votes > 0) { _refundGas(startGas); } } /** * @notice Cast a vote for a proposal with a 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 * @param reason The reason given for the vote by the voter */ function castVoteWithReason( uint256 proposalId, uint8 support, string calldata reason ) external { emit VoteCast(msg.sender, proposalId, support, castVoteInternal(msg.sender, proposalId, support), reason); } /** * @notice Cast a vote for a proposal by signature * @dev External function that accepts EIP-712 signatures for voting on proposals. */ function castVoteBySig( uint256 proposalId, uint8 support, uint8 v, bytes32 r, bytes32 s ) external { bytes32 domainSeparator = keccak256( abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name)), getChainIdInternal(), address(this)) ); bytes32 structHash = keccak256(abi.encode(BALLOT_TYPEHASH, proposalId, support)); bytes32 digest = keccak256(abi.encodePacked('\x19\x01', domainSeparator, structHash)); address signatory = ecrecover(digest, v, r, s); require(signatory != address(0), 'NounsDAO::castVoteBySig: invalid signature'); emit VoteCast(signatory, proposalId, support, castVoteInternal(signatory, proposalId, support), ''); } /** * @notice Internal function that caries out voting logic * @param voter The voter that is casting their vote * @param proposalId The id of the proposal to vote on * @param support The support value for the vote. 0=against, 1=for, 2=abstain * @return The number of votes cast */ function castVoteInternal( address voter, uint256 proposalId, uint8 support ) internal returns (uint96) { require(state(proposalId) == ProposalState.Active, 'NounsDAO::castVoteInternal: voting is closed'); require(support <= 2, 'NounsDAO::castVoteInternal: invalid vote type'); Proposal storage proposal = _proposals[proposalId]; Receipt storage receipt = proposal.receipts[voter]; require(receipt.hasVoted == false, 'NounsDAO::castVoteInternal: voter already voted'); /// @notice: Unlike GovernerBravo, votes are considered from the block the proposal was created in order to normalize quorumVotes and proposalThreshold metrics uint96 votes = nouns.getPriorVotes(voter, proposalCreationBlock(proposal)); 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; return votes; } /** * @notice Admin function for setting the voting delay * @param newVotingDelay new voting delay, in blocks */ function _setVotingDelay(uint256 newVotingDelay) external { if (msg.sender != admin) { revert AdminOnly(); } require( newVotingDelay >= MIN_VOTING_DELAY && newVotingDelay <= MAX_VOTING_DELAY, 'NounsDAO::_setVotingDelay: invalid voting delay' ); uint256 oldVotingDelay = votingDelay; votingDelay = newVotingDelay; emit VotingDelaySet(oldVotingDelay, votingDelay); } /** * @notice Admin function for setting the voting period * @param newVotingPeriod new voting period, in blocks */ function _setVotingPeriod(uint256 newVotingPeriod) external { if (msg.sender != admin) { revert AdminOnly(); } require( newVotingPeriod >= MIN_VOTING_PERIOD && newVotingPeriod <= MAX_VOTING_PERIOD, 'NounsDAO::_setVotingPeriod: invalid voting period' ); uint256 oldVotingPeriod = votingPeriod; votingPeriod = newVotingPeriod; emit VotingPeriodSet(oldVotingPeriod, votingPeriod); } /** * @notice Admin function for setting the proposal threshold * @dev newProposalThreshold must be greater than the hardcoded min * @param newProposalThreshold new proposal threshold */ function _setProposalThreshold(uint256 newProposalThreshold) external { if (msg.sender != admin) { revert AdminOnly(); } require( newProposalThreshold >= MIN_PROPOSAL_THRESHOLD && newProposalThreshold <= MAX_PROPOSAL_THRESHOLD, 'NounsDAO::_setProposalThreshold: invalid proposal threshold' ); uint256 oldProposalThreshold = proposalThreshold; proposalThreshold = newProposalThreshold; emit ProposalThresholdSet(oldProposalThreshold, proposalThreshold); } /** * @notice Admin function for setting the minimum quorum votes bps * @param newMinQuorumVotesBPS minimum quorum votes bps * Must be between `MIN_QUORUM_VOTES_BPS_LOWER_BOUND` and `MIN_QUORUM_VOTES_BPS_UPPER_BOUND` * Must be lower than or equal to maxQuorumVotesBPS */ function _setMinQuorumVotesBPS(uint16 newMinQuorumVotesBPS) external { if (msg.sender != admin) { revert AdminOnly(); } DynamicQuorumParams memory params = getDynamicQuorumParamsAt(block.number); require( newMinQuorumVotesBPS >= MIN_QUORUM_VOTES_BPS_LOWER_BOUND && newMinQuorumVotesBPS <= MIN_QUORUM_VOTES_BPS_UPPER_BOUND, 'NounsDAO::_setMinQuorumVotesBPS: invalid min quorum votes bps' ); require( newMinQuorumVotesBPS <= params.maxQuorumVotesBPS, 'NounsDAO::_setMinQuorumVotesBPS: min quorum votes bps greater than max' ); uint16 oldMinQuorumVotesBPS = params.minQuorumVotesBPS; params.minQuorumVotesBPS = newMinQuorumVotesBPS; _writeQuorumParamsCheckpoint(params); emit MinQuorumVotesBPSSet(oldMinQuorumVotesBPS, newMinQuorumVotesBPS); } /** * @notice Admin function for setting the maximum quorum votes bps * @param newMaxQuorumVotesBPS maximum quorum votes bps * Must be lower than `MAX_QUORUM_VOTES_BPS_UPPER_BOUND` * Must be higher than or equal to minQuorumVotesBPS */ function _setMaxQuorumVotesBPS(uint16 newMaxQuorumVotesBPS) external { if (msg.sender != admin) { revert AdminOnly(); } DynamicQuorumParams memory params = getDynamicQuorumParamsAt(block.number); require( newMaxQuorumVotesBPS <= MAX_QUORUM_VOTES_BPS_UPPER_BOUND, 'NounsDAO::_setMaxQuorumVotesBPS: invalid max quorum votes bps' ); require( params.minQuorumVotesBPS <= newMaxQuorumVotesBPS, 'NounsDAO::_setMaxQuorumVotesBPS: min quorum votes bps greater than max' ); uint16 oldMaxQuorumVotesBPS = params.maxQuorumVotesBPS; params.maxQuorumVotesBPS = newMaxQuorumVotesBPS; _writeQuorumParamsCheckpoint(params); emit MaxQuorumVotesBPSSet(oldMaxQuorumVotesBPS, newMaxQuorumVotesBPS); } /** * @notice Admin function for setting the dynamic quorum coefficient * @param newQuorumCoefficient the new coefficient, as a fixed point integer with 6 decimals */ function _setQuorumCoefficient(uint32 newQuorumCoefficient) external { if (msg.sender != admin) { revert AdminOnly(); } DynamicQuorumParams memory params = getDynamicQuorumParamsAt(block.number); uint32 oldQuorumCoefficient = params.quorumCoefficient; params.quorumCoefficient = newQuorumCoefficient; _writeQuorumParamsCheckpoint(params); emit QuorumCoefficientSet(oldQuorumCoefficient, newQuorumCoefficient); } /** * @notice Admin function for setting all the dynamic quorum parameters * @param newMinQuorumVotesBPS minimum quorum votes bps * Must be between `MIN_QUORUM_VOTES_BPS_LOWER_BOUND` and `MIN_QUORUM_VOTES_BPS_UPPER_BOUND` * Must be lower than or equal to maxQuorumVotesBPS * @param newMaxQuorumVotesBPS maximum quorum votes bps * Must be lower than `MAX_QUORUM_VOTES_BPS_UPPER_BOUND` * Must be higher than or equal to minQuorumVotesBPS * @param newQuorumCoefficient the new coefficient, as a fixed point integer with 6 decimals */ function _setDynamicQuorumParams( uint16 newMinQuorumVotesBPS, uint16 newMaxQuorumVotesBPS, uint32 newQuorumCoefficient ) public { if (msg.sender != admin) { revert AdminOnly(); } if ( newMinQuorumVotesBPS < MIN_QUORUM_VOTES_BPS_LOWER_BOUND || newMinQuorumVotesBPS > MIN_QUORUM_VOTES_BPS_UPPER_BOUND ) { revert InvalidMinQuorumVotesBPS(); } if (newMaxQuorumVotesBPS > MAX_QUORUM_VOTES_BPS_UPPER_BOUND) { revert InvalidMaxQuorumVotesBPS(); } if (newMinQuorumVotesBPS > newMaxQuorumVotesBPS) { revert MinQuorumBPSGreaterThanMaxQuorumBPS(); } DynamicQuorumParams memory oldParams = getDynamicQuorumParamsAt(block.number); DynamicQuorumParams memory params = DynamicQuorumParams({ minQuorumVotesBPS: newMinQuorumVotesBPS, maxQuorumVotesBPS: newMaxQuorumVotesBPS, quorumCoefficient: newQuorumCoefficient }); _writeQuorumParamsCheckpoint(params); emit MinQuorumVotesBPSSet(oldParams.minQuorumVotesBPS, params.minQuorumVotesBPS); emit MaxQuorumVotesBPSSet(oldParams.maxQuorumVotesBPS, params.maxQuorumVotesBPS); emit QuorumCoefficientSet(oldParams.quorumCoefficient, params.quorumCoefficient); } function _withdraw() external returns (uint256, bool) { if (msg.sender != admin) { revert AdminOnly(); } uint256 amount = address(this).balance; (bool sent, ) = msg.sender.call{ value: amount }(''); emit Withdraw(amount, sent); return (amount, sent); } /** * @notice Begins transfer of admin rights. The newPendingAdmin must call `_acceptAdmin` to finalize the transfer. * @dev Admin function to begin change of admin. The newPendingAdmin must call `_acceptAdmin` to finalize the transfer. * @param newPendingAdmin New pending admin. */ function _setPendingAdmin(address newPendingAdmin) external { // Check caller = admin require(msg.sender == admin, 'NounsDAO::_setPendingAdmin: admin only'); // Save current value, if any, for inclusion in log address oldPendingAdmin = pendingAdmin; // Store pendingAdmin with value newPendingAdmin pendingAdmin = newPendingAdmin; // Emit NewPendingAdmin(oldPendingAdmin, newPendingAdmin) emit NewPendingAdmin(oldPendingAdmin, newPendingAdmin); } /** * @notice Accepts transfer of admin rights. msg.sender must be pendingAdmin * @dev Admin function for pending admin to accept role and update admin */ function _acceptAdmin() external { // Check caller is pendingAdmin and pendingAdmin ≠ address(0) require(msg.sender == pendingAdmin && msg.sender != address(0), 'NounsDAO::_acceptAdmin: pending admin only'); // Save current values for inclusion in log address oldAdmin = admin; address oldPendingAdmin = pendingAdmin; // Store admin with value pendingAdmin admin = pendingAdmin; // Clear the pending value pendingAdmin = address(0); emit NewAdmin(oldAdmin, admin); emit NewPendingAdmin(oldPendingAdmin, pendingAdmin); } /** * @notice Begins transition of vetoer. The newPendingVetoer must call _acceptVetoer to finalize the transfer. * @param newPendingVetoer New Pending Vetoer */ function _setPendingVetoer(address newPendingVetoer) public { if (msg.sender != vetoer) { revert VetoerOnly(); } emit NewPendingVetoer(pendingVetoer, newPendingVetoer); pendingVetoer = newPendingVetoer; } function _acceptVetoer() external { if (msg.sender != pendingVetoer) { revert PendingVetoerOnly(); } // Update vetoer emit NewVetoer(vetoer, pendingVetoer); vetoer = pendingVetoer; // Clear the pending value emit NewPendingVetoer(pendingVetoer, address(0)); pendingVetoer = address(0); } /** * @notice Burns veto priviledges * @dev Vetoer function destroying veto power forever */ function _burnVetoPower() public { // Check caller is vetoer require(msg.sender == vetoer, 'NounsDAO::_burnVetoPower: vetoer only'); // Update vetoer to 0x0 emit NewVetoer(vetoer, address(0)); vetoer = address(0); // Clear the pending value emit NewPendingVetoer(pendingVetoer, address(0)); pendingVetoer = address(0); } function proposalCreationBlock(Proposal storage proposal) internal view returns (uint256) { if (proposal.creationBlock == 0) { return proposal.startBlock - votingDelay; } return proposal.creationBlock; } /** * @notice Quorum votes required for a specific proposal to succeed * Differs from `GovernerBravo` which uses fixed amount */ function quorumVotes(uint256 proposalId) public view returns (uint256) { Proposal storage proposal = _proposals[proposalId]; if (proposal.totalSupply == 0) { return proposal.quorumVotes; } return dynamicQuorumVotes( proposal.againstVotes, proposal.totalSupply, getDynamicQuorumParamsAt(proposal.creationBlock) ); } /** * @notice Calculates the required quorum of for-votes based on the amount of against-votes * The more against-votes there are for a proposal, the higher the required quorum is. * The quorum BPS is between `params.minQuorumVotesBPS` and params.maxQuorumVotesBPS. * The additional quorum is calculated as: * quorumCoefficient * againstVotesBPS * @dev Note the coefficient is a fixed point integer with 6 decimals * @param againstVotes Number of against-votes in the proposal * @param totalSupply The total supply of Nouns at the time of proposal creation * @param params Configurable parameters for calculating the quorum based on againstVotes. See `DynamicQuorumParams` definition for additional details. * @return quorumVotes The required quorum */ function dynamicQuorumVotes( uint256 againstVotes, uint256 totalSupply, DynamicQuorumParams memory params ) public pure returns (uint256) { uint256 againstVotesBPS = (10000 * againstVotes) / totalSupply; uint256 quorumAdjustmentBPS = (params.quorumCoefficient * againstVotesBPS) / 1e6; uint256 adjustedQuorumBPS = params.minQuorumVotesBPS + quorumAdjustmentBPS; uint256 quorumBPS = min(params.maxQuorumVotesBPS, adjustedQuorumBPS); return bps2Uint(quorumBPS, totalSupply); } /** * @notice returns the dynamic quorum parameters values at a certain block number * @dev The checkpoints array must not be empty, and the block number must be higher than or equal to * the block of the first checkpoint * @param blockNumber_ the block number to get the params at * @return The dynamic quorum parameters that were set at the given block number */ function getDynamicQuorumParamsAt(uint256 blockNumber_) public view returns (DynamicQuorumParams memory) { uint32 blockNumber = safe32(blockNumber_, 'NounsDAO::getDynamicQuorumParamsAt: block number exceeds 32 bits'); uint256 len = quorumParamsCheckpoints.length; if (len == 0) { return DynamicQuorumParams({ minQuorumVotesBPS: safe16(quorumVotesBPS), maxQuorumVotesBPS: safe16(quorumVotesBPS), quorumCoefficient: 0 }); } if (quorumParamsCheckpoints[len - 1].fromBlock <= blockNumber) { return quorumParamsCheckpoints[len - 1].params; } if (quorumParamsCheckpoints[0].fromBlock > blockNumber) { return DynamicQuorumParams({ minQuorumVotesBPS: safe16(quorumVotesBPS), maxQuorumVotesBPS: safe16(quorumVotesBPS), quorumCoefficient: 0 }); } uint256 lower = 0; uint256 upper = len - 1; while (upper > lower) { uint256 center = upper - (upper - lower) / 2; DynamicQuorumParamsCheckpoint memory cp = quorumParamsCheckpoints[center]; if (cp.fromBlock == blockNumber) { return cp.params; } else if (cp.fromBlock < blockNumber) { lower = center; } else { upper = center - 1; } } return quorumParamsCheckpoints[lower].params; } function _writeQuorumParamsCheckpoint(DynamicQuorumParams memory params) internal { uint32 blockNumber = safe32(block.number, 'block number exceeds 32 bits'); uint256 pos = quorumParamsCheckpoints.length; if (pos > 0 && quorumParamsCheckpoints[pos - 1].fromBlock == blockNumber) { quorumParamsCheckpoints[pos - 1].params = params; } else { quorumParamsCheckpoints.push(DynamicQuorumParamsCheckpoint({ fromBlock: blockNumber, params: params })); } } function _refundGas(uint256 startGas) internal { unchecked { uint256 balance = address(this).balance; if (balance == 0) { return; } uint256 basefee = min(block.basefee, MAX_REFUND_BASE_FEE); uint256 gasPrice = min(tx.gasprice, basefee + MAX_REFUND_PRIORITY_FEE); uint256 gasUsed = min(startGas - gasleft() + REFUND_BASE_GAS, MAX_REFUND_GAS_USED); uint256 refundAmount = min(gasPrice * gasUsed, balance); (bool refundSent, ) = tx.origin.call{ value: refundAmount }(''); emit RefundableVote(tx.origin, refundAmount, refundSent); } } function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @notice Current min quorum votes using Noun total supply */ function minQuorumVotes() public view returns (uint256) { return bps2Uint(getDynamicQuorumParamsAt(block.number).minQuorumVotesBPS, nouns.totalSupply()); } /** * @notice Current max quorum votes using Noun total supply */ function maxQuorumVotes() public view returns (uint256) { return bps2Uint(getDynamicQuorumParamsAt(block.number).maxQuorumVotesBPS, nouns.totalSupply()); } function bps2Uint(uint256 bps, uint256 number) internal pure returns (uint256) { return (number * bps) / 10000; } function getChainIdInternal() internal view returns (uint256) { uint256 chainId; assembly { chainId := chainid() } return chainId; } function safe32(uint256 n, string memory errorMessage) internal pure returns (uint32) { require(n <= type(uint32).max, errorMessage); return uint32(n); } function safe16(uint256 n) internal pure returns (uint16) { if (n > type(uint16).max) { revert UnsafeUint16Cast(); } return uint16(n); } receive() external payable {} }
// SPDX-License-Identifier: BSD-3-Clause /// @title CNNouns 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. // With modifications by CNNouns 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. // NounsDAOEvents and NounsDAOStorageV1Adjusted add support for fixed proposal threshold. // See NounsDAOLogicV2.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 is set event ProposalThresholdSet(uint256 oldProposalThreshold, uint256 newProposalThreshold); /// @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 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 number of votes required in order for a voter to become a proposer *DIFFERS from GovernerBravo and NounsDAO: When calling propose(), getPriorVotes() must be **greater equal** than proposalThreshold in the current implementation, but in the original implementation, getPriorVotes() must be **greater than** proposalThreshold uint256 public proposalThreshold; /// @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 proposalThreshold; /// @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); }
{ "optimizer": { "enabled": true, "runs": 10000 }, "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":[],"name":"AdminOnly","type":"error"},{"inputs":[],"name":"CantCancelExecutedProposal","type":"error"},{"inputs":[],"name":"CantVetoExecutedProposal","type":"error"},{"inputs":[],"name":"InvalidMaxQuorumVotesBPS","type":"error"},{"inputs":[],"name":"InvalidMinQuorumVotesBPS","type":"error"},{"inputs":[],"name":"MinQuorumBPSGreaterThanMaxQuorumBPS","type":"error"},{"inputs":[],"name":"PendingVetoerOnly","type":"error"},{"inputs":[],"name":"UnsafeUint16Cast","type":"error"},{"inputs":[],"name":"VetoerBurned","type":"error"},{"inputs":[],"name":"VetoerOnly","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"oldMaxQuorumVotesBPS","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"newMaxQuorumVotesBPS","type":"uint16"}],"name":"MaxQuorumVotesBPSSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"oldMinQuorumVotesBPS","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"newMinQuorumVotesBPS","type":"uint16"}],"name":"MinQuorumVotesBPSSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"NewAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldImplementation","type":"address"},{"indexed":false,"internalType":"address","name":"newImplementation","type":"address"}],"name":"NewImplementation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldPendingAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newPendingAdmin","type":"address"}],"name":"NewPendingAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldPendingVetoer","type":"address"},{"indexed":false,"internalType":"address","name":"newPendingVetoer","type":"address"}],"name":"NewPendingVetoer","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"}],"name":"ProposalCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"proposer","type":"address"},{"indexed":false,"internalType":"address[]","name":"targets","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"},{"indexed":false,"internalType":"string[]","name":"signatures","type":"string[]"},{"indexed":false,"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"indexed":false,"internalType":"uint256","name":"startBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endBlock","type":"uint256"},{"indexed":false,"internalType":"string","name":"description","type":"string"}],"name":"ProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"proposer","type":"address"},{"indexed":false,"internalType":"address[]","name":"targets","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"},{"indexed":false,"internalType":"string[]","name":"signatures","type":"string[]"},{"indexed":false,"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"indexed":false,"internalType":"uint256","name":"startBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"proposalThreshold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"quorumVotes","type":"uint256"},{"indexed":false,"internalType":"string","name":"description","type":"string"}],"name":"ProposalCreatedWithRequirements","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"},{"indexed":false,"internalType":"uint256","name":"eta","type":"uint256"}],"name":"ProposalQueued","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldProposalThreshold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newProposalThreshold","type":"uint256"}],"name":"ProposalThresholdSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"ProposalVetoed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"oldQuorumCoefficient","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"newQuorumCoefficient","type":"uint32"}],"name":"QuorumCoefficientSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldQuorumVotesBPS","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newQuorumVotesBPS","type":"uint256"}],"name":"QuorumVotesBPSSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"refundAmount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"refundSent","type":"bool"}],"name":"RefundableVote","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldVotingDelay","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newVotingDelay","type":"uint256"}],"name":"VotingDelaySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldVotingPeriod","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newVotingPeriod","type":"uint256"}],"name":"VotingPeriodSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"sent","type":"bool"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"BALLOT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PROPOSAL_THRESHOLD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_QUORUM_VOTES_BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_QUORUM_VOTES_BPS_UPPER_BOUND","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_REFUND_BASE_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_REFUND_GAS_USED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_REFUND_PRIORITY_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_VOTING_DELAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_VOTING_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_PROPOSAL_THRESHOLD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_QUORUM_VOTES_BPS_LOWER_BOUND","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_QUORUM_VOTES_BPS_UPPER_BOUND","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_VOTING_DELAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_VOTING_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REFUND_BASE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_acceptAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_acceptVetoer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_burnVetoPower","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"newMinQuorumVotesBPS","type":"uint16"},{"internalType":"uint16","name":"newMaxQuorumVotesBPS","type":"uint16"},{"internalType":"uint32","name":"newQuorumCoefficient","type":"uint32"}],"name":"_setDynamicQuorumParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"newMaxQuorumVotesBPS","type":"uint16"}],"name":"_setMaxQuorumVotesBPS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"newMinQuorumVotesBPS","type":"uint16"}],"name":"_setMinQuorumVotesBPS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPendingAdmin","type":"address"}],"name":"_setPendingAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPendingVetoer","type":"address"}],"name":"_setPendingVetoer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newProposalThreshold","type":"uint256"}],"name":"_setProposalThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"newQuorumCoefficient","type":"uint32"}],"name":"_setQuorumCoefficient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newVotingDelay","type":"uint256"}],"name":"_setVotingDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newVotingPeriod","type":"uint256"}],"name":"_setVotingPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"cancel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"uint8","name":"support","type":"uint8"}],"name":"castRefundableVote","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":"castRefundableVoteWithReason","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"uint8","name":"support","type":"uint8"}],"name":"castVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"uint8","name":"support","type":"uint8"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"castVoteBySig","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":"castVoteWithReason","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"againstVotes","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"components":[{"internalType":"uint16","name":"minQuorumVotesBPS","type":"uint16"},{"internalType":"uint16","name":"maxQuorumVotesBPS","type":"uint16"},{"internalType":"uint32","name":"quorumCoefficient","type":"uint32"}],"internalType":"struct NounsDAOStorageV2.DynamicQuorumParams","name":"params","type":"tuple"}],"name":"dynamicQuorumVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"execute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"getActions","outputs":[{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"string[]","name":"signatures","type":"string[]"},{"internalType":"bytes[]","name":"calldatas","type":"bytes[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockNumber_","type":"uint256"}],"name":"getDynamicQuorumParamsAt","outputs":[{"components":[{"internalType":"uint16","name":"minQuorumVotesBPS","type":"uint16"},{"internalType":"uint16","name":"maxQuorumVotesBPS","type":"uint16"},{"internalType":"uint32","name":"quorumCoefficient","type":"uint32"}],"internalType":"struct NounsDAOStorageV2.DynamicQuorumParams","name":"","type":"tuple"}],"stateMutability":"view","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 NounsDAOStorageV1Adjusted.Receipt","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"timelock_","type":"address"},{"internalType":"address","name":"nouns_","type":"address"},{"internalType":"address","name":"vetoer_","type":"address"},{"internalType":"uint256","name":"votingPeriod_","type":"uint256"},{"internalType":"uint256","name":"votingDelay_","type":"uint256"},{"internalType":"uint256","name":"proposalThreshold_","type":"uint256"},{"components":[{"internalType":"uint16","name":"minQuorumVotesBPS","type":"uint16"},{"internalType":"uint16","name":"maxQuorumVotesBPS","type":"uint16"},{"internalType":"uint32","name":"quorumCoefficient","type":"uint32"}],"internalType":"struct NounsDAOStorageV2.DynamicQuorumParams","name":"dynamicQuorumParams_","type":"tuple"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"latestProposalIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxQuorumVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minQuorumVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nouns","outputs":[{"internalType":"contract NounsTokenLike","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingVetoer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proposalCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proposalMaxOperations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proposalThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"proposals","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"proposer","type":"address"},{"internalType":"uint256","name":"proposalThreshold","type":"uint256"},{"internalType":"uint256","name":"quorumVotes","type":"uint256"},{"internalType":"uint256","name":"eta","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":"canceled","type":"bool"},{"internalType":"bool","name":"vetoed","type":"bool"},{"internalType":"bool","name":"executed","type":"bool"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"creationBlock","type":"uint256"}],"internalType":"struct NounsDAOStorageV2.ProposalCondensed","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"string[]","name":"signatures","type":"string[]"},{"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"internalType":"string","name":"description","type":"string"}],"name":"propose","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"queue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"quorumParamsCheckpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"components":[{"internalType":"uint16","name":"minQuorumVotesBPS","type":"uint16"},{"internalType":"uint16","name":"maxQuorumVotesBPS","type":"uint16"},{"internalType":"uint32","name":"quorumCoefficient","type":"uint32"}],"internalType":"struct NounsDAOStorageV2.DynamicQuorumParams","name":"params","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"quorumVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"quorumVotesBPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"state","outputs":[{"internalType":"enum NounsDAOStorageV1Adjusted.ProposalState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timelock","outputs":[{"internalType":"contract INounsDAOExecutor","name":"","type":"address"}],"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"},{"inputs":[],"name":"votingDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"votingPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405234801561001057600080fd5b50615ebb80620000216000396000f3fe6080604052600436106103e25760003560e01c8063791f5d231161020d578063c10eb14d11610128578063deaaa7cc116100bb578063e9c714f21161008a578063f851a4401161006f578063f851a44014610baf578063fbfee87614610bcf578063fe0d94c114610be757600080fd5b8063e9c714f214610b7a578063ec91deda14610b8f57600080fd5b8063deaaa7cc14610af1578063e23a9a5214610b25578063e48083fe14610852578063e7951bb9146109b857600080fd5b8063d8bff440116100f7578063d8bff44014610a7b578063da35c66414610a9b578063da95691a14610ab1578063ddf0b00914610ad157600080fd5b8063c10eb14d146109fc578063ccfa51c914610a26578063d33219b414610a3b578063d3f662e114610a5b57600080fd5b8063a67d0635116101a0578063b71d1a0c1161016f578063b71d1a0c14610998578063bb677582146109b8578063bc4cd084146109ce578063bf7a2963146109e757600080fd5b8063a67d06351461091e578063abb308b21461093e578063b11262631461096c578063b58131b01461098257600080fd5b80637fa230bd116101dc5780637fa230bd146108bc57806383cce0e1146108d15780639a0dfb53146108e7578063a64e024a1461090757600080fd5b8063791f5d23146108525780637a3da691146108675780637b3c71d3146108875780637bdbe4d0146108a757600080fd5b80632b5ca189116102fd5780633e4f49e61161029057806350196db31161025f57806350196db3146107d257806356781388146107f25780635c60da1b1461081257806364c059951461083257600080fd5b80633e4f49e61461073857806340e58ee51461076557806344fac8f61461078557806347f4a077146107a557600080fd5b80633932abb1116102cc5780633932abb1146106d75780633bccf4fd146106ed5780633be8ef3f1461070d5780633e2733341461072357600080fd5b80632b5ca189146106525780632cfc81c6146106725780632de45f1814610687578063328dd982146106a757600080fd5b806317ba1b8b11610375578063215809ca11610344578063215809ca146105d857806325fd935a146105ee578063267822471461060457806326e6dcb01461063c57600080fd5b806317ba1b8b146105445780631d28dec7146105645780631dfb1b5a1461058457806320606b70146105a457600080fd5b80630d183f66116103b15780630d183f66146104b55780630ea2d98c146104d75780630f7b1f08146104f757806317977c611461051757600080fd5b8063013cf08b146103ee57806302a251a314610424578063042bc3de1461044857806306fdde031461045f57600080fd5b366103e957005b600080fd5b3480156103fa57600080fd5b5061040e610409366004614d7e565b610c07565b60405161041b9190614d97565b60405180910390f35b34801561043057600080fd5b5061043a60055481565b60405190815260200161041b565b34801561045457600080fd5b5061043a62030d4081565b34801561046b57600080fd5b506104a86040518060400160405280600981526020017f4e6f756e732044414f000000000000000000000000000000000000000000000081525081565b60405161041b9190614ead565b3480156104c157600080fd5b506104d56104d0366004614edc565b610d6e565b005b3480156104e357600080fd5b506104d56104f2366004614d7e565b611210565b34801561050357600080fd5b5061043a610512366004614d7e565b611321565b34801561052357600080fd5b5061043a610532366004614f78565b600c6020526000908152604090205481565b34801561055057600080fd5b506104d561055f366004614d7e565b611365565b34801561057057600080fd5b506104d561057f366004614d7e565b61146c565b34801561059057600080fd5b506104d561059f366004614d7e565b6116cd565b3480156105b057600080fd5b5061043a7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b3480156105e457600080fd5b5061043a61168081565b3480156105fa57600080fd5b5061043a6103e881565b34801561061057600080fd5b50600154610624906001600160a01b031681565b6040516001600160a01b03909116815260200161041b565b34801561064857600080fd5b5061043a61177081565b34801561065e57600080fd5b506104d561066d366004614fa7565b6117d4565b34801561067e57600080fd5b506104d5611885565b34801561069357600080fd5b50600a54610624906001600160a01b031681565b3480156106b357600080fd5b506106c76106c2366004614d7e565b6119b1565b60405161041b949392919061508b565b3480156106e357600080fd5b5061043a60045481565b3480156106f957600080fd5b506104d56107083660046150f4565b611c42565b34801561071957600080fd5b5061043a618ca081565b34801561072f57600080fd5b5061043a611ef3565b34801561074457600080fd5b50610758610753366004614d7e565b611f8a565b60405161041b9190615171565b34801561077157600080fd5b506104d5610780366004614d7e565b612171565b34801561079157600080fd5b506104d56107a03660046151b2565b612496565b3480156107b157600080fd5b506107c56107c0366004614d7e565b6124b4565b60405161041b91906151de565b3480156107de57600080fd5b506104d56107ed366004615220565b6127b0565b3480156107fe57600080fd5b506104d561080d3660046151b2565b612973565b34801561081e57600080fd5b50600254610624906001600160a01b031681565b34801561083e57600080fd5b506104d561084d36600461523b565b6129e3565b34801561085e57600080fd5b5061043a600181565b34801561087357600080fd5b506104d5610882366004615220565b612a2a565b34801561089357600080fd5b506104d56108a236600461523b565b612bfd565b3480156108b357600080fd5b5061043a600a81565b3480156108c857600080fd5b5061043a612c4d565b3480156108dd57600080fd5b5061043a60075481565b3480156108f357600080fd5b5061043a610902366004615322565b612cb6565b34801561091357600080fd5b5061043a62013b0081565b34801561092a57600080fd5b50600e54610624906001600160a01b031681565b34801561094a57600080fd5b5061095e610959366004614d7e565b612d3e565b60405161041b9291906153d7565b34801561097857600080fd5b5061043a619d8081565b34801561098e57600080fd5b5061043a60065481565b3480156109a457600080fd5b506104d56109b3366004614f78565b612da5565b3480156109c457600080fd5b5061043a6107d081565b3480156109da57600080fd5b5061043a642e90edd00081565b3480156109f357600080fd5b506104d5612e97565b348015610a0857600080fd5b50610a11612fc8565b6040805192835290151560208301520161041b565b348015610a3257600080fd5b5061043a60c881565b348015610a4757600080fd5b50600954610624906001600160a01b031681565b348015610a6757600080fd5b506104d5610a76366004614f78565b6130a0565b348015610a8757600080fd5b50600354610624906001600160a01b031681565b348015610aa757600080fd5b5061043a60085481565b348015610abd57600080fd5b5061043a610acc36600461569d565b613165565b348015610add57600080fd5b506104d5610aec366004614d7e565b61386d565b348015610afd57600080fd5b5061043a7f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b348015610b3157600080fd5b50610b45610b4036600461576f565b613ba2565b6040805182511515815260208084015160ff1690820152918101516bffffffffffffffffffffffff169082015260600161041b565b348015610b8657600080fd5b506104d5613c1f565b348015610b9b57600080fd5b506104d5610baa366004615792565b613d70565b348015610bbb57600080fd5b50600054610624906001600160a01b031681565b348015610bdb57600080fd5b5061043a637735940081565b348015610bf357600080fd5b506104d5610c02366004614d7e565b613fac565b610c8f604051806101e001604052806000815260200160006001600160a01b03168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160001515815260200160001515815260200160001515815260200160008152602001600081525090565b6000828152600b602090815260409182902082516101e081018452815480825260018301546001600160a01b03169382019390935260028201549381019390935291906060820190610ce090611321565b81526004830154602082015260098301546040820152600a8301546060820152600b8301546080820152600c83015460a0820152600d83015460c0820152600e83015460ff808216151560e084015261010080830482161515908401526201000090910416151561012082015260108301546101408201526011909201546101609092019190915292915050565b6009546001600160a01b031615610df25760405162461bcd60e51b815260206004820152602e60248201527f4e6f756e7344414f3a3a696e697469616c697a653a2063616e206f6e6c79206960448201527f6e697469616c697a65206f6e636500000000000000000000000000000000000060648201526084015b60405180910390fd5b6000546001600160a01b03163314610e36576040517fc15c60b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038716610eb25760405162461bcd60e51b815260206004820152602e60248201527f4e6f756e7344414f3a3a696e697469616c697a653a20696e76616c696420746960448201527f6d656c6f636b20616464726573730000000000000000000000000000000000006064820152608401610de9565b6001600160a01b038616610f2e5760405162461bcd60e51b815260206004820152602b60248201527f4e6f756e7344414f3a3a696e697469616c697a653a20696e76616c6964206e6f60448201527f756e7320616464726573730000000000000000000000000000000000000000006064820152608401610de9565b6116808410158015610f43575062013b008411155b610fb55760405162461bcd60e51b815260206004820152602b60248201527f4e6f756e7344414f3a3a696e697469616c697a653a20696e76616c696420766f60448201527f74696e6720706572696f640000000000000000000000000000000000000000006064820152608401610de9565b60018310158015610fc85750619d808311155b61103a5760405162461bcd60e51b815260206004820152602a60248201527f4e6f756e7344414f3a3a696e697469616c697a653a20696e76616c696420766f60448201527f74696e672064656c6179000000000000000000000000000000000000000000006064820152608401610de9565b6001821015801561104d57506103e88211155b6110bf5760405162461bcd60e51b815260206004820152603060248201527f4e6f756e7344414f3a3a696e697469616c697a653a20696e76616c696420707260448201527f6f706f73616c207468726573686f6c64000000000000000000000000000000006064820152608401610de9565b60055460408051918252602082018690527f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828910160405180910390a160045460408051918252602082018590527fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93910160405180910390a160065460408051918252602082018490527fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461910160405180910390a1600980546001600160a01b03808a167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255600a805489841690831617905560038054928816929091169190911790556005849055600483905560068290556112076111e76020830183615220565b6111f76040840160208501615220565b610baa6060850160408601614fa7565b50505050505050565b6000546001600160a01b03163314611254576040517fc15c60b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116808110158015611269575062013b008111155b6112db5760405162461bcd60e51b815260206004820152603160248201527f4e6f756e7344414f3a3a5f736574566f74696e67506572696f643a20696e766160448201527f6c696420766f74696e6720706572696f640000000000000000000000000000006064820152608401610de9565b600580549082905560408051828152602081018490527f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e882891015b60405180910390a15050565b6000818152600b6020526040812060108101548203611344576003015492915050565b61135e81600c0154826010015461090284601101546124b4565b9392505050565b6000546001600160a01b031633146113a9576040517fc15c60b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600181101580156113bc57506103e88111155b61142e5760405162461bcd60e51b815260206004820152603b60248201527f4e6f756e7344414f3a3a5f73657450726f706f73616c5468726573686f6c643a60448201527f20696e76616c69642070726f706f73616c207468726573686f6c6400000000006064820152608401610de9565b600680549082905560408051828152602081018490527fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc054619101611315565b6003546001600160a01b03166114ae576040517ff7e4046800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003546001600160a01b031633146114f2576040517f1387214700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60076114fd82611f8a565b600881111561150e5761150e615142565b03611545576040517f6c0a12d500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152600b60205260408120600e810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055905b600582015481101561169c576009546005830180546001600160a01b039092169163591fcdfe9190849081106115bb576115bb6157d5565b6000918252602090912001546006850180546001600160a01b0390921691859081106115e9576115e96157d5565b9060005260206000200154856007018581548110611609576116096157d5565b90600052602060002001866008018681548110611628576116286157d5565b9060005260206000200187600401546040518663ffffffff1660e01b81526004016116579594939291906158ec565b600060405180830381600087803b15801561167157600080fd5b505af1158015611685573d6000803e3d6000fd5b50505050808061169490615968565b915050611583565b506040518281527fde0cea2a3a0097cc3d981d40c375407760e85bc9c5e69aea449ac3885f8615c690602001611315565b6000546001600160a01b03163314611711576040517fc15c60b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600181101580156117245750619d808111155b6117965760405162461bcd60e51b815260206004820152602f60248201527f4e6f756e7344414f3a3a5f736574566f74696e6744656c61793a20696e76616c60448201527f696420766f74696e672064656c617900000000000000000000000000000000006064820152608401610de9565b600480549082905560408051828152602081018490527fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a939101611315565b6000546001600160a01b03163314611818576040517fc15c60b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611823436124b4565b60408101805163ffffffff851690915290915061183f826141db565b6040805163ffffffff8084168252851660208201527f5e3adb1066359dafa23c629f245d93543856115700821dcb4debc416f393c46991015b60405180910390a1505050565b600e546001600160a01b031633146118c9576040517fdecdd8d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600354600e54604080516001600160a01b0393841681529290911660208301527fc5644f3588a066b15dcf6b636b74aadca57cfaccf608d9de7d8786364b7a8d02910160405180910390a1600e54600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909216918217905560408051918252600060208301527f7ad92e57a52c4e3e83ba624622b14e3a5efa0160dd6f9a7975c43ea66bad79ea91015b60405180910390a1600e80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b6060806060806000600b600087815260200190815260200160002090508060050181600601826007018360080183805480602002602001604051908101604052809291908181526020018280548015611a3357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611a15575b5050505050935082805480602002602001604051908101604052809291908181526020018280548015611a8557602002820191906000526020600020905b815481526020019060010190808311611a71575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b82821015611b59578382906000526020600020018054611acc90615804565b80601f0160208091040260200160405190810160405280929190818152602001828054611af890615804565b8015611b455780601f10611b1a57610100808354040283529160200191611b45565b820191906000526020600020905b815481529060010190602001808311611b2857829003601f168201915b505050505081526020019060010190611aad565b50505050915080805480602002602001604051908101604052809291908181526020016000905b82821015611c2c578382906000526020600020018054611b9f90615804565b80601f0160208091040260200160405190810160405280929190818152602001828054611bcb90615804565b8015611c185780601f10611bed57610100808354040283529160200191611c18565b820191906000526020600020905b815481529060010190602001808311611bfb57829003601f168201915b505050505081526020019060010190611b80565b5050505090509450945094509450509193509193565b604080518082018252600981527f4e6f756e732044414f000000000000000000000000000000000000000000000060209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527fe1dd93b3612547b4bb7c3d429f3df8508d84f5a4f63b5e2e44340b94698e6b3b81840152466060820152306080808301919091528351808303909101815260a0820184528051908301207f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f60c083015260e0820189905260ff881661010080840191909152845180840390910181526101208301909452835193909201929092207f19010000000000000000000000000000000000000000000000000000000000006101408401526101428301829052610162830181905290916000906101820160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa158015611dea573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611e735760405162461bcd60e51b815260206004820152602a60248201527f4e6f756e7344414f3a3a63617374566f746542795369673a20696e76616c696460448201527f207369676e6174757265000000000000000000000000000000000000000000006064820152608401610de9565b806001600160a01b03167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda48a8a611eab858e8e61442c565b6040805193845260ff90921660208401526bffffffffffffffffffffffff169082015260806060820181905260009082015260a00160405180910390a2505050505050505050565b6000611f85611f01436124b4565b6000015161ffff16600a60009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8091906159a0565b61478c565b905090565b60008160085410156120035760405162461bcd60e51b8152602060048201526024808201527f4e6f756e7344414f3a3a73746174653a20696e76616c69642070726f706f736160448201527f6c206964000000000000000000000000000000000000000000000000000000006064820152608401610de9565b6000828152600b60205260409020600e810154610100900460ff161561202c5750600892915050565b600e81015460ff16156120425750600292915050565b806009015443116120565750600092915050565b80600a0154431161206a5750600192915050565b80600c015481600b015411158061208e5750805461208790611321565b81600b0154105b1561209c5750600392915050565b80600401546000036120b15750600492915050565b600e81015462010000900460ff16156120cd5750600792915050565b600960009054906101000a90046001600160a01b03166001600160a01b031663c1a287e26040518163ffffffff1660e01b8152600401602060405180830381865afa158015612120573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061214491906159a0565b816004015461215391906159b9565b42106121625750600692915050565b50600592915050565b50919050565b600761217c82611f8a565b600881111561218d5761218d615142565b036121c4576040517f0b586af500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152600b6020526040902060018101546001600160a01b03163314806122aa57506002810154600a546001808401546001600160a01b039283169263782d6fe19291169061221590436159cc565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa158015612276573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061229a91906159df565b6bffffffffffffffffffffffff16105b61231c5760405162461bcd60e51b815260206004820152602a60248201527f4e6f756e7344414f3a3a63616e63656c3a2070726f706f7365722061626f766560448201527f207468726573686f6c64000000000000000000000000000000000000000000006064820152608401610de9565b600e810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560005b6005820154811015612465576009546005830180546001600160a01b039092169163591fcdfe919084908110612384576123846157d5565b6000918252602090912001546006850180546001600160a01b0390921691859081106123b2576123b26157d5565b90600052602060002001548560070185815481106123d2576123d26157d5565b906000526020600020018660080186815481106123f1576123f16157d5565b9060005260206000200187600401546040518663ffffffff1660e01b81526004016124209594939291906158ec565b600060405180830381600087803b15801561243a57600080fd5b505af115801561244e573d6000803e3d6000fd5b50505050808061245d90615968565b91505061234c565b506040518281527f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c90602001611315565b6124b08282604051806020016040528060008152506147a5565b5050565b604080516060810182526000808252602082018190529181019190915260006124f583604051806060016040528060408152602001615e4660409139614824565b600d54909150600081900361254457604051806060016040528061251a600754614854565b61ffff16815260200161252e600754614854565b61ffff1681526000602090910152949350505050565b63ffffffff8216600d6125586001846159cc565b81548110612568576125686157d5565b600091825260209091206002909102015463ffffffff16116125f757600d6125916001836159cc565b815481106125a1576125a16157d5565b6000918252602091829020604080516060810182526002939093029091016001015461ffff8082168452620100008204169383019390935264010000000090920463ffffffff1691810191909152949350505050565b8163ffffffff16600d600081548110612612576126126157d5565b600091825260209091206002909102015463ffffffff16111561264557604051806060016040528061251a600754614854565b6000806126536001846159cc565b90505b81811115612745576000600261266c84846159cc565b6126769190615a0d565b61268090836159cc565b90506000600d8281548110612697576126976157d5565b60009182526020918290206040805180820182526002909302909101805463ffffffff9081168452825160608101845260019092015461ffff8082168452620100008204168387015264010000000090048116928201929092529282019290925280519092508782169116036127165760200151979650505050505050565b805163ffffffff808816911610156127305781935061273e565b61273b6001836159cc565b92505b5050612656565b600d8281548110612758576127586157d5565b6000918252602091829020604080516060810182526002939093029091016001015461ffff8082168452620100008204169383019390935264010000000090920463ffffffff16918101919091529695505050505050565b6000546001600160a01b031633146127f4576040517fc15c60b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006127ff436124b4565b90506117708261ffff16111561287d5760405162461bcd60e51b815260206004820152603d60248201527f4e6f756e7344414f3a3a5f7365744d617851756f72756d566f7465734250533a60448201527f20696e76616c6964206d61782071756f72756d20766f746573206270730000006064820152608401610de9565b805161ffff808416911611156129215760405162461bcd60e51b815260206004820152604660248201527f4e6f756e7344414f3a3a5f7365744d617851756f72756d566f7465734250533a60448201527f206d696e2071756f72756d20766f74657320627073206772656174657220746860648201527f616e206d61780000000000000000000000000000000000000000000000000000608482015260a401610de9565b60208101805161ffff8416909152612938826141db565b6040805161ffff8084168252851660208201527f4bfb1235074b38f02e5cf8ba90f535905417c196a12654f65ee0584512d706429101611878565b337fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda483836129a284838361442c565b6040805193845260ff90921660208401526bffffffffffffffffffffffff169082015260806060820181905260009082015260a00160405180910390a25050565b612a24848484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506147a592505050565b50505050565b6000546001600160a01b03163314612a6e576040517fc15c60b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612a79436124b4565b905060c88261ffff1610158015612a9657506107d08261ffff1611155b612b085760405162461bcd60e51b815260206004820152603d60248201527f4e6f756e7344414f3a3a5f7365744d696e51756f72756d566f7465734250533a60448201527f20696e76616c6964206d696e2071756f72756d20766f746573206270730000006064820152608401610de9565b806020015161ffff168261ffff161115612bb05760405162461bcd60e51b815260206004820152604660248201527f4e6f756e7344414f3a3a5f7365744d696e51756f72756d566f7465734250533a60448201527f206d696e2071756f72756d20766f74657320627073206772656174657220746860648201527f616e206d61780000000000000000000000000000000000000000000000000000608482015260a401610de9565b805161ffff83168252612bc2826141db565b6040805161ffff8084168252851660208201527ffaeebe30d875e399189096ea49fea81bd41fe6dfc86ad3550639063219e607789101611878565b337fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda48585612c2c84838361442c565b8686604051612c3f959493929190615a48565b60405180910390a250505050565b6000611f85612c5b436124b4565b6020015161ffff16600a60009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f5c573d6000803e3d6000fd5b60008083612cc686612710615a9d565b612cd09190615a0d565b90506000620f424082856040015163ffffffff16612cee9190615a9d565b612cf89190615a0d565b9050600081856000015161ffff16612d1091906159b9565b90506000612d26866020015161ffff1683614896565b9050612d32818861478c565b98975050505050505050565b600d8181548110612d4e57600080fd5b60009182526020918290206002919091020180546040805160608101825260019093015461ffff8082168552620100008204169484019490945263ffffffff64010000000090940484169083015291909116915082565b6000546001600160a01b03163314612e255760405162461bcd60e51b815260206004820152602660248201527f4e6f756e7344414f3a3a5f73657450656e64696e6741646d696e3a2061646d6960448201527f6e206f6e6c7900000000000000000000000000000000000000000000000000006064820152608401610de9565b600180546001600160a01b038381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527fca4f2f25d0898edd99413412fb94012f9e54ec8142f9b093e7720646a95b16a99101611315565b6003546001600160a01b03163314612f175760405162461bcd60e51b815260206004820152602560248201527f4e6f756e7344414f3a3a5f6275726e5665746f506f7765723a207665746f657260448201527f206f6e6c790000000000000000000000000000000000000000000000000000006064820152608401610de9565b600354604080516001600160a01b039092168252600060208301527fc5644f3588a066b15dcf6b636b74aadca57cfaccf608d9de7d8786364b7a8d02910160405180910390a1600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055600e54604080516001600160a01b039092168252600060208301527f7ad92e57a52c4e3e83ba624622b14e3a5efa0160dd6f9a7975c43ea66bad79ea910161197f565b6000805481906001600160a01b0316331461300f576040517fc15c60b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040514790600090339083908381818185875af1925050503d8060008114613053576040519150601f19603f3d011682016040523d82523d6000602084013e613058565b606091505b50506040805184815282151560208201529192507f2aeb20ed0ead73e7bc740154a0b979547bc9e00691d84a700e6454ada9fe4679910160405180910390a190939092509050565b6003546001600160a01b031633146130e4576040517f1387214700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e54604080516001600160a01b03928316815291831660208301527f7ad92e57a52c4e3e83ba624622b14e3a5efa0160dd6f9a7975c43ea66bad79ea910160405180910390a1600e80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60006131996040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b600a60009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061321091906159a0565b815260065460208201819052600a546001600160a01b031663782d6fe1336132396001436159cc565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa15801561329a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132be91906159df565b6bffffffffffffffffffffffff1610156133405760405162461bcd60e51b815260206004820152603a60248201527f4e6f756e7344414f3a3a70726f706f73653a2070726f706f73657220766f746560448201527f732062656c6f772070726f706f73616c207468726573686f6c640000000000006064820152608401610de9565b85518751148015613352575084518751145b801561335f575083518751145b6133d15760405162461bcd60e51b815260206004820152603f60248201527f4e6f756e7344414f3a3a70726f706f73653a2070726f706f73616c2066756e6360448201527f74696f6e20696e666f726d6174696f6e206172697479206d69736d61746368006064820152608401610de9565b86516000036134485760405162461bcd60e51b815260206004820152602760248201527f4e6f756e7344414f3a3a70726f706f73653a206d7573742070726f766964652060448201527f616374696f6e73000000000000000000000000000000000000000000000000006064820152608401610de9565b600a875111156134c05760405162461bcd60e51b815260206004820152602360248201527f4e6f756e7344414f3a3a70726f706f73653a20746f6f206d616e79206163746960448201527f6f6e7300000000000000000000000000000000000000000000000000000000006064820152608401610de9565b336000908152600c602052604090819020549082018190521561364a5760006134ec8260400151611f8a565b9050600181600881111561350257613502615142565b0361359b5760405162461bcd60e51b815260206004820152605360248201527f4e6f756e7344414f3a3a70726f706f73653a206f6e65206c6976652070726f7060448201527f6f73616c207065722070726f706f7365722c20666f756e6420616e20616c726560648201527f616479206163746976652070726f706f73616c00000000000000000000000000608482015260a401610de9565b60008160088111156135af576135af615142565b036136485760405162461bcd60e51b815260206004820152605460248201527f4e6f756e7344414f3a3a70726f706f73653a206f6e65206c6976652070726f7060448201527f6f73616c207065722070726f706f7365722c20666f756e6420616e20616c726560648201527f6164792070656e64696e672070726f706f73616c000000000000000000000000608482015260a401610de9565b505b60045461365790436159b9565b6060820181905260055461366a916159b9565b60808201526008805490600061367f83615968565b90915550506008546000818152600b6020908152604082209283556001830180547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055838101516002840155600483019190915588516136eb916005840191908b0190614b9a565b50865161370190600683019060208a0190614c13565b5085516137179060078301906020890190614c4e565b50845161372d9060088301906020880190614ca0565b506060820151600982019081556080830151600a83019081556000600b8401819055600c808501829055600d8501829055600e850180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000016905585516010860155436011860155845460018601546001600160a01b031683526020919091526040918290208190559254915490517f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e0936137f793909233928e928e928e928e9291908e90615ab4565b60405180910390a17f6af0134faa0f9290c1d686d55012aca80302d31d5c856e4bc7954f7613dc7f878160000154338a8a8a8a876009015488600a01548960020154613841611ef3565b8e6040516138599b9a99989796959493929190615b4a565b60405180910390a154979650505050505050565b600461387882611f8a565b600881111561388957613889615142565b146138fc5760405162461bcd60e51b815260206004820152603f60248201527f4e6f756e7344414f3a3a71756575653a2070726f706f73616c2063616e206f6e60448201527f6c792062652071756575656420696620697420697320737563636565646564006064820152608401610de9565b6000818152600b6020908152604080832060095482517f6a42b8f800000000000000000000000000000000000000000000000000000000815292519194936001600160a01b0390911692636a42b8f892600480830193928290030181865afa15801561396c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061399091906159a0565b61399a90426159b9565b905060005b6005830154811015613b6457613b528360050182815481106139c3576139c36157d5565b6000918252602090912001546006850180546001600160a01b0390921691849081106139f1576139f16157d5565b9060005260206000200154856007018481548110613a1157613a116157d5565b906000526020600020018054613a2690615804565b80601f0160208091040260200160405190810160405280929190818152602001828054613a5290615804565b8015613a9f5780601f10613a7457610100808354040283529160200191613a9f565b820191906000526020600020905b815481529060010190602001808311613a8257829003601f168201915b5050505050866008018581548110613ab957613ab96157d5565b906000526020600020018054613ace90615804565b80601f0160208091040260200160405190810160405280929190818152602001828054613afa90615804565b8015613b475780601f10613b1c57610100808354040283529160200191613b47565b820191906000526020600020905b815481529060010190602001808311613b2a57829003601f168201915b5050505050866148ac565b80613b5c81615968565b91505061399f565b506004820181905560408051848152602081018390527f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda28929101611878565b604080516060808201835260008083526020808401829052928401819052858152600b83528381206001600160a01b0386168252600f018352839020835191820184525460ff8082161515835261010082041692820192909252620100009091046bffffffffffffffffffffffff16918101919091525b92915050565b6001546001600160a01b031633148015613c3857503315155b613caa5760405162461bcd60e51b815260206004820152602a60248201527f4e6f756e7344414f3a3a5f61636365707441646d696e3a2070656e64696e672060448201527f61646d696e206f6e6c79000000000000000000000000000000000000000000006064820152608401610de9565b60008054600180546001600160a01b038082167fffffffffffffffffffffffff000000000000000000000000000000000000000080861682179096559490911690915560408051919092168082526020820184905292917ff9ffabca9c8276e99321725bcb43fb076a6c66a54b7f21c4e8146d8519b417dc910160405180910390a1600154604080516001600160a01b03808516825290921660208301527fca4f2f25d0898edd99413412fb94012f9e54ec8142f9b093e7720646a95b16a99101611315565b6000546001600160a01b03163314613db4576040517fc15c60b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c88361ffff161080613dcc57506107d08361ffff16115b15613e03576040517fdb8a74af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117708261ffff161115613e43576040517f50eafd0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8161ffff168361ffff161115613e85576040517fc58ac9aa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000613e90436124b4565b9050600060405180606001604052808661ffff1681526020018561ffff1681526020018463ffffffff168152509050613ec8816141db565b815181516040805161ffff93841681529290911660208301527ffaeebe30d875e399189096ea49fea81bd41fe6dfc86ad3550639063219e60778910160405180910390a17f4bfb1235074b38f02e5cf8ba90f535905417c196a12654f65ee0584512d7064282602001518260200151604051613f5592919061ffff92831681529116602082015260400190565b60405180910390a160408083015182820151825163ffffffff9283168152911660208201527f5e3adb1066359dafa23c629f245d93543856115700821dcb4debc416f393c469910160405180910390a15050505050565b6005613fb782611f8a565b6008811115613fc857613fc8615142565b1461403d576040805162461bcd60e51b81526020600482015260248101919091527f4e6f756e7344414f3a3a657865637574653a2070726f706f73616c2063616e2060448201527f6f6e6c79206265206578656375746564206966206974206973207175657565646064820152608401610de9565b6000818152600b60205260408120600e810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff1662010000179055905b60058201548110156141aa576009546005830180546001600160a01b0390921691630825f38f9190849081106140b4576140b46157d5565b6000918252602090912001546006850180546001600160a01b0390921691859081106140e2576140e26157d5565b9060005260206000200154856007018581548110614102576141026157d5565b90600052602060002001866008018681548110614121576141216157d5565b9060005260206000200187600401546040518663ffffffff1660e01b81526004016141509594939291906158ec565b6000604051808303816000875af115801561416f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526141979190810190615bf0565b50806141a281615968565b91505061407c565b506040518281527f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f90602001611315565b600061421c436040518060400160405280601c81526020017f626c6f636b206e756d6265722065786365656473203332206269747300000000815250614824565b600d549091508015801590614269575063ffffffff8216600d6142406001846159cc565b81548110614250576142506157d5565b600091825260209091206002909102015463ffffffff16145b156143285782600d61427c6001846159cc565b8154811061428c5761428c6157d5565b60009182526020918290208351600160029093029091019190910180549284015160409094015163ffffffff16640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff61ffff95861662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000090951695909316949094179290921716919091179055505050565b60408051808201825263ffffffff80851682526020808301878152600d8054600181018255600091909152935160029094027fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb5810180549585167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000968716179055905180517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb69092018054938201519190960151909316640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff61ffff948516620100000293909516939091169290921717919091161790555b505050565b6000600161443984611f8a565b600881111561444a5761444a615142565b146144bd5760405162461bcd60e51b815260206004820152602c60248201527f4e6f756e7344414f3a3a63617374566f7465496e7465726e616c3a20766f746960448201527f6e6720697320636c6f73656400000000000000000000000000000000000000006064820152608401610de9565b60028260ff1611156145375760405162461bcd60e51b815260206004820152602d60248201527f4e6f756e7344414f3a3a63617374566f7465496e7465726e616c3a20696e766160448201527f6c696420766f74652074797065000000000000000000000000000000000000006064820152608401610de9565b6000838152600b602090815260408083206001600160a01b0388168452600f8101909252909120805460ff16156145d65760405162461bcd60e51b815260206004820152602f60248201527f4e6f756e7344414f3a3a63617374566f7465496e7465726e616c3a20766f746560448201527f7220616c726561647920766f74656400000000000000000000000000000000006064820152608401610de9565b600a546000906001600160a01b031663782d6fe1886145f486614a84565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa158015614655573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061467991906159df565b90508460ff166000036146ae57806bffffffffffffffffffffffff1683600c01546146a491906159b9565b600c840155614710565b8460ff166001036146e157806bffffffffffffffffffffffff1683600b01546146d791906159b9565b600b840155614710565b8460ff1660020361471057806bffffffffffffffffffffffff1683600d015461470a91906159b9565b600d8401555b81546bffffffffffffffffffffffff821662010000027fffffffffffffffffffffffffffffffffffff000000000000000000000000ffff60ff8816610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009093169290921760011791909116179091559150509392505050565b600061271061479b8484615a9d565b61135e9190615a0d565b60005a905060006147b733868661442c565b9050336001600160a01b03167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda4868684876040516147f89493929190615c67565b60405180910390a26bffffffffffffffffffffffff81161561481d5761481d82614aac565b5050505050565b60008163ffffffff84111561484c5760405162461bcd60e51b8152600401610de99190614ead565b509192915050565b600061ffff821115614892576040517faab57e0200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5090565b60008183106148a5578161135e565b5090919050565b6009546040516001600160a01b039091169063f2b06537906148da9088908890889088908890602001615ca7565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b815260040161490e91815260200190565b602060405180830381865afa15801561492b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061494f9190615ce1565b156149e85760405162461bcd60e51b815260206004820152605060248201527f4e6f756e7344414f3a3a71756575654f72526576657274496e7465726e616c3a60448201527f206964656e746963616c2070726f706f73616c20616374696f6e20616c72656160648201527f6479207175657565642061742065746100000000000000000000000000000000608482015260a401610de9565b6009546040517f3a66f9010000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690633a66f90190614a399088908890889088908890600401615ca7565b6020604051808303816000875af1158015614a58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614a7c91906159a0565b505050505050565b60008160110154600003614aa4576004548260090154613c1991906159cc565b506011015490565b476000819003614aba575050565b6000614acb48642e90edd000614896565b90506000614adf3a63773594008401614896565b90506000614af6618ca05a87030162030d40614896565b90506000614b0682840286614896565b604051909150600090329083908381818185875af1925050503d8060008114614b4b576040519150601f19603f3d011682016040523d82523d6000602084013e614b50565b606091505b505060408051848152821515602082015291925032917ffabef36fd46c4c3a6ad676521be5367a4dfdbf3faa68d8e826003b1752d68f4f910160405180910390a250505050505050565b828054828255906000526020600020908101928215614c07579160200282015b82811115614c0757825182547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909116178255602090920191600190910190614bba565b50614892929150614cf2565b828054828255906000526020600020908101928215614c07579160200282015b82811115614c07578251825591602001919060010190614c33565b828054828255906000526020600020908101928215614c94579160200282015b82811115614c945782518290614c849082615d49565b5091602001919060010190614c6e565b50614892929150614d07565b828054828255906000526020600020908101928215614ce6579160200282015b82811115614ce65782518290614cd69082615d49565b5091602001919060010190614cc0565b50614892929150614d24565b5b808211156148925760008155600101614cf3565b80821115614892576000614d1b8282614d41565b50600101614d07565b80821115614892576000614d388282614d41565b50600101614d24565b508054614d4d90615804565b6000825580601f10614d5d575050565b601f016020900490600052602060002090810190614d7b9190614cf2565b50565b600060208284031215614d9057600080fd5b5035919050565b815181526020808301516101e0830191614dbb908401826001600160a01b03169052565b5060408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525061012080840151818401525061014080840151614e248285018215159052565b505061016083810151151590830152610180808401511515908301526101a080840151908301526101c092830151929091019190915290565b60005b83811015614e78578181015183820152602001614e60565b50506000910152565b60008151808452614e99816020860160208601614e5d565b601f01601f19169290920160200192915050565b60208152600061135e6020830184614e81565b80356001600160a01b0381168114614ed757600080fd5b919050565b6000806000806000806000878903610120811215614ef957600080fd5b614f0289614ec0565b9750614f1060208a01614ec0565b9650614f1e60408a01614ec0565b9550606089013594506080890135935060a0890135925060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4082011215614f6557600080fd5b5060c08801905092959891949750929550565b600060208284031215614f8a57600080fd5b61135e82614ec0565b803563ffffffff81168114614ed757600080fd5b600060208284031215614fb957600080fd5b61135e82614f93565b600081518084526020808501945080840160005b83811015614ffb5781516001600160a01b031687529582019590820190600101614fd6565b509495945050505050565b600081518084526020808501945080840160005b83811015614ffb5781518752958201959082019060010161501a565b600081518084526020808501808196508360051b8101915082860160005b8581101561507e57828403895261506c848351614e81565b98850198935090840190600101615054565b5091979650505050505050565b60808152600061509e6080830187614fc2565b82810360208401526150b08187615006565b905082810360408401526150c48186615036565b905082810360608401526150d88185615036565b979650505050505050565b803560ff81168114614ed757600080fd5b600080600080600060a0868803121561510c57600080fd5b8535945061511c602087016150e3565b935061512a604087016150e3565b94979396509394606081013594506080013592915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60208101600983106151ac577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b600080604083850312156151c557600080fd5b823591506151d5602084016150e3565b90509250929050565b815161ffff90811682526020808401519091169082015260408083015163ffffffff169082015260608101613c19565b803561ffff81168114614ed757600080fd5b60006020828403121561523257600080fd5b61135e8261520e565b6000806000806060858703121561525157600080fd5b84359350615261602086016150e3565b9250604085013567ffffffffffffffff8082111561527e57600080fd5b818701915087601f83011261529257600080fd5b8135818111156152a157600080fd5b8860208285010111156152b357600080fd5b95989497505060200194505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561531a5761531a6152c2565b604052919050565b600080600083850360a081121561533857600080fd5b843593506020850135925060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08201121561537357600080fd5b506040516060810181811067ffffffffffffffff82111715615397576153976152c2565b80604052506153a86040860161520e565b81526153b66060860161520e565b60208201526153c760808601614f93565b6040820152809150509250925092565b63ffffffff831681526080810161135e602083018461ffff8082511683528060208301511660208401525063ffffffff60408201511660408301525050565b600067ffffffffffffffff821115615430576154306152c2565b5060051b60200190565b600082601f83011261544b57600080fd5b8135602061546061545b83615416565b6152f1565b82815260059290921b8401810191818101908684111561547f57600080fd5b8286015b848110156154a15761549481614ec0565b8352918301918301615483565b509695505050505050565b600082601f8301126154bd57600080fd5b813560206154cd61545b83615416565b82815260059290921b840181019181810190868411156154ec57600080fd5b8286015b848110156154a157803583529183019183016154f0565b600067ffffffffffffffff821115615521576155216152c2565b50601f01601f191660200190565b600061553d61545b84615507565b905082815283838301111561555157600080fd5b828260208301376000602084830101529392505050565b600082601f83011261557957600080fd5b61135e8383356020850161552f565b600082601f83011261559957600080fd5b813560206155a961545b83615416565b82815260059290921b840181019181810190868411156155c857600080fd5b8286015b848110156154a157803567ffffffffffffffff8111156155ec5760008081fd5b6155fa8986838b0101615568565b8452509183019183016155cc565b600082601f83011261561957600080fd5b8135602061562961545b83615416565b82815260059290921b8401810191818101908684111561564857600080fd5b8286015b848110156154a157803567ffffffffffffffff81111561566c5760008081fd5b8701603f8101891361567e5760008081fd5b61568f89868301356040840161552f565b84525091830191830161564c565b600080600080600060a086880312156156b557600080fd5b853567ffffffffffffffff808211156156cd57600080fd5b6156d989838a0161543a565b965060208801359150808211156156ef57600080fd5b6156fb89838a016154ac565b9550604088013591508082111561571157600080fd5b61571d89838a01615588565b9450606088013591508082111561573357600080fd5b61573f89838a01615608565b9350608088013591508082111561575557600080fd5b5061576288828901615568565b9150509295509295909350565b6000806040838503121561578257600080fd5b823591506151d560208401614ec0565b6000806000606084860312156157a757600080fd5b6157b08461520e565b92506157be6020850161520e565b91506157cc60408501614f93565b90509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600181811c9082168061581857607f821691505b60208210810361216b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000815461585e81615804565b80855260206001838116801561587b57600181146158b3576158e1565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838901528284151560051b89010195506158e1565b866000528260002060005b858110156158d95781548a82018601529083019084016158be565b890184019650505b505050505092915050565b6001600160a01b038616815284602082015260a06040820152600061591460a0830186615851565b82810360608401526159268186615851565b9150508260808301529695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361599957615999615939565b5060010190565b6000602082840312156159b257600080fd5b5051919050565b80820180821115613c1957613c19615939565b81810381811115613c1957613c19615939565b6000602082840312156159f157600080fd5b81516bffffffffffffffffffffffff8116811461135e57600080fd5b600082615a43577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b85815260ff851660208201526bffffffffffffffffffffffff8416604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f909201601f19160101949350505050565b8082028115828204841417613c1957613c19615939565b60006101208b83526001600160a01b038b166020840152806040840152615add8184018b614fc2565b90508281036060840152615af1818a615006565b90508281036080840152615b058189615036565b905082810360a0840152615b198188615036565b90508560c08401528460e0840152828103610100840152615b3a8185614e81565b9c9b505050505050505050505050565b60006101608d83526001600160a01b038d166020840152806040840152615b738184018d614fc2565b90508281036060840152615b87818c615006565b90508281036080840152615b9b818b615036565b905082810360a0840152615baf818a615036565b90508760c08401528660e08401528561010084015284610120840152828103610140840152615bde8185614e81565b9e9d5050505050505050505050505050565b600060208284031215615c0257600080fd5b815167ffffffffffffffff811115615c1957600080fd5b8201601f81018413615c2a57600080fd5b8051615c3861545b82615507565b818152856020838501011115615c4d57600080fd5b615c5e826020830160208601614e5d565b95945050505050565b84815260ff841660208201526bffffffffffffffffffffffff83166040820152608060608201526000615c9d6080830184614e81565b9695505050505050565b6001600160a01b038616815284602082015260a060408201526000615ccf60a0830186614e81565b82810360608401526159268186614e81565b600060208284031215615cf357600080fd5b8151801515811461135e57600080fd5b601f82111561442757600081815260208120601f850160051c81016020861015615d2a5750805b601f850160051c820191505b81811015614a7c57828155600101615d36565b815167ffffffffffffffff811115615d6357615d636152c2565b615d7781615d718454615804565b84615d03565b602080601f831160018114615dca5760008415615d945750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555614a7c565b600085815260208120601f198616915b82811015615df957888601518255948401946001909101908401615dda565b5085821015615e3557878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b0190555056fe4e6f756e7344414f3a3a67657444796e616d696351756f72756d506172616d7341743a20626c6f636b206e756d62657220657863656564732033322062697473a26469706673582212202d7ea3750c7b556e266200fadd252d6a37cd2d1c2cb4b9348728ec0e077f41e064736f6c63430008110033
Deployed Bytecode
0x6080604052600436106103e25760003560e01c8063791f5d231161020d578063c10eb14d11610128578063deaaa7cc116100bb578063e9c714f21161008a578063f851a4401161006f578063f851a44014610baf578063fbfee87614610bcf578063fe0d94c114610be757600080fd5b8063e9c714f214610b7a578063ec91deda14610b8f57600080fd5b8063deaaa7cc14610af1578063e23a9a5214610b25578063e48083fe14610852578063e7951bb9146109b857600080fd5b8063d8bff440116100f7578063d8bff44014610a7b578063da35c66414610a9b578063da95691a14610ab1578063ddf0b00914610ad157600080fd5b8063c10eb14d146109fc578063ccfa51c914610a26578063d33219b414610a3b578063d3f662e114610a5b57600080fd5b8063a67d0635116101a0578063b71d1a0c1161016f578063b71d1a0c14610998578063bb677582146109b8578063bc4cd084146109ce578063bf7a2963146109e757600080fd5b8063a67d06351461091e578063abb308b21461093e578063b11262631461096c578063b58131b01461098257600080fd5b80637fa230bd116101dc5780637fa230bd146108bc57806383cce0e1146108d15780639a0dfb53146108e7578063a64e024a1461090757600080fd5b8063791f5d23146108525780637a3da691146108675780637b3c71d3146108875780637bdbe4d0146108a757600080fd5b80632b5ca189116102fd5780633e4f49e61161029057806350196db31161025f57806350196db3146107d257806356781388146107f25780635c60da1b1461081257806364c059951461083257600080fd5b80633e4f49e61461073857806340e58ee51461076557806344fac8f61461078557806347f4a077146107a557600080fd5b80633932abb1116102cc5780633932abb1146106d75780633bccf4fd146106ed5780633be8ef3f1461070d5780633e2733341461072357600080fd5b80632b5ca189146106525780632cfc81c6146106725780632de45f1814610687578063328dd982146106a757600080fd5b806317ba1b8b11610375578063215809ca11610344578063215809ca146105d857806325fd935a146105ee578063267822471461060457806326e6dcb01461063c57600080fd5b806317ba1b8b146105445780631d28dec7146105645780631dfb1b5a1461058457806320606b70146105a457600080fd5b80630d183f66116103b15780630d183f66146104b55780630ea2d98c146104d75780630f7b1f08146104f757806317977c611461051757600080fd5b8063013cf08b146103ee57806302a251a314610424578063042bc3de1461044857806306fdde031461045f57600080fd5b366103e957005b600080fd5b3480156103fa57600080fd5b5061040e610409366004614d7e565b610c07565b60405161041b9190614d97565b60405180910390f35b34801561043057600080fd5b5061043a60055481565b60405190815260200161041b565b34801561045457600080fd5b5061043a62030d4081565b34801561046b57600080fd5b506104a86040518060400160405280600981526020017f4e6f756e732044414f000000000000000000000000000000000000000000000081525081565b60405161041b9190614ead565b3480156104c157600080fd5b506104d56104d0366004614edc565b610d6e565b005b3480156104e357600080fd5b506104d56104f2366004614d7e565b611210565b34801561050357600080fd5b5061043a610512366004614d7e565b611321565b34801561052357600080fd5b5061043a610532366004614f78565b600c6020526000908152604090205481565b34801561055057600080fd5b506104d561055f366004614d7e565b611365565b34801561057057600080fd5b506104d561057f366004614d7e565b61146c565b34801561059057600080fd5b506104d561059f366004614d7e565b6116cd565b3480156105b057600080fd5b5061043a7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b3480156105e457600080fd5b5061043a61168081565b3480156105fa57600080fd5b5061043a6103e881565b34801561061057600080fd5b50600154610624906001600160a01b031681565b6040516001600160a01b03909116815260200161041b565b34801561064857600080fd5b5061043a61177081565b34801561065e57600080fd5b506104d561066d366004614fa7565b6117d4565b34801561067e57600080fd5b506104d5611885565b34801561069357600080fd5b50600a54610624906001600160a01b031681565b3480156106b357600080fd5b506106c76106c2366004614d7e565b6119b1565b60405161041b949392919061508b565b3480156106e357600080fd5b5061043a60045481565b3480156106f957600080fd5b506104d56107083660046150f4565b611c42565b34801561071957600080fd5b5061043a618ca081565b34801561072f57600080fd5b5061043a611ef3565b34801561074457600080fd5b50610758610753366004614d7e565b611f8a565b60405161041b9190615171565b34801561077157600080fd5b506104d5610780366004614d7e565b612171565b34801561079157600080fd5b506104d56107a03660046151b2565b612496565b3480156107b157600080fd5b506107c56107c0366004614d7e565b6124b4565b60405161041b91906151de565b3480156107de57600080fd5b506104d56107ed366004615220565b6127b0565b3480156107fe57600080fd5b506104d561080d3660046151b2565b612973565b34801561081e57600080fd5b50600254610624906001600160a01b031681565b34801561083e57600080fd5b506104d561084d36600461523b565b6129e3565b34801561085e57600080fd5b5061043a600181565b34801561087357600080fd5b506104d5610882366004615220565b612a2a565b34801561089357600080fd5b506104d56108a236600461523b565b612bfd565b3480156108b357600080fd5b5061043a600a81565b3480156108c857600080fd5b5061043a612c4d565b3480156108dd57600080fd5b5061043a60075481565b3480156108f357600080fd5b5061043a610902366004615322565b612cb6565b34801561091357600080fd5b5061043a62013b0081565b34801561092a57600080fd5b50600e54610624906001600160a01b031681565b34801561094a57600080fd5b5061095e610959366004614d7e565b612d3e565b60405161041b9291906153d7565b34801561097857600080fd5b5061043a619d8081565b34801561098e57600080fd5b5061043a60065481565b3480156109a457600080fd5b506104d56109b3366004614f78565b612da5565b3480156109c457600080fd5b5061043a6107d081565b3480156109da57600080fd5b5061043a642e90edd00081565b3480156109f357600080fd5b506104d5612e97565b348015610a0857600080fd5b50610a11612fc8565b6040805192835290151560208301520161041b565b348015610a3257600080fd5b5061043a60c881565b348015610a4757600080fd5b50600954610624906001600160a01b031681565b348015610a6757600080fd5b506104d5610a76366004614f78565b6130a0565b348015610a8757600080fd5b50600354610624906001600160a01b031681565b348015610aa757600080fd5b5061043a60085481565b348015610abd57600080fd5b5061043a610acc36600461569d565b613165565b348015610add57600080fd5b506104d5610aec366004614d7e565b61386d565b348015610afd57600080fd5b5061043a7f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b348015610b3157600080fd5b50610b45610b4036600461576f565b613ba2565b6040805182511515815260208084015160ff1690820152918101516bffffffffffffffffffffffff169082015260600161041b565b348015610b8657600080fd5b506104d5613c1f565b348015610b9b57600080fd5b506104d5610baa366004615792565b613d70565b348015610bbb57600080fd5b50600054610624906001600160a01b031681565b348015610bdb57600080fd5b5061043a637735940081565b348015610bf357600080fd5b506104d5610c02366004614d7e565b613fac565b610c8f604051806101e001604052806000815260200160006001600160a01b03168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160001515815260200160001515815260200160001515815260200160008152602001600081525090565b6000828152600b602090815260409182902082516101e081018452815480825260018301546001600160a01b03169382019390935260028201549381019390935291906060820190610ce090611321565b81526004830154602082015260098301546040820152600a8301546060820152600b8301546080820152600c83015460a0820152600d83015460c0820152600e83015460ff808216151560e084015261010080830482161515908401526201000090910416151561012082015260108301546101408201526011909201546101609092019190915292915050565b6009546001600160a01b031615610df25760405162461bcd60e51b815260206004820152602e60248201527f4e6f756e7344414f3a3a696e697469616c697a653a2063616e206f6e6c79206960448201527f6e697469616c697a65206f6e636500000000000000000000000000000000000060648201526084015b60405180910390fd5b6000546001600160a01b03163314610e36576040517fc15c60b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038716610eb25760405162461bcd60e51b815260206004820152602e60248201527f4e6f756e7344414f3a3a696e697469616c697a653a20696e76616c696420746960448201527f6d656c6f636b20616464726573730000000000000000000000000000000000006064820152608401610de9565b6001600160a01b038616610f2e5760405162461bcd60e51b815260206004820152602b60248201527f4e6f756e7344414f3a3a696e697469616c697a653a20696e76616c6964206e6f60448201527f756e7320616464726573730000000000000000000000000000000000000000006064820152608401610de9565b6116808410158015610f43575062013b008411155b610fb55760405162461bcd60e51b815260206004820152602b60248201527f4e6f756e7344414f3a3a696e697469616c697a653a20696e76616c696420766f60448201527f74696e6720706572696f640000000000000000000000000000000000000000006064820152608401610de9565b60018310158015610fc85750619d808311155b61103a5760405162461bcd60e51b815260206004820152602a60248201527f4e6f756e7344414f3a3a696e697469616c697a653a20696e76616c696420766f60448201527f74696e672064656c6179000000000000000000000000000000000000000000006064820152608401610de9565b6001821015801561104d57506103e88211155b6110bf5760405162461bcd60e51b815260206004820152603060248201527f4e6f756e7344414f3a3a696e697469616c697a653a20696e76616c696420707260448201527f6f706f73616c207468726573686f6c64000000000000000000000000000000006064820152608401610de9565b60055460408051918252602082018690527f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828910160405180910390a160045460408051918252602082018590527fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93910160405180910390a160065460408051918252602082018490527fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461910160405180910390a1600980546001600160a01b03808a167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255600a805489841690831617905560038054928816929091169190911790556005849055600483905560068290556112076111e76020830183615220565b6111f76040840160208501615220565b610baa6060850160408601614fa7565b50505050505050565b6000546001600160a01b03163314611254576040517fc15c60b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116808110158015611269575062013b008111155b6112db5760405162461bcd60e51b815260206004820152603160248201527f4e6f756e7344414f3a3a5f736574566f74696e67506572696f643a20696e766160448201527f6c696420766f74696e6720706572696f640000000000000000000000000000006064820152608401610de9565b600580549082905560408051828152602081018490527f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e882891015b60405180910390a15050565b6000818152600b6020526040812060108101548203611344576003015492915050565b61135e81600c0154826010015461090284601101546124b4565b9392505050565b6000546001600160a01b031633146113a9576040517fc15c60b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600181101580156113bc57506103e88111155b61142e5760405162461bcd60e51b815260206004820152603b60248201527f4e6f756e7344414f3a3a5f73657450726f706f73616c5468726573686f6c643a60448201527f20696e76616c69642070726f706f73616c207468726573686f6c6400000000006064820152608401610de9565b600680549082905560408051828152602081018490527fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc054619101611315565b6003546001600160a01b03166114ae576040517ff7e4046800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003546001600160a01b031633146114f2576040517f1387214700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60076114fd82611f8a565b600881111561150e5761150e615142565b03611545576040517f6c0a12d500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152600b60205260408120600e810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055905b600582015481101561169c576009546005830180546001600160a01b039092169163591fcdfe9190849081106115bb576115bb6157d5565b6000918252602090912001546006850180546001600160a01b0390921691859081106115e9576115e96157d5565b9060005260206000200154856007018581548110611609576116096157d5565b90600052602060002001866008018681548110611628576116286157d5565b9060005260206000200187600401546040518663ffffffff1660e01b81526004016116579594939291906158ec565b600060405180830381600087803b15801561167157600080fd5b505af1158015611685573d6000803e3d6000fd5b50505050808061169490615968565b915050611583565b506040518281527fde0cea2a3a0097cc3d981d40c375407760e85bc9c5e69aea449ac3885f8615c690602001611315565b6000546001600160a01b03163314611711576040517fc15c60b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600181101580156117245750619d808111155b6117965760405162461bcd60e51b815260206004820152602f60248201527f4e6f756e7344414f3a3a5f736574566f74696e6744656c61793a20696e76616c60448201527f696420766f74696e672064656c617900000000000000000000000000000000006064820152608401610de9565b600480549082905560408051828152602081018490527fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a939101611315565b6000546001600160a01b03163314611818576040517fc15c60b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611823436124b4565b60408101805163ffffffff851690915290915061183f826141db565b6040805163ffffffff8084168252851660208201527f5e3adb1066359dafa23c629f245d93543856115700821dcb4debc416f393c46991015b60405180910390a1505050565b600e546001600160a01b031633146118c9576040517fdecdd8d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600354600e54604080516001600160a01b0393841681529290911660208301527fc5644f3588a066b15dcf6b636b74aadca57cfaccf608d9de7d8786364b7a8d02910160405180910390a1600e54600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909216918217905560408051918252600060208301527f7ad92e57a52c4e3e83ba624622b14e3a5efa0160dd6f9a7975c43ea66bad79ea91015b60405180910390a1600e80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b6060806060806000600b600087815260200190815260200160002090508060050181600601826007018360080183805480602002602001604051908101604052809291908181526020018280548015611a3357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611a15575b5050505050935082805480602002602001604051908101604052809291908181526020018280548015611a8557602002820191906000526020600020905b815481526020019060010190808311611a71575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b82821015611b59578382906000526020600020018054611acc90615804565b80601f0160208091040260200160405190810160405280929190818152602001828054611af890615804565b8015611b455780601f10611b1a57610100808354040283529160200191611b45565b820191906000526020600020905b815481529060010190602001808311611b2857829003601f168201915b505050505081526020019060010190611aad565b50505050915080805480602002602001604051908101604052809291908181526020016000905b82821015611c2c578382906000526020600020018054611b9f90615804565b80601f0160208091040260200160405190810160405280929190818152602001828054611bcb90615804565b8015611c185780601f10611bed57610100808354040283529160200191611c18565b820191906000526020600020905b815481529060010190602001808311611bfb57829003601f168201915b505050505081526020019060010190611b80565b5050505090509450945094509450509193509193565b604080518082018252600981527f4e6f756e732044414f000000000000000000000000000000000000000000000060209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527fe1dd93b3612547b4bb7c3d429f3df8508d84f5a4f63b5e2e44340b94698e6b3b81840152466060820152306080808301919091528351808303909101815260a0820184528051908301207f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f60c083015260e0820189905260ff881661010080840191909152845180840390910181526101208301909452835193909201929092207f19010000000000000000000000000000000000000000000000000000000000006101408401526101428301829052610162830181905290916000906101820160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa158015611dea573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611e735760405162461bcd60e51b815260206004820152602a60248201527f4e6f756e7344414f3a3a63617374566f746542795369673a20696e76616c696460448201527f207369676e6174757265000000000000000000000000000000000000000000006064820152608401610de9565b806001600160a01b03167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda48a8a611eab858e8e61442c565b6040805193845260ff90921660208401526bffffffffffffffffffffffff169082015260806060820181905260009082015260a00160405180910390a2505050505050505050565b6000611f85611f01436124b4565b6000015161ffff16600a60009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8091906159a0565b61478c565b905090565b60008160085410156120035760405162461bcd60e51b8152602060048201526024808201527f4e6f756e7344414f3a3a73746174653a20696e76616c69642070726f706f736160448201527f6c206964000000000000000000000000000000000000000000000000000000006064820152608401610de9565b6000828152600b60205260409020600e810154610100900460ff161561202c5750600892915050565b600e81015460ff16156120425750600292915050565b806009015443116120565750600092915050565b80600a0154431161206a5750600192915050565b80600c015481600b015411158061208e5750805461208790611321565b81600b0154105b1561209c5750600392915050565b80600401546000036120b15750600492915050565b600e81015462010000900460ff16156120cd5750600792915050565b600960009054906101000a90046001600160a01b03166001600160a01b031663c1a287e26040518163ffffffff1660e01b8152600401602060405180830381865afa158015612120573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061214491906159a0565b816004015461215391906159b9565b42106121625750600692915050565b50600592915050565b50919050565b600761217c82611f8a565b600881111561218d5761218d615142565b036121c4576040517f0b586af500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152600b6020526040902060018101546001600160a01b03163314806122aa57506002810154600a546001808401546001600160a01b039283169263782d6fe19291169061221590436159cc565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa158015612276573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061229a91906159df565b6bffffffffffffffffffffffff16105b61231c5760405162461bcd60e51b815260206004820152602a60248201527f4e6f756e7344414f3a3a63616e63656c3a2070726f706f7365722061626f766560448201527f207468726573686f6c64000000000000000000000000000000000000000000006064820152608401610de9565b600e810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560005b6005820154811015612465576009546005830180546001600160a01b039092169163591fcdfe919084908110612384576123846157d5565b6000918252602090912001546006850180546001600160a01b0390921691859081106123b2576123b26157d5565b90600052602060002001548560070185815481106123d2576123d26157d5565b906000526020600020018660080186815481106123f1576123f16157d5565b9060005260206000200187600401546040518663ffffffff1660e01b81526004016124209594939291906158ec565b600060405180830381600087803b15801561243a57600080fd5b505af115801561244e573d6000803e3d6000fd5b50505050808061245d90615968565b91505061234c565b506040518281527f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c90602001611315565b6124b08282604051806020016040528060008152506147a5565b5050565b604080516060810182526000808252602082018190529181019190915260006124f583604051806060016040528060408152602001615e4660409139614824565b600d54909150600081900361254457604051806060016040528061251a600754614854565b61ffff16815260200161252e600754614854565b61ffff1681526000602090910152949350505050565b63ffffffff8216600d6125586001846159cc565b81548110612568576125686157d5565b600091825260209091206002909102015463ffffffff16116125f757600d6125916001836159cc565b815481106125a1576125a16157d5565b6000918252602091829020604080516060810182526002939093029091016001015461ffff8082168452620100008204169383019390935264010000000090920463ffffffff1691810191909152949350505050565b8163ffffffff16600d600081548110612612576126126157d5565b600091825260209091206002909102015463ffffffff16111561264557604051806060016040528061251a600754614854565b6000806126536001846159cc565b90505b81811115612745576000600261266c84846159cc565b6126769190615a0d565b61268090836159cc565b90506000600d8281548110612697576126976157d5565b60009182526020918290206040805180820182526002909302909101805463ffffffff9081168452825160608101845260019092015461ffff8082168452620100008204168387015264010000000090048116928201929092529282019290925280519092508782169116036127165760200151979650505050505050565b805163ffffffff808816911610156127305781935061273e565b61273b6001836159cc565b92505b5050612656565b600d8281548110612758576127586157d5565b6000918252602091829020604080516060810182526002939093029091016001015461ffff8082168452620100008204169383019390935264010000000090920463ffffffff16918101919091529695505050505050565b6000546001600160a01b031633146127f4576040517fc15c60b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006127ff436124b4565b90506117708261ffff16111561287d5760405162461bcd60e51b815260206004820152603d60248201527f4e6f756e7344414f3a3a5f7365744d617851756f72756d566f7465734250533a60448201527f20696e76616c6964206d61782071756f72756d20766f746573206270730000006064820152608401610de9565b805161ffff808416911611156129215760405162461bcd60e51b815260206004820152604660248201527f4e6f756e7344414f3a3a5f7365744d617851756f72756d566f7465734250533a60448201527f206d696e2071756f72756d20766f74657320627073206772656174657220746860648201527f616e206d61780000000000000000000000000000000000000000000000000000608482015260a401610de9565b60208101805161ffff8416909152612938826141db565b6040805161ffff8084168252851660208201527f4bfb1235074b38f02e5cf8ba90f535905417c196a12654f65ee0584512d706429101611878565b337fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda483836129a284838361442c565b6040805193845260ff90921660208401526bffffffffffffffffffffffff169082015260806060820181905260009082015260a00160405180910390a25050565b612a24848484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506147a592505050565b50505050565b6000546001600160a01b03163314612a6e576040517fc15c60b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612a79436124b4565b905060c88261ffff1610158015612a9657506107d08261ffff1611155b612b085760405162461bcd60e51b815260206004820152603d60248201527f4e6f756e7344414f3a3a5f7365744d696e51756f72756d566f7465734250533a60448201527f20696e76616c6964206d696e2071756f72756d20766f746573206270730000006064820152608401610de9565b806020015161ffff168261ffff161115612bb05760405162461bcd60e51b815260206004820152604660248201527f4e6f756e7344414f3a3a5f7365744d696e51756f72756d566f7465734250533a60448201527f206d696e2071756f72756d20766f74657320627073206772656174657220746860648201527f616e206d61780000000000000000000000000000000000000000000000000000608482015260a401610de9565b805161ffff83168252612bc2826141db565b6040805161ffff8084168252851660208201527ffaeebe30d875e399189096ea49fea81bd41fe6dfc86ad3550639063219e607789101611878565b337fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda48585612c2c84838361442c565b8686604051612c3f959493929190615a48565b60405180910390a250505050565b6000611f85612c5b436124b4565b6020015161ffff16600a60009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f5c573d6000803e3d6000fd5b60008083612cc686612710615a9d565b612cd09190615a0d565b90506000620f424082856040015163ffffffff16612cee9190615a9d565b612cf89190615a0d565b9050600081856000015161ffff16612d1091906159b9565b90506000612d26866020015161ffff1683614896565b9050612d32818861478c565b98975050505050505050565b600d8181548110612d4e57600080fd5b60009182526020918290206002919091020180546040805160608101825260019093015461ffff8082168552620100008204169484019490945263ffffffff64010000000090940484169083015291909116915082565b6000546001600160a01b03163314612e255760405162461bcd60e51b815260206004820152602660248201527f4e6f756e7344414f3a3a5f73657450656e64696e6741646d696e3a2061646d6960448201527f6e206f6e6c7900000000000000000000000000000000000000000000000000006064820152608401610de9565b600180546001600160a01b038381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527fca4f2f25d0898edd99413412fb94012f9e54ec8142f9b093e7720646a95b16a99101611315565b6003546001600160a01b03163314612f175760405162461bcd60e51b815260206004820152602560248201527f4e6f756e7344414f3a3a5f6275726e5665746f506f7765723a207665746f657260448201527f206f6e6c790000000000000000000000000000000000000000000000000000006064820152608401610de9565b600354604080516001600160a01b039092168252600060208301527fc5644f3588a066b15dcf6b636b74aadca57cfaccf608d9de7d8786364b7a8d02910160405180910390a1600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055600e54604080516001600160a01b039092168252600060208301527f7ad92e57a52c4e3e83ba624622b14e3a5efa0160dd6f9a7975c43ea66bad79ea910161197f565b6000805481906001600160a01b0316331461300f576040517fc15c60b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040514790600090339083908381818185875af1925050503d8060008114613053576040519150601f19603f3d011682016040523d82523d6000602084013e613058565b606091505b50506040805184815282151560208201529192507f2aeb20ed0ead73e7bc740154a0b979547bc9e00691d84a700e6454ada9fe4679910160405180910390a190939092509050565b6003546001600160a01b031633146130e4576040517f1387214700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e54604080516001600160a01b03928316815291831660208301527f7ad92e57a52c4e3e83ba624622b14e3a5efa0160dd6f9a7975c43ea66bad79ea910160405180910390a1600e80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60006131996040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b600a60009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061321091906159a0565b815260065460208201819052600a546001600160a01b031663782d6fe1336132396001436159cc565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa15801561329a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132be91906159df565b6bffffffffffffffffffffffff1610156133405760405162461bcd60e51b815260206004820152603a60248201527f4e6f756e7344414f3a3a70726f706f73653a2070726f706f73657220766f746560448201527f732062656c6f772070726f706f73616c207468726573686f6c640000000000006064820152608401610de9565b85518751148015613352575084518751145b801561335f575083518751145b6133d15760405162461bcd60e51b815260206004820152603f60248201527f4e6f756e7344414f3a3a70726f706f73653a2070726f706f73616c2066756e6360448201527f74696f6e20696e666f726d6174696f6e206172697479206d69736d61746368006064820152608401610de9565b86516000036134485760405162461bcd60e51b815260206004820152602760248201527f4e6f756e7344414f3a3a70726f706f73653a206d7573742070726f766964652060448201527f616374696f6e73000000000000000000000000000000000000000000000000006064820152608401610de9565b600a875111156134c05760405162461bcd60e51b815260206004820152602360248201527f4e6f756e7344414f3a3a70726f706f73653a20746f6f206d616e79206163746960448201527f6f6e7300000000000000000000000000000000000000000000000000000000006064820152608401610de9565b336000908152600c602052604090819020549082018190521561364a5760006134ec8260400151611f8a565b9050600181600881111561350257613502615142565b0361359b5760405162461bcd60e51b815260206004820152605360248201527f4e6f756e7344414f3a3a70726f706f73653a206f6e65206c6976652070726f7060448201527f6f73616c207065722070726f706f7365722c20666f756e6420616e20616c726560648201527f616479206163746976652070726f706f73616c00000000000000000000000000608482015260a401610de9565b60008160088111156135af576135af615142565b036136485760405162461bcd60e51b815260206004820152605460248201527f4e6f756e7344414f3a3a70726f706f73653a206f6e65206c6976652070726f7060448201527f6f73616c207065722070726f706f7365722c20666f756e6420616e20616c726560648201527f6164792070656e64696e672070726f706f73616c000000000000000000000000608482015260a401610de9565b505b60045461365790436159b9565b6060820181905260055461366a916159b9565b60808201526008805490600061367f83615968565b90915550506008546000818152600b6020908152604082209283556001830180547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055838101516002840155600483019190915588516136eb916005840191908b0190614b9a565b50865161370190600683019060208a0190614c13565b5085516137179060078301906020890190614c4e565b50845161372d9060088301906020880190614ca0565b506060820151600982019081556080830151600a83019081556000600b8401819055600c808501829055600d8501829055600e850180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000016905585516010860155436011860155845460018601546001600160a01b031683526020919091526040918290208190559254915490517f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e0936137f793909233928e928e928e928e9291908e90615ab4565b60405180910390a17f6af0134faa0f9290c1d686d55012aca80302d31d5c856e4bc7954f7613dc7f878160000154338a8a8a8a876009015488600a01548960020154613841611ef3565b8e6040516138599b9a99989796959493929190615b4a565b60405180910390a154979650505050505050565b600461387882611f8a565b600881111561388957613889615142565b146138fc5760405162461bcd60e51b815260206004820152603f60248201527f4e6f756e7344414f3a3a71756575653a2070726f706f73616c2063616e206f6e60448201527f6c792062652071756575656420696620697420697320737563636565646564006064820152608401610de9565b6000818152600b6020908152604080832060095482517f6a42b8f800000000000000000000000000000000000000000000000000000000815292519194936001600160a01b0390911692636a42b8f892600480830193928290030181865afa15801561396c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061399091906159a0565b61399a90426159b9565b905060005b6005830154811015613b6457613b528360050182815481106139c3576139c36157d5565b6000918252602090912001546006850180546001600160a01b0390921691849081106139f1576139f16157d5565b9060005260206000200154856007018481548110613a1157613a116157d5565b906000526020600020018054613a2690615804565b80601f0160208091040260200160405190810160405280929190818152602001828054613a5290615804565b8015613a9f5780601f10613a7457610100808354040283529160200191613a9f565b820191906000526020600020905b815481529060010190602001808311613a8257829003601f168201915b5050505050866008018581548110613ab957613ab96157d5565b906000526020600020018054613ace90615804565b80601f0160208091040260200160405190810160405280929190818152602001828054613afa90615804565b8015613b475780601f10613b1c57610100808354040283529160200191613b47565b820191906000526020600020905b815481529060010190602001808311613b2a57829003601f168201915b5050505050866148ac565b80613b5c81615968565b91505061399f565b506004820181905560408051848152602081018390527f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda28929101611878565b604080516060808201835260008083526020808401829052928401819052858152600b83528381206001600160a01b0386168252600f018352839020835191820184525460ff8082161515835261010082041692820192909252620100009091046bffffffffffffffffffffffff16918101919091525b92915050565b6001546001600160a01b031633148015613c3857503315155b613caa5760405162461bcd60e51b815260206004820152602a60248201527f4e6f756e7344414f3a3a5f61636365707441646d696e3a2070656e64696e672060448201527f61646d696e206f6e6c79000000000000000000000000000000000000000000006064820152608401610de9565b60008054600180546001600160a01b038082167fffffffffffffffffffffffff000000000000000000000000000000000000000080861682179096559490911690915560408051919092168082526020820184905292917ff9ffabca9c8276e99321725bcb43fb076a6c66a54b7f21c4e8146d8519b417dc910160405180910390a1600154604080516001600160a01b03808516825290921660208301527fca4f2f25d0898edd99413412fb94012f9e54ec8142f9b093e7720646a95b16a99101611315565b6000546001600160a01b03163314613db4576040517fc15c60b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c88361ffff161080613dcc57506107d08361ffff16115b15613e03576040517fdb8a74af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117708261ffff161115613e43576040517f50eafd0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8161ffff168361ffff161115613e85576040517fc58ac9aa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000613e90436124b4565b9050600060405180606001604052808661ffff1681526020018561ffff1681526020018463ffffffff168152509050613ec8816141db565b815181516040805161ffff93841681529290911660208301527ffaeebe30d875e399189096ea49fea81bd41fe6dfc86ad3550639063219e60778910160405180910390a17f4bfb1235074b38f02e5cf8ba90f535905417c196a12654f65ee0584512d7064282602001518260200151604051613f5592919061ffff92831681529116602082015260400190565b60405180910390a160408083015182820151825163ffffffff9283168152911660208201527f5e3adb1066359dafa23c629f245d93543856115700821dcb4debc416f393c469910160405180910390a15050505050565b6005613fb782611f8a565b6008811115613fc857613fc8615142565b1461403d576040805162461bcd60e51b81526020600482015260248101919091527f4e6f756e7344414f3a3a657865637574653a2070726f706f73616c2063616e2060448201527f6f6e6c79206265206578656375746564206966206974206973207175657565646064820152608401610de9565b6000818152600b60205260408120600e810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff1662010000179055905b60058201548110156141aa576009546005830180546001600160a01b0390921691630825f38f9190849081106140b4576140b46157d5565b6000918252602090912001546006850180546001600160a01b0390921691859081106140e2576140e26157d5565b9060005260206000200154856007018581548110614102576141026157d5565b90600052602060002001866008018681548110614121576141216157d5565b9060005260206000200187600401546040518663ffffffff1660e01b81526004016141509594939291906158ec565b6000604051808303816000875af115801561416f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526141979190810190615bf0565b50806141a281615968565b91505061407c565b506040518281527f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f90602001611315565b600061421c436040518060400160405280601c81526020017f626c6f636b206e756d6265722065786365656473203332206269747300000000815250614824565b600d549091508015801590614269575063ffffffff8216600d6142406001846159cc565b81548110614250576142506157d5565b600091825260209091206002909102015463ffffffff16145b156143285782600d61427c6001846159cc565b8154811061428c5761428c6157d5565b60009182526020918290208351600160029093029091019190910180549284015160409094015163ffffffff16640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff61ffff95861662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000090951695909316949094179290921716919091179055505050565b60408051808201825263ffffffff80851682526020808301878152600d8054600181018255600091909152935160029094027fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb5810180549585167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000968716179055905180517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb69092018054938201519190960151909316640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff61ffff948516620100000293909516939091169290921717919091161790555b505050565b6000600161443984611f8a565b600881111561444a5761444a615142565b146144bd5760405162461bcd60e51b815260206004820152602c60248201527f4e6f756e7344414f3a3a63617374566f7465496e7465726e616c3a20766f746960448201527f6e6720697320636c6f73656400000000000000000000000000000000000000006064820152608401610de9565b60028260ff1611156145375760405162461bcd60e51b815260206004820152602d60248201527f4e6f756e7344414f3a3a63617374566f7465496e7465726e616c3a20696e766160448201527f6c696420766f74652074797065000000000000000000000000000000000000006064820152608401610de9565b6000838152600b602090815260408083206001600160a01b0388168452600f8101909252909120805460ff16156145d65760405162461bcd60e51b815260206004820152602f60248201527f4e6f756e7344414f3a3a63617374566f7465496e7465726e616c3a20766f746560448201527f7220616c726561647920766f74656400000000000000000000000000000000006064820152608401610de9565b600a546000906001600160a01b031663782d6fe1886145f486614a84565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa158015614655573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061467991906159df565b90508460ff166000036146ae57806bffffffffffffffffffffffff1683600c01546146a491906159b9565b600c840155614710565b8460ff166001036146e157806bffffffffffffffffffffffff1683600b01546146d791906159b9565b600b840155614710565b8460ff1660020361471057806bffffffffffffffffffffffff1683600d015461470a91906159b9565b600d8401555b81546bffffffffffffffffffffffff821662010000027fffffffffffffffffffffffffffffffffffff000000000000000000000000ffff60ff8816610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009093169290921760011791909116179091559150509392505050565b600061271061479b8484615a9d565b61135e9190615a0d565b60005a905060006147b733868661442c565b9050336001600160a01b03167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda4868684876040516147f89493929190615c67565b60405180910390a26bffffffffffffffffffffffff81161561481d5761481d82614aac565b5050505050565b60008163ffffffff84111561484c5760405162461bcd60e51b8152600401610de99190614ead565b509192915050565b600061ffff821115614892576040517faab57e0200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5090565b60008183106148a5578161135e565b5090919050565b6009546040516001600160a01b039091169063f2b06537906148da9088908890889088908890602001615ca7565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b815260040161490e91815260200190565b602060405180830381865afa15801561492b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061494f9190615ce1565b156149e85760405162461bcd60e51b815260206004820152605060248201527f4e6f756e7344414f3a3a71756575654f72526576657274496e7465726e616c3a60448201527f206964656e746963616c2070726f706f73616c20616374696f6e20616c72656160648201527f6479207175657565642061742065746100000000000000000000000000000000608482015260a401610de9565b6009546040517f3a66f9010000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690633a66f90190614a399088908890889088908890600401615ca7565b6020604051808303816000875af1158015614a58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614a7c91906159a0565b505050505050565b60008160110154600003614aa4576004548260090154613c1991906159cc565b506011015490565b476000819003614aba575050565b6000614acb48642e90edd000614896565b90506000614adf3a63773594008401614896565b90506000614af6618ca05a87030162030d40614896565b90506000614b0682840286614896565b604051909150600090329083908381818185875af1925050503d8060008114614b4b576040519150601f19603f3d011682016040523d82523d6000602084013e614b50565b606091505b505060408051848152821515602082015291925032917ffabef36fd46c4c3a6ad676521be5367a4dfdbf3faa68d8e826003b1752d68f4f910160405180910390a250505050505050565b828054828255906000526020600020908101928215614c07579160200282015b82811115614c0757825182547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909116178255602090920191600190910190614bba565b50614892929150614cf2565b828054828255906000526020600020908101928215614c07579160200282015b82811115614c07578251825591602001919060010190614c33565b828054828255906000526020600020908101928215614c94579160200282015b82811115614c945782518290614c849082615d49565b5091602001919060010190614c6e565b50614892929150614d07565b828054828255906000526020600020908101928215614ce6579160200282015b82811115614ce65782518290614cd69082615d49565b5091602001919060010190614cc0565b50614892929150614d24565b5b808211156148925760008155600101614cf3565b80821115614892576000614d1b8282614d41565b50600101614d07565b80821115614892576000614d388282614d41565b50600101614d24565b508054614d4d90615804565b6000825580601f10614d5d575050565b601f016020900490600052602060002090810190614d7b9190614cf2565b50565b600060208284031215614d9057600080fd5b5035919050565b815181526020808301516101e0830191614dbb908401826001600160a01b03169052565b5060408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525061012080840151818401525061014080840151614e248285018215159052565b505061016083810151151590830152610180808401511515908301526101a080840151908301526101c092830151929091019190915290565b60005b83811015614e78578181015183820152602001614e60565b50506000910152565b60008151808452614e99816020860160208601614e5d565b601f01601f19169290920160200192915050565b60208152600061135e6020830184614e81565b80356001600160a01b0381168114614ed757600080fd5b919050565b6000806000806000806000878903610120811215614ef957600080fd5b614f0289614ec0565b9750614f1060208a01614ec0565b9650614f1e60408a01614ec0565b9550606089013594506080890135935060a0890135925060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4082011215614f6557600080fd5b5060c08801905092959891949750929550565b600060208284031215614f8a57600080fd5b61135e82614ec0565b803563ffffffff81168114614ed757600080fd5b600060208284031215614fb957600080fd5b61135e82614f93565b600081518084526020808501945080840160005b83811015614ffb5781516001600160a01b031687529582019590820190600101614fd6565b509495945050505050565b600081518084526020808501945080840160005b83811015614ffb5781518752958201959082019060010161501a565b600081518084526020808501808196508360051b8101915082860160005b8581101561507e57828403895261506c848351614e81565b98850198935090840190600101615054565b5091979650505050505050565b60808152600061509e6080830187614fc2565b82810360208401526150b08187615006565b905082810360408401526150c48186615036565b905082810360608401526150d88185615036565b979650505050505050565b803560ff81168114614ed757600080fd5b600080600080600060a0868803121561510c57600080fd5b8535945061511c602087016150e3565b935061512a604087016150e3565b94979396509394606081013594506080013592915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60208101600983106151ac577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b600080604083850312156151c557600080fd5b823591506151d5602084016150e3565b90509250929050565b815161ffff90811682526020808401519091169082015260408083015163ffffffff169082015260608101613c19565b803561ffff81168114614ed757600080fd5b60006020828403121561523257600080fd5b61135e8261520e565b6000806000806060858703121561525157600080fd5b84359350615261602086016150e3565b9250604085013567ffffffffffffffff8082111561527e57600080fd5b818701915087601f83011261529257600080fd5b8135818111156152a157600080fd5b8860208285010111156152b357600080fd5b95989497505060200194505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561531a5761531a6152c2565b604052919050565b600080600083850360a081121561533857600080fd5b843593506020850135925060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08201121561537357600080fd5b506040516060810181811067ffffffffffffffff82111715615397576153976152c2565b80604052506153a86040860161520e565b81526153b66060860161520e565b60208201526153c760808601614f93565b6040820152809150509250925092565b63ffffffff831681526080810161135e602083018461ffff8082511683528060208301511660208401525063ffffffff60408201511660408301525050565b600067ffffffffffffffff821115615430576154306152c2565b5060051b60200190565b600082601f83011261544b57600080fd5b8135602061546061545b83615416565b6152f1565b82815260059290921b8401810191818101908684111561547f57600080fd5b8286015b848110156154a15761549481614ec0565b8352918301918301615483565b509695505050505050565b600082601f8301126154bd57600080fd5b813560206154cd61545b83615416565b82815260059290921b840181019181810190868411156154ec57600080fd5b8286015b848110156154a157803583529183019183016154f0565b600067ffffffffffffffff821115615521576155216152c2565b50601f01601f191660200190565b600061553d61545b84615507565b905082815283838301111561555157600080fd5b828260208301376000602084830101529392505050565b600082601f83011261557957600080fd5b61135e8383356020850161552f565b600082601f83011261559957600080fd5b813560206155a961545b83615416565b82815260059290921b840181019181810190868411156155c857600080fd5b8286015b848110156154a157803567ffffffffffffffff8111156155ec5760008081fd5b6155fa8986838b0101615568565b8452509183019183016155cc565b600082601f83011261561957600080fd5b8135602061562961545b83615416565b82815260059290921b8401810191818101908684111561564857600080fd5b8286015b848110156154a157803567ffffffffffffffff81111561566c5760008081fd5b8701603f8101891361567e5760008081fd5b61568f89868301356040840161552f565b84525091830191830161564c565b600080600080600060a086880312156156b557600080fd5b853567ffffffffffffffff808211156156cd57600080fd5b6156d989838a0161543a565b965060208801359150808211156156ef57600080fd5b6156fb89838a016154ac565b9550604088013591508082111561571157600080fd5b61571d89838a01615588565b9450606088013591508082111561573357600080fd5b61573f89838a01615608565b9350608088013591508082111561575557600080fd5b5061576288828901615568565b9150509295509295909350565b6000806040838503121561578257600080fd5b823591506151d560208401614ec0565b6000806000606084860312156157a757600080fd5b6157b08461520e565b92506157be6020850161520e565b91506157cc60408501614f93565b90509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600181811c9082168061581857607f821691505b60208210810361216b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000815461585e81615804565b80855260206001838116801561587b57600181146158b3576158e1565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838901528284151560051b89010195506158e1565b866000528260002060005b858110156158d95781548a82018601529083019084016158be565b890184019650505b505050505092915050565b6001600160a01b038616815284602082015260a06040820152600061591460a0830186615851565b82810360608401526159268186615851565b9150508260808301529695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361599957615999615939565b5060010190565b6000602082840312156159b257600080fd5b5051919050565b80820180821115613c1957613c19615939565b81810381811115613c1957613c19615939565b6000602082840312156159f157600080fd5b81516bffffffffffffffffffffffff8116811461135e57600080fd5b600082615a43577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b85815260ff851660208201526bffffffffffffffffffffffff8416604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f909201601f19160101949350505050565b8082028115828204841417613c1957613c19615939565b60006101208b83526001600160a01b038b166020840152806040840152615add8184018b614fc2565b90508281036060840152615af1818a615006565b90508281036080840152615b058189615036565b905082810360a0840152615b198188615036565b90508560c08401528460e0840152828103610100840152615b3a8185614e81565b9c9b505050505050505050505050565b60006101608d83526001600160a01b038d166020840152806040840152615b738184018d614fc2565b90508281036060840152615b87818c615006565b90508281036080840152615b9b818b615036565b905082810360a0840152615baf818a615036565b90508760c08401528660e08401528561010084015284610120840152828103610140840152615bde8185614e81565b9e9d5050505050505050505050505050565b600060208284031215615c0257600080fd5b815167ffffffffffffffff811115615c1957600080fd5b8201601f81018413615c2a57600080fd5b8051615c3861545b82615507565b818152856020838501011115615c4d57600080fd5b615c5e826020830160208601614e5d565b95945050505050565b84815260ff841660208201526bffffffffffffffffffffffff83166040820152608060608201526000615c9d6080830184614e81565b9695505050505050565b6001600160a01b038616815284602082015260a060408201526000615ccf60a0830186614e81565b82810360608401526159268186614e81565b600060208284031215615cf357600080fd5b8151801515811461135e57600080fd5b601f82111561442757600081815260208120601f850160051c81016020861015615d2a5750805b601f850160051c820191505b81811015614a7c57828155600101615d36565b815167ffffffffffffffff811115615d6357615d636152c2565b615d7781615d718454615804565b84615d03565b602080601f831160018114615dca5760008415615d945750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555614a7c565b600085815260208120601f198616915b82811015615df957888601518255948401946001909101908401615dda565b5085821015615e3557878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b0190555056fe4e6f756e7344414f3a3a67657444796e616d696351756f72756d506172616d7341743a20626c6f636b206e756d62657220657863656564732033322062697473a26469706673582212202d7ea3750c7b556e266200fadd252d6a37cd2d1c2cb4b9348728ec0e077f41e064736f6c63430008110033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.