Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 34,385 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 14371995 | 1069 days ago | IN | 0 ETH | 0.00621508 | ||||
Reward | 14371984 | 1069 days ago | IN | 0 ETH | 0.00596228 | ||||
Reward | 14371964 | 1069 days ago | IN | 0 ETH | 0.00660718 | ||||
Reward | 14371945 | 1069 days ago | IN | 0 ETH | 0.00508261 | ||||
Reward | 14371925 | 1069 days ago | IN | 0 ETH | 0.00573757 | ||||
Reward | 14371834 | 1070 days ago | IN | 0 ETH | 0.00061392 | ||||
Reward | 14371834 | 1070 days ago | IN | 0 ETH | 0.00460783 | ||||
Reward | 14371707 | 1070 days ago | IN | 0 ETH | 0.00519433 | ||||
Reward | 14371250 | 1070 days ago | IN | 0 ETH | 0.00720708 | ||||
Withdraw | 14371227 | 1070 days ago | IN | 0 ETH | 0.00440466 | ||||
Reward | 14371208 | 1070 days ago | IN | 0 ETH | 0.00043465 | ||||
Reward | 14371208 | 1070 days ago | IN | 0 ETH | 0.00452862 | ||||
Reward | 14371134 | 1070 days ago | IN | 0 ETH | 0.00622922 | ||||
Reward | 14371116 | 1070 days ago | IN | 0 ETH | 0.00680875 | ||||
Reward | 14371083 | 1070 days ago | IN | 0 ETH | 0.0006349 | ||||
Reward | 14371083 | 1070 days ago | IN | 0 ETH | 0.00062997 | ||||
Reward | 14371083 | 1070 days ago | IN | 0 ETH | 0.00079566 | ||||
Reward | 14371083 | 1070 days ago | IN | 0 ETH | 0.00521191 | ||||
Reward | 14371010 | 1070 days ago | IN | 0 ETH | 0.00626025 | ||||
Reward | 14370976 | 1070 days ago | IN | 0 ETH | 0.00649047 | ||||
Reward | 14370878 | 1070 days ago | IN | 0 ETH | 0.00598471 | ||||
Reward | 14370849 | 1070 days ago | IN | 0 ETH | 0.0006088 | ||||
Reward | 14370849 | 1070 days ago | IN | 0 ETH | 0.00053647 | ||||
Reward | 14370843 | 1070 days ago | IN | 0 ETH | 0.00558172 | ||||
Reward | 14370711 | 1070 days ago | IN | 0 ETH | 0.00525197 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
11474718 | 1519 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Miner
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-12-18 */ /** * https://tornado.cash * * d888888P dP a88888b. dP * 88 88 d8' `88 88 * 88 .d8888b. 88d888b. 88d888b. .d8888b. .d888b88 .d8888b. 88 .d8888b. .d8888b. 88d888b. * 88 88' `88 88' `88 88' `88 88' `88 88' `88 88' `88 88 88' `88 Y8ooooo. 88' `88 * 88 88. .88 88 88 88 88. .88 88. .88 88. .88 dP Y8. .88 88. .88 88 88 88 * dP `88888P' dP dP dP `88888P8 `88888P8 `88888P' 88 Y88888P' `88888P8 `88888P' dP dP * ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo */ // File: contracts/interfaces/IVerifier.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.0; pragma experimental ABIEncoderV2; interface IVerifier { function verifyProof(bytes calldata proof, uint256[4] calldata input) external view returns (bool); function verifyProof(bytes calldata proof, uint256[7] calldata input) external view returns (bool); function verifyProof(bytes calldata proof, uint256[12] calldata input) external view returns (bool); } // File: contracts/interfaces/IRewardSwap.sol pragma solidity ^0.6.0; interface IRewardSwap { function swap(address recipient, uint256 amount) external returns (uint256); function setPoolWeight(uint256 newWeight) external; } // File: torn-token/contracts/ENS.sol pragma solidity ^0.6.0; interface ENS { function resolver(bytes32 node) external view returns (Resolver); } interface Resolver { function addr(bytes32 node) external view returns (address); } contract EnsResolve { function resolve(bytes32 node) public view virtual returns (address) { ENS Registry = ENS( getChainId() == 1 ? 0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e : 0x8595bFb0D940DfEDC98943FA8a907091203f25EE ); return Registry.resolver(node).addr(node); } function bulkResolve(bytes32[] memory domains) public view returns (address[] memory result) { result = new address[](domains.length); for (uint256 i = 0; i < domains.length; i++) { result[i] = resolve(domains[i]); } } function getChainId() internal pure returns (uint256) { uint256 chainId; assembly { chainId := chainid() } return chainId; } } // File: @openzeppelin/contracts/GSN/Context.sol pragma solidity ^0.6.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.6.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: contracts/interfaces/IHasher.sol pragma solidity ^0.6.0; interface IHasher { function poseidon(bytes32[2] calldata inputs) external pure returns (bytes32); function poseidon(bytes32[3] calldata inputs) external pure returns (bytes32); } // File: contracts/utils/MerkleTreeWithHistory.sol pragma solidity ^0.6.0; contract MerkleTreeWithHistory { uint256 public constant FIELD_SIZE = 21888242871839275222246405745257275088548364400416034343698204186575808495617; uint256 public constant ZERO_VALUE = 21663839004416932945382355908790599225266501822907911457504978515578255421292; // = keccak256("tornado") % FIELD_SIZE uint32 public immutable levels; IHasher public hasher; // todo immutable bytes32[] public filledSubtrees; bytes32[] public zeros; uint32 public currentRootIndex = 0; uint32 public nextIndex = 0; uint32 public constant ROOT_HISTORY_SIZE = 10; bytes32[ROOT_HISTORY_SIZE] public roots; constructor(uint32 _treeLevels, IHasher _hasher) public { require(_treeLevels > 0, "_treeLevels should be greater than zero"); require(_treeLevels < 32, "_treeLevels should be less than 32"); levels = _treeLevels; hasher = _hasher; bytes32 currentZero = bytes32(ZERO_VALUE); zeros.push(currentZero); filledSubtrees.push(currentZero); for (uint32 i = 1; i < _treeLevels; i++) { currentZero = hashLeftRight(currentZero, currentZero); zeros.push(currentZero); filledSubtrees.push(currentZero); } filledSubtrees.push(hashLeftRight(currentZero, currentZero)); roots[0] = filledSubtrees[_treeLevels]; } /** @dev Hash 2 tree leaves, returns poseidon(_left, _right) */ function hashLeftRight(bytes32 _left, bytes32 _right) public view returns (bytes32) { return hasher.poseidon([_left, _right]); } function _insert(bytes32 _leaf) internal returns (uint32 index) { uint32 currentIndex = nextIndex; require(currentIndex != uint32(2)**levels, "Merkle tree is full. No more leaves can be added"); nextIndex = currentIndex + 1; bytes32 currentLevelHash = _leaf; bytes32 left; bytes32 right; for (uint32 i = 0; i < levels; i++) { if (currentIndex % 2 == 0) { left = currentLevelHash; right = zeros[i]; filledSubtrees[i] = currentLevelHash; } else { left = filledSubtrees[i]; right = currentLevelHash; } currentLevelHash = hashLeftRight(left, right); currentIndex /= 2; } currentRootIndex = (currentRootIndex + 1) % ROOT_HISTORY_SIZE; roots[currentRootIndex] = currentLevelHash; return nextIndex - 1; } function _bulkInsert(bytes32[] memory _leaves) internal { uint32 insertIndex = nextIndex; require(insertIndex + _leaves.length <= uint32(2)**levels, "Merkle doesn't have enough capacity to add specified leaves"); bytes32[] memory subtrees = new bytes32[](levels); bool[] memory modifiedSubtrees = new bool[](levels); for (uint32 j = 0; j < _leaves.length - 1; j++) { uint256 index = insertIndex + j; bytes32 currentLevelHash = _leaves[j]; for (uint32 i = 0; ; i++) { if (index % 2 == 0) { modifiedSubtrees[i] = true; subtrees[i] = currentLevelHash; break; } if(subtrees[i] == bytes32(0)) { subtrees[i] = filledSubtrees[i]; } currentLevelHash = hashLeftRight(subtrees[i], currentLevelHash); index /= 2; } } for (uint32 i = 0; i < levels; i++) { // using local map to save on gas on writes if elements were not modified if (modifiedSubtrees[i]) { filledSubtrees[i] = subtrees[i]; } } nextIndex = uint32(insertIndex + _leaves.length - 1); _insert(_leaves[_leaves.length - 1]); } /** @dev Whether the root is present in the root history */ function isKnownRoot(bytes32 _root) public view returns (bool) { if (_root == 0) { return false; } uint32 i = currentRootIndex; do { if (_root == roots[i]) { return true; } if (i == 0) { i = ROOT_HISTORY_SIZE; } i--; } while (i != currentRootIndex); return false; } /** @dev Returns the last root */ function getLastRoot() public view returns (bytes32) { return roots[currentRootIndex]; } } // File: contracts/utils/OwnableMerkleTree.sol pragma solidity ^0.6.0; contract OwnableMerkleTree is Ownable, MerkleTreeWithHistory { constructor(uint32 _treeLevels, IHasher _hasher) public MerkleTreeWithHistory(_treeLevels, _hasher) {} function insert(bytes32 _leaf) external onlyOwner returns (uint32 index) { return _insert(_leaf); } function bulkInsert(bytes32[] calldata _leaves) external onlyOwner { _bulkInsert(_leaves); } } // File: contracts/interfaces/ITornadoTrees.sol pragma solidity ^0.6.0; interface ITornadoTrees { function registerDeposit(address instance, bytes32 commitment) external; function registerWithdrawal(address instance, bytes32 nullifier) external; } // File: contracts/TornadoTrees.sol pragma solidity ^0.6.0; contract TornadoTrees is ITornadoTrees, EnsResolve { OwnableMerkleTree public immutable depositTree; OwnableMerkleTree public immutable withdrawalTree; IHasher public immutable hasher; address public immutable tornadoProxy; bytes32[] public deposits; uint256 public lastProcessedDepositLeaf; bytes32[] public withdrawals; uint256 public lastProcessedWithdrawalLeaf; event DepositData(address instance, bytes32 indexed hash, uint256 block, uint256 index); event WithdrawalData(address instance, bytes32 indexed hash, uint256 block, uint256 index); struct TreeLeaf { address instance; bytes32 hash; uint256 block; } modifier onlyTornadoProxy { require(msg.sender == tornadoProxy, "Not authorized"); _; } constructor( bytes32 _tornadoProxy, bytes32 _hasher2, bytes32 _hasher3, uint32 _levels ) public { tornadoProxy = resolve(_tornadoProxy); hasher = IHasher(resolve(_hasher3)); depositTree = new OwnableMerkleTree(_levels, IHasher(resolve(_hasher2))); withdrawalTree = new OwnableMerkleTree(_levels, IHasher(resolve(_hasher2))); } function registerDeposit(address _instance, bytes32 _commitment) external override onlyTornadoProxy { deposits.push(keccak256(abi.encode(_instance, _commitment, blockNumber()))); } function registerWithdrawal(address _instance, bytes32 _nullifier) external override onlyTornadoProxy { withdrawals.push(keccak256(abi.encode(_instance, _nullifier, blockNumber()))); } function updateRoots(TreeLeaf[] calldata _deposits, TreeLeaf[] calldata _withdrawals) external { if (_deposits.length > 0) updateDepositTree(_deposits); if (_withdrawals.length > 0) updateWithdrawalTree(_withdrawals); } function updateDepositTree(TreeLeaf[] calldata _deposits) public { bytes32[] memory leaves = new bytes32[](_deposits.length); uint256 offset = lastProcessedDepositLeaf; for (uint256 i = 0; i < _deposits.length; i++) { TreeLeaf memory deposit = _deposits[i]; bytes32 leafHash = keccak256(abi.encode(deposit.instance, deposit.hash, deposit.block)); require(deposits[offset + i] == leafHash, "Incorrect deposit"); leaves[i] = hasher.poseidon([bytes32(uint256(deposit.instance)), deposit.hash, bytes32(deposit.block)]); delete deposits[offset + i]; emit DepositData(deposit.instance, deposit.hash, deposit.block, offset + i); } lastProcessedDepositLeaf = offset + _deposits.length; depositTree.bulkInsert(leaves); } function updateWithdrawalTree(TreeLeaf[] calldata _withdrawals) public { bytes32[] memory leaves = new bytes32[](_withdrawals.length); uint256 offset = lastProcessedWithdrawalLeaf; for (uint256 i = 0; i < _withdrawals.length; i++) { TreeLeaf memory withdrawal = _withdrawals[i]; bytes32 leafHash = keccak256(abi.encode(withdrawal.instance, withdrawal.hash, withdrawal.block)); require(withdrawals[offset + i] == leafHash, "Incorrect withdrawal"); leaves[i] = hasher.poseidon([bytes32(uint256(withdrawal.instance)), withdrawal.hash, bytes32(withdrawal.block)]); delete withdrawals[offset + i]; emit WithdrawalData(withdrawal.instance, withdrawal.hash, withdrawal.block, offset + i); } lastProcessedWithdrawalLeaf = offset + _withdrawals.length; withdrawalTree.bulkInsert(leaves); } function validateRoots(bytes32 _depositRoot, bytes32 _withdrawalRoot) public view { require(depositTree.isKnownRoot(_depositRoot), "Incorrect deposit tree root"); require(withdrawalTree.isKnownRoot(_withdrawalRoot), "Incorrect withdrawal tree root"); } function depositRoot() external view returns (bytes32) { return depositTree.getLastRoot(); } function withdrawalRoot() external view returns (bytes32) { return withdrawalTree.getLastRoot(); } function getRegisteredDeposits() external view returns (bytes32[] memory _deposits) { uint256 count = deposits.length - lastProcessedDepositLeaf; _deposits = new bytes32[](count); for (uint256 i = 0; i < count; i++) { _deposits[i] = deposits[lastProcessedDepositLeaf + i]; } } function getRegisteredWithdrawals() external view returns (bytes32[] memory _withdrawals) { uint256 count = withdrawals.length - lastProcessedWithdrawalLeaf; _withdrawals = new bytes32[](count); for (uint256 i = 0; i < count; i++) { _withdrawals[i] = withdrawals[lastProcessedWithdrawalLeaf + i]; } } function blockNumber() public view virtual returns (uint256) { return block.number; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity ^0.6.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: 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 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity ^0.6.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: contracts/Miner.sol pragma solidity ^0.6.0; contract Miner is EnsResolve { using SafeMath for uint256; IVerifier public rewardVerifier; IVerifier public withdrawVerifier; IVerifier public treeUpdateVerifier; IRewardSwap public immutable rewardSwap; address public immutable governance; TornadoTrees public tornadoTrees; mapping(bytes32 => bool) public accountNullifiers; mapping(bytes32 => bool) public rewardNullifiers; mapping(address => uint256) public rates; uint256 public accountCount; uint256 public constant ACCOUNT_ROOT_HISTORY_SIZE = 100; bytes32[ACCOUNT_ROOT_HISTORY_SIZE] public accountRoots; event NewAccount(bytes32 commitment, bytes32 nullifier, bytes encryptedAccount, uint256 index); event RateChanged(address instance, uint256 value); event VerifiersUpdated(address reward, address withdraw, address treeUpdate); struct TreeUpdateArgs { bytes32 oldRoot; bytes32 newRoot; bytes32 leaf; uint256 pathIndices; } struct AccountUpdate { bytes32 inputRoot; bytes32 inputNullifierHash; bytes32 outputRoot; uint256 outputPathIndices; bytes32 outputCommitment; } struct RewardExtData { address relayer; bytes encryptedAccount; } struct RewardArgs { uint256 rate; uint256 fee; address instance; bytes32 rewardNullifier; bytes32 extDataHash; bytes32 depositRoot; bytes32 withdrawalRoot; RewardExtData extData; AccountUpdate account; } struct WithdrawExtData { uint256 fee; address recipient; address relayer; bytes encryptedAccount; } struct WithdrawArgs { uint256 amount; bytes32 extDataHash; WithdrawExtData extData; AccountUpdate account; } struct Rate { bytes32 instance; uint256 value; } modifier onlyGovernance() { require(msg.sender == governance, "Only governance can perform this action"); _; } constructor( bytes32 _rewardSwap, bytes32 _governance, bytes32 _tornadoTrees, bytes32[3] memory _verifiers, bytes32 _accountRoot, Rate[] memory _rates ) public { rewardSwap = IRewardSwap(resolve(_rewardSwap)); governance = resolve(_governance); tornadoTrees = TornadoTrees(resolve(_tornadoTrees)); // insert empty tree root without incrementing accountCount counter accountRoots[0] = _accountRoot; _setRates(_rates); // prettier-ignore _setVerifiers([ IVerifier(resolve(_verifiers[0])), IVerifier(resolve(_verifiers[1])), IVerifier(resolve(_verifiers[2])) ]); } function reward(bytes memory _proof, RewardArgs memory _args) public { reward(_proof, _args, new bytes(0), TreeUpdateArgs(0, 0, 0, 0)); } function batchReward(bytes[] calldata _rewardArgs) external { for (uint256 i = 0; i < _rewardArgs.length; i++) { (bytes memory proof, RewardArgs memory args) = abi.decode(_rewardArgs[i], (bytes, RewardArgs)); reward(proof, args); } } function reward( bytes memory _proof, RewardArgs memory _args, bytes memory _treeUpdateProof, TreeUpdateArgs memory _treeUpdateArgs ) public { validateAccountUpdate(_args.account, _treeUpdateProof, _treeUpdateArgs); tornadoTrees.validateRoots(_args.depositRoot, _args.withdrawalRoot); require(_args.extDataHash == keccak248(abi.encode(_args.extData)), "Incorrect external data hash"); require(_args.fee < 2**248, "Fee value out of range"); require(_args.rate == rates[_args.instance] && _args.rate > 0, "Invalid reward rate"); require(!rewardNullifiers[_args.rewardNullifier], "Reward has been already spent"); require( rewardVerifier.verifyProof( _proof, [ uint256(_args.rate), uint256(_args.fee), uint256(_args.instance), uint256(_args.rewardNullifier), uint256(_args.extDataHash), uint256(_args.account.inputRoot), uint256(_args.account.inputNullifierHash), uint256(_args.account.outputRoot), uint256(_args.account.outputPathIndices), uint256(_args.account.outputCommitment), uint256(_args.depositRoot), uint256(_args.withdrawalRoot) ] ), "Invalid reward proof" ); accountNullifiers[_args.account.inputNullifierHash] = true; rewardNullifiers[_args.rewardNullifier] = true; insertAccountRoot(_args.account.inputRoot == getLastAccountRoot() ? _args.account.outputRoot : _treeUpdateArgs.newRoot); if (_args.fee > 0) { rewardSwap.swap(_args.extData.relayer, _args.fee); } emit NewAccount( _args.account.outputCommitment, _args.account.inputNullifierHash, _args.extData.encryptedAccount, accountCount - 1 ); } function withdraw(bytes memory _proof, WithdrawArgs memory _args) public { withdraw(_proof, _args, new bytes(0), TreeUpdateArgs(0, 0, 0, 0)); } function withdraw( bytes memory _proof, WithdrawArgs memory _args, bytes memory _treeUpdateProof, TreeUpdateArgs memory _treeUpdateArgs ) public { validateAccountUpdate(_args.account, _treeUpdateProof, _treeUpdateArgs); require(_args.extDataHash == keccak248(abi.encode(_args.extData)), "Incorrect external data hash"); require(_args.amount < 2**248, "Amount value out of range"); require( withdrawVerifier.verifyProof( _proof, [ uint256(_args.amount), uint256(_args.extDataHash), uint256(_args.account.inputRoot), uint256(_args.account.inputNullifierHash), uint256(_args.account.outputRoot), uint256(_args.account.outputPathIndices), uint256(_args.account.outputCommitment) ] ), "Invalid withdrawal proof" ); insertAccountRoot(_args.account.inputRoot == getLastAccountRoot() ? _args.account.outputRoot : _treeUpdateArgs.newRoot); accountNullifiers[_args.account.inputNullifierHash] = true; // allow submitting noop withdrawals (amount == 0) uint256 amount = _args.amount.sub(_args.extData.fee, "Amount should be greater than fee"); if (amount > 0) { rewardSwap.swap(_args.extData.recipient, amount); } // Note. The relayer swap rate always will be worse than estimated if (_args.extData.fee > 0) { rewardSwap.swap(_args.extData.relayer, _args.extData.fee); } emit NewAccount( _args.account.outputCommitment, _args.account.inputNullifierHash, _args.extData.encryptedAccount, accountCount - 1 ); } function setRates(Rate[] memory _rates) external onlyGovernance { _setRates(_rates); } function setVerifiers(IVerifier[3] calldata _verifiers) external onlyGovernance { _setVerifiers(_verifiers); } function setTornadoTreesContract(TornadoTrees _tornadoTrees) external onlyGovernance { tornadoTrees = _tornadoTrees; } function setPoolWeight(uint256 _newWeight) external onlyGovernance { rewardSwap.setPoolWeight(_newWeight); } // ------VIEW------- /** @dev Whether the root is present in the root history */ function isKnownAccountRoot(bytes32 _root, uint256 _index) public view returns (bool) { return _root != 0 && accountRoots[_index % ACCOUNT_ROOT_HISTORY_SIZE] == _root; } /** @dev Returns the last root */ function getLastAccountRoot() public view returns (bytes32) { return accountRoots[accountCount % ACCOUNT_ROOT_HISTORY_SIZE]; } // -----INTERNAL------- function keccak248(bytes memory _data) internal pure returns (bytes32) { return keccak256(_data) & 0x00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff; } function validateTreeUpdate( bytes memory _proof, TreeUpdateArgs memory _args, bytes32 _commitment ) internal view { require(_proof.length > 0, "Outdated account merkle root"); require(_args.oldRoot == getLastAccountRoot(), "Outdated tree update merkle root"); require(_args.leaf == _commitment, "Incorrect commitment inserted"); require(_args.pathIndices == accountCount, "Incorrect account insert index"); require( treeUpdateVerifier.verifyProof( _proof, [uint256(_args.oldRoot), uint256(_args.newRoot), uint256(_args.leaf), uint256(_args.pathIndices)] ), "Invalid tree update proof" ); } function validateAccountUpdate( AccountUpdate memory _account, bytes memory _treeUpdateProof, TreeUpdateArgs memory _treeUpdateArgs ) internal view { require(!accountNullifiers[_account.inputNullifierHash], "Outdated account state"); if (_account.inputRoot != getLastAccountRoot()) { // _account.outputPathIndices (= last tree leaf index) is always equal to root index in the history mapping // because we always generate a new root for each new leaf require(isKnownAccountRoot(_account.inputRoot, _account.outputPathIndices), "Invalid account root"); validateTreeUpdate(_treeUpdateProof, _treeUpdateArgs, _account.outputCommitment); } else { require(_account.outputPathIndices == accountCount, "Incorrect account insert index"); } } function insertAccountRoot(bytes32 _root) internal { accountRoots[++accountCount % ACCOUNT_ROOT_HISTORY_SIZE] = _root; } function _setRates(Rate[] memory _rates) internal { for (uint256 i = 0; i < _rates.length; i++) { require(_rates[i].value < 2**128, "Incorrect rate"); address instance = resolve(_rates[i].instance); rates[instance] = _rates[i].value; emit RateChanged(instance, _rates[i].value); } } function _setVerifiers(IVerifier[3] memory _verifiers) internal { rewardVerifier = _verifiers[0]; withdrawVerifier = _verifiers[1]; treeUpdateVerifier = _verifiers[2]; emit VerifiersUpdated(address(_verifiers[0]), address(_verifiers[1]), address(_verifiers[2])); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"bytes32","name":"_rewardSwap","type":"bytes32"},{"internalType":"bytes32","name":"_governance","type":"bytes32"},{"internalType":"bytes32","name":"_tornadoTrees","type":"bytes32"},{"internalType":"bytes32[3]","name":"_verifiers","type":"bytes32[3]"},{"internalType":"bytes32","name":"_accountRoot","type":"bytes32"},{"components":[{"internalType":"bytes32","name":"instance","type":"bytes32"},{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct Miner.Rate[]","name":"_rates","type":"tuple[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"commitment","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"nullifier","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"encryptedAccount","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"NewAccount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"instance","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"RateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"reward","type":"address"},{"indexed":false,"internalType":"address","name":"withdraw","type":"address"},{"indexed":false,"internalType":"address","name":"treeUpdate","type":"address"}],"name":"VerifiersUpdated","type":"event"},{"inputs":[],"name":"ACCOUNT_ROOT_HISTORY_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accountCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"accountNullifiers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"accountRoots","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"_rewardArgs","type":"bytes[]"}],"name":"batchReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"domains","type":"bytes32[]"}],"name":"bulkResolve","outputs":[{"internalType":"address[]","name":"result","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastAccountRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"isKnownAccountRoot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rates","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"resolve","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_proof","type":"bytes"},{"components":[{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"address","name":"instance","type":"address"},{"internalType":"bytes32","name":"rewardNullifier","type":"bytes32"},{"internalType":"bytes32","name":"extDataHash","type":"bytes32"},{"internalType":"bytes32","name":"depositRoot","type":"bytes32"},{"internalType":"bytes32","name":"withdrawalRoot","type":"bytes32"},{"components":[{"internalType":"address","name":"relayer","type":"address"},{"internalType":"bytes","name":"encryptedAccount","type":"bytes"}],"internalType":"struct Miner.RewardExtData","name":"extData","type":"tuple"},{"components":[{"internalType":"bytes32","name":"inputRoot","type":"bytes32"},{"internalType":"bytes32","name":"inputNullifierHash","type":"bytes32"},{"internalType":"bytes32","name":"outputRoot","type":"bytes32"},{"internalType":"uint256","name":"outputPathIndices","type":"uint256"},{"internalType":"bytes32","name":"outputCommitment","type":"bytes32"}],"internalType":"struct Miner.AccountUpdate","name":"account","type":"tuple"}],"internalType":"struct Miner.RewardArgs","name":"_args","type":"tuple"},{"internalType":"bytes","name":"_treeUpdateProof","type":"bytes"},{"components":[{"internalType":"bytes32","name":"oldRoot","type":"bytes32"},{"internalType":"bytes32","name":"newRoot","type":"bytes32"},{"internalType":"bytes32","name":"leaf","type":"bytes32"},{"internalType":"uint256","name":"pathIndices","type":"uint256"}],"internalType":"struct Miner.TreeUpdateArgs","name":"_treeUpdateArgs","type":"tuple"}],"name":"reward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_proof","type":"bytes"},{"components":[{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"address","name":"instance","type":"address"},{"internalType":"bytes32","name":"rewardNullifier","type":"bytes32"},{"internalType":"bytes32","name":"extDataHash","type":"bytes32"},{"internalType":"bytes32","name":"depositRoot","type":"bytes32"},{"internalType":"bytes32","name":"withdrawalRoot","type":"bytes32"},{"components":[{"internalType":"address","name":"relayer","type":"address"},{"internalType":"bytes","name":"encryptedAccount","type":"bytes"}],"internalType":"struct Miner.RewardExtData","name":"extData","type":"tuple"},{"components":[{"internalType":"bytes32","name":"inputRoot","type":"bytes32"},{"internalType":"bytes32","name":"inputNullifierHash","type":"bytes32"},{"internalType":"bytes32","name":"outputRoot","type":"bytes32"},{"internalType":"uint256","name":"outputPathIndices","type":"uint256"},{"internalType":"bytes32","name":"outputCommitment","type":"bytes32"}],"internalType":"struct Miner.AccountUpdate","name":"account","type":"tuple"}],"internalType":"struct Miner.RewardArgs","name":"_args","type":"tuple"}],"name":"reward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"rewardNullifiers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardSwap","outputs":[{"internalType":"contract IRewardSwap","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardVerifier","outputs":[{"internalType":"contract IVerifier","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newWeight","type":"uint256"}],"name":"setPoolWeight","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"instance","type":"bytes32"},{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct Miner.Rate[]","name":"_rates","type":"tuple[]"}],"name":"setRates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract TornadoTrees","name":"_tornadoTrees","type":"address"}],"name":"setTornadoTreesContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IVerifier[3]","name":"_verifiers","type":"address[3]"}],"name":"setVerifiers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tornadoTrees","outputs":[{"internalType":"contract TornadoTrees","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treeUpdateVerifier","outputs":[{"internalType":"contract IVerifier","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_proof","type":"bytes"},{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"extDataHash","type":"bytes32"},{"components":[{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"address","name":"relayer","type":"address"},{"internalType":"bytes","name":"encryptedAccount","type":"bytes"}],"internalType":"struct Miner.WithdrawExtData","name":"extData","type":"tuple"},{"components":[{"internalType":"bytes32","name":"inputRoot","type":"bytes32"},{"internalType":"bytes32","name":"inputNullifierHash","type":"bytes32"},{"internalType":"bytes32","name":"outputRoot","type":"bytes32"},{"internalType":"uint256","name":"outputPathIndices","type":"uint256"},{"internalType":"bytes32","name":"outputCommitment","type":"bytes32"}],"internalType":"struct Miner.AccountUpdate","name":"account","type":"tuple"}],"internalType":"struct Miner.WithdrawArgs","name":"_args","type":"tuple"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_proof","type":"bytes"},{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"extDataHash","type":"bytes32"},{"components":[{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"address","name":"relayer","type":"address"},{"internalType":"bytes","name":"encryptedAccount","type":"bytes"}],"internalType":"struct Miner.WithdrawExtData","name":"extData","type":"tuple"},{"components":[{"internalType":"bytes32","name":"inputRoot","type":"bytes32"},{"internalType":"bytes32","name":"inputNullifierHash","type":"bytes32"},{"internalType":"bytes32","name":"outputRoot","type":"bytes32"},{"internalType":"uint256","name":"outputPathIndices","type":"uint256"},{"internalType":"bytes32","name":"outputCommitment","type":"bytes32"}],"internalType":"struct Miner.AccountUpdate","name":"account","type":"tuple"}],"internalType":"struct Miner.WithdrawArgs","name":"_args","type":"tuple"},{"internalType":"bytes","name":"_treeUpdateProof","type":"bytes"},{"components":[{"internalType":"bytes32","name":"oldRoot","type":"bytes32"},{"internalType":"bytes32","name":"newRoot","type":"bytes32"},{"internalType":"bytes32","name":"leaf","type":"bytes32"},{"internalType":"uint256","name":"pathIndices","type":"uint256"}],"internalType":"struct Miner.TreeUpdateArgs","name":"_treeUpdateArgs","type":"tuple"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawVerifier","outputs":[{"internalType":"contract IVerifier","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c06040523480156200001157600080fd5b50604051620029e3380380620029e3833981016040819052620000349162000507565b6200003f8662000126565b60601b6001600160601b0319166080526200005a8562000126565b60601b6001600160601b03191660a052620000758462000126565b600380546001600160a01b0319166001600160a01b039290921691909117905581600860000155620000a78162000274565b6200011a6040518060600160405280620000d386600060038110620000c857fe5b602002015162000126565b6001600160a01b03168152602001620000ee866001620000c8565b6001600160a01b0316815260200162000109866002620000c8565b6001600160a01b0316905262000398565b50505050505062000673565b6000806200013362000420565b6001146200015657738595bfb0d940dfedc98943fa8a907091203f25ee62000167565b6e0c2e074ec69a0dfb2997ba6c7d2e1e5b604051630178b8bf60e01b81529091506001600160a01b03821690630178b8bf906200019890869060040162000602565b60206040518083038186803b158015620001b157600080fd5b505afa158015620001c6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001ec9190620004e8565b6001600160a01b0316633b3b57de846040518263ffffffff1660e01b815260040162000219919062000602565b60206040518083038186803b1580156200023257600080fd5b505afa15801562000247573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200026d9190620004e8565b9392505050565b60005b81518110156200039457600160801b8282815181106200029357fe5b60200260200101516020015110620002c85760405162461bcd60e51b8152600401620002bf906200060b565b60405180910390fd5b6000620002f3838381518110620002db57fe5b6020026020010151600001516200012660201b60201c565b90508282815181106200030257fe5b60200260200101516020015160066000836001600160a01b03166001600160a01b03168152602001908152602001600020819055507f14eccc240e5ba9a72e0ca955584fe1b0dca7104fce4dcb1296edbba8eea2da04818484815181106200036657fe5b60200260200101516020015160405162000382929190620005e9565b60405180910390a15060010162000277565b5050565b8051600080546001600160a01b038084166001600160a01b03199283161790925560208401516001805482851690841617905560408086015160028054958216959094169490941790925590517fcdb44c0a599b75813fe4a4593f032c7cfd38aa9e6461ba99a31aba3540b50210936200041593909291620005c6565b60405180910390a150565b4690565b600082601f83011262000435578081fd5b81516001600160401b038111156200044b578182fd5b60206200045c818284020162000633565b82815292508083018482016040808502870184018810156200047d57600080fd5b60005b85811015620004a857620004958984620004b4565b8452928401929181019160010162000480565b50505050505092915050565b600060408284031215620004c6578081fd5b620004d2604062000633565b9050815181526020820151602082015292915050565b600060208284031215620004fa578081fd5b81516200026d816200065a565b600080600080600080610100878903121562000521578182fd5b8651955060208088015195506040880151945088607f89011262000543578283fd5b6200054f606062000633565b8060608a0160c08b018c81111562000565578687fd5b865b6003811015620005865782518552938501939185019160010162000567565b505160e08c0151929750955090925050506001600160401b03811115620005ab578182fd5b620005b989828a0162000424565b9150509295509295509295565b6001600160a01b0393841681529183166020830152909116604082015260600190565b6001600160a01b03929092168252602082015260400190565b90815260200190565b6020808252600e908201526d496e636f7272656374207261746560901b604082015260600190565b6040518181016001600160401b03811182821017156200065257600080fd5b604052919050565b6001600160a01b03811681146200067057600080fd5b50565b60805160601c60a05160601c61231e620006c56000398061039552806103fd52806109a35280610e885280610ef852508061088b52806109765280610cc75280610d7e5280610f4c525061231e6000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c80637d9af914116100de578063c6a4b05311610097578063e53c4cab11610071578063e53c4cab146102e1578063f9406cf3146102f4578063f945a17e146102fc578063f9e542341461030f57610173565b8063c6a4b053146102b3578063e2658c9c146102c6578063e4af29fc146102d957610173565b80637d9af9141461024c57806380bc50cc1461025f578063864eb1641461027257806397f098d71461027a578063a8734f0b1461028d578063c2c26775146102a057610173565b806352ef8e961161013057806352ef8e96146101fb5780635aa6e675146102035780635c23bdf51461020b578063637c09631461021e57806366e6e60d1461023157806377c55be51461023957610173565b80631311b6e81461017857806334239b95146101965780633cb837fd146101b657806342a660b0146101cb578063495e6437146101de5780634a20de58146101f3575b600080fd5b61018061032f565b60405161018d9190611d47565b60405180910390f35b6101a96101a4366004611a60565b610351565b60405161018d9190611d3c565b6101be610366565b60405161018d9190611c9f565b6101a96101d9366004611a60565b610375565b6101f16101ec36600461198a565b61038a565b005b6101be6103e7565b6101806103f6565b6101be6103fb565b6101be610219366004611a60565b61041f565b6101f161022c366004611af9565b61055d565b6101be610974565b6101f161024736600461196a565b610998565b6101f161025a366004611b8e565b610a0e565b6101f161026d366004611a99565b610a47565b6101be610a7c565b6101a9610288366004611a78565b610a8b565b61018061029b366004611830565b610ab5565b6101f16102ae366004611be4565b610ac7565b6101806102c1366004611a60565b610e69565b6101f16102d4366004611830565b610e7d565b610180610ee7565b6101f16102ef366004611a60565b610eed565b6101be610fb6565b6101f161030a3660046118fc565b610fc5565b61032261031d366004611868565b611022565b60405161018d9190611cef565b6000600860646007548161033f57fe5b066064811061034a57fe5b0154905090565b60056020526000908152604090205460ff1681565b6003546001600160a01b031681565b60046020526000908152604090205460ff1681565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146103db5760405162461bcd60e51b81526004016103d290611fbd565b60405180910390fd5b6103e4816110c2565b50565b6002546001600160a01b031681565b606481565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008061042a6111c6565b60011461044b57738595bfb0d940dfedc98943fa8a907091203f25ee61045c565b6e0c2e074ec69a0dfb2997ba6c7d2e1e5b604051630178b8bf60e01b81529091506001600160a01b03821690630178b8bf9061048b908690600401611d47565b60206040518083038186803b1580156104a357600080fd5b505afa1580156104b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104db919061184c565b6001600160a01b0316633b3b57de846040518263ffffffff1660e01b81526004016105069190611d47565b60206040518083038186803b15801561051e57600080fd5b505afa158015610532573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610556919061184c565b9392505050565b61056d83610100015183836111ca565b60035460a084015160c085015160405163c11b968160e01b81526001600160a01b039093169263c11b9681926105a7929091600401611d50565b60006040518083038186803b1580156105bf57600080fd5b505afa1580156105d3573d6000803e3d6000fd5b505050506106038360e001516040516020016105ef91906121a6565b604051602081830303815290604052611275565b8360800151146106255760405162461bcd60e51b81526004016103d290611f1f565b600160f81b83602001511061064c5760405162461bcd60e51b81526004016103d290611f8d565b6040808401516001600160a01b031660009081526006602052205483511480156106765750825115155b6106925760405162461bcd60e51b81526004016103d290611e61565b606083015160009081526005602052604090205460ff16156106c65760405162461bcd60e51b81526004016103d290612138565b60005460408051610180810182528551815260208087015181830152868301516001600160a01b0390811683850152606080890151818501526080808a0151818601526101008a810180515160a08089019190915281519096015160c080890191909152815189015160e0890152815190940151918701919091525101516101208501529188015161014084015290870151610160830152915163393ba7b960e11b815291909216916372774f7291610783918891600401611d8e565b60206040518083038186803b15801561079b57600080fd5b505afa1580156107af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d39190611a40565b6107ef5760405162461bcd60e51b81526004016103d290611ebc565b61010083015160209081015160009081526004825260408082208054600160ff1991821681179092556060880151845260059094529120805490921617905561085f61083961032f565b610100850151511461084f57816020015161085a565b836101000151604001515b611289565b6020830151156109125760e083015151602084015160405163d004f0f760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263d004f0f7926108be92600401611cd6565b602060405180830381600087803b1580156108d857600080fd5b505af11580156108ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109109190611c3c565b505b7fbd4a5ca11c6f082fd6d00dc9d1dced6ab22490039bc36154bfa748bf2bf7435583610100015160800151846101000151602001518560e00151602001516001600754036040516109669493929190611d5e565b60405180910390a150505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109e05760405162461bcd60e51b81526004016103d290611fbd565b6040805160608181019092526103e491839060039083908390808284376000920191909152506112ac915050565b60408051600080825260a08201835260208201818152928201819052606082018190526080820152610a439184918491610ac7565b5050565b60408051600080825260a08201835260208201818152928201819052606082018190526080820152610a43918491849161055d565b6001546001600160a01b031681565b60008215801590610aac57508260086064840660648110610aa857fe5b0154145b90505b92915050565b60066020526000908152604090205481565b610ad6836060015183836111ca565b610aee83604001516040516020016105ef91906121db565b836020015114610b105760405162461bcd60e51b81526004016103d290611f1f565b8251600160f81b11610b345760405162461bcd60e51b81526004016103d29061216f565b6001546040805160e081018252855181526020808701518183015260608088018051518486015280519092015181840152815184015160808085019190915282519091015160a08401529051015160c0820152905163598da1d160e01b81526001600160a01b039092169163598da1d191610bb491889190600401611e11565b60206040518083038186803b158015610bcc57600080fd5b505afa158015610be0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c049190611a40565b610c205760405162461bcd60e51b81526004016103d2906120a9565b610c4e610c2b61032f565b60608501515114610c4057816020015161085a565b836060015160400151611289565b6060808401516020908101516000908152600482526040808220805460ff191660011790558087015151815194850190915260218085529193610c9f93919290916122c89083013986519190611332565b90508015610d515760408085015160200151905163d004f0f760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163d004f0f791610cfd91908590600401611cd6565b602060405180830381600087803b158015610d1757600080fd5b505af1158015610d2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4f9190611c3c565b505b60408401515115610e0857604080850151808201519051915163d004f0f760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263d004f0f792610db492909190600401611cd6565b602060405180830381600087803b158015610dce57600080fd5b505af1158015610de2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e069190611c3c565b505b7fbd4a5ca11c6f082fd6d00dc9d1dced6ab22490039bc36154bfa748bf2bf74355846060015160800151856060015160200151866040015160600151600160075403604051610e5a9493929190611d5e565b60405180910390a15050505050565b60088160648110610e7657fe5b0154905081565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ec55760405162461bcd60e51b81526004016103d290611fbd565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b60075481565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f355760405162461bcd60e51b81526004016103d290611fbd565b60405163e53c4cab60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e53c4cab90610f81908490600401611d47565b600060405180830381600087803b158015610f9b57600080fd5b505af1158015610faf573d6000803e3d6000fd5b5050505050565b6000546001600160a01b031681565b60005b8181101561101d576060610fda6114b4565b848484818110610fe657fe5b9050602002810190610ff89190612222565b8101906110059190611a99565b915091506110138282610a47565b5050600101610fc8565b505050565b606081516001600160401b038111801561103b57600080fd5b50604051908082528060200260200182016040528015611065578160200160208202803683370190505b50905060005b82518110156110bc5761109083828151811061108357fe5b602002602001015161041f565b82828151811061109c57fe5b6001600160a01b039092166020928302919091019091015260010161106b565b50919050565b60005b8151811015610a4357600160801b8282815181106110df57fe5b602002602001015160200151106111085760405162461bcd60e51b81526004016103d290612110565b600061112a83838151811061111957fe5b60200260200101516000015161041f565b905082828151811061113857fe5b60200260200101516020015160066000836001600160a01b03166001600160a01b03168152602001908152602001600020819055507f14eccc240e5ba9a72e0ca955584fe1b0dca7104fce4dcb1296edbba8eea2da048184848151811061119b57fe5b6020026020010151602001516040516111b5929190611cd6565b60405180910390a1506001016110c5565b4690565b60208084015160009081526004909152604090205460ff16156111ff5760405162461bcd60e51b81526004016103d2906120e0565b61120761032f565b8351146112505761122083600001518460600151610a8b565b61123c5760405162461bcd60e51b81526004016103d290611e8e565b61124b8282856080015161135e565b61101d565b60075483606001511461101d5760405162461bcd60e51b81526004016103d290611f56565b80516020909101206001600160f81b031690565b6007805460010190819055819060089060649006606481106112a757fe5b015550565b8051600080546001600160a01b038084166001600160a01b03199283161790925560208401516001805482851690841617905560408086015160028054958216959094169490941790925590517fcdb44c0a599b75813fe4a4593f032c7cfd38aa9e6461ba99a31aba3540b502109361132793909291611cb3565b60405180910390a150565b600081848411156113565760405162461bcd60e51b81526004016103d29190611e4e565b505050900390565b600083511161137f5760405162461bcd60e51b81526004016103d290612004565b61138761032f565b8251146113a65760405162461bcd60e51b81526004016103d290611eea565b808260400151146113c95760405162461bcd60e51b81526004016103d29061203b565b6007548260600151146113ee5760405162461bcd60e51b81526004016103d290611f56565b60025460408051608081018252845181526020808601519082015284820151818301526060808601519082015290516335f8315960e11b81526001600160a01b0390921691636bf062b29161144891879190600401611dd6565b60206040518083038186803b15801561146057600080fd5b505afa158015611474573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114989190611a40565b61101d5760405162461bcd60e51b81526004016103d290612072565b6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915260e081016114fa61150c565b8152602001611507611524565b905290565b60408051808201909152600081526060602082015290565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915290565b8035610aaf816122b2565b600082601f83011261156d578081fd5b81356001600160401b03811115611582578182fd5b611595601f8201601f191660200161226d565b91508082528360208285010111156115ac57600080fd5b8060208401602084013760009082016020015292915050565b600060a082840312156115d6578081fd5b6115e060a061226d565b9050813581526020820135602082015260408201356040820152606082013560608201526080820135608082015292915050565b60006101a08284031215611626578081fd5b61163161012061226d565b9050813581526020820135602082015261164e8360408401611552565b6040820152606082013560608201526080820135608082015260a082013560a082015260c082013560c082015260e08201356001600160401b0381111561169457600080fd5b6116a0848285016116bf565b60e0830152506101006116b5848285016115c5565b9082015292915050565b6000604082840312156116d0578081fd5b6116da604061226d565b905081356116e7816122b2565b815260208201356001600160401b0381111561170257600080fd5b61170e8482850161155d565b60208301525092915050565b60006080828403121561172b578081fd5b611735608061226d565b90508135815260208201356020820152604082013560408201526060820135606082015292915050565b60006101008284031215611771578081fd5b61177b608061226d565b9050813581526020820135602082015260408201356001600160401b03808211156117a557600080fd5b90830190608082860312156117b957600080fd5b6117c3608061226d565b823581526117d48660208501611552565b60208201526117e68660408501611552565b60408201526060830135828111156117fd57600080fd5b6118098782860161155d565b60608301525080604085015250505061182583606084016115c5565b606082015292915050565b600060208284031215611841578081fd5b8135610556816122b2565b60006020828403121561185d578081fd5b8151610556816122b2565b6000602080838503121561187a578182fd5b82356001600160401b0381111561188f578283fd5b8301601f8101851361189f578283fd5b80356118b26118ad82612293565b61226d565b81815283810190838501858402850186018910156118ce578687fd5b8694505b838510156118f05780358352600194909401939185019185016118d2565b50979650505050505050565b6000806020838503121561190e578081fd5b82356001600160401b0380821115611924578283fd5b818501915085601f830112611937578283fd5b813581811115611945578384fd5b8660208083028501011115611958578384fd5b60209290920196919550909350505050565b60006060828403121561197b578081fd5b826060830111156110bc578081fd5b6000602080838503121561199c578182fd5b82356001600160401b038111156119b1578283fd5b8301601f810185136119c1578283fd5b80356119cf6118ad82612293565b818152838101908385016040808502860187018a10156119ed578788fd5b8795505b84861015611a325780828b031215611a07578788fd5b611a108161226d565b82358152878301358882015284526001959095019492860192908101906119f1565b509098975050505050505050565b600060208284031215611a51578081fd5b81518015158114610556578182fd5b600060208284031215611a71578081fd5b5035919050565b60008060408385031215611a8a578182fd5b50508035926020909101359150565b60008060408385031215611aab578182fd5b82356001600160401b0380821115611ac1578384fd5b611acd8683870161155d565b93506020850135915080821115611ae2578283fd5b50611aef85828601611614565b9150509250929050565b60008060008060e08587031215611b0e578182fd5b84356001600160401b0380821115611b24578384fd5b611b308883890161155d565b95506020870135915080821115611b45578384fd5b611b5188838901611614565b94506040870135915080821115611b66578384fd5b50611b738782880161155d565b925050611b83866060870161171a565b905092959194509250565b60008060408385031215611ba0578182fd5b82356001600160401b0380821115611bb6578384fd5b611bc28683870161155d565b93506020850135915080821115611bd7578283fd5b50611aef8582860161175f565b60008060008060e08587031215611bf9578182fd5b84356001600160401b0380821115611c0f578384fd5b611c1b8883890161155d565b95506020870135915080821115611c30578384fd5b611b518883890161175f565b600060208284031215611c4d578081fd5b5051919050565b60008151808452815b81811015611c7957602081850181015186830182015201611c5d565b81811115611c8a5782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0393841681529183166020830152909116604082015260600190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015611d305783516001600160a01b031683529284019291840191600101611d0b565b50909695505050505050565b901515815260200190565b90815260200190565b918252602082015260400190565b600085825284602083015260806040830152611d7d6080830185611c54565b905082606083015295945050505050565b60006101a0808352611da281840186611c54565b91505060208083018460005b600c811015611dcb57815183529183019190830190600101611dae565b505050509392505050565b600060a08252611de960a0830185611c54565b905060208083018460005b6004811015611dcb57815183529183019190830190600101611df4565b6000610100808352611e2581840186611c54565b91505060208083018460005b6007811015611dcb57815183529183019190830190600101611e31565b600060208252610aac6020830184611c54565b602080825260139082015272496e76616c696420726577617264207261746560681b604082015260600190565b602080825260149082015273125b9d985b1a59081858d8dbdd5b9d081c9bdbdd60621b604082015260600190565b60208082526014908201527324b73b30b634b2103932bbb0b93210383937b7b360611b604082015260600190565b6020808252818101527f4f75746461746564207472656520757064617465206d65726b6c6520726f6f74604082015260600190565b6020808252601c908201527f496e636f72726563742065787465726e616c2064617461206861736800000000604082015260600190565b6020808252601e908201527f496e636f7272656374206163636f756e7420696e7365727420696e6465780000604082015260600190565b6020808252601690820152754665652076616c7565206f7574206f662072616e676560501b604082015260600190565b60208082526027908201527f4f6e6c7920676f7665726e616e63652063616e20706572666f726d20746869736040820152661030b1ba34b7b760c91b606082015260800190565b6020808252601c908201527f4f75746461746564206163636f756e74206d65726b6c6520726f6f7400000000604082015260600190565b6020808252601d908201527f496e636f727265637420636f6d6d69746d656e7420696e736572746564000000604082015260600190565b60208082526019908201527f496e76616c69642074726565207570646174652070726f6f6600000000000000604082015260600190565b60208082526018908201527f496e76616c6964207769746864726177616c2070726f6f660000000000000000604082015260600190565b6020808252601690820152754f75746461746564206163636f756e7420737461746560501b604082015260600190565b6020808252600e908201526d496e636f7272656374207261746560901b604082015260600190565b6020808252601d908201527f52657761726420686173206265656e20616c7265616479207370656e74000000604082015260600190565b60208082526019908201527f416d6f756e742076616c7565206f7574206f662072616e676500000000000000604082015260600190565b602080825282516001600160a01b0316828201528201516040808301526000906121d36060840182611c54565b949350505050565b60006020825282516020830152602083015160018060a01b038082166040850152806040860151166060850152505060608301516080808401526121d360a0840182611c54565b6000808335601e19843603018112612238578283fd5b8301803591506001600160401b03821115612251578283fd5b60200191503681900382131561226657600080fd5b9250929050565b6040518181016001600160401b038111828210171561228b57600080fd5b604052919050565b60006001600160401b038211156122a8578081fd5b5060209081020190565b6001600160a01b03811681146103e457600080fdfe416d6f756e742073686f756c642062652067726561746572207468616e20666565a26469706673582212201ce4490a9602839876fe9668dd0d550aac3b551bf27150c591e321ac21daf4cc64736f6c634300060c0033f06c24d1d0c5da2628caf6a7912f231ca834476d6c3505f1fb8e5926ab7f9ba594d63e9067c3ab2d966702f604484c43b5ea247ecd08c28762caa50df5dc02bdf364752a68271f46f4a51f0ccd3ecaf066404a7a1cdfc0687e213360662586306016a87815201af7399a07a43aab1af334e85c9fe43aa35026012cde9b5d23fba6a8f1f25e21baffc58dcecb043a994f9e940ec8971a903e48518609e3ade2f53ebe6d0e58fe1b929d4482eac2a7b7e760d1863a0cad5a84ab2c5d48b8ce171b29f9a0a07a22ab214d00aaa0190f54509e853f3119009baecb0035347606b0a900000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000004c041982b4f77cbbd82ef3b9ea748738ac6c281d3f1af198770d29f75ac32d80a000000000000000000000000000000000000000000000000000000000000000a9e5bc9215eecd103644145a5db4f69d5efaf4885bb5bf968f8db271ec5cd539b0000000000000000000000000000000000000000000000000000000000000014917e42347647689051abc744f502bff342c76ad30c0670b46b305b2f7e1f893d0000000000000000000000000000000000000000000000000000000000000032ddfc726d74f912f49389ef7471e75291969852ce7e5df0509a17bc1e466469850000000000000000000000000000000000000000000000000000000000000190
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101735760003560e01c80637d9af914116100de578063c6a4b05311610097578063e53c4cab11610071578063e53c4cab146102e1578063f9406cf3146102f4578063f945a17e146102fc578063f9e542341461030f57610173565b8063c6a4b053146102b3578063e2658c9c146102c6578063e4af29fc146102d957610173565b80637d9af9141461024c57806380bc50cc1461025f578063864eb1641461027257806397f098d71461027a578063a8734f0b1461028d578063c2c26775146102a057610173565b806352ef8e961161013057806352ef8e96146101fb5780635aa6e675146102035780635c23bdf51461020b578063637c09631461021e57806366e6e60d1461023157806377c55be51461023957610173565b80631311b6e81461017857806334239b95146101965780633cb837fd146101b657806342a660b0146101cb578063495e6437146101de5780634a20de58146101f3575b600080fd5b61018061032f565b60405161018d9190611d47565b60405180910390f35b6101a96101a4366004611a60565b610351565b60405161018d9190611d3c565b6101be610366565b60405161018d9190611c9f565b6101a96101d9366004611a60565b610375565b6101f16101ec36600461198a565b61038a565b005b6101be6103e7565b6101806103f6565b6101be6103fb565b6101be610219366004611a60565b61041f565b6101f161022c366004611af9565b61055d565b6101be610974565b6101f161024736600461196a565b610998565b6101f161025a366004611b8e565b610a0e565b6101f161026d366004611a99565b610a47565b6101be610a7c565b6101a9610288366004611a78565b610a8b565b61018061029b366004611830565b610ab5565b6101f16102ae366004611be4565b610ac7565b6101806102c1366004611a60565b610e69565b6101f16102d4366004611830565b610e7d565b610180610ee7565b6101f16102ef366004611a60565b610eed565b6101be610fb6565b6101f161030a3660046118fc565b610fc5565b61032261031d366004611868565b611022565b60405161018d9190611cef565b6000600860646007548161033f57fe5b066064811061034a57fe5b0154905090565b60056020526000908152604090205460ff1681565b6003546001600160a01b031681565b60046020526000908152604090205460ff1681565b336001600160a01b037f0000000000000000000000005efda50f22d34f262c29268506c5fa42cb56a1ce16146103db5760405162461bcd60e51b81526004016103d290611fbd565b60405180910390fd5b6103e4816110c2565b50565b6002546001600160a01b031681565b606481565b7f0000000000000000000000005efda50f22d34f262c29268506c5fa42cb56a1ce81565b60008061042a6111c6565b60011461044b57738595bfb0d940dfedc98943fa8a907091203f25ee61045c565b6e0c2e074ec69a0dfb2997ba6c7d2e1e5b604051630178b8bf60e01b81529091506001600160a01b03821690630178b8bf9061048b908690600401611d47565b60206040518083038186803b1580156104a357600080fd5b505afa1580156104b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104db919061184c565b6001600160a01b0316633b3b57de846040518263ffffffff1660e01b81526004016105069190611d47565b60206040518083038186803b15801561051e57600080fd5b505afa158015610532573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610556919061184c565b9392505050565b61056d83610100015183836111ca565b60035460a084015160c085015160405163c11b968160e01b81526001600160a01b039093169263c11b9681926105a7929091600401611d50565b60006040518083038186803b1580156105bf57600080fd5b505afa1580156105d3573d6000803e3d6000fd5b505050506106038360e001516040516020016105ef91906121a6565b604051602081830303815290604052611275565b8360800151146106255760405162461bcd60e51b81526004016103d290611f1f565b600160f81b83602001511061064c5760405162461bcd60e51b81526004016103d290611f8d565b6040808401516001600160a01b031660009081526006602052205483511480156106765750825115155b6106925760405162461bcd60e51b81526004016103d290611e61565b606083015160009081526005602052604090205460ff16156106c65760405162461bcd60e51b81526004016103d290612138565b60005460408051610180810182528551815260208087015181830152868301516001600160a01b0390811683850152606080890151818501526080808a0151818601526101008a810180515160a08089019190915281519096015160c080890191909152815189015160e0890152815190940151918701919091525101516101208501529188015161014084015290870151610160830152915163393ba7b960e11b815291909216916372774f7291610783918891600401611d8e565b60206040518083038186803b15801561079b57600080fd5b505afa1580156107af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d39190611a40565b6107ef5760405162461bcd60e51b81526004016103d290611ebc565b61010083015160209081015160009081526004825260408082208054600160ff1991821681179092556060880151845260059094529120805490921617905561085f61083961032f565b610100850151511461084f57816020015161085a565b836101000151604001515b611289565b6020830151156109125760e083015151602084015160405163d004f0f760e01b81526001600160a01b037f0000000000000000000000005cab7692d4e94096462119ab7bf57319726eed2a169263d004f0f7926108be92600401611cd6565b602060405180830381600087803b1580156108d857600080fd5b505af11580156108ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109109190611c3c565b505b7fbd4a5ca11c6f082fd6d00dc9d1dced6ab22490039bc36154bfa748bf2bf7435583610100015160800151846101000151602001518560e00151602001516001600754036040516109669493929190611d5e565b60405180910390a150505050565b7f0000000000000000000000005cab7692d4e94096462119ab7bf57319726eed2a81565b336001600160a01b037f0000000000000000000000005efda50f22d34f262c29268506c5fa42cb56a1ce16146109e05760405162461bcd60e51b81526004016103d290611fbd565b6040805160608181019092526103e491839060039083908390808284376000920191909152506112ac915050565b60408051600080825260a08201835260208201818152928201819052606082018190526080820152610a439184918491610ac7565b5050565b60408051600080825260a08201835260208201818152928201819052606082018190526080820152610a43918491849161055d565b6001546001600160a01b031681565b60008215801590610aac57508260086064840660648110610aa857fe5b0154145b90505b92915050565b60066020526000908152604090205481565b610ad6836060015183836111ca565b610aee83604001516040516020016105ef91906121db565b836020015114610b105760405162461bcd60e51b81526004016103d290611f1f565b8251600160f81b11610b345760405162461bcd60e51b81526004016103d29061216f565b6001546040805160e081018252855181526020808701518183015260608088018051518486015280519092015181840152815184015160808085019190915282519091015160a08401529051015160c0820152905163598da1d160e01b81526001600160a01b039092169163598da1d191610bb491889190600401611e11565b60206040518083038186803b158015610bcc57600080fd5b505afa158015610be0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c049190611a40565b610c205760405162461bcd60e51b81526004016103d2906120a9565b610c4e610c2b61032f565b60608501515114610c4057816020015161085a565b836060015160400151611289565b6060808401516020908101516000908152600482526040808220805460ff191660011790558087015151815194850190915260218085529193610c9f93919290916122c89083013986519190611332565b90508015610d515760408085015160200151905163d004f0f760e01b81526001600160a01b037f0000000000000000000000005cab7692d4e94096462119ab7bf57319726eed2a169163d004f0f791610cfd91908590600401611cd6565b602060405180830381600087803b158015610d1757600080fd5b505af1158015610d2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4f9190611c3c565b505b60408401515115610e0857604080850151808201519051915163d004f0f760e01b81526001600160a01b037f0000000000000000000000005cab7692d4e94096462119ab7bf57319726eed2a169263d004f0f792610db492909190600401611cd6565b602060405180830381600087803b158015610dce57600080fd5b505af1158015610de2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e069190611c3c565b505b7fbd4a5ca11c6f082fd6d00dc9d1dced6ab22490039bc36154bfa748bf2bf74355846060015160800151856060015160200151866040015160600151600160075403604051610e5a9493929190611d5e565b60405180910390a15050505050565b60088160648110610e7657fe5b0154905081565b336001600160a01b037f0000000000000000000000005efda50f22d34f262c29268506c5fa42cb56a1ce1614610ec55760405162461bcd60e51b81526004016103d290611fbd565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b60075481565b336001600160a01b037f0000000000000000000000005efda50f22d34f262c29268506c5fa42cb56a1ce1614610f355760405162461bcd60e51b81526004016103d290611fbd565b60405163e53c4cab60e01b81526001600160a01b037f0000000000000000000000005cab7692d4e94096462119ab7bf57319726eed2a169063e53c4cab90610f81908490600401611d47565b600060405180830381600087803b158015610f9b57600080fd5b505af1158015610faf573d6000803e3d6000fd5b5050505050565b6000546001600160a01b031681565b60005b8181101561101d576060610fda6114b4565b848484818110610fe657fe5b9050602002810190610ff89190612222565b8101906110059190611a99565b915091506110138282610a47565b5050600101610fc8565b505050565b606081516001600160401b038111801561103b57600080fd5b50604051908082528060200260200182016040528015611065578160200160208202803683370190505b50905060005b82518110156110bc5761109083828151811061108357fe5b602002602001015161041f565b82828151811061109c57fe5b6001600160a01b039092166020928302919091019091015260010161106b565b50919050565b60005b8151811015610a4357600160801b8282815181106110df57fe5b602002602001015160200151106111085760405162461bcd60e51b81526004016103d290612110565b600061112a83838151811061111957fe5b60200260200101516000015161041f565b905082828151811061113857fe5b60200260200101516020015160066000836001600160a01b03166001600160a01b03168152602001908152602001600020819055507f14eccc240e5ba9a72e0ca955584fe1b0dca7104fce4dcb1296edbba8eea2da048184848151811061119b57fe5b6020026020010151602001516040516111b5929190611cd6565b60405180910390a1506001016110c5565b4690565b60208084015160009081526004909152604090205460ff16156111ff5760405162461bcd60e51b81526004016103d2906120e0565b61120761032f565b8351146112505761122083600001518460600151610a8b565b61123c5760405162461bcd60e51b81526004016103d290611e8e565b61124b8282856080015161135e565b61101d565b60075483606001511461101d5760405162461bcd60e51b81526004016103d290611f56565b80516020909101206001600160f81b031690565b6007805460010190819055819060089060649006606481106112a757fe5b015550565b8051600080546001600160a01b038084166001600160a01b03199283161790925560208401516001805482851690841617905560408086015160028054958216959094169490941790925590517fcdb44c0a599b75813fe4a4593f032c7cfd38aa9e6461ba99a31aba3540b502109361132793909291611cb3565b60405180910390a150565b600081848411156113565760405162461bcd60e51b81526004016103d29190611e4e565b505050900390565b600083511161137f5760405162461bcd60e51b81526004016103d290612004565b61138761032f565b8251146113a65760405162461bcd60e51b81526004016103d290611eea565b808260400151146113c95760405162461bcd60e51b81526004016103d29061203b565b6007548260600151146113ee5760405162461bcd60e51b81526004016103d290611f56565b60025460408051608081018252845181526020808601519082015284820151818301526060808601519082015290516335f8315960e11b81526001600160a01b0390921691636bf062b29161144891879190600401611dd6565b60206040518083038186803b15801561146057600080fd5b505afa158015611474573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114989190611a40565b61101d5760405162461bcd60e51b81526004016103d290612072565b6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915260e081016114fa61150c565b8152602001611507611524565b905290565b60408051808201909152600081526060602082015290565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915290565b8035610aaf816122b2565b600082601f83011261156d578081fd5b81356001600160401b03811115611582578182fd5b611595601f8201601f191660200161226d565b91508082528360208285010111156115ac57600080fd5b8060208401602084013760009082016020015292915050565b600060a082840312156115d6578081fd5b6115e060a061226d565b9050813581526020820135602082015260408201356040820152606082013560608201526080820135608082015292915050565b60006101a08284031215611626578081fd5b61163161012061226d565b9050813581526020820135602082015261164e8360408401611552565b6040820152606082013560608201526080820135608082015260a082013560a082015260c082013560c082015260e08201356001600160401b0381111561169457600080fd5b6116a0848285016116bf565b60e0830152506101006116b5848285016115c5565b9082015292915050565b6000604082840312156116d0578081fd5b6116da604061226d565b905081356116e7816122b2565b815260208201356001600160401b0381111561170257600080fd5b61170e8482850161155d565b60208301525092915050565b60006080828403121561172b578081fd5b611735608061226d565b90508135815260208201356020820152604082013560408201526060820135606082015292915050565b60006101008284031215611771578081fd5b61177b608061226d565b9050813581526020820135602082015260408201356001600160401b03808211156117a557600080fd5b90830190608082860312156117b957600080fd5b6117c3608061226d565b823581526117d48660208501611552565b60208201526117e68660408501611552565b60408201526060830135828111156117fd57600080fd5b6118098782860161155d565b60608301525080604085015250505061182583606084016115c5565b606082015292915050565b600060208284031215611841578081fd5b8135610556816122b2565b60006020828403121561185d578081fd5b8151610556816122b2565b6000602080838503121561187a578182fd5b82356001600160401b0381111561188f578283fd5b8301601f8101851361189f578283fd5b80356118b26118ad82612293565b61226d565b81815283810190838501858402850186018910156118ce578687fd5b8694505b838510156118f05780358352600194909401939185019185016118d2565b50979650505050505050565b6000806020838503121561190e578081fd5b82356001600160401b0380821115611924578283fd5b818501915085601f830112611937578283fd5b813581811115611945578384fd5b8660208083028501011115611958578384fd5b60209290920196919550909350505050565b60006060828403121561197b578081fd5b826060830111156110bc578081fd5b6000602080838503121561199c578182fd5b82356001600160401b038111156119b1578283fd5b8301601f810185136119c1578283fd5b80356119cf6118ad82612293565b818152838101908385016040808502860187018a10156119ed578788fd5b8795505b84861015611a325780828b031215611a07578788fd5b611a108161226d565b82358152878301358882015284526001959095019492860192908101906119f1565b509098975050505050505050565b600060208284031215611a51578081fd5b81518015158114610556578182fd5b600060208284031215611a71578081fd5b5035919050565b60008060408385031215611a8a578182fd5b50508035926020909101359150565b60008060408385031215611aab578182fd5b82356001600160401b0380821115611ac1578384fd5b611acd8683870161155d565b93506020850135915080821115611ae2578283fd5b50611aef85828601611614565b9150509250929050565b60008060008060e08587031215611b0e578182fd5b84356001600160401b0380821115611b24578384fd5b611b308883890161155d565b95506020870135915080821115611b45578384fd5b611b5188838901611614565b94506040870135915080821115611b66578384fd5b50611b738782880161155d565b925050611b83866060870161171a565b905092959194509250565b60008060408385031215611ba0578182fd5b82356001600160401b0380821115611bb6578384fd5b611bc28683870161155d565b93506020850135915080821115611bd7578283fd5b50611aef8582860161175f565b60008060008060e08587031215611bf9578182fd5b84356001600160401b0380821115611c0f578384fd5b611c1b8883890161155d565b95506020870135915080821115611c30578384fd5b611b518883890161175f565b600060208284031215611c4d578081fd5b5051919050565b60008151808452815b81811015611c7957602081850181015186830182015201611c5d565b81811115611c8a5782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0393841681529183166020830152909116604082015260600190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015611d305783516001600160a01b031683529284019291840191600101611d0b565b50909695505050505050565b901515815260200190565b90815260200190565b918252602082015260400190565b600085825284602083015260806040830152611d7d6080830185611c54565b905082606083015295945050505050565b60006101a0808352611da281840186611c54565b91505060208083018460005b600c811015611dcb57815183529183019190830190600101611dae565b505050509392505050565b600060a08252611de960a0830185611c54565b905060208083018460005b6004811015611dcb57815183529183019190830190600101611df4565b6000610100808352611e2581840186611c54565b91505060208083018460005b6007811015611dcb57815183529183019190830190600101611e31565b600060208252610aac6020830184611c54565b602080825260139082015272496e76616c696420726577617264207261746560681b604082015260600190565b602080825260149082015273125b9d985b1a59081858d8dbdd5b9d081c9bdbdd60621b604082015260600190565b60208082526014908201527324b73b30b634b2103932bbb0b93210383937b7b360611b604082015260600190565b6020808252818101527f4f75746461746564207472656520757064617465206d65726b6c6520726f6f74604082015260600190565b6020808252601c908201527f496e636f72726563742065787465726e616c2064617461206861736800000000604082015260600190565b6020808252601e908201527f496e636f7272656374206163636f756e7420696e7365727420696e6465780000604082015260600190565b6020808252601690820152754665652076616c7565206f7574206f662072616e676560501b604082015260600190565b60208082526027908201527f4f6e6c7920676f7665726e616e63652063616e20706572666f726d20746869736040820152661030b1ba34b7b760c91b606082015260800190565b6020808252601c908201527f4f75746461746564206163636f756e74206d65726b6c6520726f6f7400000000604082015260600190565b6020808252601d908201527f496e636f727265637420636f6d6d69746d656e7420696e736572746564000000604082015260600190565b60208082526019908201527f496e76616c69642074726565207570646174652070726f6f6600000000000000604082015260600190565b60208082526018908201527f496e76616c6964207769746864726177616c2070726f6f660000000000000000604082015260600190565b6020808252601690820152754f75746461746564206163636f756e7420737461746560501b604082015260600190565b6020808252600e908201526d496e636f7272656374207261746560901b604082015260600190565b6020808252601d908201527f52657761726420686173206265656e20616c7265616479207370656e74000000604082015260600190565b60208082526019908201527f416d6f756e742076616c7565206f7574206f662072616e676500000000000000604082015260600190565b602080825282516001600160a01b0316828201528201516040808301526000906121d36060840182611c54565b949350505050565b60006020825282516020830152602083015160018060a01b038082166040850152806040860151166060850152505060608301516080808401526121d360a0840182611c54565b6000808335601e19843603018112612238578283fd5b8301803591506001600160401b03821115612251578283fd5b60200191503681900382131561226657600080fd5b9250929050565b6040518181016001600160401b038111828210171561228b57600080fd5b604052919050565b60006001600160401b038211156122a8578081fd5b5060209081020190565b6001600160a01b03811681146103e457600080fdfe416d6f756e742073686f756c642062652067726561746572207468616e20666565a26469706673582212201ce4490a9602839876fe9668dd0d550aac3b551bf27150c591e321ac21daf4cc64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
f06c24d1d0c5da2628caf6a7912f231ca834476d6c3505f1fb8e5926ab7f9ba594d63e9067c3ab2d966702f604484c43b5ea247ecd08c28762caa50df5dc02bdf364752a68271f46f4a51f0ccd3ecaf066404a7a1cdfc0687e213360662586306016a87815201af7399a07a43aab1af334e85c9fe43aa35026012cde9b5d23fba6a8f1f25e21baffc58dcecb043a994f9e940ec8971a903e48518609e3ade2f53ebe6d0e58fe1b929d4482eac2a7b7e760d1863a0cad5a84ab2c5d48b8ce171b29f9a0a07a22ab214d00aaa0190f54509e853f3119009baecb0035347606b0a900000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000004c041982b4f77cbbd82ef3b9ea748738ac6c281d3f1af198770d29f75ac32d80a000000000000000000000000000000000000000000000000000000000000000a9e5bc9215eecd103644145a5db4f69d5efaf4885bb5bf968f8db271ec5cd539b0000000000000000000000000000000000000000000000000000000000000014917e42347647689051abc744f502bff342c76ad30c0670b46b305b2f7e1f893d0000000000000000000000000000000000000000000000000000000000000032ddfc726d74f912f49389ef7471e75291969852ce7e5df0509a17bc1e466469850000000000000000000000000000000000000000000000000000000000000190
-----Decoded View---------------
Arg [0] : _rewardSwap (bytes32): 0xf06c24d1d0c5da2628caf6a7912f231ca834476d6c3505f1fb8e5926ab7f9ba5
Arg [1] : _governance (bytes32): 0x94d63e9067c3ab2d966702f604484c43b5ea247ecd08c28762caa50df5dc02bd
Arg [2] : _tornadoTrees (bytes32): 0xf364752a68271f46f4a51f0ccd3ecaf066404a7a1cdfc0687e21336066258630
Arg [3] : _verifiers (bytes32[3]): System.Byte[],System.Byte[],System.Byte[]
Arg [4] : _accountRoot (bytes32): 0x29f9a0a07a22ab214d00aaa0190f54509e853f3119009baecb0035347606b0a9
Arg [5] : _rates (tuple[]): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]
-----Encoded View---------------
17 Constructor Arguments found :
Arg [0] : f06c24d1d0c5da2628caf6a7912f231ca834476d6c3505f1fb8e5926ab7f9ba5
Arg [1] : 94d63e9067c3ab2d966702f604484c43b5ea247ecd08c28762caa50df5dc02bd
Arg [2] : f364752a68271f46f4a51f0ccd3ecaf066404a7a1cdfc0687e21336066258630
Arg [3] : 6016a87815201af7399a07a43aab1af334e85c9fe43aa35026012cde9b5d23fb
Arg [4] : a6a8f1f25e21baffc58dcecb043a994f9e940ec8971a903e48518609e3ade2f5
Arg [5] : 3ebe6d0e58fe1b929d4482eac2a7b7e760d1863a0cad5a84ab2c5d48b8ce171b
Arg [6] : 29f9a0a07a22ab214d00aaa0190f54509e853f3119009baecb0035347606b0a9
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [9] : c041982b4f77cbbd82ef3b9ea748738ac6c281d3f1af198770d29f75ac32d80a
Arg [10] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [11] : 9e5bc9215eecd103644145a5db4f69d5efaf4885bb5bf968f8db271ec5cd539b
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [13] : 917e42347647689051abc744f502bff342c76ad30c0670b46b305b2f7e1f893d
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000032
Arg [15] : ddfc726d74f912f49389ef7471e75291969852ce7e5df0509a17bc1e46646985
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000190
Deployed Bytecode Sourcemap
24041:10122:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31558:134;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24399:48;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;24306:32::-;;;:::i;:::-;;;;;;;:::i;24345:49::-;;;;;;:::i;:::-;;:::i;30751:94::-;;;;;;:::i;:::-;;:::i;:::-;;24182:35;;;:::i;24531:55::-;;;:::i;24266:35::-;;;:::i;1781:271::-;;;;;;:::i;:::-;;:::i;27082:1827::-;;;;;;:::i;:::-;;:::i;24222:39::-;;;:::i;30851:118::-;;;;;;:::i;:::-;;:::i;28915:151::-;;;;;;:::i;:::-;;:::i;26665:145::-;;;;;;:::i;:::-;;:::i;24144:33::-;;;:::i;31328:177::-;;;;;;:::i;:::-;;:::i;24452:40::-;;;;;;:::i;:::-;;:::i;29072:1673::-;;;;;;:::i;:::-;;:::i;24591:54::-;;;;;;:::i;:::-;;:::i;30975:126::-;;;;;;:::i;:::-;;:::i;24499:27::-;;;:::i;31107:116::-;;;;;;:::i;:::-;;:::i;24108:31::-;;;:::i;26816:260::-;;;;;;:::i;:::-;;:::i;2058:243::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;31558:134::-;31609:7;31632:12;24583:3;31645:12;;:40;;;;;;31632:54;;;;;;;;;31625:61;;31558:134;:::o;24399:48::-;;;;;;;;;;;;;;;:::o;24306:32::-;;;-1:-1:-1;;;;;24306:32:0;;:::o;24345:49::-;;;;;;;;;;;;;;;:::o;30751:94::-;25904:10;-1:-1:-1;;;;;25918:10:0;25904:24;;25896:76;;;;-1:-1:-1;;;25896:76:0;;;;;;;:::i;:::-;;;;;;;;;30822:17:::1;30832:6;30822:9;:17::i;:::-;30751:94:::0;:::o;24182:35::-;;;-1:-1:-1;;;;;24182:35:0;;:::o;24531:55::-;24583:3;24531:55;:::o;24266:35::-;;;:::o;1781:271::-;1841:7;1857:12;1884;:10;:12::i;:::-;1900:1;1884:17;:107;;1949:42;1884:107;;;1904:42;1884:107;2012:23;;-1:-1:-1;;;2012:23:0;;1857:141;;-1:-1:-1;;;;;;2012:17:0;;;;;:23;;2030:4;;2012:23;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2012:28:0;;2041:4;2012:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2005:41;1781:271;-1:-1:-1;;;1781:271:0:o;27082:1827::-;27253:71;27275:5;:13;;;27290:16;27308:15;27253:21;:71::i;:::-;27331:12;;27358:17;;;;27377:20;;;;27331:67;;-1:-1:-1;;;27331:67:0;;-1:-1:-1;;;;;27331:12:0;;;;:26;;:67;;27358:17;;27331:67;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27434:36;27455:5;:13;;;27444:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;27434:9;:36::i;:::-;27413:5;:17;;;:57;27405:98;;;;-1:-1:-1;;;27405:98:0;;;;;;;:::i;:::-;-1:-1:-1;;;27518:5:0;:9;;;:18;27510:53;;;;-1:-1:-1;;;27510:53:0;;;;;;;:::i;:::-;27598:14;;;;;-1:-1:-1;;;;;27592:21:0;;;;;:5;:21;;;;27578:10;;:35;:53;;;;-1:-1:-1;27617:10:0;;:14;;27578:53;27570:85;;;;-1:-1:-1;;;27570:85:0;;;;;;;:::i;:::-;27688:21;;;;27671:39;;;;:16;:39;;;;;;;;27670:40;27662:82;;;;-1:-1:-1;;;27662:82:0;;;;;;;:::i;:::-;27767:14;;:586;;;;;;;;27842:10;;27767:586;;;27874:9;;;;27767:586;;;;27905:14;;;;-1:-1:-1;;;;;27897:23:0;;;27767:586;;;;;27941:21;;;;27767:586;;;;;27984:17;;;;27767:586;;;;:14;28023:13;;;;;:23;27767:586;;;;;;;;28068:13;;:32;;;;27767:586;;;;;;;;28122:13;;:24;;;27767:586;;;;28168:13;;:31;;;;27767:586;;;;;;;28221:13;:30;;27767:586;;;;28273:17;;;;27767:586;;;;28312:20;;;;27767:586;;;;;;-1:-1:-1;;;27767:586:0;;:14;;;;;:26;;:586;;27804:6;;27767:586;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27751:640;;;;-1:-1:-1;;;27751:640:0;;;;;;;:::i;:::-;28418:13;;;;:32;;;;;28400:51;;;;:17;:51;;;;;;:58;;28454:4;-1:-1:-1;;28400:58:0;;;;;;;;28482:21;;;;28465:39;;:16;:39;;;;;:46;;;;;;;;28518:119;28563:20;:18;:20::i;:::-;28536:13;;;;:23;:47;:100;;28613:15;:23;;;28536:100;;;28586:5;:13;;;:24;;;28536:100;28518:17;:119::i;:::-;28648:9;;;;:13;28644:85;;28688:13;;;;:21;28711:9;;;;28672:49;;-1:-1:-1;;;28672:49:0;;-1:-1:-1;;;;;28672:10:0;:15;;;;:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28644:85;28742:161;28761:5;:13;;;:30;;;28800:5;:13;;;:32;;;28841:5;:13;;;:30;;;28895:1;28880:12;;:16;28742:161;;;;;;;;;:::i;:::-;;;;;;;;27082:1827;;;;:::o;24222:39::-;;;:::o;30851:118::-;25904:10;-1:-1:-1;;;;;25918:10:0;25904:24;;25896:76;;;;-1:-1:-1;;;25896:76:0;;;;;;;:::i;:::-;30938:25:::1;::::0;;;;;::::1;::::0;;;::::1;::::0;30952:10;;30938:25:::1;::::0;;;30952:10;;30938:25;30952:10;30938:25;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;30938:13:0::1;::::0;-1:-1:-1;;30938:25:0:i:1;28915:151::-:0;29019:12;;;29029:1;29019:12;;;29033:26;;;;;29019:12;;;29033:26;;;;;;;;;;;;;;;;;;;28995:65;;29004:6;;29012:5;;28995:8;:65::i;:::-;28915:151;;:::o;26665:145::-;26763:12;;;26773:1;26763:12;;;26777:26;;;;;26763:12;;;26777:26;;;;;;;;;;;;;;;;;;;26741:63;;26748:6;;26756:5;;26741:6;:63::i;24144:33::-;;;-1:-1:-1;;;;;24144:33:0;;:::o;31328:177::-;31408:4;31428:10;;;;;:71;;-1:-1:-1;31494:5:0;31442:12;24583:3;31455:6;:34;31442:48;;;;;;;;;:57;31428:71;31421:78;;31328:177;;;;;:::o;24452:40::-;;;;;;;;;;;;;:::o;29072:1673::-;29247:71;29269:5;:13;;;29284:16;29302:15;29247:21;:71::i;:::-;29354:36;29375:5;:13;;;29364:25;;;;;;;;:::i;29354:36::-;29333:5;:17;;;:57;29325:98;;;;-1:-1:-1;;;29325:98:0;;;;;;;:::i;:::-;29438:12;;-1:-1:-1;;;;29430:59:0;;;;-1:-1:-1;;;29430:59:0;;;;;;;:::i;:::-;29512:16;;:399;;;;;;;;29589:12;;29512:399;;;29623:17;;;;29512:399;;;;29662:13;;;;;;:23;29512:399;;;;29707:13;;:32;;;;29512:399;;;;29761:13;;:24;;;29512:399;;;;;;;;29807:13;;:31;;;;29512:399;;;;29860:13;;:30;;29512:399;;;;;;-1:-1:-1;;;29512:399:0;;-1:-1:-1;;;;;29512:16:0;;;;:28;;:399;;29551:6;;29512:399;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29496:457;;;;-1:-1:-1;;;29496:457:0;;;;;;;:::i;:::-;29962:119;30007:20;:18;:20::i;:::-;29980:13;;;;:23;:47;:100;;30057:15;:23;;;29980:100;;;30030:5;:13;;;:24;;;29962:17;:119::i;:::-;30106:13;;;;;:32;;;;;30088:51;;;;:17;:51;;;;;;:58;;-1:-1:-1;;30088:58:0;30142:4;30088:58;;;30243:13;;;;:17;30226:72;;;;;;;;;;;;30088:51;;30226:72;;30243:17;;30226:72;;;;;;;:12;;;:72;:16;:72::i;:::-;30209:89;-1:-1:-1;30309:10:0;;30305:81;;30346:13;;;;;:23;;;30330:48;;-1:-1:-1;;;30330:48:0;;-1:-1:-1;;;;;30330:10:0;:15;;;;:48;;30346:23;30371:6;;30330:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30305:81;30468:13;;;;:17;:21;30464:101;;30516:13;;;;;:21;;;;30539:17;;30500:57;;-1:-1:-1;;;30500:57:0;;-1:-1:-1;;;;;30500:10:0;:15;;;;:57;;30516:21;;30539:17;30500:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30464:101;30578:161;30597:5;:13;;;:30;;;30636:5;:13;;;:32;;;30677:5;:13;;;:30;;;30731:1;30716:12;;:16;30578:161;;;;;;;;;:::i;:::-;;;;;;;;29072:1673;;;;;:::o;24591:54::-;;;;;;;;;;;;;-1:-1:-1;24591:54:0;:::o;30975:126::-;25904:10;-1:-1:-1;;;;;25918:10:0;25904:24;;25896:76;;;;-1:-1:-1;;;25896:76:0;;;;;;;:::i;:::-;31067:12:::1;:28:::0;;-1:-1:-1;;;;;;31067:28:0::1;-1:-1:-1::0;;;;;31067:28:0;;;::::1;::::0;;;::::1;::::0;;30975:126::o;24499:27::-;;;;:::o;31107:116::-;25904:10;-1:-1:-1;;;;;25918:10:0;25904:24;;25896:76;;;;-1:-1:-1;;;25896:76:0;;;;;;;:::i;:::-;31181:36:::1;::::0;-1:-1:-1;;;31181:36:0;;-1:-1:-1;;;;;31181:10:0::1;:24;::::0;::::1;::::0;:36:::1;::::0;31206:10;;31181:36:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31107:116:::0;:::o;24108:31::-;;;-1:-1:-1;;;;;24108:31:0;;:::o;26816:260::-;26888:9;26883:188;26903:22;;;26883:188;;;26942:18;26962:22;;:::i;:::-;26999:11;;27011:1;26999:14;;;;;;;;;;;;;;;;;;:::i;:::-;26988:47;;;;;;;:::i;:::-;26941:94;;;;27044:19;27051:5;27058:4;27044:6;:19::i;:::-;-1:-1:-1;;26927:3:0;;26883:188;;;;26816:260;;:::o;2058:243::-;2126:23;2181:7;:14;-1:-1:-1;;;;;2167:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2167:29:0;;2158:38;;2208:9;2203:93;2227:7;:14;2223:1;:18;2203:93;;;2269:19;2277:7;2285:1;2277:10;;;;;;;;;;;;;;2269:7;:19::i;:::-;2257:6;2264:1;2257:9;;;;;;;;-1:-1:-1;;;;;2257:31:0;;;:9;;;;;;;;;;;:31;2243:3;;2203:93;;;;2058:243;;;:::o;33544:323::-;33606:9;33601:261;33625:6;:13;33621:1;:17;33601:261;;;-1:-1:-1;;;33662:6:0;33669:1;33662:9;;;;;;;;;;;;;;:15;;;:24;33654:51;;;;-1:-1:-1;;;33654:51:0;;;;;;;:::i;:::-;33714:16;33733:27;33741:6;33748:1;33741:9;;;;;;;;;;;;;;:18;;;33733:7;:27::i;:::-;33714:46;;33787:6;33794:1;33787:9;;;;;;;;;;;;;;:15;;;33769:5;:15;33775:8;-1:-1:-1;;;;;33769:15:0;-1:-1:-1;;;;;33769:15:0;;;;;;;;;;;;:33;;;;33816:38;33828:8;33838:6;33845:1;33838:9;;;;;;;;;;;;;;:15;;;33816:38;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;33640:3:0;;33601:261;;2307:154;2419:9;2307:154;:::o;32595:809::-;32795:27;;;;;32777:46;;;;:17;:46;;;;;;;;;32776:47;32768:82;;;;-1:-1:-1;;;32768:82:0;;;;;;;:::i;:::-;32883:20;:18;:20::i;:::-;32861:18;;:42;32857:542;;33103:66;33122:8;:18;;;33142:8;:26;;;33103:18;:66::i;:::-;33095:99;;;;-1:-1:-1;;;33095:99:0;;;;;;;:::i;:::-;33203:80;33222:16;33240:15;33257:8;:25;;;33203:18;:80::i;:::-;32857:542;;;33344:12;;33314:8;:26;;;:42;33306:85;;;;-1:-1:-1;;;33306:85:0;;;;;;;:::i;31727:176::-;31812:16;;;;;;;-1:-1:-1;;;;;31812:85:0;;31727:176::o;33410:128::-;33483:12;33481:14;;;;;;;;33527:5;;33468:12;;24583:3;;33481:42;33468:56;;;;;;;;:64;-1:-1:-1;33410:128:0:o;33873:287::-;33961:13;;33972:1;33944:30;;-1:-1:-1;;;;;33944:30:0;;;-1:-1:-1;;;;;;33944:30:0;;;;;;;33961:13;34000;;;-1:-1:-1;33981:32:0;;;;;;;;;;;34041:13;;;;;34052:1;34020:34;;;;;;;;;;;;;;;;34066:88;;;;;;33961:13;;34000;34066:88;:::i;:::-;;;;;;;;33873:287;:::o;20409:192::-;20495:7;20531:12;20523:6;;;;20515:29;;;;-1:-1:-1;;;20515:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;20567:5:0;;;20409:192::o;31909:680::-;32073:1;32057:6;:13;:17;32049:58;;;;-1:-1:-1;;;32049:58:0;;;;;;;:::i;:::-;32139:20;:18;:20::i;:::-;32122:13;;:37;32114:82;;;;-1:-1:-1;;;32114:82:0;;;;;;;:::i;:::-;32225:11;32211:5;:10;;;:25;32203:67;;;;-1:-1:-1;;;32203:67:0;;;;;;;:::i;:::-;32306:12;;32285:5;:17;;;:33;32277:76;;;;-1:-1:-1;;;32277:76:0;;;;;;;:::i;:::-;32376:18;;:164;;;;;;;;32443:13;;32376:164;;;32467:13;;;;32376:164;;;;32491:10;;;;32376:164;;;;;32512:17;;;;32376:164;;;;;;-1:-1:-1;;;32376:164:0;;-1:-1:-1;;;;;32376:18:0;;;;:30;;:164;;32417:6;;32376:164;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32360:223;;;;-1:-1:-1;;;32360:223:0;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130::-;72:20;;97:33;72:20;97:33;:::i;2715:440::-;;2816:3;2809:4;2801:6;2797:17;2793:27;2783:2;;-1:-1;;2824:12;2783:2;2871:6;2858:20;-1:-1;;;;;45068:6;45065:30;45062:2;;;-1:-1;;45098:12;45062:2;2893:64;45171:9;45152:17;;-1:-1;;45148:33;45239:4;45229:15;2893:64;:::i;:::-;2884:73;;2977:6;2970:5;2963:21;3081:3;45239:4;3072:6;3005;3063:16;;3060:25;3057:2;;;3098:1;;3088:12;3057:2;49757:6;45239:4;3005:6;3001:17;45239:4;3039:5;3035:16;49734:30;49813:1;49795:16;;;45239:4;49795:16;49788:27;3039:5;2776:379;-1:-1;;2776:379::o;3546:956::-;;3666:4;3654:9;3649:3;3645:19;3641:30;3638:2;;;-1:-1;;3674:12;3638:2;3702:20;3666:4;3702:20;:::i;:::-;3693:29;;2657:6;2644:20;3791:16;3784:75;3934:2;3992:9;3988:22;2644:20;3934:2;3953:5;3949:16;3942:75;4084:2;4142:9;4138:22;2644:20;4084:2;4103:5;4099:16;4092:75;4241:2;4299:9;4295:22;10118:20;4241:2;4260:5;4256:16;4249:75;4397:3;4456:9;4452:22;2644:20;4397:3;4417:5;4413:16;4406:75;3632:870;;;;:::o;5039:1681::-;;5156:6;5144:9;5139:3;5135:19;5131:32;5128:2;;;-1:-1;;5166:12;5128:2;5194:22;5209:6;5194:22;:::i;:::-;5185:31;;5319:22;10118:20;5280:16;5273:75;5408:2;5466:9;5462:22;10118:20;5408:2;5427:5;5423:16;5416:75;5589:49;5634:3;5556:2;5614:9;5610:22;5589:49;:::i;:::-;5556:2;5575:5;5571:16;5564:75;5711:2;5769:9;5765:22;2644:20;5711:2;5730:5;5726:16;5719:75;5862:3;5921:9;5917:22;2644:20;5862:3;5882:5;5878:16;5871:75;6014:3;6073:9;6069:22;2644:20;6014:3;6034:5;6030:16;6023:75;6169:3;6228:9;6224:22;2644:20;6169:3;6189:5;6185:16;6178:75;6345:3;6334:9;6330:19;6317:33;-1:-1;;;;;6362:6;6359:30;6356:2;;;5266:1;;6392:12;6356:2;6437:80;6513:3;6504:6;6493:9;6489:22;6437:80;:::i;:::-;6345:3;6423:5;6419:16;6412:106;;6582:3;6618:80;6694:3;6582;6674:9;6670:22;6618:80;:::i;:::-;6598:18;;;6591:108;6602:5;5122:1598;-1:-1;;5122:1598::o;6760:583::-;;6880:4;6868:9;6863:3;6859:19;6855:30;6852:2;;;-1:-1;;6888:12;6852:2;6916:20;6880:4;6916:20;:::i;:::-;6907:29;;85:6;72:20;97:33;124:5;97:33;:::i;:::-;6996:75;;7172:2;7157:18;;7144:32;-1:-1;;;;;7185:30;;7182:2;;;-1:-1;;7218:12;7182:2;7263:58;7317:3;7308:6;7297:9;7293:22;7263:58;:::i;:::-;7172:2;7249:5;7245:16;7238:84;;6846:497;;;;:::o;7384:775::-;;7505:4;7493:9;7488:3;7484:19;7480:30;7477:2;;;-1:-1;;7513:12;7477:2;7541:20;7505:4;7541:20;:::i;:::-;7532:29;;2657:6;2644:20;7628:16;7621:75;7760:2;7818:9;7814:22;2644:20;7760:2;7779:5;7775:16;7768:75;7904:2;7962:9;7958:22;2644:20;7904:2;7923:5;7919:16;7912:75;8055:2;8113:9;8109:22;10118:20;8055:2;8074:5;8070:16;8063:75;7471:688;;;;:::o;8198:927::-;;8317:6;8305:9;8300:3;8296:19;8292:32;8289:2;;;-1:-1;;8327:12;8289:2;8355:20;8370:4;8355:20;:::i;:::-;8346:29;;10131:6;10118:20;8441:16;8434:75;8577:2;8635:9;8631:22;2644:20;8577:2;8596:5;8592:16;8585:75;8752:2;8741:9;8737:18;8724:32;-1:-1;;;;;8776:18;8768:6;8765:30;8762:2;;;-1:-1;;8798:12;8762:2;8897:22;;;;8370:4;9268:19;;;9264:30;9261:2;;;-1:-1;;9297:12;9261:2;9325:20;8370:4;9325:20;:::i;:::-;9447:22;10118:20;9408:16;9401:75;9575:49;9620:3;8577:2;9600:9;9596:22;9575:49;:::i;:::-;8577:2;9561:5;9557:16;9550:75;9722:49;9767:3;8752:2;9747:9;9743:22;9722:49;:::i;:::-;8752:2;9708:5;9704:16;9697:75;9873:2;9862:9;9858:18;9845:32;8776:18;9889:6;9886:30;9883:2;;;-1:-1;;9919:12;9883:2;9964:58;10018:3;10009:6;9998:9;9994:22;9964:58;:::i;:::-;9873:2;9950:5;9946:16;9939:84;;8843:82;8752:2;8829:5;8825:16;8818:108;;;;9023:80;9099:3;9873:2;9079:9;9075:22;9023:80;:::i;:::-;9873:2;9009:5;9005:16;8998:106;8283:842;;;;:::o;10329:241::-;;10433:2;10421:9;10412:7;10408:23;10404:32;10401:2;;;-1:-1;;10439:12;10401:2;85:6;72:20;97:33;124:5;97:33;:::i;10577:263::-;;10692:2;10680:9;10671:7;10667:23;10663:32;10660:2;;;-1:-1;;10698:12;10660:2;226:6;220:13;238:33;265:5;238:33;:::i;10847:377::-;;10976:2;;10964:9;10955:7;10951:23;10947:32;10944:2;;;-1:-1;;10982:12;10944:2;11040:17;11027:31;-1:-1;;;;;11070:6;11067:30;11064:2;;;-1:-1;;11100:12;11064:2;11176:22;;411:4;399:17;;395:27;-1:-1;385:2;;-1:-1;;426:12;385:2;473:6;460:20;495:80;510:64;567:6;510:64;:::i;:::-;495:80;:::i;:::-;603:21;;;660:14;;;;635:17;;;749;;;740:27;;;;737:36;-1:-1;734:2;;;-1:-1;;776:12;734:2;-1:-1;802:10;;796:206;821:6;818:1;815:13;796:206;;;2644:20;;889:50;;843:1;836:9;;;;;953:14;;;;981;;796:206;;;-1:-1;11120:88;10938:286;-1:-1;;;;;;;10938:286::o;11231:419::-;;;11381:2;11369:9;11360:7;11356:23;11352:32;11349:2;;;-1:-1;;11387:12;11349:2;11445:17;11432:31;-1:-1;;;;;11483:18;11475:6;11472:30;11469:2;;;-1:-1;;11505:12;11469:2;11617:6;11606:9;11602:22;;;1173:3;1166:4;1158:6;1154:17;1150:27;1140:2;;-1:-1;;1181:12;1140:2;1224:6;1211:20;11483:18;1243:6;1240:30;1237:2;;;-1:-1;;1273:12;1237:2;1368:3;11381:2;;1352:6;1348:17;1309:6;1334:32;;1331:41;1328:2;;;-1:-1;;1375:12;1328:2;11381;1305:17;;;;;11525:109;;-1:-1;11343:307;;-1:-1;;;;11343:307::o;11657:323::-;;11802:2;11790:9;11781:7;11777:23;11773:32;11770:2;;;-1:-1;;11808:12;11770:2;1598:3;11802:2;1570:8;1566:30;1563:39;1560:2;;;-1:-1;;1605:12;11987:421;;12138:2;;12126:9;12117:7;12113:23;12109:32;12106:2;;;-1:-1;;12144:12;12106:2;12202:17;12189:31;-1:-1;;;;;12232:6;12229:30;12226:2;;;-1:-1;;12262:12;12226:2;12360:22;;1793:4;1781:17;;1777:27;-1:-1;1767:2;;-1:-1;;1808:12;1767:2;1855:6;1842:20;1877:102;1892:86;1971:6;1892:86;:::i;1877:102::-;2007:21;;;2064:14;;;;2039:17;;;2165:4;2153:17;;;2144:27;;;;2141:36;-1:-1;2138:2;;;-1:-1;;2180:12;2138:2;-1:-1;2206:10;;2200:228;2225:6;2222:1;2219:13;2200:228;;;2165:4;4632:9;4627:3;4623:19;4619:30;4616:2;;;-1:-1;;4652:12;4616:2;4680:20;2165:4;4680:20;:::i;:::-;2644;;4761:75;;4952:22;;;10118:20;4913:16;;;4906:75;2293:72;;2247:1;2240:9;;;;;2379:14;;;;2407;;;;2200:228;;;-1:-1;12282:110;;12100:308;-1:-1;;;;;;;;12100:308::o;12415:257::-;;12527:2;12515:9;12506:7;12502:23;12498:32;12495:2;;;-1:-1;;12533:12;12495:2;2523:6;2517:13;50416:5;48237:13;48230:21;50394:5;50391:32;50381:2;;-1:-1;;50427:12;12679:241;;12783:2;12771:9;12762:7;12758:23;12754:32;12751:2;;;-1:-1;;12789:12;12751:2;-1:-1;2644:20;;12745:175;-1:-1;12745:175::o;12927:366::-;;;13048:2;13036:9;13027:7;13023:23;13019:32;13016:2;;;-1:-1;;13054:12;13016:2;-1:-1;;2644:20;;;13206:2;13245:22;;;10118:20;;-1:-1;13010:283::o;13300:612::-;;;13458:2;13446:9;13437:7;13433:23;13429:32;13426:2;;;-1:-1;;13464:12;13426:2;13522:17;13509:31;-1:-1;;;;;13560:18;13552:6;13549:30;13546:2;;;-1:-1;;13582:12;13546:2;13612:62;13666:7;13657:6;13646:9;13642:22;13612:62;:::i;:::-;13602:72;;13739:2;13728:9;13724:18;13711:32;13697:46;;13560:18;13755:6;13752:30;13749:2;;;-1:-1;;13785:12;13749:2;;13815:81;13888:7;13879:6;13868:9;13864:22;13815:81;:::i;:::-;13805:91;;;13420:492;;;;;:::o;13919:1031::-;;;;;14152:3;14140:9;14131:7;14127:23;14123:33;14120:2;;;-1:-1;;14159:12;14120:2;14217:17;14204:31;-1:-1;;;;;14255:18;14247:6;14244:30;14241:2;;;-1:-1;;14277:12;14241:2;14307:62;14361:7;14352:6;14341:9;14337:22;14307:62;:::i;:::-;14297:72;;14434:2;14423:9;14419:18;14406:32;14392:46;;14255:18;14450:6;14447:30;14444:2;;;-1:-1;;14480:12;14444:2;14510:81;14583:7;14574:6;14563:9;14559:22;14510:81;:::i;:::-;14500:91;;14656:2;14645:9;14641:18;14628:32;14614:46;;14255:18;14672:6;14669:30;14666:2;;;-1:-1;;14702:12;14666:2;;14732:62;14786:7;14777:6;14766:9;14762:22;14732:62;:::i;:::-;14722:72;;;14849:85;14926:7;14831:2;14906:9;14902:22;14849:85;:::i;:::-;14839:95;;14114:836;;;;;;;:::o;14957:616::-;;;15117:2;15105:9;15096:7;15092:23;15088:32;15085:2;;;-1:-1;;15123:12;15085:2;15181:17;15168:31;-1:-1;;;;;15219:18;15211:6;15208:30;15205:2;;;-1:-1;;15241:12;15205:2;15271:62;15325:7;15316:6;15305:9;15301:22;15271:62;:::i;:::-;15261:72;;15398:2;15387:9;15383:18;15370:32;15356:46;;15219:18;15414:6;15411:30;15408:2;;;-1:-1;;15444:12;15408:2;;15474:83;15549:7;15540:6;15529:9;15525:22;15474:83;:::i;15580:1035::-;;;;;15815:3;15803:9;15794:7;15790:23;15786:33;15783:2;;;-1:-1;;15822:12;15783:2;15880:17;15867:31;-1:-1;;;;;15918:18;15910:6;15907:30;15904:2;;;-1:-1;;15940:12;15904:2;15970:62;16024:7;16015:6;16004:9;16000:22;15970:62;:::i;:::-;15960:72;;16097:2;16086:9;16082:18;16069:32;16055:46;;15918:18;16113:6;16110:30;16107:2;;;-1:-1;;16143:12;16107:2;16173:83;16248:7;16239:6;16228:9;16224:22;16173:83;:::i;17460:263::-;;17575:2;17563:9;17554:7;17550:23;17546:32;17543:2;;;-1:-1;;17581:12;17543:2;-1:-1;10266:13;;17537:186;-1:-1;17537:186::o;21395:323::-;;21527:5;45835:12;47065:6;47060:3;47053:19;-1:-1;49902:101;49916:6;49913:1;49910:13;49902:101;;;47102:4;49983:11;;;;;49977:18;49964:11;;;;;49957:39;49931:10;49902:101;;;50018:6;50015:1;50012:13;50009:2;;;-1:-1;47102:4;50074:6;47097:3;50065:16;;50058:27;50009:2;-1:-1;45171:9;50174:14;-1:-1;;50170:28;21674:39;;;;47102:4;21674:39;;21475:243;-1:-1;;21475:243::o;30207:222::-;-1:-1;;;;;48636:54;;;;18155:37;;30334:2;30319:18;;30305:124::o;30436:444::-;-1:-1;;;;;48636:54;;;18155:37;;48636:54;;;30783:2;30768:18;;18155:37;48636:54;;;30866:2;30851:18;;18155:37;30619:2;30604:18;;30590:290::o;30887:333::-;-1:-1;;;;;48636:54;;;;18155:37;;31206:2;31191:18;;21346:37;31042:2;31027:18;;31013:207::o;31227:370::-;31404:2;31418:47;;;45835:12;;31389:18;;;47053:19;;;31227:370;;31404:2;45376:14;;;;47093;;;;31227:370;18763:260;18788:6;18785:1;18782:13;18763:260;;;18849:13;;-1:-1;;;;;48636:54;18155:37;;46568:14;;;;17884;;;;45076:18;18803:9;18763:260;;;-1:-1;31471:116;;31375:222;-1:-1;;;;;;31375:222::o;31604:210::-;48237:13;;48230:21;21229:34;;31725:2;31710:18;;31696:118::o;31821:222::-;21346:37;;;31948:2;31933:18;;31919:124::o;32050:333::-;21346:37;;;32369:2;32354:18;;21346:37;32205:2;32190:18;;32176:207::o;32390:640::-;;21376:5;21353:3;21346:37;21376:5;32784:2;32773:9;32769:18;21346:37;32619:3;32821:2;32810:9;32806:18;32799:48;32861:76;32619:3;32608:9;32604:19;32923:6;32861:76;:::i;:::-;32853:84;;21376:5;33016:2;33005:9;33001:18;21346:37;32590:440;;;;;;;:::o;33037:514::-;;33258:3;;33280:17;33273:47;33334:76;33258:3;33247:9;33243:19;33396:6;33334:76;:::i;:::-;33326:84;;;33537:2;;33526:9;33522:18;19456:21;19498:1;19483:259;45971:4;19505:1;19502:13;19483:259;;;19569:13;;21346:37;;18066:14;;;;46568;;;;19530:1;19523:9;19483:259;;;19487:14;;;;33229:322;;;;;:::o;33558:510::-;;33777:3;33799:17;33792:47;33853:76;33777:3;33766:9;33762:19;33915:6;33853:76;:::i;:::-;33845:84;;34054:2;;34043:9;34039:18;20158:21;20200:1;20185:258;46086:4;20207:1;20204:13;20185:258;;;20271:13;;21346:37;;18066:14;;;;46568;;;;20232:1;20225:9;20185:258;;34075:510;;34294:3;;34316:17;34309:47;34370:76;34294:3;34283:9;34279:19;34432:6;34370:76;:::i;:::-;34362:84;;;34571:2;;34560:9;34556:18;20859:21;20901:1;20886:258;46201:4;20908:1;20905:13;20886:258;;;20972:13;;21346:37;;18066:14;;;;46568;;;;20933:1;20926:9;20886:258;;35389:310;;35536:2;35557:17;35550:47;35611:78;35536:2;35525:9;35521:18;35675:6;35611:78;:::i;35706:416::-;35906:2;35920:47;;;23163:2;35891:18;;;47053:19;-1:-1;;;47093:14;;;23179:42;23240:12;;;35877:245::o;36129:416::-;36329:2;36343:47;;;23491:2;36314:18;;;47053:19;-1:-1;;;47093:14;;;23507:43;23569:12;;;36300:245::o;36552:416::-;36752:2;36766:47;;;23820:2;36737:18;;;47053:19;-1:-1;;;47093:14;;;23836:43;23898:12;;;36723:245::o;36975:416::-;37175:2;37189:47;;;37160:18;;;47053:19;24185:34;47093:14;;;24165:55;24239:12;;;37146:245::o;37398:416::-;37598:2;37612:47;;;24490:2;37583:18;;;47053:19;24526:30;47093:14;;;24506:51;24576:12;;;37569:245::o;37821:416::-;38021:2;38035:47;;;24827:2;38006:18;;;47053:19;24863:32;47093:14;;;24843:53;24915:12;;;37992:245::o;38244:416::-;38444:2;38458:47;;;25166:2;38429:18;;;47053:19;-1:-1;;;47093:14;;;25182:45;25246:12;;;38415:245::o;38667:416::-;38867:2;38881:47;;;25497:2;38852:18;;;47053:19;25533:34;47093:14;;;25513:55;-1:-1;;;25588:12;;;25581:31;25631:12;;;38838:245::o;39090:416::-;39290:2;39304:47;;;25882:2;39275:18;;;47053:19;25918:30;47093:14;;;25898:51;25968:12;;;39261:245::o;39513:416::-;39713:2;39727:47;;;26219:2;39698:18;;;47053:19;26255:31;47093:14;;;26235:52;26306:12;;;39684:245::o;39936:416::-;40136:2;40150:47;;;26557:2;40121:18;;;47053:19;26593:27;47093:14;;;26573:48;26640:12;;;40107:245::o;40359:416::-;40559:2;40573:47;;;26891:2;40544:18;;;47053:19;26927:26;47093:14;;;26907:47;26973:12;;;40530:245::o;40782:416::-;40982:2;40996:47;;;27224:2;40967:18;;;47053:19;-1:-1;;;47093:14;;;27240:45;27304:12;;;40953:245::o;41205:416::-;41405:2;41419:47;;;27555:2;41390:18;;;47053:19;-1:-1;;;47093:14;;;27571:37;27627:12;;;41376:245::o;41628:416::-;41828:2;41842:47;;;27878:2;41813:18;;;47053:19;27914:31;47093:14;;;27894:52;27965:12;;;41799:245::o;42051:416::-;42251:2;42265:47;;;28216:2;42236:18;;;47053:19;28252:27;47093:14;;;28232:48;28299:12;;;42222:245::o;42474:394::-;42663:2;42677:47;;;28620:23;;-1:-1;;;;;48636:54;42648:18;;;18155:37;28792:16;;28786:23;28551:4;28829:14;;;28822:38;42474:394;;28875:71;28542:14;;;28786:23;28875:71;:::i;:::-;42730:128;42634:234;-1:-1;;;;42634:234::o;42875:402::-;;43068:2;43089:17;43082:47;29296:16;29290:23;43068:2;43057:9;43053:18;21346:37;43068:2;29459:5;29455:16;29449:23;45076:18;;48647:42;;;;48153:5;48636:54;29526:14;43057:9;29526:14;18155:37;48647:42;29526:14;29616:5;29612:16;29606:23;48636:54;29683:14;43057:9;29683:14;18155:37;;;29683:14;29782:5;29778:16;29772:23;29225:4;;43057:9;29815:14;29808:38;29861:71;29216:14;43057:9;29216:14;29913:12;29861:71;:::i;43513:506::-;;;43648:11;43635:25;43699:48;;43723:8;43707:14;43703:29;43699:48;43679:18;43675:73;43665:2;;-1:-1;;43752:12;43665:2;43779:33;;43833:18;;;-1:-1;;;;;;43860:30;;43857:2;;;-1:-1;;43893:12;43857:2;43738:4;43921:13;;-1:-1;43707:14;43953:38;;;43943:49;;43940:2;;;44005:1;;43995:12;43940:2;43603:416;;;;;:::o;44026:256::-;44088:2;44082:9;44114:17;;;-1:-1;;;;;44174:34;;44210:22;;;44171:62;44168:2;;;44246:1;;44236:12;44168:2;44088;44255:22;44066:216;;-1:-1;44066:216::o;44289:304::-;;-1:-1;;;;;44440:6;44437:30;44434:2;;;-1:-1;;44470:12;44434:2;-1:-1;44515:4;44503:17;;;44568:15;;44371:222::o;50211:117::-;-1:-1;;;;;48636:54;;50270:35;;50260:2;;50319:1;;50309:12
Swarm Source
ipfs://1ce4490a9602839876fe9668dd0d550aac3b551bf27150c591e321ac21daf4cc
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.