Overview
ETH Balance
0.166131051988827143 ETH
Eth Value
$564.27 (@ $3,396.52/ETH)Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 513 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Execute | 16411816 | 713 days ago | IN | 0 ETH | 0.00179142 | ||||
Queue | 16400557 | 715 days ago | IN | 0 ETH | 0.00381445 | ||||
Cast Vote | 16391634 | 716 days ago | IN | 0 ETH | 0.00279206 | ||||
Cast Vote | 16391556 | 716 days ago | IN | 0 ETH | 0.00296216 | ||||
Cast Vote | 16391285 | 716 days ago | IN | 0 ETH | 0.00350074 | ||||
Cast Vote | 16387586 | 716 days ago | IN | 0 ETH | 0.00303488 | ||||
Propose | 16371677 | 719 days ago | IN | 0 ETH | 0.03027478 | ||||
Execute | 15333847 | 868 days ago | IN | 0 ETH | 0.00603466 | ||||
Queue | 15327276 | 869 days ago | IN | 0 ETH | 0.00560325 | ||||
Cast Vote | 15326163 | 869 days ago | IN | 0 ETH | 0.00121179 | ||||
Cast Vote | 15323957 | 869 days ago | IN | 0 ETH | 0.00228894 | ||||
Cast Vote | 15323019 | 870 days ago | IN | 0 ETH | 0.00256448 | ||||
Cast Vote | 15321590 | 870 days ago | IN | 0 ETH | 0.00761544 | ||||
Cast Vote | 15321452 | 870 days ago | IN | 0 ETH | 0.00377003 | ||||
Cast Vote | 15320395 | 870 days ago | IN | 0 ETH | 0.00175037 | ||||
Cast Vote | 15320038 | 870 days ago | IN | 0 ETH | 0.00148108 | ||||
Cast Vote | 15320038 | 870 days ago | IN | 0 ETH | 0.00148108 | ||||
Cast Vote | 15320036 | 870 days ago | IN | 0 ETH | 0.00161572 | ||||
Cast Vote | 15320000 | 870 days ago | IN | 0 ETH | 0.00269288 | ||||
Cast Vote | 15319940 | 870 days ago | IN | 0 ETH | 0.00175037 | ||||
Cast Vote | 15319855 | 870 days ago | IN | 0 ETH | 0.00242359 | ||||
Cast Vote | 15319492 | 870 days ago | IN | 0 ETH | 0.00221855 | ||||
Cast Vote | 15317443 | 870 days ago | IN | 0 ETH | 0.00377003 | ||||
Cast Vote | 15316894 | 871 days ago | IN | 0 ETH | 0.00334787 | ||||
Cast Vote | 15316034 | 871 days ago | IN | 0 ETH | 0.00821297 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
18900990 | 364 days ago | 0.00045 ETH | ||||
18900979 | 364 days ago | 0.0009 ETH | ||||
18900959 | 364 days ago | 0.00045 ETH | ||||
18885926 | 366 days ago | 0.00000007 ETH | ||||
18789076 | 379 days ago | 0.000185 ETH | ||||
18665909 | 397 days ago | 0.0003425 ETH | ||||
18652242 | 398 days ago | 0.000085 ETH | ||||
18546570 | 413 days ago | 0.0000425 ETH | ||||
18352013 | 441 days ago | 0.0000425 ETH | ||||
18352013 | 441 days ago | 0.0000425 ETH | ||||
18352013 | 441 days ago | 0.000525 ETH | ||||
18352013 | 441 days ago | 0.0005175 ETH | ||||
18159010 | 468 days ago | 0.00075 ETH | ||||
18159010 | 468 days ago | 0.00075 ETH | ||||
18159010 | 468 days ago | 0.00075 ETH | ||||
18159010 | 468 days ago | 0.00075 ETH | ||||
18159010 | 468 days ago | 0.00075 ETH | ||||
18153979 | 468 days ago | 0.00075 ETH | ||||
18064651 | 481 days ago | 0.00236145 ETH | ||||
17799580 | 518 days ago | 0.0006 ETH | ||||
17794856 | 519 days ago | 0.000045 ETH | ||||
17661215 | 537 days ago | 0.0003 ETH | ||||
17661214 | 537 days ago | 0.00075 ETH | ||||
17559124 | 552 days ago | 0.0006 ETH | ||||
17534078 | 555 days ago | 0.0002268 ETH |
Loading...
Loading
Contract Name:
Governance
Compiler Version
v0.7.6+commit.7338295f
Optimization Enabled:
Yes with 9999 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: Apache-2.0 pragma solidity 0.7.6; pragma experimental ABIEncoderV2; import "./interfaces/ISupernova.sol"; import "./Bridge.sol"; import "@openzeppelin/contracts/math/SafeMath.sol"; contract Governance is Bridge { using SafeMath for uint256; enum ProposalState { WarmUp, Active, Canceled, Failed, Accepted, Queued, Grace, Expired, Executed, Abrogated } struct Receipt { // Whether or not a vote has been cast bool hasVoted; // The number of votes the voter had, which were cast uint256 votes; // support bool support; } struct AbrogationProposal { address creator; uint256 createTime; string description; uint256 forVotes; uint256 againstVotes; mapping(address => Receipt) receipts; } struct ProposalParameters { uint256 warmUpDuration; uint256 activeDuration; uint256 queueDuration; uint256 gracePeriodDuration; uint256 acceptanceThreshold; uint256 minQuorum; } struct Proposal { // proposal identifiers // unique id uint256 id; // Creator of the proposal address proposer; // proposal description string description; string title; // proposal technical details // ordered list of target addresses to be made address[] targets; // The ordered list of values (i.e. msg.value) to be passed to the calls to be made uint256[] 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; // proposal creation time - 1 uint256 createTime; // votes status // The timestamp that the proposal will be available for execution, set once the vote succeeds uint256 eta; // Current number of votes in favor of this proposal uint256 forVotes; // Current number of votes in opposition to this proposal uint256 againstVotes; bool canceled; bool executed; // Receipts of ballots for the entire set of voters mapping(address => Receipt) receipts; ProposalParameters parameters; } uint256 public lastProposalId; mapping(uint256 => Proposal) public proposals; mapping(uint256 => AbrogationProposal) public abrogationProposals; mapping(address => uint256) public latestProposalIds; ISupernova supernova; bool isInitialized; bool public isActive; event ProposalCreated(uint256 indexed proposalId); event Vote(uint256 indexed proposalId, address indexed user, bool support, uint256 power); event VoteCanceled(uint256 indexed proposalId, address indexed user); event ProposalQueued(uint256 indexed proposalId, address caller, uint256 eta); event ProposalExecuted(uint256 indexed proposalId, address caller); event ProposalCanceled(uint256 indexed proposalId, address caller); event AbrogationProposalStarted(uint256 indexed proposalId, address caller); event AbrogationProposalExecuted(uint256 indexed proposalId, address caller); event AbrogationProposalVote(uint256 indexed proposalId, address indexed user, bool support, uint256 power); event AbrogationProposalVoteCancelled(uint256 indexed proposalId, address indexed user); receive() external payable {} // executed only once function initialize(address supernovaAddr) public { require(isInitialized == false, "Contract already initialized."); require(supernovaAddr != address(0), "supernova must not be 0x0"); supernova = ISupernova(supernovaAddr); isInitialized = true; } function activate() public { require(!isActive, "DAO already active"); require(supernova.xyzStaked() >= ACTIVATION_THRESHOLD, "Threshold not met yet"); isActive = true; } function propose( address[] memory targets, uint256[] memory values, string[] memory signatures, bytes[] memory calldatas, string memory description, string memory title ) public returns (uint256) { if (!isActive) { require(supernova.xyzStaked() >= ACTIVATION_THRESHOLD, "DAO not yet active"); isActive = true; } require( supernova.votingPowerAtTs(msg.sender, block.timestamp - 1) >= _getCreationThreshold(), "Creation threshold not met" ); require( targets.length == values.length && targets.length == signatures.length && targets.length == calldatas.length, "Proposal function information arity mismatch" ); require(targets.length != 0, "Must provide actions"); require(targets.length <= PROPOSAL_MAX_ACTIONS, "Too many actions on a vote"); require(bytes(title).length > 0, "title can't be empty"); require(bytes(description).length > 0, "description can't be empty"); // check if user has another running vote uint256 previousProposalId = latestProposalIds[msg.sender]; if (previousProposalId != 0) { require(_isLiveState(previousProposalId) == false, "One live proposal per proposer"); } uint256 newProposalId = lastProposalId + 1; Proposal storage newProposal = proposals[newProposalId]; newProposal.id = newProposalId; newProposal.proposer = msg.sender; newProposal.description = description; newProposal.title = title; newProposal.targets = targets; newProposal.values = values; newProposal.signatures = signatures; newProposal.calldatas = calldatas; newProposal.createTime = block.timestamp - 1; newProposal.parameters.warmUpDuration = warmUpDuration; newProposal.parameters.activeDuration = activeDuration; newProposal.parameters.queueDuration = queueDuration; newProposal.parameters.gracePeriodDuration = gracePeriodDuration; newProposal.parameters.acceptanceThreshold = acceptanceThreshold; newProposal.parameters.minQuorum = minQuorum; lastProposalId = newProposalId; latestProposalIds[msg.sender] = newProposalId; emit ProposalCreated(newProposalId); return newProposalId; } function queue(uint256 proposalId) public { require(state(proposalId) == ProposalState.Accepted, "Proposal can only be queued if it is succeeded"); Proposal storage proposal = proposals[proposalId]; uint256 eta = proposal.createTime + proposal.parameters.warmUpDuration + proposal.parameters.activeDuration + proposal.parameters.queueDuration; proposal.eta = eta; for (uint256 i = 0; i < proposal.targets.length; i++) { require( !queuedTransactions[_getTxHash(proposal.targets[i], proposal.values[i], proposal.signatures[i], proposal.calldatas[i], eta)], "proposal action already queued at eta" ); queueTransaction(proposal.targets[i], proposal.values[i], proposal.signatures[i], proposal.calldatas[i], eta); } emit ProposalQueued(proposalId, msg.sender, eta); } function execute(uint256 proposalId) public payable { require(_canBeExecuted(proposalId), "Cannot be executed"); Proposal storage proposal = proposals[proposalId]; proposal.executed = true; for (uint256 i = 0; i < proposal.targets.length; i++) { executeTransaction(proposal.targets[i], proposal.values[i], proposal.signatures[i], proposal.calldatas[i], proposal.eta); } emit ProposalExecuted(proposalId, msg.sender); } function cancelProposal(uint256 proposalId) public { require(_isCancellableState(proposalId), "Proposal in state that does not allow cancellation"); require(_canCancelProposal(proposalId), "Cancellation requirements not met"); Proposal storage proposal = proposals[proposalId]; proposal.canceled = true; for (uint256 i = 0; i < proposal.targets.length; i++) { cancelTransaction(proposal.targets[i], proposal.values[i], proposal.signatures[i], proposal.calldatas[i], proposal.eta); } emit ProposalCanceled(proposalId, msg.sender); } function castVote(uint256 proposalId, bool support) public { require(state(proposalId) == ProposalState.Active, "Voting is closed"); Proposal storage proposal = proposals[proposalId]; Receipt storage receipt = proposal.receipts[msg.sender]; // exit if user already voted require(receipt.hasVoted == false || receipt.hasVoted && receipt.support != support, "Already voted this option"); uint256 votes = supernova.votingPowerAtTs(msg.sender, _getSnapshotTimestamp(proposal)); require(votes > 0, "no voting power"); // means it changed its vote if (receipt.hasVoted) { if (receipt.support) { proposal.forVotes = proposal.forVotes.sub(receipt.votes); } else { proposal.againstVotes = proposal.againstVotes.sub(receipt.votes); } } if (support) { proposal.forVotes = proposal.forVotes.add(votes); } else { proposal.againstVotes = proposal.againstVotes.add(votes); } receipt.hasVoted = true; receipt.votes = votes; receipt.support = support; emit Vote(proposalId, msg.sender, support, votes); } function cancelVote(uint256 proposalId) public { require(state(proposalId) == ProposalState.Active, "Voting is closed"); Proposal storage proposal = proposals[proposalId]; Receipt storage receipt = proposal.receipts[msg.sender]; uint256 votes = supernova.votingPowerAtTs(msg.sender, _getSnapshotTimestamp(proposal)); require(receipt.hasVoted, "Cannot cancel if not voted yet"); if (receipt.support) { proposal.forVotes = proposal.forVotes.sub(votes); } else { proposal.againstVotes = proposal.againstVotes.sub(votes); } receipt.hasVoted = false; receipt.votes = 0; receipt.support = false; emit VoteCanceled(proposalId, msg.sender); } // ====================================================================================================== // Abrogation proposal methods // ====================================================================================================== // the Abrogation Proposal is a mechanism for the DAO participants to veto the execution of a proposal that was already // accepted and it is currently queued. For the Abrogation Proposal to pass, 50% + 1 of the vBOND holders // must vote FOR the Abrogation Proposal function startAbrogationProposal(uint256 proposalId, string memory description) public { require(state(proposalId) == ProposalState.Queued, "Proposal must be in queue"); require( supernova.votingPowerAtTs(msg.sender, block.timestamp - 1) >= _getCreationThreshold(), "Creation threshold not met" ); AbrogationProposal storage ap = abrogationProposals[proposalId]; require(ap.createTime == 0, "Abrogation proposal already exists"); require(bytes(description).length > 0, "description can't be empty"); ap.createTime = block.timestamp; ap.creator = msg.sender; ap.description = description; emit AbrogationProposalStarted(proposalId, msg.sender); } // abrogateProposal cancels a proposal if there's an Abrogation Proposal that passed function abrogateProposal(uint256 proposalId) public { require(state(proposalId) == ProposalState.Abrogated, "Cannot be abrogated"); Proposal storage proposal = proposals[proposalId]; require(proposal.canceled == false, "Cannot be abrogated"); proposal.canceled = true; for (uint256 i = 0; i < proposal.targets.length; i++) { cancelTransaction(proposal.targets[i], proposal.values[i], proposal.signatures[i], proposal.calldatas[i], proposal.eta); } emit AbrogationProposalExecuted(proposalId, msg.sender); } function abrogationProposal_castVote(uint256 proposalId, bool support) public { require(0 < proposalId && proposalId <= lastProposalId, "invalid proposal id"); AbrogationProposal storage abrogationProposal = abrogationProposals[proposalId]; require( state(proposalId) == ProposalState.Queued && abrogationProposal.createTime != 0, "Abrogation Proposal not active" ); Receipt storage receipt = abrogationProposal.receipts[msg.sender]; require( receipt.hasVoted == false || receipt.hasVoted && receipt.support != support, "Already voted this option" ); uint256 votes = supernova.votingPowerAtTs(msg.sender, abrogationProposal.createTime - 1); require(votes > 0, "no voting power"); // means it changed its vote if (receipt.hasVoted) { if (receipt.support) { abrogationProposal.forVotes = abrogationProposal.forVotes.sub(receipt.votes); } else { abrogationProposal.againstVotes = abrogationProposal.againstVotes.sub(receipt.votes); } } if (support) { abrogationProposal.forVotes = abrogationProposal.forVotes.add(votes); } else { abrogationProposal.againstVotes = abrogationProposal.againstVotes.add(votes); } receipt.hasVoted = true; receipt.votes = votes; receipt.support = support; emit AbrogationProposalVote(proposalId, msg.sender, support, votes); } function abrogationProposal_cancelVote(uint256 proposalId) public { require(0 < proposalId && proposalId <= lastProposalId, "invalid proposal id"); AbrogationProposal storage abrogationProposal = abrogationProposals[proposalId]; Receipt storage receipt = abrogationProposal.receipts[msg.sender]; require( state(proposalId) == ProposalState.Queued && abrogationProposal.createTime != 0, "Abrogation Proposal not active" ); uint256 votes = supernova.votingPowerAtTs(msg.sender, abrogationProposal.createTime - 1); require(receipt.hasVoted, "Cannot cancel if not voted yet"); if (receipt.support) { abrogationProposal.forVotes = abrogationProposal.forVotes.sub(votes); } else { abrogationProposal.againstVotes = abrogationProposal.againstVotes.sub(votes); } receipt.hasVoted = false; receipt.votes = 0; receipt.support = false; emit AbrogationProposalVoteCancelled(proposalId, msg.sender); } // ====================================================================================================== // views // ====================================================================================================== function state(uint256 proposalId) public view returns (ProposalState) { require(0 < proposalId && proposalId <= lastProposalId, "invalid proposal id"); Proposal storage proposal = proposals[proposalId]; if (proposal.canceled) { return ProposalState.Canceled; } if (proposal.executed) { return ProposalState.Executed; } if (block.timestamp <= proposal.createTime + proposal.parameters.warmUpDuration) { return ProposalState.WarmUp; } if (block.timestamp <= proposal.createTime + proposal.parameters.warmUpDuration + proposal.parameters.activeDuration) { return ProposalState.Active; } if ((proposal.forVotes + proposal.againstVotes) < _getQuorum(proposal) || (proposal.forVotes < _getMinForVotes(proposal))) { return ProposalState.Failed; } if (proposal.eta == 0) { return ProposalState.Accepted; } if (block.timestamp < proposal.eta) { return ProposalState.Queued; } if (_proposalAbrogated(proposalId)) { return ProposalState.Abrogated; } if (block.timestamp <= proposal.eta + proposal.parameters.gracePeriodDuration) { return ProposalState.Grace; } return ProposalState.Expired; } function getReceipt(uint256 proposalId, address voter) public view returns (Receipt memory) { return proposals[proposalId].receipts[voter]; } function getProposalParameters(uint256 proposalId) public view returns (ProposalParameters memory) { return proposals[proposalId].parameters; } function getAbrogationProposalReceipt(uint256 proposalId, address voter) public view returns (Receipt memory) { return abrogationProposals[proposalId].receipts[voter]; } function getActions(uint256 proposalId) public view returns ( address[] memory targets, uint256[] memory values, string[] memory signatures, bytes[] memory calldatas ) { Proposal storage p = proposals[proposalId]; return (p.targets, p.values, p.signatures, p.calldatas); } function getProposalQuorum(uint256 proposalId) public view returns (uint256) { require(0 < proposalId && proposalId <= lastProposalId, "invalid proposal id"); return _getQuorum(proposals[proposalId]); } // ====================================================================================================== // internal methods // ====================================================================================================== function _canCancelProposal(uint256 proposalId) internal view returns (bool){ Proposal storage proposal = proposals[proposalId]; if (msg.sender == proposal.proposer || supernova.votingPower(proposal.proposer) < _getCreationThreshold() ) { return true; } return false; } function _isCancellableState(uint256 proposalId) internal view returns (bool) { ProposalState s = state(proposalId); return s == ProposalState.WarmUp || s == ProposalState.Active; } function _isLiveState(uint256 proposalId) internal view returns (bool) { ProposalState s = state(proposalId); return s == ProposalState.WarmUp || s == ProposalState.Active || s == ProposalState.Accepted || s == ProposalState.Queued || s == ProposalState.Grace; } function _canBeExecuted(uint256 proposalId) internal view returns (bool) { return state(proposalId) == ProposalState.Grace; } function _getMinForVotes(Proposal storage proposal) internal view returns (uint256) { return (proposal.forVotes + proposal.againstVotes).mul(proposal.parameters.acceptanceThreshold).div(100); } function _getCreationThreshold() internal view returns (uint256) { return supernova.xyzStaked().div(100); } // Returns the timestamp of the snapshot for a given proposal // If the current block's timestamp is equal to `proposal.createTime + warmUpDuration` then the state function // will return WarmUp as state which will prevent any vote to be cast which will gracefully avoid any flashloan attack function _getSnapshotTimestamp(Proposal storage proposal) internal view returns (uint256) { return proposal.createTime + proposal.parameters.warmUpDuration; } function _getQuorum(Proposal storage proposal) internal view returns (uint256) { return supernova.xyzStakedAtTs(_getSnapshotTimestamp(proposal)).mul(proposal.parameters.minQuorum).div(100); } function _proposalAbrogated(uint256 proposalId) internal view returns (bool) { Proposal storage p = proposals[proposalId]; AbrogationProposal storage cp = abrogationProposals[proposalId]; if (cp.createTime == 0 || block.timestamp < p.eta) { return false; } return cp.forVotes >= supernova.xyzStakedAtTs(cp.createTime - 1).div(2); } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity 0.7.6; pragma experimental ABIEncoderV2; interface ISupernova { struct Stake { uint256 timestamp; uint256 amount; uint256 expiryTimestamp; address delegatedTo; } // deposit allows a user to add more xyz to his staked balance function deposit(uint256 amount) external; // withdraw allows a user to withdraw funds if the balance is not locked function withdraw(uint256 amount) external; // lock a user's currently staked balance until timestamp & add the bonus to his voting power function lock(uint256 timestamp) external; // delegate allows a user to delegate his voting power to another user function delegate(address to) external; // stopDelegate allows a user to take back the delegated voting power function stopDelegate() external; // balanceOf returns the current BOND balance of a user (bonus not included) function balanceOf(address user) external view returns (uint256); // balanceAtTs returns the amount of BOND that the user currently staked (bonus NOT included) function balanceAtTs(address user, uint256 timestamp) external view returns (uint256); // stakeAtTs returns the Stake object of the user that was valid at `timestamp` function stakeAtTs(address user, uint256 timestamp) external view returns (Stake memory); // votingPower returns the voting power (bonus included) + delegated voting power for a user at the current block function votingPower(address user) external view returns (uint256); // votingPowerAtTs returns the voting power (bonus included) + delegated voting power for a user at a point in time function votingPowerAtTs(address user, uint256 timestamp) external view returns (uint256); // xyzStaked returns the total raw amount of BOND staked at the current block function xyzStaked() external view returns (uint256); // xyzStakedAtTs returns the total raw amount of BOND users have deposited into the contract // it does not include any bonus function xyzStakedAtTs(uint256 timestamp) external view returns (uint256); // delegatedPower returns the total voting power that a user received from other users function delegatedPower(address user) external view returns (uint256); // delegatedPowerAtTs returns the total voting power that a user received from other users at a point in time function delegatedPowerAtTs(address user, uint256 timestamp) external view returns (uint256); // multiplierAtTs calculates the multiplier at a given timestamp based on the user's stake a the given timestamp // it includes the decay mechanism function multiplierAtTs(address user, uint256 timestamp) external view returns (uint256); // userLockedUntil returns the timestamp until the user's balance is locked function userLockedUntil(address user) external view returns (uint256); // userDidDelegate returns the address to which a user delegated their voting power; address(0) if not delegated function userDelegatedTo(address user) external view returns (address); }
// SPDX-License-Identifier: Apache-2.0 pragma solidity 0.7.6; import "./Parameters.sol"; abstract contract Bridge is Parameters { mapping(bytes32 => bool) public queuedTransactions; function queueTransaction(address target, uint256 value, string memory signature, bytes memory data, uint256 eta) internal returns (bytes32) { bytes32 txHash = _getTxHash(target, value, signature, data, eta); queuedTransactions[txHash] = true; return txHash; } function cancelTransaction(address target, uint256 value, string memory signature, bytes memory data, uint256 eta) internal { bytes32 txHash = _getTxHash(target, value, signature, data, eta); queuedTransactions[txHash] = false; } function executeTransaction(address target, uint256 value, string memory signature, bytes memory data, uint256 eta) internal returns (bytes memory) { bytes32 txHash = _getTxHash(target, value, signature, data, eta); require(block.timestamp >= eta, "executeTransaction: Transaction hasn't surpassed time lock."); require(block.timestamp <= eta + gracePeriodDuration, "executeTransaction: Transaction is stale."); queuedTransactions[txHash] = false; bytes memory callData; if (bytes(signature).length == 0) { callData = data; } else { callData = abi.encodePacked(bytes4(keccak256(bytes(signature))), data); } // solium-disable-next-line security/no-call-value (bool success, bytes memory returnData) = target.call{value : value}(callData); require(success, string(returnData)); return returnData; } function _getTxHash(address target, uint256 value, string memory signature, bytes memory data, uint256 eta) internal returns (bytes32) { return keccak256(abi.encode(target, value, signature, data, eta)); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity 0.7.6; abstract contract Parameters { uint256 public warmUpDuration = 2 days; uint256 public activeDuration = 2 days; uint256 public queueDuration = 1 days; uint256 public gracePeriodDuration = 4 days; uint256 public acceptanceThreshold = 60; uint256 public minQuorum = 40; uint256 constant ACTIVATION_THRESHOLD = 50_000_000 * 10**18; uint256 constant PROPOSAL_MAX_ACTIONS = 10; modifier onlyDAO() { require(msg.sender == address(this), "Only DAO can call"); _; } function setWarmUpDuration(uint256 period) public onlyDAO { warmUpDuration = period; } function setActiveDuration(uint256 period) public onlyDAO { require(period >= 4 hours, "period must be > 0"); activeDuration = period; } function setQueueDuration(uint256 period) public onlyDAO { queueDuration = period; } function setGracePeriodDuration(uint256 period) public onlyDAO { require(period >= 4 hours, "period must be > 0"); gracePeriodDuration = period; } function setAcceptanceThreshold(uint256 threshold) public onlyDAO { require(threshold <= 100, "Maximum is 100."); require(threshold > 50, "Minimum is 50."); acceptanceThreshold = threshold; } function setMinQuorum(uint256 quorum) public onlyDAO { require(quorum > 5, "quorum must be greater than 5"); require(quorum <= 100, "Maximum is 100."); minQuorum = quorum; } }
{ "optimizer": { "enabled": true, "runs": 9999 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"AbrogationProposalExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"AbrogationProposalStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"support","type":"bool"},{"indexed":false,"internalType":"uint256","name":"power","type":"uint256"}],"name":"AbrogationProposalVote","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"AbrogationProposalVoteCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"ProposalCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"ProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"ProposalExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"eta","type":"uint256"}],"name":"ProposalQueued","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"support","type":"bool"},{"indexed":false,"internalType":"uint256","name":"power","type":"uint256"}],"name":"Vote","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"VoteCanceled","type":"event"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"abrogateProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"abrogationProposal_cancelVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"bool","name":"support","type":"bool"}],"name":"abrogationProposal_castVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"abrogationProposals","outputs":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint256","name":"createTime","type":"uint256"},{"internalType":"string","name":"description","type":"string"},{"internalType":"uint256","name":"forVotes","type":"uint256"},{"internalType":"uint256","name":"againstVotes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptanceThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"activeDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"cancelProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"cancelVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"bool","name":"support","type":"bool"}],"name":"castVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"execute","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"address","name":"voter","type":"address"}],"name":"getAbrogationProposalReceipt","outputs":[{"components":[{"internalType":"bool","name":"hasVoted","type":"bool"},{"internalType":"uint256","name":"votes","type":"uint256"},{"internalType":"bool","name":"support","type":"bool"}],"internalType":"struct Governance.Receipt","name":"","type":"tuple"}],"stateMutability":"view","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"}],"name":"getProposalParameters","outputs":[{"components":[{"internalType":"uint256","name":"warmUpDuration","type":"uint256"},{"internalType":"uint256","name":"activeDuration","type":"uint256"},{"internalType":"uint256","name":"queueDuration","type":"uint256"},{"internalType":"uint256","name":"gracePeriodDuration","type":"uint256"},{"internalType":"uint256","name":"acceptanceThreshold","type":"uint256"},{"internalType":"uint256","name":"minQuorum","type":"uint256"}],"internalType":"struct Governance.ProposalParameters","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"getProposalQuorum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uint256","name":"votes","type":"uint256"},{"internalType":"bool","name":"support","type":"bool"}],"internalType":"struct Governance.Receipt","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gracePeriodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"supernovaAddr","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastProposalId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"latestProposalIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minQuorum","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":"string","name":"description","type":"string"},{"internalType":"string","name":"title","type":"string"},{"internalType":"uint256","name":"createTime","type":"uint256"},{"internalType":"uint256","name":"eta","type":"uint256"},{"internalType":"uint256","name":"forVotes","type":"uint256"},{"internalType":"uint256","name":"againstVotes","type":"uint256"},{"internalType":"bool","name":"canceled","type":"bool"},{"internalType":"bool","name":"executed","type":"bool"},{"components":[{"internalType":"uint256","name":"warmUpDuration","type":"uint256"},{"internalType":"uint256","name":"activeDuration","type":"uint256"},{"internalType":"uint256","name":"queueDuration","type":"uint256"},{"internalType":"uint256","name":"gracePeriodDuration","type":"uint256"},{"internalType":"uint256","name":"acceptanceThreshold","type":"uint256"},{"internalType":"uint256","name":"minQuorum","type":"uint256"}],"internalType":"struct Governance.ProposalParameters","name":"parameters","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"string[]","name":"signatures","type":"string[]"},{"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"title","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":"queueDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"queuedTransactions","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"threshold","type":"uint256"}],"name":"setAcceptanceThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"period","type":"uint256"}],"name":"setActiveDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"period","type":"uint256"}],"name":"setGracePeriodDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quorum","type":"uint256"}],"name":"setMinQuorum","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"period","type":"uint256"}],"name":"setQueueDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"period","type":"uint256"}],"name":"setWarmUpDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"string","name":"description","type":"string"}],"name":"startAbrogationProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"state","outputs":[{"internalType":"enum Governance.ProposalState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"warmUpDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526202a3006000556202a3006001556201518060025562054600600355603c600455602860055534801561003657600080fd5b50614988806100466000396000f3fe6080604052600436106102535760003560e01c80635f2e9f6011610138578063c4d66de8116100b0578063e0a8f6f51161007f578063e4e2d26111610064578063e4e2d261146106a0578063f2b06537146106c0578063fe0d94c1146106e05761025a565b8063e0a8f6f514610653578063e23a9a52146106735761025a565b8063c4d66de8146105d3578063d0cd595e146105f3578063d1291f1914610613578063ddf0b009146106335761025a565b80639e70a23411610107578063b5a127e5116100ec578063b5a127e514610589578063bacbe2da1461059e578063c099f575146105be5761025a565b80639e70a23414610554578063b0edbb9b146105745761025a565b80635f2e9f60146104d957806374cb3041146104ee5780638b787e3014610503578063984690db146105345761025a565b8063328dd982116101cb5780633e4f49e61161019a578063490145c81161017f578063490145c81461047957806353e5056a14610499578063563909de146104b95761025a565b80633e4f49e61461041f578063458921551461044c5761025a565b8063328dd9821461039a578063342d067a146103ca57806339e778ee146103ea5780633d05f0091461040a5761025a565b80631e9d1e641161022257806324b437871161020757806324b437871461034557806324cd62d3146103655780632e8e34e1146103855761025a565b80631e9d1e641461030357806322f3e2d4146103235761025a565b8063013cf08b1461025f5780630f15f4c01461029f57806315373e3d146102b657806317977c61146102d65761025a565b3661025a57005b600080fd5b34801561026b57600080fd5b5061027f61027a366004613e00565b6106f3565b6040516102969b9a999897969594939291906147f6565b60405180910390f35b3480156102ab57600080fd5b506102b46108b9565b005b3480156102c257600080fd5b506102b46102d1366004613e5b565b610a0b565b3480156102e257600080fd5b506102f66102f1366004613cf8565b610c42565b60405161029691906147ed565b34801561030f57600080fd5b506102b461031e366004613e00565b610c54565b34801561032f57600080fd5b50610338610e43565b6040516102969190614111565b34801561035157600080fd5b506102b4610360366004613e00565b610e65565b34801561037157600080fd5b506102b4610380366004613e00565b6110ce565b34801561039157600080fd5b506102f661117e565b3480156103a657600080fd5b506103ba6103b5366004613e00565b611184565b6040516102969493929190614059565b3480156103d657600080fd5b506102b46103e5366004613e00565b611420565b3480156103f657600080fd5b506102b4610405366004613e8e565b6114d0565b34801561041657600080fd5b506102f66116a7565b34801561042b57600080fd5b5061043f61043a366004613e00565b6116ad565b604051610296919061412c565b34801561045857600080fd5b5061046c610467366004613e00565b6117fb565b60405161029691906147ba565b34801561048557600080fd5b506102f6610494366004613d12565b61185f565b3480156104a557600080fd5b506102b46104b4366004613e00565b611cac565b3480156104c557600080fd5b506102b46104d4366004613e00565b611d05565b3480156104e557600080fd5b506102f6611e09565b3480156104fa57600080fd5b506102f6611e0f565b34801561050f57600080fd5b5061052361051e366004613e00565b611e15565b604051610296959493929190614010565b34801561054057600080fd5b506102b461054f366004613e00565b611ee4565b34801561056057600080fd5b506102b461056f366004613e5b565b611f3d565b34801561058057600080fd5b506102f66121be565b34801561059557600080fd5b506102f66121c4565b3480156105aa57600080fd5b506102b46105b9366004613e00565b6121ca565b3480156105ca57600080fd5b506102f6612367565b3480156105df57600080fd5b506102b46105ee366004613cf8565b61236d565b3480156105ff57600080fd5b506102f661060e366004613e00565b61245c565b34801561061f57600080fd5b506102b461062e366004613e00565b6124a9565b34801561063f57600080fd5b506102b461064e366004613e00565b6125ad565b34801561065f57600080fd5b506102b461066e366004613e00565b6129cb565b34801561067f57600080fd5b5061069361068e366004613e30565b612a8b565b60405161029691906147c8565b3480156106ac57600080fd5b506106936106bb366004613e30565b612afc565b3480156106cc57600080fd5b506103386106db366004613e00565b612b6d565b6102b46106ee366004613e00565b612b82565b60086020908152600091825260409182902080546001808301546002808501805488516101009582161595909502600019011691909104601f8101879004870284018701909752868352929573ffffffffffffffffffffffffffffffffffffffff909116949192918301828280156107ac5780601f10610781576101008083540402835291602001916107ac565b820191906000526020600020905b81548152906001019060200180831161078f57829003601f168201915b5050505060038301805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815294959493509083018282801561083c5780601f106108115761010080835404028352916020019161083c565b820191906000526020600020905b81548152906001019060200180831161081f57829003601f168201915b50505060088401546009850154600a860154600b870154600c8801546040805160c081018252600e8b01548152600f8b0154602082015260108b01549181019190915260118a0154606082015260128a0154608082015260139099015460a08a0152969793969295509093509160ff80831692610100900416908b565b600b547501000000000000000000000000000000000000000000900460ff16156108fe5760405162461bcd60e51b81526004016108f59061429f565b60405180910390fd5b600b54604080517f2139353f00000000000000000000000000000000000000000000000000000000815290516a295be96e640669720000009273ffffffffffffffffffffffffffffffffffffffff1691632139353f916004808301926020929190829003018186803b15801561097357600080fd5b505afa158015610987573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ab9190613e18565b10156109c95760405162461bcd60e51b81526004016108f59061437b565b600b80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055565b6001610a16836116ad565b6009811115610a2157fe5b14610a3e5760405162461bcd60e51b81526004016108f59061474c565b6000828152600860209081526040808320338452600d8101909252909120805460ff161580610a845750805460ff168015610a845750600281015460ff16151583151514155b610aa05760405162461bcd60e51b81526004016108f5906146b8565b600b5460009073ffffffffffffffffffffffffffffffffffffffff1663cbf8eda933610acb86612dcb565b6040518363ffffffff1660e01b8152600401610ae8929190613fea565b60206040518083038186803b158015610b0057600080fd5b505afa158015610b14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b389190613e18565b905060008111610b5a5760405162461bcd60e51b81526004016108f5906141ae565b815460ff1615610ba757600282015460ff1615610b8e576001820154600a840154610b8491612dda565b600a840155610ba7565b6001820154600b840154610ba191612dda565b600b8401555b8315610bc657600a830154610bbc9082612e37565b600a840155610bdb565b600b830154610bd59082612e37565b600b8401555b8154600160ff19918216811784558301829055600283018054909116851515179055604051339086907f88d35328232823f54954b6627e9f732371656f6daa40cb1b01b27dc7875a7b4790610c33908890869061411c565b60405180910390a35050505050565b600a6020526000908152604090205481565b806000108015610c6657506007548111155b610c825760405162461bcd60e51b81526004016108f5906142d6565b60008181526009602090815260408083203384526005808201909352922090610caa846116ad565b6009811115610cb557fe5b148015610cc55750600182015415155b610ce15760405162461bcd60e51b81526004016108f590614446565b600b5460018301546040517fcbf8eda900000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff169163cbf8eda991610d4491339160001990910190600401613fea565b60206040518083038186803b158015610d5c57600080fd5b505afa158015610d70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d949190613e18565b825490915060ff16610db85760405162461bcd60e51b81526004016108f59061457f565b600282015460ff1615610dde576003830154610dd49082612dda565b6003840155610df3565b6004830154610ded9082612dda565b60048401555b815460ff199081168355600060018401819055600284018054909216909155604051339186917f5e8ee24f838173ed2ae7989835696f6e11945ac8fbc5259aef01cc4d7f0d49209190a350505050565b600b547501000000000000000000000000000000000000000000900460ff1681565b6009610e70826116ad565b6009811115610e7b57fe5b14610e985760405162461bcd60e51b81526004016108f59061447d565b6000818152600860205260409020600c81015460ff1615610ecb5760405162461bcd60e51b81526004016108f59061447d565b600c8101805460ff1916600117905560005b600482015481101561109157611089826004018281548110610efb57fe5b60009182526020909120015460058401805473ffffffffffffffffffffffffffffffffffffffff9092169184908110610f3057fe5b9060005260206000200154846006018481548110610f4a57fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015610fd85780601f10610fad57610100808354040283529160200191610fd8565b820191906000526020600020905b815481529060010190602001808311610fbb57829003601f168201915b5050505050856007018581548110610fec57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561107a5780601f1061104f5761010080835404028352916020019161107a565b820191906000526020600020905b81548152906001019060200180831161105d57829003601f168201915b50505050508660090154612e98565b600101610edd565b50817f6d7acd63bebeaf524f1761a88687951f776fc7c182205f820424c7fb572c7235336040516110c29190613fc9565b60405180910390a25050565b333014611122576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b613840811015611179576040805162461bcd60e51b815260206004820152601260248201527f706572696f64206d757374206265203e20300000000000000000000000000000604482015290519081900360640190fd5b600155565b60025481565b6060806060806000600860008781526020019081526020016000209050806004018160050182600601836007018380548060200260200160405190810160405280929190818152602001828054801561121357602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116111e8575b505050505093508280548060200260200160405190810160405280929190818152602001828054801561126557602002820191906000526020600020905b815481526020019060010190808311611251575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b828210156113385760008481526020908190208301805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156113245780601f106112f957610100808354040283529160200191611324565b820191906000526020600020905b81548152906001019060200180831161130757829003601f168201915b50505050508152602001906001019061128d565b50505050915080805480602002602001604051908101604052809291908181526020016000905b8282101561140a5760008481526020908190208301805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156113f65780601f106113cb576101008083540402835291602001916113f6565b820191906000526020600020905b8154815290600101906020018083116113d957829003601f168201915b50505050508152602001906001019061135f565b5050505090509450945094509450509193509193565b333014611474576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b6138408110156114cb576040805162461bcd60e51b815260206004820152601260248201527f706572696f64206d757374206265203e20300000000000000000000000000000604482015290519081900360640190fd5b600355565b60056114db836116ad565b60098111156114e657fe5b146115035760405162461bcd60e51b81526004016108f59061430d565b61150b612ec5565b600b546040517fcbf8eda900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063cbf8eda990611567903390600019420190600401613fea565b60206040518083038186803b15801561157f57600080fd5b505afa158015611593573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b79190613e18565b10156115d55760405162461bcd60e51b81526004016108f590614344565b60008281526009602052604090206001810154156116055760405162461bcd60e51b81526004016108f5906144eb565b60008251116116265760405162461bcd60e51b81526004016108f590614177565b42600182015580547fffffffffffffffffffffffff00000000000000000000000000000000000000001633178155815161166990600283019060208501906137db565b50827f27eba018e1c52b84f732fe4d806fd9750c60752f1d37e7f70bcb4cbec65b1c6a3360405161169a9190613fc9565b60405180910390a2505050565b60015481565b60008160001080156116c157506007548211155b6116dd5760405162461bcd60e51b81526004016108f5906142d6565b6000828152600860205260409020600c81015460ff16156117025760029150506117f6565b600c810154610100900460ff161561171e5760089150506117f6565b600e81015460088201540142116117395760009150506117f6565b600f810154600e82015460088301540101421161175a5760019150506117f6565b61176381612f77565b81600b015482600a0154011080611785575061177e81613023565b81600a0154105b156117945760039150506117f6565b60098101546117a75760049150506117f6565b80600901544210156117bd5760059150506117f6565b6117c68361304e565b156117d55760099150506117f6565b601181015460098201540142116117f05760069150506117f6565b60079150505b919050565b611803613867565b50600090815260086020908152604091829020825160c081018452600e8201548152600f82015492810192909252601081015492820192909252601182015460608201526012820154608082015260139091015460a082015290565b600b546000907501000000000000000000000000000000000000000000900460ff1661199157600b54604080517f2139353f00000000000000000000000000000000000000000000000000000000815290516a295be96e640669720000009273ffffffffffffffffffffffffffffffffffffffff1691632139353f916004808301926020929190829003018186803b1580156118fa57600080fd5b505afa15801561190e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119329190613e18565b10156119505760405162461bcd60e51b81526004016108f590614140565b600b80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555b611999612ec5565b600b546040517fcbf8eda900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063cbf8eda9906119f5903390600019420190600401613fea565b60206040518083038186803b158015611a0d57600080fd5b505afa158015611a21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a459190613e18565b1015611a635760405162461bcd60e51b81526004016108f590614344565b85518751148015611a75575084518751145b8015611a82575083518751145b611a9e5760405162461bcd60e51b81526004016108f5906146ef565b8651611abc5760405162461bcd60e51b81526004016108f590614613565b600a87511115611ade5760405162461bcd60e51b81526004016108f59061464a565b6000825111611aff5760405162461bcd60e51b81526004016108f59061440f565b6000835111611b205760405162461bcd60e51b81526004016108f590614177565b336000908152600a60205260409020548015611b5c57611b3f81613118565b15611b5c5760405162461bcd60e51b81526004016108f5906144b4565b6007546001908101600081815260086020908152604090912082815592830180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790558651919291611bba916002840191908901906137db565b508451611bd090600383019060208801906137db565b508951611be690600483019060208d019061389d565b508851611bfc90600583019060208c0190613917565b508751611c1290600683019060208b0190613951565b508651611c2890600783019060208a01906139aa565b506000194201600882015560008054600e830155600154600f83015560025460108301556003546011830155600454601283015560055460138301556007839055338152600a60205260408082208490555183917fc2c021f5d73c63c481d336fbbafec58f694fc45095f00b02d2deb8cca59afe0791a25098975050505050505050565b333014611d00576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b600255565b333014611d59576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b60058111611dae576040805162461bcd60e51b815260206004820152601d60248201527f71756f72756d206d7573742062652067726561746572207468616e2035000000604482015290519081900360640190fd5b6064811115611e04576040805162461bcd60e51b815260206004820152600f60248201527f4d6178696d756d206973203130302e0000000000000000000000000000000000604482015290519081900360640190fd5b600555565b60005481565b60075481565b60096020908152600091825260409182902080546001808301546002808501805488516101009582161595909502600019011691909104601f810187900487028401870190975286835273ffffffffffffffffffffffffffffffffffffffff909316959094919291830182828015611ece5780601f10611ea357610100808354040283529160200191611ece565b820191906000526020600020905b815481529060010190602001808311611eb157829003601f168201915b5050505050908060030154908060040154905085565b333014611f38576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b600055565b816000108015611f4f57506007548211155b611f6b5760405162461bcd60e51b81526004016108f5906142d6565b60008281526009602052604090206005611f84846116ad565b6009811115611f8f57fe5b148015611f9f5750600181015415155b611fbb5760405162461bcd60e51b81526004016108f590614446565b3360009081526005820160205260409020805460ff161580611ff45750805460ff168015611ff45750600281015460ff16151583151514155b6120105760405162461bcd60e51b81526004016108f5906146b8565b600b5460018301546040517fcbf8eda900000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff169163cbf8eda99161207391339160001990910190600401613fea565b60206040518083038186803b15801561208b57600080fd5b505afa15801561209f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c39190613e18565b9050600081116120e55760405162461bcd60e51b81526004016108f5906141ae565b815460ff161561213257600282015460ff1615612119576001820154600384015461210f91612dda565b6003840155612132565b6001820154600484015461212c91612dda565b60048401555b83156121515760038301546121479082612e37565b6003840155612166565b60048301546121609082612e37565b60048401555b8154600160ff19918216811784558301829055600283018054909116851515179055604051339086907f80f2ad7e3e83d197670402663f224adb2f649967b9629c67dcfafa40c94d30f990610c33908890869061411c565b60045481565b60055481565b60016121d5826116ad565b60098111156121e057fe5b146121fd5760405162461bcd60e51b81526004016108f59061474c565b600081815260086020908152604080832033808552600d8201909352908320600b5491939092909173ffffffffffffffffffffffffffffffffffffffff169063cbf8eda99061224b86612dcb565b6040518363ffffffff1660e01b8152600401612268929190613fea565b60206040518083038186803b15801561228057600080fd5b505afa158015612294573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122b89190613e18565b825490915060ff166122dc5760405162461bcd60e51b81526004016108f59061457f565b600282015460ff161561230257600a8301546122f89082612dda565b600a840155612317565b600b8301546123119082612dda565b600b8401555b815460ff199081168355600060018401819055600284018054909216909155604051339186917f12beef84830227673717dd5522ee1228a8004e88dc2678d8740f582264efb2b69190a350505050565b60035481565b600b5474010000000000000000000000000000000000000000900460ff16156123a85760405162461bcd60e51b81526004016108f590614548565b73ffffffffffffffffffffffffffffffffffffffff81166123db5760405162461bcd60e51b81526004016108f590614681565b600b80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff9093167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116179190911674010000000000000000000000000000000000000000179055565b600081600010801561247057506007548211155b61248c5760405162461bcd60e51b81526004016108f5906142d6565b60008281526008602052604090206124a390612f77565b92915050565b3330146124fd576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b6064811115612553576040805162461bcd60e51b815260206004820152600f60248201527f4d6178696d756d206973203130302e0000000000000000000000000000000000604482015290519081900360640190fd5b603281116125a8576040805162461bcd60e51b815260206004820152600e60248201527f4d696e696d756d2069732035302e000000000000000000000000000000000000604482015290519081900360640190fd5b600455565b60046125b8826116ad565b60098111156125c357fe5b146125e05760405162461bcd60e51b81526004016108f5906141e5565b600081815260086020819052604082206010810154600f820154600e830154938301549093019092019091016009820181905590915b600483015481101561299857600660006127c285600401848154811061263857fe5b60009182526020909120015460058701805473ffffffffffffffffffffffffffffffffffffffff909216918690811061266d57fe5b906000526020600020015487600601868154811061268757fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156127155780601f106126ea57610100808354040283529160200191612715565b820191906000526020600020905b8154815290600101906020018083116126f857829003601f168201915b505050505088600701878154811061272957fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156127b75780601f1061278c576101008083540402835291602001916127b7565b820191906000526020600020905b81548152906001019060200180831161279a57829003601f168201915b505050505088613194565b815260208101919091526040016000205460ff16156127f35760405162461bcd60e51b81526004016108f5906143b2565b61298f83600401828154811061280557fe5b60009182526020909120015460058501805473ffffffffffffffffffffffffffffffffffffffff909216918490811061283a57fe5b906000526020600020015485600601848154811061285457fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156128e25780601f106128b7576101008083540402835291602001916128e2565b820191906000526020600020905b8154815290600101906020018083116128c557829003601f168201915b50505050508660070185815481106128f657fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156129845780601f1061295957610100808354040283529160200191612984565b820191906000526020600020905b81548152906001019060200180831161296757829003601f168201915b5050505050866132bf565b50600101612616565b50827ff7230a453b4c21e4f2d0ef1ad055635b08cb2c884eaf24a5ddc7147c79fd8c22338360405161169a929190613fea565b6129d4816132f4565b6129f05760405162461bcd60e51b81526004016108f5906145b6565b6129f98161331e565b612a155760405162461bcd60e51b81526004016108f590614242565b6000818152600860205260408120600c8101805460ff19166001179055905b6004820154811015612a5a57612a52826004018281548110610efb57fe5b600101612a34565b50817f253042c67143aeb6d431bb762d75e5905f18fa7850b7b9edb31fedb7c362d7e8336040516110c29190613fc9565b612a93613a03565b50600091825260086020908152604080842073ffffffffffffffffffffffffffffffffffffffff939093168452600d9092018152918190208151606081018352815460ff9081161515825260018301549482019490945260029091015490921615159082015290565b612b04613a03565b50600091825260096020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845260059092018152918190208151606081018352815460ff9081161515825260018301549482019490945260029091015490921615159082015290565b60066020526000908152604090205460ff1681565b612b8b8161341d565b612ba75760405162461bcd60e51b81526004016108f590614783565b6000818152600860205260408120600c810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055905b6004820154811015612d9a57612d91826004018281548110612c0357fe5b60009182526020909120015460058401805473ffffffffffffffffffffffffffffffffffffffff9092169184908110612c3857fe5b9060005260206000200154846006018481548110612c5257fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612ce05780601f10612cb557610100808354040283529160200191612ce0565b820191906000526020600020905b815481529060010190602001808311612cc357829003601f168201915b5050505050856007018581548110612cf457fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612d825780601f10612d5757610100808354040283529160200191612d82565b820191906000526020600020905b815481529060010190602001808311612d6557829003601f168201915b5050505050866009015461343c565b50600101612be5565b50817f9c85b616f29fca57a17eafe71cf9ff82ffef41766e2cf01ea7f8f7878dd3ec24336040516110c29190613fc9565b600e8101546008909101540190565b600082821115612e31576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082820183811015612e91576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6000612ea78686868686613194565b6000908152600660205260409020805460ff19169055505050505050565b6000612f726064600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632139353f6040518163ffffffff1660e01b815260040160206040518083038186803b158015612f3457600080fd5b505afa158015612f48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f6c9190613e18565b9061371b565b905090565b6013810154600b546000916124a391606491612f6c9173ffffffffffffffffffffffffffffffffffffffff1663e5190046612fb188612dcb565b6040518263ffffffff1660e01b8152600401612fcd91906147ed565b60206040518083038186803b158015612fe557600080fd5b505afa158015612ff9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061301d9190613e18565b90613782565b60006124a36064612f6c84600e016004015485600b015486600a01540161378290919063ffffffff16565b6000818152600860209081526040808320600990925282206001810154158061307a5750816009015442105b1561308a576000925050506117f6565b600b5460018201546040517fe51900460000000000000000000000000000000000000000000000000000000081526131099260029273ffffffffffffffffffffffffffffffffffffffff9091169163e5190046916130f191600019909101906004016147ed565b60206040518083038186803b158015612f3457600080fd5b60039091015410159392505050565b600080613124836116ad565b9050600081600981111561313457fe5b148061314b5750600181600981111561314957fe5b145b806131615750600481600981111561315f57fe5b145b806131775750600581600981111561317557fe5b145b80612e91575060065b81600981111561318c57fe5b149392505050565b60008585858585604051602001808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b838110156132075781810151838201526020016131ef565b50505050905090810190601f1680156132345780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838360005b8381101561326757818101518382015260200161324f565b50505050905090810190601f1680156132945780820380516001836020036101000a031916815260200191505b5097505050505050505060405160208183030381529060405280519060200120905095945050505050565b6000806132cf8787878787613194565b6000818152600660205260409020805460ff1916600117905591505095945050505050565b600080613300836116ad565b9050600081600981111561331057fe5b1480612e9157506001613180565b6000818152600860205260408120600181015473ffffffffffffffffffffffffffffffffffffffff163314806134055750613357612ec5565b600b5460018301546040517fc07473f600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283169263c07473f6926133b392911690600401613fc9565b60206040518083038186803b1580156133cb57600080fd5b505afa1580156133df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134039190613e18565b105b156134145760019150506117f6565b50600092915050565b6000600661342a836116ad565b600981111561343557fe5b1492915050565b6060600061344d8787878787613194565b90508242101561348e5760405162461bcd60e51b815260040180806020018281038252603b8152602001806148ce603b913960400191505060405180910390fd5b60035483014211156134d15760405162461bcd60e51b81526004018080602001828103825260298152602001806149096029913960400191505060405180910390fd5b6000818152600660205260409020805460ff1916905584516060906134f75750836135ad565b85805190602001208560405160200180837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260040182805190602001908083835b6020831061357557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613538565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405290505b6000808973ffffffffffffffffffffffffffffffffffffffff1689846040518082805190602001908083835b6020831061361657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016135d9565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613678576040519150601f19603f3d011682016040523d82523d6000602084013e61367d565b606091505b509150915081819061370d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156136d25781810151838201526020016136ba565b50505050905090810190601f1680156136ff5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b509998505050505050505050565b6000808211613771576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161377a57fe5b049392505050565b600082613791575060006124a3565b8282028284828161379e57fe5b0414612e915760405162461bcd60e51b81526004018080602001828103825260218152602001806149326021913960400191505060405180910390fd5b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826138115760008555613857565b82601f1061382a57805160ff1916838001178555613857565b82800160010185558215613857579182015b8281111561385757825182559160200191906001019061383c565b50613863929150613a23565b5090565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b828054828255906000526020600020908101928215613857579160200282015b8281111561385757825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161782556020909201916001909101906138bd565b828054828255906000526020600020908101928215613857579160200282018281111561385757825182559160200191906001019061383c565b82805482825590600052602060002090810192821561399e579160200282015b8281111561399e578251805161398e9184916020909101906137db565b5091602001919060010190613971565b50613863929150613a38565b8280548282559060005260206000209081019282156139f7579160200282015b828111156139f757825180516139e79184916020909101906137db565b50916020019190600101906139ca565b50613863929150613a55565b604080516060810182526000808252602082018190529181019190915290565b5b808211156138635760008155600101613a24565b80821115613863576000613a4c8282613a72565b50600101613a38565b80821115613863576000613a698282613a72565b50600101613a55565b50805460018160011615610100020316600290046000825580601f10613a985750613ab6565b601f016020900490600052602060002090810190613ab69190613a23565b50565b600067ffffffffffffffff831115613acd57fe5b613afe60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8601160161488b565b9050828152838383011115613b1257600080fd5b828260208301376000602084830101529392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146117f657600080fd5b600082601f830112613b5d578081fd5b81356020613b72613b6d836148af565b61488b565b8281528181019085830183850287018401881015613b8e578586fd5b855b85811015613bb357613ba182613b29565b84529284019290840190600101613b90565b5090979650505050505050565b600082601f830112613bd0578081fd5b81356020613be0613b6d836148af565b82815281810190858301855b85811015613bb3578135880189603f820112613c06578788fd5b613c178a8783013560408401613ab9565b8552509284019290840190600101613bec565b600082601f830112613c3a578081fd5b81356020613c4a613b6d836148af565b82815281810190858301855b85811015613bb357613c6d898684358b0101613cd9565b84529284019290840190600101613c56565b600082601f830112613c8f578081fd5b81356020613c9f613b6d836148af565b8281528181019085830183850287018401881015613cbb578586fd5b855b85811015613bb357813584529284019290840190600101613cbd565b600082601f830112613ce9578081fd5b612e9183833560208501613ab9565b600060208284031215613d09578081fd5b612e9182613b29565b60008060008060008060c08789031215613d2a578182fd5b863567ffffffffffffffff80821115613d41578384fd5b613d4d8a838b01613b4d565b97506020890135915080821115613d62578384fd5b613d6e8a838b01613c7f565b96506040890135915080821115613d83578384fd5b613d8f8a838b01613c2a565b95506060890135915080821115613da4578384fd5b613db08a838b01613bc0565b94506080890135915080821115613dc5578384fd5b613dd18a838b01613cd9565b935060a0890135915080821115613de6578283fd5b50613df389828a01613cd9565b9150509295509295509295565b600060208284031215613e11578081fd5b5035919050565b600060208284031215613e29578081fd5b5051919050565b60008060408385031215613e42578182fd5b82359150613e5260208401613b29565b90509250929050565b60008060408385031215613e6d578182fd5b8235915060208301358015158114613e83578182fd5b809150509250929050565b60008060408385031215613ea0578182fd5b82359150602083013567ffffffffffffffff811115613ebd578182fd5b613ec985828601613cd9565b9150509250929050565b6000815180845260208085018081965082840281019150828601855b85811015613f19578284038952613f07848351613f26565b98850198935090840190600101613eef565b5091979650505050505050565b60008151808452815b81811015613f4b57602081850181015186830182015201613f2f565b81811115613f5c5782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a08301525050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff8716825285602083015260a0604083015261404560a0830186613f26565b606083019490945250608001529392505050565b6080808252855190820181905260009060209060a0840190828901845b828110156140a857815173ffffffffffffffffffffffffffffffffffffffff1684529284019290840190600101614076565b50505083810382850152865180825287830191830190845b818110156140dc578351835292840192918401916001016140c0565b505084810360408601526140f08188613ed3565b9250505082810360608401526141068185613ed3565b979650505050505050565b901515815260200190565b9115158252602082015260400190565b60208101600a831061413a57fe5b91905290565b60208082526012908201527f44414f206e6f7420796574206163746976650000000000000000000000000000604082015260600190565b6020808252601a908201527f6465736372697074696f6e2063616e277420626520656d707479000000000000604082015260600190565b6020808252600f908201527f6e6f20766f74696e6720706f7765720000000000000000000000000000000000604082015260600190565b6020808252602e908201527f50726f706f73616c2063616e206f6e6c7920626520717565756564206966206960408201527f7420697320737563636565646564000000000000000000000000000000000000606082015260800190565b60208082526021908201527f43616e63656c6c6174696f6e20726571756972656d656e7473206e6f74206d6560408201527f7400000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526012908201527f44414f20616c7265616479206163746976650000000000000000000000000000604082015260600190565b60208082526013908201527f696e76616c69642070726f706f73616c20696400000000000000000000000000604082015260600190565b60208082526019908201527f50726f706f73616c206d75737420626520696e20717565756500000000000000604082015260600190565b6020808252601a908201527f4372656174696f6e207468726573686f6c64206e6f74206d6574000000000000604082015260600190565b60208082526015908201527f5468726573686f6c64206e6f74206d6574207965740000000000000000000000604082015260600190565b60208082526025908201527f70726f706f73616c20616374696f6e20616c726561647920717565756564206160408201527f7420657461000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526014908201527f7469746c652063616e277420626520656d707479000000000000000000000000604082015260600190565b6020808252601e908201527f4162726f676174696f6e2050726f706f73616c206e6f74206163746976650000604082015260600190565b60208082526013908201527f43616e6e6f74206265206162726f676174656400000000000000000000000000604082015260600190565b6020808252601e908201527f4f6e65206c6976652070726f706f73616c207065722070726f706f7365720000604082015260600190565b60208082526022908201527f4162726f676174696f6e2070726f706f73616c20616c7265616479206578697360408201527f7473000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601d908201527f436f6e747261637420616c726561647920696e697469616c697a65642e000000604082015260600190565b6020808252601e908201527f43616e6e6f742063616e63656c206966206e6f7420766f746564207965740000604082015260600190565b60208082526032908201527f50726f706f73616c20696e207374617465207468617420646f6573206e6f742060408201527f616c6c6f772063616e63656c6c6174696f6e0000000000000000000000000000606082015260800190565b60208082526014908201527f4d7573742070726f7669646520616374696f6e73000000000000000000000000604082015260600190565b6020808252601a908201527f546f6f206d616e7920616374696f6e73206f6e206120766f7465000000000000604082015260600190565b60208082526019908201527f73757065726e6f7661206d757374206e6f742062652030783000000000000000604082015260600190565b60208082526019908201527f416c726561647920766f7465642074686973206f7074696f6e00000000000000604082015260600190565b6020808252602c908201527f50726f706f73616c2066756e6374696f6e20696e666f726d6174696f6e20617260408201527f697479206d69736d617463680000000000000000000000000000000000000000606082015260800190565b60208082526010908201527f566f74696e6720697320636c6f73656400000000000000000000000000000000604082015260600190565b60208082526012908201527f43616e6e6f742062652065786563757465640000000000000000000000000000604082015260600190565b60c081016124a38284613f8f565b8151151581526020808301519082015260409182015115159181019190915260600190565b90815260200190565b60006102008d835273ffffffffffffffffffffffffffffffffffffffff8d16602084015280604084015261482c8184018d613f26565b90508281036060840152614840818c613f26565b9150508860808301528760a08301528660c08301528560e083015284151561010083015283151561012083015261487b610140830184613f8f565b9c9b505050505050505050505050565b60405181810167ffffffffffffffff811182821017156148a757fe5b604052919050565b600067ffffffffffffffff8211156148c357fe5b506020908102019056fe657865637574655472616e73616374696f6e3a205472616e73616374696f6e206861736e2774207375727061737365642074696d65206c6f636b2e657865637574655472616e73616374696f6e3a205472616e73616374696f6e206973207374616c652e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a2646970667358221220aedc1117df8a9a88ae6cd920d906ce9db5260ae69cb9c20fd53f95741aa0ba3564736f6c63430007060033
Deployed Bytecode
0x6080604052600436106102535760003560e01c80635f2e9f6011610138578063c4d66de8116100b0578063e0a8f6f51161007f578063e4e2d26111610064578063e4e2d261146106a0578063f2b06537146106c0578063fe0d94c1146106e05761025a565b8063e0a8f6f514610653578063e23a9a52146106735761025a565b8063c4d66de8146105d3578063d0cd595e146105f3578063d1291f1914610613578063ddf0b009146106335761025a565b80639e70a23411610107578063b5a127e5116100ec578063b5a127e514610589578063bacbe2da1461059e578063c099f575146105be5761025a565b80639e70a23414610554578063b0edbb9b146105745761025a565b80635f2e9f60146104d957806374cb3041146104ee5780638b787e3014610503578063984690db146105345761025a565b8063328dd982116101cb5780633e4f49e61161019a578063490145c81161017f578063490145c81461047957806353e5056a14610499578063563909de146104b95761025a565b80633e4f49e61461041f578063458921551461044c5761025a565b8063328dd9821461039a578063342d067a146103ca57806339e778ee146103ea5780633d05f0091461040a5761025a565b80631e9d1e641161022257806324b437871161020757806324b437871461034557806324cd62d3146103655780632e8e34e1146103855761025a565b80631e9d1e641461030357806322f3e2d4146103235761025a565b8063013cf08b1461025f5780630f15f4c01461029f57806315373e3d146102b657806317977c61146102d65761025a565b3661025a57005b600080fd5b34801561026b57600080fd5b5061027f61027a366004613e00565b6106f3565b6040516102969b9a999897969594939291906147f6565b60405180910390f35b3480156102ab57600080fd5b506102b46108b9565b005b3480156102c257600080fd5b506102b46102d1366004613e5b565b610a0b565b3480156102e257600080fd5b506102f66102f1366004613cf8565b610c42565b60405161029691906147ed565b34801561030f57600080fd5b506102b461031e366004613e00565b610c54565b34801561032f57600080fd5b50610338610e43565b6040516102969190614111565b34801561035157600080fd5b506102b4610360366004613e00565b610e65565b34801561037157600080fd5b506102b4610380366004613e00565b6110ce565b34801561039157600080fd5b506102f661117e565b3480156103a657600080fd5b506103ba6103b5366004613e00565b611184565b6040516102969493929190614059565b3480156103d657600080fd5b506102b46103e5366004613e00565b611420565b3480156103f657600080fd5b506102b4610405366004613e8e565b6114d0565b34801561041657600080fd5b506102f66116a7565b34801561042b57600080fd5b5061043f61043a366004613e00565b6116ad565b604051610296919061412c565b34801561045857600080fd5b5061046c610467366004613e00565b6117fb565b60405161029691906147ba565b34801561048557600080fd5b506102f6610494366004613d12565b61185f565b3480156104a557600080fd5b506102b46104b4366004613e00565b611cac565b3480156104c557600080fd5b506102b46104d4366004613e00565b611d05565b3480156104e557600080fd5b506102f6611e09565b3480156104fa57600080fd5b506102f6611e0f565b34801561050f57600080fd5b5061052361051e366004613e00565b611e15565b604051610296959493929190614010565b34801561054057600080fd5b506102b461054f366004613e00565b611ee4565b34801561056057600080fd5b506102b461056f366004613e5b565b611f3d565b34801561058057600080fd5b506102f66121be565b34801561059557600080fd5b506102f66121c4565b3480156105aa57600080fd5b506102b46105b9366004613e00565b6121ca565b3480156105ca57600080fd5b506102f6612367565b3480156105df57600080fd5b506102b46105ee366004613cf8565b61236d565b3480156105ff57600080fd5b506102f661060e366004613e00565b61245c565b34801561061f57600080fd5b506102b461062e366004613e00565b6124a9565b34801561063f57600080fd5b506102b461064e366004613e00565b6125ad565b34801561065f57600080fd5b506102b461066e366004613e00565b6129cb565b34801561067f57600080fd5b5061069361068e366004613e30565b612a8b565b60405161029691906147c8565b3480156106ac57600080fd5b506106936106bb366004613e30565b612afc565b3480156106cc57600080fd5b506103386106db366004613e00565b612b6d565b6102b46106ee366004613e00565b612b82565b60086020908152600091825260409182902080546001808301546002808501805488516101009582161595909502600019011691909104601f8101879004870284018701909752868352929573ffffffffffffffffffffffffffffffffffffffff909116949192918301828280156107ac5780601f10610781576101008083540402835291602001916107ac565b820191906000526020600020905b81548152906001019060200180831161078f57829003601f168201915b5050505060038301805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815294959493509083018282801561083c5780601f106108115761010080835404028352916020019161083c565b820191906000526020600020905b81548152906001019060200180831161081f57829003601f168201915b50505060088401546009850154600a860154600b870154600c8801546040805160c081018252600e8b01548152600f8b0154602082015260108b01549181019190915260118a0154606082015260128a0154608082015260139099015460a08a0152969793969295509093509160ff80831692610100900416908b565b600b547501000000000000000000000000000000000000000000900460ff16156108fe5760405162461bcd60e51b81526004016108f59061429f565b60405180910390fd5b600b54604080517f2139353f00000000000000000000000000000000000000000000000000000000815290516a295be96e640669720000009273ffffffffffffffffffffffffffffffffffffffff1691632139353f916004808301926020929190829003018186803b15801561097357600080fd5b505afa158015610987573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ab9190613e18565b10156109c95760405162461bcd60e51b81526004016108f59061437b565b600b80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055565b6001610a16836116ad565b6009811115610a2157fe5b14610a3e5760405162461bcd60e51b81526004016108f59061474c565b6000828152600860209081526040808320338452600d8101909252909120805460ff161580610a845750805460ff168015610a845750600281015460ff16151583151514155b610aa05760405162461bcd60e51b81526004016108f5906146b8565b600b5460009073ffffffffffffffffffffffffffffffffffffffff1663cbf8eda933610acb86612dcb565b6040518363ffffffff1660e01b8152600401610ae8929190613fea565b60206040518083038186803b158015610b0057600080fd5b505afa158015610b14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b389190613e18565b905060008111610b5a5760405162461bcd60e51b81526004016108f5906141ae565b815460ff1615610ba757600282015460ff1615610b8e576001820154600a840154610b8491612dda565b600a840155610ba7565b6001820154600b840154610ba191612dda565b600b8401555b8315610bc657600a830154610bbc9082612e37565b600a840155610bdb565b600b830154610bd59082612e37565b600b8401555b8154600160ff19918216811784558301829055600283018054909116851515179055604051339086907f88d35328232823f54954b6627e9f732371656f6daa40cb1b01b27dc7875a7b4790610c33908890869061411c565b60405180910390a35050505050565b600a6020526000908152604090205481565b806000108015610c6657506007548111155b610c825760405162461bcd60e51b81526004016108f5906142d6565b60008181526009602090815260408083203384526005808201909352922090610caa846116ad565b6009811115610cb557fe5b148015610cc55750600182015415155b610ce15760405162461bcd60e51b81526004016108f590614446565b600b5460018301546040517fcbf8eda900000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff169163cbf8eda991610d4491339160001990910190600401613fea565b60206040518083038186803b158015610d5c57600080fd5b505afa158015610d70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d949190613e18565b825490915060ff16610db85760405162461bcd60e51b81526004016108f59061457f565b600282015460ff1615610dde576003830154610dd49082612dda565b6003840155610df3565b6004830154610ded9082612dda565b60048401555b815460ff199081168355600060018401819055600284018054909216909155604051339186917f5e8ee24f838173ed2ae7989835696f6e11945ac8fbc5259aef01cc4d7f0d49209190a350505050565b600b547501000000000000000000000000000000000000000000900460ff1681565b6009610e70826116ad565b6009811115610e7b57fe5b14610e985760405162461bcd60e51b81526004016108f59061447d565b6000818152600860205260409020600c81015460ff1615610ecb5760405162461bcd60e51b81526004016108f59061447d565b600c8101805460ff1916600117905560005b600482015481101561109157611089826004018281548110610efb57fe5b60009182526020909120015460058401805473ffffffffffffffffffffffffffffffffffffffff9092169184908110610f3057fe5b9060005260206000200154846006018481548110610f4a57fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015610fd85780601f10610fad57610100808354040283529160200191610fd8565b820191906000526020600020905b815481529060010190602001808311610fbb57829003601f168201915b5050505050856007018581548110610fec57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561107a5780601f1061104f5761010080835404028352916020019161107a565b820191906000526020600020905b81548152906001019060200180831161105d57829003601f168201915b50505050508660090154612e98565b600101610edd565b50817f6d7acd63bebeaf524f1761a88687951f776fc7c182205f820424c7fb572c7235336040516110c29190613fc9565b60405180910390a25050565b333014611122576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b613840811015611179576040805162461bcd60e51b815260206004820152601260248201527f706572696f64206d757374206265203e20300000000000000000000000000000604482015290519081900360640190fd5b600155565b60025481565b6060806060806000600860008781526020019081526020016000209050806004018160050182600601836007018380548060200260200160405190810160405280929190818152602001828054801561121357602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116111e8575b505050505093508280548060200260200160405190810160405280929190818152602001828054801561126557602002820191906000526020600020905b815481526020019060010190808311611251575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b828210156113385760008481526020908190208301805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156113245780601f106112f957610100808354040283529160200191611324565b820191906000526020600020905b81548152906001019060200180831161130757829003601f168201915b50505050508152602001906001019061128d565b50505050915080805480602002602001604051908101604052809291908181526020016000905b8282101561140a5760008481526020908190208301805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156113f65780601f106113cb576101008083540402835291602001916113f6565b820191906000526020600020905b8154815290600101906020018083116113d957829003601f168201915b50505050508152602001906001019061135f565b5050505090509450945094509450509193509193565b333014611474576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b6138408110156114cb576040805162461bcd60e51b815260206004820152601260248201527f706572696f64206d757374206265203e20300000000000000000000000000000604482015290519081900360640190fd5b600355565b60056114db836116ad565b60098111156114e657fe5b146115035760405162461bcd60e51b81526004016108f59061430d565b61150b612ec5565b600b546040517fcbf8eda900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063cbf8eda990611567903390600019420190600401613fea565b60206040518083038186803b15801561157f57600080fd5b505afa158015611593573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b79190613e18565b10156115d55760405162461bcd60e51b81526004016108f590614344565b60008281526009602052604090206001810154156116055760405162461bcd60e51b81526004016108f5906144eb565b60008251116116265760405162461bcd60e51b81526004016108f590614177565b42600182015580547fffffffffffffffffffffffff00000000000000000000000000000000000000001633178155815161166990600283019060208501906137db565b50827f27eba018e1c52b84f732fe4d806fd9750c60752f1d37e7f70bcb4cbec65b1c6a3360405161169a9190613fc9565b60405180910390a2505050565b60015481565b60008160001080156116c157506007548211155b6116dd5760405162461bcd60e51b81526004016108f5906142d6565b6000828152600860205260409020600c81015460ff16156117025760029150506117f6565b600c810154610100900460ff161561171e5760089150506117f6565b600e81015460088201540142116117395760009150506117f6565b600f810154600e82015460088301540101421161175a5760019150506117f6565b61176381612f77565b81600b015482600a0154011080611785575061177e81613023565b81600a0154105b156117945760039150506117f6565b60098101546117a75760049150506117f6565b80600901544210156117bd5760059150506117f6565b6117c68361304e565b156117d55760099150506117f6565b601181015460098201540142116117f05760069150506117f6565b60079150505b919050565b611803613867565b50600090815260086020908152604091829020825160c081018452600e8201548152600f82015492810192909252601081015492820192909252601182015460608201526012820154608082015260139091015460a082015290565b600b546000907501000000000000000000000000000000000000000000900460ff1661199157600b54604080517f2139353f00000000000000000000000000000000000000000000000000000000815290516a295be96e640669720000009273ffffffffffffffffffffffffffffffffffffffff1691632139353f916004808301926020929190829003018186803b1580156118fa57600080fd5b505afa15801561190e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119329190613e18565b10156119505760405162461bcd60e51b81526004016108f590614140565b600b80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555b611999612ec5565b600b546040517fcbf8eda900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063cbf8eda9906119f5903390600019420190600401613fea565b60206040518083038186803b158015611a0d57600080fd5b505afa158015611a21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a459190613e18565b1015611a635760405162461bcd60e51b81526004016108f590614344565b85518751148015611a75575084518751145b8015611a82575083518751145b611a9e5760405162461bcd60e51b81526004016108f5906146ef565b8651611abc5760405162461bcd60e51b81526004016108f590614613565b600a87511115611ade5760405162461bcd60e51b81526004016108f59061464a565b6000825111611aff5760405162461bcd60e51b81526004016108f59061440f565b6000835111611b205760405162461bcd60e51b81526004016108f590614177565b336000908152600a60205260409020548015611b5c57611b3f81613118565b15611b5c5760405162461bcd60e51b81526004016108f5906144b4565b6007546001908101600081815260086020908152604090912082815592830180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790558651919291611bba916002840191908901906137db565b508451611bd090600383019060208801906137db565b508951611be690600483019060208d019061389d565b508851611bfc90600583019060208c0190613917565b508751611c1290600683019060208b0190613951565b508651611c2890600783019060208a01906139aa565b506000194201600882015560008054600e830155600154600f83015560025460108301556003546011830155600454601283015560055460138301556007839055338152600a60205260408082208490555183917fc2c021f5d73c63c481d336fbbafec58f694fc45095f00b02d2deb8cca59afe0791a25098975050505050505050565b333014611d00576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b600255565b333014611d59576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b60058111611dae576040805162461bcd60e51b815260206004820152601d60248201527f71756f72756d206d7573742062652067726561746572207468616e2035000000604482015290519081900360640190fd5b6064811115611e04576040805162461bcd60e51b815260206004820152600f60248201527f4d6178696d756d206973203130302e0000000000000000000000000000000000604482015290519081900360640190fd5b600555565b60005481565b60075481565b60096020908152600091825260409182902080546001808301546002808501805488516101009582161595909502600019011691909104601f810187900487028401870190975286835273ffffffffffffffffffffffffffffffffffffffff909316959094919291830182828015611ece5780601f10611ea357610100808354040283529160200191611ece565b820191906000526020600020905b815481529060010190602001808311611eb157829003601f168201915b5050505050908060030154908060040154905085565b333014611f38576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b600055565b816000108015611f4f57506007548211155b611f6b5760405162461bcd60e51b81526004016108f5906142d6565b60008281526009602052604090206005611f84846116ad565b6009811115611f8f57fe5b148015611f9f5750600181015415155b611fbb5760405162461bcd60e51b81526004016108f590614446565b3360009081526005820160205260409020805460ff161580611ff45750805460ff168015611ff45750600281015460ff16151583151514155b6120105760405162461bcd60e51b81526004016108f5906146b8565b600b5460018301546040517fcbf8eda900000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff169163cbf8eda99161207391339160001990910190600401613fea565b60206040518083038186803b15801561208b57600080fd5b505afa15801561209f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c39190613e18565b9050600081116120e55760405162461bcd60e51b81526004016108f5906141ae565b815460ff161561213257600282015460ff1615612119576001820154600384015461210f91612dda565b6003840155612132565b6001820154600484015461212c91612dda565b60048401555b83156121515760038301546121479082612e37565b6003840155612166565b60048301546121609082612e37565b60048401555b8154600160ff19918216811784558301829055600283018054909116851515179055604051339086907f80f2ad7e3e83d197670402663f224adb2f649967b9629c67dcfafa40c94d30f990610c33908890869061411c565b60045481565b60055481565b60016121d5826116ad565b60098111156121e057fe5b146121fd5760405162461bcd60e51b81526004016108f59061474c565b600081815260086020908152604080832033808552600d8201909352908320600b5491939092909173ffffffffffffffffffffffffffffffffffffffff169063cbf8eda99061224b86612dcb565b6040518363ffffffff1660e01b8152600401612268929190613fea565b60206040518083038186803b15801561228057600080fd5b505afa158015612294573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122b89190613e18565b825490915060ff166122dc5760405162461bcd60e51b81526004016108f59061457f565b600282015460ff161561230257600a8301546122f89082612dda565b600a840155612317565b600b8301546123119082612dda565b600b8401555b815460ff199081168355600060018401819055600284018054909216909155604051339186917f12beef84830227673717dd5522ee1228a8004e88dc2678d8740f582264efb2b69190a350505050565b60035481565b600b5474010000000000000000000000000000000000000000900460ff16156123a85760405162461bcd60e51b81526004016108f590614548565b73ffffffffffffffffffffffffffffffffffffffff81166123db5760405162461bcd60e51b81526004016108f590614681565b600b80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff9093167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116179190911674010000000000000000000000000000000000000000179055565b600081600010801561247057506007548211155b61248c5760405162461bcd60e51b81526004016108f5906142d6565b60008281526008602052604090206124a390612f77565b92915050565b3330146124fd576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b6064811115612553576040805162461bcd60e51b815260206004820152600f60248201527f4d6178696d756d206973203130302e0000000000000000000000000000000000604482015290519081900360640190fd5b603281116125a8576040805162461bcd60e51b815260206004820152600e60248201527f4d696e696d756d2069732035302e000000000000000000000000000000000000604482015290519081900360640190fd5b600455565b60046125b8826116ad565b60098111156125c357fe5b146125e05760405162461bcd60e51b81526004016108f5906141e5565b600081815260086020819052604082206010810154600f820154600e830154938301549093019092019091016009820181905590915b600483015481101561299857600660006127c285600401848154811061263857fe5b60009182526020909120015460058701805473ffffffffffffffffffffffffffffffffffffffff909216918690811061266d57fe5b906000526020600020015487600601868154811061268757fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156127155780601f106126ea57610100808354040283529160200191612715565b820191906000526020600020905b8154815290600101906020018083116126f857829003601f168201915b505050505088600701878154811061272957fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156127b75780601f1061278c576101008083540402835291602001916127b7565b820191906000526020600020905b81548152906001019060200180831161279a57829003601f168201915b505050505088613194565b815260208101919091526040016000205460ff16156127f35760405162461bcd60e51b81526004016108f5906143b2565b61298f83600401828154811061280557fe5b60009182526020909120015460058501805473ffffffffffffffffffffffffffffffffffffffff909216918490811061283a57fe5b906000526020600020015485600601848154811061285457fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156128e25780601f106128b7576101008083540402835291602001916128e2565b820191906000526020600020905b8154815290600101906020018083116128c557829003601f168201915b50505050508660070185815481106128f657fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156129845780601f1061295957610100808354040283529160200191612984565b820191906000526020600020905b81548152906001019060200180831161296757829003601f168201915b5050505050866132bf565b50600101612616565b50827ff7230a453b4c21e4f2d0ef1ad055635b08cb2c884eaf24a5ddc7147c79fd8c22338360405161169a929190613fea565b6129d4816132f4565b6129f05760405162461bcd60e51b81526004016108f5906145b6565b6129f98161331e565b612a155760405162461bcd60e51b81526004016108f590614242565b6000818152600860205260408120600c8101805460ff19166001179055905b6004820154811015612a5a57612a52826004018281548110610efb57fe5b600101612a34565b50817f253042c67143aeb6d431bb762d75e5905f18fa7850b7b9edb31fedb7c362d7e8336040516110c29190613fc9565b612a93613a03565b50600091825260086020908152604080842073ffffffffffffffffffffffffffffffffffffffff939093168452600d9092018152918190208151606081018352815460ff9081161515825260018301549482019490945260029091015490921615159082015290565b612b04613a03565b50600091825260096020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845260059092018152918190208151606081018352815460ff9081161515825260018301549482019490945260029091015490921615159082015290565b60066020526000908152604090205460ff1681565b612b8b8161341d565b612ba75760405162461bcd60e51b81526004016108f590614783565b6000818152600860205260408120600c810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055905b6004820154811015612d9a57612d91826004018281548110612c0357fe5b60009182526020909120015460058401805473ffffffffffffffffffffffffffffffffffffffff9092169184908110612c3857fe5b9060005260206000200154846006018481548110612c5257fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612ce05780601f10612cb557610100808354040283529160200191612ce0565b820191906000526020600020905b815481529060010190602001808311612cc357829003601f168201915b5050505050856007018581548110612cf457fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612d825780601f10612d5757610100808354040283529160200191612d82565b820191906000526020600020905b815481529060010190602001808311612d6557829003601f168201915b5050505050866009015461343c565b50600101612be5565b50817f9c85b616f29fca57a17eafe71cf9ff82ffef41766e2cf01ea7f8f7878dd3ec24336040516110c29190613fc9565b600e8101546008909101540190565b600082821115612e31576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082820183811015612e91576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6000612ea78686868686613194565b6000908152600660205260409020805460ff19169055505050505050565b6000612f726064600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632139353f6040518163ffffffff1660e01b815260040160206040518083038186803b158015612f3457600080fd5b505afa158015612f48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f6c9190613e18565b9061371b565b905090565b6013810154600b546000916124a391606491612f6c9173ffffffffffffffffffffffffffffffffffffffff1663e5190046612fb188612dcb565b6040518263ffffffff1660e01b8152600401612fcd91906147ed565b60206040518083038186803b158015612fe557600080fd5b505afa158015612ff9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061301d9190613e18565b90613782565b60006124a36064612f6c84600e016004015485600b015486600a01540161378290919063ffffffff16565b6000818152600860209081526040808320600990925282206001810154158061307a5750816009015442105b1561308a576000925050506117f6565b600b5460018201546040517fe51900460000000000000000000000000000000000000000000000000000000081526131099260029273ffffffffffffffffffffffffffffffffffffffff9091169163e5190046916130f191600019909101906004016147ed565b60206040518083038186803b158015612f3457600080fd5b60039091015410159392505050565b600080613124836116ad565b9050600081600981111561313457fe5b148061314b5750600181600981111561314957fe5b145b806131615750600481600981111561315f57fe5b145b806131775750600581600981111561317557fe5b145b80612e91575060065b81600981111561318c57fe5b149392505050565b60008585858585604051602001808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b838110156132075781810151838201526020016131ef565b50505050905090810190601f1680156132345780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838360005b8381101561326757818101518382015260200161324f565b50505050905090810190601f1680156132945780820380516001836020036101000a031916815260200191505b5097505050505050505060405160208183030381529060405280519060200120905095945050505050565b6000806132cf8787878787613194565b6000818152600660205260409020805460ff1916600117905591505095945050505050565b600080613300836116ad565b9050600081600981111561331057fe5b1480612e9157506001613180565b6000818152600860205260408120600181015473ffffffffffffffffffffffffffffffffffffffff163314806134055750613357612ec5565b600b5460018301546040517fc07473f600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283169263c07473f6926133b392911690600401613fc9565b60206040518083038186803b1580156133cb57600080fd5b505afa1580156133df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134039190613e18565b105b156134145760019150506117f6565b50600092915050565b6000600661342a836116ad565b600981111561343557fe5b1492915050565b6060600061344d8787878787613194565b90508242101561348e5760405162461bcd60e51b815260040180806020018281038252603b8152602001806148ce603b913960400191505060405180910390fd5b60035483014211156134d15760405162461bcd60e51b81526004018080602001828103825260298152602001806149096029913960400191505060405180910390fd5b6000818152600660205260409020805460ff1916905584516060906134f75750836135ad565b85805190602001208560405160200180837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260040182805190602001908083835b6020831061357557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613538565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405290505b6000808973ffffffffffffffffffffffffffffffffffffffff1689846040518082805190602001908083835b6020831061361657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016135d9565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613678576040519150601f19603f3d011682016040523d82523d6000602084013e61367d565b606091505b509150915081819061370d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156136d25781810151838201526020016136ba565b50505050905090810190601f1680156136ff5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b509998505050505050505050565b6000808211613771576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161377a57fe5b049392505050565b600082613791575060006124a3565b8282028284828161379e57fe5b0414612e915760405162461bcd60e51b81526004018080602001828103825260218152602001806149326021913960400191505060405180910390fd5b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826138115760008555613857565b82601f1061382a57805160ff1916838001178555613857565b82800160010185558215613857579182015b8281111561385757825182559160200191906001019061383c565b50613863929150613a23565b5090565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b828054828255906000526020600020908101928215613857579160200282015b8281111561385757825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161782556020909201916001909101906138bd565b828054828255906000526020600020908101928215613857579160200282018281111561385757825182559160200191906001019061383c565b82805482825590600052602060002090810192821561399e579160200282015b8281111561399e578251805161398e9184916020909101906137db565b5091602001919060010190613971565b50613863929150613a38565b8280548282559060005260206000209081019282156139f7579160200282015b828111156139f757825180516139e79184916020909101906137db565b50916020019190600101906139ca565b50613863929150613a55565b604080516060810182526000808252602082018190529181019190915290565b5b808211156138635760008155600101613a24565b80821115613863576000613a4c8282613a72565b50600101613a38565b80821115613863576000613a698282613a72565b50600101613a55565b50805460018160011615610100020316600290046000825580601f10613a985750613ab6565b601f016020900490600052602060002090810190613ab69190613a23565b50565b600067ffffffffffffffff831115613acd57fe5b613afe60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8601160161488b565b9050828152838383011115613b1257600080fd5b828260208301376000602084830101529392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146117f657600080fd5b600082601f830112613b5d578081fd5b81356020613b72613b6d836148af565b61488b565b8281528181019085830183850287018401881015613b8e578586fd5b855b85811015613bb357613ba182613b29565b84529284019290840190600101613b90565b5090979650505050505050565b600082601f830112613bd0578081fd5b81356020613be0613b6d836148af565b82815281810190858301855b85811015613bb3578135880189603f820112613c06578788fd5b613c178a8783013560408401613ab9565b8552509284019290840190600101613bec565b600082601f830112613c3a578081fd5b81356020613c4a613b6d836148af565b82815281810190858301855b85811015613bb357613c6d898684358b0101613cd9565b84529284019290840190600101613c56565b600082601f830112613c8f578081fd5b81356020613c9f613b6d836148af565b8281528181019085830183850287018401881015613cbb578586fd5b855b85811015613bb357813584529284019290840190600101613cbd565b600082601f830112613ce9578081fd5b612e9183833560208501613ab9565b600060208284031215613d09578081fd5b612e9182613b29565b60008060008060008060c08789031215613d2a578182fd5b863567ffffffffffffffff80821115613d41578384fd5b613d4d8a838b01613b4d565b97506020890135915080821115613d62578384fd5b613d6e8a838b01613c7f565b96506040890135915080821115613d83578384fd5b613d8f8a838b01613c2a565b95506060890135915080821115613da4578384fd5b613db08a838b01613bc0565b94506080890135915080821115613dc5578384fd5b613dd18a838b01613cd9565b935060a0890135915080821115613de6578283fd5b50613df389828a01613cd9565b9150509295509295509295565b600060208284031215613e11578081fd5b5035919050565b600060208284031215613e29578081fd5b5051919050565b60008060408385031215613e42578182fd5b82359150613e5260208401613b29565b90509250929050565b60008060408385031215613e6d578182fd5b8235915060208301358015158114613e83578182fd5b809150509250929050565b60008060408385031215613ea0578182fd5b82359150602083013567ffffffffffffffff811115613ebd578182fd5b613ec985828601613cd9565b9150509250929050565b6000815180845260208085018081965082840281019150828601855b85811015613f19578284038952613f07848351613f26565b98850198935090840190600101613eef565b5091979650505050505050565b60008151808452815b81811015613f4b57602081850181015186830182015201613f2f565b81811115613f5c5782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a08301525050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff8716825285602083015260a0604083015261404560a0830186613f26565b606083019490945250608001529392505050565b6080808252855190820181905260009060209060a0840190828901845b828110156140a857815173ffffffffffffffffffffffffffffffffffffffff1684529284019290840190600101614076565b50505083810382850152865180825287830191830190845b818110156140dc578351835292840192918401916001016140c0565b505084810360408601526140f08188613ed3565b9250505082810360608401526141068185613ed3565b979650505050505050565b901515815260200190565b9115158252602082015260400190565b60208101600a831061413a57fe5b91905290565b60208082526012908201527f44414f206e6f7420796574206163746976650000000000000000000000000000604082015260600190565b6020808252601a908201527f6465736372697074696f6e2063616e277420626520656d707479000000000000604082015260600190565b6020808252600f908201527f6e6f20766f74696e6720706f7765720000000000000000000000000000000000604082015260600190565b6020808252602e908201527f50726f706f73616c2063616e206f6e6c7920626520717565756564206966206960408201527f7420697320737563636565646564000000000000000000000000000000000000606082015260800190565b60208082526021908201527f43616e63656c6c6174696f6e20726571756972656d656e7473206e6f74206d6560408201527f7400000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526012908201527f44414f20616c7265616479206163746976650000000000000000000000000000604082015260600190565b60208082526013908201527f696e76616c69642070726f706f73616c20696400000000000000000000000000604082015260600190565b60208082526019908201527f50726f706f73616c206d75737420626520696e20717565756500000000000000604082015260600190565b6020808252601a908201527f4372656174696f6e207468726573686f6c64206e6f74206d6574000000000000604082015260600190565b60208082526015908201527f5468726573686f6c64206e6f74206d6574207965740000000000000000000000604082015260600190565b60208082526025908201527f70726f706f73616c20616374696f6e20616c726561647920717565756564206160408201527f7420657461000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526014908201527f7469746c652063616e277420626520656d707479000000000000000000000000604082015260600190565b6020808252601e908201527f4162726f676174696f6e2050726f706f73616c206e6f74206163746976650000604082015260600190565b60208082526013908201527f43616e6e6f74206265206162726f676174656400000000000000000000000000604082015260600190565b6020808252601e908201527f4f6e65206c6976652070726f706f73616c207065722070726f706f7365720000604082015260600190565b60208082526022908201527f4162726f676174696f6e2070726f706f73616c20616c7265616479206578697360408201527f7473000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601d908201527f436f6e747261637420616c726561647920696e697469616c697a65642e000000604082015260600190565b6020808252601e908201527f43616e6e6f742063616e63656c206966206e6f7420766f746564207965740000604082015260600190565b60208082526032908201527f50726f706f73616c20696e207374617465207468617420646f6573206e6f742060408201527f616c6c6f772063616e63656c6c6174696f6e0000000000000000000000000000606082015260800190565b60208082526014908201527f4d7573742070726f7669646520616374696f6e73000000000000000000000000604082015260600190565b6020808252601a908201527f546f6f206d616e7920616374696f6e73206f6e206120766f7465000000000000604082015260600190565b60208082526019908201527f73757065726e6f7661206d757374206e6f742062652030783000000000000000604082015260600190565b60208082526019908201527f416c726561647920766f7465642074686973206f7074696f6e00000000000000604082015260600190565b6020808252602c908201527f50726f706f73616c2066756e6374696f6e20696e666f726d6174696f6e20617260408201527f697479206d69736d617463680000000000000000000000000000000000000000606082015260800190565b60208082526010908201527f566f74696e6720697320636c6f73656400000000000000000000000000000000604082015260600190565b60208082526012908201527f43616e6e6f742062652065786563757465640000000000000000000000000000604082015260600190565b60c081016124a38284613f8f565b8151151581526020808301519082015260409182015115159181019190915260600190565b90815260200190565b60006102008d835273ffffffffffffffffffffffffffffffffffffffff8d16602084015280604084015261482c8184018d613f26565b90508281036060840152614840818c613f26565b9150508860808301528760a08301528660c08301528560e083015284151561010083015283151561012083015261487b610140830184613f8f565b9c9b505050505050505050505050565b60405181810167ffffffffffffffff811182821017156148a757fe5b604052919050565b600067ffffffffffffffff8211156148c357fe5b506020908102019056fe657865637574655472616e73616374696f6e3a205472616e73616374696f6e206861736e2774207375727061737365642074696d65206c6f636b2e657865637574655472616e73616374696f6e3a205472616e73616374696f6e206973207374616c652e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a2646970667358221220aedc1117df8a9a88ae6cd920d906ce9db5260ae69cb9c20fd53f95741aa0ba3564736f6c63430007060033
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.