Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,189 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Ready For Commit... | 21864593 | 31 hrs ago | IN | 0 ETH | 0.00009026 | ||||
Ready For Commit... | 21863739 | 34 hrs ago | IN | 0 ETH | 0.00009287 | ||||
Ready To Sync | 21856515 | 2 days ago | IN | 0 ETH | 0.00003227 | ||||
Ready To Sync | 21846481 | 3 days ago | IN | 0 ETH | 0.00011919 | ||||
Ready For Commit... | 21837080 | 5 days ago | IN | 0 ETH | 0.00010421 | ||||
Ready To Sync | 21837009 | 5 days ago | IN | 0 ETH | 0.00005105 | ||||
Ready For Commit... | 21836956 | 5 days ago | IN | 0 ETH | 0.00039484 | ||||
Ready For Commit... | 21836946 | 5 days ago | IN | 0 ETH | 0.0003681 | ||||
Ready For Commit... | 21815142 | 8 days ago | IN | 0 ETH | 0.00011985 | ||||
Ready For Commit... | 21814547 | 8 days ago | IN | 0 ETH | 0.00010981 | ||||
Ready For Commit... | 21814278 | 8 days ago | IN | 0 ETH | 0.0001049 | ||||
Ready To Sync | 21807037 | 9 days ago | IN | 0 ETH | 0.00004232 | ||||
Ready For Commit... | 21801562 | 10 days ago | IN | 0 ETH | 0.00010651 | ||||
Ready To Sync | 21796944 | 10 days ago | IN | 0 ETH | 0.00009015 | ||||
Ready For Commit... | 21765243 | 15 days ago | IN | 0 ETH | 0.00170954 | ||||
Ready For Commit... | 21764954 | 15 days ago | IN | 0 ETH | 0.00145245 | ||||
Ready For Commit... | 21764678 | 15 days ago | IN | 0 ETH | 0.00237325 | ||||
Ready To Sync | 21757441 | 16 days ago | IN | 0 ETH | 0.00008641 | ||||
Ready For Commit... | 21751965 | 17 days ago | IN | 0 ETH | 0.00023067 | ||||
Ready To Sync | 21747357 | 17 days ago | IN | 0 ETH | 0.00016601 | ||||
Ready For Commit... | 21715665 | 22 days ago | IN | 0 ETH | 0.00065342 | ||||
Ready For Commit... | 21715360 | 22 days ago | IN | 0 ETH | 0.00101755 | ||||
Ready For Commit... | 21715087 | 22 days ago | IN | 0 ETH | 0.00058128 | ||||
Ready To Sync | 21707838 | 23 days ago | IN | 0 ETH | 0.00017592 | ||||
Ready For Commit... | 21702353 | 24 days ago | IN | 0 ETH | 0.00114037 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
Elections
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-11-04 */ // File: @openzeppelin/contracts/math/SafeMath.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.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, 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) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * 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); uint256 c = a - b; return c; } /** * @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) { // 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 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts 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) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts 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) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: contracts/spec_interfaces/IElections.sol pragma solidity 0.6.12; /// @title Elections contract interface interface IElections { // Election state change events event StakeChanged(address indexed addr, uint256 selfDelegatedStake, uint256 delegatedStake, uint256 effectiveStake); event GuardianStatusUpdated(address indexed guardian, bool readyToSync, bool readyForCommittee); // Vote out / Vote unready event GuardianVotedUnready(address indexed guardian); event VoteUnreadyCasted(address indexed voter, address indexed subject, uint256 expiration); event GuardianVotedOut(address indexed guardian); event VoteOutCasted(address indexed voter, address indexed subject); /* * External functions */ /// Notifies that the guardian is ready to sync with other nodes /// @dev may be called with either the guardian address or the guardian's orbs address /// @dev ready to sync state is not managed in the contract that only emits an event /// @dev readyToSync clears the readyForCommittee state function readyToSync() external; /// Notifies that the guardian is ready to join the committee /// @dev may be called with either the guardian address or the guardian's orbs address /// @dev a qualified guardian calling readyForCommittee is added to the committee function readyForCommittee() external; /// Checks if a guardian is qualified to join the committee /// @dev when true, calling readyForCommittee() will result in adding the guardian to the committee /// @dev called periodically by guardians to check if they are qualified to join the committee /// @param guardian is the guardian to check /// @return canJoin indicating that the guardian can join the current committee function canJoinCommittee(address guardian) external view returns (bool); /// Returns an address effective stake /// The effective stake is derived from a guardian delegate stake and selfs stake /// @return effectiveStake is the guardian's effective stake function getEffectiveStake(address guardian) external view returns (uint effectiveStake); /// Returns the current committee along with the guardians' Orbs address and IP /// @return committee is a list of the committee members' guardian addresses /// @return weights is a list of the committee members' weight (effective stake) /// @return orbsAddrs is a list of the committee members' orbs address /// @return certification is a list of bool indicating the committee members certification /// @return ips is a list of the committee members' ip function getCommittee() external view returns (address[] memory committee, uint256[] memory weights, address[] memory orbsAddrs, bool[] memory certification, bytes4[] memory ips); // Vote-unready /// Casts an unready vote on a subject guardian /// @dev Called by a guardian as part of the automatic vote-unready flow /// @dev The transaction may be sent from the guardian or orbs address. /// @param subject is the subject guardian to vote out /// @param voteExpiration is the expiration time of the vote unready to prevent counting of a vote that is already irrelevant. function voteUnready(address subject, uint voteExpiration) external; /// Returns the current vote unready vote for a voter and a subject pair /// @param voter is the voting guardian address /// @param subject is the subject guardian address /// @return valid indicates whether there is a valid vote /// @return expiration returns the votes expiration time function getVoteUnreadyVote(address voter, address subject) external view returns (bool valid, uint256 expiration); /// Returns the current vote-unready status of a subject guardian. /// @dev the committee and certification data is used to check the certified and committee threshold /// @param subject is the subject guardian address /// @return committee is a list of the current committee members /// @return weights is a list of the current committee members weight /// @return certification is a list of bool indicating the committee members certification /// @return votes is a list of bool indicating the members that votes the subject unready /// @return subjectInCommittee indicates that the subject is in the committee /// @return subjectInCertifiedCommittee indicates that the subject is in the certified committee function getVoteUnreadyStatus(address subject) external view returns ( address[] memory committee, uint256[] memory weights, bool[] memory certification, bool[] memory votes, bool subjectInCommittee, bool subjectInCertifiedCommittee ); // Vote-out /// Casts a voteOut vote by the sender to the given address /// @dev the transaction is sent from the guardian address /// @param subject is the subject guardian address function voteOut(address subject) external; /// Returns the subject address the addr has voted-out against /// @param voter is the voting guardian address /// @return subject is the subject the voter has voted out function getVoteOutVote(address voter) external view returns (address); /// Returns the governance voteOut status of a guardian. /// @dev A guardian is voted out if votedStake / totalDelegatedStake (in percent mille) > threshold /// @param subject is the subject guardian address /// @return votedOut indicates whether the subject was voted out /// @return votedStake is the total stake voting against the subject /// @return totalDelegatedStake is the total delegated stake function getVoteOutStatus(address subject) external view returns (bool votedOut, uint votedStake, uint totalDelegatedStake); /* * Notification functions from other PoS contracts */ /// Notifies a delegated stake change event /// @dev Called by: delegation contract /// @param delegate is the delegate to update /// @param selfDelegatedStake is the delegate self stake (0 if not self-delegating) /// @param delegatedStake is the delegate delegated stake (0 if not self-delegating) /// @param totalDelegatedStake is the total delegated stake function delegatedStakeChange(address delegate, uint256 selfDelegatedStake, uint256 delegatedStake, uint256 totalDelegatedStake) external /* onlyDelegationsContract onlyWhenActive */; /// Notifies a new guardian was unregistered /// @dev Called by: guardian registration contract /// @dev when a guardian unregisters its status is updated to not ready to sync and is removed from the committee /// @param guardian is the address of the guardian that unregistered function guardianUnregistered(address guardian) external /* onlyGuardiansRegistrationContract */; /// Notifies on a guardian certification change /// @dev Called by: guardian registration contract /// @param guardian is the address of the guardian to update /// @param isCertified indicates whether the guardian is certified function guardianCertificationChanged(address guardian, bool isCertified) external /* onlyCertificationContract */; /* * Governance functions */ event VoteUnreadyTimeoutSecondsChanged(uint32 newValue, uint32 oldValue); event VoteOutPercentMilleThresholdChanged(uint32 newValue, uint32 oldValue); event VoteUnreadyPercentMilleThresholdChanged(uint32 newValue, uint32 oldValue); event MinSelfStakePercentMilleChanged(uint32 newValue, uint32 oldValue); /// Sets the minimum self stake requirement for the effective stake /// @dev governance function called only by the functional manager /// @param minSelfStakePercentMille is the minimum self stake in percent-mille (0-100,000) function setMinSelfStakePercentMille(uint32 minSelfStakePercentMille) external /* onlyFunctionalManager */; /// Returns the minimum self-stake required for the effective stake /// @return minSelfStakePercentMille is the minimum self stake in percent-mille function getMinSelfStakePercentMille() external view returns (uint32); /// Sets the vote-out threshold /// @dev governance function called only by the functional manager /// @param voteOutPercentMilleThreshold is the minimum threshold in percent-mille (0-100,000) function setVoteOutPercentMilleThreshold(uint32 voteOutPercentMilleThreshold) external /* onlyFunctionalManager */; /// Returns the vote-out threshold /// @return voteOutPercentMilleThreshold is the minimum threshold in percent-mille function getVoteOutPercentMilleThreshold() external view returns (uint32); /// Sets the vote-unready threshold /// @dev governance function called only by the functional manager /// @param voteUnreadyPercentMilleThreshold is the minimum threshold in percent-mille (0-100,000) function setVoteUnreadyPercentMilleThreshold(uint32 voteUnreadyPercentMilleThreshold) external /* onlyFunctionalManager */; /// Returns the vote-unready threshold /// @return voteUnreadyPercentMilleThreshold is the minimum threshold in percent-mille function getVoteUnreadyPercentMilleThreshold() external view returns (uint32); /// Returns the contract's settings /// @return minSelfStakePercentMille is the minimum self stake in percent-mille /// @return voteUnreadyPercentMilleThreshold is the minimum threshold in percent-mille /// @return voteOutPercentMilleThreshold is the minimum threshold in percent-mille function getSettings() external view returns ( uint32 minSelfStakePercentMille, uint32 voteUnreadyPercentMilleThreshold, uint32 voteOutPercentMilleThreshold ); /// Initializes the ready for committee notification for the committee guardians /// @dev governance function called only by the initialization admin during migration /// @dev identical behaviour as if each guardian sent readyForCommittee() /// @param guardians a list of guardians addresses to update function initReadyForCommittee(address[] calldata guardians) external /* onlyInitializationAdmin */; } // File: contracts/spec_interfaces/IDelegations.sol pragma solidity 0.6.12; /// @title Delegations contract interface interface IDelegations /* is IStakeChangeNotifier */ { // Delegation state change events event DelegatedStakeChanged(address indexed addr, uint256 selfDelegatedStake, uint256 delegatedStake, address indexed delegator, uint256 delegatorContributedStake); // Function calls event Delegated(address indexed from, address indexed to); /* * External functions */ /// Delegate your stake /// @dev updates the election contract on the changes in the delegated stake /// @dev updates the rewards contract on the upcoming change in the delegator's delegation state /// @param to is the address to delegate to function delegate(address to) external /* onlyWhenActive */; /// Refresh the address stake for delegation power based on the staking contract /// @dev Disabled stake change update notifications from the staking contract may create mismatches /// @dev refreshStake re-syncs the stake data with the staking contract /// @param addr is the address to refresh its stake function refreshStake(address addr) external /* onlyWhenActive */; /// Refresh the addresses stake for delegation power based on the staking contract /// @dev Batched version of refreshStake /// @dev Disabled stake change update notifications from the staking contract may create mismatches /// @dev refreshStakeBatch re-syncs the stake data with the staking contract /// @param addrs is the list of addresses to refresh their stake function refreshStakeBatch(address[] calldata addrs) external /* onlyWhenActive */; /// Returns the delegate address of the given address /// @param addr is the address to query /// @return delegation is the address the addr delegated to function getDelegation(address addr) external view returns (address); /// Returns a delegator info /// @param addr is the address to query /// @return delegation is the address the addr delegated to /// @return delegatorStake is the stake of the delegator as reflected in the delegation contract function getDelegationInfo(address addr) external view returns (address delegation, uint256 delegatorStake); /// Returns the delegated stake of an addr /// @dev an address that is not self delegating has a 0 delegated stake /// @param addr is the address to query /// @return delegatedStake is the address delegated stake function getDelegatedStake(address addr) external view returns (uint256); /// Returns the total delegated stake /// @dev delegatedStake - the total stake delegated to an address that is self delegating /// @dev the delegated stake of a non self-delegated address is 0 /// @return totalDelegatedStake is the total delegatedStake of all the addresses function getTotalDelegatedStake() external view returns (uint256) ; /* * Governance functions */ event DelegationsImported(address[] from, address indexed to); event DelegationInitialized(address indexed from, address indexed to); /// Imports delegations during initial migration /// @dev initialization function called only by the initializationManager /// @dev Does not update the Rewards or Election contracts /// @dev assumes deactivated Rewards /// @param from is a list of delegator addresses /// @param to is the address the delegators delegate to function importDelegations(address[] calldata from, address to) external /* onlyMigrationManager onlyDuringDelegationImport */; /// Initializes the delegation of an address during initial migration /// @dev initialization function called only by the initializationManager /// @dev behaves identically to a delegate transaction sent by the delegator /// @param from is the delegator addresses /// @param to is the delegator delegates to function initDelegation(address from, address to) external /* onlyInitializationAdmin */; } // File: contracts/spec_interfaces/IGuardiansRegistration.sol pragma solidity 0.6.12; /// @title Guardian registration contract interface interface IGuardiansRegistration { event GuardianRegistered(address indexed guardian); event GuardianUnregistered(address indexed guardian); event GuardianDataUpdated(address indexed guardian, bool isRegistered, bytes4 ip, address orbsAddr, string name, string website, uint256 registrationTime); event GuardianMetadataChanged(address indexed guardian, string key, string newValue, string oldValue); /* * External methods */ /// Registers a new guardian /// @dev called using the guardian's address that holds the guardian self-stake and used for delegation /// @param ip is the guardian's node ipv4 address as a 32b number /// @param orbsAddr is the guardian's Orbs node address /// @param name is the guardian's name as a string /// @param website is the guardian's website as a string, publishing a name and website provide information for delegators function registerGuardian(bytes4 ip, address orbsAddr, string calldata name, string calldata website) external; /// Updates a registered guardian data /// @dev may be called only by a registered guardian /// @param ip is the guardian's node ipv4 address as a 32b number /// @param orbsAddr is the guardian's Orbs node address /// @param name is the guardian's name as a string /// @param website is the guardian's website as a string, publishing a name and website provide information for delegators function updateGuardian(bytes4 ip, address orbsAddr, string calldata name, string calldata website) external; /// Updates a registered guardian ip address /// @dev may be called only by a registered guardian /// @dev may be called with either the guardian address or the guardian's orbs address /// @param ip is the guardian's node ipv4 address as a 32b number function updateGuardianIp(bytes4 ip) external /* onlyWhenActive */; /// Updates a guardian's metadata property /// @dev called using the guardian's address /// @dev any key may be updated to be used by Orbs platform and tools /// @param key is the name of the property to update /// @param value is the value of the property to update in a string format function setMetadata(string calldata key, string calldata value) external; /// Returns a guardian's metadata property /// @dev a property that wasn't set returns an empty string /// @param guardian is the guardian to query /// @param key is the name of the metadata property to query /// @return value is the value of the queried property in a string format function getMetadata(address guardian, string calldata key) external view returns (string memory); /// Unregisters a guardian /// @dev may be called only by a registered guardian /// @dev unregistering does not clear the guardian's metadata properties function unregisterGuardian() external; /// Returns a guardian's data /// @param guardian is the guardian to query /// @param ip is the guardian's node ipv4 address as a 32b number /// @param orbsAddr is the guardian's Orbs node address /// @param name is the guardian's name as a string /// @param website is the guardian's website as a string /// @param registrationTime is the timestamp of the guardian's registration /// @param lastUpdateTime is the timestamp of the guardian's last update function getGuardianData(address guardian) external view returns (bytes4 ip, address orbsAddr, string memory name, string memory website, uint registrationTime, uint lastUpdateTime); /// Returns the Orbs addresses of a list of guardians /// @dev an unregistered guardian returns address(0) Orbs address /// @param guardianAddrs is a list of guardians' addresses to query /// @return orbsAddrs is a list of the guardians' Orbs addresses function getGuardiansOrbsAddress(address[] calldata guardianAddrs) external view returns (address[] memory orbsAddrs); /// Returns a guardian's ip /// @dev an unregistered guardian returns 0 ip address /// @param guardian is the guardian to query /// @return ip is the guardian's node ipv4 address as a 32b number function getGuardianIp(address guardian) external view returns (bytes4 ip); /// Returns the ip of a list of guardians /// @dev an unregistered guardian returns 0 ip address /// @param guardianAddrs is a list of guardians' addresses to query /// @param ips is a list of the guardians' node ipv4 addresses as a 32b numbers function getGuardianIps(address[] calldata guardianAddrs) external view returns (bytes4[] memory ips); /// Checks if a guardian is registered /// @param guardian is the guardian to query /// @return registered is a bool indicating a guardian address is registered function isRegistered(address guardian) external view returns (bool); /// Translates a list guardians Orbs addresses to guardian addresses /// @dev an Orbs address that does not correspond to any registered guardian returns address(0) /// @param orbsAddrs is a list of the guardians' Orbs addresses to query /// @return guardianAddrs is a list of guardians' addresses that matches the Orbs addresses function getGuardianAddresses(address[] calldata orbsAddrs) external view returns (address[] memory guardianAddrs); /// Resolves the guardian address for a guardian, given a Guardian/Orbs address /// @dev revert if the address does not correspond to a registered guardian address or Orbs address /// @dev designed to be used for contracts calls, validating a registered guardian /// @dev should be used with caution when called by tools as the call may revert /// @dev in case of a conflict matching both guardian and Orbs address, the Guardian address takes precedence /// @param guardianOrOrbsAddress is the address to query representing a guardian address or Orbs address /// @return guardianAddress is the guardian address that matches the queried address function resolveGuardianAddress(address guardianOrOrbsAddress) external view returns (address guardianAddress); /* * Governance functions */ /// Migrates a list of guardians from a previous guardians registration contract /// @dev governance function called only by the initialization admin /// @dev reads the migrated guardians data by calling getGuardianData in the previous contract /// @dev imports also the guardians' registration time and last update /// @dev emits a GuardianDataUpdated for each guardian to allow tracking by tools /// @param guardiansToMigrate is a list of guardians' addresses to migrate /// @param previousContract is the previous registration contract address function migrateGuardians(address[] calldata guardiansToMigrate, IGuardiansRegistration previousContract) external /* onlyInitializationAdmin */; } // File: contracts/spec_interfaces/ICommittee.sol pragma solidity 0.6.12; /// @title Committee contract interface interface ICommittee { event CommitteeChange(address indexed addr, uint256 weight, bool certification, bool inCommittee); event CommitteeSnapshot(address[] addrs, uint256[] weights, bool[] certification); // No external functions /* * External functions */ /// Notifies a weight change of a member /// @dev Called only by: Elections contract /// @param addr is the committee member address /// @param weight is the updated weight of the committee member function memberWeightChange(address addr, uint256 weight) external /* onlyElectionsContract onlyWhenActive */; /// Notifies a change in the certification of a member /// @dev Called only by: Elections contract /// @param addr is the committee member address /// @param isCertified is the updated certification state of the member function memberCertificationChange(address addr, bool isCertified) external /* onlyElectionsContract onlyWhenActive */; /// Notifies a member removal for example due to voteOut or voteUnready /// @dev Called only by: Elections contract /// @param memberRemoved is the removed committee member address /// @return memberRemoved indicates whether the member was removed from the committee /// @return removedMemberWeight indicates the removed member weight /// @return removedMemberCertified indicates whether the member was in the certified committee function removeMember(address addr) external returns (bool memberRemoved, uint removedMemberWeight, bool removedMemberCertified)/* onlyElectionContract */; /// Notifies a new member applicable for committee (due to registration, unbanning, certification change) /// The new member will be added only if it is qualified to join the committee /// @dev Called only by: Elections contract /// @param addr is the added committee member address /// @param weight is the added member weight /// @param isCertified is the added member certification state /// @return memberAdded bool indicates whether the member was added function addMember(address addr, uint256 weight, bool isCertified) external returns (bool memberAdded) /* onlyElectionsContract */; /// Checks if addMember() would add a the member to the committee (qualified to join) /// @param addr is the candidate committee member address /// @param weight is the candidate committee member weight /// @return wouldAddMember bool indicates whether the member will be added function checkAddMember(address addr, uint256 weight) external view returns (bool wouldAddMember); /// Returns the committee members and their weights /// @return addrs is the committee members list /// @return weights is an array of uint, indicating committee members list weight /// @return certification is an array of bool, indicating the committee members certification status function getCommittee() external view returns (address[] memory addrs, uint256[] memory weights, bool[] memory certification); /// Returns the currently appointed committee data /// @return generalCommitteeSize is the number of members in the committee /// @return certifiedCommitteeSize is the number of certified members in the committee /// @return totalWeight is the total effective stake (weight) of the committee function getCommitteeStats() external view returns (uint generalCommitteeSize, uint certifiedCommitteeSize, uint totalWeight); /// Returns a committee member data /// @param addr is the committee member address /// @return inCommittee indicates whether the queried address is a member in the committee /// @return weight is the committee member weight /// @return isCertified indicates whether the committee member is certified /// @return totalCommitteeWeight is the total weight of the committee. function getMemberInfo(address addr) external view returns (bool inCommittee, uint weight, bool isCertified, uint totalCommitteeWeight); /// Emits a CommitteeSnapshot events with current committee info /// @dev a CommitteeSnapshot is useful on contract migration or to remove the need to track past events. function emitCommitteeSnapshot() external; /* * Governance functions */ event MaxCommitteeSizeChanged(uint8 newValue, uint8 oldValue); /// Sets the maximum number of committee members /// @dev governance function called only by the functional manager /// @dev when reducing the number of members, the bottom ones are removed from the committee /// @param _maxCommitteeSize is the maximum number of committee members function setMaxCommitteeSize(uint8 _maxCommitteeSize) external /* onlyFunctionalManager */; /// Returns the maximum number of committee members /// @return maxCommitteeSize is the maximum number of committee members function getMaxCommitteeSize() external view returns (uint8); /// Imports the committee members from a previous committee contract during migration /// @dev initialization function called only by the initializationManager /// @dev does not update the reward contract to avoid incorrect notifications /// @param previousCommitteeContract is the address of the previous committee contract function importMembers(ICommittee previousCommitteeContract) external /* onlyInitializationAdmin */; } // File: contracts/spec_interfaces/ICertification.sol pragma solidity 0.6.12; /// @title Certification contract interface interface ICertification /* is Ownable */ { event GuardianCertificationUpdate(address indexed guardian, bool isCertified); /* * External methods */ /// Returns the certification status of a guardian /// @param guardian is the guardian to query function isGuardianCertified(address guardian) external view returns (bool isCertified); /// Sets the guardian certification status /// @dev governance function called only by the certification manager /// @param guardian is the guardian to update /// @param isCertified bool indication whether the guardian is certified function setGuardianCertification(address guardian, bool isCertified) external /* onlyCertificationManager */ ; } // File: contracts/spec_interfaces/IManagedContract.sol pragma solidity 0.6.12; /// @title managed contract interface, used by the contracts registry to notify the contract on updates interface IManagedContract /* is ILockable, IContractRegistryAccessor, Initializable */ { /// Refreshes the address of the other contracts the contract interacts with /// @dev called by the registry contract upon an update of a contract in the registry function refreshContracts() external; } // File: contracts/spec_interfaces/IContractRegistry.sol pragma solidity 0.6.12; /// @title Contract registry contract interface /// @dev The contract registry holds Orbs PoS contracts and managers lists /// @dev The contract registry updates the managed contracts on changes in the contract list /// @dev Governance functions restricted to managers access the registry to retrieve the manager address /// @dev The contract registry represents the source of truth for Orbs Ethereum contracts /// @dev By tracking the registry events or query before interaction, one can access the up to date contracts interface IContractRegistry { event ContractAddressUpdated(string contractName, address addr, bool managedContract); event ManagerChanged(string role, address newManager); event ContractRegistryUpdated(address newContractRegistry); /* * External functions */ /// Updates the contracts address and emits a corresponding event /// @dev governance function called only by the migrationManager or registryAdmin /// @param contractName is the contract name, used to identify it /// @param addr is the contract updated address /// @param managedContract indicates whether the contract is managed by the registry and notified on changes function setContract(string calldata contractName, address addr, bool managedContract) external /* onlyAdminOrMigrationManager */; /// Returns the current address of the given contracts /// @param contractName is the contract name, used to identify it /// @return addr is the contract updated address function getContract(string calldata contractName) external view returns (address); /// Returns the list of contract addresses managed by the registry /// @dev Managed contracts are updated on changes in the registry contracts addresses /// @return addrs is the list of managed contracts function getManagedContracts() external view returns (address[] memory); /// Locks all the managed contracts /// @dev governance function called only by the migrationManager or registryAdmin /// @dev When set all onlyWhenActive functions will revert function lockContracts() external /* onlyAdminOrMigrationManager */; /// Unlocks all the managed contracts /// @dev governance function called only by the migrationManager or registryAdmin function unlockContracts() external /* onlyAdminOrMigrationManager */; /// Updates a manager address and emits a corresponding event /// @dev governance function called only by the registryAdmin /// @dev the managers list is a flexible list of role to the manager's address /// @param role is the managers' role name, for example "functionalManager" /// @param manager is the manager updated address function setManager(string calldata role, address manager) external /* onlyAdmin */; /// Returns the current address of the given manager /// @param role is the manager name, used to identify it /// @return addr is the manager updated address function getManager(string calldata role) external view returns (address); /// Sets a new contract registry to migrate to /// @dev governance function called only by the registryAdmin /// @dev updates the registry address record in all the managed contracts /// @dev by tracking the emitted ContractRegistryUpdated, tools can track the up to date contracts /// @param newRegistry is the new registry contract function setNewContractRegistry(IContractRegistry newRegistry) external /* onlyAdmin */; /// Returns the previous contract registry address /// @dev used when the setting the contract as a new registry to assure a valid registry /// @return previousContractRegistry is the previous contract registry function getPreviousContractRegistry() external view returns (address); } // File: contracts/spec_interfaces/IContractRegistryAccessor.sol pragma solidity 0.6.12; interface IContractRegistryAccessor { /// Sets the contract registry address /// @dev governance function called only by an admin /// @param newRegistry is the new registry contract function setContractRegistry(IContractRegistry newRegistry) external /* onlyAdmin */; /// Returns the contract registry address /// @return contractRegistry is the contract registry address function getContractRegistry() external view returns (IContractRegistry contractRegistry); function setRegistryAdmin(address _registryAdmin) external /* onlyInitializationAdmin */; } // File: @openzeppelin/contracts/GSN/Context.sol pragma solidity ^0.6.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: contracts/WithClaimableRegistryManagement.sol pragma solidity 0.6.12; /** * @title Claimable * @dev Extension for the Ownable contract, where the ownership needs to be claimed. * This allows the new owner to accept the transfer. */ contract WithClaimableRegistryManagement is Context { address private _registryAdmin; address private _pendingRegistryAdmin; event RegistryManagementTransferred(address indexed previousRegistryAdmin, address indexed newRegistryAdmin); /** * @dev Initializes the contract setting the deployer as the initial registryRegistryAdmin. */ constructor () internal { address msgSender = _msgSender(); _registryAdmin = msgSender; emit RegistryManagementTransferred(address(0), msgSender); } /** * @dev Returns the address of the current registryAdmin. */ function registryAdmin() public view returns (address) { return _registryAdmin; } /** * @dev Throws if called by any account other than the registryAdmin. */ modifier onlyRegistryAdmin() { require(isRegistryAdmin(), "WithClaimableRegistryManagement: caller is not the registryAdmin"); _; } /** * @dev Returns true if the caller is the current registryAdmin. */ function isRegistryAdmin() public view returns (bool) { return _msgSender() == _registryAdmin; } /** * @dev Leaves the contract without registryAdmin. It will not be possible to call * `onlyManager` functions anymore. Can only be called by the current registryAdmin. * * NOTE: Renouncing registryManagement will leave the contract without an registryAdmin, * thereby removing any functionality that is only available to the registryAdmin. */ function renounceRegistryManagement() public onlyRegistryAdmin { emit RegistryManagementTransferred(_registryAdmin, address(0)); _registryAdmin = address(0); } /** * @dev Transfers registryManagement of the contract to a new account (`newManager`). */ function _transferRegistryManagement(address newRegistryAdmin) internal { require(newRegistryAdmin != address(0), "RegistryAdmin: new registryAdmin is the zero address"); emit RegistryManagementTransferred(_registryAdmin, newRegistryAdmin); _registryAdmin = newRegistryAdmin; } /** * @dev Modifier throws if called by any account other than the pendingManager. */ modifier onlyPendingRegistryAdmin() { require(msg.sender == _pendingRegistryAdmin, "Caller is not the pending registryAdmin"); _; } /** * @dev Allows the current registryAdmin to set the pendingManager address. * @param newRegistryAdmin The address to transfer registryManagement to. */ function transferRegistryManagement(address newRegistryAdmin) public onlyRegistryAdmin { _pendingRegistryAdmin = newRegistryAdmin; } /** * @dev Allows the _pendingRegistryAdmin address to finalize the transfer. */ function claimRegistryManagement() external onlyPendingRegistryAdmin { _transferRegistryManagement(_pendingRegistryAdmin); _pendingRegistryAdmin = address(0); } /** * @dev Returns the current pendingRegistryAdmin */ function pendingRegistryAdmin() public view returns (address) { return _pendingRegistryAdmin; } } // File: contracts/Initializable.sol pragma solidity 0.6.12; contract Initializable { address private _initializationAdmin; event InitializationComplete(); /// Constructor /// Sets the initializationAdmin to the contract deployer /// The initialization admin may call any manager only function until initializationComplete constructor() public{ _initializationAdmin = msg.sender; } modifier onlyInitializationAdmin() { require(msg.sender == initializationAdmin(), "sender is not the initialization admin"); _; } /* * External functions */ /// Returns the initializationAdmin address function initializationAdmin() public view returns (address) { return _initializationAdmin; } /// Finalizes the initialization and revokes the initializationAdmin role function initializationComplete() external onlyInitializationAdmin { _initializationAdmin = address(0); emit InitializationComplete(); } /// Checks if the initialization was completed function isInitializationComplete() public view returns (bool) { return _initializationAdmin == address(0); } } // File: contracts/ContractRegistryAccessor.sol pragma solidity 0.6.12; contract ContractRegistryAccessor is IContractRegistryAccessor, WithClaimableRegistryManagement, Initializable { IContractRegistry private contractRegistry; /// Constructor /// @param _contractRegistry is the contract registry address /// @param _registryAdmin is the registry admin address constructor(IContractRegistry _contractRegistry, address _registryAdmin) public { require(address(_contractRegistry) != address(0), "_contractRegistry cannot be 0"); setContractRegistry(_contractRegistry); _transferRegistryManagement(_registryAdmin); } modifier onlyAdmin { require(isAdmin(), "sender is not an admin (registryManger or initializationAdmin)"); _; } modifier onlyMigrationManager { require(isMigrationManager(), "sender is not the migration manager"); _; } modifier onlyFunctionalManager { require(isFunctionalManager(), "sender is not the functional manager"); _; } /// Checks whether the caller is Admin: either the contract registry, the registry admin, or the initialization admin function isAdmin() internal view returns (bool) { return msg.sender == address(contractRegistry) || msg.sender == registryAdmin() || msg.sender == initializationAdmin(); } /// Checks whether the caller is a specific manager role or and Admin /// @dev queries the registry contract for the up to date manager assignment function isManager(string memory role) internal view returns (bool) { IContractRegistry _contractRegistry = contractRegistry; return isAdmin() || _contractRegistry != IContractRegistry(0) && contractRegistry.getManager(role) == msg.sender; } /// Checks whether the caller is the migration manager function isMigrationManager() internal view returns (bool) { return isManager('migrationManager'); } /// Checks whether the caller is the functional manager function isFunctionalManager() internal view returns (bool) { return isManager('functionalManager'); } /* * Contract getters, return the address of a contract by calling the contract registry */ function getProtocolContract() internal view returns (address) { return contractRegistry.getContract("protocol"); } function getStakingRewardsContract() internal view returns (address) { return contractRegistry.getContract("stakingRewards"); } function getFeesAndBootstrapRewardsContract() internal view returns (address) { return contractRegistry.getContract("feesAndBootstrapRewards"); } function getCommitteeContract() internal view returns (address) { return contractRegistry.getContract("committee"); } function getElectionsContract() internal view returns (address) { return contractRegistry.getContract("elections"); } function getDelegationsContract() internal view returns (address) { return contractRegistry.getContract("delegations"); } function getGuardiansRegistrationContract() internal view returns (address) { return contractRegistry.getContract("guardiansRegistration"); } function getCertificationContract() internal view returns (address) { return contractRegistry.getContract("certification"); } function getStakingContract() internal view returns (address) { return contractRegistry.getContract("staking"); } function getSubscriptionsContract() internal view returns (address) { return contractRegistry.getContract("subscriptions"); } function getStakingRewardsWallet() internal view returns (address) { return contractRegistry.getContract("stakingRewardsWallet"); } function getBootstrapRewardsWallet() internal view returns (address) { return contractRegistry.getContract("bootstrapRewardsWallet"); } function getGeneralFeesWallet() internal view returns (address) { return contractRegistry.getContract("generalFeesWallet"); } function getCertifiedFeesWallet() internal view returns (address) { return contractRegistry.getContract("certifiedFeesWallet"); } function getStakingContractHandler() internal view returns (address) { return contractRegistry.getContract("stakingContractHandler"); } /* * Governance functions */ event ContractRegistryAddressUpdated(address addr); /// Sets the contract registry address /// @dev governance function called only by an admin /// @param newContractRegistry is the new registry contract function setContractRegistry(IContractRegistry newContractRegistry) public override onlyAdmin { require(newContractRegistry.getPreviousContractRegistry() == address(contractRegistry), "new contract registry must provide the previous contract registry"); contractRegistry = newContractRegistry; emit ContractRegistryAddressUpdated(address(newContractRegistry)); } /// Returns the contract registry that the contract is set to use /// @return contractRegistry is the registry contract address function getContractRegistry() public override view returns (IContractRegistry) { return contractRegistry; } function setRegistryAdmin(address _registryAdmin) external override onlyInitializationAdmin { _transferRegistryManagement(_registryAdmin); } } // File: contracts/spec_interfaces/ILockable.sol pragma solidity 0.6.12; /// @title lockable contract interface, allows to lock a contract interface ILockable { event Locked(); event Unlocked(); /// Locks the contract to external non-governance function calls /// @dev governance function called only by the migration manager or an admin /// @dev typically called by the registry contract upon locking all managed contracts /// @dev getters and migration functions remain active also for locked contracts /// @dev checked by the onlyWhenActive modifier function lock() external /* onlyMigrationManager */; /// Unlocks the contract /// @dev governance function called only by the migration manager or an admin /// @dev typically called by the registry contract upon unlocking all managed contracts function unlock() external /* onlyMigrationManager */; /// Returns the contract locking status /// @return isLocked is a bool indicating the contract is locked function isLocked() view external returns (bool); } // File: contracts/Lockable.sol pragma solidity 0.6.12; /// @title lockable contract contract Lockable is ILockable, ContractRegistryAccessor { bool public locked; /// Constructor /// @param _contractRegistry is the contract registry address /// @param _registryAdmin is the registry admin address constructor(IContractRegistry _contractRegistry, address _registryAdmin) ContractRegistryAccessor(_contractRegistry, _registryAdmin) public {} /// Locks the contract to external non-governance function calls /// @dev governance function called only by the migration manager or an admin /// @dev typically called by the registry contract upon locking all managed contracts /// @dev getters and migration functions remain active also for locked contracts /// @dev checked by the onlyWhenActive modifier function lock() external override onlyMigrationManager { locked = true; emit Locked(); } /// Unlocks the contract /// @dev governance function called only by the migration manager or an admin /// @dev typically called by the registry contract upon unlocking all managed contracts function unlock() external override onlyMigrationManager { locked = false; emit Unlocked(); } /// Returns the contract locking status /// @return isLocked is a bool indicating the contract is locked function isLocked() external override view returns (bool) { return locked; } modifier onlyWhenActive() { require(!locked, "contract is locked for this operation"); _; } } // File: contracts/ManagedContract.sol pragma solidity 0.6.12; /// @title managed contract contract ManagedContract is IManagedContract, Lockable { /// @param _contractRegistry is the contract registry address /// @param _registryAdmin is the registry admin address constructor(IContractRegistry _contractRegistry, address _registryAdmin) Lockable(_contractRegistry, _registryAdmin) public {} /// Refreshes the address of the other contracts the contract interacts with /// @dev called by the registry contract upon an update of a contract in the registry function refreshContracts() virtual override external {} } // File: contracts/Elections.sol pragma solidity 0.6.12; /// @title Elections contract contract Elections is IElections, ManagedContract { using SafeMath for uint256; uint32 constant PERCENT_MILLIE_BASE = 100000; mapping(address => mapping(address => uint256)) voteUnreadyVotes; // by => to => expiration mapping(address => uint256) public votersStake; mapping(address => address) voteOutVotes; // by => to mapping(address => uint256) accumulatedStakesForVoteOut; // addr => total stake mapping(address => bool) votedOutGuardians; struct Settings { uint32 minSelfStakePercentMille; uint32 voteUnreadyPercentMilleThreshold; uint32 voteOutPercentMilleThreshold; } Settings settings; /// Constructor /// @param _contractRegistry is the contract registry address /// @param _registryAdmin is the registry admin address /// @param minSelfStakePercentMille is the minimum self stake in percent-mille (0-100,000) /// @param voteUnreadyPercentMilleThreshold is the minimum vote-unready threshold in percent-mille (0-100,000) /// @param voteOutPercentMilleThreshold is the minimum vote-out threshold in percent-mille (0-100,000) constructor(IContractRegistry _contractRegistry, address _registryAdmin, uint32 minSelfStakePercentMille, uint32 voteUnreadyPercentMilleThreshold, uint32 voteOutPercentMilleThreshold) ManagedContract(_contractRegistry, _registryAdmin) public { setMinSelfStakePercentMille(minSelfStakePercentMille); setVoteOutPercentMilleThreshold(voteOutPercentMilleThreshold); setVoteUnreadyPercentMilleThreshold(voteUnreadyPercentMilleThreshold); } modifier onlyDelegationsContract() { require(msg.sender == address(delegationsContract), "caller is not the delegations contract"); _; } modifier onlyGuardiansRegistrationContract() { require(msg.sender == address(guardianRegistrationContract), "caller is not the guardian registrations contract"); _; } modifier onlyCertificationContract() { require(msg.sender == address(certificationContract), "caller is not the certification contract"); _; } /* * External functions */ /// Notifies that the guardian is ready to sync with other nodes /// @dev ready to sync state is not managed in the contract that only emits an event /// @dev readyToSync clears the readyForCommittee state function readyToSync() external override onlyWhenActive { address guardian = guardianRegistrationContract.resolveGuardianAddress(msg.sender); // this validates registration require(!isVotedOut(guardian), "caller is voted-out"); emit GuardianStatusUpdated(guardian, true, false); committeeContract.removeMember(guardian); } /// Notifies that the guardian is ready to join the committee /// @dev a qualified guardian calling readyForCommittee is added to the committee function readyForCommittee() external override onlyWhenActive { _readyForCommittee(msg.sender); } /// Checks if a guardian is qualified to join the committee /// @dev when true, calling readyForCommittee() will result in adding the guardian to the committee /// @dev called periodically by guardians to check if they are qualified to join the committee /// @param guardian is the guardian to check /// @return canJoin indicating that the guardian can join the current committee function canJoinCommittee(address guardian) external view override returns (bool) { guardian = guardianRegistrationContract.resolveGuardianAddress(guardian); // this validates registration if (isVotedOut(guardian)) { return false; } uint256 effectiveStake = getGuardianEffectiveStake(guardian, settings); return committeeContract.checkAddMember(guardian, effectiveStake); } /// Returns an address effective stake /// The effective stake is derived from a guardian delegate stake and selfs stake /// @return effectiveStake is the guardian's effective stake function getEffectiveStake(address guardian) external override view returns (uint effectiveStake) { return getGuardianEffectiveStake(guardian, settings); } /// Returns the current committee along with the guardians' Orbs address and IP /// @return committee is a list of the committee members' guardian addresses /// @return weights is a list of the committee members' weight (effective stake) /// @return orbsAddrs is a list of the committee members' orbs address /// @return certification is a list of bool indicating the committee members certification /// @return ips is a list of the committee members' ip function getCommittee() external override view returns (address[] memory committee, uint256[] memory weights, address[] memory orbsAddrs, bool[] memory certification, bytes4[] memory ips) { IGuardiansRegistration _guardianRegistrationContract = guardianRegistrationContract; (committee, weights, certification) = committeeContract.getCommittee(); orbsAddrs = _guardianRegistrationContract.getGuardiansOrbsAddress(committee); ips = _guardianRegistrationContract.getGuardianIps(committee); } // Vote-unready /// Casts an unready vote on a subject guardian /// @dev Called by a guardian as part of the automatic vote-unready flow /// @dev The transaction may be sent from the guardian or orbs address. /// @param subject is the subject guardian to vote out /// @param voteExpiration is the expiration time of the vote unready to prevent counting of a vote that is already irrelevant. function voteUnready(address subject, uint voteExpiration) external override onlyWhenActive { require(voteExpiration >= block.timestamp, "vote expiration time must not be in the past"); address voter = guardianRegistrationContract.resolveGuardianAddress(msg.sender); voteUnreadyVotes[voter][subject] = voteExpiration; emit VoteUnreadyCasted(voter, subject, voteExpiration); (address[] memory generalCommittee, uint256[] memory generalWeights, bool[] memory certification) = committeeContract.getCommittee(); bool votedUnready = isCommitteeVoteUnreadyThresholdReached(generalCommittee, generalWeights, certification, subject); if (votedUnready) { clearCommitteeUnreadyVotes(generalCommittee, subject); emit GuardianVotedUnready(subject); emit GuardianStatusUpdated(subject, false, false); committeeContract.removeMember(subject); } } /// Returns the current vote unready vote for a voter and a subject pair /// @param voter is the voting guardian address /// @param subject is the subject guardian address /// @return valid indicates whether there is a valid vote /// @return expiration returns the votes expiration time function getVoteUnreadyVote(address voter, address subject) public override view returns (bool valid, uint256 expiration) { expiration = voteUnreadyVotes[voter][subject]; valid = expiration != 0 && block.timestamp < expiration; } /// Returns the current vote-unready status of a subject guardian. /// @dev the committee and certification data is used to check the certified and committee threshold /// @param subject is the subject guardian address /// @return committee is a list of the current committee members /// @return weights is a list of the current committee members weight /// @return certification is a list of bool indicating the committee members certification /// @return votes is a list of bool indicating the members that votes the subject unready /// @return subjectInCommittee indicates that the subject is in the committee /// @return subjectInCertifiedCommittee indicates that the subject is in the certified committee function getVoteUnreadyStatus(address subject) external override view returns (address[] memory committee, uint256[] memory weights, bool[] memory certification, bool[] memory votes, bool subjectInCommittee, bool subjectInCertifiedCommittee) { (committee, weights, certification) = committeeContract.getCommittee(); votes = new bool[](committee.length); for (uint i = 0; i < committee.length; i++) { address memberAddr = committee[i]; if (block.timestamp < voteUnreadyVotes[memberAddr][subject]) { votes[i] = true; } if (memberAddr == subject) { subjectInCommittee = true; subjectInCertifiedCommittee = certification[i]; } } } // Vote-out /// Casts a voteOut vote by the sender to the given address /// @dev the transaction is sent from the guardian address /// @param subject is the subject guardian address function voteOut(address subject) external override onlyWhenActive { Settings memory _settings = settings; address voter = msg.sender; address prevSubject = voteOutVotes[voter]; voteOutVotes[voter] = subject; emit VoteOutCasted(voter, subject); uint256 voterStake = delegationsContract.getDelegatedStake(voter); if (prevSubject == address(0)) { votersStake[voter] = voterStake; } if (subject == address(0)) { delete votersStake[voter]; } uint totalStake = delegationsContract.getTotalDelegatedStake(); if (prevSubject != address(0) && prevSubject != subject) { applyVoteOutVotesFor(prevSubject, 0, voterStake, totalStake, _settings); } if (subject != address(0)) { uint voteStakeAdded = prevSubject != subject ? voterStake : 0; applyVoteOutVotesFor(subject, voteStakeAdded, 0, totalStake, _settings); // recheck also if not new } } /// Returns the subject address the addr has voted-out against /// @param voter is the voting guardian address /// @return subject is the subject the voter has voted out function getVoteOutVote(address voter) external override view returns (address) { return voteOutVotes[voter]; } /// Returns the governance voteOut status of a guardian. /// @dev A guardian is voted out if votedStake / totalDelegatedStake (in percent mille) > threshold /// @param subject is the subject guardian address /// @return votedOut indicates whether the subject was voted out /// @return votedStake is the total stake voting against the subject /// @return totalDelegatedStake is the total delegated stake function getVoteOutStatus(address subject) external override view returns (bool votedOut, uint votedStake, uint totalDelegatedStake) { votedOut = isVotedOut(subject); votedStake = accumulatedStakesForVoteOut[subject]; totalDelegatedStake = delegationsContract.getTotalDelegatedStake(); } /* * Notification functions from other PoS contracts */ /// Notifies a delegated stake change event /// @dev Called by: delegation contract /// @param delegate is the delegate to update /// @param selfDelegatedStake is the delegate self stake (0 if not self-delegating) /// @param delegatedStake is the delegate delegated stake (0 if not self-delegating) /// @param totalDelegatedStake is the total delegated stake function delegatedStakeChange(address delegate, uint256 selfDelegatedStake, uint256 delegatedStake, uint256 totalDelegatedStake) external override onlyDelegationsContract onlyWhenActive { Settings memory _settings = settings; uint effectiveStake = calcEffectiveStake(selfDelegatedStake, delegatedStake, _settings); emit StakeChanged(delegate, selfDelegatedStake, delegatedStake, effectiveStake); committeeContract.memberWeightChange(delegate, effectiveStake); applyStakesToVoteOutBy(delegate, delegatedStake, totalDelegatedStake, _settings); } /// Notifies a new guardian was unregistered /// @dev Called by: guardian registration contract /// @dev when a guardian unregisters its status is updated to not ready to sync and is removed from the committee /// @param guardian is the address of the guardian that unregistered function guardianUnregistered(address guardian) external override onlyGuardiansRegistrationContract onlyWhenActive { emit GuardianStatusUpdated(guardian, false, false); committeeContract.removeMember(guardian); } /// Notifies on a guardian certification change /// @dev Called by: guardian registration contract /// @param guardian is the address of the guardian to update /// @param isCertified indicates whether the guardian is certified function guardianCertificationChanged(address guardian, bool isCertified) external override onlyCertificationContract onlyWhenActive { committeeContract.memberCertificationChange(guardian, isCertified); } /* * Governance functions */ /// Sets the minimum self stake requirement for the effective stake /// @dev governance function called only by the functional manager /// @param minSelfStakePercentMille is the minimum self stake in percent-mille (0-100,000) function setMinSelfStakePercentMille(uint32 minSelfStakePercentMille) public override onlyFunctionalManager { require(minSelfStakePercentMille <= PERCENT_MILLIE_BASE, "minSelfStakePercentMille must be 100000 at most"); emit MinSelfStakePercentMilleChanged(minSelfStakePercentMille, settings.minSelfStakePercentMille); settings.minSelfStakePercentMille = minSelfStakePercentMille; } /// Returns the minimum self-stake required for the effective stake /// @return minSelfStakePercentMille is the minimum self stake in percent-mille function getMinSelfStakePercentMille() external override view returns (uint32) { return settings.minSelfStakePercentMille; } /// Sets the vote-out threshold /// @dev governance function called only by the functional manager /// @param voteOutPercentMilleThreshold is the minimum threshold in percent-mille (0-100,000) function setVoteOutPercentMilleThreshold(uint32 voteOutPercentMilleThreshold) public override onlyFunctionalManager { require(voteOutPercentMilleThreshold <= PERCENT_MILLIE_BASE, "voteOutPercentMilleThreshold must not be larger than 100000"); emit VoteOutPercentMilleThresholdChanged(voteOutPercentMilleThreshold, settings.voteOutPercentMilleThreshold); settings.voteOutPercentMilleThreshold = voteOutPercentMilleThreshold; } /// Returns the vote-out threshold /// @return voteOutPercentMilleThreshold is the minimum threshold in percent-mille function getVoteOutPercentMilleThreshold() external override view returns (uint32) { return settings.voteOutPercentMilleThreshold; } /// Sets the vote-unready threshold /// @dev governance function called only by the functional manager /// @param voteUnreadyPercentMilleThreshold is the minimum threshold in percent-mille (0-100,000) function setVoteUnreadyPercentMilleThreshold(uint32 voteUnreadyPercentMilleThreshold) public override onlyFunctionalManager { require(voteUnreadyPercentMilleThreshold <= PERCENT_MILLIE_BASE, "voteUnreadyPercentMilleThreshold must not be larger than 100000"); emit VoteUnreadyPercentMilleThresholdChanged(voteUnreadyPercentMilleThreshold, settings.voteUnreadyPercentMilleThreshold); settings.voteUnreadyPercentMilleThreshold = voteUnreadyPercentMilleThreshold; } /// Returns the vote-unready threshold /// @return voteUnreadyPercentMilleThreshold is the minimum threshold in percent-mille function getVoteUnreadyPercentMilleThreshold() external override view returns (uint32) { return settings.voteUnreadyPercentMilleThreshold; } /// Returns the contract's settings /// @return minSelfStakePercentMille is the minimum self stake in percent-mille /// @return voteUnreadyPercentMilleThreshold is the minimum threshold in percent-mille /// @return voteOutPercentMilleThreshold is the minimum threshold in percent-mille function getSettings() external override view returns ( uint32 minSelfStakePercentMille, uint32 voteUnreadyPercentMilleThreshold, uint32 voteOutPercentMilleThreshold ) { Settings memory _settings = settings; minSelfStakePercentMille = _settings.minSelfStakePercentMille; voteUnreadyPercentMilleThreshold = _settings.voteUnreadyPercentMilleThreshold; voteOutPercentMilleThreshold = _settings.voteOutPercentMilleThreshold; } /// Initializes the ready for committee notification for the committee guardians /// @dev governance function called only by the initialization admin during migration /// @dev identical behaviour as if each guardian sent readyForCommittee() /// @param guardians a list of guardians addresses to update function initReadyForCommittee(address[] calldata guardians) external override onlyInitializationAdmin { for (uint i = 0; i < guardians.length; i++) { _readyForCommittee(guardians[i]); } } /* * Private functions */ /// Handles a readyForCommittee notification /// @dev may be called with either the guardian address or the guardian's orbs address /// @dev notifies the committee contract that will add the guardian if qualified /// @param guardian is the guardian ready for committee function _readyForCommittee(address guardian) private { guardian = guardianRegistrationContract.resolveGuardianAddress(guardian); // this validates registration require(!isVotedOut(guardian), "caller is voted-out"); emit GuardianStatusUpdated(guardian, true, true); uint256 effectiveStake = getGuardianEffectiveStake(guardian, settings); committeeContract.addMember(guardian, effectiveStake, certificationContract.isGuardianCertified(guardian)); } /// Calculates a guardian effective stake based on its self-stake and delegated stake function calcEffectiveStake(uint256 selfStake, uint256 delegatedStake, Settings memory _settings) private pure returns (uint256) { if (selfStake.mul(PERCENT_MILLIE_BASE) >= delegatedStake.mul(_settings.minSelfStakePercentMille)) { return delegatedStake; } return selfStake.mul(PERCENT_MILLIE_BASE).div(_settings.minSelfStakePercentMille); // never overflows or divides by zero } /// Returns the effective state of a guardian /// @dev calls the delegation contract to retrieve the guardian current stake and delegated stake /// @param guardian is the guardian to query /// @param _settings is the contract settings struct /// @return effectiveStake is the guardian's effective stake function getGuardianEffectiveStake(address guardian, Settings memory _settings) private view returns (uint256 effectiveStake) { IDelegations _delegationsContract = delegationsContract; (,uint256 selfStake) = _delegationsContract.getDelegationInfo(guardian); uint256 delegatedStake = _delegationsContract.getDelegatedStake(guardian); return calcEffectiveStake(selfStake, delegatedStake, _settings); } // Vote-unready /// Checks if the vote unready threshold was reached for a given subject /// @dev a subject is voted-unready if either it reaches the threshold in the general committee or a certified subject reaches the threshold in the certified committee /// @param committee is a list of the current committee members /// @param weights is a list of the current committee members weight /// @param certification is a list of bool indicating the committee members certification /// @param subject is the subject guardian address /// @return thresholdReached is a bool indicating that the threshold was reached function isCommitteeVoteUnreadyThresholdReached(address[] memory committee, uint256[] memory weights, bool[] memory certification, address subject) private returns (bool) { Settings memory _settings = settings; uint256 totalCommitteeStake = 0; uint256 totalVoteUnreadyStake = 0; uint256 totalCertifiedStake = 0; uint256 totalCertifiedVoteUnreadyStake = 0; address member; uint256 memberStake; bool isSubjectCertified; for (uint i = 0; i < committee.length; i++) { member = committee[i]; memberStake = weights[i]; if (member == subject && certification[i]) { isSubjectCertified = true; } totalCommitteeStake = totalCommitteeStake.add(memberStake); if (certification[i]) { totalCertifiedStake = totalCertifiedStake.add(memberStake); } (bool valid, uint256 expiration) = getVoteUnreadyVote(member, subject); if (valid) { totalVoteUnreadyStake = totalVoteUnreadyStake.add(memberStake); if (certification[i]) { totalCertifiedVoteUnreadyStake = totalCertifiedVoteUnreadyStake.add(memberStake); } } else if (expiration != 0) { // Vote is stale, delete from state delete voteUnreadyVotes[member][subject]; } } return ( totalCommitteeStake > 0 && totalVoteUnreadyStake.mul(PERCENT_MILLIE_BASE) >= uint256(_settings.voteUnreadyPercentMilleThreshold).mul(totalCommitteeStake) ) || ( isSubjectCertified && totalCertifiedStake > 0 && totalCertifiedVoteUnreadyStake.mul(PERCENT_MILLIE_BASE) >= uint256(_settings.voteUnreadyPercentMilleThreshold).mul(totalCertifiedStake) ); } /// Clears the committee members vote-unready state upon declaring a guardian unready /// @param committee is a list of the current committee members /// @param subject is the subject guardian address function clearCommitteeUnreadyVotes(address[] memory committee, address subject) private { for (uint i = 0; i < committee.length; i++) { voteUnreadyVotes[committee[i]][subject] = 0; // clear vote-outs } } // Vote-out /// Updates the vote-out state upon a stake change notification /// @param voter is the voter address /// @param currentVoterStake is the voter delegated stake /// @param totalDelegatedStake is the total delegated stake /// @param _settings is the contract settings struct function applyStakesToVoteOutBy(address voter, uint256 currentVoterStake, uint256 totalDelegatedStake, Settings memory _settings) private { address subject = voteOutVotes[voter]; if (subject == address(0)) return; uint256 prevVoterStake = votersStake[voter]; votersStake[voter] = currentVoterStake; applyVoteOutVotesFor(subject, currentVoterStake, prevVoterStake, totalDelegatedStake, _settings); } /// Applies updates in a vote-out subject state and checks whether its threshold was reached /// @param subject is the vote-out subject /// @param voteOutStakeAdded is the added votes against the subject /// @param voteOutStakeRemoved is the removed votes against the subject /// @param totalDelegatedStake is the total delegated stake used to check the vote-out threshold /// @param _settings is the contract settings struct function applyVoteOutVotesFor(address subject, uint256 voteOutStakeAdded, uint256 voteOutStakeRemoved, uint256 totalDelegatedStake, Settings memory _settings) private { if (isVotedOut(subject)) { return; } uint256 accumulated = accumulatedStakesForVoteOut[subject]. sub(voteOutStakeRemoved). add(voteOutStakeAdded); bool shouldBeVotedOut = totalDelegatedStake > 0 && accumulated.mul(PERCENT_MILLIE_BASE) >= uint256(_settings.voteOutPercentMilleThreshold).mul(totalDelegatedStake); if (shouldBeVotedOut) { votedOutGuardians[subject] = true; emit GuardianVotedOut(subject); emit GuardianStatusUpdated(subject, false, false); committeeContract.removeMember(subject); } accumulatedStakesForVoteOut[subject] = accumulated; } /// Checks whether a guardian was voted out function isVotedOut(address guardian) private view returns (bool) { return votedOutGuardians[guardian]; } /* * Contracts topology / registry interface */ ICommittee committeeContract; IDelegations delegationsContract; IGuardiansRegistration guardianRegistrationContract; ICertification certificationContract; /// Refreshes the address of the other contracts the contract interacts with /// @dev called by the registry contract upon an update of a contract in the registry function refreshContracts() external override { committeeContract = ICommittee(getCommitteeContract()); delegationsContract = IDelegations(getDelegationsContract()); guardianRegistrationContract = IGuardiansRegistration(getGuardiansRegistrationContract()); certificationContract = ICertification(getCertificationContract()); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IContractRegistry","name":"_contractRegistry","type":"address"},{"internalType":"address","name":"_registryAdmin","type":"address"},{"internalType":"uint32","name":"minSelfStakePercentMille","type":"uint32"},{"internalType":"uint32","name":"voteUnreadyPercentMilleThreshold","type":"uint32"},{"internalType":"uint32","name":"voteOutPercentMilleThreshold","type":"uint32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"ContractRegistryAddressUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"guardian","type":"address"},{"indexed":false,"internalType":"bool","name":"readyToSync","type":"bool"},{"indexed":false,"internalType":"bool","name":"readyForCommittee","type":"bool"}],"name":"GuardianStatusUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"guardian","type":"address"}],"name":"GuardianVotedOut","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"guardian","type":"address"}],"name":"GuardianVotedUnready","type":"event"},{"anonymous":false,"inputs":[],"name":"InitializationComplete","type":"event"},{"anonymous":false,"inputs":[],"name":"Locked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"newValue","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"oldValue","type":"uint32"}],"name":"MinSelfStakePercentMilleChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousRegistryAdmin","type":"address"},{"indexed":true,"internalType":"address","name":"newRegistryAdmin","type":"address"}],"name":"RegistryManagementTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"selfDelegatedStake","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"delegatedStake","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"effectiveStake","type":"uint256"}],"name":"StakeChanged","type":"event"},{"anonymous":false,"inputs":[],"name":"Unlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":true,"internalType":"address","name":"subject","type":"address"}],"name":"VoteOutCasted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"newValue","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"oldValue","type":"uint32"}],"name":"VoteOutPercentMilleThresholdChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":true,"internalType":"address","name":"subject","type":"address"},{"indexed":false,"internalType":"uint256","name":"expiration","type":"uint256"}],"name":"VoteUnreadyCasted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"newValue","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"oldValue","type":"uint32"}],"name":"VoteUnreadyPercentMilleThresholdChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"newValue","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"oldValue","type":"uint32"}],"name":"VoteUnreadyTimeoutSecondsChanged","type":"event"},{"inputs":[{"internalType":"address","name":"guardian","type":"address"}],"name":"canJoinCommittee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimRegistryManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegate","type":"address"},{"internalType":"uint256","name":"selfDelegatedStake","type":"uint256"},{"internalType":"uint256","name":"delegatedStake","type":"uint256"},{"internalType":"uint256","name":"totalDelegatedStake","type":"uint256"}],"name":"delegatedStakeChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCommittee","outputs":[{"internalType":"address[]","name":"committee","type":"address[]"},{"internalType":"uint256[]","name":"weights","type":"uint256[]"},{"internalType":"address[]","name":"orbsAddrs","type":"address[]"},{"internalType":"bool[]","name":"certification","type":"bool[]"},{"internalType":"bytes4[]","name":"ips","type":"bytes4[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractRegistry","outputs":[{"internalType":"contract IContractRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"guardian","type":"address"}],"name":"getEffectiveStake","outputs":[{"internalType":"uint256","name":"effectiveStake","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinSelfStakePercentMille","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSettings","outputs":[{"internalType":"uint32","name":"minSelfStakePercentMille","type":"uint32"},{"internalType":"uint32","name":"voteUnreadyPercentMilleThreshold","type":"uint32"},{"internalType":"uint32","name":"voteOutPercentMilleThreshold","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVoteOutPercentMilleThreshold","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"subject","type":"address"}],"name":"getVoteOutStatus","outputs":[{"internalType":"bool","name":"votedOut","type":"bool"},{"internalType":"uint256","name":"votedStake","type":"uint256"},{"internalType":"uint256","name":"totalDelegatedStake","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"voter","type":"address"}],"name":"getVoteOutVote","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVoteUnreadyPercentMilleThreshold","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"subject","type":"address"}],"name":"getVoteUnreadyStatus","outputs":[{"internalType":"address[]","name":"committee","type":"address[]"},{"internalType":"uint256[]","name":"weights","type":"uint256[]"},{"internalType":"bool[]","name":"certification","type":"bool[]"},{"internalType":"bool[]","name":"votes","type":"bool[]"},{"internalType":"bool","name":"subjectInCommittee","type":"bool"},{"internalType":"bool","name":"subjectInCertifiedCommittee","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"voter","type":"address"},{"internalType":"address","name":"subject","type":"address"}],"name":"getVoteUnreadyVote","outputs":[{"internalType":"bool","name":"valid","type":"bool"},{"internalType":"uint256","name":"expiration","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"guardian","type":"address"},{"internalType":"bool","name":"isCertified","type":"bool"}],"name":"guardianCertificationChanged","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"guardian","type":"address"}],"name":"guardianUnregistered","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"guardians","type":"address[]"}],"name":"initReadyForCommittee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initializationAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initializationComplete","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isInitializationComplete","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRegistryAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingRegistryAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"readyForCommittee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"readyToSync","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"refreshContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"registryAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceRegistryManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IContractRegistry","name":"newContractRegistry","type":"address"}],"name":"setContractRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"minSelfStakePercentMille","type":"uint32"}],"name":"setMinSelfStakePercentMille","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_registryAdmin","type":"address"}],"name":"setRegistryAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"voteOutPercentMilleThreshold","type":"uint32"}],"name":"setVoteOutPercentMilleThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"voteUnreadyPercentMilleThreshold","type":"uint32"}],"name":"setVoteUnreadyPercentMilleThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRegistryAdmin","type":"address"}],"name":"transferRegistryManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"subject","type":"address"}],"name":"voteOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"subject","type":"address"},{"internalType":"uint256","name":"voteExpiration","type":"uint256"}],"name":"voteUnready","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"votersStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162004e4538038062004e45833981810160405260a08110156200003757600080fd5b508051602082015160408301516060840151608090940151929391929091908484818181816000620000686200015d565b600080546001600160a01b0319166001600160a01b03831690811782556040519293509160008051602062004e25833981519152908290a350600280546001600160a01b031916331790556001600160a01b0382166200010f576040805162461bcd60e51b815260206004820152601d60248201527f5f636f6e747261637452656769737472792063616e6e6f742062652030000000604482015290519081900360640190fd5b6200011a8262000161565b6200012581620002b9565b5050505050506200013c836200034a60201b60201c565b62000147816200043c565b62000152826200054a565b50505050506200082c565b3390565b6200016b62000650565b620001a85760405162461bcd60e51b815260040180806020018281038252603e81526020018062004ca5603e913960400191505060405180910390fd5b600354604080516301e32edf60e21b815290516001600160a01b039283169284169163078cbb7c916004808301926020929190829003018186803b158015620001f057600080fd5b505afa15801562000205573d6000803e3d6000fd5b505050506040513d60208110156200021c57600080fd5b50516001600160a01b031614620002655760405162461bcd60e51b815260040180806020018281038252604181526020018062004ce36041913960600191505060405180910390fd5b600380546001600160a01b0383166001600160a01b0319909116811790915560408051918252517ffea2d033438b968078a6264409d0104b5f3d2ce7b795afc74918e70f3534f22b9181900360200190a150565b6001600160a01b038116620003005760405162461bcd60e51b815260040180806020018281038252603481526020018062004df16034913960400191505060405180910390fd5b600080546040516001600160a01b038085169392169160008051602062004e2583398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b62000354620006b2565b620003915760405162461bcd60e51b815260040180806020018281038252602481526020018062004d5f6024913960400191505060405180910390fd5b620186a063ffffffff82161115620003db5760405162461bcd60e51b815260040180806020018281038252602f81526020018062004dc2602f913960400191505060405180910390fd5b6009546040805163ffffffff8085168252909216602083015280517f5f1e6a4b65e5b155a39124570a9d52d1a94b94d17b9cefb044afd83367344f739281900390910190a16009805463ffffffff191663ffffffff92909216919091179055565b62000446620006b2565b620004835760405162461bcd60e51b815260040180806020018281038252602481526020018062004d5f6024913960400191505060405180910390fd5b620186a063ffffffff82161115620004cd5760405162461bcd60e51b815260040180806020018281038252603b81526020018062004d24603b913960400191505060405180910390fd5b6009546040805163ffffffff848116825268010000000000000000909304909216602083015280517f1d5d5428459ec4611f1aa061bef9eeb6e83fb6f5408c6dc5c2f022ba9ef4715c9281900390910190a16009805463ffffffff909216680100000000000000000263ffffffff60401b19909216919091179055565b62000554620006b2565b620005915760405162461bcd60e51b815260040180806020018281038252602481526020018062004d5f6024913960400191505060405180910390fd5b620186a063ffffffff82161115620005db5760405162461bcd60e51b815260040180806020018281038252603f81526020018062004d83603f913960400191505060405180910390fd5b6009546040805163ffffffff8481168252640100000000909304909216602083015280517ff85225604b27cb71d925b3e5e40561ca03066d501e90ac8bfaa6784f1cd878679281900390910190a16009805463ffffffff9092166401000000000263ffffffff60201b19909216919091179055565b6003546000906001600160a01b031633148062000687575062000672620006ee565b6001600160a01b0316336001600160a01b0316145b80620006ad575062000698620006fd565b6001600160a01b0316336001600160a01b0316145b905090565b6000620006ad60405180604001604052806011815260200170333ab731ba34b7b730b626b0b730b3b2b960791b8152506200070c60201b60201c565b6000546001600160a01b031690565b6002546001600160a01b031690565b6003546000906001600160a01b03166200072562000650565b806200082557506001600160a01b03811615801590620008255750600354604051631ee441e960e01b815260206004820181815286516024840152865133946001600160a01b031693631ee441e99389939283926044019185019080838360005b83811015620007a057818101518382015260200162000786565b50505050905090810190601f168015620007ce5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015620007ec57600080fd5b505afa15801562000801573d6000803e3d6000fd5b505050506040513d60208110156200081857600080fd5b50516001600160a01b0316145b9392505050565b614469806200083c6000396000f3fe608060405234801561001057600080fd5b50600436106102c85760003560e01c8063a4e2d6341161017b578063d3705cb7116100d8578063e7366dc81161008c578063f27f3bb411610071578063f27f3bb414610998578063f83d08ba146109be578063fcd13d65146109c6576102c8565b8063e7366dc814610962578063eec0701f14610990576102c8565b8063daa00faa116100bd578063daa00faa146108ee578063dfc8fdd014610934578063e4e992221461095a576102c8565b8063d3705cb7146108a5578063d55c9bcf146108c8576102c8565b8063bac5e9911161012f578063ca0809c811610114578063ca0809c814610825578063cf30901214610895578063d25235261461089d576102c8565b8063bac5e991146107d6578063c7af3a94146107f9576102c8565b8063ab8f6ffe11610160578063ab8f6ffe14610677578063acdb8e04146107c6578063b364cc38146107ce576102c8565b8063a4e2d63414610667578063a69df4b51461066f576102c8565b806348106fe31161022957806374c16b23116101dd578063868ca49d116101c2578063868ca49d146104e157806394470457146104e9578063a0774f7514610644576102c8565b806374c16b23146104a957806385b4bb53146104b1576102c8565b80635f94cd9c1161020e5780635f94cd9c14610443578063615c25451461044b57806361885df814610471576102c8565b806348106fe3146104335780634fa293c31461043b576102c8565b8063245dcad3116102805780632a1fac72116102655780632a1fac72146103e1578063333df154146103e957806339069d8c1461040d576102c8565b8063245dcad3146103b35780632987cea0146103bb576102c8565b8063090b7f1f116102b1578063090b7f1f1461032d5780631a0b2c4f146103765780631ee2960e14610392576102c8565b806302211f5e146102cd57806307b490af14610305575b600080fd5b6102f3600480360360208110156102e357600080fd5b50356001600160a01b03166109ec565b60408051918252519081900360200190f35b61032b6004803603602081101561031b57600080fd5b50356001600160a01b0316610a3d565b005b61035b6004803603604081101561034357600080fd5b506001600160a01b0381358116916020013516610d50565b60408051921515835260208301919091528051918290030190f35b61037e610d8f565b604080519115158252519081900360200190f35b61039a610db3565b6040805163ffffffff9092168252519081900360200190f35b61032b610dc7565b61032b600480360360208110156103d157600080fd5b50356001600160a01b0316610e2c565b61032b610ea9565b6103f1610f53565b604080516001600160a01b039092168252519081900360200190f35b61032b6004803603602081101561042357600080fd5b50356001600160a01b0316610f62565b61037e610fc5565b61039a610fd5565b6103f1610fed565b6103f16004803603602081101561046157600080fd5b50356001600160a01b0316610ffc565b61032b6004803603608081101561048757600080fd5b506001600160a01b03813516906020810135906040810135906060013561101a565b6103f16111ee565b6104b96111fd565b6040805163ffffffff9485168152928416602084015292168183015290519081900360600190f35b61032b611255565b61050f600480360360208110156104ff57600080fd5b50356001600160a01b0316611477565b60405180806020018060200180602001806020018715158152602001861515815260200185810385528b818151815260200191508051906020019060200280838360005b8381101561056b578181015183820152602001610553565b5050505090500185810384528a818151815260200191508051906020019060200280838360005b838110156105aa578181015183820152602001610592565b50505050905001858103835289818151815260200191508051906020019060200280838360005b838110156105e95781810151838201526020016105d1565b50505050905001858103825288818151815260200191508051906020019060200280838360005b83811015610628578181015183820152602001610610565b505050509050019a505050505050505050505060405180910390f35b61032b6004803603602081101561065a57600080fd5b503563ffffffff166117d3565b61037e6118eb565b61032b61190c565b61067f6119a2565b60405180806020018060200180602001806020018060200186810386528b818151815260200191508051906020019060200280838360005b838110156106cf5781810151838201526020016106b7565b5050505090500186810385528a818151815260200191508051906020019060200280838360005b8381101561070e5781810151838201526020016106f6565b50505050905001868103845289818151815260200191508051906020019060200280838360005b8381101561074d578181015183820152602001610735565b50505050905001868103835288818151815260200191508051906020019060200280838360005b8381101561078c578181015183820152602001610774565b5050505091909101878103835288518152885160209182019250818a01910280838360008315610628578181015183820152602001610610565b61032b611f07565b61039a611fac565b61032b600480360360208110156107ec57600080fd5b503563ffffffff16611fb8565b61032b6004803603604081101561080f57600080fd5b506001600160a01b0381351690602001356120d8565b61032b6004803603602081101561083b57600080fd5b81019060208101813564010000000081111561085657600080fd5b82018360208201111561086857600080fd5b8035906020019184602083028401116401000000008311171561088a57600080fd5b5090925090506125e8565b61037e612676565b61032b612697565b61032b600480360360208110156108bb57600080fd5b503563ffffffff1661271f565b61032b600480360360208110156108de57600080fd5b50356001600160a01b0316612826565b6109146004803603602081101561090457600080fd5b50356001600160a01b0316612974565b604080519315158452602084019290925282820152519081900360600190f35b61037e6004803603602081101561094a57600080fd5b50356001600160a01b0316612a2b565b6103f1612bc4565b61032b6004803603604081101561097857600080fd5b506001600160a01b0381351690602001351515612bd3565b61032b612cf9565b6102f3600480360360208110156109ae57600080fd5b50356001600160a01b0316612dfb565b61032b612e0d565b61032b600480360360208110156109dc57600080fd5b50356001600160a01b0316612eba565b6040805160608101825260095463ffffffff8082168352640100000000820481166020840152680100000000000000009091041691810191909152600090610a3590839061303a565b90505b919050565b60035474010000000000000000000000000000000000000000900460ff1615610a975760405162461bcd60e51b81526004018080602001828103825260258152602001806141136025913960400191505060405180910390fd5b610a9f6140f2565b506040805160608101825260095463ffffffff808216835264010000000082048116602080850191909152680100000000000000009092041682840152336000818152600690925283822080546001600160a01b038781167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355955194959294921692909184917f275bb5f10bdccb6cea621dfabf75682103f2392a02061d953ebe212cfa26ef0e91a3600b54604080517f7c47c16d0000000000000000000000000000000000000000000000000000000081526001600160a01b03858116600483015291516000939290921691637c47c16d91602480820192602092909190829003018186803b158015610bb957600080fd5b505afa158015610bcd573d6000803e3d6000fd5b505050506040513d6020811015610be357600080fd5b505190506001600160a01b038216610c11576001600160a01b03831660009081526005602052604090208190555b6001600160a01b038516610c39576001600160a01b0383166000908152600560205260408120555b600b54604080517fcf3b670b00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163cf3b670b916004808301926020929190829003018186803b158015610c9757600080fd5b505afa158015610cab573d6000803e3d6000fd5b505050506040513d6020811015610cc157600080fd5b505190506001600160a01b03831615801590610cef5750856001600160a01b0316836001600160a01b031614155b15610d0257610d02836000848489613181565b6001600160a01b03861615610d48576000866001600160a01b0316846001600160a01b03161415610d34576000610d36565b825b9050610d4687826000858a613181565b505b505050505050565b6001600160a01b0380831660009081526004602090815260408083209385168352929052908120548015801590610d8657508042105b91509250929050565b600080546001600160a01b0316610da4613367565b6001600160a01b031614905090565b600954640100000000900463ffffffff1690565b60035474010000000000000000000000000000000000000000900460ff1615610e215760405162461bcd60e51b81526004018080602001828103825260258152602001806141136025913960400191505060405180910390fd5b610e2a3361336b565b565b610e34610d8f565b610e6f5760405162461bcd60e51b81526004018080602001828103825260408152602001806143c86040913960400191505060405180910390fd5b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b610eb1610f53565b6001600160a01b0316336001600160a01b031614610f005760405162461bcd60e51b81526004018080602001828103825260268152602001806142196026913960400191505060405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556040517f2a2b3ea974fb057582c3b210ef8b5f81492d15673f49d4384bfa3b896a964c3c90600090a1565b6002546001600160a01b031690565b610f6a610f53565b6001600160a01b0316336001600160a01b031614610fb95760405162461bcd60e51b81526004018080602001828103825260268152602001806142196026913960400191505060405180910390fd5b610fc281613628565b50565b6002546001600160a01b03161590565b60095468010000000000000000900463ffffffff1690565b6001546001600160a01b031690565b6001600160a01b039081166000908152600660205260409020541690565b600b546001600160a01b031633146110635760405162461bcd60e51b81526004018080602001828103825260268152602001806143466026913960400191505060405180910390fd5b60035474010000000000000000000000000000000000000000900460ff16156110bd5760405162461bcd60e51b81526004018080602001828103825260258152602001806141136025913960400191505060405180910390fd5b6110c56140f2565b506040805160608101825260095463ffffffff8082168352640100000000820481166020840152680100000000000000009091041691810191909152600061110e8585846136e0565b604080518781526020810187905280820183905290519192506001600160a01b038816917fd5c5ef58495d970aa497140d952854435af4876c07e0735daaa3fc32874c3cf89181900360600190a2600a54604080517f68f52e500000000000000000000000000000000000000000000000000000000081526001600160a01b03898116600483015260248201859052915191909216916368f52e5091604480830192600092919082900301818387803b1580156111ca57600080fd5b505af11580156111de573d6000803e3d6000fd5b50505050610d4886858585613748565b6000546001600160a01b031690565b600080600061120a6140f2565b50506040805160608101825260095463ffffffff8082168084526401000000008304821660208501819052680100000000000000009093049091169290930182905291949193509150565b60035474010000000000000000000000000000000000000000900460ff16156112af5760405162461bcd60e51b81526004018080602001828103825260258152602001806141136025913960400191505060405180910390fd5b600c54604080517f10b3b29300000000000000000000000000000000000000000000000000000000815233600482015290516000926001600160a01b0316916310b3b293916024808301926020929190829003018186803b15801561131357600080fd5b505afa158015611327573d6000803e3d6000fd5b505050506040513d602081101561133d57600080fd5b5051905061134a81613799565b1561139c576040805162461bcd60e51b815260206004820152601360248201527f63616c6c657220697320766f7465642d6f757400000000000000000000000000604482015290519081900360640190fd5b60408051600181526000602082015281516001600160a01b038416927ff2de790499b85c5800832caf02f18e7ddecfa1d20b3ddc6a8c44be78838d1cec928290030190a2600a54604080517f0b1ca49a0000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015291519190921691630b1ca49a9160248083019260609291908290030181600087803b15801561144857600080fd5b505af115801561145c573d6000803e3d6000fd5b505050506040513d606081101561147257600080fd5b505050565b606080606080600080600a60009054906101000a90046001600160a01b03166001600160a01b031663ab8f6ffe6040518163ffffffff1660e01b815260040160006040518083038186803b1580156114ce57600080fd5b505afa1580156114e2573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052606081101561152957600080fd5b810190808051604051939291908464010000000082111561154957600080fd5b90830190602082018581111561155e57600080fd5b825186602082028301116401000000008211171561157b57600080fd5b82525081516020918201928201910280838360005b838110156115a8578181015183820152602001611590565b50505050905001604052602001805160405193929190846401000000008211156115d157600080fd5b9083019060208201858111156115e657600080fd5b825186602082028301116401000000008211171561160357600080fd5b82525081516020918201928201910280838360005b83811015611630578181015183820152602001611618565b505050509050016040526020018051604051939291908464010000000082111561165957600080fd5b90830190602082018581111561166e57600080fd5b825186602082028301116401000000008211171561168b57600080fd5b82525081516020918201928201910280838360005b838110156116b85781810151838201526020016116a0565b50505050905001604052505050809650819750829850505050855167ffffffffffffffff811180156116e957600080fd5b50604051908082528060200260200182016040528015611713578160200160208202803683370190505b50925060005b86518110156117c957600087828151811061173057fe5b6020908102919091018101516001600160a01b038082166000908152600484526040808220928e168252919093529091205490915042101561178b57600185838151811061177a57fe5b911515602092830291909101909101525b886001600160a01b0316816001600160a01b031614156117c057600193508582815181106117b557fe5b602002602001015192505b50600101611719565b5091939550919395565b6117db6137b7565b6118165760405162461bcd60e51b815260040180806020018281038252602481526020018061423f6024913960400191505060405180910390fd5b620186a063ffffffff8216111561185e5760405162461bcd60e51b815260040180806020018281038252603f815260200180614263603f913960400191505060405180910390fd5b6009546040805163ffffffff8481168252640100000000909304909216602083015280517ff85225604b27cb71d925b3e5e40561ca03066d501e90ac8bfaa6784f1cd878679281900390910190a16009805463ffffffff909216640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff909216919091179055565b60035474010000000000000000000000000000000000000000900460ff1690565b6119146137fc565b61194f5760405162461bcd60e51b81526004018080602001828103825260238152602001806143026023913960400191505060405180910390fd5b600380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040517f19aad37188a1d3921e29eb3c66acf43d81975e107cb650d58cca878627955fd690600090a1565b600c54600a54604080517fab8f6ffe000000000000000000000000000000000000000000000000000000008152905160609384938493849384936001600160a01b0390811693169163ab8f6ffe916004808301926000929190829003018186803b158015611a0f57600080fd5b505afa158015611a23573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526060811015611a6a57600080fd5b8101908080516040519392919084640100000000821115611a8a57600080fd5b908301906020820185811115611a9f57600080fd5b8251866020820283011164010000000082111715611abc57600080fd5b82525081516020918201928201910280838360005b83811015611ae9578181015183820152602001611ad1565b5050505090500160405260200180516040519392919084640100000000821115611b1257600080fd5b908301906020820185811115611b2757600080fd5b8251866020820283011164010000000082111715611b4457600080fd5b82525081516020918201928201910280838360005b83811015611b71578181015183820152602001611b59565b5050505090500160405260200180516040519392919084640100000000821115611b9a57600080fd5b908301906020820185811115611baf57600080fd5b8251866020820283011164010000000082111715611bcc57600080fd5b82525081516020918201928201910280838360005b83811015611bf9578181015183820152602001611be1565b505050509190910160408190527ffccea80d000000000000000000000000000000000000000000000000000000008152602060048201818152895160248401528951999f50979d50959a506001600160a01b0389169763fccea80d978f979096508695506044909201935081870192500280838360005b83811015611c88578181015183820152602001611c70565b505050509050019250505060006040518083038186803b158015611cab57600080fd5b505afa158015611cbf573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526020811015611d0657600080fd5b8101908080516040519392919084640100000000821115611d2657600080fd5b908301906020820185811115611d3b57600080fd5b8251866020820283011164010000000082111715611d5857600080fd5b82525081516020918201928201910280838360005b83811015611d85578181015183820152602001611d6d565b505050509050016040525050509350806001600160a01b031663c697a996876040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019060200280838360005b83811015611df3578181015183820152602001611ddb565b505050509050019250505060006040518083038186803b158015611e1657600080fd5b505afa158015611e2a573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526020811015611e7157600080fd5b8101908080516040519392919084640100000000821115611e9157600080fd5b908301906020820185811115611ea657600080fd5b8251866020820283011164010000000082111715611ec357600080fd5b82525081516020918201928201910280838360005b83811015611ef0578181015183820152602001611ed8565b505050509050016040525050509150509091929394565b611f0f610d8f565b611f4a5760405162461bcd60e51b81526004018080602001828103825260408152602001806143c86040913960400191505060405180910390fd5b600080546040516001600160a01b03909116907f1f5f028be638d6a0e3b8d56fd05b812ce325cc8dc73cdb0e16df94d6b2725c2e908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60095463ffffffff1690565b611fc06137b7565b611ffb5760405162461bcd60e51b815260040180806020018281038252602481526020018061423f6024913960400191505060405180910390fd5b620186a063ffffffff821611156120435760405162461bcd60e51b815260040180806020018281038252603b8152602001806141de603b913960400191505060405180910390fd5b6009546040805163ffffffff848116825268010000000000000000909304909216602083015280517f1d5d5428459ec4611f1aa061bef9eeb6e83fb6f5408c6dc5c2f022ba9ef4715c9281900390910190a16009805463ffffffff90921668010000000000000000027fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff909216919091179055565b60035474010000000000000000000000000000000000000000900460ff16156121325760405162461bcd60e51b81526004018080602001828103825260258152602001806141136025913960400191505060405180910390fd5b428110156121715760405162461bcd60e51b815260040180806020018281038252602c815260200180614408602c913960400191505060405180910390fd5b600c54604080517f10b3b29300000000000000000000000000000000000000000000000000000000815233600482015290516000926001600160a01b0316916310b3b293916024808301926020929190829003018186803b1580156121d557600080fd5b505afa1580156121e9573d6000803e3d6000fd5b505050506040513d60208110156121ff57600080fd5b50516001600160a01b0380821660008181526004602090815260408083209489168084529482529182902087905581518781529151949550929391927fcb530db56313ef43bf663c10381c044eada437428b9644aabfff5f46b6f6605b92918290030190a36060806060600a60009054906101000a90046001600160a01b03166001600160a01b031663ab8f6ffe6040518163ffffffff1660e01b815260040160006040518083038186803b1580156122b757600080fd5b505afa1580156122cb573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052606081101561231257600080fd5b810190808051604051939291908464010000000082111561233257600080fd5b90830190602082018581111561234757600080fd5b825186602082028301116401000000008211171561236457600080fd5b82525081516020918201928201910280838360005b83811015612391578181015183820152602001612379565b50505050905001604052602001805160405193929190846401000000008211156123ba57600080fd5b9083019060208201858111156123cf57600080fd5b82518660208202830111640100000000821117156123ec57600080fd5b82525081516020918201928201910280838360005b83811015612419578181015183820152602001612401565b505050509050016040526020018051604051939291908464010000000082111561244257600080fd5b90830190602082018581111561245757600080fd5b825186602082028301116401000000008211171561247457600080fd5b82525081516020918201928201910280838360005b838110156124a1578181015183820152602001612489565b5050505090500160405250505092509250925060006124c28484848a61383c565b90508015610d46576124d48488613a6a565b6040516001600160a01b038816907fc808d7f6285926a53d708653414e2d2a88e3c1715debb80fb09ca41d744e5ba690600090a2604080516000808252602082015281516001600160a01b038a16927ff2de790499b85c5800832caf02f18e7ddecfa1d20b3ddc6a8c44be78838d1cec928290030190a2600a54604080517f0b1ca49a0000000000000000000000000000000000000000000000000000000081526001600160a01b038a8116600483015291519190921691630b1ca49a9160248083019260609291908290030181600087803b1580156125b357600080fd5b505af11580156125c7573d6000803e3d6000fd5b505050506040513d60608110156125dd57600080fd5b505050505050505050565b6125f0610f53565b6001600160a01b0316336001600160a01b03161461263f5760405162461bcd60e51b81526004018080602001828103825260268152602001806142196026913960400191505060405180910390fd5b60005b818110156114725761266e83838381811061265957fe5b905060200201356001600160a01b031661336b565b600101612642565b60035474010000000000000000000000000000000000000000900460ff1681565b6001546001600160a01b031633146126e05760405162461bcd60e51b81526004018080602001828103825260278152602001806141b76027913960400191505060405180910390fd5b6001546126f5906001600160a01b0316613628565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b6127276137b7565b6127625760405162461bcd60e51b815260040180806020018281038252602481526020018061423f6024913960400191505060405180910390fd5b620186a063ffffffff821611156127aa5760405162461bcd60e51b815260040180806020018281038252602f8152602001806142d3602f913960400191505060405180910390fd5b6009546040805163ffffffff8085168252909216602083015280517f5f1e6a4b65e5b155a39124570a9d52d1a94b94d17b9cefb044afd83367344f739281900390910190a1600980547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff92909216919091179055565b600c546001600160a01b0316331461286f5760405162461bcd60e51b81526004018080602001828103825260318152602001806142a26031913960400191505060405180910390fd5b60035474010000000000000000000000000000000000000000900460ff16156128c95760405162461bcd60e51b81526004018080602001828103825260258152602001806141136025913960400191505060405180910390fd5b604080516000808252602082015281516001600160a01b038416927ff2de790499b85c5800832caf02f18e7ddecfa1d20b3ddc6a8c44be78838d1cec928290030190a2600a54604080517f0b1ca49a0000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015291519190921691630b1ca49a9160248083019260609291908290030181600087803b15801561144857600080fd5b600080600061298284613799565b6001600160a01b0380861660009081526007602090815260409182902054600b5483517fcf3b670b00000000000000000000000000000000000000000000000000000000815293519598509096509092169263cf3b670b92600480840193919291829003018186803b1580156129f757600080fd5b505afa158015612a0b573d6000803e3d6000fd5b505050506040513d6020811015612a2157600080fd5b5051929491935050565b600c54604080517f10b3b2930000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152915160009392909216916310b3b29391602480820192602092909190829003018186803b158015612a9557600080fd5b505afa158015612aa9573d6000803e3d6000fd5b505050506040513d6020811015612abf57600080fd5b50519150612acc82613799565b15612ad957506000610a38565b6040805160608101825260095463ffffffff8082168352640100000000820481166020840152680100000000000000009091041691810191909152600090612b2290849061303a565b600a54604080517f2e983ab00000000000000000000000000000000000000000000000000000000081526001600160a01b038781166004830152602482018590529151939450911691632e983ab091604480820192602092909190829003018186803b158015612b9157600080fd5b505afa158015612ba5573d6000803e3d6000fd5b505050506040513d6020811015612bbb57600080fd5b50519392505050565b6003546001600160a01b031690565b600d546001600160a01b03163314612c1c5760405162461bcd60e51b815260040180806020018281038252602881526020018061436c6028913960400191505060405180910390fd5b60035474010000000000000000000000000000000000000000900460ff1615612c765760405162461bcd60e51b81526004018080602001828103825260258152602001806141136025913960400191505060405180910390fd5b600a54604080517fe66b9c1d0000000000000000000000000000000000000000000000000000000081526001600160a01b03858116600483015284151560248301529151919092169163e66b9c1d91604480830192600092919082900301818387803b158015612ce557600080fd5b505af1158015610d48573d6000803e3d6000fd5b612d01613ac5565b600a80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055612d41613b86565b600b80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055612d81613c16565b600c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055612dc1613ca6565b600d80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60056020526000908152604090205481565b612e156137fc565b612e505760405162461bcd60e51b81526004018080602001828103825260238152602001806143026023913960400191505060405180910390fd5b600380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040517f0f2e5b6c72c6a4491efd919a9f9a409f324ef0708c11ee57d410c2cb06c0992b90600090a1565b612ec2613d36565b612efd5760405162461bcd60e51b815260040180806020018281038252603e815260200180614138603e913960400191505060405180910390fd5b600354604080517f078cbb7c00000000000000000000000000000000000000000000000000000000815290516001600160a01b039283169284169163078cbb7c916004808301926020929190829003018186803b158015612f5d57600080fd5b505afa158015612f71573d6000803e3d6000fd5b505050506040513d6020811015612f8757600080fd5b50516001600160a01b031614612fce5760405162461bcd60e51b81526004018080602001828103825260418152602001806141766041913960600191505060405180910390fd5b600380546001600160a01b0383167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116811790915560408051918252517ffea2d033438b968078a6264409d0104b5f3d2ce7b795afc74918e70f3534f22b9181900360200190a150565b600b54604080517ffab46d660000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152825160009491909116928492849263fab46d6692602480840193919291829003018186803b1580156130a557600080fd5b505afa1580156130b9573d6000803e3d6000fd5b505050506040513d60408110156130cf57600080fd5b50602090810151604080517f7c47c16d0000000000000000000000000000000000000000000000000000000081526001600160a01b038981166004830152915192945060009391861692637c47c16d92602480840193919291829003018186803b15801561313c57600080fd5b505afa158015613150573d6000803e3d6000fd5b505050506040513d602081101561316657600080fd5b505190506131758282876136e0565b93505050505b92915050565b61318a85613799565b1561319457613360565b6001600160a01b0385166000908152600760205260408120546131c39086906131bd9087613d91565b90613dd3565b9050600080841180156131fe57506131ee84846040015163ffffffff16613e2d90919063ffffffff16565b6131fb83620186a0613e2d565b10155b90508015613345576001600160a01b03871660008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f0bc20ba748c0b7a01e134c521b1e20764a53c3a6b4710a54cbbcf6c8bb3ba3079190a2604080516000808252602082015281516001600160a01b038a16927ff2de790499b85c5800832caf02f18e7ddecfa1d20b3ddc6a8c44be78838d1cec928290030190a2600a54604080517f0b1ca49a0000000000000000000000000000000000000000000000000000000081526001600160a01b038a8116600483015291519190921691630b1ca49a9160248083019260609291908290030181600087803b15801561331857600080fd5b505af115801561332c573d6000803e3d6000fd5b505050506040513d606081101561334257600080fd5b50505b506001600160a01b0386166000908152600760205260409020555b5050505050565b3390565b600c54604080517f10b3b2930000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152915191909216916310b3b293916024808301926020929190829003018186803b1580156133d157600080fd5b505afa1580156133e5573d6000803e3d6000fd5b505050506040513d60208110156133fb57600080fd5b5051905061340881613799565b1561345a576040805162461bcd60e51b815260206004820152601360248201527f63616c6c657220697320766f7465642d6f757400000000000000000000000000604482015290519081900360640190fd5b604080516001808252602082015281516001600160a01b038416927ff2de790499b85c5800832caf02f18e7ddecfa1d20b3ddc6a8c44be78838d1cec928290030190a26040805160608101825260095463ffffffff80821683526401000000008204811660208401526801000000000000000090910416918101919091526000906134e690839061303a565b600a54600d54604080517fdc8b6d730000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015291519495509281169363e272079f9387938793169163dc8b6d7391602480820192602092909190829003018186803b15801561355e57600080fd5b505afa158015613572573d6000803e3d6000fd5b505050506040513d602081101561358857600080fd5b5051604080517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b1681526001600160a01b0390941660048501526024840192909252151560448301525160648083019260209291908290030181600087803b1580156135f857600080fd5b505af115801561360c573d6000803e3d6000fd5b505050506040513d602081101561362257600080fd5b50505050565b6001600160a01b03811661366d5760405162461bcd60e51b81526004018080602001828103825260348152602001806143946034913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f1f5f028be638d6a0e3b8d56fd05b812ce325cc8dc73cdb0e16df94d6b2725c2e91a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60006136ff826000015163ffffffff1684613e2d90919063ffffffff16565b61370c85620186a0613e2d565b10613718575081613741565b815161373e9063ffffffff90811690613738908790620186a090613e2d16565b90613e86565b90505b9392505050565b6001600160a01b03808516600090815260066020526040902054168061376e5750613622565b6001600160a01b0385166000908152600560205260409020805490859055610d488286838787613181565b6001600160a01b031660009081526008602052604090205460ff1690565b60006137f76040518060400160405280601181526020017f66756e6374696f6e616c4d616e61676572000000000000000000000000000000815250613ec8565b905090565b60006137f76040518060400160405280601081526020017f6d6967726174696f6e4d616e6167657200000000000000000000000000000000815250613ec8565b60006138466140f2565b506040805160608101825260095463ffffffff80821683526401000000008204811660208401526801000000000000000090910416918101919091526000808080808080805b8d518110156139d9578d81815181106138a157fe5b602002602001015193508c81815181106138b757fe5b602002602001015192508a6001600160a01b0316846001600160a01b03161480156138f257508b81815181106138e957fe5b60200260200101515b156138fc57600191505b6139068884613dd3565b97508b818151811061391457fe5b60200260200101511561392e5761392b8684613dd3565b95505b60008061393b868e610d50565b91509150811561397c5761394f8986613dd3565b98508d838151811061395d57fe5b602002602001015115613977576139748786613dd3565b96505b6139cf565b80156139cf5760046000876001600160a01b03166001600160a01b0316815260200190815260200160002060008e6001600160a01b03166001600160a01b03168152602001908152602001600020600090555b505060010161388c565b50600087118015613a125750613a0287896020015163ffffffff16613e2d90919063ffffffff16565b613a0f87620186a0613e2d565b10155b80613a595750808015613a255750600085115b8015613a595750613a4985896020015163ffffffff16613e2d90919063ffffffff16565b613a5685620186a0613e2d565b10155b9d9c50505050505050505050505050565b60005b825181101561147257600060046000858481518110613a8857fe5b6020908102919091018101516001600160a01b03908116835282820193909352604091820160009081209387168152929052902055600101613a6d565b600354604080517f35817773000000000000000000000000000000000000000000000000000000008152602060048201819052600960248301527f636f6d6d69747465650000000000000000000000000000000000000000000000604483015291516000936001600160a01b03169263358177739260648082019391829003018186803b158015613b5557600080fd5b505afa158015613b69573d6000803e3d6000fd5b505050506040513d6020811015613b7f57600080fd5b5051905090565b600354604080517f35817773000000000000000000000000000000000000000000000000000000008152602060048201819052600b60248301527f64656c65676174696f6e73000000000000000000000000000000000000000000604483015291516000936001600160a01b03169263358177739260648082019391829003018186803b158015613b5557600080fd5b600354604080517f35817773000000000000000000000000000000000000000000000000000000008152602060048201819052601560248301527f677561726469616e73526567697374726174696f6e0000000000000000000000604483015291516000936001600160a01b03169263358177739260648082019391829003018186803b158015613b5557600080fd5b600354604080517f35817773000000000000000000000000000000000000000000000000000000008152602060048201819052600d60248301527f63657274696669636174696f6e00000000000000000000000000000000000000604483015291516000936001600160a01b03169263358177739260648082019391829003018186803b158015613b5557600080fd5b6003546000906001600160a01b0316331480613d6a5750613d556111ee565b6001600160a01b0316336001600160a01b0316145b806137f75750613d78610f53565b6001600160a01b0316336001600160a01b031614905090565b600061374183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613ff6565b600082820183811015613741576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082613e3c5750600061317b565b82820282848281613e4957fe5b04146137415760405162461bcd60e51b81526004018080602001828103825260218152602001806143256021913960400191505060405180910390fd5b600061374183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061408d565b6003546000906001600160a01b0316613edf613d36565b8061374157506001600160a01b0381161580159061374157506003546040517f1ee441e900000000000000000000000000000000000000000000000000000000815260206004820181815286516024840152865133946001600160a01b031693631ee441e99389939283926044019185019080838360005b83811015613f6f578181015183820152602001613f57565b50505050905090810190601f168015613f9c5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015613fb957600080fd5b505afa158015613fcd573d6000803e3d6000fd5b505050506040513d6020811015613fe357600080fd5b50516001600160a01b0316149392505050565b600081848411156140855760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561404a578181015183820152602001614032565b50505050905090810190601f1680156140775780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836140dc5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561404a578181015183820152602001614032565b5060008385816140e857fe5b0495945050505050565b60408051606081018252600080825260208201819052918101919091529056fe636f6e7472616374206973206c6f636b656420666f722074686973206f7065726174696f6e73656e646572206973206e6f7420616e2061646d696e202872656769737472794d616e676572206f7220696e697469616c697a6174696f6e41646d696e296e657720636f6e7472616374207265676973747279206d7573742070726f76696465207468652070726576696f757320636f6e747261637420726567697374727943616c6c6572206973206e6f74207468652070656e64696e6720726567697374727941646d696e766f74654f757450657263656e744d696c6c655468726573686f6c64206d757374206e6f74206265206c6172676572207468616e2031303030303073656e646572206973206e6f742074686520696e697469616c697a6174696f6e2061646d696e73656e646572206973206e6f74207468652066756e6374696f6e616c206d616e61676572766f7465556e726561647950657263656e744d696c6c655468726573686f6c64206d757374206e6f74206265206c6172676572207468616e2031303030303063616c6c6572206973206e6f742074686520677561726469616e20726567697374726174696f6e7320636f6e74726163746d696e53656c665374616b6550657263656e744d696c6c65206d75737420626520313030303030206174206d6f737473656e646572206973206e6f7420746865206d6967726174696f6e206d616e61676572536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7763616c6c6572206973206e6f74207468652064656c65676174696f6e7320636f6e747261637463616c6c6572206973206e6f74207468652063657274696669636174696f6e20636f6e7472616374526567697374727941646d696e3a206e657720726567697374727941646d696e20697320746865207a65726f206164647265737357697468436c61696d61626c6552656769737472794d616e6167656d656e743a2063616c6c6572206973206e6f742074686520726567697374727941646d696e766f74652065787069726174696f6e2074696d65206d757374206e6f7420626520696e207468652070617374a2646970667358221220e2643d8debe01ae4182e08ac333b74b50c649fb45d8fb6b9be0f1cfff5d8d5ce64736f6c634300060c003373656e646572206973206e6f7420616e2061646d696e202872656769737472794d616e676572206f7220696e697469616c697a6174696f6e41646d696e296e657720636f6e7472616374207265676973747279206d7573742070726f76696465207468652070726576696f757320636f6e7472616374207265676973747279766f74654f757450657263656e744d696c6c655468726573686f6c64206d757374206e6f74206265206c6172676572207468616e2031303030303073656e646572206973206e6f74207468652066756e6374696f6e616c206d616e61676572766f7465556e726561647950657263656e744d696c6c655468726573686f6c64206d757374206e6f74206265206c6172676572207468616e203130303030306d696e53656c665374616b6550657263656e744d696c6c65206d75737420626520313030303030206174206d6f7374526567697374727941646d696e3a206e657720726567697374727941646d696e20697320746865207a65726f20616464726573731f5f028be638d6a0e3b8d56fd05b812ce325cc8dc73cdb0e16df94d6b2725c2e000000000000000000000000d859701c81119ab12a1e62af6270ad2ae05c7ab3000000000000000000000000f1fd5233e60e7ef797025fe9dd066d60d59bcb920000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000000000000000000000000000000000000000111700000000000000000000000000000000000000000000000000000000000011170
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102c85760003560e01c8063a4e2d6341161017b578063d3705cb7116100d8578063e7366dc81161008c578063f27f3bb411610071578063f27f3bb414610998578063f83d08ba146109be578063fcd13d65146109c6576102c8565b8063e7366dc814610962578063eec0701f14610990576102c8565b8063daa00faa116100bd578063daa00faa146108ee578063dfc8fdd014610934578063e4e992221461095a576102c8565b8063d3705cb7146108a5578063d55c9bcf146108c8576102c8565b8063bac5e9911161012f578063ca0809c811610114578063ca0809c814610825578063cf30901214610895578063d25235261461089d576102c8565b8063bac5e991146107d6578063c7af3a94146107f9576102c8565b8063ab8f6ffe11610160578063ab8f6ffe14610677578063acdb8e04146107c6578063b364cc38146107ce576102c8565b8063a4e2d63414610667578063a69df4b51461066f576102c8565b806348106fe31161022957806374c16b23116101dd578063868ca49d116101c2578063868ca49d146104e157806394470457146104e9578063a0774f7514610644576102c8565b806374c16b23146104a957806385b4bb53146104b1576102c8565b80635f94cd9c1161020e5780635f94cd9c14610443578063615c25451461044b57806361885df814610471576102c8565b806348106fe3146104335780634fa293c31461043b576102c8565b8063245dcad3116102805780632a1fac72116102655780632a1fac72146103e1578063333df154146103e957806339069d8c1461040d576102c8565b8063245dcad3146103b35780632987cea0146103bb576102c8565b8063090b7f1f116102b1578063090b7f1f1461032d5780631a0b2c4f146103765780631ee2960e14610392576102c8565b806302211f5e146102cd57806307b490af14610305575b600080fd5b6102f3600480360360208110156102e357600080fd5b50356001600160a01b03166109ec565b60408051918252519081900360200190f35b61032b6004803603602081101561031b57600080fd5b50356001600160a01b0316610a3d565b005b61035b6004803603604081101561034357600080fd5b506001600160a01b0381358116916020013516610d50565b60408051921515835260208301919091528051918290030190f35b61037e610d8f565b604080519115158252519081900360200190f35b61039a610db3565b6040805163ffffffff9092168252519081900360200190f35b61032b610dc7565b61032b600480360360208110156103d157600080fd5b50356001600160a01b0316610e2c565b61032b610ea9565b6103f1610f53565b604080516001600160a01b039092168252519081900360200190f35b61032b6004803603602081101561042357600080fd5b50356001600160a01b0316610f62565b61037e610fc5565b61039a610fd5565b6103f1610fed565b6103f16004803603602081101561046157600080fd5b50356001600160a01b0316610ffc565b61032b6004803603608081101561048757600080fd5b506001600160a01b03813516906020810135906040810135906060013561101a565b6103f16111ee565b6104b96111fd565b6040805163ffffffff9485168152928416602084015292168183015290519081900360600190f35b61032b611255565b61050f600480360360208110156104ff57600080fd5b50356001600160a01b0316611477565b60405180806020018060200180602001806020018715158152602001861515815260200185810385528b818151815260200191508051906020019060200280838360005b8381101561056b578181015183820152602001610553565b5050505090500185810384528a818151815260200191508051906020019060200280838360005b838110156105aa578181015183820152602001610592565b50505050905001858103835289818151815260200191508051906020019060200280838360005b838110156105e95781810151838201526020016105d1565b50505050905001858103825288818151815260200191508051906020019060200280838360005b83811015610628578181015183820152602001610610565b505050509050019a505050505050505050505060405180910390f35b61032b6004803603602081101561065a57600080fd5b503563ffffffff166117d3565b61037e6118eb565b61032b61190c565b61067f6119a2565b60405180806020018060200180602001806020018060200186810386528b818151815260200191508051906020019060200280838360005b838110156106cf5781810151838201526020016106b7565b5050505090500186810385528a818151815260200191508051906020019060200280838360005b8381101561070e5781810151838201526020016106f6565b50505050905001868103845289818151815260200191508051906020019060200280838360005b8381101561074d578181015183820152602001610735565b50505050905001868103835288818151815260200191508051906020019060200280838360005b8381101561078c578181015183820152602001610774565b5050505091909101878103835288518152885160209182019250818a01910280838360008315610628578181015183820152602001610610565b61032b611f07565b61039a611fac565b61032b600480360360208110156107ec57600080fd5b503563ffffffff16611fb8565b61032b6004803603604081101561080f57600080fd5b506001600160a01b0381351690602001356120d8565b61032b6004803603602081101561083b57600080fd5b81019060208101813564010000000081111561085657600080fd5b82018360208201111561086857600080fd5b8035906020019184602083028401116401000000008311171561088a57600080fd5b5090925090506125e8565b61037e612676565b61032b612697565b61032b600480360360208110156108bb57600080fd5b503563ffffffff1661271f565b61032b600480360360208110156108de57600080fd5b50356001600160a01b0316612826565b6109146004803603602081101561090457600080fd5b50356001600160a01b0316612974565b604080519315158452602084019290925282820152519081900360600190f35b61037e6004803603602081101561094a57600080fd5b50356001600160a01b0316612a2b565b6103f1612bc4565b61032b6004803603604081101561097857600080fd5b506001600160a01b0381351690602001351515612bd3565b61032b612cf9565b6102f3600480360360208110156109ae57600080fd5b50356001600160a01b0316612dfb565b61032b612e0d565b61032b600480360360208110156109dc57600080fd5b50356001600160a01b0316612eba565b6040805160608101825260095463ffffffff8082168352640100000000820481166020840152680100000000000000009091041691810191909152600090610a3590839061303a565b90505b919050565b60035474010000000000000000000000000000000000000000900460ff1615610a975760405162461bcd60e51b81526004018080602001828103825260258152602001806141136025913960400191505060405180910390fd5b610a9f6140f2565b506040805160608101825260095463ffffffff808216835264010000000082048116602080850191909152680100000000000000009092041682840152336000818152600690925283822080546001600160a01b038781167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355955194959294921692909184917f275bb5f10bdccb6cea621dfabf75682103f2392a02061d953ebe212cfa26ef0e91a3600b54604080517f7c47c16d0000000000000000000000000000000000000000000000000000000081526001600160a01b03858116600483015291516000939290921691637c47c16d91602480820192602092909190829003018186803b158015610bb957600080fd5b505afa158015610bcd573d6000803e3d6000fd5b505050506040513d6020811015610be357600080fd5b505190506001600160a01b038216610c11576001600160a01b03831660009081526005602052604090208190555b6001600160a01b038516610c39576001600160a01b0383166000908152600560205260408120555b600b54604080517fcf3b670b00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163cf3b670b916004808301926020929190829003018186803b158015610c9757600080fd5b505afa158015610cab573d6000803e3d6000fd5b505050506040513d6020811015610cc157600080fd5b505190506001600160a01b03831615801590610cef5750856001600160a01b0316836001600160a01b031614155b15610d0257610d02836000848489613181565b6001600160a01b03861615610d48576000866001600160a01b0316846001600160a01b03161415610d34576000610d36565b825b9050610d4687826000858a613181565b505b505050505050565b6001600160a01b0380831660009081526004602090815260408083209385168352929052908120548015801590610d8657508042105b91509250929050565b600080546001600160a01b0316610da4613367565b6001600160a01b031614905090565b600954640100000000900463ffffffff1690565b60035474010000000000000000000000000000000000000000900460ff1615610e215760405162461bcd60e51b81526004018080602001828103825260258152602001806141136025913960400191505060405180910390fd5b610e2a3361336b565b565b610e34610d8f565b610e6f5760405162461bcd60e51b81526004018080602001828103825260408152602001806143c86040913960400191505060405180910390fd5b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b610eb1610f53565b6001600160a01b0316336001600160a01b031614610f005760405162461bcd60e51b81526004018080602001828103825260268152602001806142196026913960400191505060405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556040517f2a2b3ea974fb057582c3b210ef8b5f81492d15673f49d4384bfa3b896a964c3c90600090a1565b6002546001600160a01b031690565b610f6a610f53565b6001600160a01b0316336001600160a01b031614610fb95760405162461bcd60e51b81526004018080602001828103825260268152602001806142196026913960400191505060405180910390fd5b610fc281613628565b50565b6002546001600160a01b03161590565b60095468010000000000000000900463ffffffff1690565b6001546001600160a01b031690565b6001600160a01b039081166000908152600660205260409020541690565b600b546001600160a01b031633146110635760405162461bcd60e51b81526004018080602001828103825260268152602001806143466026913960400191505060405180910390fd5b60035474010000000000000000000000000000000000000000900460ff16156110bd5760405162461bcd60e51b81526004018080602001828103825260258152602001806141136025913960400191505060405180910390fd5b6110c56140f2565b506040805160608101825260095463ffffffff8082168352640100000000820481166020840152680100000000000000009091041691810191909152600061110e8585846136e0565b604080518781526020810187905280820183905290519192506001600160a01b038816917fd5c5ef58495d970aa497140d952854435af4876c07e0735daaa3fc32874c3cf89181900360600190a2600a54604080517f68f52e500000000000000000000000000000000000000000000000000000000081526001600160a01b03898116600483015260248201859052915191909216916368f52e5091604480830192600092919082900301818387803b1580156111ca57600080fd5b505af11580156111de573d6000803e3d6000fd5b50505050610d4886858585613748565b6000546001600160a01b031690565b600080600061120a6140f2565b50506040805160608101825260095463ffffffff8082168084526401000000008304821660208501819052680100000000000000009093049091169290930182905291949193509150565b60035474010000000000000000000000000000000000000000900460ff16156112af5760405162461bcd60e51b81526004018080602001828103825260258152602001806141136025913960400191505060405180910390fd5b600c54604080517f10b3b29300000000000000000000000000000000000000000000000000000000815233600482015290516000926001600160a01b0316916310b3b293916024808301926020929190829003018186803b15801561131357600080fd5b505afa158015611327573d6000803e3d6000fd5b505050506040513d602081101561133d57600080fd5b5051905061134a81613799565b1561139c576040805162461bcd60e51b815260206004820152601360248201527f63616c6c657220697320766f7465642d6f757400000000000000000000000000604482015290519081900360640190fd5b60408051600181526000602082015281516001600160a01b038416927ff2de790499b85c5800832caf02f18e7ddecfa1d20b3ddc6a8c44be78838d1cec928290030190a2600a54604080517f0b1ca49a0000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015291519190921691630b1ca49a9160248083019260609291908290030181600087803b15801561144857600080fd5b505af115801561145c573d6000803e3d6000fd5b505050506040513d606081101561147257600080fd5b505050565b606080606080600080600a60009054906101000a90046001600160a01b03166001600160a01b031663ab8f6ffe6040518163ffffffff1660e01b815260040160006040518083038186803b1580156114ce57600080fd5b505afa1580156114e2573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052606081101561152957600080fd5b810190808051604051939291908464010000000082111561154957600080fd5b90830190602082018581111561155e57600080fd5b825186602082028301116401000000008211171561157b57600080fd5b82525081516020918201928201910280838360005b838110156115a8578181015183820152602001611590565b50505050905001604052602001805160405193929190846401000000008211156115d157600080fd5b9083019060208201858111156115e657600080fd5b825186602082028301116401000000008211171561160357600080fd5b82525081516020918201928201910280838360005b83811015611630578181015183820152602001611618565b505050509050016040526020018051604051939291908464010000000082111561165957600080fd5b90830190602082018581111561166e57600080fd5b825186602082028301116401000000008211171561168b57600080fd5b82525081516020918201928201910280838360005b838110156116b85781810151838201526020016116a0565b50505050905001604052505050809650819750829850505050855167ffffffffffffffff811180156116e957600080fd5b50604051908082528060200260200182016040528015611713578160200160208202803683370190505b50925060005b86518110156117c957600087828151811061173057fe5b6020908102919091018101516001600160a01b038082166000908152600484526040808220928e168252919093529091205490915042101561178b57600185838151811061177a57fe5b911515602092830291909101909101525b886001600160a01b0316816001600160a01b031614156117c057600193508582815181106117b557fe5b602002602001015192505b50600101611719565b5091939550919395565b6117db6137b7565b6118165760405162461bcd60e51b815260040180806020018281038252602481526020018061423f6024913960400191505060405180910390fd5b620186a063ffffffff8216111561185e5760405162461bcd60e51b815260040180806020018281038252603f815260200180614263603f913960400191505060405180910390fd5b6009546040805163ffffffff8481168252640100000000909304909216602083015280517ff85225604b27cb71d925b3e5e40561ca03066d501e90ac8bfaa6784f1cd878679281900390910190a16009805463ffffffff909216640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff909216919091179055565b60035474010000000000000000000000000000000000000000900460ff1690565b6119146137fc565b61194f5760405162461bcd60e51b81526004018080602001828103825260238152602001806143026023913960400191505060405180910390fd5b600380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040517f19aad37188a1d3921e29eb3c66acf43d81975e107cb650d58cca878627955fd690600090a1565b600c54600a54604080517fab8f6ffe000000000000000000000000000000000000000000000000000000008152905160609384938493849384936001600160a01b0390811693169163ab8f6ffe916004808301926000929190829003018186803b158015611a0f57600080fd5b505afa158015611a23573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526060811015611a6a57600080fd5b8101908080516040519392919084640100000000821115611a8a57600080fd5b908301906020820185811115611a9f57600080fd5b8251866020820283011164010000000082111715611abc57600080fd5b82525081516020918201928201910280838360005b83811015611ae9578181015183820152602001611ad1565b5050505090500160405260200180516040519392919084640100000000821115611b1257600080fd5b908301906020820185811115611b2757600080fd5b8251866020820283011164010000000082111715611b4457600080fd5b82525081516020918201928201910280838360005b83811015611b71578181015183820152602001611b59565b5050505090500160405260200180516040519392919084640100000000821115611b9a57600080fd5b908301906020820185811115611baf57600080fd5b8251866020820283011164010000000082111715611bcc57600080fd5b82525081516020918201928201910280838360005b83811015611bf9578181015183820152602001611be1565b505050509190910160408190527ffccea80d000000000000000000000000000000000000000000000000000000008152602060048201818152895160248401528951999f50979d50959a506001600160a01b0389169763fccea80d978f979096508695506044909201935081870192500280838360005b83811015611c88578181015183820152602001611c70565b505050509050019250505060006040518083038186803b158015611cab57600080fd5b505afa158015611cbf573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526020811015611d0657600080fd5b8101908080516040519392919084640100000000821115611d2657600080fd5b908301906020820185811115611d3b57600080fd5b8251866020820283011164010000000082111715611d5857600080fd5b82525081516020918201928201910280838360005b83811015611d85578181015183820152602001611d6d565b505050509050016040525050509350806001600160a01b031663c697a996876040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019060200280838360005b83811015611df3578181015183820152602001611ddb565b505050509050019250505060006040518083038186803b158015611e1657600080fd5b505afa158015611e2a573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526020811015611e7157600080fd5b8101908080516040519392919084640100000000821115611e9157600080fd5b908301906020820185811115611ea657600080fd5b8251866020820283011164010000000082111715611ec357600080fd5b82525081516020918201928201910280838360005b83811015611ef0578181015183820152602001611ed8565b505050509050016040525050509150509091929394565b611f0f610d8f565b611f4a5760405162461bcd60e51b81526004018080602001828103825260408152602001806143c86040913960400191505060405180910390fd5b600080546040516001600160a01b03909116907f1f5f028be638d6a0e3b8d56fd05b812ce325cc8dc73cdb0e16df94d6b2725c2e908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60095463ffffffff1690565b611fc06137b7565b611ffb5760405162461bcd60e51b815260040180806020018281038252602481526020018061423f6024913960400191505060405180910390fd5b620186a063ffffffff821611156120435760405162461bcd60e51b815260040180806020018281038252603b8152602001806141de603b913960400191505060405180910390fd5b6009546040805163ffffffff848116825268010000000000000000909304909216602083015280517f1d5d5428459ec4611f1aa061bef9eeb6e83fb6f5408c6dc5c2f022ba9ef4715c9281900390910190a16009805463ffffffff90921668010000000000000000027fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff909216919091179055565b60035474010000000000000000000000000000000000000000900460ff16156121325760405162461bcd60e51b81526004018080602001828103825260258152602001806141136025913960400191505060405180910390fd5b428110156121715760405162461bcd60e51b815260040180806020018281038252602c815260200180614408602c913960400191505060405180910390fd5b600c54604080517f10b3b29300000000000000000000000000000000000000000000000000000000815233600482015290516000926001600160a01b0316916310b3b293916024808301926020929190829003018186803b1580156121d557600080fd5b505afa1580156121e9573d6000803e3d6000fd5b505050506040513d60208110156121ff57600080fd5b50516001600160a01b0380821660008181526004602090815260408083209489168084529482529182902087905581518781529151949550929391927fcb530db56313ef43bf663c10381c044eada437428b9644aabfff5f46b6f6605b92918290030190a36060806060600a60009054906101000a90046001600160a01b03166001600160a01b031663ab8f6ffe6040518163ffffffff1660e01b815260040160006040518083038186803b1580156122b757600080fd5b505afa1580156122cb573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052606081101561231257600080fd5b810190808051604051939291908464010000000082111561233257600080fd5b90830190602082018581111561234757600080fd5b825186602082028301116401000000008211171561236457600080fd5b82525081516020918201928201910280838360005b83811015612391578181015183820152602001612379565b50505050905001604052602001805160405193929190846401000000008211156123ba57600080fd5b9083019060208201858111156123cf57600080fd5b82518660208202830111640100000000821117156123ec57600080fd5b82525081516020918201928201910280838360005b83811015612419578181015183820152602001612401565b505050509050016040526020018051604051939291908464010000000082111561244257600080fd5b90830190602082018581111561245757600080fd5b825186602082028301116401000000008211171561247457600080fd5b82525081516020918201928201910280838360005b838110156124a1578181015183820152602001612489565b5050505090500160405250505092509250925060006124c28484848a61383c565b90508015610d46576124d48488613a6a565b6040516001600160a01b038816907fc808d7f6285926a53d708653414e2d2a88e3c1715debb80fb09ca41d744e5ba690600090a2604080516000808252602082015281516001600160a01b038a16927ff2de790499b85c5800832caf02f18e7ddecfa1d20b3ddc6a8c44be78838d1cec928290030190a2600a54604080517f0b1ca49a0000000000000000000000000000000000000000000000000000000081526001600160a01b038a8116600483015291519190921691630b1ca49a9160248083019260609291908290030181600087803b1580156125b357600080fd5b505af11580156125c7573d6000803e3d6000fd5b505050506040513d60608110156125dd57600080fd5b505050505050505050565b6125f0610f53565b6001600160a01b0316336001600160a01b03161461263f5760405162461bcd60e51b81526004018080602001828103825260268152602001806142196026913960400191505060405180910390fd5b60005b818110156114725761266e83838381811061265957fe5b905060200201356001600160a01b031661336b565b600101612642565b60035474010000000000000000000000000000000000000000900460ff1681565b6001546001600160a01b031633146126e05760405162461bcd60e51b81526004018080602001828103825260278152602001806141b76027913960400191505060405180910390fd5b6001546126f5906001600160a01b0316613628565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b6127276137b7565b6127625760405162461bcd60e51b815260040180806020018281038252602481526020018061423f6024913960400191505060405180910390fd5b620186a063ffffffff821611156127aa5760405162461bcd60e51b815260040180806020018281038252602f8152602001806142d3602f913960400191505060405180910390fd5b6009546040805163ffffffff8085168252909216602083015280517f5f1e6a4b65e5b155a39124570a9d52d1a94b94d17b9cefb044afd83367344f739281900390910190a1600980547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff92909216919091179055565b600c546001600160a01b0316331461286f5760405162461bcd60e51b81526004018080602001828103825260318152602001806142a26031913960400191505060405180910390fd5b60035474010000000000000000000000000000000000000000900460ff16156128c95760405162461bcd60e51b81526004018080602001828103825260258152602001806141136025913960400191505060405180910390fd5b604080516000808252602082015281516001600160a01b038416927ff2de790499b85c5800832caf02f18e7ddecfa1d20b3ddc6a8c44be78838d1cec928290030190a2600a54604080517f0b1ca49a0000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015291519190921691630b1ca49a9160248083019260609291908290030181600087803b15801561144857600080fd5b600080600061298284613799565b6001600160a01b0380861660009081526007602090815260409182902054600b5483517fcf3b670b00000000000000000000000000000000000000000000000000000000815293519598509096509092169263cf3b670b92600480840193919291829003018186803b1580156129f757600080fd5b505afa158015612a0b573d6000803e3d6000fd5b505050506040513d6020811015612a2157600080fd5b5051929491935050565b600c54604080517f10b3b2930000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152915160009392909216916310b3b29391602480820192602092909190829003018186803b158015612a9557600080fd5b505afa158015612aa9573d6000803e3d6000fd5b505050506040513d6020811015612abf57600080fd5b50519150612acc82613799565b15612ad957506000610a38565b6040805160608101825260095463ffffffff8082168352640100000000820481166020840152680100000000000000009091041691810191909152600090612b2290849061303a565b600a54604080517f2e983ab00000000000000000000000000000000000000000000000000000000081526001600160a01b038781166004830152602482018590529151939450911691632e983ab091604480820192602092909190829003018186803b158015612b9157600080fd5b505afa158015612ba5573d6000803e3d6000fd5b505050506040513d6020811015612bbb57600080fd5b50519392505050565b6003546001600160a01b031690565b600d546001600160a01b03163314612c1c5760405162461bcd60e51b815260040180806020018281038252602881526020018061436c6028913960400191505060405180910390fd5b60035474010000000000000000000000000000000000000000900460ff1615612c765760405162461bcd60e51b81526004018080602001828103825260258152602001806141136025913960400191505060405180910390fd5b600a54604080517fe66b9c1d0000000000000000000000000000000000000000000000000000000081526001600160a01b03858116600483015284151560248301529151919092169163e66b9c1d91604480830192600092919082900301818387803b158015612ce557600080fd5b505af1158015610d48573d6000803e3d6000fd5b612d01613ac5565b600a80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055612d41613b86565b600b80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055612d81613c16565b600c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055612dc1613ca6565b600d80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60056020526000908152604090205481565b612e156137fc565b612e505760405162461bcd60e51b81526004018080602001828103825260238152602001806143026023913960400191505060405180910390fd5b600380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040517f0f2e5b6c72c6a4491efd919a9f9a409f324ef0708c11ee57d410c2cb06c0992b90600090a1565b612ec2613d36565b612efd5760405162461bcd60e51b815260040180806020018281038252603e815260200180614138603e913960400191505060405180910390fd5b600354604080517f078cbb7c00000000000000000000000000000000000000000000000000000000815290516001600160a01b039283169284169163078cbb7c916004808301926020929190829003018186803b158015612f5d57600080fd5b505afa158015612f71573d6000803e3d6000fd5b505050506040513d6020811015612f8757600080fd5b50516001600160a01b031614612fce5760405162461bcd60e51b81526004018080602001828103825260418152602001806141766041913960600191505060405180910390fd5b600380546001600160a01b0383167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116811790915560408051918252517ffea2d033438b968078a6264409d0104b5f3d2ce7b795afc74918e70f3534f22b9181900360200190a150565b600b54604080517ffab46d660000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152825160009491909116928492849263fab46d6692602480840193919291829003018186803b1580156130a557600080fd5b505afa1580156130b9573d6000803e3d6000fd5b505050506040513d60408110156130cf57600080fd5b50602090810151604080517f7c47c16d0000000000000000000000000000000000000000000000000000000081526001600160a01b038981166004830152915192945060009391861692637c47c16d92602480840193919291829003018186803b15801561313c57600080fd5b505afa158015613150573d6000803e3d6000fd5b505050506040513d602081101561316657600080fd5b505190506131758282876136e0565b93505050505b92915050565b61318a85613799565b1561319457613360565b6001600160a01b0385166000908152600760205260408120546131c39086906131bd9087613d91565b90613dd3565b9050600080841180156131fe57506131ee84846040015163ffffffff16613e2d90919063ffffffff16565b6131fb83620186a0613e2d565b10155b90508015613345576001600160a01b03871660008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f0bc20ba748c0b7a01e134c521b1e20764a53c3a6b4710a54cbbcf6c8bb3ba3079190a2604080516000808252602082015281516001600160a01b038a16927ff2de790499b85c5800832caf02f18e7ddecfa1d20b3ddc6a8c44be78838d1cec928290030190a2600a54604080517f0b1ca49a0000000000000000000000000000000000000000000000000000000081526001600160a01b038a8116600483015291519190921691630b1ca49a9160248083019260609291908290030181600087803b15801561331857600080fd5b505af115801561332c573d6000803e3d6000fd5b505050506040513d606081101561334257600080fd5b50505b506001600160a01b0386166000908152600760205260409020555b5050505050565b3390565b600c54604080517f10b3b2930000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152915191909216916310b3b293916024808301926020929190829003018186803b1580156133d157600080fd5b505afa1580156133e5573d6000803e3d6000fd5b505050506040513d60208110156133fb57600080fd5b5051905061340881613799565b1561345a576040805162461bcd60e51b815260206004820152601360248201527f63616c6c657220697320766f7465642d6f757400000000000000000000000000604482015290519081900360640190fd5b604080516001808252602082015281516001600160a01b038416927ff2de790499b85c5800832caf02f18e7ddecfa1d20b3ddc6a8c44be78838d1cec928290030190a26040805160608101825260095463ffffffff80821683526401000000008204811660208401526801000000000000000090910416918101919091526000906134e690839061303a565b600a54600d54604080517fdc8b6d730000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015291519495509281169363e272079f9387938793169163dc8b6d7391602480820192602092909190829003018186803b15801561355e57600080fd5b505afa158015613572573d6000803e3d6000fd5b505050506040513d602081101561358857600080fd5b5051604080517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b1681526001600160a01b0390941660048501526024840192909252151560448301525160648083019260209291908290030181600087803b1580156135f857600080fd5b505af115801561360c573d6000803e3d6000fd5b505050506040513d602081101561362257600080fd5b50505050565b6001600160a01b03811661366d5760405162461bcd60e51b81526004018080602001828103825260348152602001806143946034913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f1f5f028be638d6a0e3b8d56fd05b812ce325cc8dc73cdb0e16df94d6b2725c2e91a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60006136ff826000015163ffffffff1684613e2d90919063ffffffff16565b61370c85620186a0613e2d565b10613718575081613741565b815161373e9063ffffffff90811690613738908790620186a090613e2d16565b90613e86565b90505b9392505050565b6001600160a01b03808516600090815260066020526040902054168061376e5750613622565b6001600160a01b0385166000908152600560205260409020805490859055610d488286838787613181565b6001600160a01b031660009081526008602052604090205460ff1690565b60006137f76040518060400160405280601181526020017f66756e6374696f6e616c4d616e61676572000000000000000000000000000000815250613ec8565b905090565b60006137f76040518060400160405280601081526020017f6d6967726174696f6e4d616e6167657200000000000000000000000000000000815250613ec8565b60006138466140f2565b506040805160608101825260095463ffffffff80821683526401000000008204811660208401526801000000000000000090910416918101919091526000808080808080805b8d518110156139d9578d81815181106138a157fe5b602002602001015193508c81815181106138b757fe5b602002602001015192508a6001600160a01b0316846001600160a01b03161480156138f257508b81815181106138e957fe5b60200260200101515b156138fc57600191505b6139068884613dd3565b97508b818151811061391457fe5b60200260200101511561392e5761392b8684613dd3565b95505b60008061393b868e610d50565b91509150811561397c5761394f8986613dd3565b98508d838151811061395d57fe5b602002602001015115613977576139748786613dd3565b96505b6139cf565b80156139cf5760046000876001600160a01b03166001600160a01b0316815260200190815260200160002060008e6001600160a01b03166001600160a01b03168152602001908152602001600020600090555b505060010161388c565b50600087118015613a125750613a0287896020015163ffffffff16613e2d90919063ffffffff16565b613a0f87620186a0613e2d565b10155b80613a595750808015613a255750600085115b8015613a595750613a4985896020015163ffffffff16613e2d90919063ffffffff16565b613a5685620186a0613e2d565b10155b9d9c50505050505050505050505050565b60005b825181101561147257600060046000858481518110613a8857fe5b6020908102919091018101516001600160a01b03908116835282820193909352604091820160009081209387168152929052902055600101613a6d565b600354604080517f35817773000000000000000000000000000000000000000000000000000000008152602060048201819052600960248301527f636f6d6d69747465650000000000000000000000000000000000000000000000604483015291516000936001600160a01b03169263358177739260648082019391829003018186803b158015613b5557600080fd5b505afa158015613b69573d6000803e3d6000fd5b505050506040513d6020811015613b7f57600080fd5b5051905090565b600354604080517f35817773000000000000000000000000000000000000000000000000000000008152602060048201819052600b60248301527f64656c65676174696f6e73000000000000000000000000000000000000000000604483015291516000936001600160a01b03169263358177739260648082019391829003018186803b158015613b5557600080fd5b600354604080517f35817773000000000000000000000000000000000000000000000000000000008152602060048201819052601560248301527f677561726469616e73526567697374726174696f6e0000000000000000000000604483015291516000936001600160a01b03169263358177739260648082019391829003018186803b158015613b5557600080fd5b600354604080517f35817773000000000000000000000000000000000000000000000000000000008152602060048201819052600d60248301527f63657274696669636174696f6e00000000000000000000000000000000000000604483015291516000936001600160a01b03169263358177739260648082019391829003018186803b158015613b5557600080fd5b6003546000906001600160a01b0316331480613d6a5750613d556111ee565b6001600160a01b0316336001600160a01b0316145b806137f75750613d78610f53565b6001600160a01b0316336001600160a01b031614905090565b600061374183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613ff6565b600082820183811015613741576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082613e3c5750600061317b565b82820282848281613e4957fe5b04146137415760405162461bcd60e51b81526004018080602001828103825260218152602001806143256021913960400191505060405180910390fd5b600061374183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061408d565b6003546000906001600160a01b0316613edf613d36565b8061374157506001600160a01b0381161580159061374157506003546040517f1ee441e900000000000000000000000000000000000000000000000000000000815260206004820181815286516024840152865133946001600160a01b031693631ee441e99389939283926044019185019080838360005b83811015613f6f578181015183820152602001613f57565b50505050905090810190601f168015613f9c5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015613fb957600080fd5b505afa158015613fcd573d6000803e3d6000fd5b505050506040513d6020811015613fe357600080fd5b50516001600160a01b0316149392505050565b600081848411156140855760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561404a578181015183820152602001614032565b50505050905090810190601f1680156140775780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836140dc5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561404a578181015183820152602001614032565b5060008385816140e857fe5b0495945050505050565b60408051606081018252600080825260208201819052918101919091529056fe636f6e7472616374206973206c6f636b656420666f722074686973206f7065726174696f6e73656e646572206973206e6f7420616e2061646d696e202872656769737472794d616e676572206f7220696e697469616c697a6174696f6e41646d696e296e657720636f6e7472616374207265676973747279206d7573742070726f76696465207468652070726576696f757320636f6e747261637420726567697374727943616c6c6572206973206e6f74207468652070656e64696e6720726567697374727941646d696e766f74654f757450657263656e744d696c6c655468726573686f6c64206d757374206e6f74206265206c6172676572207468616e2031303030303073656e646572206973206e6f742074686520696e697469616c697a6174696f6e2061646d696e73656e646572206973206e6f74207468652066756e6374696f6e616c206d616e61676572766f7465556e726561647950657263656e744d696c6c655468726573686f6c64206d757374206e6f74206265206c6172676572207468616e2031303030303063616c6c6572206973206e6f742074686520677561726469616e20726567697374726174696f6e7320636f6e74726163746d696e53656c665374616b6550657263656e744d696c6c65206d75737420626520313030303030206174206d6f737473656e646572206973206e6f7420746865206d6967726174696f6e206d616e61676572536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7763616c6c6572206973206e6f74207468652064656c65676174696f6e7320636f6e747261637463616c6c6572206973206e6f74207468652063657274696669636174696f6e20636f6e7472616374526567697374727941646d696e3a206e657720726567697374727941646d696e20697320746865207a65726f206164647265737357697468436c61696d61626c6552656769737472794d616e6167656d656e743a2063616c6c6572206973206e6f742074686520726567697374727941646d696e766f74652065787069726174696f6e2074696d65206d757374206e6f7420626520696e207468652070617374a2646970667358221220e2643d8debe01ae4182e08ac333b74b50c649fb45d8fb6b9be0f1cfff5d8d5ce64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000d859701c81119ab12a1e62af6270ad2ae05c7ab3000000000000000000000000f1fd5233e60e7ef797025fe9dd066d60d59bcb920000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000000000000000000000000000000000000000111700000000000000000000000000000000000000000000000000000000000011170
-----Decoded View---------------
Arg [0] : _contractRegistry (address): 0xD859701C81119aB12A1e62AF6270aD2AE05c7AB3
Arg [1] : _registryAdmin (address): 0xf1fD5233E60E7Ef797025FE9DD066d60d59BcB92
Arg [2] : minSelfStakePercentMille (uint32): 8000
Arg [3] : voteUnreadyPercentMilleThreshold (uint32): 70000
Arg [4] : voteOutPercentMilleThreshold (uint32): 70000
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000d859701c81119ab12a1e62af6270ad2ae05c7ab3
Arg [1] : 000000000000000000000000f1fd5233e60e7ef797025fe9dd066d60d59bcb92
Arg [2] : 0000000000000000000000000000000000000000000000000000000000001f40
Arg [3] : 0000000000000000000000000000000000000000000000000000000000011170
Arg [4] : 0000000000000000000000000000000000000000000000000000000000011170
Deployed Bytecode Sourcemap
53390:24346:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57303:160;;;;;;;;;;;;;;;;-1:-1:-1;57303:160:0;-1:-1:-1;;;;;57303:160:0;;:::i;:::-;;;;;;;;;;;;;;;;61962:914;;;;;;;;;;;;;;;;-1:-1:-1;61962:914:0;-1:-1:-1;;;;;61962:914:0;;:::i;:::-;;60080:237;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;60080:237:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;40727:110;;;:::i;:::-;;;;;;;;;;;;;;;;;;68656:145;;;:::i;:::-;;;;;;;;;;;;;;;;;;;56189:102;;;:::i;42288:146::-;;;;;;;;;;;;;;;;-1:-1:-1;42288:146:0;-1:-1:-1;;;;;42288:146:0;;:::i;43814:159::-;;;:::i;43619:107::-;;;:::i;:::-;;;;-1:-1:-1;;;;;43619:107:0;;;;;;;;;;;;;;49688:154;;;;;;;;;;;;;;;;-1:-1:-1;49688:154:0;-1:-1:-1;;;;;49688:154:0;;:::i;44033:123::-;;;:::i;67685:137::-;;;:::i;42802:110::-;;;:::i;63066:116::-;;;;;;;;;;;;;;;;-1:-1:-1;63066:116:0;-1:-1:-1;;;;;63066:116:0;;:::i;64378:566::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;64378:566:0;;;;;;;;;;;;;;;;;;:::i;40281:95::-;;;:::i;69113:447::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55690:340;;;:::i;61077:679::-;;;;;;;;;;;;;;;;-1:-1:-1;61077:679:0;-1:-1:-1;;;;;61077:679:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68043:472;;;;;;;;;;;;;;;;-1:-1:-1;68043:472:0;;;;:::i;52395:90::-;;;:::i;52155:116::-;;;:::i;57953:503::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;57953:503:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57953:503:0;;;;;;;;;;;;;;;;;;;;;;;;;41231:182;;;:::i;66774:129::-;;;:::i;67116:436::-;;;;;;;;;;;;;;;;-1:-1:-1;67116:436:0;;;;:::i;58881:882::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;58881:882:0;;;;;;;;:::i;69889:200::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;69889:200:0;;-1:-1:-1;69889:200:0;-1:-1:-1;69889:200:0;:::i;51120:18::-;;;:::i;42540:183::-;;;:::i;66218:392::-;;;;;;;;;;;;;;;;-1:-1:-1;66218:392:0;;;;:::i;65248:220::-;;;;;;;;;;;;;;;;-1:-1:-1;65248:220:0;-1:-1:-1;;;;;65248:220:0;;:::i;63620:298::-;;;;;;;;;;;;;;;;-1:-1:-1;63620:298:0;-1:-1:-1;;;;;63620:298:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56701:398;;;;;;;;;;;;;;;;-1:-1:-1;56701:398:0;-1:-1:-1;;;;;56701:398:0;;:::i;49558:122::-;;;:::i;65720:209::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;65720:209:0;;;;;;;;;;:::i;77391:340::-;;;:::i;53620:46::-;;;;;;;;;;;;;;;;-1:-1:-1;53620:46:0;-1:-1:-1;;;;;53620:46:0;;:::i;51829:111::-;;;:::i;49018:394::-;;;;;;;;;;;;;;;;-1:-1:-1;49018:394:0;-1:-1:-1;;;;;49018:394:0;;:::i;57303:160::-;57413:45;;;;;;;;57449:8;57413:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;57380:19;;57413:45;;57439:8;;57413:25;:45::i;:::-;57406:52;;57303:160;;;;:::o;61962:914::-;52539:6;;;;;;;52538:7;52530:57;;;;-1:-1:-1;;;52530:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62034:25:::1;;:::i;:::-;-1:-1:-1::0;62034:36:0::1;::::0;;::::1;::::0;::::1;::::0;;62062:8:::1;62034:36:::0;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;;::::0;;::::1;::::0;;;;;;;::::1;;::::0;;;;62093:10:::1;-1:-1:-1::0;62130:19:0;;;:12:::1;:19:::0;;;;;;;;-1:-1:-1;;;;;62156:29:0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;62195;;62034:36;;62093:10;;62130:19;::::1;::::0;62156:29;;62093:10;;62195:29:::1;::::0;::::1;62252:19;::::0;:44:::1;::::0;;;;;-1:-1:-1;;;;;62252:44:0;;::::1;;::::0;::::1;::::0;;;62231:18:::1;::::0;62252:19;;;::::1;::::0;:37:::1;::::0;:44;;;;;::::1;::::0;;;;;;;;;:19;:44;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;62252:44:0;;-1:-1:-1;;;;;;62307:25:0;::::1;62303:74;;-1:-1:-1::0;;;;;62340:18:0;::::1;;::::0;;;:11:::1;:18;::::0;;;;:31;;;62303:74:::1;-1:-1:-1::0;;;;;62387:21:0;::::1;62383:64;;-1:-1:-1::0;;;;;62423:18:0;::::1;;::::0;;;:11:::1;:18;::::0;;;;62416:25;62383:64:::1;62471:19;::::0;:44:::1;::::0;;;;;;;62453:15:::1;::::0;-1:-1:-1;;;;;62471:19:0::1;::::0;:42:::1;::::0;:44:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:19;:44;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;62471:44:0;;-1:-1:-1;;;;;;62526:25:0;::::1;::::0;;::::1;::::0;:51:::1;;;62570:7;-1:-1:-1::0;;;;;62555:22:0::1;:11;-1:-1:-1::0;;;;;62555:22:0::1;;;62526:51;62522:140;;;62585:71;62606:11;62619:1;62622:10;62634;62646:9;62585:20;:71::i;:::-;-1:-1:-1::0;;;;;62672:21:0;::::1;::::0;62668:204:::1;;62701:19;62738:7;-1:-1:-1::0;;;;;62723:22:0::1;:11;-1:-1:-1::0;;;;;62723:22:0::1;;;:39;;62761:1;62723:39;;;62748:10;62723:39;62701:61;;62768:71;62789:7;62798:14;62814:1;62817:10;62829:9;62768:20;:71::i;:::-;62668:204;;52600:1;;;;;61962:914:::0;:::o;60080:237::-;-1:-1:-1;;;;;60220:23:0;;;60170:10;60220:23;;;:16;:23;;;;;;;;:32;;;;;;;;;;;;60265:15;;;;;:47;;;60302:10;60284:15;:28;60265:47;60257:55;;60080:237;;;;;:::o;40727:110::-;40775:4;40815:14;;-1:-1:-1;;;;;40815:14:0;40799:12;:10;:12::i;:::-;-1:-1:-1;;;;;40799:30:0;;40792:37;;40727:110;:::o;68656:145::-;68755:8;:41;;;;;;;68656:145::o;56189:102::-;52539:6;;;;;;;52538:7;52530:57;;;;-1:-1:-1;;;52530:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56256:30:::1;56275:10;56256:18;:30::i;:::-;56189:102::o:0;42288:146::-;40525:17;:15;:17::i;:::-;40517:94;;;;-1:-1:-1;;;40517:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42386:21:::1;:40:::0;;;::::1;-1:-1:-1::0;;;;;42386:40:0;;;::::1;::::0;;;::::1;::::0;;42288:146::o;43814:159::-;43432:21;:19;:21::i;:::-;-1:-1:-1;;;;;43418:35:0;:10;-1:-1:-1;;;;;43418:35:0;;43410:86;;;;-1:-1:-1;;;43410:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43892:20:::1;:33:::0;;;::::1;::::0;;43941:24:::1;::::0;::::1;::::0;43923:1:::1;::::0;43941:24:::1;43814:159::o:0;43619:107::-;43698:20;;-1:-1:-1;;;;;43698:20:0;43619:107;:::o;49688:154::-;43432:21;:19;:21::i;:::-;-1:-1:-1;;;;;43418:35:0;:10;-1:-1:-1;;;;;43418:35:0;;43410:86;;;;-1:-1:-1;;;43410:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49791:43:::1;49819:14;49791:27;:43::i;:::-;49688:154:::0;:::o;44033:123::-;44114:20;;-1:-1:-1;;;;;44114:20:0;:34;44033:123;:::o;67685:137::-;67780:8;:37;;;;;;;67685:137::o;42802:110::-;42881:21;;-1:-1:-1;;;;;42881:21:0;42802:110;:::o;63066:116::-;-1:-1:-1;;;;;63158:19:0;;;63137:7;63158:19;;;:12;:19;;;;;;;;63066:116::o;64378:566::-;55013:19;;-1:-1:-1;;;;;55013:19:0;54991:10;:42;54983:93;;;;-1:-1:-1;;;54983:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52539:6:::1;::::0;;;::::1;;;52538:7;52530:57;;;;-1:-1:-1::0;;;52530:57:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64569:25:::2;;:::i;:::-;-1:-1:-1::0;64569:36:0::2;::::0;;::::2;::::0;::::2;::::0;;64597:8:::2;64569:36:::0;::::2;::::0;;::::2;::::0;;;;::::2;::::0;::::2;;::::0;::::2;::::0;;;;::::2;;::::0;;;;;;;-1:-1:-1;64634:65:0::2;64653:18:::0;64673:14;64569:36;64634:18:::2;:65::i;:::-;64709:74;::::0;;;;;::::2;::::0;::::2;::::0;;;;;;;;;;;64612:87;;-1:-1:-1;;;;;;64709:74:0;::::2;::::0;::::2;::::0;;;;;;;::::2;64790:17;::::0;:62:::2;::::0;;;;;-1:-1:-1;;;;;64790:62:0;;::::2;;::::0;::::2;::::0;;;;;;;;;:17;;;::::2;::::0;:36:::2;::::0;:62;;;;;:17:::2;::::0;:62;;;;;;;:17;;:62;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;64859:80;64882:8;64892:14;64908:19;64929:9;64859:22;:80::i;40281:95::-:0;40327:7;40354:14;-1:-1:-1;;;;;40354:14:0;40281:95;:::o;69113:447::-;69172:31;69208:39;69252:35;69297:25;;:::i;:::-;-1:-1:-1;;69297:36:0;;;;;;;;69325:8;69297:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;69297:36:0;-1:-1:-1;69113:447:0:o;55690:340::-;52539:6;;;;;;;52538:7;52530:57;;;;-1:-1:-1;;;52530:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55770:28:::1;::::0;:63:::1;::::0;;;;;55822:10:::1;55770:63;::::0;::::1;::::0;;;55751:16:::1;::::0;-1:-1:-1;;;;;55770:28:0::1;::::0;:51:::1;::::0;:63;;;;;::::1;::::0;;;;;;;;:28;:63;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;55770:63:0;;-1:-1:-1;55878:20:0::1;55770:63:::0;55878:10:::1;:20::i;:::-;55877:21;55869:53;;;::::0;;-1:-1:-1;;;55869:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;55934:44;::::0;;55966:4:::1;55934:44:::0;;55972:5:::1;55934:44;::::0;::::1;::::0;;;-1:-1:-1;;;;;55934:44:0;::::1;::::0;::::1;::::0;;;;;;::::1;55985:17;::::0;:40:::1;::::0;;;;;-1:-1:-1;;;;;55985:40:0;;::::1;;::::0;::::1;::::0;;;:17;;;::::1;::::0;:30:::1;::::0;:40;;;;;::::1;::::0;;;;;;;;:17:::1;::::0;:40;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;;55690:340:0:o;61077:679::-;61156:26;61184:24;61210:27;61239:19;61260:23;61285:32;61362:17;;;;;;;;;-1:-1:-1;;;;;61362:17:0;-1:-1:-1;;;;;61362:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61362:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61362:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61362:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61324:70;;;;;;;;;;;;61420:9;:16;61409:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61409:28:0;;61401:36;;61447:6;61442:310;61463:9;:16;61459:1;:20;61442:310;;;61492:18;61513:9;61523:1;61513:12;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;61553:28:0;;;;;;;:16;:28;;;;;;:37;;;;;;;;;;;;;61513:12;;-1:-1:-1;61535:15:0;:55;61531:90;;;61610:4;61599:5;61605:1;61599:8;;;;;;;;:15;;;:8;;;;;;;;;;;:15;61531:90;61646:7;-1:-1:-1;;;;;61632:21:0;:10;-1:-1:-1;;;;;61632:21:0;;61628:119;;;61683:4;61662:25;;61724:13;61738:1;61724:16;;;;;;;;;;;;;;61694:46;;61628:119;-1:-1:-1;61481:3:0;;61442:310;;;;61077:679;;;;;;;:::o;68043:472::-;45196:21;:19;:21::i;:::-;45188:70;;;;-1:-1:-1;;;45188:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53514:6:::1;68180:55;::::0;::::1;;;68172:131;;;;-1:-1:-1::0;;;68172:131:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68387:8;:41:::0;68313:116:::1;::::0;;68387:41:::1;68313:116:::0;;::::1;::::0;;68387:41;;;::::1;::::0;;::::1;68313:116;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;::::1;68434:8;:76:::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;68043:472::o;52395:90::-;52471:6;;;;;;;;52395:90::o;52155:116::-;45056:20;:18;:20::i;:::-;45048:68;;;;-1:-1:-1;;;45048:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52223:6:::1;:14:::0;;;::::1;::::0;;52253:10:::1;::::0;::::1;::::0;52232:5:::1;::::0;52253:10:::1;52155:116::o:0;57953:503::-;58201:28;;58272:17;;:32;;;;;;;;58009:26;;;;;;;;;;-1:-1:-1;;;;;58201:28:0;;;;58272:17;;:30;;:32;;;;;58146:52;;58272:32;;;;;;;:17;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58272:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58272:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58272:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;58272:32:0;;;;;;;;58321:64;;;;;;;;;;;;;;;;;;58234:70;;-1:-1:-1;58234:70:0;;-1:-1:-1;58234:70:0;;-1:-1:-1;;;;;;58321:53:0;;;;;58234:70;;58321:64;;-1:-1:-1;58321:64:0;;-1:-1:-1;58321:64:0;;;;;-1:-1:-1;58321:64:0;;;;-1:-1:-1;58321:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58321:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58309:76;;58396:29;-1:-1:-1;;;;;58396:44:0;;58441:9;58396:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58396:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58390:61;;57953:503;;;;;;:::o;41231:182::-;40525:17;:15;:17::i;:::-;40517:94;;;;-1:-1:-1;;;40517:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41364:1:::1;41340:14:::0;;41310:57:::1;::::0;-1:-1:-1;;;;;41340:14:0;;::::1;::::0;41310:57:::1;::::0;41364:1;;41310:57:::1;41403:1;41378:27:::0;;;::::1;::::0;;41231:182::o;66774:129::-;66865:8;:33;;;66774:129;:::o;67116:436::-;45196:21;:19;:21::i;:::-;45188:70;;;;-1:-1:-1;;;45188:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53514:6:::1;67245:51;::::0;::::1;;;67237:123;;;;-1:-1:-1::0;;;67237:123:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67436:8;:37:::0;67370:104:::1;::::0;;67436:37:::1;67370:104:::0;;::::1;::::0;;67436:37;;;::::1;::::0;;::::1;67370:104;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;::::1;67479:8;:68:::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;67116:436::o;58881:882::-;52539:6;;;;;;;52538:7;52530:57;;;;-1:-1:-1;;;52530:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59004:15:::1;58986:14;:33;;58978:90;;;;-1:-1:-1::0;;;58978:90:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59091:28;::::0;:63:::1;::::0;;;;;59143:10:::1;59091:63;::::0;::::1;::::0;;;59075:13:::1;::::0;-1:-1:-1;;;;;59091:28:0::1;::::0;:51:::1;::::0;:63;;;;;::::1;::::0;;;;;;;;:28;:63;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;59091:63:0;-1:-1:-1;;;;;59159:23:0;;::::1;;::::0;;;:16:::1;59091:63;59159:23:::0;;;;;;;:32;;::::1;::::0;;;;;;;;;;:49;;;59218;;;;;;;59091:63;;-1:-1:-1;59159:32:0;;:23;;59218:49:::1;::::0;;;;;;;::::1;59275:33;59310:31:::0;59343:27:::1;59374:17;;;;;;;;;-1:-1:-1::0;;;;;59374:17:0::1;-1:-1:-1::0;;;;;59374:30:0::1;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;::::1;::::0;::::1;;::::0;::::1;::::0;::::1;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;::::0;;-1:-1:-1;59374:32:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;::::0;;-1:-1:-1;59374:32:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;::::0;;-1:-1:-1;59374:32:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;::::0;::::1;;59274:132;;;;;;59413:17;59433:96;59472:16;59490:14;59506:13;59521:7;59433:38;:96::i;:::-;59413:116;;59538:12;59534:225;;;59558:53;59585:16;59603:7;59558:26;:53::i;:::-;59622:29;::::0;-1:-1:-1;;;;;59622:29:0;::::1;::::0;::::1;::::0;;;::::1;59664:44;::::0;;59695:5:::1;59664:44:::0;;;::::1;::::0;::::1;::::0;;;-1:-1:-1;;;;;59664:44:0;::::1;::::0;::::1;::::0;;;;;;::::1;59714:17;::::0;:39:::1;::::0;;;;;-1:-1:-1;;;;;59714:39:0;;::::1;;::::0;::::1;::::0;;;:17;;;::::1;::::0;:30:::1;::::0;:39;;;;;::::1;::::0;;;;;;;;:17:::1;::::0;:39;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;52600:1:0::1;;;;;58881:882:::0;;:::o;69889:200::-;43432:21;:19;:21::i;:::-;-1:-1:-1;;;;;43418:35:0;:10;-1:-1:-1;;;;;43418:35:0;;43410:86;;;;-1:-1:-1;;;43410:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70002:6:::1;69997:88;70014:20:::0;;::::1;69997:88;;;70047:32;70066:9;;70076:1;70066:12;;;;;;;;;;;;;-1:-1:-1::0;;;;;70066:12:0::1;70047:18;:32::i;:::-;70036:3;;69997:88;;51120:18:::0;;;;;;;;;:::o;42540:183::-;42019:21;;-1:-1:-1;;;;;42019:21:0;42005:10;:35;41997:87;;;;-1:-1:-1;;;41997:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42648:21:::1;::::0;42620:50:::1;::::0;-1:-1:-1;;;;;42648:21:0::1;42620:27;:50::i;:::-;42681:21;:34:::0;;;::::1;::::0;;42540:183::o;66218:392::-;45196:21;:19;:21::i;:::-;45188:70;;;;-1:-1:-1;;;45188:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53514:6:::1;66339:47;::::0;::::1;;;66331:107;;;;-1:-1:-1::0;;;66331:107:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66506:8;:33:::0;66448:92:::1;::::0;;66506:33:::1;66448:92:::0;;::::1;::::0;;66506:33;;::::1;66448:92;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;::::1;66545:8;:60:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;66218:392::o;65248:220::-;55174:28;;-1:-1:-1;;;;;55174:28:0;55152:10;:51;55144:113;;;;-1:-1:-1;;;55144:113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52539:6:::1;::::0;;;::::1;;;52538:7;52530:57;;;;-1:-1:-1::0;;;52530:57:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65373:45:::2;::::0;;65405:5:::2;65373:45:::0;;;::::2;::::0;::::2;::::0;;;-1:-1:-1;;;;;65373:45:0;::::2;::::0;::::2;::::0;;;;;;::::2;65423:17;::::0;:40:::2;::::0;;;;;-1:-1:-1;;;;;65423:40:0;;::::2;;::::0;::::2;::::0;;;:17;;;::::2;::::0;:30:::2;::::0;:40;;;;;::::2;::::0;;;;;;;;:17:::2;::::0;:40;::::2;;::::0;::::2;;;;::::0;::::2;63620:298:::0;63695:13;63710:15;63727:24;63769:19;63780:7;63769:10;:19::i;:::-;-1:-1:-1;;;;;63806:36:0;;;;;;;:27;:36;;;;;;;;;;63869:19;;:44;;;;;;;63758:30;;-1:-1:-1;63806:36:0;;-1:-1:-1;63869:19:0;;;;:42;;:44;;;;;63806:36;;63869:44;;;;;;:19;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63869:44:0;63620:298;;;;-1:-1:-1;;63620:298:0:o;56701:398::-;56799:28;;:61;;;;;;-1:-1:-1;;;;;56799:61:0;;;;;;;;;56777:4;;56799:28;;;;;:51;;:61;;;;;;;;;;;;;;;:28;:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56799:61:0;;-1:-1:-1;56902:20:0;56799:61;56902:10;:20::i;:::-;56898:50;;;-1:-1:-1;56937:5:0;56930:12;;56898:50;56979:45;;;;;;;;57015:8;56979:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;56954:22;;56979:45;;57005:8;;56979:25;:45::i;:::-;57036:17;;:58;;;;;;-1:-1:-1;;;;;57036:58:0;;;;;;;;;;;;;;;56954:70;;-1:-1:-1;57036:17:0;;;:32;;:58;;;;;;;;;;;;;;;:17;:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57036:58:0;;56701:398;-1:-1:-1;;;56701:398:0:o;49558:122::-;49656:16;;-1:-1:-1;;;;;49656:16:0;49558:122;:::o;65720:209::-;55347:21;;-1:-1:-1;;;;;55347:21:0;55325:10;:44;55317:97;;;;-1:-1:-1;;;55317:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52539:6:::1;::::0;;;::::1;;;52538:7;52530:57;;;;-1:-1:-1::0;;;52530:57:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65858:17:::2;::::0;:66:::2;::::0;;;;;-1:-1:-1;;;;;65858:66:0;;::::2;;::::0;::::2;::::0;;::::2;;::::0;;;;;;:17;;;::::2;::::0;:43:::2;::::0;:66;;;;;:17:::2;::::0;:66;;;;;;;:17;;:66;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;77391:340:::0;77473:22;:20;:22::i;:::-;77442:17;:54;;;;-1:-1:-1;;;;;77442:54:0;;;;;;;;;;77536:24;:22;:24::i;:::-;77501:19;:60;;;;-1:-1:-1;;;;;77501:60:0;;;;;;;;;;77620:34;:32;:34::i;:::-;77566:28;:89;;;;-1:-1:-1;;;;;77566:89:0;;;;;;;;;;77699:26;:24;:26::i;:::-;77660:21;:66;;;;-1:-1:-1;;;;;77660:66:0;;;;;;;;;;77391:340::o;53620:46::-;;;;;;;;;;;;;:::o;51829:111::-;45056:20;:18;:20::i;:::-;45048:68;;;;-1:-1:-1;;;45048:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51895:6:::1;:13:::0;;;::::1;::::0;::::1;::::0;;51924:8:::1;::::0;::::1;::::0;51895:13;;51924:8:::1;51829:111::o:0;49018:394::-;44901:9;:7;:9::i;:::-;44893:84;;;;-1:-1:-1;;;44893:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49192:16:::1;::::0;49131:49:::1;::::0;;;;;;;-1:-1:-1;;;;;49192:16:0;;::::1;::::0;49131:47;::::1;::::0;::::1;::::0;:49:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:47;:49;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;49131:49:0;-1:-1:-1;;;;;49131:78:0::1;;49123:156;;;;-1:-1:-1::0;;;49123:156:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49290:16;:38:::0;;-1:-1:-1;;;;;49290:38:0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;49344:60:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;49018:394:::0;:::o;71715:413::-;71882:19;;71929:48;;;;;;-1:-1:-1;;;;;71929:48:0;;;;;;;;;71817:22;;71882:19;;;;;71817:22;;71882:19;;71929:38;;:48;;;;;;;;;;;;;71882:19;71929:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71929:48:0;;;;;;72007;;;;;-1:-1:-1;;;;;72007:48:0;;;;;;;;;71929;;-1:-1:-1;71982:22:0;;72007:38;;;;;;:48;;;;;71929;;72007;;;;;;:38;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;72007:48:0;;-1:-1:-1;72067:56:0;72086:9;72007:48;72113:9;72067:18;:56::i;:::-;72060:63;;;;;71715:413;;;;;:::o;76042:778::-;76218:19;76229:7;76218:10;:19::i;:::-;76214:43;;;76245:7;;76214:43;-1:-1:-1;;;;;76285:36:0;;76263:19;76285:36;;;:27;:36;;;;;;:94;;76361:17;;76285:66;;76331:19;76285:45;:66::i;:::-;:75;;:94::i;:::-;76263:116;;76386:21;76432:1;76410:19;:23;:139;;;;;76477:72;76529:19;76485:9;:38;;;76477:47;;:51;;:72;;;;:::i;:::-;76437:36;:11;53514:6;76437:15;:36::i;:::-;:112;;76410:139;76386:163;;76558:16;76554:205;;;-1:-1:-1;;;;;76582:26:0;;;;;;:17;:26;;;;;;:33;;;;76611:4;76582:33;;;76626:25;;;76582:26;76626:25;76664:44;;;76695:5;76664:44;;;;;;;;;-1:-1:-1;;;;;76664:44:0;;;;;;;;;;;76714:17;;:39;;;;;;-1:-1:-1;;;;;76714:39:0;;;;;;;;;:17;;;;;:30;;:39;;;;;;;;;;;;;;:17;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;76554:205:0;-1:-1:-1;;;;;;76765:36:0;;;;;;:27;:36;;;;;:50;76042:778;;;;;;:::o;39026:106::-;39114:10;39026:106;:::o;70424:468::-;70494:28;;:61;;;;;;-1:-1:-1;;;;;70494:61:0;;;;;;;;;:28;;;;;:51;;:61;;;;;;;;;;;;;;:28;:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;70494:61:0;;-1:-1:-1;70600:20:0;70494:61;70600:10;:20::i;:::-;70599:21;70591:53;;;;;-1:-1:-1;;;70591:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;70656:43;;;70688:4;70656:43;;;;;;;;;-1:-1:-1;;;;;70656:43:0;;;;;;;;;;;70731:45;;;;;;;;70767:8;70731:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;70706:22;;70731:45;;70757:8;;70731:25;:45::i;:::-;70781:17;;70835:21;;:51;;;;;;-1:-1:-1;;;;;70835:51:0;;;;;;;;;70706:70;;-1:-1:-1;70781:17:0;;;;:27;;70809:8;;70706:70;;70835:21;;:41;;:51;;;;;;;;;;;;;;;:21;:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;70835:51:0;70781:106;;;;;;;;;;;-1:-1:-1;;;;;70781:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;70835:51;;70781:106;;;;;;;-1:-1:-1;70781:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;70424:468:0:o;41530:309::-;-1:-1:-1;;;;;41621:30:0;;41613:95;;;;-1:-1:-1;;;41613:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41754:14;;;41724:63;;-1:-1:-1;;;;;41724:63:0;;;;41754:14;;;41724:63;;;41798:14;:33;;;;-1:-1:-1;;;;;41798:33:0;;;;;;;;;;41530:309::o;70988:393::-;71108:7;71164:54;71183:9;:34;;;71164:54;;:14;:18;;:54;;;;:::i;:::-;71126:34;:9;53514:6;71126:13;:34::i;:::-;:92;71122:131;;-1:-1:-1;71233:14:0;71226:21;;71122:131;71303:34;;71264:74;;;;;;;:34;;:9;;53514:6;;71264:13;:34;:::i;:::-;:38;;:74::i;:::-;71257:81;;70988:393;;;;;;:::o;75159:419::-;-1:-1:-1;;;;;75320:19:0;;;75302:15;75320:19;;;:12;:19;;;;;;;75348:21;75344:34;;75371:7;;;75344:34;-1:-1:-1;;;;;75409:18:0;;75384:22;75409:18;;;:11;:18;;;;;;;75432:38;;;;75477:96;75498:7;75453:17;75409:18;75542:19;75563:9;75477:20;:96::i;76874:110::-;-1:-1:-1;;;;;76952:27:0;76934:4;76952:27;;;:17;:27;;;;;;;;;76874:110::o;46276:116::-;46330:4;46354:30;;;;;;;;;;;;;;;;;;:9;:30::i;:::-;46347:37;;46276:116;:::o;46093:114::-;46146:4;46170:29;;;;;;;;;;;;;;;;;;:9;:29::i;72784:1619::-;72949:4;72960:25;;:::i;:::-;-1:-1:-1;72960:36:0;;;;;;;;72988:8;72960:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;73233:777:0;73254:9;:16;73250:1;:20;73233:777;;;73292:9;73302:1;73292:12;;;;;;;;;;;;;;73283:21;;73324:7;73332:1;73324:10;;;;;;;;;;;;;;73310:24;;73356:7;-1:-1:-1;;;;;73346:17:0;:6;-1:-1:-1;;;;;73346:17:0;;:37;;;;;73367:13;73381:1;73367:16;;;;;;;;;;;;;;73346:37;73342:82;;;73413:4;73392:25;;73342:82;73453:36;:19;73477:11;73453:23;:36::i;:::-;73431:58;;73499:13;73513:1;73499:16;;;;;;;;;;;;;;73495:94;;;73546:36;:19;73570:11;73546:23;:36::i;:::-;73524:58;;73495:94;73597:10;73609:18;73631:35;73650:6;73658:7;73631:18;:35::i;:::-;73596:70;;;;73676:5;73672:333;;;73714:38;:21;73740:11;73714:25;:38::i;:::-;73690:62;;73763:13;73777:1;73763:16;;;;;;;;;;;;;;73759:118;;;73822:47;:30;73857:11;73822:34;:47::i;:::-;73789:80;;73759:118;73672:333;;;73893:15;;73889:116;;73965:16;:24;73982:6;-1:-1:-1;;;;;73965:24:0;-1:-1:-1;;;;;73965:24:0;;;;;;;;;;;;:33;73990:7;-1:-1:-1;;;;;73965:33:0;-1:-1:-1;;;;;73965:33:0;;;;;;;;;;;;73958:40;;;73889:116;-1:-1:-1;;73272:3:0;;73233:777;;;;74051:1;74029:19;:23;:157;;;;;74110:76;74166:19;74118:9;:42;;;74110:51;;:55;;:76;;;;:::i;:::-;74060:46;:21;53514:6;74060:25;:46::i;:::-;:126;;74029:157;74023:375;;;;74201:18;:49;;;;;74249:1;74227:19;:23;74201:49;:192;;;;;74317:76;74373:19;74325:9;:42;;;74317:51;;:55;;:76;;;;:::i;:::-;74258:55;:30;53514:6;74258:34;:55::i;:::-;:135;;74201:192;74016:382;72784:1619;-1:-1:-1;;;;;;;;;;;;;72784:1619:0:o;74624:216::-;74723:6;74718:118;74739:9;:16;74735:1;:20;74718:118;;;74810:1;74768:16;:30;74785:9;74795:1;74785:12;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;74768:30:0;;;;;;;;;;;;;;;;-1:-1:-1;74768:30:0;;;:39;;;;;;;;;;:43;74757:3;;74718:118;;46967:131;47049:16;;:41;;;;;;;;;;;;;;;;;;;;;;;;;47022:7;;-1:-1:-1;;;;;47049:16:0;;:28;;:41;;;;;;;;;;;:16;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47049:41:0;;-1:-1:-1;46967:131:0;:::o;47245:135::-;47329:16;;:43;;;;;;;;;;;;;;;;;;;;;;;;;47302:7;;-1:-1:-1;;;;;47329:16:0;;:28;;:43;;;;;;;;;;;:16;:43;;;;;;;;;;47388:155;47482:16;;:53;;;;;;;;;;;;;;;;;;;;;;;;;47455:7;;-1:-1:-1;;;;;47482:16:0;;:28;;:53;;;;;;;;;;;:16;:53;;;;;;;;;;47551:139;47637:16;;:45;;;;;;;;;;;;;;;;;;;;;;;;;47610:7;;-1:-1:-1;;;;;47637:16:0;;:28;;:45;;;;;;;;;;;:16;:45;;;;;;;;;;45411:185;45499:16;;45453:4;;-1:-1:-1;;;;;45499:16:0;45477:10;:39;;:72;;;45534:15;:13;:15::i;:::-;-1:-1:-1;;;;;45520:29:0;:10;-1:-1:-1;;;;;45520:29:0;;45477:72;:111;;;;45567:21;:19;:21::i;:::-;-1:-1:-1;;;;;45553:35:0;:10;-1:-1:-1;;;;;45553:35:0;;45470:118;;45411:185;:::o;1420:136::-;1478:7;1505:43;1509:1;1512;1505:43;;;;;;;;;;;;;;;;;:3;:43::i;956:181::-;1014:7;1046:5;;;1070:6;;;;1062:46;;;;;-1:-1:-1;;;1062:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;2310:471;2368:7;2613:6;2609:47;;-1:-1:-1;2643:1:0;2636:8;;2609:47;2680:5;;;2684:1;2680;:5;:1;2704:5;;;;;:10;2696:56;;;;-1:-1:-1;;;2696:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3257:132;3315:7;3342:39;3346:1;3349;3342:39;;;;;;;;;;;;;;;;;:3;:39::i;45761:264::-;45878:16;;45823:4;;-1:-1:-1;;;;;45878:16:0;45912:9;:7;:9::i;:::-;:105;;;-1:-1:-1;;;;;;45925:41:0;;;;;;:92;;-1:-1:-1;45970:16:0;;:33;;;;;;;;;;;;;;;;;;;;46007:10;;-1:-1:-1;;;;;45970:16:0;;:27;;45998:4;;45970:33;;;;;;;;;;;;:16;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45970:33:0;-1:-1:-1;;;;;45970:47:0;;45905:112;45761:264;-1:-1:-1;;;45761:264:0:o;1859:192::-;1945:7;1981:12;1973:6;;;;1965:29;;;;-1:-1:-1;;;1965:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2017:5:0;;;1859:192::o;3885:278::-;3971:7;4006:12;3999:5;3991:28;;;;-1:-1:-1;;;3991:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4030:9;4046:1;4042;:5;;;;;;;3885:278;-1:-1:-1;;;;;3885:278:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://e2643d8debe01ae4182e08ac333b74b50c649fb45d8fb6b9be0f1cfff5d8d5ce
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.