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
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
GovernorBravoDelegate
Compiler Version
v0.8.2+commit.661d1103
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.2; pragma experimental ABIEncoderV2; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; import "./GovernorBravoInterfaces.sol"; contract GovernorBravoDelegate is Initializable,UUPSUpgradeable,GovernorBravoDelegateStorageV2, GovernorBravoEvents { /// @notice Address of Investee. mapping (uint256 => address) public investeeDetails; /// @notice Next investee to support uint256 public nextInvestee; /// @notice Next investee to fund uint256 public nextInvesteeFund; /// @notice Treasury contract address address public treasury; /// @notice The name of this contract string public constant name = "Cult Governor Bravo"; /// @notice The minimum setable proposal threshold uint public constant MIN_PROPOSAL_THRESHOLD = 50000e18; // 50,000 Cult /// @notice The maximum setable proposal threshold uint public constant MAX_PROPOSAL_THRESHOLD = 6000000000000e18; //6000000000000 Cult /// @notice The minimum setable voting period uint public constant MIN_VOTING_PERIOD = 1; // About 24 hours /// @notice The max setable voting period uint public constant MAX_VOTING_PERIOD = 80640; // About 2 weeks /// @notice The min setable voting delay uint public constant MIN_VOTING_DELAY = 1; /// @notice The max setable voting delay uint public constant MAX_VOTING_DELAY = 40320; // About 1 week /// @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 uint public constant quorumVotes = 1000000000e18; // 1 Billion /// @notice The maximum number of actions that can be included in a proposal uint public constant proposalMaxOperations = 10; // 10 actions /// @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)"); /** * @notice Used to initialize the contract during delegator constructor * @param timelock_ The address of the Timelock * @param dCult_ The address of the dCULT token * @param votingPeriod_ The initial voting period * @param votingDelay_ The initial voting delay * @param proposalThreshold_ The initial proposal threshold */ function initialize(address timelock_, address dCult_, uint votingPeriod_, uint votingDelay_, uint proposalThreshold_, address treasury_) public initializer{ require(address(timelock) == address(0), "GovernorBravo::initialize: can only initialize once"); require(timelock_ != address(0), "GovernorBravo::initialize: invalid timelock address"); require(dCult_ != address(0), "GovernorBravo::initialize: invalid dCult address"); require(votingPeriod_ >= MIN_VOTING_PERIOD && votingPeriod_ <= MAX_VOTING_PERIOD, "GovernorBravo::initialize: invalid voting period"); require(votingDelay_ >= MIN_VOTING_DELAY && votingDelay_ <= MAX_VOTING_DELAY, "GovernorBravo::initialize: invalid voting delay"); require(proposalThreshold_ >= MIN_PROPOSAL_THRESHOLD && proposalThreshold_ <= MAX_PROPOSAL_THRESHOLD, "GovernorBravo::initialize: invalid proposal threshold"); require(treasury_ != address(0), "GovernorBravo::initialize: invalid treasury address"); timelock = TimelockInterface(timelock_); dCult = dCultInterface(dCult_); votingPeriod = votingPeriod_; votingDelay = votingDelay_; proposalThreshold = proposalThreshold_; admin = timelock_; treasury = treasury_; } /** * @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, uint[] memory values, string[] memory signatures, bytes[] memory calldatas, string memory description) public returns (uint) { // Allow addresses above proposal threshold and whitelisted addresses to propose require(keccak256(abi.encodePacked(signatures[0])) == keccak256(abi.encodePacked("_setInvesteeDetails(address)")), "GovernorBravo::propose: invalid proposal"); require(dCult.checkHighestStaker(0,msg.sender),"GovernorBravo::propose: only top staker"); require(targets.length <= 1, "GovernorBravo::propose: too many targets"); require(targets.length == values.length && targets.length == signatures.length && targets.length == calldatas.length, "GovernorBravo::propose: proposal function information arity mismatch"); require(targets.length != 0, "GovernorBravo::propose: must provide actions"); require(targets.length <= proposalMaxOperations, "GovernorBravo::propose: too many actions"); uint latestProposalId = latestProposalIds[msg.sender]; if (latestProposalId != 0) { ProposalState proposersLatestProposalState = state(latestProposalId); require(proposersLatestProposalState != ProposalState.Active, "GovernorBravo::propose: one live proposal per proposer, found an already active proposal"); require(proposersLatestProposalState != ProposalState.Pending, "GovernorBravo::propose: one live proposal per proposer, found an already pending proposal"); } uint startBlock = add256(block.number, votingDelay); uint endBlock = add256(startBlock, votingPeriod); proposalCount++; Proposal storage newProposal = proposals[proposalCount]; newProposal.id = proposalCount; newProposal.proposer= msg.sender; newProposal.eta= 0; newProposal.targets= targets; newProposal.values= values; newProposal.signatures= signatures; newProposal.calldatas= calldatas; newProposal.startBlock= startBlock; newProposal.endBlock= endBlock; newProposal.forVotes= 0; newProposal.againstVotes= 0; newProposal.abstainVotes= 0; newProposal.canceled= false; newProposal.executed= false; latestProposalIds[newProposal.proposer] = newProposal.id; emit ProposalCreated(newProposal.id, msg.sender, targets, values, signatures, calldatas, startBlock, endBlock, description); return newProposal.id; } /** * @notice Queues a proposal of state succeeded * @param proposalId The id of the proposal to queue */ function queue(uint proposalId) external { require(state(proposalId) == ProposalState.Succeeded, "GovernorBravo::queue: proposal can only be queued if it is succeeded"); Proposal storage proposal = proposals[proposalId]; uint eta = add256(block.timestamp, timelock.delay()); for (uint 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, uint value, string memory signature, bytes memory data, uint eta) internal { require(!timelock.queuedTransactions(keccak256(abi.encode(target, value, signature, data, eta))), "GovernorBravo::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(uint proposalId) external payable { require(state(proposalId) == ProposalState.Queued, "GovernorBravo::execute: proposal can only be executed if it is queued"); Proposal storage proposal = proposals[proposalId]; proposal.executed = true; for (uint i = 0; i < proposal.targets.length; i++) { timelock.executeTransaction{value:proposal.values[i]}(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 * @param proposalId The id of the proposal to cancel */ function cancel(uint proposalId) external { require(state(proposalId) != ProposalState.Executed, "GovernorBravo::cancel: cannot cancel executed proposal"); Proposal storage proposal = proposals[proposalId]; require(msg.sender == proposal.proposer, "GovernorBravo::cancel: Other user cannot cancel proposal"); proposal.canceled = true; for (uint 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 Gets actions of a proposal * @param proposalId the id of the proposal * @return targets , values, signatures, and calldatas of the proposal actions */ function getActions(uint proposalId) external view returns (address[] memory targets, uint[] 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(uint 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(uint proposalId) public view returns (ProposalState) { require(proposalCount >= proposalId && proposalId > initialProposalId, "GovernorBravo::state: invalid proposal id"); Proposal storage proposal = proposals[proposalId]; 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) { return ProposalState.Defeated; } else if (proposal.eta == 0) { return ProposalState.Succeeded; } else if (proposal.executed) { return ProposalState.Executed; } else if (block.timestamp >= add256(proposal.eta, timelock.GRACE_PERIOD())) { return ProposalState.Expired; } else { return ProposalState.Queued; } } /** * @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(uint proposalId, uint8 support) external { emit VoteCast(msg.sender, proposalId, support, castVoteInternal(msg.sender, proposalId, support), ""); } /** * @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(uint 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(uint 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), "GovernorBravo::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, uint proposalId, uint8 support) internal returns (uint256) { require(!dCult.checkHighestStaker(0,msg.sender),"GovernorBravo::castVoteInternal: Top staker cannot vote"); require(state(proposalId) == ProposalState.Active, "GovernorBravo::castVoteInternal: voting is closed"); require(support <= 2, "GovernorBravo::castVoteInternal: invalid vote type"); Proposal storage proposal = proposals[proposalId]; Receipt storage receipt = proposal.receipts[voter]; require(receipt.hasVoted == false, "GovernorBravo::castVoteInternal: voter already voted"); uint256 votes = dCult.getPastVotes(voter, proposal.startBlock); if (support == 0) { proposal.againstVotes = add256(proposal.againstVotes, votes); } else if (support == 1) { proposal.forVotes = add256(proposal.forVotes, votes); } else if (support == 2) { proposal.abstainVotes = add256(proposal.abstainVotes, votes); } receipt.hasVoted = true; receipt.support = support; receipt.votes = votes; return votes; } /** * @notice View function which returns if an account is whitelisted * @param account Account to check white list status of * @return If the account is whitelisted */ function isWhitelisted(address account) public view returns (bool) { return (whitelistAccountExpirations[account] > block.timestamp); } /** * @notice Admin function for setting the voting delay * @param newVotingDelay new voting delay, in blocks */ function _setVotingDelay(uint newVotingDelay) external { require(false, "GovernorBravo::_setVotingDelay: disable voting delay update"); require(msg.sender == admin, "GovernorBravo::_setVotingDelay: admin only"); require(newVotingDelay >= MIN_VOTING_DELAY && newVotingDelay <= MAX_VOTING_DELAY, "GovernorBravo::_setVotingDelay: invalid voting delay"); uint oldVotingDelay = votingDelay; votingDelay = newVotingDelay; emit VotingDelaySet(oldVotingDelay,votingDelay); } /** * @notice Admin function for setting the new Investee * @param _investee Investee address */ function _setInvesteeDetails(address _investee) external { require(msg.sender == admin, "GovernorBravo::_setInvesteeDetails: admin only"); require(_investee != address(0), "GovernorBravo::_setInvesteeDetails: zero address"); investeeDetails[nextInvestee] = _investee; nextInvestee =add256(nextInvestee,1); emit InvesteeSet(_investee,sub256(nextInvestee,1)); } /** * @notice Treasury function for funding the new Investee */ function _fundInvestee() external returns(address){ require(msg.sender == treasury, "GovernorBravo::_fundInvestee: treasury only"); require(nextInvesteeFund <= nextInvestee, "GovernorBravo::_fundInvestee: No new investee"); nextInvesteeFund =add256(nextInvesteeFund,1); emit InvesteeFunded(investeeDetails[sub256(nextInvesteeFund,1)],sub256(nextInvesteeFund,1)); return investeeDetails[sub256(nextInvesteeFund,1)]; } /** * @notice Admin function for setting the voting period * @param newVotingPeriod new voting period, in blocks */ function _setVotingPeriod(uint newVotingPeriod) external { require(false, "GovernorBravo::_setVotingPeriod: disable voting period update"); require(msg.sender == admin, "GovernorBravo::_setVotingPeriod: admin only"); require(newVotingPeriod >= MIN_VOTING_PERIOD && newVotingPeriod <= MAX_VOTING_PERIOD, "GovernorBravo::_setVotingPeriod: invalid voting period"); uint oldVotingPeriod = votingPeriod; votingPeriod = newVotingPeriod; emit VotingPeriodSet(oldVotingPeriod, votingPeriod); } /** * @notice Admin function for setting the proposal threshold * @dev newProposalThreshold must be greater than the hardcoded min * @param newProposalThreshold new proposal threshold */ function _setProposalThreshold(uint newProposalThreshold) external { require(false, "GovernorBravo::_setProposalThreshold: disable proposal threshold update"); require(msg.sender == admin, "GovernorBravo::_setProposalThreshold: admin only"); require(newProposalThreshold >= MIN_PROPOSAL_THRESHOLD && newProposalThreshold <= MAX_PROPOSAL_THRESHOLD, "GovernorBravo::_setProposalThreshold: invalid proposal threshold"); uint oldProposalThreshold = proposalThreshold; proposalThreshold = newProposalThreshold; emit ProposalThresholdSet(oldProposalThreshold, proposalThreshold); } /** * @notice Admin function for setting the whitelist expiration as a timestamp for an account. Whitelist status allows accounts to propose without meeting threshold * @param account Account address to set whitelist expiration for * @param expiration Expiration for account whitelist status as timestamp (if now < expiration, whitelisted) */ function _setWhitelistAccountExpiration(address account, uint expiration) external { require(false, "GovernorBravo::_setWhitelistAccountExpiration: disable whitelist account expiration update"); require(msg.sender == admin || msg.sender == whitelistGuardian, "GovernorBravo::_setWhitelistAccountExpiration: admin only"); whitelistAccountExpirations[account] = expiration; emit WhitelistAccountExpirationSet(account, expiration); } /** * @notice Admin function for setting the whitelistGuardian. WhitelistGuardian can cancel proposals from whitelisted addresses * @param account Account to set whitelistGuardian to (0x0 to remove whitelistGuardian) */ function _setWhitelistGuardian(address account) external { require(false, "GovernorBravo::_setWhitelistGuardian: disable whitelist guardian update"); // Check address is not zero require(account != address(0), "GovernorBravo:_setWhitelistGuardian: zero address"); require(msg.sender == admin, "GovernorBravo::_setWhitelistGuardian: admin only"); address oldGuardian = whitelistGuardian; whitelistGuardian = account; emit WhitelistGuardianSet(oldGuardian, whitelistGuardian); } /** * @notice Initiate the GovernorBravo contract * @dev Admin only. Sets initial proposal id which initiates the contract, ensuring a continuous proposal id count * @param governorAlpha The address for the Governor to continue the proposal id count from */ function _initiate(address governorAlpha) external { require(false, "GovernorBravo::_initiate: disable initiate update"); require(msg.sender == admin, "GovernorBravo::_initiate: admin only"); require(initialProposalId == 0, "GovernorBravo::_initiate: can only initiate once"); proposalCount = GovernorAlpha(governorAlpha).proposalCount(); initialProposalId = proposalCount; timelock.acceptAdmin(); emit GovernanceInitiated(governorAlpha); } /** * @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 { require(false, "GovernorBravo::_setPendingAdmin: disable set pending admin update"); // Check address is not zero require(newPendingAdmin != address(0), "GovernorBravo:_setPendingAdmin: zero address"); // Check caller = admin require(msg.sender == admin, "GovernorBravo:_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 { require(false, "GovernorBravo::_acceptAdmin: disable accept admin update"); // Check caller is pendingAdmin and pendingAdmin ≠ address(0) require(msg.sender == pendingAdmin && msg.sender != address(0), "GovernorBravo:_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 Accepts Admin for timelock of admin rights. * @dev Admin function for transferring admin to accept role and update admin */ function _AcceptTimelockAdmin() external { timelock.acceptAdmin(); } function _authorizeUpgrade(address) internal view override { require(admin == msg.sender, "Only admin can upgrade implementation"); } function add256(uint256 a, uint256 b) internal pure returns (uint) { uint c = a + b; require(c >= a, "addition overflow"); return c; } function sub256(uint256 a, uint256 b) internal pure returns (uint) { require(b <= a, "subtraction underflow"); return a - b; } function getChainIdInternal() internal view returns (uint) { uint chainId; assembly { chainId := chainid() } return chainId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (proxy/utils/Initializable.sol) pragma solidity ^0.8.0; import "../../utils/AddressUpgradeable.sol"; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To initialize the implementation contract, you can either invoke the * initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() initializer {} * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { // If the contract is initializing we ignore whether _initialized is set in order to support multiple // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the // contract may have been reentered. require(_initializing ? _isConstructor() : !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} modifier, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } function _isConstructor() private view returns (bool) { return !AddressUpgradeable.isContract(address(this)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (proxy/utils/UUPSUpgradeable.sol) pragma solidity ^0.8.0; import "../ERC1967/ERC1967UpgradeUpgradeable.sol"; import "./Initializable.sol"; /** * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy. * * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing * `UUPSUpgradeable` with a custom implementation of upgrades. * * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism. * * _Available since v4.1._ */ abstract contract UUPSUpgradeable is Initializable, ERC1967UpgradeUpgradeable { function __UUPSUpgradeable_init() internal onlyInitializing { __ERC1967Upgrade_init_unchained(); __UUPSUpgradeable_init_unchained(); } function __UUPSUpgradeable_init_unchained() internal onlyInitializing { } /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment address private immutable __self = address(this); /** * @dev Check that the execution is being performed through a delegatecall call and that the execution context is * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to * fail. */ modifier onlyProxy() { require(address(this) != __self, "Function must be called through delegatecall"); require(_getImplementation() == __self, "Function must be called through active proxy"); _; } /** * @dev Upgrade the implementation of the proxy to `newImplementation`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. */ function upgradeTo(address newImplementation) external virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallSecure(newImplementation, new bytes(0), false); } /** * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call * encoded in `data`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. */ function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallSecure(newImplementation, data, true); } /** * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by * {upgradeTo} and {upgradeToAndCall}. * * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}. * * ```solidity * function _authorizeUpgrade(address) internal override onlyOwner {} * ``` */ function _authorizeUpgrade(address newImplementation) internal virtual; uint256[50] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.2; pragma experimental ABIEncoderV2; contract GovernorBravoEvents { /// @notice An event emitted when a new proposal is created event ProposalCreated(uint id, address proposer, address[] targets, uint[] values, string[] signatures, bytes[] calldatas, uint startBlock, uint endBlock, 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, uint proposalId, uint8 support, uint votes, string reason); /// @notice An event emitted when a proposal has been canceled event ProposalCanceled(uint id); /// @notice An event emitted when a proposal has been queued in the Timelock event ProposalQueued(uint id, uint eta); /// @notice An event emitted when a proposal has been executed in the Timelock event ProposalExecuted(uint id); /// @notice An event emitted when the voting delay is set event VotingDelaySet(uint oldVotingDelay, uint newVotingDelay); /// @notice An event emitted when the voting period is set event VotingPeriodSet(uint oldVotingPeriod, uint newVotingPeriod); /// @notice Emitted when implementation is changed event NewImplementation(address oldImplementation, address newImplementation); /// @notice Emitted when proposal threshold is set event ProposalThresholdSet(uint oldProposalThreshold, uint newProposalThreshold); /// @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 whitelist account expiration is set event WhitelistAccountExpirationSet(address account, uint expiration); /// @notice Emitted when the whitelistGuardian is set event WhitelistGuardianSet(address oldGuardian, address newGuardian); /// @notice Emitted when the new Investee is added. event InvesteeSet(address investee, uint256 id); /// @notice Emitted when the Investee is funded event InvesteeFunded(address investee, uint256 id); /// @notice Alpha contract initiated. For initiating already deployed governance alpha event GovernanceInitiated(address governanceAddress); } contract GovernorBravoDelegatorStorage { /// @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 GovernorBravoDelegateStorageV1. Create a new * contract which implements GovernorBravoDelegateStorageV1 and following the naming convention * GovernorBravoDelegateStorageVX. */ contract GovernorBravoDelegateStorageV1 is GovernorBravoDelegatorStorage { /// @notice The delay before voting on a proposal may take place, once proposed, in blocks uint public votingDelay; /// @notice The duration of voting on a proposal, in blocks uint public votingPeriod; /// @notice The number of votes required in order for a voter to become a proposer uint public proposalThreshold; /// @notice Initial proposal id set at become uint public initialProposalId; /// @notice The total number of proposals uint public proposalCount; /// @notice The address of the cult Protocol Timelock TimelockInterface public timelock; /// @notice The address of the cult governance token dCultInterface public dCult; /// @notice The official record of all proposals ever proposed mapping (uint => Proposal) public proposals; /// @notice The latest proposal for each proposer mapping (address => uint) public latestProposalIds; struct Proposal { // Unique id for looking up a proposal uint id; // Creator of the proposal address proposer; // The timestamp that the proposal will be available for execution, set once the vote succeeds uint eta; // the ordered list of target addresses for calls to be made address[] targets; // The ordered list of values (i.e. msg.value) to be passed to the calls to be made uint[] values; // The ordered list of function signatures to be called string[] signatures; // The ordered list of calldata to be passed to each call bytes[] calldatas; // The block at which voting begins: holders must delegate their votes prior to this block uint startBlock; // The block at which voting ends: votes must be cast prior to this block uint endBlock; // Current number of votes in favor of this proposal uint forVotes; // Current number of votes in opposition to this proposal uint againstVotes; // Current number of votes for abstaining for this proposal uint abstainVotes; // Flag marking whether the proposal has been canceled bool canceled; // Flag marking whether the proposal has been executed bool executed; // Receipts of ballots for the entire set of voters mapping (address => Receipt) receipts; } /// @notice Ballot receipt record for a voter struct Receipt { // Whether or not a vote has been cast bool hasVoted; // Whether or not the voter supports the proposal or abstains uint8 support; // The number of votes the voter had, which were cast uint256 votes; } /// @notice Possible states that a proposal may be in enum ProposalState { Pending, Active, Canceled, Defeated, Succeeded, Queued, Expired, Executed } } contract GovernorBravoDelegateStorageV2 is GovernorBravoDelegateStorageV1 { /// @notice Stores the expiration of account whitelist status as a timestamp mapping (address => uint) public whitelistAccountExpirations; /// @notice Address which manages whitelisted proposals and whitelist accounts address public whitelistGuardian; } interface TimelockInterface { function delay() external view returns (uint); function GRACE_PERIOD() external view returns (uint); function acceptAdmin() external; function queuedTransactions(bytes32 hash) external view returns (bool); function queueTransaction(address target, uint value, string calldata signature, bytes calldata data, uint eta) external returns (bytes32); function cancelTransaction(address target, uint value, string calldata signature, bytes calldata data, uint eta) external; function executeTransaction(address target, uint value, string calldata signature, bytes calldata data, uint eta) external payable returns (bytes memory); } interface dCultInterface { /// @notice Get the past vote of the users function getPastVotes(address account, uint blockNumber) external view returns (uint256); /// @notice Top staker function checkHighestStaker(uint256 _pid, address user) external returns (bool); } interface GovernorAlpha { /// @notice The total number of proposals function proposalCount() external returns (uint); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (proxy/ERC1967/ERC1967Upgrade.sol) pragma solidity ^0.8.2; import "../beacon/IBeaconUpgradeable.sol"; import "../../utils/AddressUpgradeable.sol"; import "../../utils/StorageSlotUpgradeable.sol"; import "../utils/Initializable.sol"; /** * @dev This abstract contract provides getters and event emitting update functions for * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. * * _Available since v4.1._ * * @custom:oz-upgrades-unsafe-allow delegatecall */ abstract contract ERC1967UpgradeUpgradeable is Initializable { function __ERC1967Upgrade_init() internal onlyInitializing { __ERC1967Upgrade_init_unchained(); } function __ERC1967Upgrade_init_unchained() internal onlyInitializing { } // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1 bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143; /** * @dev Storage slot with the address of the current implementation. * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; /** * @dev Emitted when the implementation is upgraded. */ event Upgraded(address indexed implementation); /** * @dev Returns the current implementation address. */ function _getImplementation() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value; } /** * @dev Stores a new address in the EIP1967 implementation slot. */ function _setImplementation(address newImplementation) private { require(AddressUpgradeable.isContract(newImplementation), "ERC1967: new implementation is not a contract"); StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; } /** * @dev Perform implementation upgrade * * Emits an {Upgraded} event. */ function _upgradeTo(address newImplementation) internal { _setImplementation(newImplementation); emit Upgraded(newImplementation); } /** * @dev Perform implementation upgrade with additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCall( address newImplementation, bytes memory data, bool forceCall ) internal { _upgradeTo(newImplementation); if (data.length > 0 || forceCall) { _functionDelegateCall(newImplementation, data); } } /** * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCallSecure( address newImplementation, bytes memory data, bool forceCall ) internal { address oldImplementation = _getImplementation(); // Initial upgrade and setup call _setImplementation(newImplementation); if (data.length > 0 || forceCall) { _functionDelegateCall(newImplementation, data); } // Perform rollback test if not already in progress StorageSlotUpgradeable.BooleanSlot storage rollbackTesting = StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT); if (!rollbackTesting.value) { // Trigger rollback using upgradeTo from the new implementation rollbackTesting.value = true; _functionDelegateCall( newImplementation, abi.encodeWithSignature("upgradeTo(address)", oldImplementation) ); rollbackTesting.value = false; // Check rollback was effective require(oldImplementation == _getImplementation(), "ERC1967Upgrade: upgrade breaks further upgrades"); // Finally reset to the new implementation and log the upgrade _upgradeTo(newImplementation); } } /** * @dev Storage slot with the admin of the contract. * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; /** * @dev Emitted when the admin account has changed. */ event AdminChanged(address previousAdmin, address newAdmin); /** * @dev Returns the current admin. */ function _getAdmin() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value; } /** * @dev Stores a new address in the EIP1967 admin slot. */ function _setAdmin(address newAdmin) private { require(newAdmin != address(0), "ERC1967: new admin is the zero address"); StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin; } /** * @dev Changes the admin of the proxy. * * Emits an {AdminChanged} event. */ function _changeAdmin(address newAdmin) internal { emit AdminChanged(_getAdmin(), newAdmin); _setAdmin(newAdmin); } /** * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor. */ bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; /** * @dev Emitted when the beacon is upgraded. */ event BeaconUpgraded(address indexed beacon); /** * @dev Returns the current beacon. */ function _getBeacon() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value; } /** * @dev Stores a new beacon in the EIP1967 beacon slot. */ function _setBeacon(address newBeacon) private { require(AddressUpgradeable.isContract(newBeacon), "ERC1967: new beacon is not a contract"); require( AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()), "ERC1967: beacon implementation is not a contract" ); StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon; } /** * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that). * * Emits a {BeaconUpgraded} event. */ function _upgradeBeaconToAndCall( address newBeacon, bytes memory data, bool forceCall ) internal { _setBeacon(newBeacon); emit BeaconUpgraded(newBeacon); if (data.length > 0 || forceCall) { _functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data); } } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function _functionDelegateCall(address target, bytes memory data) private returns (bytes memory) { require(AddressUpgradeable.isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return AddressUpgradeable.verifyCallResult(success, returndata, "Address: low-level delegate call failed"); } uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol) pragma solidity ^0.8.0; /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface IBeaconUpgradeable { /** * @dev Must return an address that can be used as a delegate call target. * * {BeaconProxy} will check that this address is a contract. */ function implementation() external view returns (address); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol) pragma solidity ^0.8.0; /** * @dev Library for reading and writing primitive types to specific storage slots. * * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. * This library helps with reading and writing to such slots without the need for inline assembly. * * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. * * Example usage to set ERC1967 implementation slot: * ``` * contract ERC1967 { * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; * * function _getImplementation() internal view returns (address) { * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; * } * * function _setImplementation(address newImplementation) internal { * require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` * * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._ */ library StorageSlotUpgradeable { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } /** * @dev Returns an `AddressSlot` with member `value` located at `slot`. */ function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { assembly { r.slot := slot } } /** * @dev Returns an `BooleanSlot` with member `value` located at `slot`. */ function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { assembly { r.slot := slot } } /** * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. */ function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { assembly { r.slot := slot } } /** * @dev Returns an `Uint256Slot` with member `value` located at `slot`. */ function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { assembly { r.slot := slot } } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"governanceAddress","type":"address"}],"name":"GovernanceInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"investee","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"InvesteeFunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"investee","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"InvesteeSet","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":"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"}],"name":"ProposalExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"eta","type":"uint256"}],"name":"ProposalQueued","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldProposalThreshold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newProposalThreshold","type":"uint256"}],"name":"ProposalThresholdSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","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":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"expiration","type":"uint256"}],"name":"WhitelistAccountExpirationSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldGuardian","type":"address"},{"indexed":false,"internalType":"address","name":"newGuardian","type":"address"}],"name":"WhitelistGuardianSet","type":"event"},{"inputs":[],"name":"BALLOT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PROPOSAL_THRESHOLD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_VOTING_DELAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_VOTING_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_PROPOSAL_THRESHOLD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_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":"_AcceptTimelockAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_acceptAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_fundInvestee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"governorAlpha","type":"address"}],"name":"_initiate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_investee","type":"address"}],"name":"_setInvesteeDetails","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPendingAdmin","type":"address"}],"name":"_setPendingAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newProposalThreshold","type":"uint256"}],"name":"_setProposalThreshold","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":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"expiration","type":"uint256"}],"name":"_setWhitelistAccountExpiration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"_setWhitelistGuardian","outputs":[],"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":"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":[],"name":"dCult","outputs":[{"internalType":"contract dCultInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"execute","outputs":[],"stateMutability":"payable","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":"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":"uint256","name":"votes","type":"uint256"}],"internalType":"struct GovernorBravoDelegateStorageV1.Receipt","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialProposalId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"timelock_","type":"address"},{"internalType":"address","name":"dCult_","type":"address"},{"internalType":"uint256","name":"votingPeriod_","type":"uint256"},{"internalType":"uint256","name":"votingDelay_","type":"uint256"},{"internalType":"uint256","name":"proposalThreshold_","type":"uint256"},{"internalType":"address","name":"treasury_","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"investeeDetails","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"latestProposalIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextInvestee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextInvesteeFund","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proposalCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proposalMaxOperations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proposalThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposals","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"proposer","type":"address"},{"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":"executed","type":"bool"}],"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":[],"name":"quorumVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"state","outputs":[{"internalType":"enum GovernorBravoDelegateStorageV1.ProposalState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timelock","outputs":[{"internalType":"contract TimelockInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","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"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistAccountExpirations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistGuardian","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a06040523060601b60805234801561001757600080fd5b5060805160601c61472e61004b600039600081816110cd0152818161110d015281816119450152611985015261472e6000f3fe6080604052600436106103355760003560e01c8063647abf78116101ab578063d33219b4116100f7578063e48083fe11610095578063f851a4401161006f578063f851a44014610aec578063f9d28b8014610b0c578063fc4eee4214610b2c578063fe0d94c114610b4257610335565b8063e48083fe1461059c578063e9c714f214610ac2578063f03cd27114610ad757610335565b8063da95691a116100d1578063da95691a14610998578063ddf0b009146109b8578063deaaa7cc146109d8578063e23a9a5214610a0c57610335565b8063d33219b41461094c578063d54db3481461096c578063da35c6641461098257610335565b8063a37ee07d11610164578063b1a5d12d1161013e578063b1a5d12d146108d6578063b58131b0146108f6578063b71d1a0c1461090c578063c5a8425d1461092c57610335565b8063a37ee07d14610894578063a64e024a146108a9578063b1126263146108c057610335565b8063647abf78146107d55780636754ae56146107eb578063791f5d23146108215780637b3c71d31461083f5780637bdbe4d01461085f578063995333651461087457610335565b806326782247116102855780633e4f49e6116102235780634f1ef286116101fd5780634f1ef2861461076257806356781388146107755780635c60da1b1461079557806361d027b3146107b557610335565b80633e4f49e6146106f557806340e58ee5146107225780634d6733d21461074257610335565b806338bd0dda1161025f57806338bd0dda146106625780633932abb11461068f5780633af32abf146106a55780633bccf4fd146106d557610335565b806326782247146105f2578063328dd982146106125780633659cfe61461064257610335565b806317977c61116102f257806320606b70116102cc57806320606b7014610568578063215809ca1461059c57806324bc1a64146105b157806325fd935a146105d157610335565b806317977c61146104fb57806317ba1b8b146105285780631dfb1b5a1461054857610335565b8063013cf08b1461033a57806302a251a31461041157806306b8aa491461043557806306fdde03146104575780630e63d807146104a35780630ea2d98c146104db575b600080fd5b34801561034657600080fd5b506103b6610355366004613fce565b606f602052600090815260409020805460018201546002830154600784015460088501546009860154600a870154600b880154600c9098015496976001600160a01b0390961696949593949293919290919060ff808216916101009004168a565b604080519a8b526001600160a01b0390991660208b0152978901969096526060880194909452608087019290925260a086015260c085015260e084015215156101008301521515610120820152610140015b60405180910390f35b34801561041d57600080fd5b5061042760695481565b604051908152602001610408565b34801561044157600080fd5b50610455610450366004613d73565b610b55565b005b34801561046357600080fd5b506104966040518060400160405280601381526020017243756c7420476f7665726e6f7220427261766f60681b81525081565b60405161040891906143b3565b3480156104af57600080fd5b50606e546104c3906001600160a01b031681565b6040516001600160a01b039091168152602001610408565b3480156104e757600080fd5b506104556104f6366004613fce565b610ccb565b34801561050757600080fd5b50610427610516366004613d73565b60706020526000908152604090205481565b34801561053457600080fd5b50610455610543366004613fce565b610d45565b34801561055457600080fd5b50610455610563366004613fce565b610dc3565b34801561057457600080fd5b506104277f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b3480156105a857600080fd5b50610427600181565b3480156105bd57600080fd5b506104276b033b2e3c9fd0803ce800000081565b3480156105dd57600080fd5b506104276c4bbb0bace1a6bd937d8000000081565b3480156105fe57600080fd5b506066546104c3906001600160a01b031681565b34801561061e57600080fd5b5061063261062d366004613fce565b610e31565b6040516104089493929190614333565b34801561064e57600080fd5b5061045561065d366004613d73565b6110c2565b34801561066e57600080fd5b5061042761067d366004613d73565b60716020526000908152604090205481565b34801561069b57600080fd5b5061042760685481565b3480156106b157600080fd5b506106c56106c0366004613d73565b61118b565b6040519015158152602001610408565b3480156106e157600080fd5b506104556106f03660046140b5565b6111ac565b34801561070157600080fd5b50610715610710366004613fce565b61141c565b604051610408919061438b565b34801561072e57600080fd5b5061045561073d366004613fce565b6115eb565b34801561074e57600080fd5b5061045561075d366004613e37565b6118a6565b610455610770366004613deb565b61193a565b34801561078157600080fd5b50610455610790366004614011565b6119f4565b3480156107a157600080fd5b506067546104c3906001600160a01b031681565b3480156107c157600080fd5b506076546104c3906001600160a01b031681565b3480156107e157600080fd5b5061042760755481565b3480156107f757600080fd5b506104c3610806366004613fce565b6073602052600090815260409020546001600160a01b031681565b34801561082d57600080fd5b50610427690a968163f0a57b40000081565b34801561084b57600080fd5b5061045561085a366004614033565b611a56565b34801561086b57600080fd5b50610427600a81565b34801561088057600080fd5b5061045561088f366004613d73565b611aa6565b3480156108a057600080fd5b50610455611b24565b3480156108b557600080fd5b5061042762013b0081565b3480156108cc57600080fd5b50610427619d8081565b3480156108e257600080fd5b506104556108f1366004613d8d565b611b8e565b34801561090257600080fd5b50610427606a5481565b34801561091857600080fd5b50610455610927366004613d73565b611f8a565b34801561093857600080fd5b506072546104c3906001600160a01b031681565b34801561095857600080fd5b50606d546104c3906001600160a01b031681565b34801561097857600080fd5b5061042760745481565b34801561098e57600080fd5b50610427606c5481565b3480156109a457600080fd5b506104276109b3366004613e60565b612002565b3480156109c457600080fd5b506104556109d3366004613fce565b6126ff565b3480156109e457600080fd5b506104277f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b348015610a1857600080fd5b50610a9b610a27366004613fe6565b6040805160608101825260008082526020820181905291810191909152506000918252606f602090815260408084206001600160a01b03939093168452600d9092018152918190208151606081018352815460ff808216151583526101009091041693810193909352600101549082015290565b6040805182511515815260208084015160ff16908201529181015190820152606001610408565b348015610ace57600080fd5b50610455612a4c565b348015610ae357600080fd5b506104c3612aba565b348015610af857600080fd5b506065546104c3906001600160a01b031681565b348015610b1857600080fd5b50610455610b27366004613d73565b612c57565b348015610b3857600080fd5b50610427606b5481565b610455610b50366004613fce565b612cb9565b6065546001600160a01b03163314610bcb5760405162461bcd60e51b815260206004820152602e60248201527f476f7665726e6f72427261766f3a3a5f736574496e766573746565446574616960448201526d6c733a2061646d696e206f6e6c7960901b60648201526084015b60405180910390fd5b6001600160a01b038116610c3a5760405162461bcd60e51b815260206004820152603060248201527f476f7665726e6f72427261766f3a3a5f736574496e766573746565446574616960448201526f6c733a207a65726f206164647265737360801b6064820152608401610bc2565b60748054600090815260736020526040902080546001600160a01b0319166001600160a01b03841617905554610c71906001612f59565b6074819055507f59f0b8051a7417e410325aa8686c7c34f2dbabef2f0d168ae2753b7a8049f63781610ca66074546001612fb3565b604080516001600160a01b03909316835260208301919091520160405180910390a150565b60405162461bcd60e51b815260206004820152603d60248201527f476f7665726e6f72427261766f3a3a5f736574566f74696e67506572696f643a60448201527f2064697361626c6520766f74696e6720706572696f64207570646174650000006064820152608401610bc2565b60405180910390a15050565b60405162461bcd60e51b815260206004820152604760248201527f476f7665726e6f72427261766f3a3a5f73657450726f706f73616c546872657360448201527f686f6c643a2064697361626c652070726f706f73616c207468726573686f6c646064820152662075706461746560c81b608482015260a401610bc2565b60405162461bcd60e51b815260206004820152603b60248201527f476f7665726e6f72427261766f3a3a5f736574566f74696e6744656c61793a2060448201527f64697361626c6520766f74696e672064656c61792075706461746500000000006064820152608401610bc2565b6060806060806000606f600087815260200190815260200160002090508060030181600401826005018360060183805480602002602001604051908101604052809291908181526020018280548015610eb357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610e95575b5050505050935082805480602002602001604051908101604052809291908181526020018280548015610f0557602002820191906000526020600020905b815481526020019060010190808311610ef1575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b82821015610fd9578382906000526020600020018054610f4c90614615565b80601f0160208091040260200160405190810160405280929190818152602001828054610f7890614615565b8015610fc55780601f10610f9a57610100808354040283529160200191610fc5565b820191906000526020600020905b815481529060010190602001808311610fa857829003601f168201915b505050505081526020019060010190610f2d565b50505050915080805480602002602001604051908101604052809291908181526020016000905b828210156110ac57838290600052602060002001805461101f90614615565b80601f016020809104026020016040519081016040528092919081815260200182805461104b90614615565b80156110985780601f1061106d57610100808354040283529160200191611098565b820191906000526020600020905b81548152906001019060200180831161107b57829003601f168201915b505050505081526020019060010190611000565b5050505090509450945094509450509193509193565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016141561110b5760405162461bcd60e51b8152600401610bc2906143c6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661113d613007565b6001600160a01b0316146111635760405162461bcd60e51b8152600401610bc290614412565b61116c81613035565b604080516000808252602082019092526111889183919061309d565b50565b6001600160a01b03811660009081526071602052604090205442105b919050565b604080518082018252601381527243756c7420476f7665726e6f7220427261766f60681b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f737371b23a9404658d19548f99fef9f44ff7fb296db43047130035e99e409d3681840152466060820152306080808301919091528351808303909101815260a0820184528051908301207f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f60c083015260e0820189905260ff8816610100808401919091528451808403909101815261012083019094528351939092019290922061190160f01b6101408401526101428301829052610162830181905290916000906101820160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa15801561132f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166113aa5760405162461bcd60e51b815260206004820152602f60248201527f476f7665726e6f72427261766f3a3a63617374566f746542795369673a20696e60448201526e76616c6964207369676e617475726560881b6064820152608401610bc2565b806001600160a01b03167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda48a8a6113e2858e8e6131e8565b6040805193845260ff90921660208401529082015260806060820181905260009082015260a00160405180910390a2505050505050505050565b600081606c54101580156114315750606b5482115b61148f5760405162461bcd60e51b815260206004820152602960248201527f476f7665726e6f72427261766f3a3a73746174653a20696e76616c69642070726044820152681bdc1bdcd85b081a5960ba1b6064820152608401610bc2565b6000828152606f60205260409020600c81015460ff16156114b45760029150506111a7565b806007015443116114c95760009150506111a7565b806008015443116114de5760019150506111a7565b80600a0154816009015411158061150457506b033b2e3c9fd0803ce80000008160090154105b156115135760039150506111a7565b60028101546115265760049150506111a7565b600c810154610100900460ff16156115425760079150506111a7565b6002810154606d54604080516360d143f160e11b815290516115cb93926001600160a01b03169163c1a287e2916004808301926020929190829003018186803b15801561158e57600080fd5b505afa1580156115a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c69190613f4c565b612f59565b42106115db5760069150506111a7565b60059150506111a7565b50919050565b60076115f68261141c565b600781111561161557634e487b7160e01b600052602160045260246000fd5b14156116825760405162461bcd60e51b815260206004820152603660248201527f476f7665726e6f72427261766f3a3a63616e63656c3a2063616e6e6f742063616044820152751b98d95b08195e1958dd5d1959081c1c9bdc1bdcd85b60521b6064820152608401610bc2565b6000818152606f6020526040902060018101546001600160a01b031633146117125760405162461bcd60e51b815260206004820152603860248201527f476f7665726e6f72427261766f3a3a63616e63656c3a204f746865722075736560448201527f722063616e6e6f742063616e63656c2070726f706f73616c00000000000000006064820152608401610bc2565b600c8101805460ff1916600117905560005b600382015481101561187557606d546003830180546001600160a01b039092169163591fcdfe91908490811061176a57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546004850180546001600160a01b0390921691859081106117a657634e487b7160e01b600052603260045260246000fd5b90600052602060002001548560050185815481106117d457634e487b7160e01b600052603260045260246000fd5b9060005260206000200186600601868154811061180157634e487b7160e01b600052603260045260246000fd5b9060005260206000200187600201546040518663ffffffff1660e01b81526004016118309594939291906142fa565b600060405180830381600087803b15801561184a57600080fd5b505af115801561185e573d6000803e3d6000fd5b50505050808061186d9061464a565b915050611724565b506040518281527f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c90602001610d39565b60405162461bcd60e51b815260206004820152605a60248201527f476f7665726e6f72427261766f3a3a5f73657457686974656c6973744163636f60448201527f756e7445787069726174696f6e3a2064697361626c652077686974656c69737460648201527f206163636f756e742065787069726174696f6e20757064617465000000000000608482015260a401610bc2565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156119835760405162461bcd60e51b8152600401610bc2906143c6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166119b5613007565b6001600160a01b0316146119db5760405162461bcd60e51b8152600401610bc290614412565b6119e482613035565b6119f08282600161309d565b5050565b337fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda48383611a238483836131e8565b6040805193845260ff90921660208401529082015260806060820181905260009082015260a00160405180910390a25050565b337fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda48585611a858483836131e8565b8686604051611a989594939291906144f6565b60405180910390a250505050565b60405162461bcd60e51b815260206004820152604760248201527f476f7665726e6f72427261766f3a3a5f73657457686974656c6973744775617260448201527f6469616e3a2064697361626c652077686974656c69737420677561726469616e6064820152662075706461746560c81b608482015260a401610bc2565b606d60009054906101000a90046001600160a01b03166001600160a01b0316630e18b6816040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611b7457600080fd5b505af1158015611b88573d6000803e3d6000fd5b50505050565b600054610100900460ff16611ba95760005460ff1615611bad565b303b155b611c105760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610bc2565b600054610100900460ff16158015611c3b576000805460ff1961ff0019909116610100171660011790555b606d546001600160a01b031615611cb05760405162461bcd60e51b815260206004820152603360248201527f476f7665726e6f72427261766f3a3a696e697469616c697a653a2063616e206f6044820152726e6c7920696e697469616c697a65206f6e636560681b6064820152608401610bc2565b6001600160a01b038716611d105760405162461bcd60e51b815260206004820152603360248201526000805160206146b283398151915260448201527269642074696d656c6f636b206164647265737360681b6064820152608401610bc2565b6001600160a01b038616611d6d5760405162461bcd60e51b815260206004820152603060248201526000805160206146b283398151915260448201526f6964206443756c74206164647265737360801b6064820152608401610bc2565b60018510158015611d81575062013b008511155b611dd45760405162461bcd60e51b815260206004820152603060248201526000805160206146b283398151915260448201526f1a59081d9bdd1a5b99c81c195c9a5bd960821b6064820152608401610bc2565b60018410158015611de75750619d808411155b611e395760405162461bcd60e51b815260206004820152602f60248201526000805160206146b283398151915260448201526e696420766f74696e672064656c617960881b6064820152608401610bc2565b690a968163f0a57b4000008310158015611e6057506c4bbb0bace1a6bd937d800000008311155b611eb85760405162461bcd60e51b815260206004820152603560248201526000805160206146b28339815191526044820152741a59081c1c9bdc1bdcd85b081d1a1c995cda1bdb19605a1b6064820152608401610bc2565b6001600160a01b038216611f185760405162461bcd60e51b815260206004820152603360248201526000805160206146b28339815191526044820152726964207472656173757279206164647265737360681b6064820152608401610bc2565b606d80546001600160a01b03199081166001600160a01b038a8116918217909355606e805483168a851617905560698890556068879055606a8690556065805483169091179055607680549091169184169190911790558015611f81576000805461ff00191690555b50505050505050565b60405162461bcd60e51b815260206004820152604160248201527f476f7665726e6f72427261766f3a3a5f73657450656e64696e6741646d696e3a60448201527f2064697361626c65207365742070656e64696e672061646d696e2075706461746064820152606560f81b608482015260a401610bc2565b6040517f5f736574496e76657374656544657461696c73286164647265737329000000006020820152600090603c01604051602081830303815290604052805190602001208460008151811061206857634e487b7160e01b600052603260045260246000fd5b60200260200101516040516020016120809190614292565b60405160208183030381529060405280519060200120146120f45760405162461bcd60e51b815260206004820152602860248201527f476f7665726e6f72427261766f3a3a70726f706f73653a20696e76616c6964206044820152671c1c9bdc1bdcd85b60c21b6064820152608401610bc2565b606e54604051636e2e2d7360e01b8152600060048201523360248201526001600160a01b0390911690636e2e2d7390604401602060405180830381600087803b15801561214057600080fd5b505af1158015612154573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121789190613f2c565b6121d45760405162461bcd60e51b815260206004820152602760248201527f476f7665726e6f72427261766f3a3a70726f706f73653a206f6e6c7920746f706044820152661039ba30b5b2b960c91b6064820152608401610bc2565b6001865111156122375760405162461bcd60e51b815260206004820152602860248201527f476f7665726e6f72427261766f3a3a70726f706f73653a20746f6f206d616e79604482015267207461726765747360c01b6064820152608401610bc2565b84518651148015612249575083518651145b8015612256575082518651145b6122d65760405162461bcd60e51b8152602060048201526044602482018190527f476f7665726e6f72427261766f3a3a70726f706f73653a2070726f706f73616c908201527f2066756e6374696f6e20696e666f726d6174696f6e206172697479206d69736d6064820152630c2e8c6d60e31b608482015260a401610bc2565b85516123395760405162461bcd60e51b815260206004820152602c60248201527f476f7665726e6f72427261766f3a3a70726f706f73653a206d7573742070726f60448201526b7669646520616374696f6e7360a01b6064820152608401610bc2565b600a8651111561239c5760405162461bcd60e51b815260206004820152602860248201527f476f7665726e6f72427261766f3a3a70726f706f73653a20746f6f206d616e7960448201526720616374696f6e7360c01b6064820152608401610bc2565b3360009081526070602052604090205480156125395760006123bd8261141c565b905060018160078111156123e157634e487b7160e01b600052602160045260246000fd5b141561247b5760405162461bcd60e51b815260206004820152605860248201527f476f7665726e6f72427261766f3a3a70726f706f73653a206f6e65206c69766560448201527f2070726f706f73616c207065722070726f706f7365722c20666f756e6420616e60648201527f20616c7265616479206163746976652070726f706f73616c0000000000000000608482015260a401610bc2565b600081600781111561249d57634e487b7160e01b600052602160045260246000fd5b14156125375760405162461bcd60e51b815260206004820152605960248201527f476f7665726e6f72427261766f3a3a70726f706f73653a206f6e65206c69766560448201527f2070726f706f73616c207065722070726f706f7365722c20666f756e6420616e60648201527f20616c72656164792070656e64696e672070726f706f73616c00000000000000608482015260a401610bc2565b505b600061254743606854612f59565b9050600061255782606954612f59565b606c805491925060006125698361464a565b9091555050606c546000818152606f6020908152604082209283556001830180546001600160a01b0319163317905560028301919091558a516125b4916003840191908d0190613938565b5088516125ca90600483019060208c019061399d565b5087516125e090600583019060208b01906139d8565b5086516125f690600683019060208a0190613a31565b5082816007018190555081816008018190555060008160090181905550600081600a0181905550600081600b0181905550600081600c0160006101000a81548160ff021916908315150217905550600081600c0160016101000a81548160ff0219169083151502179055508060000154607060008360010160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001908152602001600020819055507f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e08160000154338c8c8c8c89898e6040516126e99998979695949392919061445e565b60405180910390a1549998505050505050505050565b600461270a8261141c565b600781111561272957634e487b7160e01b600052602160045260246000fd5b146127aa5760405162461bcd60e51b8152602060048201526044602482018190527f476f7665726e6f72427261766f3a3a71756575653a2070726f706f73616c2063908201527f616e206f6e6c79206265207175657565642069662069742069732073756363656064820152631959195960e21b608482015260a401610bc2565b6000818152606f60209081526040808320606d548251630d48571f60e31b815292519194936128049342936001600160a01b0390931692636a42b8f892600480840193919291829003018186803b15801561158e57600080fd5b905060005b6003830154811015612a06576129f483600301828154811061283b57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546004850180546001600160a01b03909216918490811061287757634e487b7160e01b600052603260045260246000fd5b90600052602060002001548560050184815481106128a557634e487b7160e01b600052603260045260246000fd5b9060005260206000200180546128ba90614615565b80601f01602080910402602001604051908101604052809291908181526020018280546128e690614615565b80156129335780601f1061290857610100808354040283529160200191612933565b820191906000526020600020905b81548152906001019060200180831161291657829003601f168201915b505050505086600601858154811061295b57634e487b7160e01b600052603260045260246000fd5b90600052602060002001805461297090614615565b80601f016020809104026020016040519081016040528092919081815260200182805461299c90614615565b80156129e95780601f106129be576101008083540402835291602001916129e9565b820191906000526020600020905b8154815290600101906020018083116129cc57829003601f168201915b50505050508661355a565b806129fe8161464a565b915050612809565b506002820181905560408051848152602081018390527f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda2892910160405180910390a1505050565b60405162461bcd60e51b815260206004820152603860248201527f476f7665726e6f72427261766f3a3a5f61636365707441646d696e3a2064697360448201527f61626c65206163636570742061646d696e2075706461746500000000000000006064820152608401610bc2565b6076546000906001600160a01b03163314612b2b5760405162461bcd60e51b815260206004820152602b60248201527f476f7665726e6f72427261766f3a3a5f66756e64496e7665737465653a20747260448201526a656173757279206f6e6c7960a81b6064820152608401610bc2565b6074546075541115612b955760405162461bcd60e51b815260206004820152602d60248201527f476f7665726e6f72427261766f3a3a5f66756e64496e7665737465653a204e6f60448201526c206e657720696e76657374656560981b6064820152608401610bc2565b612ba26075546001612f59565b6075819055507fc5c30592579df2868ccc9809f55485e57c9503d99abf37c40e084f99709f2e2060736000612bda6075546001612fb3565b81526020810191909152604001600020546075546001600160a01b0390911690612c05906001612fb3565b604080516001600160a01b03909316835260208301919091520160405180910390a160736000612c386075546001612fb3565b81526020810191909152604001600020546001600160a01b0316905090565b60405162461bcd60e51b815260206004820152603160248201527f476f7665726e6f72427261766f3a3a5f696e6974696174653a2064697361626c6044820152706520696e6974696174652075706461746560781b6064820152608401610bc2565b6005612cc48261141c565b6007811115612ce357634e487b7160e01b600052602160045260246000fd5b14612d645760405162461bcd60e51b815260206004820152604560248201527f476f7665726e6f72427261766f3a3a657865637574653a2070726f706f73616c60448201527f2063616e206f6e6c7920626520657865637574656420696620697420697320716064820152641d595d595960da1b608482015260a401610bc2565b6000818152606f60205260408120600c8101805461ff001916610100179055905b6003820154811015612f2857606d546004830180546001600160a01b0390921691630825f38f919084908110612dcb57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154846003018481548110612df957634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546004860180546001600160a01b039092169186908110612e3557634e487b7160e01b600052603260045260246000fd5b9060005260206000200154866005018681548110612e6357634e487b7160e01b600052603260045260246000fd5b90600052602060002001876006018781548110612e9057634e487b7160e01b600052603260045260246000fd5b9060005260206000200188600201546040518763ffffffff1660e01b8152600401612ebf9594939291906142fa565b6000604051808303818588803b158015612ed857600080fd5b505af1158015612eec573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052612f159190810190613f64565b5080612f208161464a565b915050612d85565b506040518281527f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f90602001610d39565b600080612f6683856145ba565b905083811015612fac5760405162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b6044820152606401610bc2565b9392505050565b600082821115612ffd5760405162461bcd60e51b81526020600482015260156024820152747375627472616374696f6e20756e646572666c6f7760581b6044820152606401610bc2565b612fac82846145d2565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6065546001600160a01b031633146111885760405162461bcd60e51b815260206004820152602560248201527f4f6e6c792061646d696e2063616e207570677261646520696d706c656d656e7460448201526430ba34b7b760d91b6064820152608401610bc2565b60006130a7613007565b90506130b28461372f565b6000835111806130bf5750815b156130d0576130ce84846137d4565b505b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143805460ff166131e157805460ff191660011781556040516001600160a01b038316602482015261314f90869060440160408051601f198184030181529190526020810180516001600160e01b0316631b2ce7f360e11b1790526137d4565b50805460ff19168155613160613007565b6001600160a01b0316826001600160a01b0316146131d85760405162461bcd60e51b815260206004820152602f60248201527f45524331393637557067726164653a207570677261646520627265616b73206660448201526e75727468657220757067726164657360881b6064820152608401610bc2565b6131e1856138bf565b5050505050565b606e54604051636e2e2d7360e01b8152600060048201819052336024830152916001600160a01b031690636e2e2d7390604401602060405180830381600087803b15801561323557600080fd5b505af1158015613249573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061326d9190613f2c565b156132ce5760405162461bcd60e51b8152602060048201526037602482015260008051602061469283398151915260448201527f20546f70207374616b65722063616e6e6f7420766f74650000000000000000006064820152608401610bc2565b60016132d98461141c565b60078111156132f857634e487b7160e01b600052602160045260246000fd5b1461334d5760405162461bcd60e51b81526020600482015260316024820152600080516020614692833981519152604482015270081d9bdd1a5b99c81a5cc818db1bdcd959607a1b6064820152608401610bc2565b60028260ff1611156133aa5760405162461bcd60e51b8152602060048201526032602482015260008051602061469283398151915260448201527120696e76616c696420766f7465207479706560701b6064820152608401610bc2565b6000838152606f602090815260408083206001600160a01b0388168452600d8101909252909120805460ff161561342e5760405162461bcd60e51b81526020600482015260346024820152600080516020614692833981519152604482015273081d9bdd195c88185b1c9958591e481d9bdd195960621b6064820152608401610bc2565b606e546007830154604051630748d63560e31b81526000926001600160a01b031691633a46b1a891613478918b916004016001600160a01b03929092168252602082015260400190565b60206040518083038186803b15801561349057600080fd5b505afa1580156134a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134c89190613f4c565b905060ff85166134ea576134e083600a015482612f59565b600a84015561352e565b8460ff166001141561350e57613504836009015482612f59565b600984015561352e565b8460ff166002141561352e5761352883600b015482612f59565b600b8401555b8154600160ff19909116811761ff00191661010060ff8816021783559091018190559150509392505050565b606d546040516001600160a01b039091169063f2b065379061358890889088908890889088906020016142ae565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004016135bc91815260200190565b60206040518083038186803b1580156135d457600080fd5b505afa1580156135e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061360c9190613f2c565b1561369d5760405162461bcd60e51b815260206004820152605560248201527f476f7665726e6f72427261766f3a3a71756575654f72526576657274496e746560448201527f726e616c3a206964656e746963616c2070726f706f73616c20616374696f6e20606482015274616c7265616479207175657565642061742065746160581b608482015260a401610bc2565b606d54604051633a66f90160e01b81526001600160a01b0390911690633a66f901906136d590889088908890889088906004016142ae565b602060405180830381600087803b1580156136ef57600080fd5b505af1158015613703573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137279190613f4c565b505050505050565b803b6137935760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610bc2565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060823b6138335760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610bc2565b600080846001600160a01b03168460405161384e9190614292565b600060405180830381855af49150503d8060008114613889576040519150601f19603f3d011682016040523d82523d6000602084013e61388e565b606091505b50915091506138b682826040518060600160405280602781526020016146d2602791396138ff565b95945050505050565b6138c88161372f565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060831561390e575081612fac565b82511561391e5782518084602001fd5b8160405162461bcd60e51b8152600401610bc291906143b3565b82805482825590600052602060002090810192821561398d579160200282015b8281111561398d57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613958565b50613999929150613a8a565b5090565b82805482825590600052602060002090810192821561398d579160200282015b8281111561398d5782518255916020019190600101906139bd565b828054828255906000526020600020908101928215613a25579160200282015b82811115613a255782518051613a15918491602090910190613a9f565b50916020019190600101906139f8565b50613999929150613b12565b828054828255906000526020600020908101928215613a7e579160200282015b82811115613a7e5782518051613a6e918491602090910190613a9f565b5091602001919060010190613a51565b50613999929150613b2f565b5b808211156139995760008155600101613a8b565b828054613aab90614615565b90600052602060002090601f016020900481019282613acd576000855561398d565b82601f10613ae657805160ff191683800117855561398d565b8280016001018555821561398d579182018281111561398d5782518255916020019190600101906139bd565b80821115613999576000613b268282613b4c565b50600101613b12565b80821115613999576000613b438282613b4c565b50600101613b2f565b508054613b5890614615565b6000825580601f10613b6a5750611188565b601f0160209004906000526020600020908101906111889190613a8a565b80356001600160a01b03811681146111a757600080fd5b600082601f830112613baf578081fd5b81356020613bc4613bbf8361456e565b61453d565b8281528181019085830183850287018401881015613be0578586fd5b855b85811015613c0557613bf382613b88565b84529284019290840190600101613be2565b5090979650505050505050565b600082601f830112613c22578081fd5b81356020613c32613bbf8361456e565b82815281810190858301855b85811015613c0557613c55898684358b0101613d16565b84529284019290840190600101613c3e565b600082601f830112613c77578081fd5b81356020613c87613bbf8361456e565b82815281810190858301855b85811015613c0557613caa898684358b0101613d16565b84529284019290840190600101613c93565b600082601f830112613ccc578081fd5b81356020613cdc613bbf8361456e565b8281528181019085830183850287018401881015613cf8578586fd5b855b85811015613c0557813584529284019290840190600101613cfa565b600082601f830112613d26578081fd5b8135613d34613bbf82614592565b818152846020838601011115613d48578283fd5b816020850160208301379081016020019190915292915050565b803560ff811681146111a757600080fd5b600060208284031215613d84578081fd5b612fac82613b88565b60008060008060008060c08789031215613da5578182fd5b613dae87613b88565b9550613dbc60208801613b88565b9450604087013593506060870135925060808701359150613ddf60a08801613b88565b90509295509295509295565b60008060408385031215613dfd578182fd5b613e0683613b88565b9150602083013567ffffffffffffffff811115613e21578182fd5b613e2d85828601613d16565b9150509250929050565b60008060408385031215613e49578182fd5b613e5283613b88565b946020939093013593505050565b600080600080600060a08688031215613e77578283fd5b853567ffffffffffffffff80821115613e8e578485fd5b613e9a89838a01613b9f565b96506020880135915080821115613eaf578485fd5b613ebb89838a01613cbc565b95506040880135915080821115613ed0578485fd5b613edc89838a01613c67565b94506060880135915080821115613ef1578283fd5b613efd89838a01613c12565b93506080880135915080821115613f12578283fd5b50613f1f88828901613d16565b9150509295509295909350565b600060208284031215613f3d578081fd5b81518015158114612fac578182fd5b600060208284031215613f5d578081fd5b5051919050565b600060208284031215613f75578081fd5b815167ffffffffffffffff811115613f8b578182fd5b8201601f81018413613f9b578182fd5b8051613fa9613bbf82614592565b818152856020838501011115613fbd578384fd5b6138b68260208301602086016145e9565b600060208284031215613fdf578081fd5b5035919050565b60008060408385031215613ff8578182fd5b8235915061400860208401613b88565b90509250929050565b60008060408385031215614023578182fd5b8235915061400860208401613d62565b60008060008060608587031215614048578182fd5b8435935061405860208601613d62565b9250604085013567ffffffffffffffff80821115614074578384fd5b818701915087601f830112614087578384fd5b813581811115614095578485fd5b8860208285010111156140a6578485fd5b95989497505060200194505050565b600080600080600060a086880312156140cc578283fd5b853594506140dc60208701613d62565b93506140ea60408701613d62565b94979396509394606081013594506080013592915050565b6000815180845260208085019450808401835b8381101561413a5781516001600160a01b031687529582019590820190600101614115565b509495945050505050565b6000815180845260208085018081965082840281019150828601855b8581101561418b5782840389526141798483516141c7565b98850198935090840190600101614161565b5091979650505050505050565b6000815180845260208085019450808401835b8381101561413a578151875295820195908201906001016141ab565b600081518084526141df8160208601602086016145e9565b601f01601f19169290920160200192915050565b80546000906002810460018083168061420d57607f831692505b602080841082141561422d57634e487b7160e01b86526022600452602486fd5b838852818015614244576001811461425857614286565b60ff19861689830152604089019650614286565b876000528160002060005b8681101561427e5781548b8201850152908501908301614263565b8a0183019750505b50505050505092915050565b600082516142a48184602087016145e9565b9190910192915050565b600060018060a01b038716825285602083015260a060408301526142d560a08301866141c7565b82810360608401526142e781866141c7565b9150508260808301529695505050505050565b600060018060a01b038716825285602083015260a0604083015261432160a08301866141f3565b82810360608401526142e781866141f3565b6000608082526143466080830187614102565b82810360208401526143588187614198565b9050828103604084015261436c8186614145565b905082810360608401526143808185614145565b979650505050505050565b60208101600883106143ad57634e487b7160e01b600052602160045260246000fd5b91905290565b600060208252612fac60208301846141c7565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b8981526001600160a01b0389166020820152610120604082018190526000906144898382018b614102565b9050828103606084015261449d818a614198565b905082810360808401526144b18189614145565b905082810360a08401526144c58188614145565b90508560c08401528460e08401528281036101008401526144e681856141c7565b9c9b505050505050505050505050565b600086825260ff8616602083015284604083015260806060830152826080830152828460a084013781830160a090810191909152601f909201601f19160101949350505050565b604051601f8201601f1916810167ffffffffffffffff811182821017156145665761456661467b565b604052919050565b600067ffffffffffffffff8211156145885761458861467b565b5060209081020190565b600067ffffffffffffffff8211156145ac576145ac61467b565b50601f01601f191660200190565b600082198211156145cd576145cd614665565b500190565b6000828210156145e4576145e4614665565b500390565b60005b838110156146045781810151838201526020016145ec565b83811115611b885750506000910152565b60028104600182168061462957607f821691505b602082108114156115e557634e487b7160e01b600052602260045260246000fd5b600060001982141561465e5761465e614665565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfe476f7665726e6f72427261766f3a3a63617374566f7465496e7465726e616c3a476f7665726e6f72427261766f3a3a696e697469616c697a653a20696e76616c416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122055fd33c7823b25d903d08595200f0d28f838aa580a49955d2262689f53951e2564736f6c63430008020033
Deployed Bytecode
0x6080604052600436106103355760003560e01c8063647abf78116101ab578063d33219b4116100f7578063e48083fe11610095578063f851a4401161006f578063f851a44014610aec578063f9d28b8014610b0c578063fc4eee4214610b2c578063fe0d94c114610b4257610335565b8063e48083fe1461059c578063e9c714f214610ac2578063f03cd27114610ad757610335565b8063da95691a116100d1578063da95691a14610998578063ddf0b009146109b8578063deaaa7cc146109d8578063e23a9a5214610a0c57610335565b8063d33219b41461094c578063d54db3481461096c578063da35c6641461098257610335565b8063a37ee07d11610164578063b1a5d12d1161013e578063b1a5d12d146108d6578063b58131b0146108f6578063b71d1a0c1461090c578063c5a8425d1461092c57610335565b8063a37ee07d14610894578063a64e024a146108a9578063b1126263146108c057610335565b8063647abf78146107d55780636754ae56146107eb578063791f5d23146108215780637b3c71d31461083f5780637bdbe4d01461085f578063995333651461087457610335565b806326782247116102855780633e4f49e6116102235780634f1ef286116101fd5780634f1ef2861461076257806356781388146107755780635c60da1b1461079557806361d027b3146107b557610335565b80633e4f49e6146106f557806340e58ee5146107225780634d6733d21461074257610335565b806338bd0dda1161025f57806338bd0dda146106625780633932abb11461068f5780633af32abf146106a55780633bccf4fd146106d557610335565b806326782247146105f2578063328dd982146106125780633659cfe61461064257610335565b806317977c61116102f257806320606b70116102cc57806320606b7014610568578063215809ca1461059c57806324bc1a64146105b157806325fd935a146105d157610335565b806317977c61146104fb57806317ba1b8b146105285780631dfb1b5a1461054857610335565b8063013cf08b1461033a57806302a251a31461041157806306b8aa491461043557806306fdde03146104575780630e63d807146104a35780630ea2d98c146104db575b600080fd5b34801561034657600080fd5b506103b6610355366004613fce565b606f602052600090815260409020805460018201546002830154600784015460088501546009860154600a870154600b880154600c9098015496976001600160a01b0390961696949593949293919290919060ff808216916101009004168a565b604080519a8b526001600160a01b0390991660208b0152978901969096526060880194909452608087019290925260a086015260c085015260e084015215156101008301521515610120820152610140015b60405180910390f35b34801561041d57600080fd5b5061042760695481565b604051908152602001610408565b34801561044157600080fd5b50610455610450366004613d73565b610b55565b005b34801561046357600080fd5b506104966040518060400160405280601381526020017243756c7420476f7665726e6f7220427261766f60681b81525081565b60405161040891906143b3565b3480156104af57600080fd5b50606e546104c3906001600160a01b031681565b6040516001600160a01b039091168152602001610408565b3480156104e757600080fd5b506104556104f6366004613fce565b610ccb565b34801561050757600080fd5b50610427610516366004613d73565b60706020526000908152604090205481565b34801561053457600080fd5b50610455610543366004613fce565b610d45565b34801561055457600080fd5b50610455610563366004613fce565b610dc3565b34801561057457600080fd5b506104277f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b3480156105a857600080fd5b50610427600181565b3480156105bd57600080fd5b506104276b033b2e3c9fd0803ce800000081565b3480156105dd57600080fd5b506104276c4bbb0bace1a6bd937d8000000081565b3480156105fe57600080fd5b506066546104c3906001600160a01b031681565b34801561061e57600080fd5b5061063261062d366004613fce565b610e31565b6040516104089493929190614333565b34801561064e57600080fd5b5061045561065d366004613d73565b6110c2565b34801561066e57600080fd5b5061042761067d366004613d73565b60716020526000908152604090205481565b34801561069b57600080fd5b5061042760685481565b3480156106b157600080fd5b506106c56106c0366004613d73565b61118b565b6040519015158152602001610408565b3480156106e157600080fd5b506104556106f03660046140b5565b6111ac565b34801561070157600080fd5b50610715610710366004613fce565b61141c565b604051610408919061438b565b34801561072e57600080fd5b5061045561073d366004613fce565b6115eb565b34801561074e57600080fd5b5061045561075d366004613e37565b6118a6565b610455610770366004613deb565b61193a565b34801561078157600080fd5b50610455610790366004614011565b6119f4565b3480156107a157600080fd5b506067546104c3906001600160a01b031681565b3480156107c157600080fd5b506076546104c3906001600160a01b031681565b3480156107e157600080fd5b5061042760755481565b3480156107f757600080fd5b506104c3610806366004613fce565b6073602052600090815260409020546001600160a01b031681565b34801561082d57600080fd5b50610427690a968163f0a57b40000081565b34801561084b57600080fd5b5061045561085a366004614033565b611a56565b34801561086b57600080fd5b50610427600a81565b34801561088057600080fd5b5061045561088f366004613d73565b611aa6565b3480156108a057600080fd5b50610455611b24565b3480156108b557600080fd5b5061042762013b0081565b3480156108cc57600080fd5b50610427619d8081565b3480156108e257600080fd5b506104556108f1366004613d8d565b611b8e565b34801561090257600080fd5b50610427606a5481565b34801561091857600080fd5b50610455610927366004613d73565b611f8a565b34801561093857600080fd5b506072546104c3906001600160a01b031681565b34801561095857600080fd5b50606d546104c3906001600160a01b031681565b34801561097857600080fd5b5061042760745481565b34801561098e57600080fd5b50610427606c5481565b3480156109a457600080fd5b506104276109b3366004613e60565b612002565b3480156109c457600080fd5b506104556109d3366004613fce565b6126ff565b3480156109e457600080fd5b506104277f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b348015610a1857600080fd5b50610a9b610a27366004613fe6565b6040805160608101825260008082526020820181905291810191909152506000918252606f602090815260408084206001600160a01b03939093168452600d9092018152918190208151606081018352815460ff808216151583526101009091041693810193909352600101549082015290565b6040805182511515815260208084015160ff16908201529181015190820152606001610408565b348015610ace57600080fd5b50610455612a4c565b348015610ae357600080fd5b506104c3612aba565b348015610af857600080fd5b506065546104c3906001600160a01b031681565b348015610b1857600080fd5b50610455610b27366004613d73565b612c57565b348015610b3857600080fd5b50610427606b5481565b610455610b50366004613fce565b612cb9565b6065546001600160a01b03163314610bcb5760405162461bcd60e51b815260206004820152602e60248201527f476f7665726e6f72427261766f3a3a5f736574496e766573746565446574616960448201526d6c733a2061646d696e206f6e6c7960901b60648201526084015b60405180910390fd5b6001600160a01b038116610c3a5760405162461bcd60e51b815260206004820152603060248201527f476f7665726e6f72427261766f3a3a5f736574496e766573746565446574616960448201526f6c733a207a65726f206164647265737360801b6064820152608401610bc2565b60748054600090815260736020526040902080546001600160a01b0319166001600160a01b03841617905554610c71906001612f59565b6074819055507f59f0b8051a7417e410325aa8686c7c34f2dbabef2f0d168ae2753b7a8049f63781610ca66074546001612fb3565b604080516001600160a01b03909316835260208301919091520160405180910390a150565b60405162461bcd60e51b815260206004820152603d60248201527f476f7665726e6f72427261766f3a3a5f736574566f74696e67506572696f643a60448201527f2064697361626c6520766f74696e6720706572696f64207570646174650000006064820152608401610bc2565b60405180910390a15050565b60405162461bcd60e51b815260206004820152604760248201527f476f7665726e6f72427261766f3a3a5f73657450726f706f73616c546872657360448201527f686f6c643a2064697361626c652070726f706f73616c207468726573686f6c646064820152662075706461746560c81b608482015260a401610bc2565b60405162461bcd60e51b815260206004820152603b60248201527f476f7665726e6f72427261766f3a3a5f736574566f74696e6744656c61793a2060448201527f64697361626c6520766f74696e672064656c61792075706461746500000000006064820152608401610bc2565b6060806060806000606f600087815260200190815260200160002090508060030181600401826005018360060183805480602002602001604051908101604052809291908181526020018280548015610eb357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610e95575b5050505050935082805480602002602001604051908101604052809291908181526020018280548015610f0557602002820191906000526020600020905b815481526020019060010190808311610ef1575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b82821015610fd9578382906000526020600020018054610f4c90614615565b80601f0160208091040260200160405190810160405280929190818152602001828054610f7890614615565b8015610fc55780601f10610f9a57610100808354040283529160200191610fc5565b820191906000526020600020905b815481529060010190602001808311610fa857829003601f168201915b505050505081526020019060010190610f2d565b50505050915080805480602002602001604051908101604052809291908181526020016000905b828210156110ac57838290600052602060002001805461101f90614615565b80601f016020809104026020016040519081016040528092919081815260200182805461104b90614615565b80156110985780601f1061106d57610100808354040283529160200191611098565b820191906000526020600020905b81548152906001019060200180831161107b57829003601f168201915b505050505081526020019060010190611000565b5050505090509450945094509450509193509193565b306001600160a01b037f000000000000000000000000c6df585f8721bfafbb1580bd4034315696eab9ca16141561110b5760405162461bcd60e51b8152600401610bc2906143c6565b7f000000000000000000000000c6df585f8721bfafbb1580bd4034315696eab9ca6001600160a01b031661113d613007565b6001600160a01b0316146111635760405162461bcd60e51b8152600401610bc290614412565b61116c81613035565b604080516000808252602082019092526111889183919061309d565b50565b6001600160a01b03811660009081526071602052604090205442105b919050565b604080518082018252601381527243756c7420476f7665726e6f7220427261766f60681b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f737371b23a9404658d19548f99fef9f44ff7fb296db43047130035e99e409d3681840152466060820152306080808301919091528351808303909101815260a0820184528051908301207f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f60c083015260e0820189905260ff8816610100808401919091528451808403909101815261012083019094528351939092019290922061190160f01b6101408401526101428301829052610162830181905290916000906101820160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa15801561132f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166113aa5760405162461bcd60e51b815260206004820152602f60248201527f476f7665726e6f72427261766f3a3a63617374566f746542795369673a20696e60448201526e76616c6964207369676e617475726560881b6064820152608401610bc2565b806001600160a01b03167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda48a8a6113e2858e8e6131e8565b6040805193845260ff90921660208401529082015260806060820181905260009082015260a00160405180910390a2505050505050505050565b600081606c54101580156114315750606b5482115b61148f5760405162461bcd60e51b815260206004820152602960248201527f476f7665726e6f72427261766f3a3a73746174653a20696e76616c69642070726044820152681bdc1bdcd85b081a5960ba1b6064820152608401610bc2565b6000828152606f60205260409020600c81015460ff16156114b45760029150506111a7565b806007015443116114c95760009150506111a7565b806008015443116114de5760019150506111a7565b80600a0154816009015411158061150457506b033b2e3c9fd0803ce80000008160090154105b156115135760039150506111a7565b60028101546115265760049150506111a7565b600c810154610100900460ff16156115425760079150506111a7565b6002810154606d54604080516360d143f160e11b815290516115cb93926001600160a01b03169163c1a287e2916004808301926020929190829003018186803b15801561158e57600080fd5b505afa1580156115a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c69190613f4c565b612f59565b42106115db5760069150506111a7565b60059150506111a7565b50919050565b60076115f68261141c565b600781111561161557634e487b7160e01b600052602160045260246000fd5b14156116825760405162461bcd60e51b815260206004820152603660248201527f476f7665726e6f72427261766f3a3a63616e63656c3a2063616e6e6f742063616044820152751b98d95b08195e1958dd5d1959081c1c9bdc1bdcd85b60521b6064820152608401610bc2565b6000818152606f6020526040902060018101546001600160a01b031633146117125760405162461bcd60e51b815260206004820152603860248201527f476f7665726e6f72427261766f3a3a63616e63656c3a204f746865722075736560448201527f722063616e6e6f742063616e63656c2070726f706f73616c00000000000000006064820152608401610bc2565b600c8101805460ff1916600117905560005b600382015481101561187557606d546003830180546001600160a01b039092169163591fcdfe91908490811061176a57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546004850180546001600160a01b0390921691859081106117a657634e487b7160e01b600052603260045260246000fd5b90600052602060002001548560050185815481106117d457634e487b7160e01b600052603260045260246000fd5b9060005260206000200186600601868154811061180157634e487b7160e01b600052603260045260246000fd5b9060005260206000200187600201546040518663ffffffff1660e01b81526004016118309594939291906142fa565b600060405180830381600087803b15801561184a57600080fd5b505af115801561185e573d6000803e3d6000fd5b50505050808061186d9061464a565b915050611724565b506040518281527f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c90602001610d39565b60405162461bcd60e51b815260206004820152605a60248201527f476f7665726e6f72427261766f3a3a5f73657457686974656c6973744163636f60448201527f756e7445787069726174696f6e3a2064697361626c652077686974656c69737460648201527f206163636f756e742065787069726174696f6e20757064617465000000000000608482015260a401610bc2565b306001600160a01b037f000000000000000000000000c6df585f8721bfafbb1580bd4034315696eab9ca1614156119835760405162461bcd60e51b8152600401610bc2906143c6565b7f000000000000000000000000c6df585f8721bfafbb1580bd4034315696eab9ca6001600160a01b03166119b5613007565b6001600160a01b0316146119db5760405162461bcd60e51b8152600401610bc290614412565b6119e482613035565b6119f08282600161309d565b5050565b337fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda48383611a238483836131e8565b6040805193845260ff90921660208401529082015260806060820181905260009082015260a00160405180910390a25050565b337fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda48585611a858483836131e8565b8686604051611a989594939291906144f6565b60405180910390a250505050565b60405162461bcd60e51b815260206004820152604760248201527f476f7665726e6f72427261766f3a3a5f73657457686974656c6973744775617260448201527f6469616e3a2064697361626c652077686974656c69737420677561726469616e6064820152662075706461746560c81b608482015260a401610bc2565b606d60009054906101000a90046001600160a01b03166001600160a01b0316630e18b6816040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611b7457600080fd5b505af1158015611b88573d6000803e3d6000fd5b50505050565b600054610100900460ff16611ba95760005460ff1615611bad565b303b155b611c105760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610bc2565b600054610100900460ff16158015611c3b576000805460ff1961ff0019909116610100171660011790555b606d546001600160a01b031615611cb05760405162461bcd60e51b815260206004820152603360248201527f476f7665726e6f72427261766f3a3a696e697469616c697a653a2063616e206f6044820152726e6c7920696e697469616c697a65206f6e636560681b6064820152608401610bc2565b6001600160a01b038716611d105760405162461bcd60e51b815260206004820152603360248201526000805160206146b283398151915260448201527269642074696d656c6f636b206164647265737360681b6064820152608401610bc2565b6001600160a01b038616611d6d5760405162461bcd60e51b815260206004820152603060248201526000805160206146b283398151915260448201526f6964206443756c74206164647265737360801b6064820152608401610bc2565b60018510158015611d81575062013b008511155b611dd45760405162461bcd60e51b815260206004820152603060248201526000805160206146b283398151915260448201526f1a59081d9bdd1a5b99c81c195c9a5bd960821b6064820152608401610bc2565b60018410158015611de75750619d808411155b611e395760405162461bcd60e51b815260206004820152602f60248201526000805160206146b283398151915260448201526e696420766f74696e672064656c617960881b6064820152608401610bc2565b690a968163f0a57b4000008310158015611e6057506c4bbb0bace1a6bd937d800000008311155b611eb85760405162461bcd60e51b815260206004820152603560248201526000805160206146b28339815191526044820152741a59081c1c9bdc1bdcd85b081d1a1c995cda1bdb19605a1b6064820152608401610bc2565b6001600160a01b038216611f185760405162461bcd60e51b815260206004820152603360248201526000805160206146b28339815191526044820152726964207472656173757279206164647265737360681b6064820152608401610bc2565b606d80546001600160a01b03199081166001600160a01b038a8116918217909355606e805483168a851617905560698890556068879055606a8690556065805483169091179055607680549091169184169190911790558015611f81576000805461ff00191690555b50505050505050565b60405162461bcd60e51b815260206004820152604160248201527f476f7665726e6f72427261766f3a3a5f73657450656e64696e6741646d696e3a60448201527f2064697361626c65207365742070656e64696e672061646d696e2075706461746064820152606560f81b608482015260a401610bc2565b6040517f5f736574496e76657374656544657461696c73286164647265737329000000006020820152600090603c01604051602081830303815290604052805190602001208460008151811061206857634e487b7160e01b600052603260045260246000fd5b60200260200101516040516020016120809190614292565b60405160208183030381529060405280519060200120146120f45760405162461bcd60e51b815260206004820152602860248201527f476f7665726e6f72427261766f3a3a70726f706f73653a20696e76616c6964206044820152671c1c9bdc1bdcd85b60c21b6064820152608401610bc2565b606e54604051636e2e2d7360e01b8152600060048201523360248201526001600160a01b0390911690636e2e2d7390604401602060405180830381600087803b15801561214057600080fd5b505af1158015612154573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121789190613f2c565b6121d45760405162461bcd60e51b815260206004820152602760248201527f476f7665726e6f72427261766f3a3a70726f706f73653a206f6e6c7920746f706044820152661039ba30b5b2b960c91b6064820152608401610bc2565b6001865111156122375760405162461bcd60e51b815260206004820152602860248201527f476f7665726e6f72427261766f3a3a70726f706f73653a20746f6f206d616e79604482015267207461726765747360c01b6064820152608401610bc2565b84518651148015612249575083518651145b8015612256575082518651145b6122d65760405162461bcd60e51b8152602060048201526044602482018190527f476f7665726e6f72427261766f3a3a70726f706f73653a2070726f706f73616c908201527f2066756e6374696f6e20696e666f726d6174696f6e206172697479206d69736d6064820152630c2e8c6d60e31b608482015260a401610bc2565b85516123395760405162461bcd60e51b815260206004820152602c60248201527f476f7665726e6f72427261766f3a3a70726f706f73653a206d7573742070726f60448201526b7669646520616374696f6e7360a01b6064820152608401610bc2565b600a8651111561239c5760405162461bcd60e51b815260206004820152602860248201527f476f7665726e6f72427261766f3a3a70726f706f73653a20746f6f206d616e7960448201526720616374696f6e7360c01b6064820152608401610bc2565b3360009081526070602052604090205480156125395760006123bd8261141c565b905060018160078111156123e157634e487b7160e01b600052602160045260246000fd5b141561247b5760405162461bcd60e51b815260206004820152605860248201527f476f7665726e6f72427261766f3a3a70726f706f73653a206f6e65206c69766560448201527f2070726f706f73616c207065722070726f706f7365722c20666f756e6420616e60648201527f20616c7265616479206163746976652070726f706f73616c0000000000000000608482015260a401610bc2565b600081600781111561249d57634e487b7160e01b600052602160045260246000fd5b14156125375760405162461bcd60e51b815260206004820152605960248201527f476f7665726e6f72427261766f3a3a70726f706f73653a206f6e65206c69766560448201527f2070726f706f73616c207065722070726f706f7365722c20666f756e6420616e60648201527f20616c72656164792070656e64696e672070726f706f73616c00000000000000608482015260a401610bc2565b505b600061254743606854612f59565b9050600061255782606954612f59565b606c805491925060006125698361464a565b9091555050606c546000818152606f6020908152604082209283556001830180546001600160a01b0319163317905560028301919091558a516125b4916003840191908d0190613938565b5088516125ca90600483019060208c019061399d565b5087516125e090600583019060208b01906139d8565b5086516125f690600683019060208a0190613a31565b5082816007018190555081816008018190555060008160090181905550600081600a0181905550600081600b0181905550600081600c0160006101000a81548160ff021916908315150217905550600081600c0160016101000a81548160ff0219169083151502179055508060000154607060008360010160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001908152602001600020819055507f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e08160000154338c8c8c8c89898e6040516126e99998979695949392919061445e565b60405180910390a1549998505050505050505050565b600461270a8261141c565b600781111561272957634e487b7160e01b600052602160045260246000fd5b146127aa5760405162461bcd60e51b8152602060048201526044602482018190527f476f7665726e6f72427261766f3a3a71756575653a2070726f706f73616c2063908201527f616e206f6e6c79206265207175657565642069662069742069732073756363656064820152631959195960e21b608482015260a401610bc2565b6000818152606f60209081526040808320606d548251630d48571f60e31b815292519194936128049342936001600160a01b0390931692636a42b8f892600480840193919291829003018186803b15801561158e57600080fd5b905060005b6003830154811015612a06576129f483600301828154811061283b57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546004850180546001600160a01b03909216918490811061287757634e487b7160e01b600052603260045260246000fd5b90600052602060002001548560050184815481106128a557634e487b7160e01b600052603260045260246000fd5b9060005260206000200180546128ba90614615565b80601f01602080910402602001604051908101604052809291908181526020018280546128e690614615565b80156129335780601f1061290857610100808354040283529160200191612933565b820191906000526020600020905b81548152906001019060200180831161291657829003601f168201915b505050505086600601858154811061295b57634e487b7160e01b600052603260045260246000fd5b90600052602060002001805461297090614615565b80601f016020809104026020016040519081016040528092919081815260200182805461299c90614615565b80156129e95780601f106129be576101008083540402835291602001916129e9565b820191906000526020600020905b8154815290600101906020018083116129cc57829003601f168201915b50505050508661355a565b806129fe8161464a565b915050612809565b506002820181905560408051848152602081018390527f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda2892910160405180910390a1505050565b60405162461bcd60e51b815260206004820152603860248201527f476f7665726e6f72427261766f3a3a5f61636365707441646d696e3a2064697360448201527f61626c65206163636570742061646d696e2075706461746500000000000000006064820152608401610bc2565b6076546000906001600160a01b03163314612b2b5760405162461bcd60e51b815260206004820152602b60248201527f476f7665726e6f72427261766f3a3a5f66756e64496e7665737465653a20747260448201526a656173757279206f6e6c7960a81b6064820152608401610bc2565b6074546075541115612b955760405162461bcd60e51b815260206004820152602d60248201527f476f7665726e6f72427261766f3a3a5f66756e64496e7665737465653a204e6f60448201526c206e657720696e76657374656560981b6064820152608401610bc2565b612ba26075546001612f59565b6075819055507fc5c30592579df2868ccc9809f55485e57c9503d99abf37c40e084f99709f2e2060736000612bda6075546001612fb3565b81526020810191909152604001600020546075546001600160a01b0390911690612c05906001612fb3565b604080516001600160a01b03909316835260208301919091520160405180910390a160736000612c386075546001612fb3565b81526020810191909152604001600020546001600160a01b0316905090565b60405162461bcd60e51b815260206004820152603160248201527f476f7665726e6f72427261766f3a3a5f696e6974696174653a2064697361626c6044820152706520696e6974696174652075706461746560781b6064820152608401610bc2565b6005612cc48261141c565b6007811115612ce357634e487b7160e01b600052602160045260246000fd5b14612d645760405162461bcd60e51b815260206004820152604560248201527f476f7665726e6f72427261766f3a3a657865637574653a2070726f706f73616c60448201527f2063616e206f6e6c7920626520657865637574656420696620697420697320716064820152641d595d595960da1b608482015260a401610bc2565b6000818152606f60205260408120600c8101805461ff001916610100179055905b6003820154811015612f2857606d546004830180546001600160a01b0390921691630825f38f919084908110612dcb57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154846003018481548110612df957634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546004860180546001600160a01b039092169186908110612e3557634e487b7160e01b600052603260045260246000fd5b9060005260206000200154866005018681548110612e6357634e487b7160e01b600052603260045260246000fd5b90600052602060002001876006018781548110612e9057634e487b7160e01b600052603260045260246000fd5b9060005260206000200188600201546040518763ffffffff1660e01b8152600401612ebf9594939291906142fa565b6000604051808303818588803b158015612ed857600080fd5b505af1158015612eec573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052612f159190810190613f64565b5080612f208161464a565b915050612d85565b506040518281527f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f90602001610d39565b600080612f6683856145ba565b905083811015612fac5760405162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b6044820152606401610bc2565b9392505050565b600082821115612ffd5760405162461bcd60e51b81526020600482015260156024820152747375627472616374696f6e20756e646572666c6f7760581b6044820152606401610bc2565b612fac82846145d2565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6065546001600160a01b031633146111885760405162461bcd60e51b815260206004820152602560248201527f4f6e6c792061646d696e2063616e207570677261646520696d706c656d656e7460448201526430ba34b7b760d91b6064820152608401610bc2565b60006130a7613007565b90506130b28461372f565b6000835111806130bf5750815b156130d0576130ce84846137d4565b505b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143805460ff166131e157805460ff191660011781556040516001600160a01b038316602482015261314f90869060440160408051601f198184030181529190526020810180516001600160e01b0316631b2ce7f360e11b1790526137d4565b50805460ff19168155613160613007565b6001600160a01b0316826001600160a01b0316146131d85760405162461bcd60e51b815260206004820152602f60248201527f45524331393637557067726164653a207570677261646520627265616b73206660448201526e75727468657220757067726164657360881b6064820152608401610bc2565b6131e1856138bf565b5050505050565b606e54604051636e2e2d7360e01b8152600060048201819052336024830152916001600160a01b031690636e2e2d7390604401602060405180830381600087803b15801561323557600080fd5b505af1158015613249573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061326d9190613f2c565b156132ce5760405162461bcd60e51b8152602060048201526037602482015260008051602061469283398151915260448201527f20546f70207374616b65722063616e6e6f7420766f74650000000000000000006064820152608401610bc2565b60016132d98461141c565b60078111156132f857634e487b7160e01b600052602160045260246000fd5b1461334d5760405162461bcd60e51b81526020600482015260316024820152600080516020614692833981519152604482015270081d9bdd1a5b99c81a5cc818db1bdcd959607a1b6064820152608401610bc2565b60028260ff1611156133aa5760405162461bcd60e51b8152602060048201526032602482015260008051602061469283398151915260448201527120696e76616c696420766f7465207479706560701b6064820152608401610bc2565b6000838152606f602090815260408083206001600160a01b0388168452600d8101909252909120805460ff161561342e5760405162461bcd60e51b81526020600482015260346024820152600080516020614692833981519152604482015273081d9bdd195c88185b1c9958591e481d9bdd195960621b6064820152608401610bc2565b606e546007830154604051630748d63560e31b81526000926001600160a01b031691633a46b1a891613478918b916004016001600160a01b03929092168252602082015260400190565b60206040518083038186803b15801561349057600080fd5b505afa1580156134a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134c89190613f4c565b905060ff85166134ea576134e083600a015482612f59565b600a84015561352e565b8460ff166001141561350e57613504836009015482612f59565b600984015561352e565b8460ff166002141561352e5761352883600b015482612f59565b600b8401555b8154600160ff19909116811761ff00191661010060ff8816021783559091018190559150509392505050565b606d546040516001600160a01b039091169063f2b065379061358890889088908890889088906020016142ae565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004016135bc91815260200190565b60206040518083038186803b1580156135d457600080fd5b505afa1580156135e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061360c9190613f2c565b1561369d5760405162461bcd60e51b815260206004820152605560248201527f476f7665726e6f72427261766f3a3a71756575654f72526576657274496e746560448201527f726e616c3a206964656e746963616c2070726f706f73616c20616374696f6e20606482015274616c7265616479207175657565642061742065746160581b608482015260a401610bc2565b606d54604051633a66f90160e01b81526001600160a01b0390911690633a66f901906136d590889088908890889088906004016142ae565b602060405180830381600087803b1580156136ef57600080fd5b505af1158015613703573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137279190613f4c565b505050505050565b803b6137935760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610bc2565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060823b6138335760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610bc2565b600080846001600160a01b03168460405161384e9190614292565b600060405180830381855af49150503d8060008114613889576040519150601f19603f3d011682016040523d82523d6000602084013e61388e565b606091505b50915091506138b682826040518060600160405280602781526020016146d2602791396138ff565b95945050505050565b6138c88161372f565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060831561390e575081612fac565b82511561391e5782518084602001fd5b8160405162461bcd60e51b8152600401610bc291906143b3565b82805482825590600052602060002090810192821561398d579160200282015b8281111561398d57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613958565b50613999929150613a8a565b5090565b82805482825590600052602060002090810192821561398d579160200282015b8281111561398d5782518255916020019190600101906139bd565b828054828255906000526020600020908101928215613a25579160200282015b82811115613a255782518051613a15918491602090910190613a9f565b50916020019190600101906139f8565b50613999929150613b12565b828054828255906000526020600020908101928215613a7e579160200282015b82811115613a7e5782518051613a6e918491602090910190613a9f565b5091602001919060010190613a51565b50613999929150613b2f565b5b808211156139995760008155600101613a8b565b828054613aab90614615565b90600052602060002090601f016020900481019282613acd576000855561398d565b82601f10613ae657805160ff191683800117855561398d565b8280016001018555821561398d579182018281111561398d5782518255916020019190600101906139bd565b80821115613999576000613b268282613b4c565b50600101613b12565b80821115613999576000613b438282613b4c565b50600101613b2f565b508054613b5890614615565b6000825580601f10613b6a5750611188565b601f0160209004906000526020600020908101906111889190613a8a565b80356001600160a01b03811681146111a757600080fd5b600082601f830112613baf578081fd5b81356020613bc4613bbf8361456e565b61453d565b8281528181019085830183850287018401881015613be0578586fd5b855b85811015613c0557613bf382613b88565b84529284019290840190600101613be2565b5090979650505050505050565b600082601f830112613c22578081fd5b81356020613c32613bbf8361456e565b82815281810190858301855b85811015613c0557613c55898684358b0101613d16565b84529284019290840190600101613c3e565b600082601f830112613c77578081fd5b81356020613c87613bbf8361456e565b82815281810190858301855b85811015613c0557613caa898684358b0101613d16565b84529284019290840190600101613c93565b600082601f830112613ccc578081fd5b81356020613cdc613bbf8361456e565b8281528181019085830183850287018401881015613cf8578586fd5b855b85811015613c0557813584529284019290840190600101613cfa565b600082601f830112613d26578081fd5b8135613d34613bbf82614592565b818152846020838601011115613d48578283fd5b816020850160208301379081016020019190915292915050565b803560ff811681146111a757600080fd5b600060208284031215613d84578081fd5b612fac82613b88565b60008060008060008060c08789031215613da5578182fd5b613dae87613b88565b9550613dbc60208801613b88565b9450604087013593506060870135925060808701359150613ddf60a08801613b88565b90509295509295509295565b60008060408385031215613dfd578182fd5b613e0683613b88565b9150602083013567ffffffffffffffff811115613e21578182fd5b613e2d85828601613d16565b9150509250929050565b60008060408385031215613e49578182fd5b613e5283613b88565b946020939093013593505050565b600080600080600060a08688031215613e77578283fd5b853567ffffffffffffffff80821115613e8e578485fd5b613e9a89838a01613b9f565b96506020880135915080821115613eaf578485fd5b613ebb89838a01613cbc565b95506040880135915080821115613ed0578485fd5b613edc89838a01613c67565b94506060880135915080821115613ef1578283fd5b613efd89838a01613c12565b93506080880135915080821115613f12578283fd5b50613f1f88828901613d16565b9150509295509295909350565b600060208284031215613f3d578081fd5b81518015158114612fac578182fd5b600060208284031215613f5d578081fd5b5051919050565b600060208284031215613f75578081fd5b815167ffffffffffffffff811115613f8b578182fd5b8201601f81018413613f9b578182fd5b8051613fa9613bbf82614592565b818152856020838501011115613fbd578384fd5b6138b68260208301602086016145e9565b600060208284031215613fdf578081fd5b5035919050565b60008060408385031215613ff8578182fd5b8235915061400860208401613b88565b90509250929050565b60008060408385031215614023578182fd5b8235915061400860208401613d62565b60008060008060608587031215614048578182fd5b8435935061405860208601613d62565b9250604085013567ffffffffffffffff80821115614074578384fd5b818701915087601f830112614087578384fd5b813581811115614095578485fd5b8860208285010111156140a6578485fd5b95989497505060200194505050565b600080600080600060a086880312156140cc578283fd5b853594506140dc60208701613d62565b93506140ea60408701613d62565b94979396509394606081013594506080013592915050565b6000815180845260208085019450808401835b8381101561413a5781516001600160a01b031687529582019590820190600101614115565b509495945050505050565b6000815180845260208085018081965082840281019150828601855b8581101561418b5782840389526141798483516141c7565b98850198935090840190600101614161565b5091979650505050505050565b6000815180845260208085019450808401835b8381101561413a578151875295820195908201906001016141ab565b600081518084526141df8160208601602086016145e9565b601f01601f19169290920160200192915050565b80546000906002810460018083168061420d57607f831692505b602080841082141561422d57634e487b7160e01b86526022600452602486fd5b838852818015614244576001811461425857614286565b60ff19861689830152604089019650614286565b876000528160002060005b8681101561427e5781548b8201850152908501908301614263565b8a0183019750505b50505050505092915050565b600082516142a48184602087016145e9565b9190910192915050565b600060018060a01b038716825285602083015260a060408301526142d560a08301866141c7565b82810360608401526142e781866141c7565b9150508260808301529695505050505050565b600060018060a01b038716825285602083015260a0604083015261432160a08301866141f3565b82810360608401526142e781866141f3565b6000608082526143466080830187614102565b82810360208401526143588187614198565b9050828103604084015261436c8186614145565b905082810360608401526143808185614145565b979650505050505050565b60208101600883106143ad57634e487b7160e01b600052602160045260246000fd5b91905290565b600060208252612fac60208301846141c7565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b8981526001600160a01b0389166020820152610120604082018190526000906144898382018b614102565b9050828103606084015261449d818a614198565b905082810360808401526144b18189614145565b905082810360a08401526144c58188614145565b90508560c08401528460e08401528281036101008401526144e681856141c7565b9c9b505050505050505050505050565b600086825260ff8616602083015284604083015260806060830152826080830152828460a084013781830160a090810191909152601f909201601f19160101949350505050565b604051601f8201601f1916810167ffffffffffffffff811182821017156145665761456661467b565b604052919050565b600067ffffffffffffffff8211156145885761458861467b565b5060209081020190565b600067ffffffffffffffff8211156145ac576145ac61467b565b50601f01601f191660200190565b600082198211156145cd576145cd614665565b500190565b6000828210156145e4576145e4614665565b500390565b60005b838110156146045781810151838201526020016145ec565b83811115611b885750506000910152565b60028104600182168061462957607f821691505b602082108114156115e557634e487b7160e01b600052602260045260246000fd5b600060001982141561465e5761465e614665565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfe476f7665726e6f72427261766f3a3a63617374566f7465496e7465726e616c3a476f7665726e6f72427261766f3a3a696e697469616c697a653a20696e76616c416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122055fd33c7823b25d903d08595200f0d28f838aa580a49955d2262689f53951e2564736f6c63430008020033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.