Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Buy Voucher | 14923245 | 934 days ago | IN | 0 ETH | 0.00258849 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
ValidatorShare
Compiler Version
v0.5.17+commit.d19bba13
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-11-12 */ // File: contracts/common/governance/IGovernance.sol pragma solidity ^0.5.2; interface IGovernance { function update(address target, bytes calldata data) external; } // File: contracts/common/governance/Governable.sol pragma solidity ^0.5.2; contract Governable { IGovernance public governance; constructor(address _governance) public { governance = IGovernance(_governance); } modifier onlyGovernance() { _assertGovernance(); _; } function _assertGovernance() private view { require( msg.sender == address(governance), "Only governance contract is authorized" ); } } // File: contracts/root/withdrawManager/IWithdrawManager.sol pragma solidity ^0.5.2; contract IWithdrawManager { function createExitQueue(address token) external; function verifyInclusion( bytes calldata data, uint8 offset, bool verifyTxInclusion ) external view returns (uint256 age); function addExitToQueue( address exitor, address childToken, address rootToken, uint256 exitAmountOrTokenId, bytes32 txHash, bool isRegularExit, uint256 priority ) external; function addInput( uint256 exitId, uint256 age, address utxoOwner, address token ) external; function challengeExit( uint256 exitId, uint256 inputId, bytes calldata challengeData, address adjudicatorPredicate ) external; } // File: contracts/common/Registry.sol pragma solidity ^0.5.2; contract Registry is Governable { // @todo hardcode constants bytes32 private constant WETH_TOKEN = keccak256("wethToken"); bytes32 private constant DEPOSIT_MANAGER = keccak256("depositManager"); bytes32 private constant STAKE_MANAGER = keccak256("stakeManager"); bytes32 private constant VALIDATOR_SHARE = keccak256("validatorShare"); bytes32 private constant WITHDRAW_MANAGER = keccak256("withdrawManager"); bytes32 private constant CHILD_CHAIN = keccak256("childChain"); bytes32 private constant STATE_SENDER = keccak256("stateSender"); bytes32 private constant SLASHING_MANAGER = keccak256("slashingManager"); address public erc20Predicate; address public erc721Predicate; mapping(bytes32 => address) public contractMap; mapping(address => address) public rootToChildToken; mapping(address => address) public childToRootToken; mapping(address => bool) public proofValidatorContracts; mapping(address => bool) public isERC721; enum Type {Invalid, ERC20, ERC721, Custom} struct Predicate { Type _type; } mapping(address => Predicate) public predicates; event TokenMapped(address indexed rootToken, address indexed childToken); event ProofValidatorAdded(address indexed validator, address indexed from); event ProofValidatorRemoved(address indexed validator, address indexed from); event PredicateAdded(address indexed predicate, address indexed from); event PredicateRemoved(address indexed predicate, address indexed from); event ContractMapUpdated(bytes32 indexed key, address indexed previousContract, address indexed newContract); constructor(address _governance) public Governable(_governance) {} function updateContractMap(bytes32 _key, address _address) external onlyGovernance { emit ContractMapUpdated(_key, contractMap[_key], _address); contractMap[_key] = _address; } /** * @dev Map root token to child token * @param _rootToken Token address on the root chain * @param _childToken Token address on the child chain * @param _isERC721 Is the token being mapped ERC721 */ function mapToken( address _rootToken, address _childToken, bool _isERC721 ) external onlyGovernance { require(_rootToken != address(0x0) && _childToken != address(0x0), "INVALID_TOKEN_ADDRESS"); rootToChildToken[_rootToken] = _childToken; childToRootToken[_childToken] = _rootToken; isERC721[_rootToken] = _isERC721; IWithdrawManager(contractMap[WITHDRAW_MANAGER]).createExitQueue(_rootToken); emit TokenMapped(_rootToken, _childToken); } function addErc20Predicate(address predicate) public onlyGovernance { require(predicate != address(0x0), "Can not add null address as predicate"); erc20Predicate = predicate; addPredicate(predicate, Type.ERC20); } function addErc721Predicate(address predicate) public onlyGovernance { erc721Predicate = predicate; addPredicate(predicate, Type.ERC721); } function addPredicate(address predicate, Type _type) public onlyGovernance { require(predicates[predicate]._type == Type.Invalid, "Predicate already added"); predicates[predicate]._type = _type; emit PredicateAdded(predicate, msg.sender); } function removePredicate(address predicate) public onlyGovernance { require(predicates[predicate]._type != Type.Invalid, "Predicate does not exist"); delete predicates[predicate]; emit PredicateRemoved(predicate, msg.sender); } function getValidatorShareAddress() public view returns (address) { return contractMap[VALIDATOR_SHARE]; } function getWethTokenAddress() public view returns (address) { return contractMap[WETH_TOKEN]; } function getDepositManagerAddress() public view returns (address) { return contractMap[DEPOSIT_MANAGER]; } function getStakeManagerAddress() public view returns (address) { return contractMap[STAKE_MANAGER]; } function getSlashingManagerAddress() public view returns (address) { return contractMap[SLASHING_MANAGER]; } function getWithdrawManagerAddress() public view returns (address) { return contractMap[WITHDRAW_MANAGER]; } function getChildChainAndStateSender() public view returns (address, address) { return (contractMap[CHILD_CHAIN], contractMap[STATE_SENDER]); } function isTokenMapped(address _token) public view returns (bool) { return rootToChildToken[_token] != address(0x0); } function isTokenMappedAndIsErc721(address _token) public view returns (bool) { require(isTokenMapped(_token), "TOKEN_NOT_MAPPED"); return isERC721[_token]; } function isTokenMappedAndGetPredicate(address _token) public view returns (address) { if (isTokenMappedAndIsErc721(_token)) { return erc721Predicate; } return erc20Predicate; } function isChildTokenErc721(address childToken) public view returns (bool) { address rootToken = childToRootToken[childToken]; require(rootToken != address(0x0), "Child token is not mapped"); return isERC721[rootToken]; } } // File: openzeppelin-solidity/contracts/token/ERC20/IERC20.sol pragma solidity ^0.5.2; /** * @title ERC20 interface * @dev see https://eips.ethereum.org/EIPS/eip-20 */ interface IERC20 { function transfer(address to, uint256 value) external returns (bool); function approve(address spender, uint256 value) external returns (bool); function transferFrom(address from, address to, uint256 value) external returns (bool); function totalSupply() external view returns (uint256); function balanceOf(address who) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } // File: openzeppelin-solidity/contracts/math/SafeMath.sol pragma solidity ^0.5.2; /** * @title SafeMath * @dev Unsigned math operations with safety checks that revert on error */ library SafeMath { /** * @dev Multiplies two unsigned integers, reverts on 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-solidity/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b); return c; } /** * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a); uint256 c = a - b; return c; } /** * @dev Adds two unsigned integers, reverts on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a); return c; } /** * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo), * reverts when dividing by zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0); return a % b; } } // File: openzeppelin-solidity/contracts/token/ERC20/ERC20.sol pragma solidity ^0.5.2; /** * @title Standard ERC20 token * * @dev Implementation of the basic standard token. * https://eips.ethereum.org/EIPS/eip-20 * Originally based on code by FirstBlood: * https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol * * This implementation emits additional Approval events, allowing applications to reconstruct the allowance status for * all accounts just by listening to said events. Note that this isn't required by the specification, and other * compliant implementations may not do it. */ contract ERC20 is IERC20 { using SafeMath for uint256; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowed; uint256 private _totalSupply; /** * @dev Total number of tokens in existence */ function totalSupply() public view returns (uint256) { return _totalSupply; } /** * @dev Gets the balance of the specified address. * @param owner The address to query the balance of. * @return A uint256 representing the amount owned by the passed address. */ function balanceOf(address owner) public view returns (uint256) { return _balances[owner]; } /** * @dev Function to check the amount of tokens that an owner allowed to a spender. * @param owner address The address which owns the funds. * @param spender address The address which will spend the funds. * @return A uint256 specifying the amount of tokens still available for the spender. */ function allowance(address owner, address spender) public view returns (uint256) { return _allowed[owner][spender]; } /** * @dev Transfer token to a specified address * @param to The address to transfer to. * @param value The amount to be transferred. */ function transfer(address to, uint256 value) public returns (bool) { _transfer(msg.sender, to, value); return true; } /** * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender. * Beware that changing an allowance with this method brings the risk that someone may use both the old * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * @param spender The address which will spend the funds. * @param value The amount of tokens to be spent. */ function approve(address spender, uint256 value) public returns (bool) { _approve(msg.sender, spender, value); return true; } /** * @dev Transfer tokens from one address to another. * Note that while this function emits an Approval event, this is not required as per the specification, * and other compliant implementations may not emit the event. * @param from address The address which you want to send tokens from * @param to address The address which you want to transfer to * @param value uint256 the amount of tokens to be transferred */ function transferFrom(address from, address to, uint256 value) public returns (bool) { _transfer(from, to, value); _approve(from, msg.sender, _allowed[from][msg.sender].sub(value)); return true; } /** * @dev Increase the amount of tokens that an owner allowed to a spender. * approve should be called when _allowed[msg.sender][spender] == 0. To increment * allowed value is better to use this function to avoid 2 calls (and wait until * the first transaction is mined) * From MonolithDAO Token.sol * Emits an Approval event. * @param spender The address which will spend the funds. * @param addedValue The amount of tokens to increase the allowance by. */ function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { _approve(msg.sender, spender, _allowed[msg.sender][spender].add(addedValue)); return true; } /** * @dev Decrease the amount of tokens that an owner allowed to a spender. * approve should be called when _allowed[msg.sender][spender] == 0. To decrement * allowed value is better to use this function to avoid 2 calls (and wait until * the first transaction is mined) * From MonolithDAO Token.sol * Emits an Approval event. * @param spender The address which will spend the funds. * @param subtractedValue The amount of tokens to decrease the allowance by. */ function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) { _approve(msg.sender, spender, _allowed[msg.sender][spender].sub(subtractedValue)); return true; } /** * @dev Transfer token for a specified addresses * @param from The address to transfer from. * @param to The address to transfer to. * @param value The amount to be transferred. */ function _transfer(address from, address to, uint256 value) internal { require(to != address(0)); _balances[from] = _balances[from].sub(value); _balances[to] = _balances[to].add(value); emit Transfer(from, to, value); } /** * @dev Internal function that mints an amount of the token and assigns it to * an account. This encapsulates the modification of balances such that the * proper events are emitted. * @param account The account that will receive the created tokens. * @param value The amount that will be created. */ function _mint(address account, uint256 value) internal { require(account != address(0)); _totalSupply = _totalSupply.add(value); _balances[account] = _balances[account].add(value); emit Transfer(address(0), account, value); } /** * @dev Internal function that burns an amount of the token of a given * account. * @param account The account whose tokens will be burnt. * @param value The amount that will be burnt. */ function _burn(address account, uint256 value) internal { require(account != address(0)); _totalSupply = _totalSupply.sub(value); _balances[account] = _balances[account].sub(value); emit Transfer(account, address(0), value); } /** * @dev Approve an address to spend another addresses' tokens. * @param owner The address that owns the tokens. * @param spender The address that will spend the tokens. * @param value The number of tokens that can be spent. */ function _approve(address owner, address spender, uint256 value) internal { require(spender != address(0)); require(owner != address(0)); _allowed[owner][spender] = value; emit Approval(owner, spender, value); } /** * @dev Internal function that burns an amount of the token of a given * account, deducting from the sender's allowance for said account. Uses the * internal burn function. * Emits an Approval event (reflecting the reduced allowance). * @param account The account whose tokens will be burnt. * @param value The amount that will be burnt. */ function _burnFrom(address account, uint256 value) internal { _burn(account, value); _approve(account, msg.sender, _allowed[account][msg.sender].sub(value)); } } // File: contracts/common/tokens/ERC20NonTradable.sol pragma solidity ^0.5.2; contract ERC20NonTradable is ERC20 { function _approve( address owner, address spender, uint256 value ) internal { revert("disabled"); } } // File: openzeppelin-solidity/contracts/ownership/Ownable.sol pragma solidity ^0.5.2; /** * @title Ownable * @dev The Ownable contract has an owner address, and provides basic authorization control * functions, this simplifies the implementation of "user permissions". */ contract Ownable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ constructor () internal { _owner = msg.sender; emit OwnershipTransferred(address(0), _owner); } /** * @return the address of the owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner()); _; } /** * @return true if `msg.sender` is the owner of the contract. */ function isOwner() public view returns (bool) { return msg.sender == _owner; } /** * @dev Allows the current owner to relinquish control of the contract. * It will not be possible to call the functions with the `onlyOwner` * modifier anymore. * @notice Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0)); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: contracts/staking/StakingInfo.sol pragma solidity ^0.5.2; // dummy interface to avoid cyclic dependency contract IStakeManagerLocal { enum Status {Inactive, Active, Locked, Unstaked} struct Validator { uint256 amount; uint256 reward; uint256 activationEpoch; uint256 deactivationEpoch; uint256 jailTime; address signer; address contractAddress; Status status; } mapping(uint256 => Validator) public validators; bytes32 public accountStateRoot; uint256 public activeAmount; // delegation amount from validator contract uint256 public validatorRewards; function currentValidatorSetTotalStake() public view returns (uint256); // signer to Validator mapping function signerToValidator(address validatorAddress) public view returns (uint256); function isValidator(uint256 validatorId) public view returns (bool); } contract StakingInfo is Ownable { using SafeMath for uint256; mapping(uint256 => uint256) public validatorNonce; /// @dev Emitted when validator stakes in '_stakeFor()' in StakeManager. /// @param signer validator address. /// @param validatorId unique integer to identify a validator. /// @param nonce to synchronize the events in heimdal. /// @param activationEpoch validator's first epoch as proposer. /// @param amount staking amount. /// @param total total staking amount. /// @param signerPubkey public key of the validator event Staked( address indexed signer, uint256 indexed validatorId, uint256 nonce, uint256 indexed activationEpoch, uint256 amount, uint256 total, bytes signerPubkey ); /// @dev Emitted when validator unstakes in 'unstakeClaim()' /// @param user address of the validator. /// @param validatorId unique integer to identify a validator. /// @param amount staking amount. /// @param total total staking amount. event Unstaked( address indexed user, uint256 indexed validatorId, uint256 amount, uint256 total ); /// @dev Emitted when validator unstakes in '_unstake()'. /// @param user address of the validator. /// @param validatorId unique integer to identify a validator. /// @param nonce to synchronize the events in heimdal. /// @param deactivationEpoch last epoch for validator. /// @param amount staking amount. event UnstakeInit( address indexed user, uint256 indexed validatorId, uint256 nonce, uint256 deactivationEpoch, uint256 indexed amount ); /// @dev Emitted when the validator public key is updated in 'updateSigner()'. /// @param validatorId unique integer to identify a validator. /// @param nonce to synchronize the events in heimdal. /// @param oldSigner old address of the validator. /// @param newSigner new address of the validator. /// @param signerPubkey public key of the validator. event SignerChange( uint256 indexed validatorId, uint256 nonce, address indexed oldSigner, address indexed newSigner, bytes signerPubkey ); event Restaked(uint256 indexed validatorId, uint256 amount, uint256 total); event Jailed( uint256 indexed validatorId, uint256 indexed exitEpoch, address indexed signer ); event UnJailed(uint256 indexed validatorId, address indexed signer); event Slashed(uint256 indexed nonce, uint256 indexed amount); event ThresholdChange(uint256 newThreshold, uint256 oldThreshold); event DynastyValueChange(uint256 newDynasty, uint256 oldDynasty); event ProposerBonusChange( uint256 newProposerBonus, uint256 oldProposerBonus ); event RewardUpdate(uint256 newReward, uint256 oldReward); /// @dev Emitted when validator confirms the auction bid and at the time of restaking in confirmAuctionBid() and restake(). /// @param validatorId unique integer to identify a validator. /// @param nonce to synchronize the events in heimdal. /// @param newAmount the updated stake amount. event StakeUpdate( uint256 indexed validatorId, uint256 indexed nonce, uint256 indexed newAmount ); event ClaimRewards( uint256 indexed validatorId, uint256 indexed amount, uint256 indexed totalAmount ); event StartAuction( uint256 indexed validatorId, uint256 indexed amount, uint256 indexed auctionAmount ); event ConfirmAuction( uint256 indexed newValidatorId, uint256 indexed oldValidatorId, uint256 indexed amount ); event TopUpFee(address indexed user, uint256 indexed fee); event ClaimFee(address indexed user, uint256 indexed fee); // Delegator events event ShareMinted( uint256 indexed validatorId, address indexed user, uint256 indexed amount, uint256 tokens ); event ShareBurned( uint256 indexed validatorId, address indexed user, uint256 indexed amount, uint256 tokens ); event DelegatorClaimedRewards( uint256 indexed validatorId, address indexed user, uint256 indexed rewards ); event DelegatorRestaked( uint256 indexed validatorId, address indexed user, uint256 indexed totalStaked ); event DelegatorUnstaked( uint256 indexed validatorId, address indexed user, uint256 amount ); event UpdateCommissionRate( uint256 indexed validatorId, uint256 indexed newCommissionRate, uint256 indexed oldCommissionRate ); Registry public registry; modifier onlyValidatorContract(uint256 validatorId) { address _contract; (, , , , , , _contract, ) = IStakeManagerLocal( registry.getStakeManagerAddress() ) .validators(validatorId); require(_contract == msg.sender, "Invalid sender, not validator"); _; } modifier StakeManagerOrValidatorContract(uint256 validatorId) { address _contract; address _stakeManager = registry.getStakeManagerAddress(); (, , , , , , _contract, ) = IStakeManagerLocal(_stakeManager).validators( validatorId ); require(_contract == msg.sender || _stakeManager == msg.sender, "Invalid sender, not stake manager or validator contract"); _; } modifier onlyStakeManager() { require(registry.getStakeManagerAddress() == msg.sender, "Invalid sender, not stake manager"); _; } modifier onlySlashingManager() { require(registry.getSlashingManagerAddress() == msg.sender, "Invalid sender, not slashing manager"); _; } constructor(address _registry) public { registry = Registry(_registry); } function updateNonce( uint256[] calldata validatorIds, uint256[] calldata nonces ) external onlyOwner { require(validatorIds.length == nonces.length, "args length mismatch"); for (uint256 i = 0; i < validatorIds.length; ++i) { validatorNonce[validatorIds[i]] = nonces[i]; } } function logStaked( address signer, bytes memory signerPubkey, uint256 validatorId, uint256 activationEpoch, uint256 amount, uint256 total ) public onlyStakeManager { validatorNonce[validatorId] = validatorNonce[validatorId].add(1); emit Staked( signer, validatorId, validatorNonce[validatorId], activationEpoch, amount, total, signerPubkey ); } function logUnstaked( address user, uint256 validatorId, uint256 amount, uint256 total ) public onlyStakeManager { emit Unstaked(user, validatorId, amount, total); } function logUnstakeInit( address user, uint256 validatorId, uint256 deactivationEpoch, uint256 amount ) public onlyStakeManager { validatorNonce[validatorId] = validatorNonce[validatorId].add(1); emit UnstakeInit( user, validatorId, validatorNonce[validatorId], deactivationEpoch, amount ); } function logSignerChange( uint256 validatorId, address oldSigner, address newSigner, bytes memory signerPubkey ) public onlyStakeManager { validatorNonce[validatorId] = validatorNonce[validatorId].add(1); emit SignerChange( validatorId, validatorNonce[validatorId], oldSigner, newSigner, signerPubkey ); } function logRestaked(uint256 validatorId, uint256 amount, uint256 total) public onlyStakeManager { emit Restaked(validatorId, amount, total); } function logJailed(uint256 validatorId, uint256 exitEpoch, address signer) public onlyStakeManager { emit Jailed(validatorId, exitEpoch, signer); } function logUnjailed(uint256 validatorId, address signer) public onlyStakeManager { emit UnJailed(validatorId, signer); } function logSlashed(uint256 nonce, uint256 amount) public onlySlashingManager { emit Slashed(nonce, amount); } function logThresholdChange(uint256 newThreshold, uint256 oldThreshold) public onlyStakeManager { emit ThresholdChange(newThreshold, oldThreshold); } function logDynastyValueChange(uint256 newDynasty, uint256 oldDynasty) public onlyStakeManager { emit DynastyValueChange(newDynasty, oldDynasty); } function logProposerBonusChange( uint256 newProposerBonus, uint256 oldProposerBonus ) public onlyStakeManager { emit ProposerBonusChange(newProposerBonus, oldProposerBonus); } function logRewardUpdate(uint256 newReward, uint256 oldReward) public onlyStakeManager { emit RewardUpdate(newReward, oldReward); } function logStakeUpdate(uint256 validatorId) public StakeManagerOrValidatorContract(validatorId) { validatorNonce[validatorId] = validatorNonce[validatorId].add(1); emit StakeUpdate( validatorId, validatorNonce[validatorId], totalValidatorStake(validatorId) ); } function logClaimRewards( uint256 validatorId, uint256 amount, uint256 totalAmount ) public onlyStakeManager { emit ClaimRewards(validatorId, amount, totalAmount); } function logStartAuction( uint256 validatorId, uint256 amount, uint256 auctionAmount ) public onlyStakeManager { emit StartAuction(validatorId, amount, auctionAmount); } function logConfirmAuction( uint256 newValidatorId, uint256 oldValidatorId, uint256 amount ) public onlyStakeManager { emit ConfirmAuction(newValidatorId, oldValidatorId, amount); } function logTopUpFee(address user, uint256 fee) public onlyStakeManager { emit TopUpFee(user, fee); } function logClaimFee(address user, uint256 fee) public onlyStakeManager { emit ClaimFee(user, fee); } function getStakerDetails(uint256 validatorId) public view returns ( uint256 amount, uint256 reward, uint256 activationEpoch, uint256 deactivationEpoch, address signer, uint256 _status ) { IStakeManagerLocal stakeManager = IStakeManagerLocal( registry.getStakeManagerAddress() ); address _contract; IStakeManagerLocal.Status status; ( amount, reward, activationEpoch, deactivationEpoch, , signer, _contract, status ) = stakeManager.validators(validatorId); _status = uint256(status); if (_contract != address(0x0)) { reward += IStakeManagerLocal(_contract).validatorRewards(); } } function totalValidatorStake(uint256 validatorId) public view returns (uint256 validatorStake) { address contractAddress; (validatorStake, , , , , , contractAddress, ) = IStakeManagerLocal( registry.getStakeManagerAddress() ) .validators(validatorId); if (contractAddress != address(0x0)) { validatorStake += IStakeManagerLocal(contractAddress).activeAmount(); } } function getAccountStateRoot() public view returns (bytes32 accountStateRoot) { accountStateRoot = IStakeManagerLocal(registry.getStakeManagerAddress()) .accountStateRoot(); } function getValidatorContractAddress(uint256 validatorId) public view returns (address ValidatorContract) { (, , , , , , ValidatorContract, ) = IStakeManagerLocal( registry.getStakeManagerAddress() ) .validators(validatorId); } // validator Share contract logging func function logShareMinted( uint256 validatorId, address user, uint256 amount, uint256 tokens ) public onlyValidatorContract(validatorId) { emit ShareMinted(validatorId, user, amount, tokens); } function logShareBurned( uint256 validatorId, address user, uint256 amount, uint256 tokens ) public onlyValidatorContract(validatorId) { emit ShareBurned(validatorId, user, amount, tokens); } function logDelegatorClaimRewards( uint256 validatorId, address user, uint256 rewards ) public onlyValidatorContract(validatorId) { emit DelegatorClaimedRewards(validatorId, user, rewards); } function logDelegatorRestaked( uint256 validatorId, address user, uint256 totalStaked ) public onlyValidatorContract(validatorId) { emit DelegatorRestaked(validatorId, user, totalStaked); } function logDelegatorUnstaked(uint256 validatorId, address user, uint256 amount) public onlyValidatorContract(validatorId) { emit DelegatorUnstaked(validatorId, user, amount); } // deprecated function logUpdateCommissionRate( uint256 validatorId, uint256 newCommissionRate, uint256 oldCommissionRate ) public onlyValidatorContract(validatorId) { emit UpdateCommissionRate( validatorId, newCommissionRate, oldCommissionRate ); } } // File: contracts/common/mixin/Initializable.sol pragma solidity ^0.5.2; contract Initializable { bool inited = false; modifier initializer() { require(!inited, "already inited"); inited = true; _; } } // File: contracts/staking/EventsHub.sol pragma solidity ^0.5.2; contract IStakeManagerEventsHub { struct Validator { uint256 amount; uint256 reward; uint256 activationEpoch; uint256 deactivationEpoch; uint256 jailTime; address signer; address contractAddress; } mapping(uint256 => Validator) public validators; } contract EventsHub is Initializable { Registry public registry; modifier onlyValidatorContract(uint256 validatorId) { address _contract; (, , , , , , _contract) = IStakeManagerEventsHub(registry.getStakeManagerAddress()).validators(validatorId); require(_contract == msg.sender, "not validator"); _; } modifier onlyStakeManager() { require(registry.getStakeManagerAddress() == msg.sender, "Invalid sender, not stake manager"); _; } function initialize(Registry _registry) external initializer { registry = _registry; } event ShareBurnedWithId( uint256 indexed validatorId, address indexed user, uint256 indexed amount, uint256 tokens, uint256 nonce ); function logShareBurnedWithId( uint256 validatorId, address user, uint256 amount, uint256 tokens, uint256 nonce ) public onlyValidatorContract(validatorId) { emit ShareBurnedWithId(validatorId, user, amount, tokens, nonce); } event DelegatorUnstakeWithId( uint256 indexed validatorId, address indexed user, uint256 amount, uint256 nonce ); function logDelegatorUnstakedWithId( uint256 validatorId, address user, uint256 amount, uint256 nonce ) public onlyValidatorContract(validatorId) { emit DelegatorUnstakeWithId(validatorId, user, amount, nonce); } event RewardParams( uint256 rewardDecreasePerCheckpoint, uint256 maxRewardedCheckpoints, uint256 checkpointRewardDelta ); function logRewardParams( uint256 rewardDecreasePerCheckpoint, uint256 maxRewardedCheckpoints, uint256 checkpointRewardDelta ) public onlyStakeManager { emit RewardParams(rewardDecreasePerCheckpoint, maxRewardedCheckpoints, checkpointRewardDelta); } event UpdateCommissionRate( uint256 indexed validatorId, uint256 indexed newCommissionRate, uint256 indexed oldCommissionRate ); function logUpdateCommissionRate( uint256 validatorId, uint256 newCommissionRate, uint256 oldCommissionRate ) public onlyStakeManager { emit UpdateCommissionRate( validatorId, newCommissionRate, oldCommissionRate ); } event SharesTransfer( uint256 indexed validatorId, address indexed from, address indexed to, uint256 value ); function logSharesTransfer( uint256 validatorId, address from, address to, uint256 value ) public onlyValidatorContract(validatorId) { emit SharesTransfer(validatorId, from, to, value); } } // File: contracts/common/mixin/Lockable.sol pragma solidity ^0.5.2; contract Lockable { bool public locked; modifier onlyWhenUnlocked() { _assertUnlocked(); _; } function _assertUnlocked() private view { require(!locked, "locked"); } function lock() public { locked = true; } function unlock() public { locked = false; } } // File: contracts/common/mixin/OwnableLockable.sol pragma solidity ^0.5.2; contract OwnableLockable is Lockable, Ownable { function lock() public onlyOwner { super.lock(); } function unlock() public onlyOwner { super.unlock(); } } // File: contracts/staking/stakeManager/IStakeManager.sol pragma solidity 0.5.17; contract IStakeManager { // validator replacement function startAuction( uint256 validatorId, uint256 amount, bool acceptDelegation, bytes calldata signerPubkey ) external; function confirmAuctionBid(uint256 validatorId, uint256 heimdallFee) external; function transferFunds( uint256 validatorId, uint256 amount, address delegator ) external returns (bool); function delegationDeposit( uint256 validatorId, uint256 amount, address delegator ) external returns (bool); function unstake(uint256 validatorId) external; function totalStakedFor(address addr) external view returns (uint256); function stakeFor( address user, uint256 amount, uint256 heimdallFee, bool acceptDelegation, bytes memory signerPubkey ) public; function checkSignatures( uint256 blockInterval, bytes32 voteHash, bytes32 stateRoot, address proposer, uint[3][] calldata sigs ) external returns (uint256); function updateValidatorState(uint256 validatorId, int256 amount) public; function ownerOf(uint256 tokenId) public view returns (address); function slash(bytes calldata slashingInfoList) external returns (uint256); function validatorStake(uint256 validatorId) public view returns (uint256); function epoch() public view returns (uint256); function getRegistry() public view returns (address); function withdrawalDelay() public view returns (uint256); function delegatedAmount(uint256 validatorId) public view returns(uint256); function decreaseValidatorDelegatedAmount(uint256 validatorId, uint256 amount) public; function withdrawDelegatorsReward(uint256 validatorId) public returns(uint256); function delegatorsReward(uint256 validatorId) public view returns(uint256); function dethroneAndStake( address auctionUser, uint256 heimdallFee, uint256 validatorId, uint256 auctionAmount, bool acceptDelegation, bytes calldata signerPubkey ) external; } // File: contracts/staking/validatorShare/IValidatorShare.sol pragma solidity 0.5.17; // note this contract interface is only for stakeManager use contract IValidatorShare { function withdrawRewards() public; function unstakeClaimTokens() public; function getLiquidRewards(address user) public view returns (uint256); function owner() public view returns (address); function restake() public returns(uint256, uint256); function unlock() external; function lock() external; function drain( address token, address payable destination, uint256 amount ) external; function slash(uint256 valPow, uint256 delegatedAmount, uint256 totalAmountToSlash) external returns (uint256); function updateDelegation(bool delegation) external; function migrateOut(address user, uint256 amount) external; function migrateIn(address user, uint256 amount) external; } // File: contracts/staking/validatorShare/ValidatorShare.sol pragma solidity 0.5.17; contract ValidatorShare is IValidatorShare, ERC20NonTradable, OwnableLockable, Initializable { struct DelegatorUnbond { uint256 shares; uint256 withdrawEpoch; } uint256 constant EXCHANGE_RATE_PRECISION = 100; // maximum matic possible, even if rate will be 1 and all matic will be staken in one go, it will result in 10 ^ 58 shares uint256 constant EXCHANGE_RATE_HIGH_PRECISION = 10**29; uint256 constant MAX_COMMISION_RATE = 100; uint256 constant REWARD_PRECISION = 10**25; StakingInfo public stakingLogger; IStakeManager public stakeManager; uint256 public validatorId; uint256 public validatorRewards_deprecated; uint256 public commissionRate_deprecated; uint256 public lastCommissionUpdate_deprecated; uint256 public minAmount; uint256 public totalStake_deprecated; uint256 public rewardPerShare; uint256 public activeAmount; bool public delegation; uint256 public withdrawPool; uint256 public withdrawShares; mapping(address => uint256) amountStaked_deprecated; // deprecated, keep for foundation delegators mapping(address => DelegatorUnbond) public unbonds; mapping(address => uint256) public initalRewardPerShare; mapping(address => uint256) public unbondNonces; mapping(address => mapping(uint256 => DelegatorUnbond)) public unbonds_new; EventsHub public eventsHub; // onlyOwner will prevent this contract from initializing, since it's owner is going to be 0x0 address function initialize( uint256 _validatorId, address _stakingLogger, address _stakeManager ) external initializer { validatorId = _validatorId; stakingLogger = StakingInfo(_stakingLogger); stakeManager = IStakeManager(_stakeManager); _transferOwnership(_stakeManager); _getOrCacheEventsHub(); minAmount = 10**18; delegation = true; } /** Public View Methods */ function exchangeRate() public view returns (uint256) { uint256 totalShares = totalSupply(); uint256 precision = _getRatePrecision(); return totalShares == 0 ? precision : stakeManager.delegatedAmount(validatorId).mul(precision).div(totalShares); } function getTotalStake(address user) public view returns (uint256, uint256) { uint256 shares = balanceOf(user); uint256 rate = exchangeRate(); if (shares == 0) { return (0, rate); } return (rate.mul(shares).div(_getRatePrecision()), rate); } function withdrawExchangeRate() public view returns (uint256) { uint256 precision = _getRatePrecision(); if (validatorId < 8) { // fix of potentially broken withdrawals for future unbonding // foundation validators have no slashing enabled and thus we can return default exchange rate // because without slashing rate will stay constant return precision; } uint256 _withdrawShares = withdrawShares; return _withdrawShares == 0 ? precision : withdrawPool.mul(precision).div(_withdrawShares); } function getLiquidRewards(address user) public view returns (uint256) { return _calculateReward(user, getRewardPerShare()); } function getRewardPerShare() public view returns (uint256) { return _calculateRewardPerShareWithRewards(stakeManager.delegatorsReward(validatorId)); } /** Public Methods */ function buyVoucher(uint256 _amount, uint256 _minSharesToMint) public returns(uint256 amountToDeposit) { _withdrawAndTransferReward(msg.sender); amountToDeposit = _buyShares(_amount, _minSharesToMint, msg.sender); require(stakeManager.delegationDeposit(validatorId, amountToDeposit, msg.sender), "deposit failed"); return amountToDeposit; } function restake() public returns(uint256, uint256) { address user = msg.sender; uint256 liquidReward = _withdrawReward(user); uint256 amountRestaked; require(liquidReward >= minAmount, "Too small rewards to restake"); if (liquidReward != 0) { amountRestaked = _buyShares(liquidReward, 0, user); if (liquidReward > amountRestaked) { // return change to the user require( stakeManager.transferFunds(validatorId, liquidReward - amountRestaked, user), "Insufficent rewards" ); stakingLogger.logDelegatorClaimRewards(validatorId, user, liquidReward - amountRestaked); } (uint256 totalStaked, ) = getTotalStake(user); stakingLogger.logDelegatorRestaked(validatorId, user, totalStaked); } return (amountRestaked, liquidReward); } function sellVoucher(uint256 claimAmount, uint256 maximumSharesToBurn) public { (uint256 shares, uint256 _withdrawPoolShare) = _sellVoucher(claimAmount, maximumSharesToBurn); DelegatorUnbond memory unbond = unbonds[msg.sender]; unbond.shares = unbond.shares.add(_withdrawPoolShare); // refresh undond period unbond.withdrawEpoch = stakeManager.epoch(); unbonds[msg.sender] = unbond; StakingInfo logger = stakingLogger; logger.logShareBurned(validatorId, msg.sender, claimAmount, shares); logger.logStakeUpdate(validatorId); } function withdrawRewards() public { uint256 rewards = _withdrawAndTransferReward(msg.sender); require(rewards >= minAmount, "Too small rewards amount"); } function migrateOut(address user, uint256 amount) external onlyOwner { _withdrawAndTransferReward(user); (uint256 totalStaked, uint256 rate) = getTotalStake(user); require(totalStaked >= amount, "Migrating too much"); uint256 precision = _getRatePrecision(); uint256 shares = amount.mul(precision).div(rate); _burn(user, shares); stakeManager.updateValidatorState(validatorId, -int256(amount)); activeAmount = activeAmount.sub(amount); stakingLogger.logShareBurned(validatorId, user, amount, shares); stakingLogger.logStakeUpdate(validatorId); stakingLogger.logDelegatorUnstaked(validatorId, user, amount); } function migrateIn(address user, uint256 amount) external onlyOwner { _withdrawAndTransferReward(user); _buyShares(amount, 0, user); } function unstakeClaimTokens() public { DelegatorUnbond memory unbond = unbonds[msg.sender]; uint256 amount = _unstakeClaimTokens(unbond); delete unbonds[msg.sender]; stakingLogger.logDelegatorUnstaked(validatorId, msg.sender, amount); } function slash( uint256 validatorStake, uint256 delegatedAmount, uint256 totalAmountToSlash ) external onlyOwner returns (uint256) { uint256 _withdrawPool = withdrawPool; uint256 delegationAmount = delegatedAmount.add(_withdrawPool); if (delegationAmount == 0) { return 0; } // total amount to be slashed from delegation pool (active + inactive) uint256 _amountToSlash = delegationAmount.mul(totalAmountToSlash).div(validatorStake.add(delegationAmount)); uint256 _amountToSlashWithdrawalPool = _withdrawPool.mul(_amountToSlash).div(delegationAmount); // slash inactive pool uint256 stakeSlashed = _amountToSlash.sub(_amountToSlashWithdrawalPool); stakeManager.decreaseValidatorDelegatedAmount(validatorId, stakeSlashed); activeAmount = activeAmount.sub(stakeSlashed); withdrawPool = withdrawPool.sub(_amountToSlashWithdrawalPool); return _amountToSlash; } function updateDelegation(bool _delegation) external onlyOwner { delegation = _delegation; } function drain( address token, address payable destination, uint256 amount ) external onlyOwner { if (token == address(0x0)) { destination.transfer(amount); } else { require(ERC20(token).transfer(destination, amount), "Drain failed"); } } /** New shares exit API */ function sellVoucher_new(uint256 claimAmount, uint256 maximumSharesToBurn) public { (uint256 shares, uint256 _withdrawPoolShare) = _sellVoucher(claimAmount, maximumSharesToBurn); uint256 unbondNonce = unbondNonces[msg.sender].add(1); DelegatorUnbond memory unbond = DelegatorUnbond({ shares: _withdrawPoolShare, withdrawEpoch: stakeManager.epoch() }); unbonds_new[msg.sender][unbondNonce] = unbond; unbondNonces[msg.sender] = unbondNonce; _getOrCacheEventsHub().logShareBurnedWithId(validatorId, msg.sender, claimAmount, shares, unbondNonce); stakingLogger.logStakeUpdate(validatorId); } function unstakeClaimTokens_new(uint256 unbondNonce) public { DelegatorUnbond memory unbond = unbonds_new[msg.sender][unbondNonce]; uint256 amount = _unstakeClaimTokens(unbond); delete unbonds_new[msg.sender][unbondNonce]; _getOrCacheEventsHub().logDelegatorUnstakedWithId(validatorId, msg.sender, amount, unbondNonce); } /** Private Methods */ function _getOrCacheEventsHub() private returns(EventsHub) { EventsHub _eventsHub = eventsHub; if (_eventsHub == EventsHub(0x0)) { _eventsHub = EventsHub(Registry(stakeManager.getRegistry()).contractMap(keccak256("eventsHub"))); eventsHub = _eventsHub; } return _eventsHub; } function _sellVoucher(uint256 claimAmount, uint256 maximumSharesToBurn) private returns(uint256, uint256) { // first get how much staked in total and compare to target unstake amount (uint256 totalStaked, uint256 rate) = getTotalStake(msg.sender); require(totalStaked != 0 && totalStaked >= claimAmount, "Too much requested"); // convert requested amount back to shares uint256 precision = _getRatePrecision(); uint256 shares = claimAmount.mul(precision).div(rate); require(shares <= maximumSharesToBurn, "too much slippage"); _withdrawAndTransferReward(msg.sender); _burn(msg.sender, shares); stakeManager.updateValidatorState(validatorId, -int256(claimAmount)); activeAmount = activeAmount.sub(claimAmount); uint256 _withdrawPoolShare = claimAmount.mul(precision).div(withdrawExchangeRate()); withdrawPool = withdrawPool.add(claimAmount); withdrawShares = withdrawShares.add(_withdrawPoolShare); return (shares, _withdrawPoolShare); } function _unstakeClaimTokens(DelegatorUnbond memory unbond) private returns(uint256) { uint256 shares = unbond.shares; require( unbond.withdrawEpoch.add(stakeManager.withdrawalDelay()) <= stakeManager.epoch() && shares > 0, "Incomplete withdrawal period" ); uint256 _amount = withdrawExchangeRate().mul(shares).div(_getRatePrecision()); withdrawShares = withdrawShares.sub(shares); withdrawPool = withdrawPool.sub(_amount); require(stakeManager.transferFunds(validatorId, _amount, msg.sender), "Insufficent rewards"); return _amount; } function _getRatePrecision() private view returns (uint256) { // if foundation validator, use old precision if (validatorId < 8) { return EXCHANGE_RATE_PRECISION; } return EXCHANGE_RATE_HIGH_PRECISION; } function _calculateRewardPerShareWithRewards(uint256 accumulatedReward) private view returns (uint256) { uint256 _rewardPerShare = rewardPerShare; if (accumulatedReward != 0) { uint256 totalShares = totalSupply(); if (totalShares != 0) { _rewardPerShare = _rewardPerShare.add(accumulatedReward.mul(REWARD_PRECISION).div(totalShares)); } } return _rewardPerShare; } function _calculateReward(address user, uint256 _rewardPerShare) private view returns (uint256) { uint256 shares = balanceOf(user); if (shares == 0) { return 0; } uint256 _initialRewardPerShare = initalRewardPerShare[user]; if (_initialRewardPerShare == _rewardPerShare) { return 0; } return _rewardPerShare.sub(_initialRewardPerShare).mul(shares).div(REWARD_PRECISION); } function _withdrawReward(address user) private returns (uint256) { uint256 _rewardPerShare = _calculateRewardPerShareWithRewards( stakeManager.withdrawDelegatorsReward(validatorId) ); uint256 liquidRewards = _calculateReward(user, _rewardPerShare); rewardPerShare = _rewardPerShare; initalRewardPerShare[user] = _rewardPerShare; return liquidRewards; } function _withdrawAndTransferReward(address user) private returns (uint256) { uint256 liquidRewards = _withdrawReward(user); if (liquidRewards != 0) { require(stakeManager.transferFunds(validatorId, liquidRewards, user), "Insufficent rewards"); stakingLogger.logDelegatorClaimRewards(validatorId, user, liquidRewards); } return liquidRewards; } function _buyShares( uint256 _amount, uint256 _minSharesToMint, address user ) private onlyWhenUnlocked returns (uint256) { require(delegation, "Delegation is disabled"); uint256 rate = exchangeRate(); uint256 precision = _getRatePrecision(); uint256 shares = _amount.mul(precision).div(rate); require(shares >= _minSharesToMint, "Too much slippage"); require(unbonds[user].shares == 0, "Ongoing exit"); _mint(user, shares); // clamp amount of tokens in case resulted shares requires less tokens than anticipated _amount = rate.mul(shares).div(precision); stakeManager.updateValidatorState(validatorId, int256(_amount)); activeAmount = activeAmount.add(_amount); StakingInfo logger = stakingLogger; logger.logShareMinted(validatorId, user, _amount, shares); logger.logStakeUpdate(validatorId); return _amount; } function _transfer( address from, address to, uint256 value ) internal { // get rewards for recipient _withdrawAndTransferReward(to); // convert rewards to shares _withdrawAndTransferReward(from); // move shares to recipient super._transfer(from, to, value); _getOrCacheEventsHub().logSharesTransfer(validatorId, from, to, value); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":true,"inputs":[],"name":"activeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minSharesToMint","type":"uint256"}],"name":"buyVoucher","outputs":[{"internalType":"uint256","name":"amountToDeposit","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"commissionRate_deprecated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"delegation","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address payable","name":"destination","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"drain","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"eventsHub","outputs":[{"internalType":"contract EventsHub","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"exchangeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getLiquidRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getRewardPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getTotalStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"initalRewardPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_validatorId","type":"uint256"},{"internalType":"address","name":"_stakingLogger","type":"address"},{"internalType":"address","name":"_stakeManager","type":"address"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastCommissionUpdate_deprecated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"lock","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"migrateIn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"migrateOut","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"minAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"restake","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"rewardPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"claimAmount","type":"uint256"},{"internalType":"uint256","name":"maximumSharesToBurn","type":"uint256"}],"name":"sellVoucher","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"claimAmount","type":"uint256"},{"internalType":"uint256","name":"maximumSharesToBurn","type":"uint256"}],"name":"sellVoucher_new","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"validatorStake","type":"uint256"},{"internalType":"uint256","name":"delegatedAmount","type":"uint256"},{"internalType":"uint256","name":"totalAmountToSlash","type":"uint256"}],"name":"slash","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"stakeManager","outputs":[{"internalType":"contract IStakeManager","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"stakingLogger","outputs":[{"internalType":"contract StakingInfo","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalStake_deprecated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"unbondNonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"unbonds","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"withdrawEpoch","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"unbonds_new","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"withdrawEpoch","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unlock","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unstakeClaimTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"unbondNonce","type":"uint256"}],"name":"unstakeClaimTokens_new","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bool","name":"_delegation","type":"bool"}],"name":"updateDelegation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"validatorId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"validatorRewards_deprecated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"withdrawExchangeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"withdrawPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdrawRewards","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"withdrawShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
6080604081905260038054610100600160b01b03191661010033810291909117918290556001600160a01b03910416906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3612ba5806100666000396000f3fe608060405234801561001057600080fd5b50600436106102f15760003560e01c80637542ff951161019d578063a9059cbb116100e9578063cf309012116100a2578063e4cd1aec1161007c578063e4cd1aec14610794578063e97fddc2146107ba578063f2fde38b146107d7578063f83d08ba146107fd576102f1565b8063cf30901214610756578063dd62ed3e1461075e578063df5cf7231461078c576102f1565b8063a9059cbb1461068d578063abf59fc9146106b9578063b4988fd0146106ef578063bfb18f2914610723578063c7b8981c1461072b578063c83ec04d14610733576102f1565b80638d16a14a116101565780639b2cb5d8116101305780639b2cb5d814610625578063a0c1ca341461062d578063a457c2d714610659578063a69df4b514610685576102f1565b80638d16a14a1461060d5780638da5cb5b146106155780638f32d59b1461061d576102f1565b80637542ff95146105a2578063795be587146105aa5780637ba8c820146105d6578063883b455f146105f55780638ccdd289146105fd5780638d086da414610605576102f1565b80633d94eb051161025c578063653ec134116102155780636cbb6050116101ef5780636cbb60501461051f5780636e7ce5911461054857806370a0823114610574578063715018a61461059a576102f1565b8063653ec134146104b0578063676e5550146104d65780636ab15071146104fc576102f1565b80633d94eb0514610464578063446a2ec8146104885780634f91440d146104905780635c42c733146104985780635c5f7dae146104a05780635f0c80cc146104a8576102f1565b806323b872dd116102ae57806323b872dd146103c45780633046c204146103fa578063395093511461042057806339c31e931461044c5780633a09bf44146104545780633ba0b9a91461045c576102f1565b8063029d3040146102f6578063095ea7b31461031b57806318160ddd1461035b5780631bf494a7146103755780631e7ff8f61461037d57806323440679146103bc575b600080fd5b6103196004803603604081101561030c57600080fd5b5080359060200135610805565b005b6103476004803603604081101561033157600080fd5b506001600160a01b0381351690602001356109d4565b604080519115158252519081900360200190f35b6103636109eb565b60408051918252519081900360200190f35b6103636109f2565b6103a36004803603602081101561039357600080fd5b50356001600160a01b0316610a7e565b6040805192835260208301919091528051918290030190f35b610363610ade565b610347600480360360608110156103da57600080fd5b506001600160a01b03813581169160208101359091169060400135610ae4565b6103636004803603602081101561041057600080fd5b50356001600160a01b0316610b3c565b6103476004803603604081101561043657600080fd5b506001600160a01b038135169060200135610b4e565b610363610b8a565b610363610b90565b610363610b96565b61046c610c53565b604080516001600160a01b039092168252519081900360200190f35b610363610c62565b6103a3610c68565b610363610ec9565b610363610ecf565b610363610ed5565b6103a3600480360360208110156104c657600080fd5b50356001600160a01b0316610edb565b610363600480360360208110156104ec57600080fd5b50356001600160a01b0316610ef4565b6103636004803603604081101561051257600080fd5b5080359060200135610f07565b6103636004803603606081101561053557600080fd5b5080359060208101359060400135610fed565b6103196004803603604081101561055e57600080fd5b506001600160a01b038135169060200135611124565b6103636004803603602081101561058a57600080fd5b50356001600160a01b031661138e565b6103196113a9565b61046c61140a565b6103a3600480360360408110156105c057600080fd5b506001600160a01b038135169060200135611419565b610319600480360360208110156105ec57600080fd5b5035151561143d565b61046c611461565b610363611470565b610363611476565b61031961147c565b61046c611547565b61034761155b565b610363611571565b6103196004803603604081101561064357600080fd5b506001600160a01b038135169060200135611577565b6103476004803603604081101561066f57600080fd5b506001600160a01b0381351690602001356115a3565b6103196115df565b610347600480360360408110156106a357600080fd5b506001600160a01b0381351690602001356115fa565b610319600480360360608110156106cf57600080fd5b506001600160a01b03813581169160208101359091169060400135611607565b6103196004803603606081101561070557600080fd5b508035906001600160a01b036020820135811691604001351661172e565b6103636117f6565b61031961183d565b6103196004803603604081101561074957600080fd5b50803590602001356118a4565b610347611a7d565b6103636004803603604081101561077457600080fd5b506001600160a01b0381358116916020013516611a86565b610347611ab1565b610363600480360360208110156107aa57600080fd5b50356001600160a01b0316611aba565b610319600480360360208110156107d057600080fd5b5035611acc565b610319600480360360208110156107ed57600080fd5b50356001600160a01b0316611bba565b610319611bd4565b6000806108128484611bed565b9150915061081e612b56565b5033600090815260126020908152604091829020825180840190935280548084526001909101549183019190915261085c908363ffffffff611db716565b81526005546040805163900cf0cf60e01b815290516001600160a01b039092169163900cf0cf91600480820192602092909190829003018186803b1580156108a357600080fd5b505afa1580156108b7573d6000803e3d6000fd5b505050506040513d60208110156108cd57600080fd5b505160208281019182523360008181526012909252604080832085518155935160019094019390935560048054600654855163f1382b5360e01b8152928301526024820192909252604481018990526064810187905292516001600160a01b0390911692839263f1382b539260848084019382900301818387803b15801561095457600080fd5b505af1158015610968573d6000803e3d6000fd5b50505050806001600160a01b031663532e19a96006546040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156109b457600080fd5b505af11580156109c8573d6000803e3d6000fd5b50505050505050505050565b60006109e1338484611dc9565b5060015b92915050565b6002545b90565b6005546006546040805163072c21ef60e31b8152600481019290925251600092610a79926001600160a01b03909116916339610f7891602480820192602092909190829003018186803b158015610a4857600080fd5b505afa158015610a5c573d6000803e3d6000fd5b505050506040513d6020811015610a7257600080fd5b5051611e01565b905090565b6000806000610a8c8461138e565b90506000610a98610b96565b905081610aac57600093509150610ad99050565b610ad3610ab7611e58565b610ac7838563ffffffff611e7f16565b9063ffffffff611ea616565b93509150505b915091565b60095481565b6000610af1848484611ec8565b6001600160a01b038416600090815260016020908152604080832033808552925290912054610b31918691610b2c908663ffffffff611f5316565b611dc9565b5060015b9392505050565b60146020526000908152604090205481565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916109e1918590610b2c908663ffffffff611db716565b60075481565b600d5481565b600080610ba16109eb565b90506000610bad611e58565b90508115610c4a5760055460065460408051637f4b432360e01b8152600481019290925251610c45928592610ac79286926001600160a01b031691637f4b4323916024808301926020929190829003018186803b158015610c0d57600080fd5b505afa158015610c21573d6000803e3d6000fd5b505050506040513d6020811015610c3757600080fd5b50519063ffffffff611e7f16565b610c4c565b805b9250505090565b6004546001600160a01b031681565b600c5481565b6000803381610c7682611f68565b90506000600a54821015610cd1576040805162461bcd60e51b815260206004820152601c60248201527f546f6f20736d616c6c207265776172647320746f2072657374616b6500000000604482015290519081900360640190fd5b8115610ec057610ce382600085612016565b905080821115610e39576005546006546040805163bc8756a960e01b8152600481019290925283850360248301526001600160a01b038681166044840152905192169163bc8756a9916064808201926020929091908290030181600087803b158015610d4e57600080fd5b505af1158015610d62573d6000803e3d6000fd5b505050506040513d6020811015610d7857600080fd5b5051610dc1576040805162461bcd60e51b8152602060048201526013602482015272496e737566666963656e74207265776172647360681b604482015290519081900360640190fd5b600480546006546040805163b7721d2d60e01b8152938401919091526001600160a01b0386811660248501528486036044850152905191169163b7721d2d91606480830192600092919082900301818387803b158015610e2057600080fd5b505af1158015610e34573d6000803e3d6000fd5b505050505b6000610e4484610a7e565b506004805460065460408051637f88a95760e01b8152938401919091526001600160a01b0388811660248501526044840185905290519394501691637f88a9579160648082019260009290919082900301818387803b158015610ea657600080fd5b505af1158015610eba573d6000803e3d6000fd5b50505050505b93509150509091565b600f5481565b60065481565b600b5481565b6012602052600090815260409020805460019091015482565b60006109e582610f026109f2565b6122d5565b6000610f1233612356565b50610f1e838333612016565b60055460065460408051636901b25360e01b8152600481019290925260248201849052336044830152519293506001600160a01b0390911691636901b253916064808201926020929091908290030181600087803b158015610f7f57600080fd5b505af1158015610f93573d6000803e3d6000fd5b505050506040513d6020811015610fa957600080fd5b50516109e5576040805162461bcd60e51b815260206004820152600e60248201526d19195c1bdcda5d0819985a5b195960921b604482015290519081900360640190fd5b6000610ff761155b565b61100057600080fd5b600f546000611015858363ffffffff611db716565b90508061102757600092505050610b35565b600061104c61103c888463ffffffff611db716565b610ac7848863ffffffff611e7f16565b9050600061106483610ac7868563ffffffff611e7f16565b90506000611078838363ffffffff611f5316565b6005546006546040805163858a7c0360e01b8152600481019290925260248201849052519293506001600160a01b039091169163858a7c039160448082019260009290919082900301818387803b1580156110d257600080fd5b505af11580156110e6573d6000803e3d6000fd5b5050600d546110fe925090508263ffffffff611f5316565b600d55600f54611114908363ffffffff611f5316565b600f555090979650505050505050565b61112c61155b565b61113557600080fd5b61113e82612356565b5060008061114b84610a7e565b9150915082821015611199576040805162461bcd60e51b815260206004820152601260248201527109ad2cee4c2e8d2dcce40e8dede40daeac6d60731b604482015290519081900360640190fd5b60006111a3611e58565b905060006111bb83610ac7878563ffffffff611e7f16565b90506111c786826124ba565b60055460065460408051629ff11560e81b815260048101929092526000888103602484015290516001600160a01b0390931692639ff1150092604480820193929182900301818387803b15801561121d57600080fd5b505af1158015611231573d6000803e3d6000fd5b5050600d54611249925090508663ffffffff611f5316565b600d55600480546006546040805163f1382b5360e01b8152938401919091526001600160a01b0389811660248501526044840189905260648401859052905191169163f1382b5391608480830192600092919082900301818387803b1580156112b157600080fd5b505af11580156112c5573d6000803e3d6000fd5b5050600480546006546040805163532e19a960e01b815293840191909152516001600160a01b03909116935063532e19a99250602480830192600092919082900301818387803b15801561131857600080fd5b505af115801561132c573d6000803e3d6000fd5b5050600480546006546040805163302df4df60e11b8152938401919091526001600160a01b038b81166024850152604484018b905290519116935063605be9be9250606480830192600092919082900301818387803b1580156109b457600080fd5b6001600160a01b031660009081526020819052604090205490565b6113b161155b565b6113ba57600080fd5b60035460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360038054610100600160a81b0319169055565b6005546001600160a01b031681565b60156020908152600092835260408084209091529082529020805460019091015482565b61144561155b565b61144e57600080fd5b600e805460ff1916911515919091179055565b6016546001600160a01b031681565b60085481565b60105481565b611484612b56565b503360009081526012602090815260408083208151808301909252805482526001015491810191909152906114b882612561565b3360008181526012602052604080822082815560010182905560048054600654835163302df4df60e11b81529283015260248201949094526044810185905290519394506001600160a01b039092169263605be9be92606480820193929182900301818387803b15801561152b57600080fd5b505af115801561153f573d6000803e3d6000fd5b505050505050565b60035461010090046001600160a01b031690565b60035461010090046001600160a01b0316331490565b600a5481565b61157f61155b565b61158857600080fd5b61159182612356565b5061159e81600084612016565b505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916109e1918590610b2c908663ffffffff611f5316565b6115e761155b565b6115f057600080fd5b6115f86127d0565b565b60006109e1338484611ec8565b61160f61155b565b61161857600080fd5b6001600160a01b038316611662576040516001600160a01b0383169082156108fc029083906000818181858888f1935050505015801561165c573d6000803e3d6000fd5b5061159e565b826001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156116c257600080fd5b505af11580156116d6573d6000803e3d6000fd5b505050506040513d60208110156116ec57600080fd5b505161159e576040805162461bcd60e51b815260206004820152600c60248201526b111c985a5b8819985a5b195960a21b604482015290519081900360640190fd5b600354600160a81b900460ff161561177e576040805162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481a5b9a5d195960921b604482015290519081900360640190fd5b6003805460ff60a81b1916600160a81b1790556006839055600480546001600160a01b038085166001600160a01b03199283161790925560058054928416929091169190911790556117cf816127dc565b6117d7612856565b5050670de0b6b3a7640000600a555050600e805460ff19166001179055565b600080611801611e58565b9050600860065410156118155790506109ef565b601054801561183757610c4581610ac784600f54611e7f90919063ffffffff16565b50919050565b600061184833612356565b9050600a548110156118a1576040805162461bcd60e51b815260206004820152601860248201527f546f6f20736d616c6c207265776172647320616d6f756e740000000000000000604482015290519081900360640190fd5b50565b6000806118b18484611bed565b33600090815260146020526040812054929450909250906118d990600163ffffffff611db716565b90506118e3612b56565b6040518060400160405280848152602001600560009054906101000a90046001600160a01b03166001600160a01b031663900cf0cf6040518163ffffffff1660e01b815260040160206040518083038186803b15801561194257600080fd5b505afa158015611956573d6000803e3d6000fd5b505050506040513d602081101561196c57600080fd5b5051905233600081815260156020908152604080832087845282528083208551815585830151600190910155928252601490522083905590506119ad612856565b60065460408051632a9b5b4160e11b81526004810192909252336024830152604482018990526064820187905260848201859052516001600160a01b039290921691635536b6829160a48082019260009290919082900301818387803b158015611a1657600080fd5b505af1158015611a2a573d6000803e3d6000fd5b5050600480546006546040805163532e19a960e01b815293840191909152516001600160a01b03909116935063532e19a99250602480830192600092919082900301818387803b1580156109b457600080fd5b60035460ff1681565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600e5460ff1681565b60136020526000908152604090205481565b611ad4612b56565b503360009081526015602090815260408083208484528252808320815180830190925280548252600101549181019190915290611b1082612561565b3360009081526015602090815260408083208784529091528120818155600101559050611b3b612856565b60065460408051636e699d8760e01b815260048101929092523360248301526044820184905260648201869052516001600160a01b039290921691636e699d879160848082019260009290919082900301818387803b158015611b9d57600080fd5b505af1158015611bb1573d6000803e3d6000fd5b50505050505050565b611bc261155b565b611bcb57600080fd5b6118a1816127dc565b611bdc61155b565b611be557600080fd5b6115f8612993565b600080600080611bfc33610a7e565b9150915081600014158015611c115750858210155b611c57576040805162461bcd60e51b8152602060048201526012602482015271151bdbc81b5d58da081c995c5d595cdd195960721b604482015290519081900360640190fd5b6000611c61611e58565b90506000611c7983610ac78a8563ffffffff611e7f16565b905086811115611cc4576040805162461bcd60e51b8152602060048201526011602482015270746f6f206d75636820736c69707061676560781b604482015290519081900360640190fd5b611ccd33612356565b50611cd833826124ba565b60055460065460408051629ff11560e81b8152600481019290925260008b8103602484015290516001600160a01b0390931692639ff1150092604480820193929182900301818387803b158015611d2e57600080fd5b505af1158015611d42573d6000803e3d6000fd5b5050600d54611d5a925090508963ffffffff611f5316565b600d556000611d7a611d6a6117f6565b610ac78b8663ffffffff611e7f16565b600f54909150611d90908a63ffffffff611db716565b600f55601054611da6908263ffffffff611db716565b601055909890975095505050505050565b600082820183811015610b3557600080fd5b6040805162461bcd60e51b8152602060048201526008602482015267191a5cd8589b195960c21b604482015290519081900360640190fd5b600c5460009082156109e5576000611e176109eb565b90508015611e5157611e4e611e4182610ac7876a084595161401484a00000063ffffffff611e7f16565b839063ffffffff611db716565b91505b5092915050565b600060086006541015611e6d575060646109ef565b506c01431e0fae6d7217caa000000090565b600082611e8e575060006109e5565b82820282848281611e9b57fe5b0414610b3557600080fd5b6000808211611eb457600080fd5b6000828481611ebf57fe5b04949350505050565b611ed182612356565b50611edb83612356565b50611ee78383836129a2565b611eef612856565b6006546040805163c08b3f9d60e01b815260048101929092526001600160a01b038681166024840152858116604484015260648301859052905192169163c08b3f9d9160848082019260009290919082900301818387803b158015611b9d57600080fd5b600082821115611f6257600080fd5b50900390565b600080611fdf600560009054906101000a90046001600160a01b03166001600160a01b0316637ed4b27c6006546040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015611fcb57600080fd5b505af1158015610a5c573d6000803e3d6000fd5b90506000611fed84836122d5565b600c8390556001600160a01b038516600090815260136020526040902092909255509050919050565b6000612020612a6d565b600e5460ff16612070576040805162461bcd60e51b815260206004820152601660248201527511195b1959d85d1a5bdb881a5cc8191a5cd8589b195960521b604482015290519081900360640190fd5b600061207a610b96565b90506000612086611e58565b9050600061209e83610ac7898563ffffffff611e7f16565b9050858110156120e9576040805162461bcd60e51b8152602060048201526011602482015270546f6f206d75636820736c69707061676560781b604482015290519081900360640190fd5b6001600160a01b03851660009081526012602052604090205415612143576040805162461bcd60e51b815260206004820152600c60248201526b13db99dbda5b99c8195e1a5d60a21b604482015290519081900360640190fd5b61214d8582612aae565b61216182610ac7858463ffffffff611e7f16565b60055460065460408051629ff11560e81b8152600481019290925260248201849052519299506001600160a01b0390911691639ff115009160448082019260009290919082900301818387803b1580156121ba57600080fd5b505af11580156121ce573d6000803e3d6000fd5b5050600d546121e6925090508863ffffffff611db716565b600d55600480546006546040805163c69d057360e01b8152938401919091526001600160a01b038881166024850152604484018b9052606484018590529051911691829163c69d05739160848082019260009290919082900301818387803b15801561225157600080fd5b505af1158015612265573d6000803e3d6000fd5b50505050806001600160a01b031663532e19a96006546040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156122b157600080fd5b505af11580156122c5573d6000803e3d6000fd5b50999a9950505050505050505050565b6000806122e18461138e565b9050806122f25760009150506109e5565b6001600160a01b0384166000908152601360205260409020548381141561231e576000925050506109e5565b61234d6a084595161401484a000000610ac784612341888663ffffffff611f5316565b9063ffffffff611e7f16565b95945050505050565b60008061236283611f68565b905080156109e5576005546006546040805163bc8756a960e01b81526004810192909252602482018490526001600160a01b038681166044840152905192169163bc8756a9916064808201926020929091908290030181600087803b1580156123ca57600080fd5b505af11580156123de573d6000803e3d6000fd5b505050506040513d60208110156123f457600080fd5b505161243d576040805162461bcd60e51b8152602060048201526013602482015272496e737566666963656e74207265776172647360681b604482015290519081900360640190fd5b600480546006546040805163b7721d2d60e01b8152938401919091526001600160a01b03868116602485015260448401859052905191169163b7721d2d91606480830192600092919082900301818387803b15801561249b57600080fd5b505af11580156124af573d6000803e3d6000fd5b505050509050919050565b6001600160a01b0382166124cd57600080fd5b6002546124e0908263ffffffff611f5316565b6002556001600160a01b03821660009081526020819052604090205461250c908263ffffffff611f5316565b6001600160a01b038316600081815260208181526040808320949094558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35050565b80516005546040805163900cf0cf60e01b81529051600093926001600160a01b03169163900cf0cf916004808301926020929190829003018186803b1580156125a957600080fd5b505afa1580156125bd573d6000803e3d6000fd5b505050506040513d60208110156125d357600080fd5b50516005546040805163a7ab696160e01b81529051612658926001600160a01b03169163a7ab6961916004808301926020929190829003018186803b15801561261b57600080fd5b505afa15801561262f573d6000803e3d6000fd5b505050506040513d602081101561264557600080fd5b505160208601519063ffffffff611db716565b111580156126665750600081115b6126b7576040805162461bcd60e51b815260206004820152601c60248201527f496e636f6d706c657465207769746864726177616c20706572696f6400000000604482015290519081900360640190fd5b60006126d06126c4611e58565b610ac7846123416117f6565b6010549091506126e6908363ffffffff611f5316565b601055600f546126fc908263ffffffff611f5316565b600f556005546006546040805163bc8756a960e01b8152600481019290925260248201849052336044830152516001600160a01b039092169163bc8756a9916064808201926020929091908290030181600087803b15801561275d57600080fd5b505af1158015612771573d6000803e3d6000fd5b505050506040513d602081101561278757600080fd5b5051610b35576040805162461bcd60e51b8152602060048201526013602482015272496e737566666963656e74207265776172647360681b604482015290519081900360640190fd5b6003805460ff19169055565b6001600160a01b0381166127ef57600080fd5b6003546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600380546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6016546000906001600160a01b031680610a7957600560009054906101000a90046001600160a01b03166001600160a01b0316635ab1bd536040518163ffffffff1660e01b815260040160206040518083038186803b1580156128b857600080fd5b505afa1580156128cc573d6000803e3d6000fd5b505050506040513d60208110156128e257600080fd5b5051604080516832bb32b73a39a43ab160b91b8152815190819003600901812063cac39a0560e01b8252600482015290516001600160a01b039092169163cac39a0591602480820192602092909190829003018186803b15801561294557600080fd5b505afa158015612959573d6000803e3d6000fd5b505050506040513d602081101561296f57600080fd5b5051601680546001600160a01b0319166001600160a01b0383161790559050905090565b6003805460ff19166001179055565b6001600160a01b0382166129b557600080fd5b6001600160a01b0383166000908152602081905260409020546129de908263ffffffff611f5316565b6001600160a01b038085166000908152602081905260408082209390935590841681522054612a13908263ffffffff611db716565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60035460ff16156115f8576040805162461bcd60e51b81526020600482015260066024820152651b1bd8dad95960d21b604482015290519081900360640190fd5b6001600160a01b038216612ac157600080fd5b600254612ad4908263ffffffff611db716565b6002556001600160a01b038216600090815260208190526040902054612b00908263ffffffff611db716565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60405180604001604052806000815260200160008152509056fea265627a7a72315820e9ce7e97a99aaf6552b0816f09492330f07556bb8fae549e79c844e5213e05c564736f6c63430005110032
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102f15760003560e01c80637542ff951161019d578063a9059cbb116100e9578063cf309012116100a2578063e4cd1aec1161007c578063e4cd1aec14610794578063e97fddc2146107ba578063f2fde38b146107d7578063f83d08ba146107fd576102f1565b8063cf30901214610756578063dd62ed3e1461075e578063df5cf7231461078c576102f1565b8063a9059cbb1461068d578063abf59fc9146106b9578063b4988fd0146106ef578063bfb18f2914610723578063c7b8981c1461072b578063c83ec04d14610733576102f1565b80638d16a14a116101565780639b2cb5d8116101305780639b2cb5d814610625578063a0c1ca341461062d578063a457c2d714610659578063a69df4b514610685576102f1565b80638d16a14a1461060d5780638da5cb5b146106155780638f32d59b1461061d576102f1565b80637542ff95146105a2578063795be587146105aa5780637ba8c820146105d6578063883b455f146105f55780638ccdd289146105fd5780638d086da414610605576102f1565b80633d94eb051161025c578063653ec134116102155780636cbb6050116101ef5780636cbb60501461051f5780636e7ce5911461054857806370a0823114610574578063715018a61461059a576102f1565b8063653ec134146104b0578063676e5550146104d65780636ab15071146104fc576102f1565b80633d94eb0514610464578063446a2ec8146104885780634f91440d146104905780635c42c733146104985780635c5f7dae146104a05780635f0c80cc146104a8576102f1565b806323b872dd116102ae57806323b872dd146103c45780633046c204146103fa578063395093511461042057806339c31e931461044c5780633a09bf44146104545780633ba0b9a91461045c576102f1565b8063029d3040146102f6578063095ea7b31461031b57806318160ddd1461035b5780631bf494a7146103755780631e7ff8f61461037d57806323440679146103bc575b600080fd5b6103196004803603604081101561030c57600080fd5b5080359060200135610805565b005b6103476004803603604081101561033157600080fd5b506001600160a01b0381351690602001356109d4565b604080519115158252519081900360200190f35b6103636109eb565b60408051918252519081900360200190f35b6103636109f2565b6103a36004803603602081101561039357600080fd5b50356001600160a01b0316610a7e565b6040805192835260208301919091528051918290030190f35b610363610ade565b610347600480360360608110156103da57600080fd5b506001600160a01b03813581169160208101359091169060400135610ae4565b6103636004803603602081101561041057600080fd5b50356001600160a01b0316610b3c565b6103476004803603604081101561043657600080fd5b506001600160a01b038135169060200135610b4e565b610363610b8a565b610363610b90565b610363610b96565b61046c610c53565b604080516001600160a01b039092168252519081900360200190f35b610363610c62565b6103a3610c68565b610363610ec9565b610363610ecf565b610363610ed5565b6103a3600480360360208110156104c657600080fd5b50356001600160a01b0316610edb565b610363600480360360208110156104ec57600080fd5b50356001600160a01b0316610ef4565b6103636004803603604081101561051257600080fd5b5080359060200135610f07565b6103636004803603606081101561053557600080fd5b5080359060208101359060400135610fed565b6103196004803603604081101561055e57600080fd5b506001600160a01b038135169060200135611124565b6103636004803603602081101561058a57600080fd5b50356001600160a01b031661138e565b6103196113a9565b61046c61140a565b6103a3600480360360408110156105c057600080fd5b506001600160a01b038135169060200135611419565b610319600480360360208110156105ec57600080fd5b5035151561143d565b61046c611461565b610363611470565b610363611476565b61031961147c565b61046c611547565b61034761155b565b610363611571565b6103196004803603604081101561064357600080fd5b506001600160a01b038135169060200135611577565b6103476004803603604081101561066f57600080fd5b506001600160a01b0381351690602001356115a3565b6103196115df565b610347600480360360408110156106a357600080fd5b506001600160a01b0381351690602001356115fa565b610319600480360360608110156106cf57600080fd5b506001600160a01b03813581169160208101359091169060400135611607565b6103196004803603606081101561070557600080fd5b508035906001600160a01b036020820135811691604001351661172e565b6103636117f6565b61031961183d565b6103196004803603604081101561074957600080fd5b50803590602001356118a4565b610347611a7d565b6103636004803603604081101561077457600080fd5b506001600160a01b0381358116916020013516611a86565b610347611ab1565b610363600480360360208110156107aa57600080fd5b50356001600160a01b0316611aba565b610319600480360360208110156107d057600080fd5b5035611acc565b610319600480360360208110156107ed57600080fd5b50356001600160a01b0316611bba565b610319611bd4565b6000806108128484611bed565b9150915061081e612b56565b5033600090815260126020908152604091829020825180840190935280548084526001909101549183019190915261085c908363ffffffff611db716565b81526005546040805163900cf0cf60e01b815290516001600160a01b039092169163900cf0cf91600480820192602092909190829003018186803b1580156108a357600080fd5b505afa1580156108b7573d6000803e3d6000fd5b505050506040513d60208110156108cd57600080fd5b505160208281019182523360008181526012909252604080832085518155935160019094019390935560048054600654855163f1382b5360e01b8152928301526024820192909252604481018990526064810187905292516001600160a01b0390911692839263f1382b539260848084019382900301818387803b15801561095457600080fd5b505af1158015610968573d6000803e3d6000fd5b50505050806001600160a01b031663532e19a96006546040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156109b457600080fd5b505af11580156109c8573d6000803e3d6000fd5b50505050505050505050565b60006109e1338484611dc9565b5060015b92915050565b6002545b90565b6005546006546040805163072c21ef60e31b8152600481019290925251600092610a79926001600160a01b03909116916339610f7891602480820192602092909190829003018186803b158015610a4857600080fd5b505afa158015610a5c573d6000803e3d6000fd5b505050506040513d6020811015610a7257600080fd5b5051611e01565b905090565b6000806000610a8c8461138e565b90506000610a98610b96565b905081610aac57600093509150610ad99050565b610ad3610ab7611e58565b610ac7838563ffffffff611e7f16565b9063ffffffff611ea616565b93509150505b915091565b60095481565b6000610af1848484611ec8565b6001600160a01b038416600090815260016020908152604080832033808552925290912054610b31918691610b2c908663ffffffff611f5316565b611dc9565b5060015b9392505050565b60146020526000908152604090205481565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916109e1918590610b2c908663ffffffff611db716565b60075481565b600d5481565b600080610ba16109eb565b90506000610bad611e58565b90508115610c4a5760055460065460408051637f4b432360e01b8152600481019290925251610c45928592610ac79286926001600160a01b031691637f4b4323916024808301926020929190829003018186803b158015610c0d57600080fd5b505afa158015610c21573d6000803e3d6000fd5b505050506040513d6020811015610c3757600080fd5b50519063ffffffff611e7f16565b610c4c565b805b9250505090565b6004546001600160a01b031681565b600c5481565b6000803381610c7682611f68565b90506000600a54821015610cd1576040805162461bcd60e51b815260206004820152601c60248201527f546f6f20736d616c6c207265776172647320746f2072657374616b6500000000604482015290519081900360640190fd5b8115610ec057610ce382600085612016565b905080821115610e39576005546006546040805163bc8756a960e01b8152600481019290925283850360248301526001600160a01b038681166044840152905192169163bc8756a9916064808201926020929091908290030181600087803b158015610d4e57600080fd5b505af1158015610d62573d6000803e3d6000fd5b505050506040513d6020811015610d7857600080fd5b5051610dc1576040805162461bcd60e51b8152602060048201526013602482015272496e737566666963656e74207265776172647360681b604482015290519081900360640190fd5b600480546006546040805163b7721d2d60e01b8152938401919091526001600160a01b0386811660248501528486036044850152905191169163b7721d2d91606480830192600092919082900301818387803b158015610e2057600080fd5b505af1158015610e34573d6000803e3d6000fd5b505050505b6000610e4484610a7e565b506004805460065460408051637f88a95760e01b8152938401919091526001600160a01b0388811660248501526044840185905290519394501691637f88a9579160648082019260009290919082900301818387803b158015610ea657600080fd5b505af1158015610eba573d6000803e3d6000fd5b50505050505b93509150509091565b600f5481565b60065481565b600b5481565b6012602052600090815260409020805460019091015482565b60006109e582610f026109f2565b6122d5565b6000610f1233612356565b50610f1e838333612016565b60055460065460408051636901b25360e01b8152600481019290925260248201849052336044830152519293506001600160a01b0390911691636901b253916064808201926020929091908290030181600087803b158015610f7f57600080fd5b505af1158015610f93573d6000803e3d6000fd5b505050506040513d6020811015610fa957600080fd5b50516109e5576040805162461bcd60e51b815260206004820152600e60248201526d19195c1bdcda5d0819985a5b195960921b604482015290519081900360640190fd5b6000610ff761155b565b61100057600080fd5b600f546000611015858363ffffffff611db716565b90508061102757600092505050610b35565b600061104c61103c888463ffffffff611db716565b610ac7848863ffffffff611e7f16565b9050600061106483610ac7868563ffffffff611e7f16565b90506000611078838363ffffffff611f5316565b6005546006546040805163858a7c0360e01b8152600481019290925260248201849052519293506001600160a01b039091169163858a7c039160448082019260009290919082900301818387803b1580156110d257600080fd5b505af11580156110e6573d6000803e3d6000fd5b5050600d546110fe925090508263ffffffff611f5316565b600d55600f54611114908363ffffffff611f5316565b600f555090979650505050505050565b61112c61155b565b61113557600080fd5b61113e82612356565b5060008061114b84610a7e565b9150915082821015611199576040805162461bcd60e51b815260206004820152601260248201527109ad2cee4c2e8d2dcce40e8dede40daeac6d60731b604482015290519081900360640190fd5b60006111a3611e58565b905060006111bb83610ac7878563ffffffff611e7f16565b90506111c786826124ba565b60055460065460408051629ff11560e81b815260048101929092526000888103602484015290516001600160a01b0390931692639ff1150092604480820193929182900301818387803b15801561121d57600080fd5b505af1158015611231573d6000803e3d6000fd5b5050600d54611249925090508663ffffffff611f5316565b600d55600480546006546040805163f1382b5360e01b8152938401919091526001600160a01b0389811660248501526044840189905260648401859052905191169163f1382b5391608480830192600092919082900301818387803b1580156112b157600080fd5b505af11580156112c5573d6000803e3d6000fd5b5050600480546006546040805163532e19a960e01b815293840191909152516001600160a01b03909116935063532e19a99250602480830192600092919082900301818387803b15801561131857600080fd5b505af115801561132c573d6000803e3d6000fd5b5050600480546006546040805163302df4df60e11b8152938401919091526001600160a01b038b81166024850152604484018b905290519116935063605be9be9250606480830192600092919082900301818387803b1580156109b457600080fd5b6001600160a01b031660009081526020819052604090205490565b6113b161155b565b6113ba57600080fd5b60035460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360038054610100600160a81b0319169055565b6005546001600160a01b031681565b60156020908152600092835260408084209091529082529020805460019091015482565b61144561155b565b61144e57600080fd5b600e805460ff1916911515919091179055565b6016546001600160a01b031681565b60085481565b60105481565b611484612b56565b503360009081526012602090815260408083208151808301909252805482526001015491810191909152906114b882612561565b3360008181526012602052604080822082815560010182905560048054600654835163302df4df60e11b81529283015260248201949094526044810185905290519394506001600160a01b039092169263605be9be92606480820193929182900301818387803b15801561152b57600080fd5b505af115801561153f573d6000803e3d6000fd5b505050505050565b60035461010090046001600160a01b031690565b60035461010090046001600160a01b0316331490565b600a5481565b61157f61155b565b61158857600080fd5b61159182612356565b5061159e81600084612016565b505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916109e1918590610b2c908663ffffffff611f5316565b6115e761155b565b6115f057600080fd5b6115f86127d0565b565b60006109e1338484611ec8565b61160f61155b565b61161857600080fd5b6001600160a01b038316611662576040516001600160a01b0383169082156108fc029083906000818181858888f1935050505015801561165c573d6000803e3d6000fd5b5061159e565b826001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156116c257600080fd5b505af11580156116d6573d6000803e3d6000fd5b505050506040513d60208110156116ec57600080fd5b505161159e576040805162461bcd60e51b815260206004820152600c60248201526b111c985a5b8819985a5b195960a21b604482015290519081900360640190fd5b600354600160a81b900460ff161561177e576040805162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481a5b9a5d195960921b604482015290519081900360640190fd5b6003805460ff60a81b1916600160a81b1790556006839055600480546001600160a01b038085166001600160a01b03199283161790925560058054928416929091169190911790556117cf816127dc565b6117d7612856565b5050670de0b6b3a7640000600a555050600e805460ff19166001179055565b600080611801611e58565b9050600860065410156118155790506109ef565b601054801561183757610c4581610ac784600f54611e7f90919063ffffffff16565b50919050565b600061184833612356565b9050600a548110156118a1576040805162461bcd60e51b815260206004820152601860248201527f546f6f20736d616c6c207265776172647320616d6f756e740000000000000000604482015290519081900360640190fd5b50565b6000806118b18484611bed565b33600090815260146020526040812054929450909250906118d990600163ffffffff611db716565b90506118e3612b56565b6040518060400160405280848152602001600560009054906101000a90046001600160a01b03166001600160a01b031663900cf0cf6040518163ffffffff1660e01b815260040160206040518083038186803b15801561194257600080fd5b505afa158015611956573d6000803e3d6000fd5b505050506040513d602081101561196c57600080fd5b5051905233600081815260156020908152604080832087845282528083208551815585830151600190910155928252601490522083905590506119ad612856565b60065460408051632a9b5b4160e11b81526004810192909252336024830152604482018990526064820187905260848201859052516001600160a01b039290921691635536b6829160a48082019260009290919082900301818387803b158015611a1657600080fd5b505af1158015611a2a573d6000803e3d6000fd5b5050600480546006546040805163532e19a960e01b815293840191909152516001600160a01b03909116935063532e19a99250602480830192600092919082900301818387803b1580156109b457600080fd5b60035460ff1681565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600e5460ff1681565b60136020526000908152604090205481565b611ad4612b56565b503360009081526015602090815260408083208484528252808320815180830190925280548252600101549181019190915290611b1082612561565b3360009081526015602090815260408083208784529091528120818155600101559050611b3b612856565b60065460408051636e699d8760e01b815260048101929092523360248301526044820184905260648201869052516001600160a01b039290921691636e699d879160848082019260009290919082900301818387803b158015611b9d57600080fd5b505af1158015611bb1573d6000803e3d6000fd5b50505050505050565b611bc261155b565b611bcb57600080fd5b6118a1816127dc565b611bdc61155b565b611be557600080fd5b6115f8612993565b600080600080611bfc33610a7e565b9150915081600014158015611c115750858210155b611c57576040805162461bcd60e51b8152602060048201526012602482015271151bdbc81b5d58da081c995c5d595cdd195960721b604482015290519081900360640190fd5b6000611c61611e58565b90506000611c7983610ac78a8563ffffffff611e7f16565b905086811115611cc4576040805162461bcd60e51b8152602060048201526011602482015270746f6f206d75636820736c69707061676560781b604482015290519081900360640190fd5b611ccd33612356565b50611cd833826124ba565b60055460065460408051629ff11560e81b8152600481019290925260008b8103602484015290516001600160a01b0390931692639ff1150092604480820193929182900301818387803b158015611d2e57600080fd5b505af1158015611d42573d6000803e3d6000fd5b5050600d54611d5a925090508963ffffffff611f5316565b600d556000611d7a611d6a6117f6565b610ac78b8663ffffffff611e7f16565b600f54909150611d90908a63ffffffff611db716565b600f55601054611da6908263ffffffff611db716565b601055909890975095505050505050565b600082820183811015610b3557600080fd5b6040805162461bcd60e51b8152602060048201526008602482015267191a5cd8589b195960c21b604482015290519081900360640190fd5b600c5460009082156109e5576000611e176109eb565b90508015611e5157611e4e611e4182610ac7876a084595161401484a00000063ffffffff611e7f16565b839063ffffffff611db716565b91505b5092915050565b600060086006541015611e6d575060646109ef565b506c01431e0fae6d7217caa000000090565b600082611e8e575060006109e5565b82820282848281611e9b57fe5b0414610b3557600080fd5b6000808211611eb457600080fd5b6000828481611ebf57fe5b04949350505050565b611ed182612356565b50611edb83612356565b50611ee78383836129a2565b611eef612856565b6006546040805163c08b3f9d60e01b815260048101929092526001600160a01b038681166024840152858116604484015260648301859052905192169163c08b3f9d9160848082019260009290919082900301818387803b158015611b9d57600080fd5b600082821115611f6257600080fd5b50900390565b600080611fdf600560009054906101000a90046001600160a01b03166001600160a01b0316637ed4b27c6006546040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015611fcb57600080fd5b505af1158015610a5c573d6000803e3d6000fd5b90506000611fed84836122d5565b600c8390556001600160a01b038516600090815260136020526040902092909255509050919050565b6000612020612a6d565b600e5460ff16612070576040805162461bcd60e51b815260206004820152601660248201527511195b1959d85d1a5bdb881a5cc8191a5cd8589b195960521b604482015290519081900360640190fd5b600061207a610b96565b90506000612086611e58565b9050600061209e83610ac7898563ffffffff611e7f16565b9050858110156120e9576040805162461bcd60e51b8152602060048201526011602482015270546f6f206d75636820736c69707061676560781b604482015290519081900360640190fd5b6001600160a01b03851660009081526012602052604090205415612143576040805162461bcd60e51b815260206004820152600c60248201526b13db99dbda5b99c8195e1a5d60a21b604482015290519081900360640190fd5b61214d8582612aae565b61216182610ac7858463ffffffff611e7f16565b60055460065460408051629ff11560e81b8152600481019290925260248201849052519299506001600160a01b0390911691639ff115009160448082019260009290919082900301818387803b1580156121ba57600080fd5b505af11580156121ce573d6000803e3d6000fd5b5050600d546121e6925090508863ffffffff611db716565b600d55600480546006546040805163c69d057360e01b8152938401919091526001600160a01b038881166024850152604484018b9052606484018590529051911691829163c69d05739160848082019260009290919082900301818387803b15801561225157600080fd5b505af1158015612265573d6000803e3d6000fd5b50505050806001600160a01b031663532e19a96006546040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156122b157600080fd5b505af11580156122c5573d6000803e3d6000fd5b50999a9950505050505050505050565b6000806122e18461138e565b9050806122f25760009150506109e5565b6001600160a01b0384166000908152601360205260409020548381141561231e576000925050506109e5565b61234d6a084595161401484a000000610ac784612341888663ffffffff611f5316565b9063ffffffff611e7f16565b95945050505050565b60008061236283611f68565b905080156109e5576005546006546040805163bc8756a960e01b81526004810192909252602482018490526001600160a01b038681166044840152905192169163bc8756a9916064808201926020929091908290030181600087803b1580156123ca57600080fd5b505af11580156123de573d6000803e3d6000fd5b505050506040513d60208110156123f457600080fd5b505161243d576040805162461bcd60e51b8152602060048201526013602482015272496e737566666963656e74207265776172647360681b604482015290519081900360640190fd5b600480546006546040805163b7721d2d60e01b8152938401919091526001600160a01b03868116602485015260448401859052905191169163b7721d2d91606480830192600092919082900301818387803b15801561249b57600080fd5b505af11580156124af573d6000803e3d6000fd5b505050509050919050565b6001600160a01b0382166124cd57600080fd5b6002546124e0908263ffffffff611f5316565b6002556001600160a01b03821660009081526020819052604090205461250c908263ffffffff611f5316565b6001600160a01b038316600081815260208181526040808320949094558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35050565b80516005546040805163900cf0cf60e01b81529051600093926001600160a01b03169163900cf0cf916004808301926020929190829003018186803b1580156125a957600080fd5b505afa1580156125bd573d6000803e3d6000fd5b505050506040513d60208110156125d357600080fd5b50516005546040805163a7ab696160e01b81529051612658926001600160a01b03169163a7ab6961916004808301926020929190829003018186803b15801561261b57600080fd5b505afa15801561262f573d6000803e3d6000fd5b505050506040513d602081101561264557600080fd5b505160208601519063ffffffff611db716565b111580156126665750600081115b6126b7576040805162461bcd60e51b815260206004820152601c60248201527f496e636f6d706c657465207769746864726177616c20706572696f6400000000604482015290519081900360640190fd5b60006126d06126c4611e58565b610ac7846123416117f6565b6010549091506126e6908363ffffffff611f5316565b601055600f546126fc908263ffffffff611f5316565b600f556005546006546040805163bc8756a960e01b8152600481019290925260248201849052336044830152516001600160a01b039092169163bc8756a9916064808201926020929091908290030181600087803b15801561275d57600080fd5b505af1158015612771573d6000803e3d6000fd5b505050506040513d602081101561278757600080fd5b5051610b35576040805162461bcd60e51b8152602060048201526013602482015272496e737566666963656e74207265776172647360681b604482015290519081900360640190fd5b6003805460ff19169055565b6001600160a01b0381166127ef57600080fd5b6003546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600380546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6016546000906001600160a01b031680610a7957600560009054906101000a90046001600160a01b03166001600160a01b0316635ab1bd536040518163ffffffff1660e01b815260040160206040518083038186803b1580156128b857600080fd5b505afa1580156128cc573d6000803e3d6000fd5b505050506040513d60208110156128e257600080fd5b5051604080516832bb32b73a39a43ab160b91b8152815190819003600901812063cac39a0560e01b8252600482015290516001600160a01b039092169163cac39a0591602480820192602092909190829003018186803b15801561294557600080fd5b505afa158015612959573d6000803e3d6000fd5b505050506040513d602081101561296f57600080fd5b5051601680546001600160a01b0319166001600160a01b0383161790559050905090565b6003805460ff19166001179055565b6001600160a01b0382166129b557600080fd5b6001600160a01b0383166000908152602081905260409020546129de908263ffffffff611f5316565b6001600160a01b038085166000908152602081905260408082209390935590841681522054612a13908263ffffffff611db716565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60035460ff16156115f8576040805162461bcd60e51b81526020600482015260066024820152651b1bd8dad95960d21b604482015290519081900360640190fd5b6001600160a01b038216612ac157600080fd5b600254612ad4908263ffffffff611db716565b6002556001600160a01b038216600090815260208190526040902054612b00908263ffffffff611db716565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60405180604001604052806000815260200160008152509056fea265627a7a72315820e9ce7e97a99aaf6552b0816f09492330f07556bb8fae549e79c844e5213e05c564736f6c63430005110032
Deployed Bytecode Sourcemap
43750:15277:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43750:15277:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48763:615;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48763:615:0;;;;;;;:::i;:::-;;12790:148;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;12790:148:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;10943:91;;;:::i;:::-;;;;;;;;;;;;;;;;47146:164;;;:::i;46081:306::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46081:306:0;-1:-1:-1;;;;;46081:306:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;44495:46;;;:::i;13411:228::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;13411:228:0;;;;;;;;;;;;;;;;;:::i;45024:47::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45024:47:0;-1:-1:-1;;;;;45024:47:0;;:::i;14165:203::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;14165:203:0;;;;;;;;:::i;44399:42::-;;;:::i;44660:27::-;;;:::i;45793:280::-;;;:::i;44287:32::-;;;:::i;:::-;;;;-1:-1:-1;;;;;44287:32:0;;;;;;;;;;;;;;44624:29;;;:::i;47771:984::-;;;:::i;44727:27::-;;;:::i;44366:26::-;;;:::i;44581:36::-;;;:::i;44903:50::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44903:50:0;-1:-1:-1;;;;;44903:50:0;;:::i;46999:139::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46999:139:0;-1:-1:-1;;;;;46999:139:0;;:::i;47362:401::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47362:401:0;;;;;;;:::i;50747:1026::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50747:1026:0;;;;;;;;;;;;:::i;49571:718::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;49571:718:0;;;;;;;;:::i;11253:106::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11253:106:0;-1:-1:-1;;;;;11253:106:0;;:::i;19659:140::-;;;:::i;44326:33::-;;;:::i;45078:74::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;45078:74:0;;;;;;;;:::i;51781:106::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51781:106:0;;;;:::i;45161:26::-;;;:::i;44448:40::-;;;:::i;44761:29::-;;;:::i;50462:277::-;;;:::i;18869:79::-;;;:::i;19204:92::-;;;:::i;44548:24::-;;;:::i;50297:157::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;50297:157:0;;;;;;;;:::i;14899:213::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;14899:213:0;;;;;;;;:::i;40269:68::-;;;:::i;12003:140::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;12003:140:0;;;;;;;;:::i;51895:328::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;51895:328:0;;;;;;;;;;;;;;;;;:::i;45304:433::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45304:433:0;;;-1:-1:-1;;;;;45304:433:0;;;;;;;;;;;;:::i;46395:596::-;;;:::i;49386:177::-;;;:::i;52280:696::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52280:696:0;;;;;;;:::i;39726:18::-;;;:::i;11698:131::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;11698:131:0;;;;;;;;;;:::i;44696:22::-;;;:::i;44960:55::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44960:55:0;-1:-1:-1;;;;;44960:55:0;;:::i;52984:362::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52984:362:0;;:::i;19976:109::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19976:109:0;-1:-1:-1;;;;;19976:109:0;;:::i;40197:64::-;;;:::i;48763:615::-;48853:14;48869:26;48899:46;48912:11;48925:19;48899:12;:46::i;:::-;48852:93;;;;48958:29;;:::i;:::-;-1:-1:-1;48998:10:0;48990:19;;;;:7;:19;;;;;;;;;48958:51;;;;;;;;;;;;;;;;;;;;;;;;;49036:37;;49054:18;49036:37;:17;:37;:::i;:::-;49020:53;;49141:12;;:20;;;-1:-1:-1;;;49141:20:0;;;;-1:-1:-1;;;;;49141:12:0;;;;:18;;:20;;;;;;;;;;;;;;;:12;:20;;;5:2:-1;;;;30:1;27;20:12;5:2;49141:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49141:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49141:20:0;;49118;;;:43;;;49180:10;49172:19;;;;:7;:19;;;;;;;:28;;;;;;;;;;;;;;49234:13;;;49280:11;;49258:67;;-1:-1:-1;;;49258:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49234:13:0;;;;;;49258:21;;:67;;;;;;;;;;49172:19;49234:13;49258:67;;;5:2:-1;;;;30:1;27;20:12;5:2;49258:67:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49258:67:0;;;;49336:6;-1:-1:-1;;;;;49336:21:0;;49358:11;;49336:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49336:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49336:34:0;;;;48763:615;;;;;;:::o;12790:148::-;12855:4;12872:36;12881:10;12893:7;12902:5;12872:8;:36::i;:::-;-1:-1:-1;12926:4:0;12790:148;;;;;:::o;10943:91::-;11014:12;;10943:91;;:::o;47146:164::-;47259:12;;47289:11;;47259:42;;;-1:-1:-1;;;47259:42:0;;;;;;;;;;47196:7;;47223:79;;-1:-1:-1;;;;;47259:12:0;;;;:29;;:42;;;;;;;;;;;;;;;:12;:42;;;5:2:-1;;;;30:1;27;20:12;5:2;47259:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47259:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47259:42:0;47223:35;:79::i;:::-;47216:86;;47146:164;:::o;46081:306::-;46139:7;46148;46168:14;46185:15;46195:4;46185:9;:15::i;:::-;46168:32;;46211:12;46226:14;:12;:14::i;:::-;46211:29;-1:-1:-1;46255:11:0;46251:60;;46291:1;;-1:-1:-1;46294:4:0;-1:-1:-1;46283:16:0;;-1:-1:-1;46283:16:0;46251:60;46331:41;46352:19;:17;:19::i;:::-;46331:16;:4;46340:6;46331:16;:8;:16;:::i;:::-;:20;:41;:20;:41;:::i;:::-;46323:56;-1:-1:-1;46374:4:0;-1:-1:-1;;46081:306:0;;;;:::o;44495:46::-;;;;:::o;13411:228::-;13490:4;13507:26;13517:4;13523:2;13527:5;13507:9;:26::i;:::-;-1:-1:-1;;;;;13571:14:0;;;;;;:8;:14;;;;;;;;13559:10;13571:26;;;;;;;;;13544:65;;13553:4;;13571:37;;13602:5;13571:37;:30;:37;:::i;:::-;13544:8;:65::i;:::-;-1:-1:-1;13627:4:0;13411:228;;;;;;:::o;45024:47::-;;;;;;;;;;;;;:::o;14165:203::-;14271:10;14245:4;14292:20;;;:8;:20;;;;;;;;-1:-1:-1;;;;;14292:29:0;;;;;;;;;;14245:4;;14262:76;;14283:7;;14292:45;;14326:10;14292:45;:33;:45;:::i;44399:42::-;;;;:::o;44660:27::-;;;;:::o;45793:280::-;45838:7;45858:19;45880:13;:11;:13::i;:::-;45858:35;;45904:17;45924:19;:17;:19::i;:::-;45904:39;-1:-1:-1;45961:16:0;;:104;;45992:12;;46021:11;;45992:41;;;-1:-1:-1;;;45992:41:0;;;;;;;;;;:73;;46053:11;;45992:56;;46038:9;;-1:-1:-1;;;;;45992:12:0;;:28;;:41;;;;;;;;;;;;;;:12;:41;;;5:2:-1;;;;30:1;27;20:12;5:2;45992:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45992:41:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45992:41:0;;:56;:45;:56;:::i;:73::-;45961:104;;;45980:9;45961:104;45954:111;;;;45793:280;:::o;44287:32::-;;;-1:-1:-1;;;;;44287:32:0;;:::o;44624:29::-;;;;:::o;47771:984::-;47805:7;;47849:10;47805:7;47893:21;47849:10;47893:15;:21::i;:::-;47870:44;;47925:22;47984:9;;47968:12;:25;;47960:66;;;;;-1:-1:-1;;;47960:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;48043:17;;48039:651;;48094:33;48105:12;48119:1;48122:4;48094:10;:33::i;:::-;48077:50;;48163:14;48148:12;:29;48144:392;;;48274:12;;48301:11;;48274:76;;;-1:-1:-1;;;48274:76:0;;;;;;;;;48314:29;;;48274:76;;;;-1:-1:-1;;;;;48274:76:0;;;;;;;;;:12;;;:26;;:76;;;;;;;;;;;;;;;:12;;:76;;;5:2:-1;;;;30:1;27;20:12;5:2;48274:76:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48274:76:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48274:76:0;48244:169;;;;;-1:-1:-1;;;48244:169:0;;;;;;;;;;;;-1:-1:-1;;;48244:169:0;;;;;;;;;;;;;;;48432:13;;;48471:11;;48432:88;;;-1:-1:-1;;;48432:88:0;;;;;;;;;-1:-1:-1;;;;;48432:88:0;;;;;;;48490:29;;;48432:88;;;;;;:13;;;:38;;:88;;;;;:13;;:88;;;;;;;:13;;:88;;;5:2:-1;;;;30:1;27;20:12;5:2;48432:88:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48432:88:0;;;;48144:392;48553:19;48578;48592:4;48578:13;:19::i;:::-;-1:-1:-1;48612:13:0;;;48647:11;;48612:66;;;-1:-1:-1;;;48612:66:0;;;;;;;;;-1:-1:-1;;;;;48612:66:0;;;;;;;;;;;;;;;48552:45;;-1:-1:-1;48612:13:0;;:34;;:66;;;;;:13;;:66;;;;;;;;:13;;:66;;;5:2:-1;;;;30:1;27;20:12;5:2;48612:66:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48612:66:0;;;;48039:651;;48718:14;-1:-1:-1;48734:12:0;-1:-1:-1;;47771:984:0;;:::o;44727:27::-;;;;:::o;44366:26::-;;;;:::o;44581:36::-;;;;:::o;44903:50::-;;;;;;;;;;;;;;;;;;;:::o;46999:139::-;47060:7;47087:43;47104:4;47110:19;:17;:19::i;:::-;47087:16;:43::i;47362:401::-;47440:23;47476:38;47503:10;47476:26;:38::i;:::-;;47553:49;47564:7;47573:16;47591:10;47553;:49::i;:::-;47621:12;;47652:11;;47621:72;;;-1:-1:-1;;;47621:72:0;;;;;;;;;;;;;;;47682:10;47621:72;;;;;47535:67;;-1:-1:-1;;;;;;47621:12:0;;;;:30;;:72;;;;;;;;;;;;;;;:12;;:72;;;5:2:-1;;;;30:1;27;20:12;5:2;47621:72:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47621:72:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47621:72:0;47613:99;;;;;-1:-1:-1;;;47613:99:0;;;;;;;;;;;;-1:-1:-1;;;47613:99:0;;;;;;;;;;;;;;50747:1026;50901:7;19081:9;:7;:9::i;:::-;19073:18;;;;;;50945:12;;50921:21;50995:34;:15;50945:12;50995:34;:19;:34;:::i;:::-;50968:61;-1:-1:-1;51044:21:0;51040:62;;51089:1;51082:8;;;;;;51040:62;51192:22;51217:82;51262:36;:14;51281:16;51262:36;:18;:36;:::i;:::-;51217:40;:16;51238:18;51217:40;:20;:40;:::i;:82::-;51192:107;-1:-1:-1;51310:36:0;51349:55;51387:16;51349:33;:13;51192:107;51349:33;:17;:33;:::i;:55::-;51310:94;-1:-1:-1;51449:20:0;51472:48;:14;51310:94;51472:48;:18;:48;:::i;:::-;51531:12;;51577:11;;51531:72;;;-1:-1:-1;;;51531:72:0;;;;;;;;;;;;;;;;51449:71;;-1:-1:-1;;;;;;51531:12:0;;;;:45;;:72;;;;;:12;;:72;;;;;;;;:12;;:72;;;5:2:-1;;;;30:1;27;20:12;5:2;51531:72:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;51629:12:0;;:30;;-1:-1:-1;51629:12:0;-1:-1:-1;51646:12:0;51629:30;:16;:30;:::i;:::-;51614:12;:45;51687:12;;:46;;51704:28;51687:46;:16;:46;:::i;:::-;51672:12;:61;-1:-1:-1;51751:14:0;;50747:1026;-1:-1:-1;;;;;;;50747:1026:0:o;49571:718::-;19081:9;:7;:9::i;:::-;19073:18;;;;;;49651:32;49678:4;49651:26;:32::i;:::-;;49695:19;49716:12;49732:19;49746:4;49732:13;:19::i;:::-;49694:57;;;;49785:6;49770:11;:21;;49762:52;;;;;-1:-1:-1;;;49762:52:0;;;;;;;;;;;;-1:-1:-1;;;49762:52:0;;;;;;;;;;;;;;;49827:17;49847:19;:17;:19::i;:::-;49827:39;-1:-1:-1;49877:14:0;49894:31;49920:4;49894:21;:6;49827:39;49894:21;:10;:21;:::i;:31::-;49877:48;;49936:19;49942:4;49948:6;49936:5;:19::i;:::-;49968:12;;50002:11;;49968:63;;;-1:-1:-1;;;49968:63:0;;;;;;;;;:12;50015:15;;;49968:63;;;;;;-1:-1:-1;;;;;49968:12:0;;;;:33;;:63;;;;;:12;:63;;;;;;:12;;:63;;;5:2:-1;;;;30:1;27;20:12;5:2;49968:63:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;50057:12:0;;:24;;-1:-1:-1;50057:12:0;-1:-1:-1;50074:6:0;50057:24;:16;:24;:::i;:::-;50042:12;:39;50094:13;;;50123:11;;50094:63;;;-1:-1:-1;;;50094:63:0;;;;;;;;;-1:-1:-1;;;;;50094:63:0;;;;;;;;;;;;;;;;;;;;;:13;;;:28;;:63;;;;;:13;;:63;;;;;;;:13;;:63;;;5:2:-1;;;;30:1;27;20:12;5:2;50094:63:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;50168:13:0;;;50197:11;;50168:41;;;-1:-1:-1;;;50168:41:0;;;;;;;;;;-1:-1:-1;;;;;50168:13:0;;;;-1:-1:-1;50168:28:0;;-1:-1:-1;50168:41:0;;;;;:13;;:41;;;;;;;:13;;:41;;;5:2:-1;;;;30:1;27;20:12;5:2;50168:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;50220:13:0;;;50255:11;;50220:61;;;-1:-1:-1;;;50220:61:0;;;;;;;;;-1:-1:-1;;;;;50220:61:0;;;;;;;;;;;;;;;:13;;;-1:-1:-1;50220:34:0;;-1:-1:-1;50220:61:0;;;;;:13;;:61;;;;;;;:13;;:61;;;5:2:-1;;;;30:1;27;20:12;11253:106:0;-1:-1:-1;;;;;11335:16:0;11308:7;11335:16;;;;;;;;;;;;11253:106::o;19659:140::-;19081:9;:7;:9::i;:::-;19073:18;;;;;;19742:6;;19721:40;;19758:1;;19742:6;;;-1:-1:-1;;;;;19742:6:0;;19721:40;;19758:1;;19721:40;19772:6;:19;;-1:-1:-1;;;;;;19772:19:0;;;19659:140::o;44326:33::-;;;-1:-1:-1;;;;;44326:33:0;;:::o;45078:74::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51781:106::-;19081:9;:7;:9::i;:::-;19073:18;;;;;;51855:10;:24;;-1:-1:-1;;51855:24:0;;;;;;;;;;51781:106::o;45161:26::-;;;-1:-1:-1;;;;;45161:26:0;;:::o;44448:40::-;;;;:::o;44761:29::-;;;;:::o;50462:277::-;50510:29;;:::i;:::-;-1:-1:-1;50550:10:0;50542:19;;;;:7;:19;;;;;;;;50510:51;;;;;;;;;;;;;;;;;;;;;;;50589:27;50510:51;50589:19;:27::i;:::-;50642:10;50634:19;;;;:7;:19;;;;;;50627:26;;;;;;;;50664:13;;;50699:11;;50664:67;;-1:-1:-1;;;50664:67:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;50664:13:0;;;;:34;;:67;;;;;50634:19;50664:67;;;;;;50634:19;50664:13;:67;;;5:2:-1;;;;30:1;27;20:12;5:2;50664:67:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50664:67:0;;;;50462:277;;:::o;18869:79::-;18934:6;;;;;-1:-1:-1;;;;;18934:6:0;;18869:79::o;19204:92::-;19282:6;;;;;-1:-1:-1;;;;;19282:6:0;19268:10;:20;;19204:92::o;44548:24::-;;;;:::o;50297:157::-;19081:9;:7;:9::i;:::-;19073:18;;;;;;50376:32;50403:4;50376:26;:32::i;:::-;;50419:27;50430:6;50438:1;50441:4;50419:10;:27::i;:::-;;50297:157;;:::o;14899:213::-;15010:10;14984:4;15031:20;;;:8;:20;;;;;;;;-1:-1:-1;;;;;15031:29:0;;;;;;;;;;14984:4;;15001:81;;15022:7;;15031:50;;15065:15;15031:50;:33;:50;:::i;40269:68::-;19081:9;:7;:9::i;:::-;19073:18;;;;;;40315:14;:12;:14::i;:::-;40269:68::o;12003:140::-;12064:4;12081:32;12091:10;12103:2;12107:5;12081:9;:32::i;51895:328::-;19081:9;:7;:9::i;:::-;19073:18;;;;;;-1:-1:-1;;;;;52038:21:0;;52034:182;;52076:28;;-1:-1:-1;;;;;52076:20:0;;;:28;;;;;52097:6;;52076:28;;;;52097:6;52076:20;:28;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52076:28:0;52034:182;;;52151:5;-1:-1:-1;;;;;52145:21:0;;52167:11;52180:6;52145:42;;;;;;;;;;;;;-1:-1:-1;;;;;52145:42:0;-1:-1:-1;;;;;52145:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52145:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52145:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52145:42:0;52137:67;;;;;-1:-1:-1;;;52137:67:0;;;;;;;;;;;;-1:-1:-1;;;52137:67:0;;;;;;;;;;;;;;45304:433;36211:6;;-1:-1:-1;;;36211:6:0;;;;36210:7;36202:34;;;;;-1:-1:-1;;;36202:34:0;;;;;;;;;;;;-1:-1:-1;;;36202:34:0;;;;;;;;;;;;;;;36247:6;:13;;-1:-1:-1;;;;36247:13:0;-1:-1:-1;;;36247:13:0;;;45459:11;:26;;;45496:13;:43;;-1:-1:-1;;;;;45496:43:0;;;-1:-1:-1;;;;;;45496:43:0;;;;;;;45550:12;:43;;;;;;;;;;;;;;;45604:33;45579:13;45604:18;:33::i;:::-;45648:22;:20;:22::i;:::-;-1:-1:-1;;45695:6:0;45683:9;:18;-1:-1:-1;;45712:10:0;:17;;-1:-1:-1;;45712:17:0;45725:4;45712:17;;;45304:433::o;46395:596::-;46448:7;46468:17;46488:19;:17;:19::i;:::-;46468:39;;46536:1;46522:11;;:15;46518:312;;;46809:9;-1:-1:-1;46802:16:0;;46518:312;46868:14;;46900:20;;:83;;46935:48;46967:15;46935:27;46952:9;46935:12;;:16;;:27;;;;:::i;46900:83::-;-1:-1:-1;46923:9:0;46395:596;-1:-1:-1;46395:596:0:o;49386:177::-;49431:15;49449:38;49476:10;49449:26;:38::i;:::-;49431:56;;49517:9;;49506:7;:20;;49498:57;;;;;-1:-1:-1;;;49498:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;49386:177;:::o;52280:696::-;52374:14;52390:26;52420:46;52433:11;52446:19;52420:12;:46::i;:::-;52514:10;52479:19;52501:24;;;:12;:24;;;;;;52373:93;;-1:-1:-1;52373:93:0;;-1:-1:-1;52479:19:0;52501:31;;52530:1;52501:31;:28;:31;:::i;:::-;52479:53;;52545:29;;:::i;:::-;52577:119;;;;;;;;52616:18;52577:119;;;;52664:12;;;;;;;;;-1:-1:-1;;;;;52664:12:0;-1:-1:-1;;;;;52664:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52664:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52664:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52664:20:0;52577:119;;52719:10;52707:23;;;;:11;52664:20;52707:23;;;;;;;:36;;;;;;;;:45;;;;;;;;;;;;;52763:24;;;:12;:24;;;:38;;;52545:151;-1:-1:-1;52814:22:0;:20;:22::i;:::-;52858:11;;52814:102;;;-1:-1:-1;;;52814:102:0;;;;;;;;;52871:10;52814:102;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52814:43:0;;;;;;;:102;;;;;-1:-1:-1;;52814:102:0;;;;;;;;-1:-1:-1;52814:43:0;:102;;;5:2:-1;;;;30:1;27;20:12;5:2;52814:102:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;52927:13:0;;;52956:11;;52927:41;;;-1:-1:-1;;;52927:41:0;;;;;;;;;;-1:-1:-1;;;;;52927:13:0;;;;-1:-1:-1;52927:28:0;;-1:-1:-1;52927:41:0;;;;;:13;;:41;;;;;;;:13;;:41;;;5:2:-1;;;;30:1;27;20:12;39726:18:0;;;;;;:::o;11698:131::-;-1:-1:-1;;;;;11797:15:0;;;11770:7;11797:15;;;:8;:15;;;;;;;;:24;;;;;;;;;;;;;11698:131::o;44696:22::-;;;;;;:::o;44960:55::-;;;;;;;;;;;;;:::o;52984:362::-;53055:29;;:::i;:::-;-1:-1:-1;53099:10:0;53087:23;;;;:11;:23;;;;;;;;:36;;;;;;;;53055:68;;;;;;;;;;;;;;;;;;;;;;;53151:27;53055:68;53151:19;:27::i;:::-;53208:10;53196:23;;;;:11;:23;;;;;;;;:36;;;;;;;;53189:43;;;;;;53134:44;-1:-1:-1;53243:22:0;:20;:22::i;:::-;53293:11;;53243:95;;;-1:-1:-1;;;53243:95:0;;;;;;;;;53306:10;53243:95;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53243:49:0;;;;;;;:95;;;;;-1:-1:-1;;53243:95:0;;;;;;;;-1:-1:-1;53243:49:0;:95;;;5:2:-1;;;;30:1;27;20:12;5:2;53243:95:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53243:95:0;;;;52984:362;;;:::o;19976:109::-;19081:9;:7;:9::i;:::-;19073:18;;;;;;20049:28;20068:8;20049:18;:28::i;40197:64::-;19081:9;:7;:9::i;:::-;19073:18;;;;;;40241:12;:10;:12::i;53749:1086::-;53837:7;53846;53951:19;53972:12;53988:25;54002:10;53988:13;:25::i;:::-;53950:63;;;;54032:11;54047:1;54032:16;;:46;;;;;54067:11;54052;:26;;54032:46;54024:77;;;;;-1:-1:-1;;;54024:77:0;;;;;;;;;;;;-1:-1:-1;;;54024:77:0;;;;;;;;;;;;;;;54166:17;54186:19;:17;:19::i;:::-;54166:39;-1:-1:-1;54216:14:0;54233:36;54264:4;54233:26;:11;54166:39;54233:26;:15;:26;:::i;:36::-;54216:53;;54298:19;54288:6;:29;;54280:59;;;;;-1:-1:-1;;;54280:59:0;;;;;;;;;;;;-1:-1:-1;;;54280:59:0;;;;;;;;;;;;;;;54352:38;54379:10;54352:26;:38::i;:::-;;54403:25;54409:10;54421:6;54403:5;:25::i;:::-;54439:12;;54473:11;;54439:68;;;-1:-1:-1;;;54439:68:0;;;;;;;;;:12;54486:20;;;54439:68;;;;;;-1:-1:-1;;;;;54439:12:0;;;;:33;;:68;;;;;:12;:68;;;;;;:12;;:68;;;5:2:-1;;;;30:1;27;20:12;5:2;54439:68:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;54533:12:0;;:29;;-1:-1:-1;54533:12:0;-1:-1:-1;54550:11:0;54533:29;:16;:29;:::i;:::-;54518:12;:44;54575:26;54604:54;54635:22;:20;:22::i;:::-;54604:26;:11;54620:9;54604:26;:15;:26;:::i;:54::-;54684:12;;54575:83;;-1:-1:-1;54684:29:0;;54701:11;54684:29;:16;:29;:::i;:::-;54669:12;:44;54741:14;;:38;;54760:18;54741:38;:18;:38;:::i;:::-;54724:14;:55;54800:6;;;;-1:-1:-1;53749:1086:0;-1:-1:-1;;;;;;53749:1086:0:o;9547:150::-;9605:7;9637:5;;;9661:6;;;;9653:15;;;;;17968:145;18087:18;;;-1:-1:-1;;;18087:18:0;;;;;;;;;;;;-1:-1:-1;;;18087:18:0;;;;;;;;;;;;;;55762:477;55902:14;;55856:7;;55931:22;;55927:270;;55970:19;55992:13;:11;:13::i;:::-;55970:35;-1:-1:-1;56038:16:0;;56034:152;;56093:77;56113:56;56157:11;56113:39;:17;44272:6;56113:39;:21;:39;:::i;:56::-;56093:15;;:77;:19;:77;:::i;:::-;56075:95;;56034:152;55927:270;56216:15;55762:477;-1:-1:-1;;55762:477:0:o;55495:259::-;55546:7;55639:1;55625:11;;:15;55621:78;;;-1:-1:-1;43989:3:0;55657:30;;55621:78;-1:-1:-1;44175:6:0;55495:259;:::o;8300:433::-;8358:7;8602:6;8598:47;;-1:-1:-1;8632:1:0;8625:8;;8598:47;8669:5;;;8673:1;8669;:5;:1;8693:5;;;;;:10;8685:19;;;;;8868:303;8926:7;9025:1;9021;:5;9013:14;;;;;;9038:9;9054:1;9050;:5;;;;;;;8868:303;-1:-1:-1;;;;8868:303:0:o;58591:433::-;58744:30;58771:2;58744:26;:30::i;:::-;;58823:32;58850:4;58823:26;:32::i;:::-;;58903;58919:4;58925:2;58929:5;58903:15;:32::i;:::-;58946:22;:20;:22::i;:::-;58987:11;;58946:70;;;-1:-1:-1;;;58946:70:0;;;;;;;;;-1:-1:-1;;;;;58946:70:0;;;;;;;;;;;;;;;;;;;;;;:40;;;;;:70;;;;;-1:-1:-1;;58946:70:0;;;;;;;;-1:-1:-1;58946:40:0;:70;;;5:2:-1;;;;30:1;27;20:12;9309:150:0;9367:7;9400:1;9395;:6;;9387:15;;;;;;-1:-1:-1;9425:5:0;;;9309:150::o;56727:434::-;56783:7;56803:23;56829:111;56879:12;;;;;;;;;-1:-1:-1;;;;;56879:12:0;-1:-1:-1;;;;;56879:37:0;;56917:11;;56879:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56879:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;56829:111:0;56803:137;;56951:21;56975:39;56992:4;56998:15;56975:16;:39::i;:::-;57035:14;:32;;;-1:-1:-1;;;;;57078:26:0;;;;;;:20;:26;;;;;:44;;;;-1:-1:-1;56951:63:0;-1:-1:-1;56727:434:0;;;:::o;57588:995::-;57733:7;39792:17;:15;:17::i;:::-;57761:10;;;;57753:45;;;;;-1:-1:-1;;;57753:45:0;;;;;;;;;;;;-1:-1:-1;;;57753:45:0;;;;;;;;;;;;;;;57811:12;57826:14;:12;:14::i;:::-;57811:29;;57851:17;57871:19;:17;:19::i;:::-;57851:39;-1:-1:-1;57901:14:0;57918:32;57945:4;57918:22;:7;57851:39;57918:22;:11;:22;:::i;:32::-;57901:49;;57979:16;57969:6;:26;;57961:56;;;;;-1:-1:-1;;;57961:56:0;;;;;;;;;;;;-1:-1:-1;;;57961:56:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;58036:13:0;;;;;;:7;:13;;;;;:20;:25;58028:50;;;;;-1:-1:-1;;;58028:50:0;;;;;;;;;;;;-1:-1:-1;;;58028:50:0;;;;;;;;;;;;;;;58091:19;58097:4;58103:6;58091:5;:19::i;:::-;58230:31;58251:9;58230:16;:4;58239:6;58230:16;:8;:16;:::i;:31::-;58274:12;;58308:11;;58274:63;;;-1:-1:-1;;;58274:63:0;;;;;;;;;;;;;;;;58220:41;;-1:-1:-1;;;;;;58274:12:0;;;;:33;;:63;;;;;:12;;:63;;;;;;;;:12;;:63;;;5:2:-1;;;;30:1;27;20:12;5:2;58274:63:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;58363:12:0;;:25;;-1:-1:-1;58363:12:0;-1:-1:-1;58380:7:0;58363:25;:16;:25;:::i;:::-;58348:12;:40;58422:13;;;58468:11;;58446:57;;;-1:-1:-1;;;58446:57:0;;;;;;;;;-1:-1:-1;;;;;58446:57:0;;;;;;;;;;;;;;;;;;;;;58422:13;;;;;58446:21;;:57;;;;;58401:18;;58446:57;;;;;;;;58401:18;58422:13;58446:57;;;5:2:-1;;;;30:1;27;20:12;5:2;58446:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;58446:57:0;;;;58514:6;-1:-1:-1;;;;;58514:21:0;;58536:11;;58514:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;58514:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;58568:7:0;;57588:995;-1:-1:-1;;;;;;;;;;57588:995:0:o;56247:472::-;56334:7;56354:14;56371:15;56381:4;56371:9;:15::i;:::-;56354:32;-1:-1:-1;56401:11:0;56397:52;;56436:1;56429:8;;;;;56397:52;-1:-1:-1;;;;;56494:26:0;;56461:30;56494:26;;;:20;:26;;;;;;56537:41;;;56533:82;;;56602:1;56595:8;;;;;;56533:82;56634:77;44272:6;56634:55;56682:6;56634:43;:15;56654:22;56634:43;:19;:43;:::i;:::-;:47;:55;:47;:55;:::i;:77::-;56627:84;56247:472;-1:-1:-1;;;;;56247:472:0:o;57169:411::-;57236:7;57256:21;57280;57296:4;57280:15;:21::i;:::-;57256:45;-1:-1:-1;57316:18:0;;57312:230;;57359:12;;57386:11;;57359:60;;;-1:-1:-1;;;57359:60:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;57359:60:0;;;;;;;;;:12;;;:26;;:60;;;;;;;;;;;;;;;:12;;:60;;;5:2:-1;;;;30:1;27;20:12;5:2;57359:60:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57359:60:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;57359:60:0;57351:92;;;;;-1:-1:-1;;;57351:92:0;;;;;;;;;;;;-1:-1:-1;;;57351:92:0;;;;;;;;;;;;;;;57458:13;;;57497:11;;57458:72;;;-1:-1:-1;;;57458:72:0;;;;;;;;;-1:-1:-1;;;;;57458:72:0;;;;;;;;;;;;;;;:13;;;:38;;:72;;;;;:13;;:72;;;;;;;:13;;:72;;;5:2:-1;;;;30:1;27;20:12;5:2;57458:72:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57458:72:0;;;;57559:13;-1:-1:-1;57169:411:0;;;:::o;16456:269::-;-1:-1:-1;;;;;16531:21:0;;16523:30;;;;;;16581:12;;:23;;16598:5;16581:23;:16;:23;:::i;:::-;16566:12;:38;-1:-1:-1;;;;;16636:18:0;;:9;:18;;;;;;;;;;;:29;;16659:5;16636:29;:22;:29;:::i;:::-;-1:-1:-1;;;;;16615:18:0;;:9;:18;;;;;;;;;;;:50;;;;16681:36;;;;;;;16615:9;;16681:36;;;;;;;;;;;16456:269;;:::o;54843:644::-;54956:13;;55062:12;;:20;;;-1:-1:-1;;;55062:20:0;;;;54919:7;;54956:13;-1:-1:-1;;;;;55062:12:0;;:18;;:20;;;;;;;;;;;;;;:12;:20;;;5:2:-1;;;;30:1;27;20:12;5:2;55062:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55062:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55062:20:0;55027:12;;:30;;;-1:-1:-1;;;55027:30:0;;;;55002:56;;-1:-1:-1;;;;;55027:12:0;;:28;;:30;;;;;55062:20;;55027:30;;;;;;;:12;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;55027:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55027:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55027:30:0;;55002:20;;;;:56;:24;:56;:::i;:::-;:80;;:94;;;;;55095:1;55086:6;:10;55002:94;54980:172;;;;;-1:-1:-1;;;54980:172:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;55165:15;55183:59;55222:19;:17;:19::i;:::-;55183:34;55210:6;55183:22;:20;:22::i;:59::-;55270:14;;55165:77;;-1:-1:-1;55270:26:0;;55289:6;55270:26;:18;:26;:::i;:::-;55253:14;:43;55322:12;;:25;;55339:7;55322:25;:16;:25;:::i;:::-;55307:12;:40;55368:12;;55395:11;;55368:60;;;-1:-1:-1;;;55368:60:0;;;;;;;;;;;;;;;55417:10;55368:60;;;;;-1:-1:-1;;;;;55368:12:0;;;;:26;;:60;;;;;;;;;;;;;;;:12;;:60;;;5:2:-1;;;;30:1;27;20:12;5:2;55368:60:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55368:60:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55368:60:0;55360:92;;;;;-1:-1:-1;;;55360:92:0;;;;;;;;;;;;-1:-1:-1;;;55360:92:0;;;;;;;;;;;;;;39993:58;40029:6;:14;;-1:-1:-1;;40029:14:0;;;39993:58::o;20235:187::-;-1:-1:-1;;;;;20309:22:0;;20301:31;;;;;;20369:6;;20348:38;;-1:-1:-1;;;;;20348:38:0;;;;20369:6;;;;;20348:38;;;;;20397:6;:17;;-1:-1:-1;;;;;20397:17:0;;;;;-1:-1:-1;;;;;;20397:17:0;;;;;;;;;20235:187::o;53399:342::-;53492:9;;53447;;-1:-1:-1;;;;;53492:9:0;53516:28;53512:194;;53593:12;;;;;;;;;-1:-1:-1;;;;;53593:12:0;-1:-1:-1;;;;;53593:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53593:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53593:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53593:26:0;53633:22;;;-1:-1:-1;;;53633:22:0;;;;;;;;;;;;-1:-1:-1;;;53584:72:0;;;;;;;;-1:-1:-1;;;;;53584:48:0;;;;;;:72;;;;;53593:26;;53584:72;;;;;;;;:48;:72;;;5:2:-1;;;;30:1;27;20:12;5:2;53584:72:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53584:72:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53584:72:0;53672:9;:22;;-1:-1:-1;;;;;;53672:22:0;-1:-1:-1;;;;;53672:22:0;;;;;53584:72;-1:-1:-1;53723:10:0;-1:-1:-1;53399:342:0;:::o;39930:55::-;39964:6;:13;;-1:-1:-1;;39964:13:0;39973:4;39964:13;;;39930:55::o;15339:262::-;-1:-1:-1;;;;;15427:16:0;;15419:25;;;;;;-1:-1:-1;;;;;15475:15:0;;:9;:15;;;;;;;;;;;:26;;15495:5;15475:26;:19;:26;:::i;:::-;-1:-1:-1;;;;;15457:15:0;;;:9;:15;;;;;;;;;;;:44;;;;15528:13;;;;;;;:24;;15546:5;15528:24;:17;:24;:::i;:::-;-1:-1:-1;;;;;15512:13:0;;;:9;:13;;;;;;;;;;;;:40;;;;15568:25;;;;;;;15512:13;;15568:25;;;;;;;;;;;;;15339:262;;;:::o;39837:85::-;39897:6;;;;39896:7;39888:26;;;;;-1:-1:-1;;;39888:26:0;;;;;;;;;;;;-1:-1:-1;;;39888:26:0;;;;;;;;;;;;;;15953:269;-1:-1:-1;;;;;16028:21:0;;16020:30;;;;;;16078:12;;:23;;16095:5;16078:23;:16;:23;:::i;:::-;16063:12;:38;-1:-1:-1;;;;;16133:18:0;;:9;:18;;;;;;;;;;;:29;;16156:5;16133:29;:22;:29;:::i;:::-;-1:-1:-1;;;;;16112:18:0;;:9;:18;;;;;;;;;;;:50;;;;16178:36;;;;;;;16112:18;;:9;;16178:36;;;;;;;;;;15953:269;;:::o;43750:15277::-;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://e9ce7e97a99aaf6552b0816f09492330f07556bb8fae549e79c844e5213e05c5
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 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.