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 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 Nouns 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. // // 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 // // 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_BPS = 1; // 1 basis point or 0.01% /// @notice The maximum setable proposal threshold uint256 public constant MAX_PROPOSAL_THRESHOLD_BPS = 1_000; // 1,000 basis points or 10% /// @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 proposalThresholdBPS_ The initial proposal threshold in basis points * @param dynamicQuorumParams_ The initial dynamic quorum parameters */ function initialize( address timelock_, address nouns_, address vetoer_, uint256 votingPeriod_, uint256 votingDelay_, uint256 proposalThresholdBPS_, 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( proposalThresholdBPS_ >= MIN_PROPOSAL_THRESHOLD_BPS && proposalThresholdBPS_ <= MAX_PROPOSAL_THRESHOLD_BPS, 'NounsDAO::initialize: invalid proposal threshold bps' ); emit VotingPeriodSet(votingPeriod, votingPeriod_); emit VotingDelaySet(votingDelay, votingDelay_); emit ProposalThresholdBPSSet(proposalThresholdBPS, proposalThresholdBPS_); timelock = INounsDAOExecutor(timelock_); nouns = NounsTokenLike(nouns_); vetoer = vetoer_; votingPeriod = votingPeriod_; votingDelay = votingDelay_; proposalThresholdBPS = proposalThresholdBPS_; _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 = bps2Uint(proposalThresholdBPS, temp.totalSupply); 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 basis points * @dev newProposalThresholdBPS must be greater than the hardcoded min * @param newProposalThresholdBPS new proposal threshold */ function _setProposalThresholdBPS(uint256 newProposalThresholdBPS) external { if (msg.sender != admin) { revert AdminOnly(); } require( newProposalThresholdBPS >= MIN_PROPOSAL_THRESHOLD_BPS && newProposalThresholdBPS <= MAX_PROPOSAL_THRESHOLD_BPS, 'NounsDAO::_setProposalThreshold: invalid proposal threshold bps' ); uint256 oldProposalThresholdBPS = proposalThresholdBPS; proposalThresholdBPS = newProposalThresholdBPS; emit ProposalThresholdBPSSet(oldProposalThresholdBPS, proposalThresholdBPS); } /** * @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); } /** * @notice Current proposal threshold using Noun Total Supply * Differs from `GovernerBravo` which uses fixed amount */ function proposalThreshold() public view returns (uint256) { return bps2Uint(proposalThresholdBPS, nouns.totalSupply()); } 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 Nouns DAO Logic interfaces and events /********************************* * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░█████████░░█████████░░░ * * ░░░░░░██░░░████░░██░░░████░░░ * * ░░██████░░░████████░░░████░░░ * * ░░██░░██░░░████░░██░░░████░░░ * * ░░██░░██░░░████░░██░░░████░░░ * * ░░░░░░█████████░░█████████░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * *********************************/ // LICENSE // NounsDAOInterfaces.sol is a modified version of Compound Lab's GovernorBravoInterfaces.sol: // https://github.com/compound-finance/compound-protocol/blob/b9b14038612d846b83f8a009a82c38974ff2dcfe/contracts/Governance/GovernorBravoInterfaces.sol // // GovernorBravoInterfaces.sol source code Copyright 2020 Compound Labs, Inc. licensed under the BSD-3-Clause license. // With modifications by Nounders DAO. // // Additional conditions of BSD-3-Clause can be found here: https://opensource.org/licenses/BSD-3-Clause // // MODIFICATIONS // NounsDAOEvents, NounsDAOProxyStorage, NounsDAOStorageV1 add support for changes made by Nouns DAO to GovernorBravo.sol // See NounsDAOLogicV1.sol for more details. // NounsDAOStorageV1Adjusted and NounsDAOStorageV2 add support for a dynamic vote quorum. // See NounsDAOLogicV2.sol for more details. pragma solidity ^0.8.6; contract NounsDAOEvents { /// @notice An event emitted when a new proposal is created event ProposalCreated( uint256 id, address proposer, address[] targets, uint256[] values, string[] signatures, bytes[] calldatas, uint256 startBlock, uint256 endBlock, string description ); /// @notice An event emitted when a new proposal is created, which includes additional information event ProposalCreatedWithRequirements( uint256 id, address proposer, address[] targets, uint256[] values, string[] signatures, bytes[] calldatas, uint256 startBlock, uint256 endBlock, uint256 proposalThreshold, uint256 quorumVotes, string description ); /// @notice An event emitted when a vote has been cast on a proposal /// @param voter The address which casted a vote /// @param proposalId The proposal id which was voted on /// @param support Support value for the vote. 0=against, 1=for, 2=abstain /// @param votes Number of votes which were cast by the voter /// @param reason The reason given for the vote by the voter event VoteCast(address indexed voter, uint256 proposalId, uint8 support, uint256 votes, string reason); /// @notice An event emitted when a proposal has been canceled event ProposalCanceled(uint256 id); /// @notice An event emitted when a proposal has been queued in the NounsDAOExecutor event ProposalQueued(uint256 id, uint256 eta); /// @notice An event emitted when a proposal has been executed in the NounsDAOExecutor event ProposalExecuted(uint256 id); /// @notice An event emitted when a proposal has been vetoed by vetoAddress event ProposalVetoed(uint256 id); /// @notice An event emitted when the voting delay is set event VotingDelaySet(uint256 oldVotingDelay, uint256 newVotingDelay); /// @notice An event emitted when the voting period is set event VotingPeriodSet(uint256 oldVotingPeriod, uint256 newVotingPeriod); /// @notice Emitted when implementation is changed event NewImplementation(address oldImplementation, address newImplementation); /// @notice Emitted when proposal threshold basis points is set event ProposalThresholdBPSSet(uint256 oldProposalThresholdBPS, uint256 newProposalThresholdBPS); /// @notice Emitted when quorum votes basis points is set event QuorumVotesBPSSet(uint256 oldQuorumVotesBPS, uint256 newQuorumVotesBPS); /// @notice Emitted when pendingAdmin is changed event NewPendingAdmin(address oldPendingAdmin, address newPendingAdmin); /// @notice Emitted when pendingAdmin is accepted, which means admin is updated event NewAdmin(address oldAdmin, address newAdmin); /// @notice Emitted when vetoer is changed event NewVetoer(address oldVetoer, address newVetoer); } contract NounsDAOEventsV2 is NounsDAOEvents { /// @notice Emitted when minQuorumVotesBPS is set event MinQuorumVotesBPSSet(uint16 oldMinQuorumVotesBPS, uint16 newMinQuorumVotesBPS); /// @notice Emitted when maxQuorumVotesBPS is set event MaxQuorumVotesBPSSet(uint16 oldMaxQuorumVotesBPS, uint16 newMaxQuorumVotesBPS); /// @notice Emitted when quorumCoefficient is set event QuorumCoefficientSet(uint32 oldQuorumCoefficient, uint32 newQuorumCoefficient); /// @notice Emitted when a voter cast a vote requesting a gas refund. event RefundableVote(address indexed voter, uint256 refundAmount, bool refundSent); /// @notice Emitted when admin withdraws the DAO's balance. event Withdraw(uint256 amount, bool sent); /// @notice Emitted when pendingVetoer is changed event NewPendingVetoer(address oldPendingVetoer, address newPendingVetoer); } contract NounsDAOProxyStorage { /// @notice Administrator for this contract address public admin; /// @notice Pending administrator for this contract address public pendingAdmin; /// @notice Active brains of Governor address public implementation; } /** * @title Storage for Governor Bravo Delegate * @notice For future upgrades, do not change NounsDAOStorageV1. Create a new * contract which implements NounsDAOStorageV1 and following the naming convention * NounsDAOStorageVX. */ contract NounsDAOStorageV1 is NounsDAOProxyStorage { /// @notice Vetoer who has the ability to veto any proposal address public vetoer; /// @notice The delay before voting on a proposal may take place, once proposed, in blocks uint256 public votingDelay; /// @notice The duration of voting on a proposal, in blocks uint256 public votingPeriod; /// @notice The basis point number of votes required in order for a voter to become a proposer. *DIFFERS from GovernerBravo uint256 public proposalThresholdBPS; /// @notice The basis point number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed. *DIFFERS from GovernerBravo uint256 public quorumVotesBPS; /// @notice The total number of proposals uint256 public proposalCount; /// @notice The address of the Nouns DAO Executor NounsDAOExecutor INounsDAOExecutor public timelock; /// @notice The address of the Nouns tokens NounsTokenLike public nouns; /// @notice The official record of all proposals ever proposed mapping(uint256 => Proposal) public proposals; /// @notice The latest proposal for each proposer mapping(address => uint256) public latestProposalIds; struct Proposal { /// @notice Unique id for looking up a proposal uint256 id; /// @notice Creator of the proposal address proposer; /// @notice The number of votes needed to create a proposal at the time of proposal creation. *DIFFERS from GovernerBravo uint256 proposalThreshold; /// @notice The number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed at the time of proposal creation. *DIFFERS from GovernerBravo uint256 quorumVotes; /// @notice The timestamp that the proposal will be available for execution, set once the vote succeeds uint256 eta; /// @notice the ordered list of target addresses for calls to be made address[] targets; /// @notice The ordered list of values (i.e. msg.value) to be passed to the calls to be made uint256[] values; /// @notice The ordered list of function signatures to be called string[] signatures; /// @notice The ordered list of calldata to be passed to each call bytes[] calldatas; /// @notice The block at which voting begins: holders must delegate their votes prior to this block uint256 startBlock; /// @notice The block at which voting ends: votes must be cast prior to this block uint256 endBlock; /// @notice Current number of votes in favor of this proposal uint256 forVotes; /// @notice Current number of votes in opposition to this proposal uint256 againstVotes; /// @notice Current number of votes for abstaining for this proposal uint256 abstainVotes; /// @notice Flag marking whether the proposal has been canceled bool canceled; /// @notice Flag marking whether the proposal has been vetoed bool vetoed; /// @notice Flag marking whether the proposal has been executed bool executed; /// @notice Receipts of ballots for the entire set of voters mapping(address => Receipt) receipts; } /// @notice Ballot receipt record for a voter struct Receipt { /// @notice Whether or not a vote has been cast bool hasVoted; /// @notice Whether or not the voter supports the proposal or abstains uint8 support; /// @notice The number of votes the voter had, which were cast uint96 votes; } /// @notice Possible states that a proposal may be in enum ProposalState { Pending, Active, Canceled, Defeated, Succeeded, Queued, Expired, Executed, Vetoed } } /** * @title Extra fields added to the `Proposal` struct from NounsDAOStorageV1 * @notice The following fields were added to the `Proposal` struct: * - `Proposal.totalSupply` * - `Proposal.creationBlock` */ contract NounsDAOStorageV1Adjusted is NounsDAOProxyStorage { /// @notice Vetoer who has the ability to veto any proposal address public vetoer; /// @notice The delay before voting on a proposal may take place, once proposed, in blocks uint256 public votingDelay; /// @notice The duration of voting on a proposal, in blocks uint256 public votingPeriod; /// @notice The basis point number of votes required in order for a voter to become a proposer. *DIFFERS from GovernerBravo uint256 public proposalThresholdBPS; /// @notice The basis point number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed. *DIFFERS from GovernerBravo uint256 public quorumVotesBPS; /// @notice The total number of proposals uint256 public proposalCount; /// @notice The address of the Nouns DAO Executor NounsDAOExecutor INounsDAOExecutor public timelock; /// @notice The address of the Nouns tokens NounsTokenLike public nouns; /// @notice The official record of all proposals ever proposed mapping(uint256 => Proposal) internal _proposals; /// @notice The latest proposal for each proposer mapping(address => uint256) public latestProposalIds; struct Proposal { /// @notice Unique id for looking up a proposal uint256 id; /// @notice Creator of the proposal address proposer; /// @notice The number of votes needed to create a proposal at the time of proposal creation. *DIFFERS from GovernerBravo uint256 proposalThreshold; /// @notice The number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed at the time of proposal creation. *DIFFERS from GovernerBravo uint256 quorumVotes; /// @notice The timestamp that the proposal will be available for execution, set once the vote succeeds uint256 eta; /// @notice the ordered list of target addresses for calls to be made address[] targets; /// @notice The ordered list of values (i.e. msg.value) to be passed to the calls to be made uint256[] values; /// @notice The ordered list of function signatures to be called string[] signatures; /// @notice The ordered list of calldata to be passed to each call bytes[] calldatas; /// @notice The block at which voting begins: holders must delegate their votes prior to this block uint256 startBlock; /// @notice The block at which voting ends: votes must be cast prior to this block uint256 endBlock; /// @notice Current number of votes in favor of this proposal uint256 forVotes; /// @notice Current number of votes in opposition to this proposal uint256 againstVotes; /// @notice Current number of votes for abstaining for this proposal uint256 abstainVotes; /// @notice Flag marking whether the proposal has been canceled bool canceled; /// @notice Flag marking whether the proposal has been vetoed bool vetoed; /// @notice Flag marking whether the proposal has been executed bool executed; /// @notice Receipts of ballots for the entire set of voters mapping(address => Receipt) receipts; /// @notice The total supply at the time of proposal creation uint256 totalSupply; /// @notice The block at which this proposal was created uint256 creationBlock; } /// @notice Ballot receipt record for a voter struct Receipt { /// @notice Whether or not a vote has been cast bool hasVoted; /// @notice Whether or not the voter supports the proposal or abstains uint8 support; /// @notice The number of votes the voter had, which were cast uint96 votes; } /// @notice Possible states that a proposal may be in enum ProposalState { Pending, Active, Canceled, Defeated, Succeeded, Queued, Expired, Executed, Vetoed } } /** * @title Storage for Governor Bravo Delegate * @notice For future upgrades, do not change NounsDAOStorageV2. Create a new * contract which implements NounsDAOStorageV2 and following the naming convention * NounsDAOStorageVX. */ contract NounsDAOStorageV2 is NounsDAOStorageV1Adjusted { DynamicQuorumParamsCheckpoint[] public quorumParamsCheckpoints; /// @notice Pending new vetoer address public pendingVetoer; struct DynamicQuorumParams { /// @notice The minimum basis point number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed. uint16 minQuorumVotesBPS; /// @notice The maximum basis point number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed. uint16 maxQuorumVotesBPS; /// @notice The dynamic quorum coefficient /// @dev Assumed to be fixed point integer with 6 decimals, i.e 0.2 is represented as 0.2 * 1e6 = 200000 uint32 quorumCoefficient; } /// @notice A checkpoint for storing dynamic quorum params from a given block struct DynamicQuorumParamsCheckpoint { /// @notice The block at which the new values were set uint32 fromBlock; /// @notice The parameter values of this checkpoint DynamicQuorumParams params; } struct ProposalCondensed { /// @notice Unique id for looking up a proposal uint256 id; /// @notice Creator of the proposal address proposer; /// @notice The number of votes needed to create a proposal at the time of proposal creation. *DIFFERS from GovernerBravo uint256 proposalThreshold; /// @notice The minimum number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed at the time of proposal creation. *DIFFERS from GovernerBravo uint256 quorumVotes; /// @notice The timestamp that the proposal will be available for execution, set once the vote succeeds uint256 eta; /// @notice The block at which voting begins: holders must delegate their votes prior to this block uint256 startBlock; /// @notice The block at which voting ends: votes must be cast prior to this block uint256 endBlock; /// @notice Current number of votes in favor of this proposal uint256 forVotes; /// @notice Current number of votes in opposition to this proposal uint256 againstVotes; /// @notice Current number of votes for abstaining for this proposal uint256 abstainVotes; /// @notice Flag marking whether the proposal has been canceled bool canceled; /// @notice Flag marking whether the proposal has been vetoed bool vetoed; /// @notice Flag marking whether the proposal has been executed bool executed; /// @notice The total supply at the time of proposal creation uint256 totalSupply; /// @notice The block at which this proposal was created uint256 creationBlock; } } interface INounsDAOExecutor { function delay() external view returns (uint256); function GRACE_PERIOD() external view returns (uint256); function acceptAdmin() external; function queuedTransactions(bytes32 hash) external view returns (bool); function queueTransaction( address target, uint256 value, string calldata signature, bytes calldata data, uint256 eta ) external returns (bytes32); function cancelTransaction( address target, uint256 value, string calldata signature, bytes calldata data, uint256 eta ) external; function executeTransaction( address target, uint256 value, string calldata signature, bytes calldata data, uint256 eta ) external payable returns (bytes memory); } interface NounsTokenLike { function getPriorVotes(address account, uint256 blockNumber) external view returns (uint96); function totalSupply() external view returns (uint256); }
{ "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":"oldProposalThresholdBPS","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newProposalThresholdBPS","type":"uint256"}],"name":"ProposalThresholdBPSSet","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_BPS","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_BPS","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":"newProposalThresholdBPS","type":"uint256"}],"name":"_setProposalThresholdBPS","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":"proposalThresholdBPS_","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":[],"name":"proposalThresholdBPS","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
608060405234801561001057600080fd5b50615f5080620000216000396000f3fe6080604052600436106103fd5760003560e01c80637b3c71d31161020d578063c82fbd0811610128578063deaaa7cc116100bb578063e9c714f21161008a578063f851a4401161006f578063f851a44014610bdf578063fbfee87614610bff578063fe0d94c114610c1757600080fd5b8063e9c714f214610baa578063ec91deda14610bbf57600080fd5b8063deaaa7cc14610b21578063e23a9a5214610b55578063e48083fe14610a41578063e7951bb9146109d357600080fd5b8063d8bff440116100f7578063d8bff44014610aab578063da35c66414610acb578063da95691a14610ae1578063ddf0b00914610b0157600080fd5b8063c82fbd0814610a41578063ccfa51c914610a56578063d33219b414610a6b578063d3f662e114610a8b57600080fd5b8063abb308b2116101a0578063bb6775821161016f578063bb677582146109d3578063bc4cd084146109e9578063bf7a296314610a02578063c10eb14d14610a1757600080fd5b8063abb308b21461095a578063b112626314610988578063b58131b01461099e578063b71d1a0c146109b357600080fd5b806397d048e5116101dc57806397d048e5146108e35780639a0dfb5314610903578063a64e024a14610923578063a67d06351461093a57600080fd5b80637b3c71d3146108835780637bdbe4d0146108a35780637fa230bd146108b857806383cce0e1146108cd57600080fd5b80632b5ca189116103185780633e4f49e6116102ab57806350196db31161027a5780635c60da1b1161025f5780635c60da1b1461082357806364c05995146108435780637a3da6911461086357600080fd5b806350196db3146107e3578063567813881461080357600080fd5b80633e4f49e61461074957806340e58ee51461077657806344fac8f61461079657806347f4a077146107b657600080fd5b80633932abb1116102e75780633932abb1146106e85780633bccf4fd146106fe5780633be8ef3f1461071e5780633e2733341461073457600080fd5b80632b5ca189146106635780632cfc81c6146106835780632de45f1814610698578063328dd982146106b857600080fd5b806317977c611161039057806320606b701161035f57806320606b70146105cb578063215809ca146105ff578063267822471461061557806326e6dcb01461064d57600080fd5b806317977c61146105485780631d28dec7146105755780631dfb1b5a146105955780631e7b5d3a146105b557600080fd5b80630d183f66116103cc5780630d183f66146104d05780630ea2d98c146104f25780630f7b1f081461051257806314a67ea41461053257600080fd5b8063013cf08b1461040957806302a251a31461043f578063042bc3de1461046357806306fdde031461047a57600080fd5b3661040457005b600080fd5b34801561041557600080fd5b50610429610424366004614e13565b610c37565b6040516104369190614e2c565b60405180910390f35b34801561044b57600080fd5b5061045560055481565b604051908152602001610436565b34801561046f57600080fd5b5061045562030d4081565b34801561048657600080fd5b506104c36040518060400160405280600981526020017f4e6f756e732044414f000000000000000000000000000000000000000000000081525081565b6040516104369190614f42565b3480156104dc57600080fd5b506104f06104eb366004614f71565b610d9e565b005b3480156104fe57600080fd5b506104f061050d366004614e13565b611240565b34801561051e57600080fd5b5061045561052d366004614e13565b611351565b34801561053e57600080fd5b5061045560065481565b34801561055457600080fd5b5061045561056336600461500d565b600c6020526000908152604090205481565b34801561058157600080fd5b506104f0610590366004614e13565b611395565b3480156105a157600080fd5b506104f06105b0366004614e13565b6115f6565b3480156105c157600080fd5b506104556103e881565b3480156105d757600080fd5b506104557f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b34801561060b57600080fd5b5061045561168081565b34801561062157600080fd5b50600154610635906001600160a01b031681565b6040516001600160a01b039091168152602001610436565b34801561065957600080fd5b5061045561177081565b34801561066f57600080fd5b506104f061067e36600461503c565b6116fd565b34801561068f57600080fd5b506104f06117ae565b3480156106a457600080fd5b50600a54610635906001600160a01b031681565b3480156106c457600080fd5b506106d86106d3366004614e13565b6118da565b6040516104369493929190615120565b3480156106f457600080fd5b5061045560045481565b34801561070a57600080fd5b506104f0610719366004615189565b611b6b565b34801561072a57600080fd5b50610455618ca081565b34801561074057600080fd5b50610455611e1c565b34801561075557600080fd5b50610769610764366004614e13565b611eb3565b6040516104369190615206565b34801561078257600080fd5b506104f0610791366004614e13565b61209a565b3480156107a257600080fd5b506104f06107b1366004615247565b6123c0565b3480156107c257600080fd5b506107d66107d1366004614e13565b6123de565b6040516104369190615273565b3480156107ef57600080fd5b506104f06107fe3660046152b5565b6126da565b34801561080f57600080fd5b506104f061081e366004615247565b61289d565b34801561082f57600080fd5b50600254610635906001600160a01b031681565b34801561084f57600080fd5b506104f061085e3660046152d0565b61290d565b34801561086f57600080fd5b506104f061087e3660046152b5565b612954565b34801561088f57600080fd5b506104f061089e3660046152d0565b612b27565b3480156108af57600080fd5b50610455600a81565b3480156108c457600080fd5b50610455612b77565b3480156108d957600080fd5b5061045560075481565b3480156108ef57600080fd5b506104f06108fe366004614e13565b612be0565b34801561090f57600080fd5b5061045561091e3660046153b7565b612ce7565b34801561092f57600080fd5b5061045562013b0081565b34801561094657600080fd5b50600e54610635906001600160a01b031681565b34801561096657600080fd5b5061097a610975366004614e13565b612d6f565b60405161043692919061546c565b34801561099457600080fd5b50610455619d8081565b3480156109aa57600080fd5b50610455612dd6565b3480156109bf57600080fd5b506104f06109ce36600461500d565b612e31565b3480156109df57600080fd5b506104556107d081565b3480156109f557600080fd5b50610455642e90edd00081565b348015610a0e57600080fd5b506104f0612f23565b348015610a2357600080fd5b50610a2c613054565b60408051928352901515602083015201610436565b348015610a4d57600080fd5b50610455600181565b348015610a6257600080fd5b5061045560c881565b348015610a7757600080fd5b50600954610635906001600160a01b031681565b348015610a9757600080fd5b506104f0610aa636600461500d565b61312c565b348015610ab757600080fd5b50600354610635906001600160a01b031681565b348015610ad757600080fd5b5061045560085481565b348015610aed57600080fd5b50610455610afc366004615732565b6131f1565b348015610b0d57600080fd5b506104f0610b1c366004614e13565b613902565b348015610b2d57600080fd5b506104557f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b348015610b6157600080fd5b50610b75610b70366004615804565b613c37565b6040805182511515815260208084015160ff1690820152918101516bffffffffffffffffffffffff1690820152606001610436565b348015610bb657600080fd5b506104f0613cb4565b348015610bcb57600080fd5b506104f0610bda366004615827565b613e05565b348015610beb57600080fd5b50600054610635906001600160a01b031681565b348015610c0b57600080fd5b50610455637735940081565b348015610c2357600080fd5b506104f0610c32366004614e13565b614041565b610cbf604051806101e001604052806000815260200160006001600160a01b03168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160001515815260200160001515815260200160001515815260200160008152602001600081525090565b6000828152600b602090815260409182902082516101e081018452815480825260018301546001600160a01b03169382019390935260028201549381019390935291906060820190610d1090611351565b81526004830154602082015260098301546040820152600a8301546060820152600b8301546080820152600c83015460a0820152600d83015460c0820152600e83015460ff808216151560e084015261010080830482161515908401526201000090910416151561012082015260108301546101408201526011909201546101609092019190915292915050565b6009546001600160a01b031615610e225760405162461bcd60e51b815260206004820152602e60248201527f4e6f756e7344414f3a3a696e697469616c697a653a2063616e206f6e6c79206960448201527f6e697469616c697a65206f6e636500000000000000000000000000000000000060648201526084015b60405180910390fd5b6000546001600160a01b03163314610e66576040517fc15c60b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038716610ee25760405162461bcd60e51b815260206004820152602e60248201527f4e6f756e7344414f3a3a696e697469616c697a653a20696e76616c696420746960448201527f6d656c6f636b20616464726573730000000000000000000000000000000000006064820152608401610e19565b6001600160a01b038616610f5e5760405162461bcd60e51b815260206004820152602b60248201527f4e6f756e7344414f3a3a696e697469616c697a653a20696e76616c6964206e6f60448201527f756e7320616464726573730000000000000000000000000000000000000000006064820152608401610e19565b6116808410158015610f73575062013b008411155b610fe55760405162461bcd60e51b815260206004820152602b60248201527f4e6f756e7344414f3a3a696e697469616c697a653a20696e76616c696420766f60448201527f74696e6720706572696f640000000000000000000000000000000000000000006064820152608401610e19565b60018310158015610ff85750619d808311155b61106a5760405162461bcd60e51b815260206004820152602a60248201527f4e6f756e7344414f3a3a696e697469616c697a653a20696e76616c696420766f60448201527f74696e672064656c6179000000000000000000000000000000000000000000006064820152608401610e19565b6001821015801561107d57506103e88211155b6110ef5760405162461bcd60e51b815260206004820152603460248201527f4e6f756e7344414f3a3a696e697469616c697a653a20696e76616c696420707260448201527f6f706f73616c207468726573686f6c64206270730000000000000000000000006064820152608401610e19565b60055460408051918252602082018690527f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828910160405180910390a160045460408051918252602082018590527fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93910160405180910390a160065460408051918252602082018490527ffc216faa269bf440fb06aa490693f409461bde9cdcb949c7b9f2cb79589e7a58910160405180910390a1600980546001600160a01b03808a167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255600a8054898416908316179055600380549288169290911691909117905560058490556004839055600682905561123761121760208301836152b5565b61122760408401602085016152b5565b610bda606085016040860161503c565b50505050505050565b6000546001600160a01b03163314611284576040517fc15c60b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116808110158015611299575062013b008111155b61130b5760405162461bcd60e51b815260206004820152603160248201527f4e6f756e7344414f3a3a5f736574566f74696e67506572696f643a20696e766160448201527f6c696420766f74696e6720706572696f640000000000000000000000000000006064820152608401610e19565b600580549082905560408051828152602081018490527f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e882891015b60405180910390a15050565b6000818152600b6020526040812060108101548203611374576003015492915050565b61138e81600c0154826010015461091e84601101546123de565b9392505050565b6003546001600160a01b03166113d7576040517ff7e4046800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003546001600160a01b0316331461141b576040517f1387214700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600761142682611eb3565b6008811115611437576114376151d7565b0361146e576040517f6c0a12d500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152600b60205260408120600e810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055905b60058201548110156115c5576009546005830180546001600160a01b039092169163591fcdfe9190849081106114e4576114e461586a565b6000918252602090912001546006850180546001600160a01b0390921691859081106115125761151261586a565b90600052602060002001548560070185815481106115325761153261586a565b906000526020600020018660080186815481106115515761155161586a565b9060005260206000200187600401546040518663ffffffff1660e01b8152600401611580959493929190615981565b600060405180830381600087803b15801561159a57600080fd5b505af11580156115ae573d6000803e3d6000fd5b5050505080806115bd906159fd565b9150506114ac565b506040518281527fde0cea2a3a0097cc3d981d40c375407760e85bc9c5e69aea449ac3885f8615c690602001611345565b6000546001600160a01b0316331461163a576040517fc15c60b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001811015801561164d5750619d808111155b6116bf5760405162461bcd60e51b815260206004820152602f60248201527f4e6f756e7344414f3a3a5f736574566f74696e6744656c61793a20696e76616c60448201527f696420766f74696e672064656c617900000000000000000000000000000000006064820152608401610e19565b600480549082905560408051828152602081018490527fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a939101611345565b6000546001600160a01b03163314611741576040517fc15c60b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061174c436123de565b60408101805163ffffffff851690915290915061176882614270565b6040805163ffffffff8084168252851660208201527f5e3adb1066359dafa23c629f245d93543856115700821dcb4debc416f393c46991015b60405180910390a1505050565b600e546001600160a01b031633146117f2576040517fdecdd8d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600354600e54604080516001600160a01b0393841681529290911660208301527fc5644f3588a066b15dcf6b636b74aadca57cfaccf608d9de7d8786364b7a8d02910160405180910390a1600e54600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909216918217905560408051918252600060208301527f7ad92e57a52c4e3e83ba624622b14e3a5efa0160dd6f9a7975c43ea66bad79ea91015b60405180910390a1600e80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b6060806060806000600b60008781526020019081526020016000209050806005018160060182600701836008018380548060200260200160405190810160405280929190818152602001828054801561195c57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161193e575b50505050509350828054806020026020016040519081016040528092919081815260200182805480156119ae57602002820191906000526020600020905b81548152602001906001019080831161199a575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b82821015611a825783829060005260206000200180546119f590615899565b80601f0160208091040260200160405190810160405280929190818152602001828054611a2190615899565b8015611a6e5780601f10611a4357610100808354040283529160200191611a6e565b820191906000526020600020905b815481529060010190602001808311611a5157829003601f168201915b5050505050815260200190600101906119d6565b50505050915080805480602002602001604051908101604052809291908181526020016000905b82821015611b55578382906000526020600020018054611ac890615899565b80601f0160208091040260200160405190810160405280929190818152602001828054611af490615899565b8015611b415780601f10611b1657610100808354040283529160200191611b41565b820191906000526020600020905b815481529060010190602001808311611b2457829003601f168201915b505050505081526020019060010190611aa9565b5050505090509450945094509450509193509193565b604080518082018252600981527f4e6f756e732044414f000000000000000000000000000000000000000000000060209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527fe1dd93b3612547b4bb7c3d429f3df8508d84f5a4f63b5e2e44340b94698e6b3b81840152466060820152306080808301919091528351808303909101815260a0820184528051908301207f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f60c083015260e0820189905260ff881661010080840191909152845180840390910181526101208301909452835193909201929092207f19010000000000000000000000000000000000000000000000000000000000006101408401526101428301829052610162830181905290916000906101820160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa158015611d13573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611d9c5760405162461bcd60e51b815260206004820152602a60248201527f4e6f756e7344414f3a3a63617374566f746542795369673a20696e76616c696460448201527f207369676e6174757265000000000000000000000000000000000000000000006064820152608401610e19565b806001600160a01b03167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda48a8a611dd4858e8e6144c1565b6040805193845260ff90921660208401526bffffffffffffffffffffffff169082015260806060820181905260009082015260a00160405180910390a2505050505050505050565b6000611eae611e2a436123de565b6000015161ffff16600a60009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea99190615a35565b614821565b905090565b6000816008541015611f2c5760405162461bcd60e51b8152602060048201526024808201527f4e6f756e7344414f3a3a73746174653a20696e76616c69642070726f706f736160448201527f6c206964000000000000000000000000000000000000000000000000000000006064820152608401610e19565b6000828152600b60205260409020600e810154610100900460ff1615611f555750600892915050565b600e81015460ff1615611f6b5750600292915050565b80600901544311611f7f5750600092915050565b80600a01544311611f935750600192915050565b80600c015481600b0154111580611fb757508054611fb090611351565b81600b0154105b15611fc55750600392915050565b8060040154600003611fda5750600492915050565b600e81015462010000900460ff1615611ff65750600792915050565b600960009054906101000a90046001600160a01b03166001600160a01b031663c1a287e26040518163ffffffff1660e01b8152600401602060405180830381865afa158015612049573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061206d9190615a35565b816004015461207c9190615a4e565b421061208b5750600692915050565b50600592915050565b50919050565b60076120a582611eb3565b60088111156120b6576120b66151d7565b036120ed576040517f0b586af500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152600b6020526040902060018101546001600160a01b03163314806121d457506002810154600a546001808401546001600160a01b039283169263782d6fe19291169061213e9043615a61565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa15801561219f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121c39190615a74565b6bffffffffffffffffffffffff1611155b6122465760405162461bcd60e51b815260206004820152602a60248201527f4e6f756e7344414f3a3a63616e63656c3a2070726f706f7365722061626f766560448201527f207468726573686f6c64000000000000000000000000000000000000000000006064820152608401610e19565b600e810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560005b600582015481101561238f576009546005830180546001600160a01b039092169163591fcdfe9190849081106122ae576122ae61586a565b6000918252602090912001546006850180546001600160a01b0390921691859081106122dc576122dc61586a565b90600052602060002001548560070185815481106122fc576122fc61586a565b9060005260206000200186600801868154811061231b5761231b61586a565b9060005260206000200187600401546040518663ffffffff1660e01b815260040161234a959493929190615981565b600060405180830381600087803b15801561236457600080fd5b505af1158015612378573d6000803e3d6000fd5b505050508080612387906159fd565b915050612276565b506040518281527f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c90602001611345565b6123da82826040518060200160405280600081525061483a565b5050565b6040805160608101825260008082526020820181905291810191909152600061241f83604051806060016040528060408152602001615edb604091396148b9565b600d54909150600081900361246e5760405180606001604052806124446007546148e9565b61ffff1681526020016124586007546148e9565b61ffff1681526000602090910152949350505050565b63ffffffff8216600d612482600184615a61565b815481106124925761249261586a565b600091825260209091206002909102015463ffffffff161161252157600d6124bb600183615a61565b815481106124cb576124cb61586a565b6000918252602091829020604080516060810182526002939093029091016001015461ffff8082168452620100008204169383019390935264010000000090920463ffffffff1691810191909152949350505050565b8163ffffffff16600d60008154811061253c5761253c61586a565b600091825260209091206002909102015463ffffffff16111561256f5760405180606001604052806124446007546148e9565b60008061257d600184615a61565b90505b8181111561266f57600060026125968484615a61565b6125a09190615aa2565b6125aa9083615a61565b90506000600d82815481106125c1576125c161586a565b60009182526020918290206040805180820182526002909302909101805463ffffffff9081168452825160608101845260019092015461ffff8082168452620100008204168387015264010000000090048116928201929092529282019290925280519092508782169116036126405760200151979650505050505050565b805163ffffffff8088169116101561265a57819350612668565b612665600183615a61565b92505b5050612580565b600d82815481106126825761268261586a565b6000918252602091829020604080516060810182526002939093029091016001015461ffff8082168452620100008204169383019390935264010000000090920463ffffffff16918101919091529695505050505050565b6000546001600160a01b0316331461271e576040517fc15c60b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612729436123de565b90506117708261ffff1611156127a75760405162461bcd60e51b815260206004820152603d60248201527f4e6f756e7344414f3a3a5f7365744d617851756f72756d566f7465734250533a60448201527f20696e76616c6964206d61782071756f72756d20766f746573206270730000006064820152608401610e19565b805161ffff8084169116111561284b5760405162461bcd60e51b815260206004820152604660248201527f4e6f756e7344414f3a3a5f7365744d617851756f72756d566f7465734250533a60448201527f206d696e2071756f72756d20766f74657320627073206772656174657220746860648201527f616e206d61780000000000000000000000000000000000000000000000000000608482015260a401610e19565b60208101805161ffff841690915261286282614270565b6040805161ffff8084168252851660208201527f4bfb1235074b38f02e5cf8ba90f535905417c196a12654f65ee0584512d7064291016117a1565b337fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda483836128cc8483836144c1565b6040805193845260ff90921660208401526bffffffffffffffffffffffff169082015260806060820181905260009082015260a00160405180910390a25050565b61294e848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061483a92505050565b50505050565b6000546001600160a01b03163314612998576040517fc15c60b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006129a3436123de565b905060c88261ffff16101580156129c057506107d08261ffff1611155b612a325760405162461bcd60e51b815260206004820152603d60248201527f4e6f756e7344414f3a3a5f7365744d696e51756f72756d566f7465734250533a60448201527f20696e76616c6964206d696e2071756f72756d20766f746573206270730000006064820152608401610e19565b806020015161ffff168261ffff161115612ada5760405162461bcd60e51b815260206004820152604660248201527f4e6f756e7344414f3a3a5f7365744d696e51756f72756d566f7465734250533a60448201527f206d696e2071756f72756d20766f74657320627073206772656174657220746860648201527f616e206d61780000000000000000000000000000000000000000000000000000608482015260a401610e19565b805161ffff83168252612aec82614270565b6040805161ffff8084168252851660208201527ffaeebe30d875e399189096ea49fea81bd41fe6dfc86ad3550639063219e6077891016117a1565b337fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda48585612b568483836144c1565b8686604051612b69959493929190615add565b60405180910390a250505050565b6000611eae612b85436123de565b6020015161ffff16600a60009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e85573d6000803e3d6000fd5b6000546001600160a01b03163314612c24576040517fc15c60b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018110158015612c3757506103e88111155b612ca95760405162461bcd60e51b815260206004820152603f60248201527f4e6f756e7344414f3a3a5f73657450726f706f73616c5468726573686f6c643a60448201527f20696e76616c69642070726f706f73616c207468726573686f6c6420627073006064820152608401610e19565b600680549082905560408051828152602081018490527ffc216faa269bf440fb06aa490693f409461bde9cdcb949c7b9f2cb79589e7a589101611345565b60008083612cf786612710615b32565b612d019190615aa2565b90506000620f424082856040015163ffffffff16612d1f9190615b32565b612d299190615aa2565b9050600081856000015161ffff16612d419190615a4e565b90506000612d57866020015161ffff168361492b565b9050612d638188614821565b98975050505050505050565b600d8181548110612d7f57600080fd5b60009182526020918290206002919091020180546040805160608101825260019093015461ffff8082168552620100008204169484019490945263ffffffff64010000000090940484169083015291909116915082565b6000611eae600654600a60009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e85573d6000803e3d6000fd5b6000546001600160a01b03163314612eb15760405162461bcd60e51b815260206004820152602660248201527f4e6f756e7344414f3a3a5f73657450656e64696e6741646d696e3a2061646d6960448201527f6e206f6e6c7900000000000000000000000000000000000000000000000000006064820152608401610e19565b600180546001600160a01b038381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527fca4f2f25d0898edd99413412fb94012f9e54ec8142f9b093e7720646a95b16a99101611345565b6003546001600160a01b03163314612fa35760405162461bcd60e51b815260206004820152602560248201527f4e6f756e7344414f3a3a5f6275726e5665746f506f7765723a207665746f657260448201527f206f6e6c790000000000000000000000000000000000000000000000000000006064820152608401610e19565b600354604080516001600160a01b039092168252600060208301527fc5644f3588a066b15dcf6b636b74aadca57cfaccf608d9de7d8786364b7a8d02910160405180910390a1600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055600e54604080516001600160a01b039092168252600060208301527f7ad92e57a52c4e3e83ba624622b14e3a5efa0160dd6f9a7975c43ea66bad79ea91016118a8565b6000805481906001600160a01b0316331461309b576040517fc15c60b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040514790600090339083908381818185875af1925050503d80600081146130df576040519150601f19603f3d011682016040523d82523d6000602084013e6130e4565b606091505b50506040805184815282151560208201529192507f2aeb20ed0ead73e7bc740154a0b979547bc9e00691d84a700e6454ada9fe4679910160405180910390a190939092509050565b6003546001600160a01b03163314613170576040517f1387214700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e54604080516001600160a01b03928316815291831660208301527f7ad92e57a52c4e3e83ba624622b14e3a5efa0160dd6f9a7975c43ea66bad79ea910160405180910390a1600e80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60006132256040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b600a60009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613278573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061329c9190615a35565b8082526006546132ab91614821565b60208201819052600a546001600160a01b031663782d6fe1336132cf600143615a61565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa158015613330573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133549190615a74565b6bffffffffffffffffffffffff16116133d55760405162461bcd60e51b815260206004820152603a60248201527f4e6f756e7344414f3a3a70726f706f73653a2070726f706f73657220766f746560448201527f732062656c6f772070726f706f73616c207468726573686f6c640000000000006064820152608401610e19565b855187511480156133e7575084518751145b80156133f4575083518751145b6134665760405162461bcd60e51b815260206004820152603f60248201527f4e6f756e7344414f3a3a70726f706f73653a2070726f706f73616c2066756e6360448201527f74696f6e20696e666f726d6174696f6e206172697479206d69736d61746368006064820152608401610e19565b86516000036134dd5760405162461bcd60e51b815260206004820152602760248201527f4e6f756e7344414f3a3a70726f706f73653a206d7573742070726f766964652060448201527f616374696f6e73000000000000000000000000000000000000000000000000006064820152608401610e19565b600a875111156135555760405162461bcd60e51b815260206004820152602360248201527f4e6f756e7344414f3a3a70726f706f73653a20746f6f206d616e79206163746960448201527f6f6e7300000000000000000000000000000000000000000000000000000000006064820152608401610e19565b336000908152600c60205260409081902054908201819052156136df5760006135818260400151611eb3565b90506001816008811115613597576135976151d7565b036136305760405162461bcd60e51b815260206004820152605360248201527f4e6f756e7344414f3a3a70726f706f73653a206f6e65206c6976652070726f7060448201527f6f73616c207065722070726f706f7365722c20666f756e6420616e20616c726560648201527f616479206163746976652070726f706f73616c00000000000000000000000000608482015260a401610e19565b6000816008811115613644576136446151d7565b036136dd5760405162461bcd60e51b815260206004820152605460248201527f4e6f756e7344414f3a3a70726f706f73653a206f6e65206c6976652070726f7060448201527f6f73616c207065722070726f706f7365722c20666f756e6420616e20616c726560648201527f6164792070656e64696e672070726f706f73616c000000000000000000000000608482015260a401610e19565b505b6004546136ec9043615a4e565b606082018190526005546136ff91615a4e565b608082015260088054906000613714836159fd565b90915550506008546000818152600b6020908152604082209283556001830180547fffffffffffffffffffffffff0000000000000000000000000000000000000000163317905583810151600284015560048301919091558851613780916005840191908b0190614c2f565b50865161379690600683019060208a0190614ca8565b5085516137ac9060078301906020890190614ce3565b5084516137c29060088301906020880190614d35565b506060820151600982019081556080830151600a83019081556000600b8401819055600c808501829055600d8501829055600e850180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000016905585516010860155436011860155845460018601546001600160a01b031683526020919091526040918290208190559254915490517f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e09361388c93909233928e928e928e928e9291908e90615b49565b60405180910390a17f6af0134faa0f9290c1d686d55012aca80302d31d5c856e4bc7954f7613dc7f878160000154338a8a8a8a876009015488600a015489600201546138d6611e1c565b8e6040516138ee9b9a99989796959493929190615bdf565b60405180910390a154979650505050505050565b600461390d82611eb3565b600881111561391e5761391e6151d7565b146139915760405162461bcd60e51b815260206004820152603f60248201527f4e6f756e7344414f3a3a71756575653a2070726f706f73616c2063616e206f6e60448201527f6c792062652071756575656420696620697420697320737563636565646564006064820152608401610e19565b6000818152600b6020908152604080832060095482517f6a42b8f800000000000000000000000000000000000000000000000000000000815292519194936001600160a01b0390911692636a42b8f892600480830193928290030181865afa158015613a01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a259190615a35565b613a2f9042615a4e565b905060005b6005830154811015613bf957613be7836005018281548110613a5857613a5861586a565b6000918252602090912001546006850180546001600160a01b039092169184908110613a8657613a8661586a565b9060005260206000200154856007018481548110613aa657613aa661586a565b906000526020600020018054613abb90615899565b80601f0160208091040260200160405190810160405280929190818152602001828054613ae790615899565b8015613b345780601f10613b0957610100808354040283529160200191613b34565b820191906000526020600020905b815481529060010190602001808311613b1757829003601f168201915b5050505050866008018581548110613b4e57613b4e61586a565b906000526020600020018054613b6390615899565b80601f0160208091040260200160405190810160405280929190818152602001828054613b8f90615899565b8015613bdc5780601f10613bb157610100808354040283529160200191613bdc565b820191906000526020600020905b815481529060010190602001808311613bbf57829003601f168201915b505050505086614941565b80613bf1816159fd565b915050613a34565b506004820181905560408051848152602081018390527f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda289291016117a1565b604080516060808201835260008083526020808401829052928401819052858152600b83528381206001600160a01b0386168252600f018352839020835191820184525460ff8082161515835261010082041692820192909252620100009091046bffffffffffffffffffffffff16918101919091525b92915050565b6001546001600160a01b031633148015613ccd57503315155b613d3f5760405162461bcd60e51b815260206004820152602a60248201527f4e6f756e7344414f3a3a5f61636365707441646d696e3a2070656e64696e672060448201527f61646d696e206f6e6c79000000000000000000000000000000000000000000006064820152608401610e19565b60008054600180546001600160a01b038082167fffffffffffffffffffffffff000000000000000000000000000000000000000080861682179096559490911690915560408051919092168082526020820184905292917ff9ffabca9c8276e99321725bcb43fb076a6c66a54b7f21c4e8146d8519b417dc910160405180910390a1600154604080516001600160a01b03808516825290921660208301527fca4f2f25d0898edd99413412fb94012f9e54ec8142f9b093e7720646a95b16a99101611345565b6000546001600160a01b03163314613e49576040517fc15c60b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c88361ffff161080613e6157506107d08361ffff16115b15613e98576040517fdb8a74af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117708261ffff161115613ed8576040517f50eafd0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8161ffff168361ffff161115613f1a576040517fc58ac9aa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000613f25436123de565b9050600060405180606001604052808661ffff1681526020018561ffff1681526020018463ffffffff168152509050613f5d81614270565b815181516040805161ffff93841681529290911660208301527ffaeebe30d875e399189096ea49fea81bd41fe6dfc86ad3550639063219e60778910160405180910390a17f4bfb1235074b38f02e5cf8ba90f535905417c196a12654f65ee0584512d7064282602001518260200151604051613fea92919061ffff92831681529116602082015260400190565b60405180910390a160408083015182820151825163ffffffff9283168152911660208201527f5e3adb1066359dafa23c629f245d93543856115700821dcb4debc416f393c469910160405180910390a15050505050565b600561404c82611eb3565b600881111561405d5761405d6151d7565b146140d2576040805162461bcd60e51b81526020600482015260248101919091527f4e6f756e7344414f3a3a657865637574653a2070726f706f73616c2063616e2060448201527f6f6e6c79206265206578656375746564206966206974206973207175657565646064820152608401610e19565b6000818152600b60205260408120600e810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff1662010000179055905b600582015481101561423f576009546005830180546001600160a01b0390921691630825f38f9190849081106141495761414961586a565b6000918252602090912001546006850180546001600160a01b0390921691859081106141775761417761586a565b90600052602060002001548560070185815481106141975761419761586a565b906000526020600020018660080186815481106141b6576141b661586a565b9060005260206000200187600401546040518663ffffffff1660e01b81526004016141e5959493929190615981565b6000604051808303816000875af1158015614204573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261422c9190810190615c85565b5080614237816159fd565b915050614111565b506040518281527f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f90602001611345565b60006142b1436040518060400160405280601c81526020017f626c6f636b206e756d62657220657863656564732033322062697473000000008152506148b9565b600d5490915080158015906142fe575063ffffffff8216600d6142d5600184615a61565b815481106142e5576142e561586a565b600091825260209091206002909102015463ffffffff16145b156143bd5782600d614311600184615a61565b815481106143215761432161586a565b60009182526020918290208351600160029093029091019190910180549284015160409094015163ffffffff16640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff61ffff95861662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000090951695909316949094179290921716919091179055505050565b60408051808201825263ffffffff80851682526020808301878152600d8054600181018255600091909152935160029094027fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb5810180549585167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000968716179055905180517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb69092018054938201519190960151909316640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff61ffff948516620100000293909516939091169290921717919091161790555b505050565b600060016144ce84611eb3565b60088111156144df576144df6151d7565b146145525760405162461bcd60e51b815260206004820152602c60248201527f4e6f756e7344414f3a3a63617374566f7465496e7465726e616c3a20766f746960448201527f6e6720697320636c6f73656400000000000000000000000000000000000000006064820152608401610e19565b60028260ff1611156145cc5760405162461bcd60e51b815260206004820152602d60248201527f4e6f756e7344414f3a3a63617374566f7465496e7465726e616c3a20696e766160448201527f6c696420766f74652074797065000000000000000000000000000000000000006064820152608401610e19565b6000838152600b602090815260408083206001600160a01b0388168452600f8101909252909120805460ff161561466b5760405162461bcd60e51b815260206004820152602f60248201527f4e6f756e7344414f3a3a63617374566f7465496e7465726e616c3a20766f746560448201527f7220616c726561647920766f74656400000000000000000000000000000000006064820152608401610e19565b600a546000906001600160a01b031663782d6fe18861468986614b19565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa1580156146ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061470e9190615a74565b90508460ff1660000361474357806bffffffffffffffffffffffff1683600c01546147399190615a4e565b600c8401556147a5565b8460ff1660010361477657806bffffffffffffffffffffffff1683600b015461476c9190615a4e565b600b8401556147a5565b8460ff166002036147a557806bffffffffffffffffffffffff1683600d015461479f9190615a4e565b600d8401555b81546bffffffffffffffffffffffff821662010000027fffffffffffffffffffffffffffffffffffff000000000000000000000000ffff60ff8816610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009093169290921760011791909116179091559150509392505050565b60006127106148308484615b32565b61138e9190615aa2565b60005a9050600061484c3386866144c1565b9050336001600160a01b03167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda48686848760405161488d9493929190615cfc565b60405180910390a26bffffffffffffffffffffffff8116156148b2576148b282614b41565b5050505050565b60008163ffffffff8411156148e15760405162461bcd60e51b8152600401610e199190614f42565b509192915050565b600061ffff821115614927576040517faab57e0200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5090565b600081831061493a578161138e565b5090919050565b6009546040516001600160a01b039091169063f2b065379061496f9088908890889088908890602001615d3c565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004016149a391815260200190565b602060405180830381865afa1580156149c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906149e49190615d76565b15614a7d5760405162461bcd60e51b815260206004820152605060248201527f4e6f756e7344414f3a3a71756575654f72526576657274496e7465726e616c3a60448201527f206964656e746963616c2070726f706f73616c20616374696f6e20616c72656160648201527f6479207175657565642061742065746100000000000000000000000000000000608482015260a401610e19565b6009546040517f3a66f9010000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690633a66f90190614ace9088908890889088908890600401615d3c565b6020604051808303816000875af1158015614aed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b119190615a35565b505050505050565b60008160110154600003614b39576004548260090154613cae9190615a61565b506011015490565b476000819003614b4f575050565b6000614b6048642e90edd00061492b565b90506000614b743a6377359400840161492b565b90506000614b8b618ca05a87030162030d4061492b565b90506000614b9b8284028661492b565b604051909150600090329083908381818185875af1925050503d8060008114614be0576040519150601f19603f3d011682016040523d82523d6000602084013e614be5565b606091505b505060408051848152821515602082015291925032917ffabef36fd46c4c3a6ad676521be5367a4dfdbf3faa68d8e826003b1752d68f4f910160405180910390a250505050505050565b828054828255906000526020600020908101928215614c9c579160200282015b82811115614c9c57825182547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909116178255602090920191600190910190614c4f565b50614927929150614d87565b828054828255906000526020600020908101928215614c9c579160200282015b82811115614c9c578251825591602001919060010190614cc8565b828054828255906000526020600020908101928215614d29579160200282015b82811115614d295782518290614d199082615dde565b5091602001919060010190614d03565b50614927929150614d9c565b828054828255906000526020600020908101928215614d7b579160200282015b82811115614d7b5782518290614d6b9082615dde565b5091602001919060010190614d55565b50614927929150614db9565b5b808211156149275760008155600101614d88565b80821115614927576000614db08282614dd6565b50600101614d9c565b80821115614927576000614dcd8282614dd6565b50600101614db9565b508054614de290615899565b6000825580601f10614df2575050565b601f016020900490600052602060002090810190614e109190614d87565b50565b600060208284031215614e2557600080fd5b5035919050565b815181526020808301516101e0830191614e50908401826001600160a01b03169052565b5060408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525061012080840151818401525061014080840151614eb98285018215159052565b505061016083810151151590830152610180808401511515908301526101a080840151908301526101c092830151929091019190915290565b60005b83811015614f0d578181015183820152602001614ef5565b50506000910152565b60008151808452614f2e816020860160208601614ef2565b601f01601f19169290920160200192915050565b60208152600061138e6020830184614f16565b80356001600160a01b0381168114614f6c57600080fd5b919050565b6000806000806000806000878903610120811215614f8e57600080fd5b614f9789614f55565b9750614fa560208a01614f55565b9650614fb360408a01614f55565b9550606089013594506080890135935060a0890135925060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4082011215614ffa57600080fd5b5060c08801905092959891949750929550565b60006020828403121561501f57600080fd5b61138e82614f55565b803563ffffffff81168114614f6c57600080fd5b60006020828403121561504e57600080fd5b61138e82615028565b600081518084526020808501945080840160005b838110156150905781516001600160a01b03168752958201959082019060010161506b565b509495945050505050565b600081518084526020808501945080840160005b83811015615090578151875295820195908201906001016150af565b600081518084526020808501808196508360051b8101915082860160005b85811015615113578284038952615101848351614f16565b988501989350908401906001016150e9565b5091979650505050505050565b6080815260006151336080830187615057565b8281036020840152615145818761509b565b9050828103604084015261515981866150cb565b9050828103606084015261516d81856150cb565b979650505050505050565b803560ff81168114614f6c57600080fd5b600080600080600060a086880312156151a157600080fd5b853594506151b160208701615178565b93506151bf60408701615178565b94979396509394606081013594506080013592915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160098310615241577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806040838503121561525a57600080fd5b8235915061526a60208401615178565b90509250929050565b815161ffff90811682526020808401519091169082015260408083015163ffffffff169082015260608101613cae565b803561ffff81168114614f6c57600080fd5b6000602082840312156152c757600080fd5b61138e826152a3565b600080600080606085870312156152e657600080fd5b843593506152f660208601615178565b9250604085013567ffffffffffffffff8082111561531357600080fd5b818701915087601f83011261532757600080fd5b81358181111561533657600080fd5b88602082850101111561534857600080fd5b95989497505060200194505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156153af576153af615357565b604052919050565b600080600083850360a08112156153cd57600080fd5b843593506020850135925060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08201121561540857600080fd5b506040516060810181811067ffffffffffffffff8211171561542c5761542c615357565b806040525061543d604086016152a3565b815261544b606086016152a3565b602082015261545c60808601615028565b6040820152809150509250925092565b63ffffffff831681526080810161138e602083018461ffff8082511683528060208301511660208401525063ffffffff60408201511660408301525050565b600067ffffffffffffffff8211156154c5576154c5615357565b5060051b60200190565b600082601f8301126154e057600080fd5b813560206154f56154f0836154ab565b615386565b82815260059290921b8401810191818101908684111561551457600080fd5b8286015b848110156155365761552981614f55565b8352918301918301615518565b509695505050505050565b600082601f83011261555257600080fd5b813560206155626154f0836154ab565b82815260059290921b8401810191818101908684111561558157600080fd5b8286015b848110156155365780358352918301918301615585565b600067ffffffffffffffff8211156155b6576155b6615357565b50601f01601f191660200190565b60006155d26154f08461559c565b90508281528383830111156155e657600080fd5b828260208301376000602084830101529392505050565b600082601f83011261560e57600080fd5b61138e838335602085016155c4565b600082601f83011261562e57600080fd5b8135602061563e6154f0836154ab565b82815260059290921b8401810191818101908684111561565d57600080fd5b8286015b8481101561553657803567ffffffffffffffff8111156156815760008081fd5b61568f8986838b01016155fd565b845250918301918301615661565b600082601f8301126156ae57600080fd5b813560206156be6154f0836154ab565b82815260059290921b840181019181810190868411156156dd57600080fd5b8286015b8481101561553657803567ffffffffffffffff8111156157015760008081fd5b8701603f810189136157135760008081fd5b6157248986830135604084016155c4565b8452509183019183016156e1565b600080600080600060a0868803121561574a57600080fd5b853567ffffffffffffffff8082111561576257600080fd5b61576e89838a016154cf565b9650602088013591508082111561578457600080fd5b61579089838a01615541565b955060408801359150808211156157a657600080fd5b6157b289838a0161561d565b945060608801359150808211156157c857600080fd5b6157d489838a0161569d565b935060808801359150808211156157ea57600080fd5b506157f7888289016155fd565b9150509295509295909350565b6000806040838503121561581757600080fd5b8235915061526a60208401614f55565b60008060006060848603121561583c57600080fd5b615845846152a3565b9250615853602085016152a3565b915061586160408501615028565b90509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600181811c908216806158ad57607f821691505b602082108103612094577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600081546158f381615899565b808552602060018381168015615910576001811461594857615976565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838901528284151560051b8901019550615976565b866000528260002060005b8581101561596e5781548a8201860152908301908401615953565b890184019650505b505050505092915050565b6001600160a01b038616815284602082015260a0604082015260006159a960a08301866158e6565b82810360608401526159bb81866158e6565b9150508260808301529695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615a2e57615a2e6159ce565b5060010190565b600060208284031215615a4757600080fd5b5051919050565b80820180821115613cae57613cae6159ce565b81810381811115613cae57613cae6159ce565b600060208284031215615a8657600080fd5b81516bffffffffffffffffffffffff8116811461138e57600080fd5b600082615ad8577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b85815260ff851660208201526bffffffffffffffffffffffff8416604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f909201601f19160101949350505050565b8082028115828204841417613cae57613cae6159ce565b60006101208b83526001600160a01b038b166020840152806040840152615b728184018b615057565b90508281036060840152615b86818a61509b565b90508281036080840152615b9a81896150cb565b905082810360a0840152615bae81886150cb565b90508560c08401528460e0840152828103610100840152615bcf8185614f16565b9c9b505050505050505050505050565b60006101608d83526001600160a01b038d166020840152806040840152615c088184018d615057565b90508281036060840152615c1c818c61509b565b90508281036080840152615c30818b6150cb565b905082810360a0840152615c44818a6150cb565b90508760c08401528660e08401528561010084015284610120840152828103610140840152615c738185614f16565b9e9d5050505050505050505050505050565b600060208284031215615c9757600080fd5b815167ffffffffffffffff811115615cae57600080fd5b8201601f81018413615cbf57600080fd5b8051615ccd6154f08261559c565b818152856020838501011115615ce257600080fd5b615cf3826020830160208601614ef2565b95945050505050565b84815260ff841660208201526bffffffffffffffffffffffff83166040820152608060608201526000615d326080830184614f16565b9695505050505050565b6001600160a01b038616815284602082015260a060408201526000615d6460a0830186614f16565b82810360608401526159bb8186614f16565b600060208284031215615d8857600080fd5b8151801515811461138e57600080fd5b601f8211156144bc57600081815260208120601f850160051c81016020861015615dbf5750805b601f850160051c820191505b81811015614b1157828155600101615dcb565b815167ffffffffffffffff811115615df857615df8615357565b615e0c81615e068454615899565b84615d98565b602080601f831160018114615e5f5760008415615e295750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555614b11565b600085815260208120601f198616915b82811015615e8e57888601518255948401946001909101908401615e6f565b5085821015615eca57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b0190555056fe4e6f756e7344414f3a3a67657444796e616d696351756f72756d506172616d7341743a20626c6f636b206e756d62657220657863656564732033322062697473a2646970667358221220cb7936417f576cc7a64ab8ecb65b2a02736396aa591a96ea623e92bd37a7673d64736f6c63430008110033
Deployed Bytecode
0x6080604052600436106103fd5760003560e01c80637b3c71d31161020d578063c82fbd0811610128578063deaaa7cc116100bb578063e9c714f21161008a578063f851a4401161006f578063f851a44014610bdf578063fbfee87614610bff578063fe0d94c114610c1757600080fd5b8063e9c714f214610baa578063ec91deda14610bbf57600080fd5b8063deaaa7cc14610b21578063e23a9a5214610b55578063e48083fe14610a41578063e7951bb9146109d357600080fd5b8063d8bff440116100f7578063d8bff44014610aab578063da35c66414610acb578063da95691a14610ae1578063ddf0b00914610b0157600080fd5b8063c82fbd0814610a41578063ccfa51c914610a56578063d33219b414610a6b578063d3f662e114610a8b57600080fd5b8063abb308b2116101a0578063bb6775821161016f578063bb677582146109d3578063bc4cd084146109e9578063bf7a296314610a02578063c10eb14d14610a1757600080fd5b8063abb308b21461095a578063b112626314610988578063b58131b01461099e578063b71d1a0c146109b357600080fd5b806397d048e5116101dc57806397d048e5146108e35780639a0dfb5314610903578063a64e024a14610923578063a67d06351461093a57600080fd5b80637b3c71d3146108835780637bdbe4d0146108a35780637fa230bd146108b857806383cce0e1146108cd57600080fd5b80632b5ca189116103185780633e4f49e6116102ab57806350196db31161027a5780635c60da1b1161025f5780635c60da1b1461082357806364c05995146108435780637a3da6911461086357600080fd5b806350196db3146107e3578063567813881461080357600080fd5b80633e4f49e61461074957806340e58ee51461077657806344fac8f61461079657806347f4a077146107b657600080fd5b80633932abb1116102e75780633932abb1146106e85780633bccf4fd146106fe5780633be8ef3f1461071e5780633e2733341461073457600080fd5b80632b5ca189146106635780632cfc81c6146106835780632de45f1814610698578063328dd982146106b857600080fd5b806317977c611161039057806320606b701161035f57806320606b70146105cb578063215809ca146105ff578063267822471461061557806326e6dcb01461064d57600080fd5b806317977c61146105485780631d28dec7146105755780631dfb1b5a146105955780631e7b5d3a146105b557600080fd5b80630d183f66116103cc5780630d183f66146104d05780630ea2d98c146104f25780630f7b1f081461051257806314a67ea41461053257600080fd5b8063013cf08b1461040957806302a251a31461043f578063042bc3de1461046357806306fdde031461047a57600080fd5b3661040457005b600080fd5b34801561041557600080fd5b50610429610424366004614e13565b610c37565b6040516104369190614e2c565b60405180910390f35b34801561044b57600080fd5b5061045560055481565b604051908152602001610436565b34801561046f57600080fd5b5061045562030d4081565b34801561048657600080fd5b506104c36040518060400160405280600981526020017f4e6f756e732044414f000000000000000000000000000000000000000000000081525081565b6040516104369190614f42565b3480156104dc57600080fd5b506104f06104eb366004614f71565b610d9e565b005b3480156104fe57600080fd5b506104f061050d366004614e13565b611240565b34801561051e57600080fd5b5061045561052d366004614e13565b611351565b34801561053e57600080fd5b5061045560065481565b34801561055457600080fd5b5061045561056336600461500d565b600c6020526000908152604090205481565b34801561058157600080fd5b506104f0610590366004614e13565b611395565b3480156105a157600080fd5b506104f06105b0366004614e13565b6115f6565b3480156105c157600080fd5b506104556103e881565b3480156105d757600080fd5b506104557f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b34801561060b57600080fd5b5061045561168081565b34801561062157600080fd5b50600154610635906001600160a01b031681565b6040516001600160a01b039091168152602001610436565b34801561065957600080fd5b5061045561177081565b34801561066f57600080fd5b506104f061067e36600461503c565b6116fd565b34801561068f57600080fd5b506104f06117ae565b3480156106a457600080fd5b50600a54610635906001600160a01b031681565b3480156106c457600080fd5b506106d86106d3366004614e13565b6118da565b6040516104369493929190615120565b3480156106f457600080fd5b5061045560045481565b34801561070a57600080fd5b506104f0610719366004615189565b611b6b565b34801561072a57600080fd5b50610455618ca081565b34801561074057600080fd5b50610455611e1c565b34801561075557600080fd5b50610769610764366004614e13565b611eb3565b6040516104369190615206565b34801561078257600080fd5b506104f0610791366004614e13565b61209a565b3480156107a257600080fd5b506104f06107b1366004615247565b6123c0565b3480156107c257600080fd5b506107d66107d1366004614e13565b6123de565b6040516104369190615273565b3480156107ef57600080fd5b506104f06107fe3660046152b5565b6126da565b34801561080f57600080fd5b506104f061081e366004615247565b61289d565b34801561082f57600080fd5b50600254610635906001600160a01b031681565b34801561084f57600080fd5b506104f061085e3660046152d0565b61290d565b34801561086f57600080fd5b506104f061087e3660046152b5565b612954565b34801561088f57600080fd5b506104f061089e3660046152d0565b612b27565b3480156108af57600080fd5b50610455600a81565b3480156108c457600080fd5b50610455612b77565b3480156108d957600080fd5b5061045560075481565b3480156108ef57600080fd5b506104f06108fe366004614e13565b612be0565b34801561090f57600080fd5b5061045561091e3660046153b7565b612ce7565b34801561092f57600080fd5b5061045562013b0081565b34801561094657600080fd5b50600e54610635906001600160a01b031681565b34801561096657600080fd5b5061097a610975366004614e13565b612d6f565b60405161043692919061546c565b34801561099457600080fd5b50610455619d8081565b3480156109aa57600080fd5b50610455612dd6565b3480156109bf57600080fd5b506104f06109ce36600461500d565b612e31565b3480156109df57600080fd5b506104556107d081565b3480156109f557600080fd5b50610455642e90edd00081565b348015610a0e57600080fd5b506104f0612f23565b348015610a2357600080fd5b50610a2c613054565b60408051928352901515602083015201610436565b348015610a4d57600080fd5b50610455600181565b348015610a6257600080fd5b5061045560c881565b348015610a7757600080fd5b50600954610635906001600160a01b031681565b348015610a9757600080fd5b506104f0610aa636600461500d565b61312c565b348015610ab757600080fd5b50600354610635906001600160a01b031681565b348015610ad757600080fd5b5061045560085481565b348015610aed57600080fd5b50610455610afc366004615732565b6131f1565b348015610b0d57600080fd5b506104f0610b1c366004614e13565b613902565b348015610b2d57600080fd5b506104557f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b348015610b6157600080fd5b50610b75610b70366004615804565b613c37565b6040805182511515815260208084015160ff1690820152918101516bffffffffffffffffffffffff1690820152606001610436565b348015610bb657600080fd5b506104f0613cb4565b348015610bcb57600080fd5b506104f0610bda366004615827565b613e05565b348015610beb57600080fd5b50600054610635906001600160a01b031681565b348015610c0b57600080fd5b50610455637735940081565b348015610c2357600080fd5b506104f0610c32366004614e13565b614041565b610cbf604051806101e001604052806000815260200160006001600160a01b03168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160001515815260200160001515815260200160001515815260200160008152602001600081525090565b6000828152600b602090815260409182902082516101e081018452815480825260018301546001600160a01b03169382019390935260028201549381019390935291906060820190610d1090611351565b81526004830154602082015260098301546040820152600a8301546060820152600b8301546080820152600c83015460a0820152600d83015460c0820152600e83015460ff808216151560e084015261010080830482161515908401526201000090910416151561012082015260108301546101408201526011909201546101609092019190915292915050565b6009546001600160a01b031615610e225760405162461bcd60e51b815260206004820152602e60248201527f4e6f756e7344414f3a3a696e697469616c697a653a2063616e206f6e6c79206960448201527f6e697469616c697a65206f6e636500000000000000000000000000000000000060648201526084015b60405180910390fd5b6000546001600160a01b03163314610e66576040517fc15c60b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038716610ee25760405162461bcd60e51b815260206004820152602e60248201527f4e6f756e7344414f3a3a696e697469616c697a653a20696e76616c696420746960448201527f6d656c6f636b20616464726573730000000000000000000000000000000000006064820152608401610e19565b6001600160a01b038616610f5e5760405162461bcd60e51b815260206004820152602b60248201527f4e6f756e7344414f3a3a696e697469616c697a653a20696e76616c6964206e6f60448201527f756e7320616464726573730000000000000000000000000000000000000000006064820152608401610e19565b6116808410158015610f73575062013b008411155b610fe55760405162461bcd60e51b815260206004820152602b60248201527f4e6f756e7344414f3a3a696e697469616c697a653a20696e76616c696420766f60448201527f74696e6720706572696f640000000000000000000000000000000000000000006064820152608401610e19565b60018310158015610ff85750619d808311155b61106a5760405162461bcd60e51b815260206004820152602a60248201527f4e6f756e7344414f3a3a696e697469616c697a653a20696e76616c696420766f60448201527f74696e672064656c6179000000000000000000000000000000000000000000006064820152608401610e19565b6001821015801561107d57506103e88211155b6110ef5760405162461bcd60e51b815260206004820152603460248201527f4e6f756e7344414f3a3a696e697469616c697a653a20696e76616c696420707260448201527f6f706f73616c207468726573686f6c64206270730000000000000000000000006064820152608401610e19565b60055460408051918252602082018690527f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828910160405180910390a160045460408051918252602082018590527fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93910160405180910390a160065460408051918252602082018490527ffc216faa269bf440fb06aa490693f409461bde9cdcb949c7b9f2cb79589e7a58910160405180910390a1600980546001600160a01b03808a167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255600a8054898416908316179055600380549288169290911691909117905560058490556004839055600682905561123761121760208301836152b5565b61122760408401602085016152b5565b610bda606085016040860161503c565b50505050505050565b6000546001600160a01b03163314611284576040517fc15c60b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116808110158015611299575062013b008111155b61130b5760405162461bcd60e51b815260206004820152603160248201527f4e6f756e7344414f3a3a5f736574566f74696e67506572696f643a20696e766160448201527f6c696420766f74696e6720706572696f640000000000000000000000000000006064820152608401610e19565b600580549082905560408051828152602081018490527f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e882891015b60405180910390a15050565b6000818152600b6020526040812060108101548203611374576003015492915050565b61138e81600c0154826010015461091e84601101546123de565b9392505050565b6003546001600160a01b03166113d7576040517ff7e4046800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003546001600160a01b0316331461141b576040517f1387214700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600761142682611eb3565b6008811115611437576114376151d7565b0361146e576040517f6c0a12d500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152600b60205260408120600e810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055905b60058201548110156115c5576009546005830180546001600160a01b039092169163591fcdfe9190849081106114e4576114e461586a565b6000918252602090912001546006850180546001600160a01b0390921691859081106115125761151261586a565b90600052602060002001548560070185815481106115325761153261586a565b906000526020600020018660080186815481106115515761155161586a565b9060005260206000200187600401546040518663ffffffff1660e01b8152600401611580959493929190615981565b600060405180830381600087803b15801561159a57600080fd5b505af11580156115ae573d6000803e3d6000fd5b5050505080806115bd906159fd565b9150506114ac565b506040518281527fde0cea2a3a0097cc3d981d40c375407760e85bc9c5e69aea449ac3885f8615c690602001611345565b6000546001600160a01b0316331461163a576040517fc15c60b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001811015801561164d5750619d808111155b6116bf5760405162461bcd60e51b815260206004820152602f60248201527f4e6f756e7344414f3a3a5f736574566f74696e6744656c61793a20696e76616c60448201527f696420766f74696e672064656c617900000000000000000000000000000000006064820152608401610e19565b600480549082905560408051828152602081018490527fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a939101611345565b6000546001600160a01b03163314611741576040517fc15c60b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061174c436123de565b60408101805163ffffffff851690915290915061176882614270565b6040805163ffffffff8084168252851660208201527f5e3adb1066359dafa23c629f245d93543856115700821dcb4debc416f393c46991015b60405180910390a1505050565b600e546001600160a01b031633146117f2576040517fdecdd8d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600354600e54604080516001600160a01b0393841681529290911660208301527fc5644f3588a066b15dcf6b636b74aadca57cfaccf608d9de7d8786364b7a8d02910160405180910390a1600e54600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909216918217905560408051918252600060208301527f7ad92e57a52c4e3e83ba624622b14e3a5efa0160dd6f9a7975c43ea66bad79ea91015b60405180910390a1600e80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b6060806060806000600b60008781526020019081526020016000209050806005018160060182600701836008018380548060200260200160405190810160405280929190818152602001828054801561195c57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161193e575b50505050509350828054806020026020016040519081016040528092919081815260200182805480156119ae57602002820191906000526020600020905b81548152602001906001019080831161199a575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b82821015611a825783829060005260206000200180546119f590615899565b80601f0160208091040260200160405190810160405280929190818152602001828054611a2190615899565b8015611a6e5780601f10611a4357610100808354040283529160200191611a6e565b820191906000526020600020905b815481529060010190602001808311611a5157829003601f168201915b5050505050815260200190600101906119d6565b50505050915080805480602002602001604051908101604052809291908181526020016000905b82821015611b55578382906000526020600020018054611ac890615899565b80601f0160208091040260200160405190810160405280929190818152602001828054611af490615899565b8015611b415780601f10611b1657610100808354040283529160200191611b41565b820191906000526020600020905b815481529060010190602001808311611b2457829003601f168201915b505050505081526020019060010190611aa9565b5050505090509450945094509450509193509193565b604080518082018252600981527f4e6f756e732044414f000000000000000000000000000000000000000000000060209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527fe1dd93b3612547b4bb7c3d429f3df8508d84f5a4f63b5e2e44340b94698e6b3b81840152466060820152306080808301919091528351808303909101815260a0820184528051908301207f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f60c083015260e0820189905260ff881661010080840191909152845180840390910181526101208301909452835193909201929092207f19010000000000000000000000000000000000000000000000000000000000006101408401526101428301829052610162830181905290916000906101820160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa158015611d13573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611d9c5760405162461bcd60e51b815260206004820152602a60248201527f4e6f756e7344414f3a3a63617374566f746542795369673a20696e76616c696460448201527f207369676e6174757265000000000000000000000000000000000000000000006064820152608401610e19565b806001600160a01b03167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda48a8a611dd4858e8e6144c1565b6040805193845260ff90921660208401526bffffffffffffffffffffffff169082015260806060820181905260009082015260a00160405180910390a2505050505050505050565b6000611eae611e2a436123de565b6000015161ffff16600a60009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea99190615a35565b614821565b905090565b6000816008541015611f2c5760405162461bcd60e51b8152602060048201526024808201527f4e6f756e7344414f3a3a73746174653a20696e76616c69642070726f706f736160448201527f6c206964000000000000000000000000000000000000000000000000000000006064820152608401610e19565b6000828152600b60205260409020600e810154610100900460ff1615611f555750600892915050565b600e81015460ff1615611f6b5750600292915050565b80600901544311611f7f5750600092915050565b80600a01544311611f935750600192915050565b80600c015481600b0154111580611fb757508054611fb090611351565b81600b0154105b15611fc55750600392915050565b8060040154600003611fda5750600492915050565b600e81015462010000900460ff1615611ff65750600792915050565b600960009054906101000a90046001600160a01b03166001600160a01b031663c1a287e26040518163ffffffff1660e01b8152600401602060405180830381865afa158015612049573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061206d9190615a35565b816004015461207c9190615a4e565b421061208b5750600692915050565b50600592915050565b50919050565b60076120a582611eb3565b60088111156120b6576120b66151d7565b036120ed576040517f0b586af500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152600b6020526040902060018101546001600160a01b03163314806121d457506002810154600a546001808401546001600160a01b039283169263782d6fe19291169061213e9043615a61565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa15801561219f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121c39190615a74565b6bffffffffffffffffffffffff1611155b6122465760405162461bcd60e51b815260206004820152602a60248201527f4e6f756e7344414f3a3a63616e63656c3a2070726f706f7365722061626f766560448201527f207468726573686f6c64000000000000000000000000000000000000000000006064820152608401610e19565b600e810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560005b600582015481101561238f576009546005830180546001600160a01b039092169163591fcdfe9190849081106122ae576122ae61586a565b6000918252602090912001546006850180546001600160a01b0390921691859081106122dc576122dc61586a565b90600052602060002001548560070185815481106122fc576122fc61586a565b9060005260206000200186600801868154811061231b5761231b61586a565b9060005260206000200187600401546040518663ffffffff1660e01b815260040161234a959493929190615981565b600060405180830381600087803b15801561236457600080fd5b505af1158015612378573d6000803e3d6000fd5b505050508080612387906159fd565b915050612276565b506040518281527f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c90602001611345565b6123da82826040518060200160405280600081525061483a565b5050565b6040805160608101825260008082526020820181905291810191909152600061241f83604051806060016040528060408152602001615edb604091396148b9565b600d54909150600081900361246e5760405180606001604052806124446007546148e9565b61ffff1681526020016124586007546148e9565b61ffff1681526000602090910152949350505050565b63ffffffff8216600d612482600184615a61565b815481106124925761249261586a565b600091825260209091206002909102015463ffffffff161161252157600d6124bb600183615a61565b815481106124cb576124cb61586a565b6000918252602091829020604080516060810182526002939093029091016001015461ffff8082168452620100008204169383019390935264010000000090920463ffffffff1691810191909152949350505050565b8163ffffffff16600d60008154811061253c5761253c61586a565b600091825260209091206002909102015463ffffffff16111561256f5760405180606001604052806124446007546148e9565b60008061257d600184615a61565b90505b8181111561266f57600060026125968484615a61565b6125a09190615aa2565b6125aa9083615a61565b90506000600d82815481106125c1576125c161586a565b60009182526020918290206040805180820182526002909302909101805463ffffffff9081168452825160608101845260019092015461ffff8082168452620100008204168387015264010000000090048116928201929092529282019290925280519092508782169116036126405760200151979650505050505050565b805163ffffffff8088169116101561265a57819350612668565b612665600183615a61565b92505b5050612580565b600d82815481106126825761268261586a565b6000918252602091829020604080516060810182526002939093029091016001015461ffff8082168452620100008204169383019390935264010000000090920463ffffffff16918101919091529695505050505050565b6000546001600160a01b0316331461271e576040517fc15c60b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612729436123de565b90506117708261ffff1611156127a75760405162461bcd60e51b815260206004820152603d60248201527f4e6f756e7344414f3a3a5f7365744d617851756f72756d566f7465734250533a60448201527f20696e76616c6964206d61782071756f72756d20766f746573206270730000006064820152608401610e19565b805161ffff8084169116111561284b5760405162461bcd60e51b815260206004820152604660248201527f4e6f756e7344414f3a3a5f7365744d617851756f72756d566f7465734250533a60448201527f206d696e2071756f72756d20766f74657320627073206772656174657220746860648201527f616e206d61780000000000000000000000000000000000000000000000000000608482015260a401610e19565b60208101805161ffff841690915261286282614270565b6040805161ffff8084168252851660208201527f4bfb1235074b38f02e5cf8ba90f535905417c196a12654f65ee0584512d7064291016117a1565b337fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda483836128cc8483836144c1565b6040805193845260ff90921660208401526bffffffffffffffffffffffff169082015260806060820181905260009082015260a00160405180910390a25050565b61294e848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061483a92505050565b50505050565b6000546001600160a01b03163314612998576040517fc15c60b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006129a3436123de565b905060c88261ffff16101580156129c057506107d08261ffff1611155b612a325760405162461bcd60e51b815260206004820152603d60248201527f4e6f756e7344414f3a3a5f7365744d696e51756f72756d566f7465734250533a60448201527f20696e76616c6964206d696e2071756f72756d20766f746573206270730000006064820152608401610e19565b806020015161ffff168261ffff161115612ada5760405162461bcd60e51b815260206004820152604660248201527f4e6f756e7344414f3a3a5f7365744d696e51756f72756d566f7465734250533a60448201527f206d696e2071756f72756d20766f74657320627073206772656174657220746860648201527f616e206d61780000000000000000000000000000000000000000000000000000608482015260a401610e19565b805161ffff83168252612aec82614270565b6040805161ffff8084168252851660208201527ffaeebe30d875e399189096ea49fea81bd41fe6dfc86ad3550639063219e6077891016117a1565b337fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda48585612b568483836144c1565b8686604051612b69959493929190615add565b60405180910390a250505050565b6000611eae612b85436123de565b6020015161ffff16600a60009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e85573d6000803e3d6000fd5b6000546001600160a01b03163314612c24576040517fc15c60b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018110158015612c3757506103e88111155b612ca95760405162461bcd60e51b815260206004820152603f60248201527f4e6f756e7344414f3a3a5f73657450726f706f73616c5468726573686f6c643a60448201527f20696e76616c69642070726f706f73616c207468726573686f6c6420627073006064820152608401610e19565b600680549082905560408051828152602081018490527ffc216faa269bf440fb06aa490693f409461bde9cdcb949c7b9f2cb79589e7a589101611345565b60008083612cf786612710615b32565b612d019190615aa2565b90506000620f424082856040015163ffffffff16612d1f9190615b32565b612d299190615aa2565b9050600081856000015161ffff16612d419190615a4e565b90506000612d57866020015161ffff168361492b565b9050612d638188614821565b98975050505050505050565b600d8181548110612d7f57600080fd5b60009182526020918290206002919091020180546040805160608101825260019093015461ffff8082168552620100008204169484019490945263ffffffff64010000000090940484169083015291909116915082565b6000611eae600654600a60009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e85573d6000803e3d6000fd5b6000546001600160a01b03163314612eb15760405162461bcd60e51b815260206004820152602660248201527f4e6f756e7344414f3a3a5f73657450656e64696e6741646d696e3a2061646d6960448201527f6e206f6e6c7900000000000000000000000000000000000000000000000000006064820152608401610e19565b600180546001600160a01b038381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527fca4f2f25d0898edd99413412fb94012f9e54ec8142f9b093e7720646a95b16a99101611345565b6003546001600160a01b03163314612fa35760405162461bcd60e51b815260206004820152602560248201527f4e6f756e7344414f3a3a5f6275726e5665746f506f7765723a207665746f657260448201527f206f6e6c790000000000000000000000000000000000000000000000000000006064820152608401610e19565b600354604080516001600160a01b039092168252600060208301527fc5644f3588a066b15dcf6b636b74aadca57cfaccf608d9de7d8786364b7a8d02910160405180910390a1600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055600e54604080516001600160a01b039092168252600060208301527f7ad92e57a52c4e3e83ba624622b14e3a5efa0160dd6f9a7975c43ea66bad79ea91016118a8565b6000805481906001600160a01b0316331461309b576040517fc15c60b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040514790600090339083908381818185875af1925050503d80600081146130df576040519150601f19603f3d011682016040523d82523d6000602084013e6130e4565b606091505b50506040805184815282151560208201529192507f2aeb20ed0ead73e7bc740154a0b979547bc9e00691d84a700e6454ada9fe4679910160405180910390a190939092509050565b6003546001600160a01b03163314613170576040517f1387214700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e54604080516001600160a01b03928316815291831660208301527f7ad92e57a52c4e3e83ba624622b14e3a5efa0160dd6f9a7975c43ea66bad79ea910160405180910390a1600e80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60006132256040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b600a60009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613278573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061329c9190615a35565b8082526006546132ab91614821565b60208201819052600a546001600160a01b031663782d6fe1336132cf600143615a61565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa158015613330573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133549190615a74565b6bffffffffffffffffffffffff16116133d55760405162461bcd60e51b815260206004820152603a60248201527f4e6f756e7344414f3a3a70726f706f73653a2070726f706f73657220766f746560448201527f732062656c6f772070726f706f73616c207468726573686f6c640000000000006064820152608401610e19565b855187511480156133e7575084518751145b80156133f4575083518751145b6134665760405162461bcd60e51b815260206004820152603f60248201527f4e6f756e7344414f3a3a70726f706f73653a2070726f706f73616c2066756e6360448201527f74696f6e20696e666f726d6174696f6e206172697479206d69736d61746368006064820152608401610e19565b86516000036134dd5760405162461bcd60e51b815260206004820152602760248201527f4e6f756e7344414f3a3a70726f706f73653a206d7573742070726f766964652060448201527f616374696f6e73000000000000000000000000000000000000000000000000006064820152608401610e19565b600a875111156135555760405162461bcd60e51b815260206004820152602360248201527f4e6f756e7344414f3a3a70726f706f73653a20746f6f206d616e79206163746960448201527f6f6e7300000000000000000000000000000000000000000000000000000000006064820152608401610e19565b336000908152600c60205260409081902054908201819052156136df5760006135818260400151611eb3565b90506001816008811115613597576135976151d7565b036136305760405162461bcd60e51b815260206004820152605360248201527f4e6f756e7344414f3a3a70726f706f73653a206f6e65206c6976652070726f7060448201527f6f73616c207065722070726f706f7365722c20666f756e6420616e20616c726560648201527f616479206163746976652070726f706f73616c00000000000000000000000000608482015260a401610e19565b6000816008811115613644576136446151d7565b036136dd5760405162461bcd60e51b815260206004820152605460248201527f4e6f756e7344414f3a3a70726f706f73653a206f6e65206c6976652070726f7060448201527f6f73616c207065722070726f706f7365722c20666f756e6420616e20616c726560648201527f6164792070656e64696e672070726f706f73616c000000000000000000000000608482015260a401610e19565b505b6004546136ec9043615a4e565b606082018190526005546136ff91615a4e565b608082015260088054906000613714836159fd565b90915550506008546000818152600b6020908152604082209283556001830180547fffffffffffffffffffffffff0000000000000000000000000000000000000000163317905583810151600284015560048301919091558851613780916005840191908b0190614c2f565b50865161379690600683019060208a0190614ca8565b5085516137ac9060078301906020890190614ce3565b5084516137c29060088301906020880190614d35565b506060820151600982019081556080830151600a83019081556000600b8401819055600c808501829055600d8501829055600e850180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000016905585516010860155436011860155845460018601546001600160a01b031683526020919091526040918290208190559254915490517f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e09361388c93909233928e928e928e928e9291908e90615b49565b60405180910390a17f6af0134faa0f9290c1d686d55012aca80302d31d5c856e4bc7954f7613dc7f878160000154338a8a8a8a876009015488600a015489600201546138d6611e1c565b8e6040516138ee9b9a99989796959493929190615bdf565b60405180910390a154979650505050505050565b600461390d82611eb3565b600881111561391e5761391e6151d7565b146139915760405162461bcd60e51b815260206004820152603f60248201527f4e6f756e7344414f3a3a71756575653a2070726f706f73616c2063616e206f6e60448201527f6c792062652071756575656420696620697420697320737563636565646564006064820152608401610e19565b6000818152600b6020908152604080832060095482517f6a42b8f800000000000000000000000000000000000000000000000000000000815292519194936001600160a01b0390911692636a42b8f892600480830193928290030181865afa158015613a01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a259190615a35565b613a2f9042615a4e565b905060005b6005830154811015613bf957613be7836005018281548110613a5857613a5861586a565b6000918252602090912001546006850180546001600160a01b039092169184908110613a8657613a8661586a565b9060005260206000200154856007018481548110613aa657613aa661586a565b906000526020600020018054613abb90615899565b80601f0160208091040260200160405190810160405280929190818152602001828054613ae790615899565b8015613b345780601f10613b0957610100808354040283529160200191613b34565b820191906000526020600020905b815481529060010190602001808311613b1757829003601f168201915b5050505050866008018581548110613b4e57613b4e61586a565b906000526020600020018054613b6390615899565b80601f0160208091040260200160405190810160405280929190818152602001828054613b8f90615899565b8015613bdc5780601f10613bb157610100808354040283529160200191613bdc565b820191906000526020600020905b815481529060010190602001808311613bbf57829003601f168201915b505050505086614941565b80613bf1816159fd565b915050613a34565b506004820181905560408051848152602081018390527f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda289291016117a1565b604080516060808201835260008083526020808401829052928401819052858152600b83528381206001600160a01b0386168252600f018352839020835191820184525460ff8082161515835261010082041692820192909252620100009091046bffffffffffffffffffffffff16918101919091525b92915050565b6001546001600160a01b031633148015613ccd57503315155b613d3f5760405162461bcd60e51b815260206004820152602a60248201527f4e6f756e7344414f3a3a5f61636365707441646d696e3a2070656e64696e672060448201527f61646d696e206f6e6c79000000000000000000000000000000000000000000006064820152608401610e19565b60008054600180546001600160a01b038082167fffffffffffffffffffffffff000000000000000000000000000000000000000080861682179096559490911690915560408051919092168082526020820184905292917ff9ffabca9c8276e99321725bcb43fb076a6c66a54b7f21c4e8146d8519b417dc910160405180910390a1600154604080516001600160a01b03808516825290921660208301527fca4f2f25d0898edd99413412fb94012f9e54ec8142f9b093e7720646a95b16a99101611345565b6000546001600160a01b03163314613e49576040517fc15c60b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c88361ffff161080613e6157506107d08361ffff16115b15613e98576040517fdb8a74af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117708261ffff161115613ed8576040517f50eafd0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8161ffff168361ffff161115613f1a576040517fc58ac9aa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000613f25436123de565b9050600060405180606001604052808661ffff1681526020018561ffff1681526020018463ffffffff168152509050613f5d81614270565b815181516040805161ffff93841681529290911660208301527ffaeebe30d875e399189096ea49fea81bd41fe6dfc86ad3550639063219e60778910160405180910390a17f4bfb1235074b38f02e5cf8ba90f535905417c196a12654f65ee0584512d7064282602001518260200151604051613fea92919061ffff92831681529116602082015260400190565b60405180910390a160408083015182820151825163ffffffff9283168152911660208201527f5e3adb1066359dafa23c629f245d93543856115700821dcb4debc416f393c469910160405180910390a15050505050565b600561404c82611eb3565b600881111561405d5761405d6151d7565b146140d2576040805162461bcd60e51b81526020600482015260248101919091527f4e6f756e7344414f3a3a657865637574653a2070726f706f73616c2063616e2060448201527f6f6e6c79206265206578656375746564206966206974206973207175657565646064820152608401610e19565b6000818152600b60205260408120600e810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff1662010000179055905b600582015481101561423f576009546005830180546001600160a01b0390921691630825f38f9190849081106141495761414961586a565b6000918252602090912001546006850180546001600160a01b0390921691859081106141775761417761586a565b90600052602060002001548560070185815481106141975761419761586a565b906000526020600020018660080186815481106141b6576141b661586a565b9060005260206000200187600401546040518663ffffffff1660e01b81526004016141e5959493929190615981565b6000604051808303816000875af1158015614204573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261422c9190810190615c85565b5080614237816159fd565b915050614111565b506040518281527f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f90602001611345565b60006142b1436040518060400160405280601c81526020017f626c6f636b206e756d62657220657863656564732033322062697473000000008152506148b9565b600d5490915080158015906142fe575063ffffffff8216600d6142d5600184615a61565b815481106142e5576142e561586a565b600091825260209091206002909102015463ffffffff16145b156143bd5782600d614311600184615a61565b815481106143215761432161586a565b60009182526020918290208351600160029093029091019190910180549284015160409094015163ffffffff16640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff61ffff95861662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000090951695909316949094179290921716919091179055505050565b60408051808201825263ffffffff80851682526020808301878152600d8054600181018255600091909152935160029094027fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb5810180549585167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000968716179055905180517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb69092018054938201519190960151909316640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff61ffff948516620100000293909516939091169290921717919091161790555b505050565b600060016144ce84611eb3565b60088111156144df576144df6151d7565b146145525760405162461bcd60e51b815260206004820152602c60248201527f4e6f756e7344414f3a3a63617374566f7465496e7465726e616c3a20766f746960448201527f6e6720697320636c6f73656400000000000000000000000000000000000000006064820152608401610e19565b60028260ff1611156145cc5760405162461bcd60e51b815260206004820152602d60248201527f4e6f756e7344414f3a3a63617374566f7465496e7465726e616c3a20696e766160448201527f6c696420766f74652074797065000000000000000000000000000000000000006064820152608401610e19565b6000838152600b602090815260408083206001600160a01b0388168452600f8101909252909120805460ff161561466b5760405162461bcd60e51b815260206004820152602f60248201527f4e6f756e7344414f3a3a63617374566f7465496e7465726e616c3a20766f746560448201527f7220616c726561647920766f74656400000000000000000000000000000000006064820152608401610e19565b600a546000906001600160a01b031663782d6fe18861468986614b19565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa1580156146ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061470e9190615a74565b90508460ff1660000361474357806bffffffffffffffffffffffff1683600c01546147399190615a4e565b600c8401556147a5565b8460ff1660010361477657806bffffffffffffffffffffffff1683600b015461476c9190615a4e565b600b8401556147a5565b8460ff166002036147a557806bffffffffffffffffffffffff1683600d015461479f9190615a4e565b600d8401555b81546bffffffffffffffffffffffff821662010000027fffffffffffffffffffffffffffffffffffff000000000000000000000000ffff60ff8816610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009093169290921760011791909116179091559150509392505050565b60006127106148308484615b32565b61138e9190615aa2565b60005a9050600061484c3386866144c1565b9050336001600160a01b03167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda48686848760405161488d9493929190615cfc565b60405180910390a26bffffffffffffffffffffffff8116156148b2576148b282614b41565b5050505050565b60008163ffffffff8411156148e15760405162461bcd60e51b8152600401610e199190614f42565b509192915050565b600061ffff821115614927576040517faab57e0200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5090565b600081831061493a578161138e565b5090919050565b6009546040516001600160a01b039091169063f2b065379061496f9088908890889088908890602001615d3c565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004016149a391815260200190565b602060405180830381865afa1580156149c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906149e49190615d76565b15614a7d5760405162461bcd60e51b815260206004820152605060248201527f4e6f756e7344414f3a3a71756575654f72526576657274496e7465726e616c3a60448201527f206964656e746963616c2070726f706f73616c20616374696f6e20616c72656160648201527f6479207175657565642061742065746100000000000000000000000000000000608482015260a401610e19565b6009546040517f3a66f9010000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690633a66f90190614ace9088908890889088908890600401615d3c565b6020604051808303816000875af1158015614aed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b119190615a35565b505050505050565b60008160110154600003614b39576004548260090154613cae9190615a61565b506011015490565b476000819003614b4f575050565b6000614b6048642e90edd00061492b565b90506000614b743a6377359400840161492b565b90506000614b8b618ca05a87030162030d4061492b565b90506000614b9b8284028661492b565b604051909150600090329083908381818185875af1925050503d8060008114614be0576040519150601f19603f3d011682016040523d82523d6000602084013e614be5565b606091505b505060408051848152821515602082015291925032917ffabef36fd46c4c3a6ad676521be5367a4dfdbf3faa68d8e826003b1752d68f4f910160405180910390a250505050505050565b828054828255906000526020600020908101928215614c9c579160200282015b82811115614c9c57825182547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909116178255602090920191600190910190614c4f565b50614927929150614d87565b828054828255906000526020600020908101928215614c9c579160200282015b82811115614c9c578251825591602001919060010190614cc8565b828054828255906000526020600020908101928215614d29579160200282015b82811115614d295782518290614d199082615dde565b5091602001919060010190614d03565b50614927929150614d9c565b828054828255906000526020600020908101928215614d7b579160200282015b82811115614d7b5782518290614d6b9082615dde565b5091602001919060010190614d55565b50614927929150614db9565b5b808211156149275760008155600101614d88565b80821115614927576000614db08282614dd6565b50600101614d9c565b80821115614927576000614dcd8282614dd6565b50600101614db9565b508054614de290615899565b6000825580601f10614df2575050565b601f016020900490600052602060002090810190614e109190614d87565b50565b600060208284031215614e2557600080fd5b5035919050565b815181526020808301516101e0830191614e50908401826001600160a01b03169052565b5060408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525061012080840151818401525061014080840151614eb98285018215159052565b505061016083810151151590830152610180808401511515908301526101a080840151908301526101c092830151929091019190915290565b60005b83811015614f0d578181015183820152602001614ef5565b50506000910152565b60008151808452614f2e816020860160208601614ef2565b601f01601f19169290920160200192915050565b60208152600061138e6020830184614f16565b80356001600160a01b0381168114614f6c57600080fd5b919050565b6000806000806000806000878903610120811215614f8e57600080fd5b614f9789614f55565b9750614fa560208a01614f55565b9650614fb360408a01614f55565b9550606089013594506080890135935060a0890135925060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4082011215614ffa57600080fd5b5060c08801905092959891949750929550565b60006020828403121561501f57600080fd5b61138e82614f55565b803563ffffffff81168114614f6c57600080fd5b60006020828403121561504e57600080fd5b61138e82615028565b600081518084526020808501945080840160005b838110156150905781516001600160a01b03168752958201959082019060010161506b565b509495945050505050565b600081518084526020808501945080840160005b83811015615090578151875295820195908201906001016150af565b600081518084526020808501808196508360051b8101915082860160005b85811015615113578284038952615101848351614f16565b988501989350908401906001016150e9565b5091979650505050505050565b6080815260006151336080830187615057565b8281036020840152615145818761509b565b9050828103604084015261515981866150cb565b9050828103606084015261516d81856150cb565b979650505050505050565b803560ff81168114614f6c57600080fd5b600080600080600060a086880312156151a157600080fd5b853594506151b160208701615178565b93506151bf60408701615178565b94979396509394606081013594506080013592915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160098310615241577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806040838503121561525a57600080fd5b8235915061526a60208401615178565b90509250929050565b815161ffff90811682526020808401519091169082015260408083015163ffffffff169082015260608101613cae565b803561ffff81168114614f6c57600080fd5b6000602082840312156152c757600080fd5b61138e826152a3565b600080600080606085870312156152e657600080fd5b843593506152f660208601615178565b9250604085013567ffffffffffffffff8082111561531357600080fd5b818701915087601f83011261532757600080fd5b81358181111561533657600080fd5b88602082850101111561534857600080fd5b95989497505060200194505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156153af576153af615357565b604052919050565b600080600083850360a08112156153cd57600080fd5b843593506020850135925060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08201121561540857600080fd5b506040516060810181811067ffffffffffffffff8211171561542c5761542c615357565b806040525061543d604086016152a3565b815261544b606086016152a3565b602082015261545c60808601615028565b6040820152809150509250925092565b63ffffffff831681526080810161138e602083018461ffff8082511683528060208301511660208401525063ffffffff60408201511660408301525050565b600067ffffffffffffffff8211156154c5576154c5615357565b5060051b60200190565b600082601f8301126154e057600080fd5b813560206154f56154f0836154ab565b615386565b82815260059290921b8401810191818101908684111561551457600080fd5b8286015b848110156155365761552981614f55565b8352918301918301615518565b509695505050505050565b600082601f83011261555257600080fd5b813560206155626154f0836154ab565b82815260059290921b8401810191818101908684111561558157600080fd5b8286015b848110156155365780358352918301918301615585565b600067ffffffffffffffff8211156155b6576155b6615357565b50601f01601f191660200190565b60006155d26154f08461559c565b90508281528383830111156155e657600080fd5b828260208301376000602084830101529392505050565b600082601f83011261560e57600080fd5b61138e838335602085016155c4565b600082601f83011261562e57600080fd5b8135602061563e6154f0836154ab565b82815260059290921b8401810191818101908684111561565d57600080fd5b8286015b8481101561553657803567ffffffffffffffff8111156156815760008081fd5b61568f8986838b01016155fd565b845250918301918301615661565b600082601f8301126156ae57600080fd5b813560206156be6154f0836154ab565b82815260059290921b840181019181810190868411156156dd57600080fd5b8286015b8481101561553657803567ffffffffffffffff8111156157015760008081fd5b8701603f810189136157135760008081fd5b6157248986830135604084016155c4565b8452509183019183016156e1565b600080600080600060a0868803121561574a57600080fd5b853567ffffffffffffffff8082111561576257600080fd5b61576e89838a016154cf565b9650602088013591508082111561578457600080fd5b61579089838a01615541565b955060408801359150808211156157a657600080fd5b6157b289838a0161561d565b945060608801359150808211156157c857600080fd5b6157d489838a0161569d565b935060808801359150808211156157ea57600080fd5b506157f7888289016155fd565b9150509295509295909350565b6000806040838503121561581757600080fd5b8235915061526a60208401614f55565b60008060006060848603121561583c57600080fd5b615845846152a3565b9250615853602085016152a3565b915061586160408501615028565b90509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600181811c908216806158ad57607f821691505b602082108103612094577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600081546158f381615899565b808552602060018381168015615910576001811461594857615976565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838901528284151560051b8901019550615976565b866000528260002060005b8581101561596e5781548a8201860152908301908401615953565b890184019650505b505050505092915050565b6001600160a01b038616815284602082015260a0604082015260006159a960a08301866158e6565b82810360608401526159bb81866158e6565b9150508260808301529695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615a2e57615a2e6159ce565b5060010190565b600060208284031215615a4757600080fd5b5051919050565b80820180821115613cae57613cae6159ce565b81810381811115613cae57613cae6159ce565b600060208284031215615a8657600080fd5b81516bffffffffffffffffffffffff8116811461138e57600080fd5b600082615ad8577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b85815260ff851660208201526bffffffffffffffffffffffff8416604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f909201601f19160101949350505050565b8082028115828204841417613cae57613cae6159ce565b60006101208b83526001600160a01b038b166020840152806040840152615b728184018b615057565b90508281036060840152615b86818a61509b565b90508281036080840152615b9a81896150cb565b905082810360a0840152615bae81886150cb565b90508560c08401528460e0840152828103610100840152615bcf8185614f16565b9c9b505050505050505050505050565b60006101608d83526001600160a01b038d166020840152806040840152615c088184018d615057565b90508281036060840152615c1c818c61509b565b90508281036080840152615c30818b6150cb565b905082810360a0840152615c44818a6150cb565b90508760c08401528660e08401528561010084015284610120840152828103610140840152615c738185614f16565b9e9d5050505050505050505050505050565b600060208284031215615c9757600080fd5b815167ffffffffffffffff811115615cae57600080fd5b8201601f81018413615cbf57600080fd5b8051615ccd6154f08261559c565b818152856020838501011115615ce257600080fd5b615cf3826020830160208601614ef2565b95945050505050565b84815260ff841660208201526bffffffffffffffffffffffff83166040820152608060608201526000615d326080830184614f16565b9695505050505050565b6001600160a01b038616815284602082015260a060408201526000615d6460a0830186614f16565b82810360608401526159bb8186614f16565b600060208284031215615d8857600080fd5b8151801515811461138e57600080fd5b601f8211156144bc57600081815260208120601f850160051c81016020861015615dbf5750805b601f850160051c820191505b81811015614b1157828155600101615dcb565b815167ffffffffffffffff811115615df857615df8615357565b615e0c81615e068454615899565b84615d98565b602080601f831160018114615e5f5760008415615e295750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555614b11565b600085815260208120601f198616915b82811015615e8e57888601518255948401946001909101908401615e6f565b5085821015615eca57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b0190555056fe4e6f756e7344414f3a3a67657444796e616d696351756f72756d506172616d7341743a20626c6f636b206e756d62657220657863656564732033322062697473a2646970667358221220cb7936417f576cc7a64ab8ecb65b2a02736396aa591a96ea623e92bd37a7673d64736f6c63430008110033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
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.