Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 996 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Ready For Commit... | 20375058 | 29 hrs ago | IN | 0 ETH | 0.00035302 | ||||
Ready For Commit... | 20362914 | 2 days ago | IN | 0 ETH | 0.00116207 | ||||
Ready For Commit... | 20358791 | 3 days ago | IN | 0 ETH | 0.00043388 | ||||
Ready For Commit... | 20358751 | 3 days ago | IN | 0 ETH | 0.00046904 | ||||
Ready To Sync | 20358282 | 3 days ago | IN | 0 ETH | 0.00016809 | ||||
Ready To Sync | 20351132 | 4 days ago | IN | 0 ETH | 0.00010443 | ||||
Ready To Sync | 20351130 | 4 days ago | IN | 0 ETH | 0.00010217 | ||||
Ready For Commit... | 20325443 | 8 days ago | IN | 0 ETH | 0.00123006 | ||||
Ready For Commit... | 20313295 | 9 days ago | IN | 0 ETH | 0.00288292 | ||||
Ready For Commit... | 20309167 | 10 days ago | IN | 0 ETH | 0.00041169 | ||||
Ready For Commit... | 20309109 | 10 days ago | IN | 0 ETH | 0.00052527 | ||||
Ready To Sync | 20308652 | 10 days ago | IN | 0 ETH | 0.00019591 | ||||
Ready To Sync | 20301504 | 11 days ago | IN | 0 ETH | 0.00016665 | ||||
Ready To Sync | 20301495 | 11 days ago | IN | 0 ETH | 0.0001629 | ||||
Ready For Commit... | 20275828 | 15 days ago | IN | 0 ETH | 0.00182867 | ||||
Ready For Commit... | 20263705 | 16 days ago | IN | 0 ETH | 0.00041873 | ||||
Ready For Commit... | 20259592 | 17 days ago | IN | 0 ETH | 0.00019079 | ||||
Ready For Commit... | 20259534 | 17 days ago | IN | 0 ETH | 0.00017566 | ||||
Ready To Sync | 20259075 | 17 days ago | IN | 0 ETH | 0.00006462 | ||||
Ready To Sync | 20251934 | 18 days ago | IN | 0 ETH | 0.00006326 | ||||
Ready For Commit... | 20226249 | 22 days ago | IN | 0 ETH | 0.00276244 | ||||
Ready For Commit... | 20214127 | 23 days ago | IN | 0 ETH | 0.0009934 | ||||
Ready For Commit... | 20210006 | 24 days ago | IN | 0 ETH | 0.00037023 | ||||
Ready For Commit... | 20209952 | 24 days ago | IN | 0 ETH | 0.00026741 | ||||
Ready To Sync | 20209485 | 24 days ago | IN | 0 ETH | 0.0001021 |
Advanced mode: Intended for advanced users or developers and will display all Internal Transactions including zero value transfers. Name tag integration is not available in advanced view.
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | ||||
---|---|---|---|---|---|---|---|
20381997 | 6 hrs ago | 0 ETH | |||||
20381997 | 6 hrs ago | 0 ETH | |||||
20381969 | 6 hrs ago | 0 ETH | |||||
20381969 | 6 hrs ago | 0 ETH | |||||
20381871 | 7 hrs ago | 0 ETH | |||||
20381871 | 7 hrs ago | 0 ETH | |||||
20381863 | 7 hrs ago | 0 ETH | |||||
20381863 | 7 hrs ago | 0 ETH | |||||
20380925 | 10 hrs ago | 0 ETH | |||||
20380925 | 10 hrs ago | 0 ETH | |||||
20375058 | 29 hrs ago | 0 ETH | |||||
20375058 | 29 hrs ago | 0 ETH | |||||
20375058 | 29 hrs ago | 0 ETH | |||||
20375058 | 29 hrs ago | 0 ETH | |||||
20375058 | 29 hrs ago | 0 ETH | |||||
20373763 | 34 hrs ago | 0 ETH | |||||
20373763 | 34 hrs ago | 0 ETH | |||||
20373195 | 36 hrs ago | 0 ETH | |||||
20373195 | 36 hrs ago | 0 ETH | |||||
20373192 | 36 hrs ago | 0 ETH | |||||
20373192 | 36 hrs ago | 0 ETH | |||||
20367446 | 2 days ago | 0 ETH | |||||
20367446 | 2 days ago | 0 ETH | |||||
20366593 | 2 days ago | 0 ETH | |||||
20366593 | 2 days ago | 0 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
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 | 26 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.