Overview
ETH Balance
0.5 ETH
Eth Value
$1,145.99 (@ $2,291.98/ETH)More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 177 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Simple Shift | 19608954 | 152 days ago | IN | 0 ETH | 0.00242903 | ||||
Simple Shift | 19009929 | 236 days ago | IN | 0 ETH | 0.00378838 | ||||
Simple Shift | 19002712 | 237 days ago | IN | 0 ETH | 0.00438132 | ||||
Simple Shift | 18536377 | 302 days ago | IN | 0 ETH | 0.01146821 | ||||
Withdraw | 18536362 | 302 days ago | IN | 0 ETH | 0.01942454 | ||||
Withdraw | 18536356 | 302 days ago | IN | 0 ETH | 0.0212835 | ||||
Withdraw | 18536316 | 302 days ago | IN | 0 ETH | 0.01582503 | ||||
Simple Shift | 18536294 | 302 days ago | IN | 0 ETH | 0.01228608 | ||||
Withdraw | 18536292 | 302 days ago | IN | 0 ETH | 0.0178525 | ||||
Withdraw | 18536285 | 302 days ago | IN | 0 ETH | 0.01717053 | ||||
Withdraw | 18536270 | 302 days ago | IN | 0 ETH | 0.01713981 | ||||
Withdraw | 18536247 | 302 days ago | IN | 0 ETH | 0.0173277 | ||||
Withdraw | 18536218 | 302 days ago | IN | 0 ETH | 0.02380233 | ||||
Withdraw | 18536140 | 302 days ago | IN | 0 ETH | 0.01861764 | ||||
Withdraw | 18536139 | 302 days ago | IN | 0 ETH | 0.02099052 | ||||
Simple Shift | 18536065 | 302 days ago | IN | 0 ETH | 0.01881549 | ||||
Withdraw | 18536058 | 302 days ago | IN | 0 ETH | 0.02246131 | ||||
Withdraw | 18536056 | 302 days ago | IN | 0 ETH | 0.02288013 | ||||
Withdraw | 18536042 | 302 days ago | IN | 0 ETH | 0.02653522 | ||||
Simple Shift | 18536022 | 302 days ago | IN | 0 ETH | 0.01828044 | ||||
Simple Shift | 18536015 | 302 days ago | IN | 0 ETH | 0.01712257 | ||||
Simple Shift | 18536008 | 302 days ago | IN | 0 ETH | 0.01662519 | ||||
Simple Shift | 18536001 | 302 days ago | IN | 0 ETH | 0.01795743 | ||||
Withdraw | 18535984 | 302 days ago | IN | 0 ETH | 0.02030467 | ||||
Withdraw | 18535960 | 302 days ago | IN | 0 ETH | 0.02291822 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
18536362 | 302 days ago | 0.05 ETH | ||||
18536356 | 302 days ago | 0.05 ETH | ||||
18536316 | 302 days ago | 0.05 ETH | ||||
18536292 | 302 days ago | 0.05 ETH | ||||
18536285 | 302 days ago | 0.05 ETH | ||||
18536270 | 302 days ago | 0.05 ETH | ||||
18536247 | 302 days ago | 0.05 ETH | ||||
18536218 | 302 days ago | 0.05 ETH | ||||
18536140 | 302 days ago | 0.05 ETH | ||||
18536139 | 302 days ago | 0.05 ETH | ||||
18536058 | 302 days ago | 0.05 ETH | ||||
18536056 | 302 days ago | 0.05 ETH | ||||
18536042 | 302 days ago | 0.05 ETH | ||||
18535984 | 302 days ago | 0.05 ETH | ||||
18535960 | 302 days ago | 0.05 ETH | ||||
18535938 | 302 days ago | 0.05 ETH | ||||
18535935 | 302 days ago | 0.05 ETH | ||||
18535933 | 302 days ago | 0.05 ETH | ||||
18535929 | 302 days ago | 0.05 ETH | ||||
18535925 | 302 days ago | 0.05 ETH | ||||
18535920 | 302 days ago | 0.05 ETH | ||||
18535917 | 302 days ago | 0.05 ETH | ||||
18535863 | 302 days ago | 0.05 ETH | ||||
18535808 | 302 days ago | 0.05 ETH | ||||
18533114 | 303 days ago | 0.05 ETH |
Loading...
Loading
Contract Name:
XFTanon
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-03-01 */ // File: contracts\Interfaces\IStorage.sol // SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface for Storage.sol contract */ interface IStorage { function store(address depositor, bytes calldata encryptedNote, bytes32 _passwordHash) external; function xcrypt(bytes memory note, bytes32 key) external view returns (bytes memory); } // File: contracts\MerkleTreeWithHistory.sol pragma solidity ^0.7.0; interface IHasher { function MiMCSponge(uint256 in_xL, uint256 in_xR) external pure returns (uint256 xL, uint256 xR); } contract MerkleTreeWithHistory { uint256 public constant FIELD_SIZE = 21888242871839275222246405745257275088548364400416034343698204186575808495617; uint256 public constant ZERO_VALUE = 21663839004416932945382355908790599225266501822907911457504978515578255421292; // = keccak256("tornado") % FIELD_SIZE IHasher public immutable hasher; uint32 public immutable levels; // the following variables are made public for easier testing and debugging and // are not supposed to be accessed in regular code // filledSubtrees and roots could be bytes32[size], but using mappings makes it cheaper because // it removes index range check on every interaction mapping(uint256 => bytes32) public filledSubtrees; mapping(uint256 => bytes32) public roots; uint32 public constant ROOT_HISTORY_SIZE = 30; uint32 public currentRootIndex = 0; uint32 public nextIndex = 0; constructor(uint32 _levels, IHasher _hasher) { require(_levels > 0, "_levels should be greater than zero"); require(_levels < 32, "_levels should be less than 32"); levels = _levels; hasher = _hasher; for (uint32 i = 0; i < _levels; i++) { filledSubtrees[i] = zeros(i); } roots[0] = zeros(_levels - 1); } /** @dev Hash 2 tree leaves, returns MiMC(_left, _right) */ function hashLeftRight( IHasher _hasher, bytes32 _left, bytes32 _right ) public pure returns (bytes32) { require(uint256(_left) < FIELD_SIZE, "_left should be inside the field"); require(uint256(_right) < FIELD_SIZE, "_right should be inside the field"); uint256 R = uint256(_left); uint256 C = 0; (R, C) = _hasher.MiMCSponge(R, C); R = addmod(R, uint256(_right), FIELD_SIZE); (R, C) = _hasher.MiMCSponge(R, C); return bytes32(R); } function _insert(bytes32 _leaf) internal returns (uint32 index) { uint32 _nextIndex = nextIndex; require(_nextIndex != uint32(2)**levels, "Merkle tree is full. No more leaves can be added"); uint32 currentIndex = _nextIndex; 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(hasher, left, right); currentIndex /= 2; } uint32 newRootIndex = (currentRootIndex + 1) % ROOT_HISTORY_SIZE; currentRootIndex = newRootIndex; roots[newRootIndex] = currentLevelHash; nextIndex = _nextIndex + 1; return _nextIndex; } /** @dev Whether the root is present in the root history */ function isKnownRoot(bytes32 _root) public view returns (bool) { if (_root == 0) { return false; } uint32 _currentRootIndex = currentRootIndex; 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]; } /// @dev provides Zero (Empty) elements for a MiMC MerkleTree. Up to 32 levels function zeros(uint256 i) public pure returns (bytes32) { if (i == 0) return bytes32(0x2fe54c60d3acabf3343a35b6eba15db4821b340f76e741e2249685ed4899af6c); else if (i == 1) return bytes32(0x256a6135777eee2fd26f54b8b7037a25439d5235caee224154186d2b8a52e31d); else if (i == 2) return bytes32(0x1151949895e82ab19924de92c40a3d6f7bcb60d92b00504b8199613683f0c200); else if (i == 3) return bytes32(0x20121ee811489ff8d61f09fb89e313f14959a0f28bb428a20dba6b0b068b3bdb); else if (i == 4) return bytes32(0x0a89ca6ffa14cc462cfedb842c30ed221a50a3d6bf022a6a57dc82ab24c157c9); else if (i == 5) return bytes32(0x24ca05c2b5cd42e890d6be94c68d0689f4f21c9cec9c0f13fe41d566dfb54959); else if (i == 6) return bytes32(0x1ccb97c932565a92c60156bdba2d08f3bf1377464e025cee765679e604a7315c); else if (i == 7) return bytes32(0x19156fbd7d1a8bf5cba8909367de1b624534ebab4f0f79e003bccdd1b182bdb4); else if (i == 8) return bytes32(0x261af8c1f0912e465744641409f622d466c3920ac6e5ff37e36604cb11dfff80); else if (i == 9) return bytes32(0x0058459724ff6ca5a1652fcbc3e82b93895cf08e975b19beab3f54c217d1c007); else if (i == 10) return bytes32(0x1f04ef20dee48d39984d8eabe768a70eafa6310ad20849d4573c3c40c2ad1e30); else if (i == 11) return bytes32(0x1bea3dec5dab51567ce7e200a30f7ba6d4276aeaa53e2686f962a46c66d511e5); else if (i == 12) return bytes32(0x0ee0f941e2da4b9e31c3ca97a40d8fa9ce68d97c084177071b3cb46cd3372f0f); else if (i == 13) return bytes32(0x1ca9503e8935884501bbaf20be14eb4c46b89772c97b96e3b2ebf3a36a948bbd); else if (i == 14) return bytes32(0x133a80e30697cd55d8f7d4b0965b7be24057ba5dc3da898ee2187232446cb108); else if (i == 15) return bytes32(0x13e6d8fc88839ed76e182c2a779af5b2c0da9dd18c90427a644f7e148a6253b6); else if (i == 16) return bytes32(0x1eb16b057a477f4bc8f572ea6bee39561098f78f15bfb3699dcbb7bd8db61854); else if (i == 17) return bytes32(0x0da2cb16a1ceaabf1c16b838f7a9e3f2a3a3088d9e0a6debaa748114620696ea); else if (i == 18) return bytes32(0x24a3b3d822420b14b5d8cb6c28a574f01e98ea9e940551d2ebd75cee12649f9d); else if (i == 19) return bytes32(0x198622acbd783d1b0d9064105b1fc8e4d8889de95c4c519b3f635809fe6afc05); else if (i == 20) return bytes32(0x29d7ed391256ccc3ea596c86e933b89ff339d25ea8ddced975ae2fe30b5296d4); else if (i == 21) return bytes32(0x19be59f2f0413ce78c0c3703a3a5451b1d7f39629fa33abd11548a76065b2967); else if (i == 22) return bytes32(0x1ff3f61797e538b70e619310d33f2a063e7eb59104e112e95738da1254dc3453); else if (i == 23) return bytes32(0x10c16ae9959cf8358980d9dd9616e48228737310a10e2b6b731c1a548f036c48); else if (i == 24) return bytes32(0x0ba433a63174a90ac20992e75e3095496812b652685b5e1a2eae0b1bf4e8fcd1); else if (i == 25) return bytes32(0x019ddb9df2bc98d987d0dfeca9d2b643deafab8f7036562e627c3667266a044c); else if (i == 26) return bytes32(0x2d3c88b23175c5a5565db928414c66d1912b11acf974b2e644caaac04739ce99); else if (i == 27) return bytes32(0x2eab55f6ae4e66e32c5189eed5c470840863445760f5ed7e7b69b2a62600f354); else if (i == 28) return bytes32(0x002df37a2642621802383cf952bf4dd1f32e05433beeb1fd41031fb7eace979d); else if (i == 29) return bytes32(0x104aeb41435db66c3e62feccc1d6f5d98d0a0ed75d1374db457cf462e3a1f427); else if (i == 30) return bytes32(0x1f3c6fd858e9a7d4b0d1f38e256a09d81d5a5e3c963987e2d4b814cfab7c6ebb); else if (i == 31) return bytes32(0x2c7a07d20dff79d01fecedc1134284a8d08436606c93693b67e333f671bf69cc); else revert("Index out of bounds"); } } // File: @openzeppelin\contracts\utils\ReentrancyGuard.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () internal { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: contracts\Shifter.sol pragma solidity ^0.7.0; interface IVerifier { function verifyProof(bytes memory _proof, uint256[6] memory _input) external returns (bool); } abstract contract Shifter is MerkleTreeWithHistory, ReentrancyGuard { IVerifier public immutable verifier; IStorage public immutable noteStorage; uint256 public immutable denomination; uint256 public immutable ethDenomination; bytes32[] public allCommitments; uint256 public allCommitmentsLength = allCommitments.length; mapping(bytes32 => bool) public nullifierHashes; // we store all commitments just to prevent accidental deposits with the same commitment mapping(bytes32 => bool) public commitments; event Deposit(bytes32 indexed commitment, uint32 leafIndex, uint256 timestamp, address indexed depositor, uint256 ethDenomination, uint256 denomination); event Withdrawal(address to, bytes32 nullifierHash, address indexed relayer, uint256 fee); /** @dev The constructor @param _verifier the address of SNARK verifier for this contract @param _hasher the address of MiMC hash contract @param _storage the address of the storage contract @param _denomination transfer amount for each deposit @param _merkleTreeHeight the height of deposits' Merkle Tree @param _ethDenomination the amount of ETH to be deposted */ constructor( IVerifier _verifier, IHasher _hasher, IStorage _storage, uint256 _denomination, uint256 _ethDenomination, uint32 _merkleTreeHeight ) MerkleTreeWithHistory(_merkleTreeHeight, _hasher) { require(_denomination > 0, "denomination should be greater than 0"); noteStorage = _storage; verifier = _verifier; denomination = _denomination; ethDenomination = _ethDenomination; } /** @dev Return the entire commitment array */ function commitmentList() public view returns (bytes32[] memory) { return allCommitments; } /** @dev Deposit funds into the contract. The caller must send (for ETH) or approve (for ERC20) value equal to or `denomination` of this instance. @param _commitment the note commitment, which is PedersenHash(nullifier + secret) @param _encryptedNote encrypted preimage, use xcrypt view for symmetrical encryption (unchecked) @param _passwordHash the hash of the password (unchecked) */ function deposit(bytes32 _commitment, bytes calldata _encryptedNote, bytes32 _passwordHash) external payable nonReentrant { require(msg.value == ethDenomination, "Incorrect deposit value"); // Require fee for gas require(!commitments[_commitment], "The commitment has been submitted"); uint32 insertedIndex = _insert(_commitment); allCommitments.push(_commitment); noteStorage.store(msg.sender, _encryptedNote, _passwordHash); commitments[_commitment] = true; _processDeposit(); emit Deposit(_commitment, insertedIndex, block.timestamp, msg.sender, msg.value, denomination); } /** @dev this function is defined in a child contract */ function _processDeposit() internal virtual; /** @dev Withdraw a deposit from the contract. `proof` is a zkSNARK proof data, and input is an array of circuit public inputs `input` array consists of: - merkle root of all deposits in the contract - hash of unique deposit nullifier to prevent double spends - the recipient of funds - optional fee that goes to the transaction sender (usually a relay) */ function withdraw( bytes calldata _proof, bytes32 _root, bytes32 _nullifierHash, address payable _recipient, address payable _relayer, uint256 _fee, uint256 _refund ) external payable nonReentrant { require(_fee <= denomination, "Fee exceeds transfer value"); require(!nullifierHashes[_nullifierHash], "The note has been already spent"); require(isKnownRoot(_root), "Cannot find your merkle root"); // Make sure to use a recent one require( verifier.verifyProof( _proof, [uint256(_root), uint256(_nullifierHash), uint256(_recipient), uint256(_relayer), _fee, _refund] ), "Invalid withdraw proof" ); nullifierHashes[_nullifierHash] = true; _processWithdraw(_recipient, _relayer, _fee, _refund); emit Withdrawal(_recipient, _nullifierHash, _relayer, _fee); } /** @dev this function is defined in a child contract */ function _processWithdraw( address payable _recipient, address payable _relayer, uint256 _fee, uint256 _refund ) internal virtual; /** @dev whether a note is already spent */ function isSpent(bytes32 _nullifierHash) public view returns (bool) { return nullifierHashes[_nullifierHash]; } /** @dev whether an array of notes is already spent */ function isSpentArray(bytes32[] calldata _nullifierHashes) external view returns (bool[] memory spent) { uint256 nullifierHashesLength = _nullifierHashes.length; spent = new bool[](nullifierHashesLength); for (uint256 i; i < nullifierHashesLength; i++) { if (isSpent(_nullifierHashes[i])) { spent[i] = true; } } } } // File: contracts\Interfaces\ElasticIERC20.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface ElasticIERC20 { /** * @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); // Additional mint and burn functions function burn(address account, uint256 amount) external; function mint(address account, uint256 amount) external; /** * @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 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } } // File: @openzeppelin\contracts\utils\Address.sol pragma solidity >=0.6.2 <0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: contracts\Interfaces\SafeEERC20.sol pragma solidity >=0.6.0 <0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for ElasticIERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeEERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(ElasticIERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(ElasticIERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {ElasticIERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(ElasticIERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(ElasticIERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(ElasticIERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(ElasticIERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: contracts\Interfaces\IOracle.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface for Oracle.sol contract */ interface IOracle { function getCost( uint256 _amount, address _chainlinkFeed, address _xftPool ) external view returns (uint256); function getCostSimpleShift( uint256 _amount, address _chainlinkFeed, address _xftPool, address _tokenPool ) external view returns (uint256); function getTokensForAmount( address _pool, uint32 _interval, address _chainlinkFeed, uint256 _amount, bool _ethLeftSide, address _weth9 ) external view returns (uint256); function ethLeftSide(address _chainlinkFeed) external view returns (bool); function getTokensRaw( address _xftPool, address _tokenPool, uint32 _interval, uint256 _amount, address _weth9 ) external view returns (uint256); function isTokenBelowThreshold( uint256 _threshold, address _pool, uint32 _interval, address _chainlinkFeed, bool _ethLeftSide, address _weth9 ) external view returns (bool); } // File: node_modules\@openzeppelin\contracts\utils\Context.sol pragma solidity >=0.6.0 <0.8.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\utils\Pausable.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor () internal { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin\contracts\access\Ownable.sol pragma solidity >=0.6.0 <0.8.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. */ abstract 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 virtual 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\XFTanon.sol pragma solidity ^0.7.0; contract XFTanon is Shifter, Pausable, Ownable { using SafeEERC20 for ElasticIERC20; ElasticIERC20 public immutable xft; ElasticIERC20 public immutable token; IOracle public oracle; uint256 public tokenPrice; address public xftPool; address public tokenPool; address public weth9; address public chainlinkFeed; uint256 public flexFeeThreshold; bool public oracleActive = true; event SetOracle(address oracle); event SimpleShift(uint256 amount, address recipient, uint256 output); event SetFlexFeeThreshold(uint256 _threshold); event SetChainlinkFeed(address _chainlink); event SetPool(address _pool); constructor( IVerifier _verifier, IHasher _hasher, IStorage _storage, uint256 _denomination, uint256 _ethDenomination, uint32 _merkleTreeHeight, ElasticIERC20 _xft, ElasticIERC20 _token, IOracle _oracle, address _xftPool, address _tokenPool, address _weth9, address _chainlinkFeed, uint256 _flexFeeThreshold ) Shifter(_verifier, _hasher, _storage, _denomination, _ethDenomination, _merkleTreeHeight) { if (_tokenPool == address(0x0) || _xftPool == address(0x0)) oracleActive = false; oracle = _oracle; xft = _xft; token = _token; xftPool = _xftPool; tokenPool = _tokenPool; weth9 = _weth9; chainlinkFeed = _chainlinkFeed; flexFeeThreshold = _flexFeeThreshold; } function pause() external onlyOwner { _pause(); } function setOracle(IOracle _oracle) external onlyOwner whenNotPaused { oracle = _oracle; emit SetOracle(address(_oracle)); } function setChainlinkFeed(address _chainlink) external onlyOwner whenNotPaused { chainlinkFeed = _chainlink; emit SetChainlinkFeed(_chainlink); } function setXFTPool(address _xftPool) external onlyOwner whenNotPaused { xftPool = _xftPool; emit SetPool(_xftPool); } function setTokenPool(address _tokenPool) external onlyOwner whenNotPaused { tokenPool = _tokenPool; emit SetPool(_tokenPool); } function setFlexFeeThreshold(uint256 _threshold) external onlyOwner whenNotPaused { flexFeeThreshold = _threshold; emit SetFlexFeeThreshold(flexFeeThreshold); } function simpleShift(uint256 _amount, address _recipient) public whenNotPaused { require(token.balanceOf(msg.sender) >= _amount, "Insufficient balance"); uint256 _output = oracle.getCostSimpleShift(_amount, chainlinkFeed, xftPool, tokenPool); token.burn(msg.sender, _amount); xft.mint(_recipient, _output); emit SimpleShift(_amount, _recipient, _output); } function getDenomination() external view returns (uint256) { return denomination; } function getCost(uint256 _amount) public view returns (uint256) { if (!oracleActive) return _amount; return oracle.getCost(_amount, chainlinkFeed, xftPool); } function _processDeposit() internal override whenNotPaused { uint256 depositCost = getCost(denomination); require(xft.balanceOf(msg.sender) >= depositCost, "Insufficient Balance"); xft.burn(msg.sender, depositCost); } function _processWithdraw ( address payable _recipient, address payable _relayer, uint256 _fee, // Fee is in USD uint256 _refund ) internal override { require(msg.value == _refund, "Incorrect refund amount received by the contract"); token.mint(_recipient, denomination - _fee); if (_fee > 0) { token.mint(_relayer, _fee); } if (_refund + ethDenomination > 0) { (bool success, ) = _recipient.call{ value: _refund + ethDenomination }(""); if (!success) { // let's return back to the relayer _relayer.transfer(_refund + ethDenomination); } } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IVerifier","name":"_verifier","type":"address"},{"internalType":"contract IHasher","name":"_hasher","type":"address"},{"internalType":"contract IStorage","name":"_storage","type":"address"},{"internalType":"uint256","name":"_denomination","type":"uint256"},{"internalType":"uint256","name":"_ethDenomination","type":"uint256"},{"internalType":"uint32","name":"_merkleTreeHeight","type":"uint32"},{"internalType":"contract ElasticIERC20","name":"_xft","type":"address"},{"internalType":"contract ElasticIERC20","name":"_token","type":"address"},{"internalType":"contract IOracle","name":"_oracle","type":"address"},{"internalType":"address","name":"_xftPool","type":"address"},{"internalType":"address","name":"_tokenPool","type":"address"},{"internalType":"address","name":"_weth9","type":"address"},{"internalType":"address","name":"_chainlinkFeed","type":"address"},{"internalType":"uint256","name":"_flexFeeThreshold","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"commitment","type":"bytes32"},{"indexed":false,"internalType":"uint32","name":"leafIndex","type":"uint32"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethDenomination","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"denomination","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_chainlink","type":"address"}],"name":"SetChainlinkFeed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_threshold","type":"uint256"}],"name":"SetFlexFeeThreshold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oracle","type":"address"}],"name":"SetOracle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_pool","type":"address"}],"name":"SetPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"output","type":"uint256"}],"name":"SimpleShift","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"bytes32","name":"nullifierHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"relayer","type":"address"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"Withdrawal","type":"event"},{"inputs":[],"name":"FIELD_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROOT_HISTORY_SIZE","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ZERO_VALUE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allCommitments","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allCommitmentsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chainlinkFeed","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"commitmentList","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"commitments","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentRootIndex","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"denomination","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_commitment","type":"bytes32"},{"internalType":"bytes","name":"_encryptedNote","type":"bytes"},{"internalType":"bytes32","name":"_passwordHash","type":"bytes32"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"ethDenomination","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"filledSubtrees","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flexFeeThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"getCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDenomination","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IHasher","name":"_hasher","type":"address"},{"internalType":"bytes32","name":"_left","type":"bytes32"},{"internalType":"bytes32","name":"_right","type":"bytes32"}],"name":"hashLeftRight","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"hasher","outputs":[{"internalType":"contract IHasher","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"isKnownRoot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_nullifierHash","type":"bytes32"}],"name":"isSpent","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_nullifierHashes","type":"bytes32[]"}],"name":"isSpentArray","outputs":[{"internalType":"bool[]","name":"spent","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"levels","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextIndex","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"noteStorage","outputs":[{"internalType":"contract IStorage","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"nullifierHashes","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracle","outputs":[{"internalType":"contract IOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"roots","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_chainlink","type":"address"}],"name":"setChainlinkFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_threshold","type":"uint256"}],"name":"setFlexFeeThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IOracle","name":"_oracle","type":"address"}],"name":"setOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenPool","type":"address"}],"name":"setTokenPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_xftPool","type":"address"}],"name":"setXFTPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"simpleShift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract ElasticIERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"verifier","outputs":[{"internalType":"contract IVerifier","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth9","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_proof","type":"bytes"},{"internalType":"bytes32","name":"_root","type":"bytes32"},{"internalType":"bytes32","name":"_nullifierHash","type":"bytes32"},{"internalType":"address payable","name":"_recipient","type":"address"},{"internalType":"address payable","name":"_relayer","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_refund","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"xft","outputs":[{"internalType":"contract ElasticIERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"xftPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"}],"name":"zeros","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"}]
Contract Creation Code
610180604052600280546001600160401b03191690556004546005556010805460ff191660011790553480156200003557600080fd5b5060405162003b3b38038062003b3b83398181016040526101c08110156200005c57600080fd5b508051602082015160408301516060840151608085015160a086015160c087015160e08801516101008901516101208a01516101408b01516101608c01516101808d01516101a0909d01519b9c9a9b999a9899979896979596949593949293919290918d8d8d8d8d8d808563ffffffff82166200010b5760405162461bcd60e51b815260040180806020018281038252602381526020018062003b186023913960400191505060405180910390fd5b60208263ffffffff161062000167576040805162461bcd60e51b815260206004820152601e60248201527f5f6c6576656c732073686f756c64206265206c657373207468616e2033320000604482015290519081900360640190fd5b6001600160e01b031960e083901b1660a0526001600160601b0319606082901b1660805260005b8263ffffffff168163ffffffff161015620001d357620001b463ffffffff8216620003ac565b63ffffffff82166000908152602081905260409020556001016200018e565b50620001e963ffffffff600019840116620003ac565b60008052600160208190527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49919091556003555050826200025c5760405162461bcd60e51b815260040180806020018281038252602581526020018062003af36025913960400191505060405180910390fd5b506001600160601b0319606093841b811660e0529490921b90931660c0526101009290925250610120526008805460ff1916905560006200029c62000a3a565b60088054610100600160a81b0319166101006001600160a01b03841690810291909117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600160a01b03841615806200031057506001600160a01b038516155b1562000321576010805460ff191690555b600980546001600160a01b03199081166001600160a01b0398891617909155606098891b6001600160601b0319908116610140529790981b90961661016052600b8054881694861694909417909355600c8054871692851692909217909155600d80548616918416919091179055600e8054909416911617909155600f555062000a3e945050505050565b600081620003dc57507f2fe54c60d3acabf3343a35b6eba15db4821b340f76e741e2249685ed4899af6c62000a35565b81600114156200040e57507f256a6135777eee2fd26f54b8b7037a25439d5235caee224154186d2b8a52e31d62000a35565b81600214156200044057507f1151949895e82ab19924de92c40a3d6f7bcb60d92b00504b8199613683f0c20062000a35565b81600314156200047257507f20121ee811489ff8d61f09fb89e313f14959a0f28bb428a20dba6b0b068b3bdb62000a35565b8160041415620004a457507f0a89ca6ffa14cc462cfedb842c30ed221a50a3d6bf022a6a57dc82ab24c157c962000a35565b8160051415620004d657507f24ca05c2b5cd42e890d6be94c68d0689f4f21c9cec9c0f13fe41d566dfb5495962000a35565b81600614156200050857507f1ccb97c932565a92c60156bdba2d08f3bf1377464e025cee765679e604a7315c62000a35565b81600714156200053a57507f19156fbd7d1a8bf5cba8909367de1b624534ebab4f0f79e003bccdd1b182bdb462000a35565b81600814156200056c57507f261af8c1f0912e465744641409f622d466c3920ac6e5ff37e36604cb11dfff8062000a35565b81600914156200059d57507e58459724ff6ca5a1652fcbc3e82b93895cf08e975b19beab3f54c217d1c00762000a35565b81600a1415620005cf57507f1f04ef20dee48d39984d8eabe768a70eafa6310ad20849d4573c3c40c2ad1e3062000a35565b81600b14156200060157507f1bea3dec5dab51567ce7e200a30f7ba6d4276aeaa53e2686f962a46c66d511e562000a35565b81600c14156200063357507f0ee0f941e2da4b9e31c3ca97a40d8fa9ce68d97c084177071b3cb46cd3372f0f62000a35565b81600d14156200066557507f1ca9503e8935884501bbaf20be14eb4c46b89772c97b96e3b2ebf3a36a948bbd62000a35565b81600e14156200069757507f133a80e30697cd55d8f7d4b0965b7be24057ba5dc3da898ee2187232446cb10862000a35565b81600f1415620006c957507f13e6d8fc88839ed76e182c2a779af5b2c0da9dd18c90427a644f7e148a6253b662000a35565b8160101415620006fb57507f1eb16b057a477f4bc8f572ea6bee39561098f78f15bfb3699dcbb7bd8db6185462000a35565b81601114156200072d57507f0da2cb16a1ceaabf1c16b838f7a9e3f2a3a3088d9e0a6debaa748114620696ea62000a35565b81601214156200075f57507f24a3b3d822420b14b5d8cb6c28a574f01e98ea9e940551d2ebd75cee12649f9d62000a35565b81601314156200079157507f198622acbd783d1b0d9064105b1fc8e4d8889de95c4c519b3f635809fe6afc0562000a35565b8160141415620007c357507f29d7ed391256ccc3ea596c86e933b89ff339d25ea8ddced975ae2fe30b5296d462000a35565b8160151415620007f557507f19be59f2f0413ce78c0c3703a3a5451b1d7f39629fa33abd11548a76065b296762000a35565b81601614156200082757507f1ff3f61797e538b70e619310d33f2a063e7eb59104e112e95738da1254dc345362000a35565b81601714156200085957507f10c16ae9959cf8358980d9dd9616e48228737310a10e2b6b731c1a548f036c4862000a35565b81601814156200088b57507f0ba433a63174a90ac20992e75e3095496812b652685b5e1a2eae0b1bf4e8fcd162000a35565b8160191415620008bd57507f019ddb9df2bc98d987d0dfeca9d2b643deafab8f7036562e627c3667266a044c62000a35565b81601a1415620008ef57507f2d3c88b23175c5a5565db928414c66d1912b11acf974b2e644caaac04739ce9962000a35565b81601b14156200092157507f2eab55f6ae4e66e32c5189eed5c470840863445760f5ed7e7b69b2a62600f35462000a35565b81601c14156200095257507e2df37a2642621802383cf952bf4dd1f32e05433beeb1fd41031fb7eace979d62000a35565b81601d14156200098457507f104aeb41435db66c3e62feccc1d6f5d98d0a0ed75d1374db457cf462e3a1f42762000a35565b81601e1415620009b657507f1f3c6fd858e9a7d4b0d1f38e256a09d81d5a5e3c963987e2d4b814cfab7c6ebb62000a35565b81601f1415620009e857507f2c7a07d20dff79d01fecedc1134284a8d08436606c93693b67e333f671bf69cc62000a35565b6040805162461bcd60e51b815260206004820152601360248201527f496e646578206f7574206f6620626f756e647300000000000000000000000000604482015290519081900360640190fd5b919050565b3390565b60805160601c60a05160e01c60c05160601c60e05160601c61010051610120516101405160601c6101605160601c612fdc62000b176000398061125b528061140252806127a6528061281b52806128d5525080611464528061195c5280612c975280612d9f525080610ebc5280611d345280612965528061299e5280612a16525080610a8b5280610b0c52806110b45280611980528061284c5280612c6e525080610ff252806115b1525080610c3f5280610e3a5250806111285280612a805280612aec5250806126625280612b785250612fdc6000f3fe6080604052600436106102ae5760003560e01c806389aa6e0811610175578063c82ba2be116100dc578063e829558811610095578063f178e47c1161006f578063f178e47c146109de578063f2fde38b14610a08578063fc0c546a14610a3b578063fc7e9c6f14610a50576102ae565b8063e82955881461098a578063ec732959146109b4578063ed33639f146109c9576102ae565b8063c82ba2be146108e2578063cc59d277146108f7578063cd87a3b414610921578063d050786514610936578063d07e48aa1461094b578063e5285dcc14610960576102ae565b80639fa12d0b1161012e5780639fa12d0b1461077b578063ac98e82714610846578063ae24714c1461085b578063ba70f75714610870578063c2b40ae414610885578063c76b24df146108af576102ae565b806389aa6e08146106b55780638bca6d16146106ca5780638da5cb5b146106df5780638ea121a3146106f45780638ea3099e1461072757806390eeb02b14610766576102ae565b80636d9833e3116102195780637dc0d1d0116101d25780637dc0d1d01461060d5780637ff9b5961461062257806380493b9314610637578063839df945146106615780638456cb591461068b57806386f23a35146106a0576102ae565b80636d9833e31461053e578063706e9e7614610568578063715018a61461057d5780637764b4d2146105925780637adbf973146105c55780637dbdf1f5146105f8576102ae565b8063414a37ba1161026b578063414a37ba1461046e5780634ecf518b1461048357806350879c1c146104b15780635a4dd47d146104c65780635c975abb146104f05780636c26067714610505576102ae565b8063104e9929146102b357806317cc915c146102e45780631fc601c91461032257806321a0adb6146103495780632b7ac3f3146103e45780632f5fd8c6146103f9575b600080fd5b3480156102bf57600080fd5b506102c8610a65565b604080516001600160a01b039092168252519081900360200190f35b3480156102f057600080fd5b5061030e6004803603602081101561030757600080fd5b5035610a74565b604080519115158252519081900360200190f35b34801561032e57600080fd5b50610337610a89565b60408051918252519081900360200190f35b6103e2600480360360e081101561035f57600080fd5b810190602081018135600160201b81111561037957600080fd5b82018360208201111561038b57600080fd5b803590602001918460018302840111600160201b831117156103ac57600080fd5b91935091508035906020810135906001600160a01b03604082013581169160608101359091169060808101359060a00135610aad565b005b3480156103f057600080fd5b506102c8610e38565b6103e26004803603606081101561040f57600080fd5b81359190810190604081016020820135600160201b81111561043057600080fd5b82018360208201111561044257600080fd5b803590602001918460018302840111600160201b8311171561046357600080fd5b919350915035610e5c565b34801561047a57600080fd5b50610337611114565b34801561048f57600080fd5b50610498611126565b6040805163ffffffff9092168252519081900360200190f35b3480156104bd57600080fd5b506102c861114a565b3480156104d257600080fd5b50610337600480360360208110156104e957600080fd5b5035611159565b3480156104fc57600080fd5b5061030e611202565b34801561051157600080fd5b506103e26004803603604081101561052857600080fd5b50803590602001356001600160a01b031661120b565b34801561054a57600080fd5b5061030e6004803603602081101561056157600080fd5b503561153f565b34801561057457600080fd5b506102c86115af565b34801561058957600080fd5b506103e26115d3565b34801561059e57600080fd5b506103e2600480360360208110156105b557600080fd5b50356001600160a01b0316611685565b3480156105d157600080fd5b506103e2600480360360208110156105e857600080fd5b50356001600160a01b0316611788565b34801561060457600080fd5b506102c861188b565b34801561061957600080fd5b506102c861189a565b34801561062e57600080fd5b506103376118a9565b34801561064357600080fd5b506103376004803603602081101561065a57600080fd5b50356118af565b34801561066d57600080fd5b5061030e6004803603602081101561068457600080fd5b50356118d0565b34801561069757600080fd5b506103e26118e5565b3480156106ac57600080fd5b5061030e611951565b3480156106c157600080fd5b506102c861195a565b3480156106d657600080fd5b5061033761197e565b3480156106eb57600080fd5b506102c86119a2565b34801561070057600080fd5b506103e26004803603602081101561071757600080fd5b50356001600160a01b03166119b6565b34801561073357600080fd5b506103376004803603606081101561074a57600080fd5b506001600160a01b038135169060208101359060400135611ab9565b34801561077257600080fd5b50610498611c85565b34801561078757600080fd5b506107f66004803603602081101561079e57600080fd5b810190602081018135600160201b8111156107b857600080fd5b8201836020820111156107ca57600080fd5b803590602001918460208302840111600160201b831117156107eb57600080fd5b509092509050611c91565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561083257818101518382015260200161081a565b505050509050019250505060405180910390f35b34801561085257600080fd5b50610337611d32565b34801561086757600080fd5b50610337611d56565b34801561087c57600080fd5b50610337611d5c565b34801561089157600080fd5b50610337600480360360208110156108a857600080fd5b5035611d77565b3480156108bb57600080fd5b506103e2600480360360208110156108d257600080fd5b50356001600160a01b0316611d89565b3480156108ee57600080fd5b506107f6611e8c565b34801561090357600080fd5b506103e26004803603602081101561091a57600080fd5b5035611ee4565b34801561092d57600080fd5b50610498611fce565b34801561094257600080fd5b506102c8611fd3565b34801561095757600080fd5b50610337611fe2565b34801561096c57600080fd5b5061030e6004803603602081101561098357600080fd5b5035611fe8565b34801561099657600080fd5b50610337600480360360208110156109ad57600080fd5b5035611ffd565b3480156109c057600080fd5b5061033761263c565b3480156109d557600080fd5b506102c8612660565b3480156109ea57600080fd5b5061033760048036036020811015610a0157600080fd5b5035612684565b348015610a1457600080fd5b506103e260048036036020811015610a2b57600080fd5b50356001600160a01b0316612696565b348015610a4757600080fd5b506102c86127a4565b348015610a5c57600080fd5b506104986127c8565b600c546001600160a01b031681565b60066020526000908152604090205460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000090565b60026003541415610b05576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026003557f0000000000000000000000000000000000000000000000000000000000000000821115610b7f576040805162461bcd60e51b815260206004820152601a60248201527f4665652065786365656473207472616e736665722076616c7565000000000000604482015290519081900360640190fd5b60008581526006602052604090205460ff1615610be3576040805162461bcd60e51b815260206004820152601f60248201527f546865206e6f746520686173206265656e20616c7265616479207370656e7400604482015290519081900360640190fd5b610bec8661153f565b610c3d576040805162461bcd60e51b815260206004820152601c60248201527f43616e6e6f742066696e6420796f7572206d65726b6c6520726f6f7400000000604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663695ef6f989896040518060c001604052808b60001c81526020018a60001c8152602001896001600160a01b03168152602001886001600160a01b03168152602001878152602001868152506040518463ffffffff1660e01b8152600401808060200183600660200280838360005b83811015610cee578181015183820152602001610cd6565b505050509050018281038252858582818152602001925080828437600081840152601f19601f820116905080830192505050945050505050602060405180830381600087803b158015610d4057600080fd5b505af1158015610d54573d6000803e3d6000fd5b505050506040513d6020811015610d6a57600080fd5b5051610db6576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b2103bb4ba34323930bb90383937b7b360511b604482015290519081900360640190fd5b6000858152600660205260409020805460ff19166001179055610ddb848484846127db565b604080516001600160a01b038681168252602082018890528183018590529151918516917fe9e508bad6d4c3227e881ca19068f099da81b5164dd6d62b2eaf1e8bc6c349319181900360600190a250506001600355505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60026003541415610eb4576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600355347f000000000000000000000000000000000000000000000000000000000000000014610f2d576040805162461bcd60e51b815260206004820152601760248201527f496e636f7272656374206465706f7369742076616c7565000000000000000000604482015290519081900360640190fd5b60008481526007602052604090205460ff1615610f7b5760405162461bcd60e51b8152600401808060200182810382526021815260200180612f566021913960400191505060405180910390fd5b6000610f8685612a67565b6004805460018101825560008290527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b018790556040516369dabc1360e11b81523391810182815260448201869052606060248301908152606483018890529394506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169363d3b578269392899289928992608401858580828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b15801561106157600080fd5b505af1158015611075573d6000803e3d6000fd5b5050506000868152600760205260409020805460ff191660011790555061109a612c1a565b6040805163ffffffff8316815242602082015234818301527f000000000000000000000000000000000000000000000000000000000000000060608201529051339187917f2bbe99753c37b53c70399433c5f9bb95587299902df481e0cecc28c67776e9ba9181900360800190a350506001600355505050565b600080516020612f1683398151915281565b7f000000000000000000000000000000000000000000000000000000000000000081565b600d546001600160a01b031681565b60105460009060ff1661116d5750806111fd565b600954600e54600b546040805163096013cd60e11b8152600481018790526001600160a01b03938416602482015291831660448301525191909216916312c0279a916064808301926020929190829003018186803b1580156111ce57600080fd5b505afa1580156111e2573d6000803e3d6000fd5b505050506040513d60208110156111f857600080fd5b505190505b919050565b60085460ff1690565b611213611202565b15611258576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156112c657600080fd5b505afa1580156112da573d6000803e3d6000fd5b505050506040513d60208110156112f057600080fd5b5051101561133c576040805162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b600954600e54600b54600c546040805163d577657d60e01b8152600481018890526001600160a01b0394851660248201529284166044840152908316606483015251600093929092169163d577657d91608480820192602092909190829003018186803b1580156113ac57600080fd5b505afa1580156113c0573d6000803e3d6000fd5b505050506040513d60208110156113d657600080fd5b505160408051632770a7eb60e21b81523360048201526024810186905290519192506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691639dc29fac9160448082019260009290919082900301818387803b15801561144a57600080fd5b505af115801561145e573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166340c10f1983836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156114d957600080fd5b505af11580156114ed573d6000803e3d6000fd5b5050604080518681526001600160a01b038616602082015280820185905290517f72d11832dc4cb9122101cf2e7e611497ab526bc7af438ba7bd89dde9517923939350908190036060019150a1505050565b60008161154e575060006111fd565b60025463ffffffff16805b63ffffffff8116600090815260016020526040902054841415611581576001925050506111fd565b63ffffffff81166115905750601e5b6000190163ffffffff8082169083161415611559575060009392505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6115db612dfa565b6001600160a01b03166115ec6119a2565b6001600160a01b031614611635576040805162461bcd60e51b81526020600482018190526024820152600080516020612f36833981519152604482015290519081900360640190fd5b60085460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360088054610100600160a81b0319169055565b61168d612dfa565b6001600160a01b031661169e6119a2565b6001600160a01b0316146116e7576040805162461bcd60e51b81526020600482018190526024820152600080516020612f36833981519152604482015290519081900360640190fd5b6116ef611202565b15611734576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b600c80546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f67816c9262630d6052ccaada1732fda377aa9e9abb3bc91cfd887a016a18a43a9181900360200190a150565b611790612dfa565b6001600160a01b03166117a16119a2565b6001600160a01b0316146117ea576040805162461bcd60e51b81526020600482018190526024820152600080516020612f36833981519152604482015290519081900360640190fd5b6117f2611202565b15611837576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b600980546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fd3b5d1e0ffaeff528910f3663f0adace7694ab8241d58e17a91351ced2e080319181900360200190a150565b600e546001600160a01b031681565b6009546001600160a01b031681565b600a5481565b600481815481106118bf57600080fd5b600091825260209091200154905081565b60076020526000908152604090205460ff1681565b6118ed612dfa565b6001600160a01b03166118fe6119a2565b6001600160a01b031614611947576040805162461bcd60e51b81526020600482018190526024820152600080516020612f36833981519152604482015290519081900360640190fd5b61194f612dfe565b565b60105460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60085461010090046001600160a01b031690565b6119be612dfa565b6001600160a01b03166119cf6119a2565b6001600160a01b031614611a18576040805162461bcd60e51b81526020600482018190526024820152600080516020612f36833981519152604482015290519081900360640190fd5b611a20611202565b15611a65576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b600e80546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fb13eef744d54f8d44324b9b698a0e6ffca1c3f304cca39bd8c42ef9a948dccbe9181900360200190a150565b6000600080516020612f168339815191528310611b1d576040805162461bcd60e51b815260206004820181905260248201527f5f6c6566742073686f756c6420626520696e7369646520746865206669656c64604482015290519081900360640190fd5b600080516020612f168339815191528210611b695760405162461bcd60e51b8152600401808060200182810382526021815260200180612ef56021913960400191505060405180910390fd5b6040805163f47d33b560e01b8152600481018590526000602482018190528251869391926001600160a01b0389169263f47d33b592604480840193829003018186803b158015611bb857600080fd5b505afa158015611bcc573d6000803e3d6000fd5b505050506040513d6040811015611be257600080fd5b5080516020909101519092509050600080516020612f168339815191528483089150856001600160a01b031663f47d33b583836040518363ffffffff1660e01b81526004018083815260200182815260200192505050604080518083038186803b158015611c4f57600080fd5b505afa158015611c63573d6000803e3d6000fd5b505050506040513d6040811015611c7957600080fd5b50519695505050505050565b60025463ffffffff1681565b6060818067ffffffffffffffff81118015611cab57600080fd5b50604051908082528060200260200182016040528015611cd5578160200160208202803683370190505b50915060005b81811015611d2a57611cfe858583818110611cf257fe5b90506020020135611fe8565b15611d22576001838281518110611d1157fe5b911515602092830291909101909101525b600101611cdb565b505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60055481565b60025463ffffffff1660009081526001602052604090205490565b60016020526000908152604090205481565b611d91612dfa565b6001600160a01b0316611da26119a2565b6001600160a01b031614611deb576040805162461bcd60e51b81526020600482018190526024820152600080516020612f36833981519152604482015290519081900360640190fd5b611df3611202565b15611e38576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b600b80546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f67816c9262630d6052ccaada1732fda377aa9e9abb3bc91cfd887a016a18a43a9181900360200190a150565b60606004805480602002602001604051908101604052809291908181526020018280548015611eda57602002820191906000526020600020905b815481526020019060010190808311611ec6575b5050505050905090565b611eec612dfa565b6001600160a01b0316611efd6119a2565b6001600160a01b031614611f46576040805162461bcd60e51b81526020600482018190526024820152600080516020612f36833981519152604482015290519081900360640190fd5b611f4e611202565b15611f93576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b600f8190556040805182815290517f55dcd7ccc8e8a64a6710ef7df032c7be305094fa356baeb1f626bfb0c53801a09181900360200190a150565b601e81565b600b546001600160a01b031681565b600f5481565b60009081526006602052604090205460ff1690565b60008161202b57507f2fe54c60d3acabf3343a35b6eba15db4821b340f76e741e2249685ed4899af6c6111fd565b816001141561205b57507f256a6135777eee2fd26f54b8b7037a25439d5235caee224154186d2b8a52e31d6111fd565b816002141561208b57507f1151949895e82ab19924de92c40a3d6f7bcb60d92b00504b8199613683f0c2006111fd565b81600314156120bb57507f20121ee811489ff8d61f09fb89e313f14959a0f28bb428a20dba6b0b068b3bdb6111fd565b81600414156120eb57507f0a89ca6ffa14cc462cfedb842c30ed221a50a3d6bf022a6a57dc82ab24c157c96111fd565b816005141561211b57507f24ca05c2b5cd42e890d6be94c68d0689f4f21c9cec9c0f13fe41d566dfb549596111fd565b816006141561214b57507f1ccb97c932565a92c60156bdba2d08f3bf1377464e025cee765679e604a7315c6111fd565b816007141561217b57507f19156fbd7d1a8bf5cba8909367de1b624534ebab4f0f79e003bccdd1b182bdb46111fd565b81600814156121ab57507f261af8c1f0912e465744641409f622d466c3920ac6e5ff37e36604cb11dfff806111fd565b81600914156121da57507e58459724ff6ca5a1652fcbc3e82b93895cf08e975b19beab3f54c217d1c0076111fd565b81600a141561220a57507f1f04ef20dee48d39984d8eabe768a70eafa6310ad20849d4573c3c40c2ad1e306111fd565b81600b141561223a57507f1bea3dec5dab51567ce7e200a30f7ba6d4276aeaa53e2686f962a46c66d511e56111fd565b81600c141561226a57507f0ee0f941e2da4b9e31c3ca97a40d8fa9ce68d97c084177071b3cb46cd3372f0f6111fd565b81600d141561229a57507f1ca9503e8935884501bbaf20be14eb4c46b89772c97b96e3b2ebf3a36a948bbd6111fd565b81600e14156122ca57507f133a80e30697cd55d8f7d4b0965b7be24057ba5dc3da898ee2187232446cb1086111fd565b81600f14156122fa57507f13e6d8fc88839ed76e182c2a779af5b2c0da9dd18c90427a644f7e148a6253b66111fd565b816010141561232a57507f1eb16b057a477f4bc8f572ea6bee39561098f78f15bfb3699dcbb7bd8db618546111fd565b816011141561235a57507f0da2cb16a1ceaabf1c16b838f7a9e3f2a3a3088d9e0a6debaa748114620696ea6111fd565b816012141561238a57507f24a3b3d822420b14b5d8cb6c28a574f01e98ea9e940551d2ebd75cee12649f9d6111fd565b81601314156123ba57507f198622acbd783d1b0d9064105b1fc8e4d8889de95c4c519b3f635809fe6afc056111fd565b81601414156123ea57507f29d7ed391256ccc3ea596c86e933b89ff339d25ea8ddced975ae2fe30b5296d46111fd565b816015141561241a57507f19be59f2f0413ce78c0c3703a3a5451b1d7f39629fa33abd11548a76065b29676111fd565b816016141561244a57507f1ff3f61797e538b70e619310d33f2a063e7eb59104e112e95738da1254dc34536111fd565b816017141561247a57507f10c16ae9959cf8358980d9dd9616e48228737310a10e2b6b731c1a548f036c486111fd565b81601814156124aa57507f0ba433a63174a90ac20992e75e3095496812b652685b5e1a2eae0b1bf4e8fcd16111fd565b81601914156124da57507f019ddb9df2bc98d987d0dfeca9d2b643deafab8f7036562e627c3667266a044c6111fd565b81601a141561250a57507f2d3c88b23175c5a5565db928414c66d1912b11acf974b2e644caaac04739ce996111fd565b81601b141561253a57507f2eab55f6ae4e66e32c5189eed5c470840863445760f5ed7e7b69b2a62600f3546111fd565b81601c141561256957507e2df37a2642621802383cf952bf4dd1f32e05433beeb1fd41031fb7eace979d6111fd565b81601d141561259957507f104aeb41435db66c3e62feccc1d6f5d98d0a0ed75d1374db457cf462e3a1f4276111fd565b81601e14156125c957507f1f3c6fd858e9a7d4b0d1f38e256a09d81d5a5e3c963987e2d4b814cfab7c6ebb6111fd565b81601f14156125f957507f2c7a07d20dff79d01fecedc1134284a8d08436606c93693b67e333f671bf69cc6111fd565b6040805162461bcd60e51b8152602060048201526013602482015272496e646578206f7574206f6620626f756e647360681b604482015290519081900360640190fd5b7f2fe54c60d3acabf3343a35b6eba15db4821b340f76e741e2249685ed4899af6c81565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006020819052908152604090205481565b61269e612dfa565b6001600160a01b03166126af6119a2565b6001600160a01b0316146126f8576040805162461bcd60e51b81526020600482018190526024820152600080516020612f36833981519152604482015290519081900360640190fd5b6001600160a01b03811661273d5760405162461bcd60e51b8152600401808060200182810382526026815260200180612e9f6026913960400191505060405180910390fd5b6008546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600880546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b600254600160201b900463ffffffff1681565b8034146128195760405162461bcd60e51b8152600401808060200182810382526030815260200180612ec56030913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166340c10f1985847f0000000000000000000000000000000000000000000000000000000000000000036040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156128b257600080fd5b505af11580156128c6573d6000803e3d6000fd5b505050506000821115612963577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166340c10f1984846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561294a57600080fd5b505af115801561295e573d6000803e3d6000fd5b505050505b7f0000000000000000000000000000000000000000000000000000000000000000810115612a61576040516000906001600160a01b038616907f00000000000000000000000000000000000000000000000000000000000000008401908381818185875af1925050503d80600081146129f8576040519150601f19603f3d011682016040523d82523d6000602084013e6129fd565b606091505b5050905080612a5f576040516001600160a01b038516907f0000000000000000000000000000000000000000000000000000000000000000840180156108fc02916000818181858888f19350505050158015612a5d573d6000803e3d6000fd5b505b505b50505050565b6002805460009163ffffffff600160201b9092048216917f0000000000000000000000000000000000000000000000000000000000000000811690910a16811415612ae35760405162461bcd60e51b8152600401808060200182810382526030815260200180612f776030913960400191505060405180910390fd5b8083600080805b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff168163ffffffff161015612bb45760018516612b5757839250612b388163ffffffff16611ffd565b63ffffffff821660009081526020819052604090208590559150612b73565b63ffffffff811660009081526020819052604090205492508391505b612b9e7f00000000000000000000000000000000000000000000000000000000000000008484611ab9565b9350600263ffffffff8616049450600101612aea565b505060028054601e63ffffffff8083166001908101821692909206811663ffffffff199093168317845560009283526020829052604090922094909455815493860116600160201b0267ffffffff00000000199093169290921790915550909392505050565b612c22611202565b15612c67576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6000612c927f0000000000000000000000000000000000000000000000000000000000000000611159565b9050807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612d0257600080fd5b505afa158015612d16573d6000803e3d6000fd5b505050506040513d6020811015612d2c57600080fd5b50511015612d78576040805162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742042616c616e636560601b604482015290519081900360640190fd5b60408051632770a7eb60e21b81523360048201526024810183905290516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691639dc29fac91604480830192600092919082900301818387803b158015612de657600080fd5b505af1158015612a5f573d6000803e3d6000fd5b3390565b612e06611202565b15612e4b576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6008805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612e81612dfa565b604080516001600160a01b039092168252519081900360200190a156fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373496e636f727265637420726566756e6420616d6f756e742072656365697665642062792074686520636f6e74726163745f72696768742073686f756c6420626520696e7369646520746865206669656c6430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000014f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657254686520636f6d6d69746d656e7420686173206265656e207375626d69747465644d65726b6c6520747265652069732066756c6c2e204e6f206d6f7265206c65617665732063616e206265206164646564a26469706673582212209f1f1d612d9548d3bd7f680e9e90253aef1e3db414f055677c2d7fd313f6b62764736f6c6343000706003364656e6f6d696e6174696f6e2073686f756c642062652067726561746572207468616e20305f6c6576656c732073686f756c642062652067726561746572207468616e207a65726f000000000000000000000000cc76b5ea37a1beaae862d533b7795c4f2f9dbb7c000000000000000000000000484c0f23e30611b34f2fa503396a1a01c8951d330000000000000000000000008997f152a1da95fc7f966bddd64571c9ad11075e00000000000000000000000000000000000000000000001b1ae4d6e2ef50000000000000000000000000000000000000000000000000000000b1a2bc2ec50000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000076bc677d444f1e9d57daf5187ee2b7dc852745ae0000000000000000000000005a7e6c8204a1359db9aacab7ba5fc309b7981efd0000000000000000000000000993a120c265ac7305347190579db9a28bae5fd2000000000000000000000000701b319aff36311f720f0a1ebd6636dd84bb3e8b00000000000000000000000012ded3d75fae8b27cd7f2b1a469fe088a3711dde000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b84190000000000000000000000000000000000000000000000000d87e55590018000
Deployed Bytecode
0x6080604052600436106102ae5760003560e01c806389aa6e0811610175578063c82ba2be116100dc578063e829558811610095578063f178e47c1161006f578063f178e47c146109de578063f2fde38b14610a08578063fc0c546a14610a3b578063fc7e9c6f14610a50576102ae565b8063e82955881461098a578063ec732959146109b4578063ed33639f146109c9576102ae565b8063c82ba2be146108e2578063cc59d277146108f7578063cd87a3b414610921578063d050786514610936578063d07e48aa1461094b578063e5285dcc14610960576102ae565b80639fa12d0b1161012e5780639fa12d0b1461077b578063ac98e82714610846578063ae24714c1461085b578063ba70f75714610870578063c2b40ae414610885578063c76b24df146108af576102ae565b806389aa6e08146106b55780638bca6d16146106ca5780638da5cb5b146106df5780638ea121a3146106f45780638ea3099e1461072757806390eeb02b14610766576102ae565b80636d9833e3116102195780637dc0d1d0116101d25780637dc0d1d01461060d5780637ff9b5961461062257806380493b9314610637578063839df945146106615780638456cb591461068b57806386f23a35146106a0576102ae565b80636d9833e31461053e578063706e9e7614610568578063715018a61461057d5780637764b4d2146105925780637adbf973146105c55780637dbdf1f5146105f8576102ae565b8063414a37ba1161026b578063414a37ba1461046e5780634ecf518b1461048357806350879c1c146104b15780635a4dd47d146104c65780635c975abb146104f05780636c26067714610505576102ae565b8063104e9929146102b357806317cc915c146102e45780631fc601c91461032257806321a0adb6146103495780632b7ac3f3146103e45780632f5fd8c6146103f9575b600080fd5b3480156102bf57600080fd5b506102c8610a65565b604080516001600160a01b039092168252519081900360200190f35b3480156102f057600080fd5b5061030e6004803603602081101561030757600080fd5b5035610a74565b604080519115158252519081900360200190f35b34801561032e57600080fd5b50610337610a89565b60408051918252519081900360200190f35b6103e2600480360360e081101561035f57600080fd5b810190602081018135600160201b81111561037957600080fd5b82018360208201111561038b57600080fd5b803590602001918460018302840111600160201b831117156103ac57600080fd5b91935091508035906020810135906001600160a01b03604082013581169160608101359091169060808101359060a00135610aad565b005b3480156103f057600080fd5b506102c8610e38565b6103e26004803603606081101561040f57600080fd5b81359190810190604081016020820135600160201b81111561043057600080fd5b82018360208201111561044257600080fd5b803590602001918460018302840111600160201b8311171561046357600080fd5b919350915035610e5c565b34801561047a57600080fd5b50610337611114565b34801561048f57600080fd5b50610498611126565b6040805163ffffffff9092168252519081900360200190f35b3480156104bd57600080fd5b506102c861114a565b3480156104d257600080fd5b50610337600480360360208110156104e957600080fd5b5035611159565b3480156104fc57600080fd5b5061030e611202565b34801561051157600080fd5b506103e26004803603604081101561052857600080fd5b50803590602001356001600160a01b031661120b565b34801561054a57600080fd5b5061030e6004803603602081101561056157600080fd5b503561153f565b34801561057457600080fd5b506102c86115af565b34801561058957600080fd5b506103e26115d3565b34801561059e57600080fd5b506103e2600480360360208110156105b557600080fd5b50356001600160a01b0316611685565b3480156105d157600080fd5b506103e2600480360360208110156105e857600080fd5b50356001600160a01b0316611788565b34801561060457600080fd5b506102c861188b565b34801561061957600080fd5b506102c861189a565b34801561062e57600080fd5b506103376118a9565b34801561064357600080fd5b506103376004803603602081101561065a57600080fd5b50356118af565b34801561066d57600080fd5b5061030e6004803603602081101561068457600080fd5b50356118d0565b34801561069757600080fd5b506103e26118e5565b3480156106ac57600080fd5b5061030e611951565b3480156106c157600080fd5b506102c861195a565b3480156106d657600080fd5b5061033761197e565b3480156106eb57600080fd5b506102c86119a2565b34801561070057600080fd5b506103e26004803603602081101561071757600080fd5b50356001600160a01b03166119b6565b34801561073357600080fd5b506103376004803603606081101561074a57600080fd5b506001600160a01b038135169060208101359060400135611ab9565b34801561077257600080fd5b50610498611c85565b34801561078757600080fd5b506107f66004803603602081101561079e57600080fd5b810190602081018135600160201b8111156107b857600080fd5b8201836020820111156107ca57600080fd5b803590602001918460208302840111600160201b831117156107eb57600080fd5b509092509050611c91565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561083257818101518382015260200161081a565b505050509050019250505060405180910390f35b34801561085257600080fd5b50610337611d32565b34801561086757600080fd5b50610337611d56565b34801561087c57600080fd5b50610337611d5c565b34801561089157600080fd5b50610337600480360360208110156108a857600080fd5b5035611d77565b3480156108bb57600080fd5b506103e2600480360360208110156108d257600080fd5b50356001600160a01b0316611d89565b3480156108ee57600080fd5b506107f6611e8c565b34801561090357600080fd5b506103e26004803603602081101561091a57600080fd5b5035611ee4565b34801561092d57600080fd5b50610498611fce565b34801561094257600080fd5b506102c8611fd3565b34801561095757600080fd5b50610337611fe2565b34801561096c57600080fd5b5061030e6004803603602081101561098357600080fd5b5035611fe8565b34801561099657600080fd5b50610337600480360360208110156109ad57600080fd5b5035611ffd565b3480156109c057600080fd5b5061033761263c565b3480156109d557600080fd5b506102c8612660565b3480156109ea57600080fd5b5061033760048036036020811015610a0157600080fd5b5035612684565b348015610a1457600080fd5b506103e260048036036020811015610a2b57600080fd5b50356001600160a01b0316612696565b348015610a4757600080fd5b506102c86127a4565b348015610a5c57600080fd5b506104986127c8565b600c546001600160a01b031681565b60066020526000908152604090205460ff1681565b7f00000000000000000000000000000000000000000000001b1ae4d6e2ef50000090565b60026003541415610b05576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026003557f00000000000000000000000000000000000000000000001b1ae4d6e2ef500000821115610b7f576040805162461bcd60e51b815260206004820152601a60248201527f4665652065786365656473207472616e736665722076616c7565000000000000604482015290519081900360640190fd5b60008581526006602052604090205460ff1615610be3576040805162461bcd60e51b815260206004820152601f60248201527f546865206e6f746520686173206265656e20616c7265616479207370656e7400604482015290519081900360640190fd5b610bec8661153f565b610c3d576040805162461bcd60e51b815260206004820152601c60248201527f43616e6e6f742066696e6420796f7572206d65726b6c6520726f6f7400000000604482015290519081900360640190fd5b7f000000000000000000000000cc76b5ea37a1beaae862d533b7795c4f2f9dbb7c6001600160a01b031663695ef6f989896040518060c001604052808b60001c81526020018a60001c8152602001896001600160a01b03168152602001886001600160a01b03168152602001878152602001868152506040518463ffffffff1660e01b8152600401808060200183600660200280838360005b83811015610cee578181015183820152602001610cd6565b505050509050018281038252858582818152602001925080828437600081840152601f19601f820116905080830192505050945050505050602060405180830381600087803b158015610d4057600080fd5b505af1158015610d54573d6000803e3d6000fd5b505050506040513d6020811015610d6a57600080fd5b5051610db6576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b2103bb4ba34323930bb90383937b7b360511b604482015290519081900360640190fd5b6000858152600660205260409020805460ff19166001179055610ddb848484846127db565b604080516001600160a01b038681168252602082018890528183018590529151918516917fe9e508bad6d4c3227e881ca19068f099da81b5164dd6d62b2eaf1e8bc6c349319181900360600190a250506001600355505050505050565b7f000000000000000000000000cc76b5ea37a1beaae862d533b7795c4f2f9dbb7c81565b60026003541415610eb4576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600355347f00000000000000000000000000000000000000000000000000b1a2bc2ec5000014610f2d576040805162461bcd60e51b815260206004820152601760248201527f496e636f7272656374206465706f7369742076616c7565000000000000000000604482015290519081900360640190fd5b60008481526007602052604090205460ff1615610f7b5760405162461bcd60e51b8152600401808060200182810382526021815260200180612f566021913960400191505060405180910390fd5b6000610f8685612a67565b6004805460018101825560008290527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b018790556040516369dabc1360e11b81523391810182815260448201869052606060248301908152606483018890529394506001600160a01b037f0000000000000000000000008997f152a1da95fc7f966bddd64571c9ad11075e169363d3b578269392899289928992608401858580828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b15801561106157600080fd5b505af1158015611075573d6000803e3d6000fd5b5050506000868152600760205260409020805460ff191660011790555061109a612c1a565b6040805163ffffffff8316815242602082015234818301527f00000000000000000000000000000000000000000000001b1ae4d6e2ef50000060608201529051339187917f2bbe99753c37b53c70399433c5f9bb95587299902df481e0cecc28c67776e9ba9181900360800190a350506001600355505050565b600080516020612f1683398151915281565b7f000000000000000000000000000000000000000000000000000000000000001481565b600d546001600160a01b031681565b60105460009060ff1661116d5750806111fd565b600954600e54600b546040805163096013cd60e11b8152600481018790526001600160a01b03938416602482015291831660448301525191909216916312c0279a916064808301926020929190829003018186803b1580156111ce57600080fd5b505afa1580156111e2573d6000803e3d6000fd5b505050506040513d60208110156111f857600080fd5b505190505b919050565b60085460ff1690565b611213611202565b15611258576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b817f0000000000000000000000005a7e6c8204a1359db9aacab7ba5fc309b7981efd6001600160a01b03166370a08231336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156112c657600080fd5b505afa1580156112da573d6000803e3d6000fd5b505050506040513d60208110156112f057600080fd5b5051101561133c576040805162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b600954600e54600b54600c546040805163d577657d60e01b8152600481018890526001600160a01b0394851660248201529284166044840152908316606483015251600093929092169163d577657d91608480820192602092909190829003018186803b1580156113ac57600080fd5b505afa1580156113c0573d6000803e3d6000fd5b505050506040513d60208110156113d657600080fd5b505160408051632770a7eb60e21b81523360048201526024810186905290519192506001600160a01b037f0000000000000000000000005a7e6c8204a1359db9aacab7ba5fc309b7981efd1691639dc29fac9160448082019260009290919082900301818387803b15801561144a57600080fd5b505af115801561145e573d6000803e3d6000fd5b505050507f00000000000000000000000076bc677d444f1e9d57daf5187ee2b7dc852745ae6001600160a01b03166340c10f1983836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156114d957600080fd5b505af11580156114ed573d6000803e3d6000fd5b5050604080518681526001600160a01b038616602082015280820185905290517f72d11832dc4cb9122101cf2e7e611497ab526bc7af438ba7bd89dde9517923939350908190036060019150a1505050565b60008161154e575060006111fd565b60025463ffffffff16805b63ffffffff8116600090815260016020526040902054841415611581576001925050506111fd565b63ffffffff81166115905750601e5b6000190163ffffffff8082169083161415611559575060009392505050565b7f0000000000000000000000008997f152a1da95fc7f966bddd64571c9ad11075e81565b6115db612dfa565b6001600160a01b03166115ec6119a2565b6001600160a01b031614611635576040805162461bcd60e51b81526020600482018190526024820152600080516020612f36833981519152604482015290519081900360640190fd5b60085460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360088054610100600160a81b0319169055565b61168d612dfa565b6001600160a01b031661169e6119a2565b6001600160a01b0316146116e7576040805162461bcd60e51b81526020600482018190526024820152600080516020612f36833981519152604482015290519081900360640190fd5b6116ef611202565b15611734576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b600c80546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f67816c9262630d6052ccaada1732fda377aa9e9abb3bc91cfd887a016a18a43a9181900360200190a150565b611790612dfa565b6001600160a01b03166117a16119a2565b6001600160a01b0316146117ea576040805162461bcd60e51b81526020600482018190526024820152600080516020612f36833981519152604482015290519081900360640190fd5b6117f2611202565b15611837576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b600980546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fd3b5d1e0ffaeff528910f3663f0adace7694ab8241d58e17a91351ced2e080319181900360200190a150565b600e546001600160a01b031681565b6009546001600160a01b031681565b600a5481565b600481815481106118bf57600080fd5b600091825260209091200154905081565b60076020526000908152604090205460ff1681565b6118ed612dfa565b6001600160a01b03166118fe6119a2565b6001600160a01b031614611947576040805162461bcd60e51b81526020600482018190526024820152600080516020612f36833981519152604482015290519081900360640190fd5b61194f612dfe565b565b60105460ff1681565b7f00000000000000000000000076bc677d444f1e9d57daf5187ee2b7dc852745ae81565b7f00000000000000000000000000000000000000000000001b1ae4d6e2ef50000081565b60085461010090046001600160a01b031690565b6119be612dfa565b6001600160a01b03166119cf6119a2565b6001600160a01b031614611a18576040805162461bcd60e51b81526020600482018190526024820152600080516020612f36833981519152604482015290519081900360640190fd5b611a20611202565b15611a65576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b600e80546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fb13eef744d54f8d44324b9b698a0e6ffca1c3f304cca39bd8c42ef9a948dccbe9181900360200190a150565b6000600080516020612f168339815191528310611b1d576040805162461bcd60e51b815260206004820181905260248201527f5f6c6566742073686f756c6420626520696e7369646520746865206669656c64604482015290519081900360640190fd5b600080516020612f168339815191528210611b695760405162461bcd60e51b8152600401808060200182810382526021815260200180612ef56021913960400191505060405180910390fd5b6040805163f47d33b560e01b8152600481018590526000602482018190528251869391926001600160a01b0389169263f47d33b592604480840193829003018186803b158015611bb857600080fd5b505afa158015611bcc573d6000803e3d6000fd5b505050506040513d6040811015611be257600080fd5b5080516020909101519092509050600080516020612f168339815191528483089150856001600160a01b031663f47d33b583836040518363ffffffff1660e01b81526004018083815260200182815260200192505050604080518083038186803b158015611c4f57600080fd5b505afa158015611c63573d6000803e3d6000fd5b505050506040513d6040811015611c7957600080fd5b50519695505050505050565b60025463ffffffff1681565b6060818067ffffffffffffffff81118015611cab57600080fd5b50604051908082528060200260200182016040528015611cd5578160200160208202803683370190505b50915060005b81811015611d2a57611cfe858583818110611cf257fe5b90506020020135611fe8565b15611d22576001838281518110611d1157fe5b911515602092830291909101909101525b600101611cdb565b505092915050565b7f00000000000000000000000000000000000000000000000000b1a2bc2ec5000081565b60055481565b60025463ffffffff1660009081526001602052604090205490565b60016020526000908152604090205481565b611d91612dfa565b6001600160a01b0316611da26119a2565b6001600160a01b031614611deb576040805162461bcd60e51b81526020600482018190526024820152600080516020612f36833981519152604482015290519081900360640190fd5b611df3611202565b15611e38576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b600b80546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f67816c9262630d6052ccaada1732fda377aa9e9abb3bc91cfd887a016a18a43a9181900360200190a150565b60606004805480602002602001604051908101604052809291908181526020018280548015611eda57602002820191906000526020600020905b815481526020019060010190808311611ec6575b5050505050905090565b611eec612dfa565b6001600160a01b0316611efd6119a2565b6001600160a01b031614611f46576040805162461bcd60e51b81526020600482018190526024820152600080516020612f36833981519152604482015290519081900360640190fd5b611f4e611202565b15611f93576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b600f8190556040805182815290517f55dcd7ccc8e8a64a6710ef7df032c7be305094fa356baeb1f626bfb0c53801a09181900360200190a150565b601e81565b600b546001600160a01b031681565b600f5481565b60009081526006602052604090205460ff1690565b60008161202b57507f2fe54c60d3acabf3343a35b6eba15db4821b340f76e741e2249685ed4899af6c6111fd565b816001141561205b57507f256a6135777eee2fd26f54b8b7037a25439d5235caee224154186d2b8a52e31d6111fd565b816002141561208b57507f1151949895e82ab19924de92c40a3d6f7bcb60d92b00504b8199613683f0c2006111fd565b81600314156120bb57507f20121ee811489ff8d61f09fb89e313f14959a0f28bb428a20dba6b0b068b3bdb6111fd565b81600414156120eb57507f0a89ca6ffa14cc462cfedb842c30ed221a50a3d6bf022a6a57dc82ab24c157c96111fd565b816005141561211b57507f24ca05c2b5cd42e890d6be94c68d0689f4f21c9cec9c0f13fe41d566dfb549596111fd565b816006141561214b57507f1ccb97c932565a92c60156bdba2d08f3bf1377464e025cee765679e604a7315c6111fd565b816007141561217b57507f19156fbd7d1a8bf5cba8909367de1b624534ebab4f0f79e003bccdd1b182bdb46111fd565b81600814156121ab57507f261af8c1f0912e465744641409f622d466c3920ac6e5ff37e36604cb11dfff806111fd565b81600914156121da57507e58459724ff6ca5a1652fcbc3e82b93895cf08e975b19beab3f54c217d1c0076111fd565b81600a141561220a57507f1f04ef20dee48d39984d8eabe768a70eafa6310ad20849d4573c3c40c2ad1e306111fd565b81600b141561223a57507f1bea3dec5dab51567ce7e200a30f7ba6d4276aeaa53e2686f962a46c66d511e56111fd565b81600c141561226a57507f0ee0f941e2da4b9e31c3ca97a40d8fa9ce68d97c084177071b3cb46cd3372f0f6111fd565b81600d141561229a57507f1ca9503e8935884501bbaf20be14eb4c46b89772c97b96e3b2ebf3a36a948bbd6111fd565b81600e14156122ca57507f133a80e30697cd55d8f7d4b0965b7be24057ba5dc3da898ee2187232446cb1086111fd565b81600f14156122fa57507f13e6d8fc88839ed76e182c2a779af5b2c0da9dd18c90427a644f7e148a6253b66111fd565b816010141561232a57507f1eb16b057a477f4bc8f572ea6bee39561098f78f15bfb3699dcbb7bd8db618546111fd565b816011141561235a57507f0da2cb16a1ceaabf1c16b838f7a9e3f2a3a3088d9e0a6debaa748114620696ea6111fd565b816012141561238a57507f24a3b3d822420b14b5d8cb6c28a574f01e98ea9e940551d2ebd75cee12649f9d6111fd565b81601314156123ba57507f198622acbd783d1b0d9064105b1fc8e4d8889de95c4c519b3f635809fe6afc056111fd565b81601414156123ea57507f29d7ed391256ccc3ea596c86e933b89ff339d25ea8ddced975ae2fe30b5296d46111fd565b816015141561241a57507f19be59f2f0413ce78c0c3703a3a5451b1d7f39629fa33abd11548a76065b29676111fd565b816016141561244a57507f1ff3f61797e538b70e619310d33f2a063e7eb59104e112e95738da1254dc34536111fd565b816017141561247a57507f10c16ae9959cf8358980d9dd9616e48228737310a10e2b6b731c1a548f036c486111fd565b81601814156124aa57507f0ba433a63174a90ac20992e75e3095496812b652685b5e1a2eae0b1bf4e8fcd16111fd565b81601914156124da57507f019ddb9df2bc98d987d0dfeca9d2b643deafab8f7036562e627c3667266a044c6111fd565b81601a141561250a57507f2d3c88b23175c5a5565db928414c66d1912b11acf974b2e644caaac04739ce996111fd565b81601b141561253a57507f2eab55f6ae4e66e32c5189eed5c470840863445760f5ed7e7b69b2a62600f3546111fd565b81601c141561256957507e2df37a2642621802383cf952bf4dd1f32e05433beeb1fd41031fb7eace979d6111fd565b81601d141561259957507f104aeb41435db66c3e62feccc1d6f5d98d0a0ed75d1374db457cf462e3a1f4276111fd565b81601e14156125c957507f1f3c6fd858e9a7d4b0d1f38e256a09d81d5a5e3c963987e2d4b814cfab7c6ebb6111fd565b81601f14156125f957507f2c7a07d20dff79d01fecedc1134284a8d08436606c93693b67e333f671bf69cc6111fd565b6040805162461bcd60e51b8152602060048201526013602482015272496e646578206f7574206f6620626f756e647360681b604482015290519081900360640190fd5b7f2fe54c60d3acabf3343a35b6eba15db4821b340f76e741e2249685ed4899af6c81565b7f000000000000000000000000484c0f23e30611b34f2fa503396a1a01c8951d3381565b60006020819052908152604090205481565b61269e612dfa565b6001600160a01b03166126af6119a2565b6001600160a01b0316146126f8576040805162461bcd60e51b81526020600482018190526024820152600080516020612f36833981519152604482015290519081900360640190fd5b6001600160a01b03811661273d5760405162461bcd60e51b8152600401808060200182810382526026815260200180612e9f6026913960400191505060405180910390fd5b6008546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600880546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b7f0000000000000000000000005a7e6c8204a1359db9aacab7ba5fc309b7981efd81565b600254600160201b900463ffffffff1681565b8034146128195760405162461bcd60e51b8152600401808060200182810382526030815260200180612ec56030913960400191505060405180910390fd5b7f0000000000000000000000005a7e6c8204a1359db9aacab7ba5fc309b7981efd6001600160a01b03166340c10f1985847f00000000000000000000000000000000000000000000001b1ae4d6e2ef500000036040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156128b257600080fd5b505af11580156128c6573d6000803e3d6000fd5b505050506000821115612963577f0000000000000000000000005a7e6c8204a1359db9aacab7ba5fc309b7981efd6001600160a01b03166340c10f1984846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561294a57600080fd5b505af115801561295e573d6000803e3d6000fd5b505050505b7f00000000000000000000000000000000000000000000000000b1a2bc2ec50000810115612a61576040516000906001600160a01b038616907f00000000000000000000000000000000000000000000000000b1a2bc2ec500008401908381818185875af1925050503d80600081146129f8576040519150601f19603f3d011682016040523d82523d6000602084013e6129fd565b606091505b5050905080612a5f576040516001600160a01b038516907f00000000000000000000000000000000000000000000000000b1a2bc2ec50000840180156108fc02916000818181858888f19350505050158015612a5d573d6000803e3d6000fd5b505b505b50505050565b6002805460009163ffffffff600160201b9092048216917f0000000000000000000000000000000000000000000000000000000000000014811690910a16811415612ae35760405162461bcd60e51b8152600401808060200182810382526030815260200180612f776030913960400191505060405180910390fd5b8083600080805b7f000000000000000000000000000000000000000000000000000000000000001463ffffffff168163ffffffff161015612bb45760018516612b5757839250612b388163ffffffff16611ffd565b63ffffffff821660009081526020819052604090208590559150612b73565b63ffffffff811660009081526020819052604090205492508391505b612b9e7f000000000000000000000000484c0f23e30611b34f2fa503396a1a01c8951d338484611ab9565b9350600263ffffffff8616049450600101612aea565b505060028054601e63ffffffff8083166001908101821692909206811663ffffffff199093168317845560009283526020829052604090922094909455815493860116600160201b0267ffffffff00000000199093169290921790915550909392505050565b612c22611202565b15612c67576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6000612c927f00000000000000000000000000000000000000000000001b1ae4d6e2ef500000611159565b9050807f00000000000000000000000076bc677d444f1e9d57daf5187ee2b7dc852745ae6001600160a01b03166370a08231336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612d0257600080fd5b505afa158015612d16573d6000803e3d6000fd5b505050506040513d6020811015612d2c57600080fd5b50511015612d78576040805162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742042616c616e636560601b604482015290519081900360640190fd5b60408051632770a7eb60e21b81523360048201526024810183905290516001600160a01b037f00000000000000000000000076bc677d444f1e9d57daf5187ee2b7dc852745ae1691639dc29fac91604480830192600092919082900301818387803b158015612de657600080fd5b505af1158015612a5f573d6000803e3d6000fd5b3390565b612e06611202565b15612e4b576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6008805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612e81612dfa565b604080516001600160a01b039092168252519081900360200190a156fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373496e636f727265637420726566756e6420616d6f756e742072656365697665642062792074686520636f6e74726163745f72696768742073686f756c6420626520696e7369646520746865206669656c6430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000014f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657254686520636f6d6d69746d656e7420686173206265656e207375626d69747465644d65726b6c6520747265652069732066756c6c2e204e6f206d6f7265206c65617665732063616e206265206164646564a26469706673582212209f1f1d612d9548d3bd7f680e9e90253aef1e3db414f055677c2d7fd313f6b62764736f6c63430007060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000cc76b5ea37a1beaae862d533b7795c4f2f9dbb7c000000000000000000000000484c0f23e30611b34f2fa503396a1a01c8951d330000000000000000000000008997f152a1da95fc7f966bddd64571c9ad11075e00000000000000000000000000000000000000000000001b1ae4d6e2ef50000000000000000000000000000000000000000000000000000000b1a2bc2ec50000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000076bc677d444f1e9d57daf5187ee2b7dc852745ae0000000000000000000000005a7e6c8204a1359db9aacab7ba5fc309b7981efd0000000000000000000000000993a120c265ac7305347190579db9a28bae5fd2000000000000000000000000701b319aff36311f720f0a1ebd6636dd84bb3e8b00000000000000000000000012ded3d75fae8b27cd7f2b1a469fe088a3711dde000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b84190000000000000000000000000000000000000000000000000d87e55590018000
-----Decoded View---------------
Arg [0] : _verifier (address): 0xCc76b5eA37A1beAAE862D533B7795c4F2F9DbB7C
Arg [1] : _hasher (address): 0x484C0f23E30611B34F2fa503396A1A01c8951d33
Arg [2] : _storage (address): 0x8997F152A1DA95Fc7f966bDdD64571c9ad11075e
Arg [3] : _denomination (uint256): 500000000000000000000
Arg [4] : _ethDenomination (uint256): 50000000000000000
Arg [5] : _merkleTreeHeight (uint32): 20
Arg [6] : _xft (address): 0x76BC677d444f1E9d57dAf5187ee2b7dC852745aE
Arg [7] : _token (address): 0x5a7E6C8204A1359DB9AAcab7bA5Fc309B7981eFd
Arg [8] : _oracle (address): 0x0993A120C265ac7305347190579Db9a28BAE5fD2
Arg [9] : _xftPool (address): 0x701B319AFF36311F720f0a1ebD6636Dd84Bb3E8B
Arg [10] : _tokenPool (address): 0x12DED3D75fAE8B27Cd7f2B1A469Fe088a3711DdE
Arg [11] : _weth9 (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [12] : _chainlinkFeed (address): 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419
Arg [13] : _flexFeeThreshold (uint256): 975000000000000000
-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 000000000000000000000000cc76b5ea37a1beaae862d533b7795c4f2f9dbb7c
Arg [1] : 000000000000000000000000484c0f23e30611b34f2fa503396a1a01c8951d33
Arg [2] : 0000000000000000000000008997f152a1da95fc7f966bddd64571c9ad11075e
Arg [3] : 00000000000000000000000000000000000000000000001b1ae4d6e2ef500000
Arg [4] : 00000000000000000000000000000000000000000000000000b1a2bc2ec50000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [6] : 00000000000000000000000076bc677d444f1e9d57daf5187ee2b7dc852745ae
Arg [7] : 0000000000000000000000005a7e6c8204a1359db9aacab7ba5fc309b7981efd
Arg [8] : 0000000000000000000000000993a120c265ac7305347190579db9a28bae5fd2
Arg [9] : 000000000000000000000000701b319aff36311f720f0a1ebd6636dd84bb3e8b
Arg [10] : 00000000000000000000000012ded3d75fae8b27cd7f2b1a469fe088a3711dde
Arg [11] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [12] : 0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419
Arg [13] : 0000000000000000000000000000000000000000000000000d87e55590018000
Deployed Bytecode Sourcemap
44720:3838:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44974:24;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;44974:24:0;;;;;;;;;;;;;;10826:47;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10826:47:0;;:::i;:::-;;;;;;;;;;;;;;;;;;47389:91;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;13844:878;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;13844:878:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;13844:878:0;;;;;;;;;;;;-1:-1:-1;13844:878:0;-1:-1:-1;13844:878:0;;;;;;;;-1:-1:-1;;;;;13844:878:0;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;10555:35;;;;;;;;;;;;;:::i;12706:621::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12706:621:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12706:621:0;;;;;;;;;;;;-1:-1:-1;12706:621:0;-1:-1:-1;12706:621:0;;:::i;636:114::-;;;;;;;;;;;;;:::i;949:30::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45003:20;;;;;;;;;;;;;:::i;47486:171::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47486:171:0;;:::i;41145:86::-;;;;;;;;;;;;;:::i;46981:404::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46981:404:0;;;;;;-1:-1:-1;;;;;46981:404:0;;:::i;3422:410::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3422:410:0;;:::i;10595:37::-;;;;;;;;;;;;;:::i;44091:148::-;;;;;;;;;;;;;:::i;46659:141::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46659:141:0;-1:-1:-1;;;;;46659:141:0;;:::i;46221:137::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46221:137:0;-1:-1:-1;;;;;46221:137:0;;:::i;45028:28::-;;;;;;;;;;;;;:::i;44891:21::-;;;;;;;;;;;;;:::i;44917:25::-;;;;;;;;;;;;;:::i;10724:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10724:31:0;;:::i;10970:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10970:43:0;;:::i;46160:57::-;;;;;;;;;;;;;:::i;45097:31::-;;;;;;;;;;;;;:::i;44811:34::-;;;;;;;;;;;;;:::i;10637:37::-;;;;;;;;;;;;;:::i;43440:87::-;;;;;;;;;;;;;:::i;46362:158::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46362:158:0;-1:-1:-1;;;;;46362:158:0;;:::i;1932:493::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1932:493:0;;;;;;;;;;;;;:::i;1429:34::-;;;;;;;;;;;;;:::i;15177:360::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15177:360:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15177:360:0;;;;;;;;;;-1:-1:-1;15177:360:0;;-1:-1:-1;15177:360:0;-1:-1:-1;15177:360:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10679:40;;;;;;;;;;;;;:::i;10760:59::-;;;;;;;;;;;;;:::i;3883:96::-;;;;;;;;;;;;;:::i;1334:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1334:40:0;;:::i;46524:131::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46524:131:0;-1:-1:-1;;;;;46524:131:0;;:::i;12188:99::-;;;;;;;;;;;;;:::i;46804:173::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46804:173:0;;:::i;1379:45::-;;;;;;;;;;;;;:::i;44947:22::-;;;;;;;;;;;;;:::i;45061:31::-;;;;;;;;;;;;;:::i;14994:119::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14994:119:0;;:::i;4067:3512::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4067:3512:0;;:::i;755:114::-;;;;;;;;;;;;;:::i;913:31::-;;;;;;;;;;;;;:::i;1280:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1280:49:0;;:::i;44394:244::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44394:244:0;-1:-1:-1;;;;;44394:244:0;;:::i;44850:36::-;;;;;;;;;;;;;:::i;1468:27::-;;;;;;;;;;;;;:::i;44974:24::-;;;-1:-1:-1;;;;;44974:24:0;;:::o;10826:47::-;;;;;;;;;;;;;;;:::o;47389:91::-;47462:12;47389:91;:::o;13844:878::-;9336:1;9942:7;;:19;;9934:63;;;;;-1:-1:-1;;;9934:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9336:1;10075:7;:18;14102:12:::1;14094:20:::0;::::1;;14086:59;;;::::0;;-1:-1:-1;;;14086:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;14161:31;::::0;;;:15:::1;:31;::::0;;;;;::::1;;14160:32;14152:76;;;::::0;;-1:-1:-1;;;14152:76:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;14243:18;14255:5;14243:11;:18::i;:::-;14235:59;;;::::0;;-1:-1:-1;;;14235:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;14350:8;-1:-1:-1::0;;;;;14350:20:0::1;;14381:6;;14350:153;;;;;;;;14407:5;14399:14;;14350:153;;;;14423:14;14415:23;;14350:153;;;;14448:10;-1:-1:-1::0;;;;;14440:19:0::1;14350:153;;;;14469:8;-1:-1:-1::0;;;;;14461:17:0::1;14350:153;;;;14480:4;14350:153;;;;14486:7;14350:153;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;14350:153:0;14334:209:::1;;;::::0;;-1:-1:-1;;;14334:209:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;14334:209:0;;;;;;;;;;;;;::::1;;14552:31;::::0;;;:15:::1;:31;::::0;;;;:38;;-1:-1:-1;;14552:38:0::1;14586:4;14552:38;::::0;;14597:53:::1;14614:10:::0;14626:8;14636:4;14642:7;14597:16:::1;:53::i;:::-;14662:54;::::0;;-1:-1:-1;;;;;14662:54:0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;;;;;;::::1;-1:-1:-1::0;;9292:1:0;10254:7;:22;-1:-1:-1;;;;;;13844:878:0:o;10555:35::-;;;:::o;12706:621::-;9336:1;9942:7;;:19;;9934:63;;;;;-1:-1:-1;;;9934:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9336:1;10075:7;:18;12843:9:::1;12856:15;12843:28;12835:64;;;::::0;;-1:-1:-1;;;12835:64:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;12938:24;::::0;;;:11:::1;:24;::::0;;;;;::::1;;12937:25;12929:71;;;;-1:-1:-1::0;;;12929:71:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13007:20;13030;13038:11;13030:7;:20::i;:::-;13057:14;:32:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;13057:32:0;;;;::::1;::::0;;;13096:60:::1;::::0;-1:-1:-1;;;13096:60:0;;13114:10:::1;13096:60:::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;13007:43;;-1:-1:-1;;;;;;13096:11:0::1;:17;::::0;::::1;::::0;13114:10;13126:14;;;;13142:13;;13096:60;;13126:14;;;;13096:60;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;13163:24:0::1;::::0;;;:11:::1;:24;::::0;;;;:31;;-1:-1:-1;;13163:31:0::1;13190:4;13163:31;::::0;;-1:-1:-1;13201:17:0::1;:15;:17::i;:::-;13232:89;::::0;;::::1;::::0;::::1;::::0;;13268:15:::1;13232:89;::::0;::::1;::::0;13297:9:::1;13232:89:::0;;;;13308:12:::1;13232:89:::0;;;;;;13285:10:::1;::::0;13240:11;;13232:89:::1;::::0;;;;;;;::::1;-1:-1:-1::0;;9292:1:0;10254:7;:22;-1:-1:-1;;;12706:621:0:o;636:114::-;-1:-1:-1;;;;;;;;;;;636:114:0;:::o;949:30::-;;;:::o;45003:20::-;;;-1:-1:-1;;;;;45003:20:0;;:::o;47486:171::-;47562:12;;47541:7;;47562:12;;47557:33;;-1:-1:-1;47583:7:0;47576:14;;47557:33;47604:6;;47628:13;;47643:7;;47604:47;;;-1:-1:-1;;;47604:47:0;;;;;;;;-1:-1:-1;;;;;47628:13:0;;;47604:47;;;;47643:7;;;47604:47;;;;;:6;;;;;:14;;:47;;;;;;;;;;;;;;:6;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47604:47:0;;-1:-1:-1;47486:171:0;;;;:::o;41145:86::-;41216:7;;;;41145:86;:::o;46981:404::-;41471:8;:6;:8::i;:::-;41470:9;41462:38;;;;;-1:-1:-1;;;41462:38:0;;;;;;;;;;;;-1:-1:-1;;;41462:38:0;;;;;;;;;;;;;;;47110:7:::1;47079:5;-1:-1:-1::0;;;;;47079:15:0::1;;47095:10;47079:27;;;;;;;;;;;;;-1:-1:-1::0;;;;;47079:27:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;47079:27:0;:38:::1;;47071:71;;;::::0;;-1:-1:-1;;;47071:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;47071:71:0;;;;;;;;;;;;;::::1;;47171:6;::::0;47206:13:::1;::::0;47221:7:::1;::::0;47230:9:::1;::::0;47171:69:::1;::::0;;-1:-1:-1;;;47171:69:0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;;;;;47206:13:0;;::::1;47171:69:::0;;;;47221:7;;::::1;47171:69:::0;;;;47230:9;;::::1;47171:69:::0;;;;;47153:15:::1;::::0;47171:6;;;::::1;::::0;:25:::1;::::0;:69;;;;;::::1;::::0;;;;;;;;;:6;:69;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;47171:69:0;47251:31:::1;::::0;;-1:-1:-1;;;47251:31:0;;47262:10:::1;47251:31;::::0;::::1;::::0;;;;;;;;;47171:69;;-1:-1:-1;;;;;;47251:5:0::1;:10;::::0;::::1;::::0;:31;;;;;-1:-1:-1;;47251:31:0;;;;;;;;-1:-1:-1;47251:10:0;:31;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;47293:3;-1:-1:-1::0;;;;;47293:8:0::1;;47302:10;47314:7;47293:29;;;;;;;;;;;;;-1:-1:-1::0;;;;;47293:29:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;47338:41:0::1;::::0;;;;;-1:-1:-1;;;;;47338:41:0;::::1;;::::0;::::1;::::0;;;;;;;;;::::1;::::0;-1:-1:-1;47338:41:0;;;;;;;-1:-1:-1;47338:41:0::1;41511:1;46981:404:::0;;:::o;3422:410::-;3479:4;3496:10;3492:45;;-1:-1:-1;3524:5:0;3517:12;;3492:45;3570:16;;;;;3628:180;3653:8;;;;;;;:5;:8;;;;;;3644:17;;3640:55;;;3681:4;3674:11;;;;;;3640:55;3707:6;;;3703:54;;-1:-1:-1;1422:2:0;3703:54;-1:-1:-1;;3765:3:0;3784:22;;;;;;;;;3628:180;;-1:-1:-1;3821:5:0;;3422:410;-1:-1:-1;;;3422:410:0:o;10595:37::-;;;:::o;44091:148::-;43671:12;:10;:12::i;:::-;-1:-1:-1;;;;;43660:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43660:23:0;;43652:68;;;;;-1:-1:-1;;;43652:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;43652:68:0;;;;;;;;;;;;;;;44182:6:::1;::::0;44161:40:::1;::::0;44198:1:::1;::::0;44182:6:::1;::::0;::::1;-1:-1:-1::0;;;;;44182:6:0::1;::::0;44161:40:::1;::::0;44198:1;;44161:40:::1;44212:6;:19:::0;;-1:-1:-1;;;;;;44212:19:0::1;::::0;;44091:148::o;46659:141::-;43671:12;:10;:12::i;:::-;-1:-1:-1;;;;;43660:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43660:23:0;;43652:68;;;;;-1:-1:-1;;;43652:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;43652:68:0;;;;;;;;;;;;;;;41471:8:::1;:6;:8::i;:::-;41470:9;41462:38;;;::::0;;-1:-1:-1;;;41462:38:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41462:38:0;;;;;;;;;;;;;::::1;;46741:9:::2;:22:::0;;-1:-1:-1;;;;;46741:22:0;::::2;-1:-1:-1::0;;;;;;46741:22:0;;::::2;::::0;::::2;::::0;;;46775:19:::2;::::0;;;;;;::::2;::::0;;;;::::2;::::0;;::::2;46659:141:::0;:::o;46221:137::-;43671:12;:10;:12::i;:::-;-1:-1:-1;;;;;43660:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43660:23:0;;43652:68;;;;;-1:-1:-1;;;43652:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;43652:68:0;;;;;;;;;;;;;;;41471:8:::1;:6;:8::i;:::-;41470:9;41462:38;;;::::0;;-1:-1:-1;;;41462:38:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41462:38:0;;;;;;;;;;;;;::::1;;46297:6:::2;:16:::0;;-1:-1:-1;;;;;46297:16:0;::::2;-1:-1:-1::0;;;;;;46297:16:0;;::::2;::::0;::::2;::::0;;;46325:27:::2;::::0;;;;;;::::2;::::0;;;;::::2;::::0;;::::2;46221:137:::0;:::o;45028:28::-;;;-1:-1:-1;;;;;45028:28:0;;:::o;44891:21::-;;;-1:-1:-1;;;;;44891:21:0;;:::o;44917:25::-;;;;:::o;10724:31::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10724:31:0;:::o;10970:43::-;;;;;;;;;;;;;;;:::o;46160:57::-;43671:12;:10;:12::i;:::-;-1:-1:-1;;;;;43660:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43660:23:0;;43652:68;;;;;-1:-1:-1;;;43652:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;43652:68:0;;;;;;;;;;;;;;;46203:8:::1;:6;:8::i;:::-;46160:57::o:0;45097:31::-;;;;;;:::o;44811:34::-;;;:::o;10637:37::-;;;:::o;43440:87::-;43513:6;;;;;-1:-1:-1;;;;;43513:6:0;;43440:87::o;46362:158::-;43671:12;:10;:12::i;:::-;-1:-1:-1;;;;;43660:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43660:23:0;;43652:68;;;;;-1:-1:-1;;;43652:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;43652:68:0;;;;;;;;;;;;;;;41471:8:::1;:6;:8::i;:::-;41470:9;41462:38;;;::::0;;-1:-1:-1;;;41462:38:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41462:38:0;;;;;;;;;;;;;::::1;;46448:13:::2;:26:::0;;-1:-1:-1;;;;;46448:26:0;::::2;-1:-1:-1::0;;;;;;46448:26:0;;::::2;::::0;::::2;::::0;;;46486:28:::2;::::0;;;;;;::::2;::::0;;;;::::2;::::0;;::::2;46362:158:::0;:::o;1932:493::-;2044:7;-1:-1:-1;;;;;;;;;;;2068:27:0;;2060:72;;;;;-1:-1:-1;;;2060:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2147:28:0;;2139:74;;;;-1:-1:-1;;;2139:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2282:24;;;-1:-1:-1;;;2282:24:0;;;;;;;;2220:9;2282:24;;;;;;;;2240:5;;2220:9;;-1:-1:-1;;;;;2282:18:0;;;;;:24;;;;;;;;;;:18;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2282:24:0;;;;;;;;;-1:-1:-1;2282:24:0;-1:-1:-1;;;;;;;;;;;;2335:6:0;2324:1;2317:38;2313:42;;2371:7;-1:-1:-1;;;;;2371:18:0;;2390:1;2393;2371:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2371:24:0;;1932:493;-1:-1:-1;;;;;;1932:493:0:o;1429:34::-;;;;;;:::o;15177:360::-;15259:19;15319:16;;15357:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15357:33:0;;15349:41;;15402:9;15397:135;15417:21;15413:1;:25;15397:135;;;15458:28;15466:16;;15483:1;15466:19;;;;;;;;;;;;;15458:7;:28::i;:::-;15454:71;;;15511:4;15500:5;15506:1;15500:8;;;;;;;;:15;;;:8;;;;;;;;;;;:15;15454:71;15440:3;;15397:135;;;;15177:360;;;;;:::o;10679:40::-;;;:::o;10760:59::-;;;;:::o;3883:96::-;3956:16;;;;3927:7;3950:23;;;:5;:23;;;;;;3883:96;:::o;1334:40::-;;;;;;;;;;;;;:::o;46524:131::-;43671:12;:10;:12::i;:::-;-1:-1:-1;;;;;43660:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43660:23:0;;43652:68;;;;;-1:-1:-1;;;43652:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;43652:68:0;;;;;;;;;;;;;;;41471:8:::1;:6;:8::i;:::-;41470:9;41462:38;;;::::0;;-1:-1:-1;;;41462:38:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41462:38:0;;;;;;;;;;;;;::::1;;46602:7:::2;:18:::0;;-1:-1:-1;;;;;46602:18:0;::::2;-1:-1:-1::0;;;;;;46602:18:0;;::::2;::::0;::::2;::::0;;;46632:17:::2;::::0;;;;;;::::2;::::0;;;;::::2;::::0;;::::2;46524:131:::0;:::o;12188:99::-;12235:16;12267:14;12260:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12188:99;:::o;46804:173::-;43671:12;:10;:12::i;:::-;-1:-1:-1;;;;;43660:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43660:23:0;;43652:68;;;;;-1:-1:-1;;;43652:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;43652:68:0;;;;;;;;;;;;;;;41471:8:::1;:6;:8::i;:::-;41470:9;41462:38;;;::::0;;-1:-1:-1;;;41462:38:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41462:38:0;;;;;;;;;;;;;::::1;;46893:16:::2;:29:::0;;;46934:37:::2;::::0;;;;;;;::::2;::::0;;;;::::2;::::0;;::::2;46804:173:::0;:::o;1379:45::-;1422:2;1379:45;:::o;44947:22::-;;;-1:-1:-1;;;;;44947:22:0;;:::o;45061:31::-;;;;:::o;14994:119::-;15056:4;15076:31;;;:15;:31;;;;;;;;;14994:119::o;4067:3512::-;4114:7;4134:6;4130:3443;;-1:-1:-1;4157:66:0;4142:82;;4130:3443;4240:1;4245;4240:6;4236:3337;;;-1:-1:-1;4263:66:0;4248:82;;4236:3337;4346:1;4351;4346:6;4342:3231;;;-1:-1:-1;4369:66:0;4354:82;;4342:3231;4452:1;4457;4452:6;4448:3125;;;-1:-1:-1;4475:66:0;4460:82;;4448:3125;4558:1;4563;4558:6;4554:3019;;;-1:-1:-1;4581:66:0;4566:82;;4554:3019;4664:1;4669;4664:6;4660:2913;;;-1:-1:-1;4687:66:0;4672:82;;4660:2913;4770:1;4775;4770:6;4766:2807;;;-1:-1:-1;4793:66:0;4778:82;;4766:2807;4876:1;4881;4876:6;4872:2701;;;-1:-1:-1;4899:66:0;4884:82;;4872:2701;4982:1;4987;4982:6;4978:2595;;;-1:-1:-1;5005:66:0;4990:82;;4978:2595;5088:1;5093;5088:6;5084:2489;;;-1:-1:-1;5111:66:0;5096:82;;5084:2489;5194:1;5199:2;5194:7;5190:2383;;;-1:-1:-1;5218:66:0;5203:82;;5190:2383;5301:1;5306:2;5301:7;5297:2276;;;-1:-1:-1;5325:66:0;5310:82;;5297:2276;5408:1;5413:2;5408:7;5404:2169;;;-1:-1:-1;5432:66:0;5417:82;;5404:2169;5515:1;5520:2;5515:7;5511:2062;;;-1:-1:-1;5539:66:0;5524:82;;5511:2062;5622:1;5627:2;5622:7;5618:1955;;;-1:-1:-1;5646:66:0;5631:82;;5618:1955;5729:1;5734:2;5729:7;5725:1848;;;-1:-1:-1;5753:66:0;5738:82;;5725:1848;5836:1;5841:2;5836:7;5832:1741;;;-1:-1:-1;5860:66:0;5845:82;;5832:1741;5943:1;5948:2;5943:7;5939:1634;;;-1:-1:-1;5967:66:0;5952:82;;5939:1634;6050:1;6055:2;6050:7;6046:1527;;;-1:-1:-1;6074:66:0;6059:82;;6046:1527;6157:1;6162:2;6157:7;6153:1420;;;-1:-1:-1;6181:66:0;6166:82;;6153:1420;6264:1;6269:2;6264:7;6260:1313;;;-1:-1:-1;6288:66:0;6273:82;;6260:1313;6371:1;6376:2;6371:7;6367:1206;;;-1:-1:-1;6395:66:0;6380:82;;6367:1206;6478:1;6483:2;6478:7;6474:1099;;;-1:-1:-1;6502:66:0;6487:82;;6474:1099;6585:1;6590:2;6585:7;6581:992;;;-1:-1:-1;6609:66:0;6594:82;;6581:992;6692:1;6697:2;6692:7;6688:885;;;-1:-1:-1;6716:66:0;6701:82;;6688:885;6799:1;6804:2;6799:7;6795:778;;;-1:-1:-1;6823:66:0;6808:82;;6795:778;6906:1;6911:2;6906:7;6902:671;;;-1:-1:-1;6930:66:0;6915:82;;6902:671;7013:1;7018:2;7013:7;7009:564;;;-1:-1:-1;7037:66:0;7022:82;;7009:564;7120:1;7125:2;7120:7;7116:457;;;-1:-1:-1;7144:66:0;7129:82;;7116:457;7227:1;7232:2;7227:7;7223:350;;;-1:-1:-1;7251:66:0;7236:82;;7223:350;7334:1;7339:2;7334:7;7330:243;;;-1:-1:-1;7358:66:0;7343:82;;7330:243;7441:1;7446:2;7441:7;7437:136;;;-1:-1:-1;7465:66:0;7450:82;;7437:136;7544:29;;;-1:-1:-1;;;7544:29:0;;;;;;;;;;;;-1:-1:-1;;;7544:29:0;;;;;;;;;;;;;;755:114;792:77;755:114;:::o;913:31::-;;;:::o;1280:49::-;;;;;;;;;;;;;;:::o;44394:244::-;43671:12;:10;:12::i;:::-;-1:-1:-1;;;;;43660:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43660:23:0;;43652:68;;;;;-1:-1:-1;;;43652:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;43652:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;44483:22:0;::::1;44475:73;;;;-1:-1:-1::0;;;44475:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44585:6;::::0;44564:38:::1;::::0;-1:-1:-1;;;;;44564:38:0;;::::1;::::0;44585:6:::1;::::0;::::1;;::::0;44564:38:::1;::::0;;;::::1;44613:6;:17:::0;;-1:-1:-1;;;;;44613:17:0;;::::1;;;-1:-1:-1::0;;;;;;44613:17:0;;::::1;::::0;;;::::1;::::0;;44394:244::o;44850:36::-;;;:::o;1468:27::-;;;-1:-1:-1;;;1468:27:0;;;;;:::o;47904:651::-;48104:7;48091:9;:20;48083:81;;;;-1:-1:-1;;;48083:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48171:5;-1:-1:-1;;;;;48171:10:0;;48182;48209:4;48194:12;:19;48171:43;;;;;;;;;;;;;-1:-1:-1;;;;;48171:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48232:1;48225:4;:8;48221:57;;;48244:5;-1:-1:-1;;;;;48244:10:0;;48255:8;48265:4;48244:26;;;;;;;;;;;;;-1:-1:-1;;;;;48244:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48221:57;48300:15;48290:25;;:29;48286:258;;48349:55;;48331:12;;-1:-1:-1;;;;;48349:15:0;;;48383;48373:25;;;48331:12;48349:55;48331:12;48349:55;48373:25;48349:15;:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48330:74;;;48418:7;48413:124;;48483:44;;-1:-1:-1;;;;;48483:17:0;;;48511:15;48501:25;;48483:44;;;;;;;;;48501:25;48483:17;:44;;;;;;;;;;;;;;;;;;;;;48413:124;48286:258;;47904:651;;;;:::o;2431:914::-;2522:9;;;2481:12;;2522:9;-1:-1:-1;;;2522:9:0;;;;;;2571:6;2560:17;;;;;2546:31;;;;2538:92;;;;-1:-1:-1;;;2538:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2659:10;2703:5;2637:19;;;2756:371;2779:6;2775:10;;:1;:10;;;2756:371;;;2805:16;;;2801:231;;2846:16;2839:23;;2881:8;2887:1;2881:8;;:5;:8::i;:::-;2900:17;;;:14;:17;;;;;;;;;;:36;;;2873:16;-1:-1:-1;2801:231:0;;;2970:17;;;:14;:17;;;;;;;;;;;;-1:-1:-1;3006:16:0;;-1:-1:-1;2801:231:0;3059:34;3073:6;3081:4;3087:5;3059:13;:34::i;:::-;3040:53;-1:-1:-1;3118:1:0;3102:17;;;;;-1:-1:-1;2787:3:0;;2756:371;;;-1:-1:-1;;3158:16:0;;;1422:2;3157:42;3158:16;;;;:20;;;3157:42;;;;;;3206:31;;-1:-1:-1;;3206:31:0;;;;;;;-1:-1:-1;3244:19:0;;;;;;;;;;;:38;;;;3289:26;;3301:14;;;3289:26;-1:-1:-1;;;3289:26:0;-1:-1:-1;;3289:26:0;;;;;;;;;;-1:-1:-1;3301:14:0;;;-1:-1:-1;;;2431:914:0:o;47663:235::-;41471:8;:6;:8::i;:::-;41470:9;41462:38;;;;;-1:-1:-1;;;41462:38:0;;;;;;;;;;;;-1:-1:-1;;;41462:38:0;;;;;;;;;;;;;;;47729:19:::1;47751:21;47759:12;47751:7;:21::i;:::-;47729:43;;47816:11;47787:3;-1:-1:-1::0;;;;;47787:13:0::1;;47801:10;47787:25;;;;;;;;;;;;;-1:-1:-1::0;;;;;47787:25:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;47787:25:0;:40:::1;;47779:73;;;::::0;;-1:-1:-1;;;47779:73:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;47779:73:0;;;;;;;;;;;;;::::1;;47859:33;::::0;;-1:-1:-1;;;47859:33:0;;47868:10:::1;47859:33;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;47859:3:0::1;:8;::::0;::::1;::::0;:33;;;;;-1:-1:-1;;47859:33:0;;;;;;;-1:-1:-1;47859:8:0;:33;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;39704:106:::0;39792:10;39704:106;:::o;41945:118::-;41471:8;:6;:8::i;:::-;41470:9;41462:38;;;;;-1:-1:-1;;;41462:38:0;;;;;;;;;;;;-1:-1:-1;;;41462:38:0;;;;;;;;;;;;;;;42005:7:::1;:14:::0;;-1:-1:-1;;42005:14:0::1;42015:4;42005:14;::::0;;42035:20:::1;42042:12;:10;:12::i;:::-;42035:20;::::0;;-1:-1:-1;;;;;42035:20:0;;::::1;::::0;;;;;;;::::1;::::0;;::::1;41945:118::o:0
Swarm Source
ipfs://9f1f1d612d9548d3bd7f680e9e90253aef1e3db414f055677c2d7fd313f6b627
Loading...
Loading
Loading...
Loading
OVERVIEW
Offshift Anon Shifter Contract: 500 anonUSD denominationMultichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $2,290.29 | 0.5 | $1,145.15 |
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.