Source Code
Latest 25 from a total of 1,464 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Disembark | 22430963 | 11 days ago | IN | 0 ETH | 0.00003215 | ||||
Disembark | 22427819 | 11 days ago | IN | 0 ETH | 0.00003524 | ||||
Depart | 22427680 | 11 days ago | IN | 0 ETH | 0.00004419 | ||||
Depart | 22424532 | 12 days ago | IN | 0 ETH | 0.00016145 | ||||
Disembark | 22422863 | 12 days ago | IN | 0 ETH | 0.00004654 | ||||
Depart | 22419582 | 12 days ago | IN | 0 ETH | 0.00004782 | ||||
Disembark | 22413131 | 13 days ago | IN | 0 ETH | 0.00002693 | ||||
Depart | 22409843 | 14 days ago | IN | 0 ETH | 0.00003486 | ||||
Disembark | 22404253 | 15 days ago | IN | 0 ETH | 0.00004137 | ||||
Embark With Reci... | 22403767 | 15 days ago | IN | 0 ETH | 0.00003238 | ||||
Depart | 22400951 | 15 days ago | IN | 0 ETH | 0.00003477 | ||||
Disembark | 22399962 | 15 days ago | IN | 0 ETH | 0.00004635 | ||||
Depart | 22396675 | 16 days ago | IN | 0 ETH | 0.00011608 | ||||
Disembark | 22391026 | 16 days ago | IN | 0 ETH | 0.0000757 | ||||
Depart | 22387732 | 17 days ago | IN | 0 ETH | 0.0000309 | ||||
Disembark | 22386229 | 17 days ago | IN | 0 ETH | 0.00003128 | ||||
Disembark | 22386071 | 17 days ago | IN | 0 ETH | 0.00003453 | ||||
Depart | 22382934 | 18 days ago | IN | 0 ETH | 0.00009543 | ||||
Depart | 22382775 | 18 days ago | IN | 0 ETH | 0.00009842 | ||||
Disembark | 22377337 | 18 days ago | IN | 0 ETH | 0.000112 | ||||
Disembark | 22374618 | 19 days ago | IN | 0 ETH | 0.00004438 | ||||
Depart | 22374059 | 19 days ago | IN | 0 ETH | 0.00005274 | ||||
Depart | 22371317 | 19 days ago | IN | 0 ETH | 0.00004262 | ||||
Disembark | 22354447 | 22 days ago | IN | 0 ETH | 0.00006492 | ||||
Depart | 22351138 | 22 days ago | IN | 0 ETH | 0.00003861 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Fraxferry
Compiler Version
v0.8.23+commit.f704f362
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-02-24 */ // SPDX-License-Identifier: GPL-2.0-or-later pragma solidity >=0.8.0; // Sources flattened with hardhat v2.19.4 https://hardhat.org // File @openzeppelin/contracts/token/ERC20/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) 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 a `value` amount of tokens 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 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); } // File @uniswap/v3-periphery/contracts/libraries/[email protected] // Original license: SPDX_License_Identifier: GPL-2.0-or-later library TransferHelper { /// @notice Transfers tokens from the targeted address to the given destination /// @notice Errors with 'STF' if transfer fails /// @param token The contract address of the token to be transferred /// @param from The originating address from which the tokens will be transferred /// @param to The destination address of the transfer /// @param value The amount to be transferred function safeTransferFrom( address token, address from, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'STF'); } /// @notice Transfers tokens from msg.sender to a recipient /// @dev Errors with ST if transfer fails /// @param token The contract address of the token which will be transferred /// @param to The recipient of the transfer /// @param value The value of the transfer function safeTransfer( address token, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'ST'); } /// @notice Approves the stipulated contract to spend the given allowance in the given token /// @dev Errors with 'SA' if transfer fails /// @param token The contract address of the token to be approved /// @param to The target of the approval /// @param value The amount of the given token the target will be allowed to spend function safeApprove( address token, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.approve.selector, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'SA'); } /// @notice Transfers ETH to the recipient address /// @dev Fails with `STE` /// @param to The destination of the transfer /// @param value The value to be transferred function safeTransferETH(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require(success, 'STE'); } } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol) /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * ==== Security Considerations * * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be * considered as an intention to spend the allowance in any specific way. The second is that because permits have * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be * generally recommended is: * * ```solidity * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} * doThing(..., value); * } * * function doThing(..., uint256 value) public { * token.safeTransferFrom(msg.sender, address(this), value); * ... * } * ``` * * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also * {SafeERC20-safeTransferFrom}). * * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so * contracts should have entry points that don't rely on permit. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. * * CAUTION: See Security Considerations above. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File @openzeppelin/contracts/utils/math/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol) /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Muldiv operation overflow. */ error MathOverflowedMulDiv(); enum Rounding { Floor, // Toward negative infinity Ceil, // Toward positive infinity Trunc, // Toward zero Expand // Away from zero } /** * @dev Returns the addition of two unsigned integers, with an overflow flag. */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // 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. */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { 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. */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds towards infinity instead * of rounding towards zero. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { if (b == 0) { // Guarantee the same behavior as in a regular Solidity division. return a / b; } // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or * denominator == 0. * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by * Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0 = x * y; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. if (denominator <= prod1) { revert MathOverflowedMulDiv(); } /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. // Always >= 1. See https://cs.stackexchange.com/q/138556/92363. uint256 twos = denominator & (0 - denominator); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also // works in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded * towards zero. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2 of a positive value rounded towards zero. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10 of a positive value rounded towards zero. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256 of a positive value rounded towards zero. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0); } } /** * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers. */ function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) { return uint8(rounding) % 2 == 1; } } // File contracts/Fraxferry/Fraxferry.sol // ==================================================================== // | ______ _______ | // | / _____________ __ __ / ____(_____ ____ _____ ________ | // | / /_ / ___/ __ `| |/_/ / /_ / / __ \/ __ `/ __ \/ ___/ _ \ | // | / __/ / / / /_/ _> < / __/ / / / / / /_/ / / / / /__/ __/ | // | /_/ /_/ \__,_/_/|_| /_/ /_/_/ /_/\__,_/_/ /_/\___/\___/ | // | | // ==================================================================== // ============================ Fraxferry ============================= // ==================================================================== // Ferry that can be used to ship tokens between chains // Frax Finance: https://github.com/FraxFinance // Primary Author(s) // Dennis: https://github.com/denett /* ** Modus operandi: ** - User sends tokens to the contract. This transaction is stored in the contract. ** - Captain queries the source chain for transactions to ship. ** - Captain sends batch (start, end, hash) to start the trip, ** - Crewmembers check the batch and can dispute it if it is invalid. ** - Non disputed batches can be executed by the first officer by providing the transactions as calldata. ** - Hash of the transactions must be equal to the hash in the batch. User receives their tokens on the other chain. ** - In case there was a fraudulent transaction (a hacker for example), the owner can cancel a single transaction, such that it will not be executed. ** - The owner can manually manage the tokens in the contract and must make sure it has enough funds. ** ** What must happen for a false batch to be executed: ** - Captain is tricked into proposing a batch with a false hash ** - All crewmembers bots are offline/censured/compromised and no one disputes the proposal ** ** Other risks: ** - Reorgs on the source chain. Avoided, by only returning the transactions on the source chain that are at least one hour old. ** - Rollbacks of optimistic rollups. Avoided by running a node. ** - Operators do not have enough time to pause the chain after a fake proposal. Avoided by requiring a minimal amount of time between sending the proposal and executing it. */ contract Fraxferry { IERC20 immutable public token; IERC20 immutable public targetToken; uint immutable public chainid; uint immutable public targetChain; address public owner; address public nominatedOwner; address public captain; address public firstOfficer; mapping(address => bool) public crewmembers; mapping(address => bool) public fee_exempt_addrs; bool public paused; uint public MIN_WAIT_PERIOD_ADD=3600; // Minimal 1 hour waiting uint public MIN_WAIT_PERIOD_EXECUTE=79200; // Minimal 22 hour waiting uint public FEE_RATE=10; // 0.1% fee uint public FEE_MIN=5*1e18; // 5 token min fee uint public FEE_MAX=100*1e18; // 100 token max fee uint constant MAX_FEE_RATE=100; // Max fee rate is 1% uint constant MAX_FEE_MIN=100e18; // Max minimum fee is 100 tokens uint constant MAX_FEE_MAX=1000e18; // Max fee is 1000 tokens uint constant public REDUCED_DECIMALS=1e10; Transaction[] public transactions; mapping(uint => bool) public cancelled; uint public executeIndex; Batch[] public batches; struct Transaction { address user; uint64 amount; uint32 timestamp; } struct Batch { uint64 start; uint64 end; uint64 departureTime; uint64 status; bytes32 hash; } struct BatchData { uint startTransactionNo; Transaction[] transactions; } constructor(address _token, uint _chainid, address _targetToken, uint _targetChain) { //require (block.chainid==_chainid,"Wrong chain"); chainid=_chainid; token = IERC20(_token); targetToken = IERC20(_targetToken); owner = msg.sender; targetChain = _targetChain; } // ############## Events ############## event Embark(address indexed sender, uint index, uint amount, uint amountAfterFee, uint timestamp); event Disembark(uint start, uint end, bytes32 hash); event Depart(uint batchNo,uint start,uint end,bytes32 hash); event RemoveBatch(uint batchNo); event DisputeBatch(uint batchNo, bytes32 hash); event Cancelled(uint index, bool cancel); event Pause(bool paused); event OwnerNominated(address indexed newOwner); event OwnerChanged(address indexed previousOwner,address indexed newOwner); event SetCaptain(address indexed previousCaptain, address indexed newCaptain); event SetFirstOfficer(address indexed previousFirstOfficer, address indexed newFirstOfficer); event SetCrewmember(address indexed crewmember,bool set); event SetFee(uint previousFeeRate, uint feeRate,uint previousFeeMin, uint feeMin,uint previousFeeMax, uint feeMax); event SetMinWaitPeriods(uint previousMinWaitAdd,uint previousMinWaitExecute,uint minWaitAdd,uint minWaitExecute); event FeeExemptToggled(address addr,bool is_fee_exempt); // ############## Modifiers ############## modifier isOwner() { require (msg.sender==owner,"Not owner"); _; } modifier isCaptain() { require (msg.sender==captain,"Not captain"); _; } modifier isFirstOfficer() { require (msg.sender==firstOfficer,"Not first officer"); _; } modifier isCrewmember() { require (crewmembers[msg.sender] || msg.sender==owner || msg.sender==captain || msg.sender==firstOfficer,"Not crewmember"); _; } modifier notPaused() { require (!paused,"Paused"); _; } // ############## Ferry actions ############## function embarkWithRecipient(uint amount, address recipient) public notPaused { amount = (amount/REDUCED_DECIMALS)*REDUCED_DECIMALS; // Round amount to fit in data structure uint fee; if(fee_exempt_addrs[msg.sender]) fee = 0; else { fee = Math.min(Math.max(FEE_MIN,amount*FEE_RATE/10000),FEE_MAX); } require (amount>fee,"Amount too low"); require (amount/REDUCED_DECIMALS<=type(uint64).max,"Amount too high"); TransferHelper.safeTransferFrom(address(token),msg.sender,address(this),amount); uint64 amountAfterFee = uint64((amount-fee)/REDUCED_DECIMALS); emit Embark(recipient,transactions.length,amount,amountAfterFee*REDUCED_DECIMALS,block.timestamp); transactions.push(Transaction(recipient,amountAfterFee,uint32(block.timestamp))); } function embark(uint amount) public { embarkWithRecipient(amount, msg.sender) ; } function embarkWithSignature( uint256 _amount, address recipient, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) public { uint amount = approveMax ? type(uint256).max : _amount; IERC20Permit(address(token)).permit(msg.sender, address(this), amount, deadline, v, r, s); embarkWithRecipient(amount,recipient); } function depart(uint start, uint end, bytes32 hash) external notPaused isCaptain { require ((batches.length==0 && start==0) || (batches.length>0 && start==batches[batches.length-1].end+1),"Wrong start"); require (end>=start && end<type(uint64).max,"Wrong end"); batches.push(Batch(uint64(start),uint64(end),uint64(block.timestamp),0,hash)); emit Depart(batches.length-1,start,end,hash); } function disembark(BatchData calldata batchData) external notPaused isFirstOfficer { Batch memory batch = batches[executeIndex++]; require (batch.status==0,"Batch disputed"); require (batch.start==batchData.startTransactionNo,"Wrong start"); require (batch.start+batchData.transactions.length-1==batch.end,"Wrong size"); require (block.timestamp-batch.departureTime>=MIN_WAIT_PERIOD_EXECUTE,"Too soon"); bytes32 hash = keccak256(abi.encodePacked(targetChain, targetToken, chainid, token, batch.start)); for (uint i=0;i<batchData.transactions.length;++i) { if (!cancelled[batch.start+i]) { TransferHelper.safeTransfer(address(token),batchData.transactions[i].user,batchData.transactions[i].amount*REDUCED_DECIMALS); } hash = keccak256(abi.encodePacked(hash, batchData.transactions[i].user,batchData.transactions[i].amount)); } require (batch.hash==hash,"Wrong hash"); emit Disembark(batch.start,batch.end,hash); } function removeBatches(uint batchNo) external isOwner { require (executeIndex<=batchNo,"Batch already executed"); while (batches.length>batchNo) batches.pop(); emit RemoveBatch(batchNo); } function disputeBatch(uint batchNo, bytes32 hash) external isCrewmember { require (batches[batchNo].hash==hash,"Wrong hash"); require (executeIndex<=batchNo,"Batch already executed"); require (batches[batchNo].status==0,"Batch already disputed"); batches[batchNo].status=1; // Set status on disputed _pause(true); emit DisputeBatch(batchNo,hash); } function pause() external isCrewmember { _pause(true); } function unPause() external isOwner { _pause(false); } function _pause(bool _paused) internal { paused=_paused; emit Pause(_paused); } function _jettison(uint index, bool cancel) internal { require (executeIndex==0 || index>batches[executeIndex-1].end,"Transaction already executed"); cancelled[index]=cancel; emit Cancelled(index,cancel); } function jettison(uint index, bool cancel) external isOwner { _jettison(index,cancel); } function jettisonGroup(uint[] calldata indexes, bool cancel) external isOwner { for (uint i=0;i<indexes.length;++i) { _jettison(indexes[i],cancel); } } // ############## Parameters management ############## function setFee(uint _FEE_RATE, uint _FEE_MIN, uint _FEE_MAX) external isOwner { require(_FEE_RATE<MAX_FEE_RATE); require(_FEE_MIN<MAX_FEE_MIN); require(_FEE_MAX<MAX_FEE_MAX); emit SetFee(FEE_RATE,_FEE_RATE,FEE_MIN,_FEE_MIN,FEE_MAX,_FEE_MAX); FEE_RATE=_FEE_RATE; FEE_MIN=_FEE_MIN; FEE_MAX=_FEE_MAX; } function setMinWaitPeriods(uint _MIN_WAIT_PERIOD_ADD, uint _MIN_WAIT_PERIOD_EXECUTE) external isOwner { require(_MIN_WAIT_PERIOD_ADD>=3600 && _MIN_WAIT_PERIOD_EXECUTE>=3600,"Period too short"); emit SetMinWaitPeriods(MIN_WAIT_PERIOD_ADD, MIN_WAIT_PERIOD_EXECUTE,_MIN_WAIT_PERIOD_ADD, _MIN_WAIT_PERIOD_EXECUTE); MIN_WAIT_PERIOD_ADD=_MIN_WAIT_PERIOD_ADD; MIN_WAIT_PERIOD_EXECUTE=_MIN_WAIT_PERIOD_EXECUTE; } // ############## Roles management ############## function nominateNewOwner(address newOwner) external isOwner { nominatedOwner = newOwner; emit OwnerNominated(newOwner); } function acceptOwnership() external { require(msg.sender == nominatedOwner, "You must be nominated before you can accept ownership"); emit OwnerChanged(owner, nominatedOwner); owner = nominatedOwner; nominatedOwner = address(0); } function setCaptain(address newCaptain) external isOwner { emit SetCaptain(captain,newCaptain); captain=newCaptain; } function setFirstOfficer(address newFirstOfficer) external isOwner { emit SetFirstOfficer(firstOfficer,newFirstOfficer); firstOfficer=newFirstOfficer; } function setCrewmember(address crewmember, bool set) external isOwner { crewmembers[crewmember]=set; emit SetCrewmember(crewmember,set); } function toggleFeeExemptAddr(address addr) external isOwner { fee_exempt_addrs[addr] = !fee_exempt_addrs[addr]; emit FeeExemptToggled(addr,fee_exempt_addrs[addr]); } // ############## Token management ############## function sendTokens(address receiver, uint amount) external isOwner { require (receiver!=address(0),"Zero address not allowed"); TransferHelper.safeTransfer(address(token),receiver,amount); } // Generic proxy function execute(address _to, uint256 _value, bytes calldata _data) external isOwner returns (bool, bytes memory) { require(_data.length==0 || _to.code.length>0,"Can not call a function on a EOA"); (bool success, bytes memory result) = _to.call{value:_value}(_data); return (success, result); } // ############## Views ############## function getNextBatch(uint _start, uint max) public view returns (uint start, uint end, bytes32 hash) { uint cutoffTime = block.timestamp-MIN_WAIT_PERIOD_ADD; if (_start<transactions.length && transactions[_start].timestamp<cutoffTime) { start=_start; end=start+max-1; if (end>=transactions.length) end=transactions.length-1; while(transactions[end].timestamp>=cutoffTime) end--; hash = getTransactionsHash(start,end); } } function getBatchData(uint start, uint end) public view returns (BatchData memory data) { data.startTransactionNo = start; data.transactions = new Transaction[](end-start+1); for (uint i=start;i<=end;++i) { data.transactions[i-start]=transactions[i]; } } function getBatchAmount(uint start, uint end) public view returns (uint totalAmount) { for (uint i=start;i<=end;++i) { totalAmount+=transactions[i].amount; } totalAmount*=REDUCED_DECIMALS; } function getTransactionsHash(uint start, uint end) public view returns (bytes32) { bytes32 result = keccak256(abi.encodePacked(chainid, token, targetChain, targetToken, uint64(start))); for (uint i=start;i<=end;++i) { result = keccak256(abi.encodePacked(result, transactions[i].user,transactions[i].amount)); } return result; } function noTransactions() public view returns (uint) { return transactions.length; } function noBatches() public view returns (uint) { return batches.length; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_chainid","type":"uint256"},{"internalType":"address","name":"_targetToken","type":"address"},{"internalType":"uint256","name":"_targetChain","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"bool","name":"cancel","type":"bool"}],"name":"Cancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"batchNo","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"start","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"end","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"Depart","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"start","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"end","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"Disembark","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"batchNo","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"DisputeBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountAfterFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Embark","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"bool","name":"is_fee_exempt","type":"bool"}],"name":"FeeExemptToggled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerNominated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"paused","type":"bool"}],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"batchNo","type":"uint256"}],"name":"RemoveBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousCaptain","type":"address"},{"indexed":true,"internalType":"address","name":"newCaptain","type":"address"}],"name":"SetCaptain","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"crewmember","type":"address"},{"indexed":false,"internalType":"bool","name":"set","type":"bool"}],"name":"SetCrewmember","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousFeeRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"previousFeeMin","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeMin","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"previousFeeMax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeMax","type":"uint256"}],"name":"SetFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousFirstOfficer","type":"address"},{"indexed":true,"internalType":"address","name":"newFirstOfficer","type":"address"}],"name":"SetFirstOfficer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousMinWaitAdd","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"previousMinWaitExecute","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minWaitAdd","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minWaitExecute","type":"uint256"}],"name":"SetMinWaitPeriods","type":"event"},{"inputs":[],"name":"FEE_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE_MIN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_WAIT_PERIOD_ADD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_WAIT_PERIOD_EXECUTE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REDUCED_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"batches","outputs":[{"internalType":"uint64","name":"start","type":"uint64"},{"internalType":"uint64","name":"end","type":"uint64"},{"internalType":"uint64","name":"departureTime","type":"uint64"},{"internalType":"uint64","name":"status","type":"uint64"},{"internalType":"bytes32","name":"hash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"cancelled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"captain","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chainid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"crewmembers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"},{"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"depart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"startTransactionNo","type":"uint256"},{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint64","name":"amount","type":"uint64"},{"internalType":"uint32","name":"timestamp","type":"uint32"}],"internalType":"struct Fraxferry.Transaction[]","name":"transactions","type":"tuple[]"}],"internalType":"struct Fraxferry.BatchData","name":"batchData","type":"tuple"}],"name":"disembark","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"batchNo","type":"uint256"},{"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"disputeBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"embark","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"embarkWithRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"embarkWithSignature","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"execute","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"executeIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"fee_exempt_addrs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"firstOfficer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"getBatchAmount","outputs":[{"internalType":"uint256","name":"totalAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"getBatchData","outputs":[{"components":[{"internalType":"uint256","name":"startTransactionNo","type":"uint256"},{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint64","name":"amount","type":"uint64"},{"internalType":"uint32","name":"timestamp","type":"uint32"}],"internalType":"struct Fraxferry.Transaction[]","name":"transactions","type":"tuple[]"}],"internalType":"struct Fraxferry.BatchData","name":"data","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_start","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"getNextBatch","outputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"},{"internalType":"bytes32","name":"hash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"getTransactionsHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"bool","name":"cancel","type":"bool"}],"name":"jettison","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"indexes","type":"uint256[]"},{"internalType":"bool","name":"cancel","type":"bool"}],"name":"jettisonGroup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"noBatches","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"noTransactions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"nominateNewOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nominatedOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[{"internalType":"uint256","name":"batchNo","type":"uint256"}],"name":"removeBatches","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"sendTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newCaptain","type":"address"}],"name":"setCaptain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"crewmember","type":"address"},{"internalType":"bool","name":"set","type":"bool"}],"name":"setCrewmember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_FEE_RATE","type":"uint256"},{"internalType":"uint256","name":"_FEE_MIN","type":"uint256"},{"internalType":"uint256","name":"_FEE_MAX","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newFirstOfficer","type":"address"}],"name":"setFirstOfficer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_MIN_WAIT_PERIOD_ADD","type":"uint256"},{"internalType":"uint256","name":"_MIN_WAIT_PERIOD_EXECUTE","type":"uint256"}],"name":"setMinWaitPeriods","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"targetChain","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"targetToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"toggleFeeExemptAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"transactions","outputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint64","name":"amount","type":"uint64"},{"internalType":"uint32","name":"timestamp","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unPause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
610100604052610e1060075562013560600855600a600955674563918244f40000600a5568056bc75e2d63100000600b553480156200003d57600080fd5b5060405162003eb938038062003eb98339810160408190526200006091620000b2565b60c0929092526001600160a01b0392831660805290911660a052600080546001600160a01b0319163317905560e052620000fb565b80516001600160a01b0381168114620000ad57600080fd5b919050565b60008060008060808587031215620000c957600080fd5b620000d48562000095565b935060208501519250620000eb6040860162000095565b6060959095015193969295505050565b60805160a05160c05160e051613d3062000189600039600081816105350152818161137c0152611bd30152600081816106ce015281816113c00152611b5c0152600081816103c30152818161139e0152611bf90152600081816107b1015281816108ee01528181610ae5015281816113e2015281816114e201528181611ba701526128d80152613d306000f3fe608060405234801561001057600080fd5b50600436106103205760003560e01c80638456cb59116101a7578063c2f6afe5116100ee578063e050be5711610097578063f7b188a511610071578063f7b188a5146107a4578063fc0c546a146107ac578063fd433ec0146107d357600080fd5b8063e050be571461074e578063f40e349f14610771578063f55ebb8f1461078457600080fd5b8063d2c1626c116100c8578063d2c1626c146106f8578063d9fb265d1461070b578063de7974a41461072e57600080fd5b8063c2f6afe5146106b6578063cd84980e146106c9578063cdbdfdc2146106f057600080fd5b80639b8c624a11610150578063b61325cd1161012a578063b61325cd14610683578063b61d27f61461068c578063c2624e1e146106ad57600080fd5b80639b8c624a1461060e578063a3a6d9e814610621578063b32c4d8d1461063457600080fd5b80638e714a72116101815780638e714a7214610587578063907c6c2e1461059a5780639ace38c2146105ba57600080fd5b80638456cb59146105575780638b928bd31461055f5780638da5cb5b1461056757600080fd5b80633beaf5261161026b5780635c975abb1161021457806366e64f97116101ee57806366e64f971461051c57806379ba5097146105285780638304e6d21461053057600080fd5b80635c975abb146104c95780635f62fa6f146104e6578063652dfc3b1461050957600080fd5b806353a47bb71161024557806353a47bb71461048d57806359c13403146104ad5780635b65b9ab146104b657600080fd5b80633beaf526146104395780634a474aa31461044c578063525862f91461045f57600080fd5b8063165282c3116102cd57806333032dd0116102a757806333032dd01461040a57806333efa2b21461041357806336f734c11461042657600080fd5b8063165282c3146103a25780632d11c58a146103b5578063327107f7146103be57600080fd5b806307cca166116102fe57806307cca16614610369578063081c46241461037c5780631627540c1461038f57600080fd5b8063024faa8c1461032557806305ab421d1461034157806305c211d214610356575b600080fd5b61032e60085481565b6040519081526020015b60405180910390f35b61035461034f366004613642565b6107e6565b005b61035461036436600461366c565b610918565b6103546103773660046136a6565b610cb7565b61035461038a3660046136dd565b610dc2565b61035461039d366004613702565b610e4d565b61032e6103b036600461371d565b610f3d565b61032e60095481565b6103e57f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610338565b61032e60075481565b61035461042136600461373f565b610fbc565b61035461043436600461377a565b611769565b61032e61044736600461371d565b611b56565b61035461045a3660046137a6565b611d7e565b61047261046d36600461371d565b611efe565b60408051938452602084019290925290820152606001610338565b6001546103e59073ffffffffffffffffffffffffffffffffffffffff1681565b61032e600a5481565b6103546104c436600461377a565b612017565b6006546104d69060ff1681565b6040519015158152602001610338565b6104d66104f4366004613702565b60056020526000908152604090205460ff1681565b6103546105173660046137bf565b61213a565b61032e6402540be40081565b6103546121f6565b61032e7f000000000000000000000000000000000000000000000000000000000000000081565b610354612333565b600f5461032e565b6000546103e59073ffffffffffffffffffffffffffffffffffffffff1681565b610354610595366004613702565b61241e565b6105ad6105a836600461371d565b61252d565b6040516103389190613845565b6105cd6105c83660046137a6565b6126bd565b6040805173ffffffffffffffffffffffffffffffffffffffff909416845267ffffffffffffffff909216602084015263ffffffff1690820152606001610338565b61035461061c366004613702565b61273e565b61035461062f3660046138dd565b61284d565b6106476106423660046137a6565b61295d565b6040805167ffffffffffffffff96871681529486166020860152928516928401929092529092166060820152608081019190915260a001610338565b61032e600e5481565b61069f61069a366004613952565b6129dd565b6040516103389291906139fd565b61032e600b5481565b6103546106c436600461371d565b612b69565b61032e7f000000000000000000000000000000000000000000000000000000000000000081565b600c5461032e565b610354610706366004613702565b612cbd565b6104d6610719366004613702565b60046020526000908152604090205460ff1681565b6003546103e59073ffffffffffffffffffffffffffffffffffffffff1681565b6104d661075c3660046137a6565b600d6020526000908152604090205460ff1681565b61035461077f36600461371d565b612dcc565b6002546103e59073ffffffffffffffffffffffffffffffffffffffff1681565b6103546130e9565b6103e57f000000000000000000000000000000000000000000000000000000000000000081565b6103546107e13660046137a6565b613174565b60005473ffffffffffffffffffffffffffffffffffffffff16331461086c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e6572000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166108e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f5a65726f2061646472657373206e6f7420616c6c6f77656400000000000000006044820152606401610863565b6109147f00000000000000000000000000000000000000000000000000000000000000008383613181565b5050565b60065460ff1615610985576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f50617573656400000000000000000000000000000000000000000000000000006044820152606401610863565b6402540be4006109958184613a86565b61099f9190613ac1565b336000908152600560205260408120549193509060ff16156109c3575060006109f7565b6109f46109ec600a54612710600954876109dd9190613ac1565b6109e79190613a86565b6132f1565b600b54613307565b90505b808311610a60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f416d6f756e7420746f6f206c6f770000000000000000000000000000000000006044820152606401610863565b67ffffffffffffffff610a786402540be40085613a86565b1115610ae0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f416d6f756e7420746f6f206869676800000000000000000000000000000000006044820152606401610863565b610b0c7f0000000000000000000000000000000000000000000000000000000000000000333086613316565b60006402540be400610b1e8386613ad8565b610b289190613a86565b600c5490915073ffffffffffffffffffffffffffffffffffffffff8416907f0250c838bae2cda1e214f0925d41846180714450539039d6fd90a4121d98738e9086610b826402540be40067ffffffffffffffff8716613ac1565b6040805193845260208401929092529082015242606082015260800160405180910390a26040805160608101825273ffffffffffffffffffffffffffffffffffffffff948516815267ffffffffffffffff9283166020820190815263ffffffff428116938301938452600c805460018101825560009190915292517fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c79093018054925194519091167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9490951674010000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090921692909616919091171716179091555050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b73ffffffffffffffffffffffffffffffffffffffff821660008181526004602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001685151590811790915591519182527f6a5f1fd939b33c2480886a44e0780806ce19041ef2c91734cb752c54288ca5ac910160405180910390a25050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e43576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b610914828261348f565b60005473ffffffffffffffffffffffffffffffffffffffff163314610ece576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce2290600090a250565b6000825b828111610fa557600c8181548110610f5b57610f5b613aeb565b600091825260209091200154610f939074010000000000000000000000000000000000000000900467ffffffffffffffff1683613b1a565b9150610f9e81613b2d565b9050610f41565b50610fb56402540be40082613ac1565b9392505050565b60065460ff1615611029576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f50617573656400000000000000000000000000000000000000000000000000006044820152606401610863565b60035473ffffffffffffffffffffffffffffffffffffffff1633146110aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4e6f74206669727374206f6666696365720000000000000000000000000000006044820152606401610863565b600e8054600091600f9190836110bf83613b2d565b91905055815481106110d3576110d3613aeb565b60009182526020918290206040805160a0810182526002909302909101805467ffffffffffffffff8082168552680100000000000000008204811695850195909552700100000000000000000000000000000000810485169284019290925278010000000000000000000000000000000000000000000000009091049092166060820181905260019092015460808201529150156111cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f42617463682064697370757465640000000000000000000000000000000000006044820152606401610863565b805167ffffffffffffffff16823514611242576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f57726f6e672073746172740000000000000000000000000000000000000000006044820152606401610863565b806020015167ffffffffffffffff1660018380602001906112639190613b65565b8451611279925067ffffffffffffffff16613b1a565b6112839190613ad8565b146112ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f57726f6e672073697a65000000000000000000000000000000000000000000006044820152606401610863565b60085460408201516113069067ffffffffffffffff1642613ad8565b101561136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f546f6f20736f6f6e0000000000000000000000000000000000000000000000006044820152606401610863565b8051604051600091611476917f0000000000000000000000000000000000000000000000000000000000000000917f0000000000000000000000000000000000000000000000000000000000000000917f0000000000000000000000000000000000000000000000000000000000000000917f000000000000000000000000000000000000000000000000000000000000000091602001948552606093841b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000090811660208701526034860193909352921b16605483015260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016606882015260700190565b60405160208183030381529060405280519060200120905060005b61149e6020850185613b65565b905081101561169e57600d600082856000015167ffffffffffffffff166114c59190613b1a565b815260208101919091526040016000205460ff16611588576115887f000000000000000000000000000000000000000000000000000000000000000061150e6020870187613b65565b8481811061151e5761151e613aeb565b6115349260206060909202019081019150613702565b6402540be4006115476020890189613b65565b8681811061155757611557613aeb565b905060600201602001602081019061156f9190613bd3565b67ffffffffffffffff166115839190613ac1565b613181565b816115966020860186613b65565b838181106115a6576115a6613aeb565b6115bc9260206060909202019081019150613702565b6115c96020870187613b65565b848181106115d9576115d9613aeb565b90506060020160200160208101906115f19190613bd3565b60405160200161165e9392919092835260609190911b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602083015260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166034820152603c0190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209150600101611491565b508082608001511461170c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f57726f6e672068617368000000000000000000000000000000000000000000006044820152606401610863565b81516020808401516040805167ffffffffffffffff9485168152939091169183019190915281018290527fce67cdf2a5dbd123a7aa5e9fd21b2136e06d33eb30e024ee5c491a6ec934a48b906060015b60405180910390a1505050565b60065460ff16156117d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f50617573656400000000000000000000000000000000000000000000000000006044820152606401610863565b60025473ffffffffffffffffffffffffffffffffffffffff163314611857576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f4e6f74206361707461696e0000000000000000000000000000000000000000006044820152606401610863565b600f54158015611865575082155b806118d65750600f54158015906118d65750600f805461188790600190613ad8565b8154811061189757611897613aeb565b60009182526020909120600290910201546118c99068010000000000000000900467ffffffffffffffff166001613bfd565b67ffffffffffffffff1683145b61193c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f57726f6e672073746172740000000000000000000000000000000000000000006044820152606401610863565b828210158015611953575067ffffffffffffffff82105b6119b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f57726f6e6720656e6400000000000000000000000000000000000000000000006044820152606401610863565b6040805160a08101825267ffffffffffffffff80861682528481166020830190815242821693830193845260006060840181815260808501878152600f80546001818101835594829052965160029097027f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80281018054965199519451881678010000000000000000000000000000000000000000000000000277ffffffffffffffffffffffffffffffffffffffffffffffff95891670010000000000000000000000000000000002959095166fffffffffffffffffffffffffffffffff9a891668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090981699909816989098179590951797909716949094171790935590517f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8039091015590547fe078fb854f34cd8ca5f749fe2e680b692ef7df5e057026369a30c8965a3219ca91611b3491613ad8565b604080519182526020820186905281018490526060810183905260800161175c565b604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000606090811b8216848601527f000000000000000000000000000000000000000000000000000000000000000060548501527f0000000000000000000000000000000000000000000000000000000000000000901b1660748301527fffffffffffffffff00000000000000000000000000000000000000000000000060c086901b1660888301528251808303607001815260909092019092528051910120600090835b838111611d745781600c8281548110611c8357611c83613aeb565b600091825260209091200154600c805473ffffffffffffffffffffffffffffffffffffffff9092169184908110611cbc57611cbc613aeb565b9060005260206000200160000160149054906101000a900467ffffffffffffffff16604051602001611d4b9392919092835260609190911b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602083015260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166034820152603c0190565b60405160208183030381529060405280519060200120915080611d6d90613b2d565b9050611c68565b5090505b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611dff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b80600e541115611e6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f426174636820616c7265616479206578656375746564000000000000000000006044820152606401610863565b600f54811015611ec757600f805480611e8657611e86613c1e565b60008281526020812060027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192830201818155600101559055611e6b565b6040518181527f992e817214d6c9aa9d52b4faf1913b1d1321ce1a6ff98258e88a5d78e71a0183906020015b60405180910390a150565b60008060008060075442611f129190613ad8565b600c5490915086108015611f69575080600c8781548110611f3557611f35613aeb565b6000918252602090912001547c0100000000000000000000000000000000000000000000000000000000900463ffffffff16105b1561200f578593506001611f7d8686613b1a565b611f879190613ad8565b600c549093508310611fa557600c54611fa290600190613ad8565b92505b80600c8481548110611fb957611fb9613aeb565b6000918252602090912001547c0100000000000000000000000000000000000000000000000000000000900463ffffffff16106120025782611ffa81613c4d565b935050611fa5565b61200c8484611b56565b91505b509250925092565b60005473ffffffffffffffffffffffffffffffffffffffff163314612098576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b606483106120a557600080fd5b68056bc75e2d6310000082106120ba57600080fd5b683635c9adc5dea0000081106120cf57600080fd5b600954600a54600b54604080519384526020840187905283019190915260608201849052608082015260a081018290527f0bc992b511038194430d3b93b01ed9d312562944591645c91130b33b0d920d139060c00160405180910390a1600992909255600a55600b55565b60005473ffffffffffffffffffffffffffffffffffffffff1633146121bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b60005b828110156121f0576121e88484838181106121db576121db613aeb565b905060200201358361348f565b6001016121be565b50505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461229d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560448201527f2063616e20616363657074206f776e65727368697000000000000000000000006064820152608401610863565b6001546000805460405173ffffffffffffffffffffffffffffffffffffffff93841693909116917fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c91a360018054600080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff841617909155169055565b3360009081526004602052604090205460ff1680612368575060005473ffffffffffffffffffffffffffffffffffffffff1633145b8061238a575060025473ffffffffffffffffffffffffffffffffffffffff1633145b806123ac575060035473ffffffffffffffffffffffffffffffffffffffff1633145b612412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e6f7420637265776d656d6265720000000000000000000000000000000000006044820152606401610863565b61241c60016135ba565b565b60005473ffffffffffffffffffffffffffffffffffffffff16331461249f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b60025460405173ffffffffffffffffffffffffffffffffffffffff8084169216907ff18effac70e61c427eeb822dabc8c030ad0d6178e38899b5436e10f9b599028f90600090a3600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b604080518082019091526060602082015282815261254b8383613ad8565b612556906001613b1a565b67ffffffffffffffff81111561256e5761256e613c82565b6040519080825280602002602001820160405280156125d757816020015b60408051606081018252600080825260208083018290529282015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920191018161258c5790505b506020820152825b8281116126b657600c81815481106125f9576125f9613aeb565b600091825260209182902060408051606081018252929091015473ffffffffffffffffffffffffffffffffffffffff8116835274010000000000000000000000000000000000000000810467ffffffffffffffff16838501527c0100000000000000000000000000000000000000000000000000000000900463ffffffff16908201529083015161268a8684613ad8565b8151811061269a5761269a613aeb565b6020026020010181905250806126af90613b2d565b90506125df565b5092915050565b600c81815481106126cd57600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff8116915074010000000000000000000000000000000000000000810467ffffffffffffffff16907c0100000000000000000000000000000000000000000000000000000000900463ffffffff1683565b60005473ffffffffffffffffffffffffffffffffffffffff1633146127bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b60035460405173ffffffffffffffffffffffffffffffffffffffff8084169216907fd64fbe94bc529b7e39db059497f4956a94c5ade6b2df42325818876b1c013bcd90600090a3600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60008461285a578761287c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018290526064810188905260ff8616608482015260a4810185905260c481018490529091507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063d505accf9060e401600060405180830381600087803b15801561293157600080fd5b505af1158015612945573d6000803e3d6000fd5b505050506129538188610918565b5050505050505050565b600f818154811061296d57600080fd5b60009182526020909120600290910201805460019091015467ffffffffffffffff8083169350680100000000000000008304811692700100000000000000000000000000000000810482169278010000000000000000000000000000000000000000000000009091049091169085565b6000805460609073ffffffffffffffffffffffffffffffffffffffff163314612a62576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b821580612a86575060008673ffffffffffffffffffffffffffffffffffffffff163b115b612aec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f43616e206e6f742063616c6c20612066756e6374696f6e206f6e206120454f416044820152606401610863565b6000808773ffffffffffffffffffffffffffffffffffffffff16878787604051612b17929190613cb1565b60006040518083038185875af1925050503d8060008114612b54576040519150601f19603f3d011682016040523d82523d6000602084013e612b59565b606091505b5090999098509650505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314612bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b610e108210158015612bfe5750610e108110155b612c64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f506572696f6420746f6f2073686f7274000000000000000000000000000000006044820152606401610863565b6007546008546040805192835260208301919091528101839052606081018290527f7e8d6c37faafc79578015f383c6a5d31a846c93210a9d639e01843943e9fd5f89060800160405180910390a1600791909155600855565b60005473ffffffffffffffffffffffffffffffffffffffff163314612d3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260056020908152604091829020805460ff808216157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921682179092558351948552161515908301527f017149285d09d144b60699c89d370abbf31f058fc660d50c3881391f93af1bd79101611ef3565b3360009081526004602052604090205460ff1680612e01575060005473ffffffffffffffffffffffffffffffffffffffff1633145b80612e23575060025473ffffffffffffffffffffffffffffffffffffffff1633145b80612e45575060035473ffffffffffffffffffffffffffffffffffffffff1633145b612eab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e6f7420637265776d656d6265720000000000000000000000000000000000006044820152606401610863565b80600f8381548110612ebf57612ebf613aeb565b90600052602060002090600202016001015414612f38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f57726f6e672068617368000000000000000000000000000000000000000000006044820152606401610863565b81600e541115612fa4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f426174636820616c7265616479206578656375746564000000000000000000006044820152606401610863565b600f8281548110612fb757612fb7613aeb565b60009182526020909120600290910201547801000000000000000000000000000000000000000000000000900467ffffffffffffffff1615613055576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f426174636820616c7265616479206469737075746564000000000000000000006044820152606401610863565b6001600f838154811061306a5761306a613aeb565b906000526020600020906002020160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506130ab60016135ba565b60408051838152602081018390527f2292bdbb5281fd856c02c8a97b23b28fd9c47e895224d5262ef02c9647c1ebc091015b60405180910390a15050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461316a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b61241c60006135ba565b61317e8133610918565b50565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916132189190613cc1565b6000604051808303816000865af19150503d8060008114613255576040519150601f19603f3d011682016040523d82523d6000602084013e61325a565b606091505b50915091508180156132845750805115806132845750808060200190518101906132849190613cdd565b6132ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f53540000000000000000000000000000000000000000000000000000000000006044820152606401610863565b5050505050565b60008183116133005781610fb5565b5090919050565b60008183106133005781610fb5565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905291516000928392908816916133b59190613cc1565b6000604051808303816000865af19150503d80600081146133f2576040519150601f19603f3d011682016040523d82523d6000602084013e6133f7565b606091505b50915091508180156134215750805115806134215750808060200190518101906134219190613cdd565b613487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600360248201527f53544600000000000000000000000000000000000000000000000000000000006044820152606401610863565b505050505050565b600e5415806134e45750600f6001600e546134aa9190613ad8565b815481106134ba576134ba613aeb565b600091825260209091206002909102015468010000000000000000900467ffffffffffffffff1682115b61354a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5472616e73616374696f6e20616c7265616479206578656375746564000000006044820152606401610863565b6000828152600d602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168415159081179091558251858152918201527fdf11c22eefc5804dfbf9c567c2522c17e93416278a0f8a6f8e8f327ee6cb032e91016130dd565b600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215159081179091556040519081527f9422424b175dda897495a07b091ef74a3ef715cf6d866fc972954c1c7f45930490602001611ef3565b803573ffffffffffffffffffffffffffffffffffffffff8116811461363d57600080fd5b919050565b6000806040838503121561365557600080fd5b61365e83613619565b946020939093013593505050565b6000806040838503121561367f57600080fd5b8235915061368f60208401613619565b90509250929050565b801515811461317e57600080fd5b600080604083850312156136b957600080fd5b6136c283613619565b915060208301356136d281613698565b809150509250929050565b600080604083850312156136f057600080fd5b8235915060208301356136d281613698565b60006020828403121561371457600080fd5b610fb582613619565b6000806040838503121561373057600080fd5b50508035926020909101359150565b60006020828403121561375157600080fd5b813567ffffffffffffffff81111561376857600080fd5b820160408185031215610fb557600080fd5b60008060006060848603121561378f57600080fd5b505081359360208301359350604090920135919050565b6000602082840312156137b857600080fd5b5035919050565b6000806000604084860312156137d457600080fd5b833567ffffffffffffffff808211156137ec57600080fd5b818601915086601f83011261380057600080fd5b81358181111561380f57600080fd5b8760208260051b850101111561382457600080fd5b6020928301955093505084013561383a81613698565b809150509250925092565b6000602080835260608084018551838601528286015160408060408801528282518085526080890191508684019450600093505b808410156138d0578451805173ffffffffffffffffffffffffffffffffffffffff1683528781015167ffffffffffffffff168884015283015163ffffffff1683830152938601936001939093019290850190613879565b5098975050505050505050565b600080600080600080600060e0888a0312156138f857600080fd5b8735965061390860208901613619565b955060408801359450606088013561391f81613698565b9350608088013560ff8116811461393557600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806000806060858703121561396857600080fd5b61397185613619565b935060208501359250604085013567ffffffffffffffff8082111561399557600080fd5b818701915087601f8301126139a957600080fd5b8135818111156139b857600080fd5b8860208285010111156139ca57600080fd5b95989497505060200194505050565b60005b838110156139f45781810151838201526020016139dc565b50506000910152565b82151581526040602082015260008251806040840152613a248160608501602087016139d9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082613abc577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b8082028115828204841417611d7857611d78613a57565b81810381811115611d7857611d78613a57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80820180821115611d7857611d78613a57565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b5e57613b5e613a57565b5060010190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613b9a57600080fd5b83018035915067ffffffffffffffff821115613bb557600080fd5b6020019150606081023603821315613bcc57600080fd5b9250929050565b600060208284031215613be557600080fd5b813567ffffffffffffffff81168114610fb557600080fd5b67ffffffffffffffff8181168382160190808211156126b6576126b6613a57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081613c5c57613c5c613a57565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8183823760009101908152919050565b60008251613cd38184602087016139d9565b9190910192915050565b600060208284031215613cef57600080fd5b8151610fb58161369856fea26469706673582212203ca0a05dd7bdc76fa7bbffedfe400119002a8bb933f042259ed3b427b674c8c564736f6c63430008170033000000000000000000000000853d955acef822db058eb8505911ed77f175b99e0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000fc0000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000fc
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103205760003560e01c80638456cb59116101a7578063c2f6afe5116100ee578063e050be5711610097578063f7b188a511610071578063f7b188a5146107a4578063fc0c546a146107ac578063fd433ec0146107d357600080fd5b8063e050be571461074e578063f40e349f14610771578063f55ebb8f1461078457600080fd5b8063d2c1626c116100c8578063d2c1626c146106f8578063d9fb265d1461070b578063de7974a41461072e57600080fd5b8063c2f6afe5146106b6578063cd84980e146106c9578063cdbdfdc2146106f057600080fd5b80639b8c624a11610150578063b61325cd1161012a578063b61325cd14610683578063b61d27f61461068c578063c2624e1e146106ad57600080fd5b80639b8c624a1461060e578063a3a6d9e814610621578063b32c4d8d1461063457600080fd5b80638e714a72116101815780638e714a7214610587578063907c6c2e1461059a5780639ace38c2146105ba57600080fd5b80638456cb59146105575780638b928bd31461055f5780638da5cb5b1461056757600080fd5b80633beaf5261161026b5780635c975abb1161021457806366e64f97116101ee57806366e64f971461051c57806379ba5097146105285780638304e6d21461053057600080fd5b80635c975abb146104c95780635f62fa6f146104e6578063652dfc3b1461050957600080fd5b806353a47bb71161024557806353a47bb71461048d57806359c13403146104ad5780635b65b9ab146104b657600080fd5b80633beaf526146104395780634a474aa31461044c578063525862f91461045f57600080fd5b8063165282c3116102cd57806333032dd0116102a757806333032dd01461040a57806333efa2b21461041357806336f734c11461042657600080fd5b8063165282c3146103a25780632d11c58a146103b5578063327107f7146103be57600080fd5b806307cca166116102fe57806307cca16614610369578063081c46241461037c5780631627540c1461038f57600080fd5b8063024faa8c1461032557806305ab421d1461034157806305c211d214610356575b600080fd5b61032e60085481565b6040519081526020015b60405180910390f35b61035461034f366004613642565b6107e6565b005b61035461036436600461366c565b610918565b6103546103773660046136a6565b610cb7565b61035461038a3660046136dd565b610dc2565b61035461039d366004613702565b610e4d565b61032e6103b036600461371d565b610f3d565b61032e60095481565b6103e57f000000000000000000000000fc0000000000000000000000000000000000000181565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610338565b61032e60075481565b61035461042136600461373f565b610fbc565b61035461043436600461377a565b611769565b61032e61044736600461371d565b611b56565b61035461045a3660046137a6565b611d7e565b61047261046d36600461371d565b611efe565b60408051938452602084019290925290820152606001610338565b6001546103e59073ffffffffffffffffffffffffffffffffffffffff1681565b61032e600a5481565b6103546104c436600461377a565b612017565b6006546104d69060ff1681565b6040519015158152602001610338565b6104d66104f4366004613702565b60056020526000908152604090205460ff1681565b6103546105173660046137bf565b61213a565b61032e6402540be40081565b6103546121f6565b61032e7f00000000000000000000000000000000000000000000000000000000000000fc81565b610354612333565b600f5461032e565b6000546103e59073ffffffffffffffffffffffffffffffffffffffff1681565b610354610595366004613702565b61241e565b6105ad6105a836600461371d565b61252d565b6040516103389190613845565b6105cd6105c83660046137a6565b6126bd565b6040805173ffffffffffffffffffffffffffffffffffffffff909416845267ffffffffffffffff909216602084015263ffffffff1690820152606001610338565b61035461061c366004613702565b61273e565b61035461062f3660046138dd565b61284d565b6106476106423660046137a6565b61295d565b6040805167ffffffffffffffff96871681529486166020860152928516928401929092529092166060820152608081019190915260a001610338565b61032e600e5481565b61069f61069a366004613952565b6129dd565b6040516103389291906139fd565b61032e600b5481565b6103546106c436600461371d565b612b69565b61032e7f000000000000000000000000000000000000000000000000000000000000000181565b600c5461032e565b610354610706366004613702565b612cbd565b6104d6610719366004613702565b60046020526000908152604090205460ff1681565b6003546103e59073ffffffffffffffffffffffffffffffffffffffff1681565b6104d661075c3660046137a6565b600d6020526000908152604090205460ff1681565b61035461077f36600461371d565b612dcc565b6002546103e59073ffffffffffffffffffffffffffffffffffffffff1681565b6103546130e9565b6103e57f000000000000000000000000853d955acef822db058eb8505911ed77f175b99e81565b6103546107e13660046137a6565b613174565b60005473ffffffffffffffffffffffffffffffffffffffff16331461086c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e6572000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166108e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f5a65726f2061646472657373206e6f7420616c6c6f77656400000000000000006044820152606401610863565b6109147f000000000000000000000000853d955acef822db058eb8505911ed77f175b99e8383613181565b5050565b60065460ff1615610985576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f50617573656400000000000000000000000000000000000000000000000000006044820152606401610863565b6402540be4006109958184613a86565b61099f9190613ac1565b336000908152600560205260408120549193509060ff16156109c3575060006109f7565b6109f46109ec600a54612710600954876109dd9190613ac1565b6109e79190613a86565b6132f1565b600b54613307565b90505b808311610a60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f416d6f756e7420746f6f206c6f770000000000000000000000000000000000006044820152606401610863565b67ffffffffffffffff610a786402540be40085613a86565b1115610ae0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f416d6f756e7420746f6f206869676800000000000000000000000000000000006044820152606401610863565b610b0c7f000000000000000000000000853d955acef822db058eb8505911ed77f175b99e333086613316565b60006402540be400610b1e8386613ad8565b610b289190613a86565b600c5490915073ffffffffffffffffffffffffffffffffffffffff8416907f0250c838bae2cda1e214f0925d41846180714450539039d6fd90a4121d98738e9086610b826402540be40067ffffffffffffffff8716613ac1565b6040805193845260208401929092529082015242606082015260800160405180910390a26040805160608101825273ffffffffffffffffffffffffffffffffffffffff948516815267ffffffffffffffff9283166020820190815263ffffffff428116938301938452600c805460018101825560009190915292517fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c79093018054925194519091167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9490951674010000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090921692909616919091171716179091555050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b73ffffffffffffffffffffffffffffffffffffffff821660008181526004602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001685151590811790915591519182527f6a5f1fd939b33c2480886a44e0780806ce19041ef2c91734cb752c54288ca5ac910160405180910390a25050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e43576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b610914828261348f565b60005473ffffffffffffffffffffffffffffffffffffffff163314610ece576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce2290600090a250565b6000825b828111610fa557600c8181548110610f5b57610f5b613aeb565b600091825260209091200154610f939074010000000000000000000000000000000000000000900467ffffffffffffffff1683613b1a565b9150610f9e81613b2d565b9050610f41565b50610fb56402540be40082613ac1565b9392505050565b60065460ff1615611029576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f50617573656400000000000000000000000000000000000000000000000000006044820152606401610863565b60035473ffffffffffffffffffffffffffffffffffffffff1633146110aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4e6f74206669727374206f6666696365720000000000000000000000000000006044820152606401610863565b600e8054600091600f9190836110bf83613b2d565b91905055815481106110d3576110d3613aeb565b60009182526020918290206040805160a0810182526002909302909101805467ffffffffffffffff8082168552680100000000000000008204811695850195909552700100000000000000000000000000000000810485169284019290925278010000000000000000000000000000000000000000000000009091049092166060820181905260019092015460808201529150156111cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f42617463682064697370757465640000000000000000000000000000000000006044820152606401610863565b805167ffffffffffffffff16823514611242576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f57726f6e672073746172740000000000000000000000000000000000000000006044820152606401610863565b806020015167ffffffffffffffff1660018380602001906112639190613b65565b8451611279925067ffffffffffffffff16613b1a565b6112839190613ad8565b146112ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f57726f6e672073697a65000000000000000000000000000000000000000000006044820152606401610863565b60085460408201516113069067ffffffffffffffff1642613ad8565b101561136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f546f6f20736f6f6e0000000000000000000000000000000000000000000000006044820152606401610863565b8051604051600091611476917f00000000000000000000000000000000000000000000000000000000000000fc917f000000000000000000000000fc00000000000000000000000000000000000001917f0000000000000000000000000000000000000000000000000000000000000001917f000000000000000000000000853d955acef822db058eb8505911ed77f175b99e91602001948552606093841b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000090811660208701526034860193909352921b16605483015260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016606882015260700190565b60405160208183030381529060405280519060200120905060005b61149e6020850185613b65565b905081101561169e57600d600082856000015167ffffffffffffffff166114c59190613b1a565b815260208101919091526040016000205460ff16611588576115887f000000000000000000000000853d955acef822db058eb8505911ed77f175b99e61150e6020870187613b65565b8481811061151e5761151e613aeb565b6115349260206060909202019081019150613702565b6402540be4006115476020890189613b65565b8681811061155757611557613aeb565b905060600201602001602081019061156f9190613bd3565b67ffffffffffffffff166115839190613ac1565b613181565b816115966020860186613b65565b838181106115a6576115a6613aeb565b6115bc9260206060909202019081019150613702565b6115c96020870187613b65565b848181106115d9576115d9613aeb565b90506060020160200160208101906115f19190613bd3565b60405160200161165e9392919092835260609190911b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602083015260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166034820152603c0190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209150600101611491565b508082608001511461170c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f57726f6e672068617368000000000000000000000000000000000000000000006044820152606401610863565b81516020808401516040805167ffffffffffffffff9485168152939091169183019190915281018290527fce67cdf2a5dbd123a7aa5e9fd21b2136e06d33eb30e024ee5c491a6ec934a48b906060015b60405180910390a1505050565b60065460ff16156117d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f50617573656400000000000000000000000000000000000000000000000000006044820152606401610863565b60025473ffffffffffffffffffffffffffffffffffffffff163314611857576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f4e6f74206361707461696e0000000000000000000000000000000000000000006044820152606401610863565b600f54158015611865575082155b806118d65750600f54158015906118d65750600f805461188790600190613ad8565b8154811061189757611897613aeb565b60009182526020909120600290910201546118c99068010000000000000000900467ffffffffffffffff166001613bfd565b67ffffffffffffffff1683145b61193c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f57726f6e672073746172740000000000000000000000000000000000000000006044820152606401610863565b828210158015611953575067ffffffffffffffff82105b6119b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f57726f6e6720656e6400000000000000000000000000000000000000000000006044820152606401610863565b6040805160a08101825267ffffffffffffffff80861682528481166020830190815242821693830193845260006060840181815260808501878152600f80546001818101835594829052965160029097027f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80281018054965199519451881678010000000000000000000000000000000000000000000000000277ffffffffffffffffffffffffffffffffffffffffffffffff95891670010000000000000000000000000000000002959095166fffffffffffffffffffffffffffffffff9a891668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090981699909816989098179590951797909716949094171790935590517f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8039091015590547fe078fb854f34cd8ca5f749fe2e680b692ef7df5e057026369a30c8965a3219ca91611b3491613ad8565b604080519182526020820186905281018490526060810183905260800161175c565b604080517f00000000000000000000000000000000000000000000000000000000000000016020808301919091527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000007f000000000000000000000000853d955acef822db058eb8505911ed77f175b99e606090811b8216848601527f00000000000000000000000000000000000000000000000000000000000000fc60548501527f000000000000000000000000fc00000000000000000000000000000000000001901b1660748301527fffffffffffffffff00000000000000000000000000000000000000000000000060c086901b1660888301528251808303607001815260909092019092528051910120600090835b838111611d745781600c8281548110611c8357611c83613aeb565b600091825260209091200154600c805473ffffffffffffffffffffffffffffffffffffffff9092169184908110611cbc57611cbc613aeb565b9060005260206000200160000160149054906101000a900467ffffffffffffffff16604051602001611d4b9392919092835260609190911b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602083015260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166034820152603c0190565b60405160208183030381529060405280519060200120915080611d6d90613b2d565b9050611c68565b5090505b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611dff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b80600e541115611e6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f426174636820616c7265616479206578656375746564000000000000000000006044820152606401610863565b600f54811015611ec757600f805480611e8657611e86613c1e565b60008281526020812060027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192830201818155600101559055611e6b565b6040518181527f992e817214d6c9aa9d52b4faf1913b1d1321ce1a6ff98258e88a5d78e71a0183906020015b60405180910390a150565b60008060008060075442611f129190613ad8565b600c5490915086108015611f69575080600c8781548110611f3557611f35613aeb565b6000918252602090912001547c0100000000000000000000000000000000000000000000000000000000900463ffffffff16105b1561200f578593506001611f7d8686613b1a565b611f879190613ad8565b600c549093508310611fa557600c54611fa290600190613ad8565b92505b80600c8481548110611fb957611fb9613aeb565b6000918252602090912001547c0100000000000000000000000000000000000000000000000000000000900463ffffffff16106120025782611ffa81613c4d565b935050611fa5565b61200c8484611b56565b91505b509250925092565b60005473ffffffffffffffffffffffffffffffffffffffff163314612098576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b606483106120a557600080fd5b68056bc75e2d6310000082106120ba57600080fd5b683635c9adc5dea0000081106120cf57600080fd5b600954600a54600b54604080519384526020840187905283019190915260608201849052608082015260a081018290527f0bc992b511038194430d3b93b01ed9d312562944591645c91130b33b0d920d139060c00160405180910390a1600992909255600a55600b55565b60005473ffffffffffffffffffffffffffffffffffffffff1633146121bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b60005b828110156121f0576121e88484838181106121db576121db613aeb565b905060200201358361348f565b6001016121be565b50505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461229d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560448201527f2063616e20616363657074206f776e65727368697000000000000000000000006064820152608401610863565b6001546000805460405173ffffffffffffffffffffffffffffffffffffffff93841693909116917fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c91a360018054600080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff841617909155169055565b3360009081526004602052604090205460ff1680612368575060005473ffffffffffffffffffffffffffffffffffffffff1633145b8061238a575060025473ffffffffffffffffffffffffffffffffffffffff1633145b806123ac575060035473ffffffffffffffffffffffffffffffffffffffff1633145b612412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e6f7420637265776d656d6265720000000000000000000000000000000000006044820152606401610863565b61241c60016135ba565b565b60005473ffffffffffffffffffffffffffffffffffffffff16331461249f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b60025460405173ffffffffffffffffffffffffffffffffffffffff8084169216907ff18effac70e61c427eeb822dabc8c030ad0d6178e38899b5436e10f9b599028f90600090a3600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b604080518082019091526060602082015282815261254b8383613ad8565b612556906001613b1a565b67ffffffffffffffff81111561256e5761256e613c82565b6040519080825280602002602001820160405280156125d757816020015b60408051606081018252600080825260208083018290529282015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920191018161258c5790505b506020820152825b8281116126b657600c81815481106125f9576125f9613aeb565b600091825260209182902060408051606081018252929091015473ffffffffffffffffffffffffffffffffffffffff8116835274010000000000000000000000000000000000000000810467ffffffffffffffff16838501527c0100000000000000000000000000000000000000000000000000000000900463ffffffff16908201529083015161268a8684613ad8565b8151811061269a5761269a613aeb565b6020026020010181905250806126af90613b2d565b90506125df565b5092915050565b600c81815481106126cd57600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff8116915074010000000000000000000000000000000000000000810467ffffffffffffffff16907c0100000000000000000000000000000000000000000000000000000000900463ffffffff1683565b60005473ffffffffffffffffffffffffffffffffffffffff1633146127bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b60035460405173ffffffffffffffffffffffffffffffffffffffff8084169216907fd64fbe94bc529b7e39db059497f4956a94c5ade6b2df42325818876b1c013bcd90600090a3600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60008461285a578761287c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018290526064810188905260ff8616608482015260a4810185905260c481018490529091507f000000000000000000000000853d955acef822db058eb8505911ed77f175b99e73ffffffffffffffffffffffffffffffffffffffff169063d505accf9060e401600060405180830381600087803b15801561293157600080fd5b505af1158015612945573d6000803e3d6000fd5b505050506129538188610918565b5050505050505050565b600f818154811061296d57600080fd5b60009182526020909120600290910201805460019091015467ffffffffffffffff8083169350680100000000000000008304811692700100000000000000000000000000000000810482169278010000000000000000000000000000000000000000000000009091049091169085565b6000805460609073ffffffffffffffffffffffffffffffffffffffff163314612a62576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b821580612a86575060008673ffffffffffffffffffffffffffffffffffffffff163b115b612aec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f43616e206e6f742063616c6c20612066756e6374696f6e206f6e206120454f416044820152606401610863565b6000808773ffffffffffffffffffffffffffffffffffffffff16878787604051612b17929190613cb1565b60006040518083038185875af1925050503d8060008114612b54576040519150601f19603f3d011682016040523d82523d6000602084013e612b59565b606091505b5090999098509650505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314612bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b610e108210158015612bfe5750610e108110155b612c64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f506572696f6420746f6f2073686f7274000000000000000000000000000000006044820152606401610863565b6007546008546040805192835260208301919091528101839052606081018290527f7e8d6c37faafc79578015f383c6a5d31a846c93210a9d639e01843943e9fd5f89060800160405180910390a1600791909155600855565b60005473ffffffffffffffffffffffffffffffffffffffff163314612d3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260056020908152604091829020805460ff808216157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921682179092558351948552161515908301527f017149285d09d144b60699c89d370abbf31f058fc660d50c3881391f93af1bd79101611ef3565b3360009081526004602052604090205460ff1680612e01575060005473ffffffffffffffffffffffffffffffffffffffff1633145b80612e23575060025473ffffffffffffffffffffffffffffffffffffffff1633145b80612e45575060035473ffffffffffffffffffffffffffffffffffffffff1633145b612eab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e6f7420637265776d656d6265720000000000000000000000000000000000006044820152606401610863565b80600f8381548110612ebf57612ebf613aeb565b90600052602060002090600202016001015414612f38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f57726f6e672068617368000000000000000000000000000000000000000000006044820152606401610863565b81600e541115612fa4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f426174636820616c7265616479206578656375746564000000000000000000006044820152606401610863565b600f8281548110612fb757612fb7613aeb565b60009182526020909120600290910201547801000000000000000000000000000000000000000000000000900467ffffffffffffffff1615613055576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f426174636820616c7265616479206469737075746564000000000000000000006044820152606401610863565b6001600f838154811061306a5761306a613aeb565b906000526020600020906002020160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506130ab60016135ba565b60408051838152602081018390527f2292bdbb5281fd856c02c8a97b23b28fd9c47e895224d5262ef02c9647c1ebc091015b60405180910390a15050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461316a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b61241c60006135ba565b61317e8133610918565b50565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916132189190613cc1565b6000604051808303816000865af19150503d8060008114613255576040519150601f19603f3d011682016040523d82523d6000602084013e61325a565b606091505b50915091508180156132845750805115806132845750808060200190518101906132849190613cdd565b6132ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f53540000000000000000000000000000000000000000000000000000000000006044820152606401610863565b5050505050565b60008183116133005781610fb5565b5090919050565b60008183106133005781610fb5565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905291516000928392908816916133b59190613cc1565b6000604051808303816000865af19150503d80600081146133f2576040519150601f19603f3d011682016040523d82523d6000602084013e6133f7565b606091505b50915091508180156134215750805115806134215750808060200190518101906134219190613cdd565b613487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600360248201527f53544600000000000000000000000000000000000000000000000000000000006044820152606401610863565b505050505050565b600e5415806134e45750600f6001600e546134aa9190613ad8565b815481106134ba576134ba613aeb565b600091825260209091206002909102015468010000000000000000900467ffffffffffffffff1682115b61354a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5472616e73616374696f6e20616c7265616479206578656375746564000000006044820152606401610863565b6000828152600d602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168415159081179091558251858152918201527fdf11c22eefc5804dfbf9c567c2522c17e93416278a0f8a6f8e8f327ee6cb032e91016130dd565b600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215159081179091556040519081527f9422424b175dda897495a07b091ef74a3ef715cf6d866fc972954c1c7f45930490602001611ef3565b803573ffffffffffffffffffffffffffffffffffffffff8116811461363d57600080fd5b919050565b6000806040838503121561365557600080fd5b61365e83613619565b946020939093013593505050565b6000806040838503121561367f57600080fd5b8235915061368f60208401613619565b90509250929050565b801515811461317e57600080fd5b600080604083850312156136b957600080fd5b6136c283613619565b915060208301356136d281613698565b809150509250929050565b600080604083850312156136f057600080fd5b8235915060208301356136d281613698565b60006020828403121561371457600080fd5b610fb582613619565b6000806040838503121561373057600080fd5b50508035926020909101359150565b60006020828403121561375157600080fd5b813567ffffffffffffffff81111561376857600080fd5b820160408185031215610fb557600080fd5b60008060006060848603121561378f57600080fd5b505081359360208301359350604090920135919050565b6000602082840312156137b857600080fd5b5035919050565b6000806000604084860312156137d457600080fd5b833567ffffffffffffffff808211156137ec57600080fd5b818601915086601f83011261380057600080fd5b81358181111561380f57600080fd5b8760208260051b850101111561382457600080fd5b6020928301955093505084013561383a81613698565b809150509250925092565b6000602080835260608084018551838601528286015160408060408801528282518085526080890191508684019450600093505b808410156138d0578451805173ffffffffffffffffffffffffffffffffffffffff1683528781015167ffffffffffffffff168884015283015163ffffffff1683830152938601936001939093019290850190613879565b5098975050505050505050565b600080600080600080600060e0888a0312156138f857600080fd5b8735965061390860208901613619565b955060408801359450606088013561391f81613698565b9350608088013560ff8116811461393557600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806000806060858703121561396857600080fd5b61397185613619565b935060208501359250604085013567ffffffffffffffff8082111561399557600080fd5b818701915087601f8301126139a957600080fd5b8135818111156139b857600080fd5b8860208285010111156139ca57600080fd5b95989497505060200194505050565b60005b838110156139f45781810151838201526020016139dc565b50506000910152565b82151581526040602082015260008251806040840152613a248160608501602087016139d9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082613abc577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b8082028115828204841417611d7857611d78613a57565b81810381811115611d7857611d78613a57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80820180821115611d7857611d78613a57565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b5e57613b5e613a57565b5060010190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613b9a57600080fd5b83018035915067ffffffffffffffff821115613bb557600080fd5b6020019150606081023603821315613bcc57600080fd5b9250929050565b600060208284031215613be557600080fd5b813567ffffffffffffffff81168114610fb557600080fd5b67ffffffffffffffff8181168382160190808211156126b6576126b6613a57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081613c5c57613c5c613a57565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8183823760009101908152919050565b60008251613cd38184602087016139d9565b9190910192915050565b600060208284031215613cef57600080fd5b8151610fb58161369856fea26469706673582212203ca0a05dd7bdc76fa7bbffedfe400119002a8bb933f042259ed3b427b674c8c564736f6c63430008170033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000853d955acef822db058eb8505911ed77f175b99e0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000fc0000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000fc
-----Decoded View---------------
Arg [0] : _token (address): 0x853d955aCEf822Db058eb8505911ED77F175b99e
Arg [1] : _chainid (uint256): 1
Arg [2] : _targetToken (address): 0xFc00000000000000000000000000000000000001
Arg [3] : _targetChain (uint256): 252
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000853d955acef822db058eb8505911ed77f175b99e
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [2] : 000000000000000000000000fc00000000000000000000000000000000000001
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000fc
Deployed Bytecode Sourcemap
27595:12248:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28102:41;;;;;;;;;160:25:1;;;148:2;133:18;28102:41:0;;;;;;;;37602:209;;;;;;:::i;:::-;;:::i;:::-;;31219:831;;;;;;:::i;:::-;;:::i;37174:156::-;;;;;;:::i;:::-;;:::i;35187:99::-;;;;;;:::i;:::-;;:::i;36420:140::-;;;;;;:::i;:::-;;:::i;39033:225::-;;;;;;:::i;:::-;;:::i;28176:23::-;;;;;;27655:35;;;;;;;;2305:42:1;2293:55;;;2275:74;;2263:2;2248:18;27655:35:0;2116:239:1;28034:36:0;;;;;;33009:1037;;;;;;:::i;:::-;;:::i;32579:420::-;;;;;;:::i;:::-;;:::i;39268:369::-;;;;;;:::i;:::-;;:::i;34056:213::-;;;;;;:::i;:::-;;:::i;38220:497::-;;;;;;:::i;:::-;;:::i;:::-;;;;3643:25:1;;;3699:2;3684:18;;3677:34;;;;3727:18;;;3720:34;3631:2;3616:18;38220:497:0;3441:319:1;27804:29:0;;;;;;;;;28222:26;;;;;;35552:353;;;;;;:::i;:::-;;:::i;28005:18::-;;;;;;;;;;;;4482:14:1;;4475:22;4457:41;;4445:2;4430:18;28005::0;4317:187:1;27949:48:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;35296:179;;;;;;:::i;:::-;;:::i;28534:42::-;;28572:4;28534:42;;36573:262;;;:::i;27731:33::-;;;;;34683:67;;;:::i;39755:85::-;39819:7;:14;39755:85;;27778:20;;;;;;;;;36845:135;;;;;;:::i;:::-;;:::i;38727:296::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;28587:33::-;;;;;;:::i;:::-;;:::i;:::-;;;;6563:42:1;6551:55;;;6533:74;;6655:18;6643:31;;;6638:2;6623:18;;6616:59;6723:10;6711:23;6691:18;;;6684:51;6521:2;6506:18;28587:33:0;6335:406:1;36990:170:0;;;;;;:::i;:::-;;:::i;32159:407::-;;;;;;:::i;:::-;;:::i;28700:22::-;;;;;;:::i;:::-;;:::i;:::-;;;;7768:18:1;7813:15;;;7795:34;;7865:15;;;7860:2;7845:18;;7838:43;7917:15;;;7897:18;;;7890:43;;;;7969:15;;;7964:2;7949:18;;7942:43;8016:3;8001:19;;7994:35;;;;7745:3;7730:19;28700:22:0;7507:528:1;28670:24:0;;;;;;37845:319;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;28275:28::-;;;;;;35915:436;;;;;;:::i;:::-;;:::i;27696:29::-;;;;;39650:95;39719:12;:19;39650:95;;37340:183;;;;;;:::i;:::-;;:::i;27900:43::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;27867:27;;;;;;;;;28626:38;;;;;;:::i;:::-;;;;;;;;;;;;;;;;34279:394;;;;;;:::i;:::-;;:::i;27839:22::-;;;;;;;;;34760:65;;;:::i;27620:29::-;;;;;32060:92;;;;;;:::i;:::-;;:::i;37602:209::-;30632:5;;;;30620:10;:17;30611:39;;;;;;;10027:2:1;30611:39:0;;;10009:21:1;10066:1;10046:18;;;10039:29;10104:11;10084:18;;;10077:39;10133:18;;30611:39:0;;;;;;;;;37688:20:::1;::::0;::::1;37679:57;;;::::0;::::1;::::0;;10364:2:1;37679:57:0::1;::::0;::::1;10346:21:1::0;10403:2;10383:18;;;10376:30;10442:26;10422:18;;;10415:54;10486:18;;37679:57:0::1;10162:348:1::0;37679:57:0::1;37745:59;37781:5;37788:8;37797:6;37745:27;:59::i;:::-;37602:209:::0;;:::o;31219:831::-;31119:6;;;;31118:7;31109:26;;;;;;;10717:2:1;31109:26:0;;;10699:21:1;10756:1;10736:18;;;10729:29;10794:8;10774:18;;;10767:36;10820:18;;31109:26:0;10515:329:1;31109:26:0;28572:4:::1;31316:23;28572:4:::0;31316:6;:23:::1;:::i;:::-;31315:42;;;;:::i;:::-;31444:10;31407:8;31427:28:::0;;;:16:::1;:28;::::0;;;;;31306:51;;-1:-1:-1;31407:8:0;31427:28:::1;;31424:139;;;-1:-1:-1::0;31463:1:0::1;31424:139;;;31496:57;31505:39;31514:7;;31538:5;31529:8;;31522:6;:15;;;;:::i;:::-;:21;;;;:::i;:::-;31505:8;:39::i;:::-;31545:7;;31496:8;:57::i;:::-;31490:63;;31424:139;31587:3;31580:6;:10;31571:37;;;::::0;::::1;::::0;;11692:2:1;31571:37:0::1;::::0;::::1;11674:21:1::0;11731:2;11711:18;;;11704:30;11770:16;11750:18;;;11743:44;11804:18;;31571:37:0::1;11490:338:1::0;31571:37:0::1;31651:16;31626:23;28572:4;31626:6:::0;:23:::1;:::i;:::-;:41;;31617:69;;;::::0;::::1;::::0;;12035:2:1;31617:69:0::1;::::0;::::1;12017:21:1::0;12074:2;12054:18;;;12047:30;12113:17;12093:18;;;12086:45;12148:18;;31617:69:0::1;11833:339:1::0;31617:69:0::1;31695:79;31735:5;31742:10;31761:4;31767:6;31695:31;:79::i;:::-;31784:21;28572:4;31816:10;31823:3:::0;31816:6;:10:::1;:::i;:::-;31815:29;;;;:::i;:::-;31876:12;:19:::0;31784:61;;-1:-1:-1;31859:92:0::1;::::0;::::1;::::0;::::1;::::0;31896:6;31903:31:::1;28572:4;31903:31;::::0;::::1;;:::i;:::-;31859:92;::::0;;12541:25:1;;;12597:2;12582:18;;12575:34;;;;12625:18;;;12618:34;31935:15:0::1;12683:2:1::0;12668:18;;12661:34;12528:3;12513:19;31859:92:0::1;;;;;;;31978:61;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;;;::::1;32022:15;31978:61:::0;::::1;::::0;;;;;;31960:12:::1;:80:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;31960:80:0;;;;;;;;;::::1;::::0;;;;;;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;::::1;;;::::0;;;-1:-1:-1;;31219:831:0:o;37174:156::-;30632:5;;;;30620:10;:17;30611:39;;;;;;;10027:2:1;30611:39:0;;;10009:21:1;10066:1;10046:18;;;10039:29;10104:11;10084:18;;;10077:39;10133:18;;30611:39:0;9825:332:1;30611:39:0;37253:23:::1;::::0;::::1;;::::0;;;:11:::1;:23;::::0;;;;;;;;:27;;;::::1;::::0;::::1;;::::0;;::::1;::::0;;;37294:29;;4457:41:1;;;37294:29:0::1;::::0;4430:18:1;37294:29:0::1;;;;;;;37174:156:::0;;:::o;35187:99::-;30632:5;;;;30620:10;:17;30611:39;;;;;;;10027:2:1;30611:39:0;;;10009:21:1;10066:1;10046:18;;;10039:29;10104:11;10084:18;;;10077:39;10133:18;;30611:39:0;9825:332:1;30611:39:0;35256:23:::1;35266:5;35272:6;35256:9;:23::i;36420:140::-:0;30632:5;;;;30620:10;:17;30611:39;;;;;;;10027:2:1;30611:39:0;;;10009:21:1;10066:1;10046:18;;;10039:29;10104:11;10084:18;;;10077:39;10133:18;;30611:39:0;9825:332:1;30611:39:0;36490:14:::1;:25:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;36529:24:::1;::::0;::::1;::::0;-1:-1:-1;;36529:24:0::1;36420:140:::0;:::o;39033:225::-;39100:16;39139:5;39127:87;39148:3;39145:1;:6;39127:87;;39182:12;39195:1;39182:15;;;;;;;;:::i;:::-;;;;;;;;;;:22;39169:35;;39182:22;;;;;39169:35;;:::i;:::-;;-1:-1:-1;39152:3:0;;;:::i;:::-;;;39127:87;;;-1:-1:-1;39222:29:0;28572:4;39222:29;;:::i;:::-;;39033:225;-1:-1:-1;;;39033:225:0:o;33009:1037::-;31119:6;;;;31118:7;31109:26;;;;;;;10717:2:1;31109:26:0;;;10699:21:1;10756:1;10736:18;;;10729:29;10794:8;10774:18;;;10767:36;10820:18;;31109:26:0;10515:329:1;31109:26:0;30833:12:::1;::::0;::::1;;30821:10;:24;30812:54;;;::::0;::::1;::::0;;13427:2:1;30812:54:0::1;::::0;::::1;13409:21:1::0;13466:2;13446:18;;;13439:30;13505:19;13485:18;;;13478:47;13542:18;;30812:54:0::1;13225:341:1::0;30812:54:0::1;33130:12:::2;:14:::0;;33101:18:::2;::::0;33122:7:::2;::::0;33130:14;33101:18;33130:14:::2;::::0;::::2;:::i;:::-;;;;;33122:23;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;;33101:44:::2;::::0;;::::2;::::0;::::2;::::0;;33122:23:::2;::::0;;::::2;::::0;;::::2;33101:44:::0;;::::2;::::0;;::::2;::::0;;;;::::2;::::0;::::2;::::0;;::::2;::::0;;;;;;::::2;::::0;::::2;::::0;;;;;;;;;;::::2;::::0;;::::2;::::0;;;;;;;;;::::2;::::0;;;;;;-1:-1:-1;33163:15:0;33154:42:::2;;;::::0;::::2;::::0;;13773:2:1;33154:42:0::2;::::0;::::2;13755:21:1::0;13812:2;13792:18;;;13785:30;13851:16;13831:18;;;13824:44;13885:18;;33154:42:0::2;13571:338:1::0;33154:42:0::2;33214:11:::0;;:41:::2;;33227:28:::0;::::2;33214:41;33205:65;;;::::0;::::2;::::0;;14116:2:1;33205:65:0::2;::::0;::::2;14098:21:1::0;14155:2;14135:18;;;14128:30;14194:13;14174:18;;;14167:41;14225:18;;33205:65:0::2;13914:335:1::0;33205:65:0::2;33333:5;:9;;;33288:54;;33330:1;33300:9;:22;;;;;;;;:::i;:::-;33288:11:::0;;:41:::2;::::0;-1:-1:-1;33288:41:0::2;;;:::i;:::-;:43;;;;:::i;:::-;:54;33279:77;;;::::0;::::2;::::0;;15099:2:1;33279:77:0::2;::::0;::::2;15081:21:1::0;15138:2;15118:18;;;15111:30;15177:12;15157:18;;;15150:40;15207:18;;33279:77:0::2;14897:334:1::0;33279:77:0::2;33411:23;::::0;33390:19:::2;::::0;::::2;::::0;33374:35:::2;::::0;::::2;;:15;:35;:::i;:::-;:60;;33365:81;;;::::0;::::2;::::0;;15438:2:1;33365:81:0::2;::::0;::::2;15420:21:1::0;15477:1;15457:18;;;15450:29;15515:10;15495:18;;;15488:38;15543:18;;33365:81:0::2;15236:331:1::0;33365:81:0::2;33547:11:::0;;33488:71:::2;::::0;33463:12:::2;::::0;33488:71:::2;::::0;33505:11:::2;::::0;33518::::2;::::0;33531:7:::2;::::0;33540:5:::2;::::0;33488:71:::2;;15837:19:1::0;;;15979:2;15975:15;;;15875:66;15971:24;;;15966:2;15957:12;;15950:46;16021:2;16012:12;;16005:28;;;;16067:15;;16063:24;16058:2;16049:12;;16042:46;16127:3;16123:16;16141:66;16119:89;16113:3;16104:13;;16097:112;16234:3;16225:13;;15572:672;33488:71:0::2;;;;;;;;;;;;;33478:82;;;;;;33463:97;;33574:6;33569:372;33585:22;;::::0;::::2;:9:::0;:22:::2;:::i;:::-;:29;;33583:1;:31;33569:372;;;33637:9;:24;33659:1;33647:5;:11;;;:13;;;;;;:::i;:::-;33637:24:::0;;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;33637:24:0;;::::2;;33632:183;;33678:124;33714:5;33721:22;;::::0;::::2;:9:::0;:22:::2;:::i;:::-;33744:1;33721:25;;;;;;;:::i;:::-;:30;::::0;::::2;:25;::::0;;::::2;;:30:::0;;::::2;::::0;-1:-1:-1;33721:30:0::2;:::i;:::-;28572:4;33752:22;;::::0;::::2;:9:::0;:22:::2;:::i;:::-;33775:1;33752:25;;;;;;;:::i;:::-;;;;;;:32;;;;;;;;;;:::i;:::-;:49;;;;;;:::i;:::-;33678:27;:124::i;:::-;33860:4:::0;33866:22:::2;;::::0;::::2;:9:::0;:22:::2;:::i;:::-;33889:1;33866:25;;;;;;;:::i;:::-;:30;::::0;::::2;:25;::::0;;::::2;;:30:::0;;::::2;::::0;-1:-1:-1;33866:30:0::2;:::i;:::-;33897:22;;::::0;::::2;:9:::0;:22:::2;:::i;:::-;33920:1;33897:25;;;;;;;:::i;:::-;;;;;;:32;;;;;;;;;;:::i;:::-;33843:87;;;;;;;;;16721:19:1::0;;;16778:2;16774:15;;;;16791:66;16770:88;16765:2;16756:12;;16749:110;16897:3;16893:16;16911:66;16889:89;16884:2;16875:12;;16868:111;17004:2;16995:12;;16538:475;33843:87:0::2;;::::0;;;;;::::2;::::0;;;;;;33833:98;;33843:87:::2;33833:98:::0;;::::2;::::0;;-1:-1:-1;33615:3:0::2;;33569:372;;;;33970:4;33958:5;:10;;;:16;33949:39;;;::::0;::::2;::::0;;17220:2:1;33949:39:0::2;::::0;::::2;17202:21:1::0;17259:2;17239:18;;;17232:30;17298:12;17278:18;;;17271:40;17328:18;;33949:39:0::2;17018:334:1::0;33949:39:0::2;34012:11:::0;;34024:9:::2;::::0;;::::2;::::0;34002:37:::2;::::0;;17567:18:1;17612:15;;;17594:34;;17664:15;;;;17644:18;;;17637:43;;;;17696:18;;17689:34;;;34002:37:0::2;::::0;17545:2:1;17530:18;34002:37:0::2;;;;;;;;33092:954;;33009:1037:::0;:::o;32579:420::-;31119:6;;;;31118:7;31109:26;;;;;;;10717:2:1;31109:26:0;;;10699:21:1;10756:1;10736:18;;;10729:29;10794:8;10774:18;;;10767:36;10820:18;;31109:26:0;10515:329:1;31109:26:0;30728:7:::1;::::0;::::1;;30716:10;:19;30707:43;;;::::0;::::1;::::0;;17936:2:1;30707:43:0::1;::::0;::::1;17918:21:1::0;17975:2;17955:18;;;17948:30;18014:13;17994:18;;;17987:41;18045:18;;30707:43:0::1;17734:335:1::0;30707:43:0::1;32679:7:::2;:14:::0;:17;:29;::::2;;;-1:-1:-1::0;32700:8:0;;32679:29:::2;32678:95;;;-1:-1:-1::0;32714:7:0::2;:14:::0;:16;;;;:58:::2;;-1:-1:-1::0;32741:7:0::2;32749:14:::0;;:16:::2;::::0;32764:1:::2;::::0;32749:16:::2;:::i;:::-;32741:25;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;;::::2;;:29:::0;:31:::2;::::0;:29;;::::2;;;32771:1;32741:31;:::i;:::-;32734:38;;:5;:38;32714:58;32669:119;;;::::0;::::2;::::0;;14116:2:1;32669:119:0::2;::::0;::::2;14098:21:1::0;14155:2;14135:18;;;14128:30;14194:13;14174:18;;;14167:41;14225:18;;32669:119:0::2;13914:335:1::0;32669:119:0::2;32811:5;32806:3;:10;;:34;;;;-1:-1:-1::0;32824:16:0::2;32820:20:::0;::::2;32806:34;32797:56;;;::::0;::::2;::::0;;18461:2:1;32797:56:0::2;::::0;::::2;18443:21:1::0;18500:1;18480:18;;;18473:29;18538:11;18518:18;;;18511:39;18567:18;;32797:56:0::2;18259:332:1::0;32797:56:0::2;32875:63;::::0;;::::2;::::0;::::2;::::0;;::::2;::::0;;::::2;::::0;;;;::::2;;::::0;::::2;::::0;;;32914:15:::2;32875:63:::0;::::2;::::0;;;;;;-1:-1:-1;32875:63:0;;;;;;;;;;;;32862:7:::2;:77:::0;;::::2;::::0;;::::2;::::0;;;;;;;;::::2;::::0;;::::2;::::0;;::::2;::::0;;;;;;;;;::::2;::::0;::::2;::::0;;;::::2;::::0;::::2;::::0;;;;;;;::::2;::::0;::::2;::::0;;;;;;;::::2;::::0;;;;;;;::::2;::::0;;;;;;;;::::2;::::0;;;;;;;;;;32960:14;;32953:39:::2;::::0;32960:16:::2;::::0;::::2;:::i;:::-;32953:39;::::0;;12541:25:1;;;12597:2;12582:18;;12575:34;;;12625:18;;12618:34;;;12683:2;12668:18;;12661:34;;;12528:3;12513:19;32953:39:0::2;12310:391:1::0;39268:369:0;39385:73;;;39402:7;39385:73;;;;15837:19:1;;;;15875:66;39411:5:0;15979:2:1;15975:15;;;15971:24;;15957:12;;;15950:46;39418:11:0;16012:12:1;;;16005:28;39431:11:0;16067:15:1;;16063:24;16049:12;;;16042:46;16141:66;16127:3;16123:16;;;16119:89;16104:13;;;16097:112;39385:73:0;;;;;;;;;16225:13:1;;;;39385:73:0;;;39375:84;;;;;-1:-1:-1;;16123:16:1;39468:141:0;39489:3;39486:1;:6;39468:141;;39546:6;39554:12;39567:1;39554:15;;;;;;;;:::i;:::-;;;;;;;;;;:20;39575:12;:15;;39554:20;;;;;39588:1;;39575:15;;;;;;:::i;:::-;;;;;;;;:22;;;;;;;;;;;;39529:69;;;;;;;;;16721:19:1;;;16778:2;16774:15;;;;16791:66;16770:88;16765:2;16756:12;;16749:110;16897:3;16893:16;16911:66;16889:89;16884:2;16875:12;;16868:111;17004:2;16995:12;;16538:475;39529:69:0;;;;;;;;;;;;;39519:80;;;;;;39510:89;;39493:3;;;;:::i;:::-;;;39468:141;;;-1:-1:-1;39624:6:0;-1:-1:-1;39268:369:0;;;;;:::o;34056:213::-;30632:5;;;;30620:10;:17;30611:39;;;;;;;10027:2:1;30611:39:0;;;10009:21:1;10066:1;10046:18;;;10039:29;10104:11;10084:18;;;10077:39;10133:18;;30611:39:0;9825:332:1;30611:39:0;34142:7:::1;34128:12;;:21;;34119:56;;;::::0;::::1;::::0;;19194:2:1;34119:56:0::1;::::0;::::1;19176:21:1::0;19233:2;19213:18;;;19206:30;19272:24;19252:18;;;19245:52;19314:18;;34119:56:0::1;18992:346:1::0;34119:56:0::1;34191:7;:14:::0;:22;-1:-1:-1;34184:44:0::1;;;34215:7;:13;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;::::0;;;;;;::::1;;::::0;;;::::1;;::::0;;;34184:44:::1;;;34242:20;::::0;160:25:1;;;34242:20:0::1;::::0;148:2:1;133:18;34242:20:0::1;;;;;;;;34056:213:::0;:::o;38220:497::-;38286:10;38298:8;38308:12;38331:15;38365:19;;38349:15;:35;;;;:::i;:::-;38404:12;:19;38331:53;;-1:-1:-1;38397:26:0;;:71;;;;;38458:10;38427:12;38440:6;38427:20;;;;;;;;:::i;:::-;;;;;;;;;;:30;;;;;;:41;38397:71;38393:318;;;38488:6;;-1:-1:-1;38520:1:0;38510:9;38516:3;38488:6;38510:9;:::i;:::-;:11;;;;:::i;:::-;38542:12;:19;38506:15;;-1:-1:-1;38537:24:0;;38533:55;;38567:12;:19;:21;;38587:1;;38567:21;:::i;:::-;38563:25;;38533:55;38635:10;38606:12;38619:3;38606:17;;;;;;;;:::i;:::-;;;;;;;;;;:27;;;;;;:39;38600:52;;38647:5;;;;:::i;:::-;;;;38600:52;;;38671:30;38691:5;38697:3;38671:19;:30::i;:::-;38664:37;;38393:318;38322:395;38220:497;;;;;:::o;35552:353::-;30632:5;;;;30620:10;:17;30611:39;;;;;;;10027:2:1;30611:39:0;;;10009:21:1;10066:1;10046:18;;;10039:29;10104:11;10084:18;;;10077:39;10133:18;;30611:39:0;9825:332:1;30611:39:0;28362:3:::1;35648:9;:22;35640:31;;;::::0;::::1;;28419:6;35688:8;:20;35680:29;;;::::0;::::1;;28490:7;35726:8;:20;35718:29;;;::::0;::::1;;35768:8;::::0;35787:7:::1;::::0;35804::::1;::::0;35761:60:::1;::::0;;20020:25:1;;;20076:2;20061:18;;20054:34;;;20104:18;;20097:34;;;;20162:2;20147:18;;20140:34;;;20205:3;20190:19;;20183:35;20249:3;20234:19;;20227:35;;;35761:60:0::1;::::0;20007:3:1;19992:19;35761:60:0::1;;;;;;;35830:8;:18:::0;;;;35857:7:::1;:16:::0;35882:7:::1;:16:::0;35552:353::o;35296:179::-;30632:5;;;;30620:10;:17;30611:39;;;;;;;10027:2:1;30611:39:0;;;10009:21:1;10066:1;10046:18;;;10039:29;10104:11;10084:18;;;10077:39;10133:18;;30611:39:0;9825:332:1;30611:39:0;35388:6:::1;35383:86;35397:16:::0;;::::1;35383:86;;;35431:28;35441:7;;35449:1;35441:10;;;;;;;:::i;:::-;;;;;;;35452:6;35431:9;:28::i;:::-;35414:3;;35383:86;;;;35296:179:::0;;;:::o;36573:262::-;36640:14;;;;36626:10;:28;36618:94;;;;;;;20475:2:1;36618:94:0;;;20457:21:1;20514:2;20494:18;;;20487:30;20553:34;20533:18;;;20526:62;20624:23;20604:18;;;20597:51;20665:19;;36618:94:0;20273:417:1;36618:94:0;36746:14;;;36739:5;;36726:35;;36746:14;;;;;36739:5;;;;36726:35;;;36778:14;;;;36770:22;;;;;;36778:14;;;36770:22;;;;36801:27;;;36573:262::o;34683:67::-;30951:10;30939:23;;;;:11;:23;;;;;;;;;:44;;-1:-1:-1;30978:5:0;;;;30966:10;:17;30939:44;:67;;;-1:-1:-1;30999:7:0;;;;30987:10;:19;30939:67;:95;;;-1:-1:-1;31022:12:0;;;;31010:10;:24;30939:95;30930:122;;;;;;;20897:2:1;30930:122:0;;;20879:21:1;20936:2;20916:18;;;20909:30;20975:16;20955:18;;;20948:44;21009:18;;30930:122:0;20695:338:1;30930:122:0;34731:12:::1;34738:4;34731:6;:12::i;:::-;34683:67::o:0;36845:135::-;30632:5;;;;30620:10;:17;30611:39;;;;;;;10027:2:1;30611:39:0;;;10009:21:1;10066:1;10046:18;;;10039:29;10104:11;10084:18;;;10077:39;10133:18;;30611:39:0;9825:332:1;30611:39:0;36927:7:::1;::::0;36916:30:::1;::::0;::::1;::::0;;::::1;::::0;36927:7:::1;::::0;36916:30:::1;::::0;36927:7:::1;::::0;36916:30:::1;36955:7;:18:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;36845:135::o;38727:296::-;-1:-1:-1;;;;;;;;;;;;;;38824:31:0;;;38902:9;38824:31;38902:3;:9;:::i;:::-;:11;;38912:1;38902:11;:::i;:::-;38884:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;38884:30:0;;;;;;;;;;;;;;-1:-1:-1;38864:17:0;;;:50;38935:5;38923:94;38944:3;38941:1;:6;38923:94;;38992:12;39005:1;38992:15;;;;;;;;:::i;:::-;;;;;;;;;;38965:42;;;;;;;;38992:15;;;;38965:42;;;;;;;;;;;;;;;;;;;;;;;;:17;;;;38983:7;38985:5;38983:1;:7;:::i;:::-;38965:26;;;;;;;;:::i;:::-;;;;;;:42;;;;38948:3;;;;:::i;:::-;;;38923:94;;;;38727:296;;;;:::o;28587:33::-;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28587:33:0;;;;;;;;;;;;:::o;36990:170::-;30632:5;;;;30620:10;:17;30611:39;;;;;;;10027:2:1;30611:39:0;;;10009:21:1;10066:1;10046:18;;;10039:29;10104:11;10084:18;;;10077:39;10133:18;;30611:39:0;9825:332:1;30611:39:0;37087:12:::1;::::0;37071:45:::1;::::0;::::1;::::0;;::::1;::::0;37087:12:::1;::::0;37071:45:::1;::::0;37087:12:::1;::::0;37071:45:::1;37125:12;:28:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;36990:170::o;32159:407::-;32361:11;32375:10;:40;;32408:7;32375:40;;;32388:17;32375:40;32424:89;;;;;32460:10;32424:89;;;21599:34:1;32480:4:0;21649:18:1;;;21642:43;21701:18;;;21694:34;;;21744:18;;;21737:34;;;21820:4;21808:17;;21787:19;;;21780:46;21842:19;;;21835:35;;;21886:19;;;21879:35;;;32361:54:0;;-1:-1:-1;32445:5:0;32424:35;;;;;21510:19:1;;32424:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32522:37;32542:6;32549:9;32522:19;:37::i;:::-;32352:214;32159:407;;;;;;;:::o;28700:22::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28700:22:0;;;;;;;;;;;;;;;;;;;;;:::o;37845:319::-;37939:4;30632:5;;37945:12;;30632:5;;30620:10;:17;30611:39;;;;;;;10027:2:1;30611:39:0;;;10009:21:1;10066:1;10046:18;;;10039:29;10104:11;10084:18;;;10077:39;10133:18;;30611:39:0;9825:332:1;30611:39:0;37976:15;;;:36:::1;;;38011:1;37995:3;:15;;;:17;37976:36;37968:80;;;::::0;::::1;::::0;;22127:2:1;37968:80:0::1;::::0;::::1;22109:21:1::0;;;22146:18;;;22139:30;22205:34;22185:18;;;22178:62;22257:18;;37968:80:0::1;21925:356:1::0;37968:80:0::1;38058:12;38072:19:::0;38095:3:::1;:8;;38110:6;38118:5;;38095:29;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;38057:67:0;;;;-1:-1:-1;37845:319:0;-1:-1:-1;;;;;;;37845:319:0:o;35915:436::-;30632:5;;;;30620:10;:17;30611:39;;;;;;;10027:2:1;30611:39:0;;;10009:21:1;10066:1;10046:18;;;10039:29;10104:11;10084:18;;;10077:39;10133:18;;30611:39:0;9825:332:1;30611:39:0;36056:4:::1;36034:20;:26;;:60;;;;;36090:4;36064:24;:30;;36034:60;36026:88;;;::::0;::::1;::::0;;22764:2:1;36026:88:0::1;::::0;::::1;22746:21:1::0;22803:2;22783:18;;;22776:30;22842:18;22822;;;22815:46;22878:18;;36026:88:0::1;22562:340:1::0;36026:88:0::1;36146:19;::::0;36167:23:::1;::::0;36128:110:::1;::::0;;12541:25:1;;;12597:2;12582:18;;12575:34;;;;12625:18;;12618:34;;;12683:2;12668:18;;12661:34;;;36128:110:0::1;::::0;12528:3:1;12513:19;36128:110:0::1;;;;;;;36247:19;:40:::0;;;;36296:23:::1;:48:::0;35915:436::o;37340:183::-;30632:5;;;;30620:10;:17;30611:39;;;;;;;10027:2:1;30611:39:0;;;10009:21:1;10066:1;10046:18;;;10039:29;10104:11;10084:18;;;10077:39;10133:18;;30611:39:0;9825:332:1;30611:39:0;37435:22:::1;::::0;::::1;;::::0;;;:16:::1;:22;::::0;;;;;;;;;;::::1;::::0;;::::1;37434:23;37409:48:::0;;;::::1;::::0;::::1;::::0;;;37471:45;;23075:74:1;;;37493:22:0;23192:14:1;23185:22;23165:18;;;23158:50;37471:45:0::1;::::0;23048:18:1;37471:45:0::1;22907:307:1::0;34279:394:0;30951:10;30939:23;;;;:11;:23;;;;;;;;;:44;;-1:-1:-1;30978:5:0;;;;30966:10;:17;30939:44;:67;;;-1:-1:-1;30999:7:0;;;;30987:10;:19;30939:67;:95;;;-1:-1:-1;31022:12:0;;;;31010:10;:24;30939:95;30930:122;;;;;;;20897:2:1;30930:122:0;;;20879:21:1;20936:2;20916:18;;;20909:30;20975:16;20955:18;;;20948:44;21009:18;;30930:122:0;20695:338:1;30930:122:0;34392:4:::1;34369:7;34377;34369:16;;;;;;;;:::i;:::-;;;;;;;;;;;:21;;;:27;34360:50;;;::::0;::::1;::::0;;17220:2:1;34360:50:0::1;::::0;::::1;17202:21:1::0;17259:2;17239:18;;;17232:30;17298:12;17278:18;;;17271:40;17328:18;;34360:50:0::1;17018:334:1::0;34360:50:0::1;34442:7;34428:12;;:21;;34419:56;;;::::0;::::1;::::0;;19194:2:1;34419:56:0::1;::::0;::::1;19176:21:1::0;19233:2;19213:18;;;19206:30;19272:24;19252:18;;;19245:52;19314:18;;34419:56:0::1;18992:346:1::0;34419:56:0::1;34493:7;34501;34493:16;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:23:::0;;;::::1;;;:26:::0;34484:61:::1;;;::::0;::::1;::::0;;23421:2:1;34484:61:0::1;::::0;::::1;23403:21:1::0;23460:2;23440:18;;;23433:30;23499:24;23479:18;;;23472:52;23541:18;;34484:61:0::1;23219:346:1::0;34484:61:0::1;34578:1;34554:7;34562;34554:16;;;;;;;;:::i;:::-;;;;;;;;;;;:23;;;:25;;;;;;;;;;;;;;;;;;34614:12;34621:4;34614:6;:12::i;:::-;34640:26;::::0;;23744:25:1;;;23800:2;23785:18;;23778:34;;;34640:26:0::1;::::0;23717:18:1;34640:26:0::1;;;;;;;;34279:394:::0;;:::o;34760:65::-;30632:5;;;;30620:10;:17;30611:39;;;;;;;10027:2:1;30611:39:0;;;10009:21:1;10066:1;10046:18;;;10039:29;10104:11;10084:18;;;10077:39;10133:18;;30611:39:0;9825:332:1;30611:39:0;34805:13:::1;34812:5;34805:6;:13::i;32060:92::-:0;32105:39;32125:6;32133:10;32105:19;:39::i;:::-;32060:92;:::o;4310:316::-;4475:59;;;4464:10;24015:55:1;;;4475:59:0;;;23997:74:1;24087:18;;;;24080:34;;;4475:59:0;;;;;;;;;;23970:18:1;;;;4475:59:0;;;;;;;;;4498:24;4475:59;;;4464:71;;-1:-1:-1;;;;4464:10:0;;;;:71;;4475:59;4464:71;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4428:107;;;;4554:7;:57;;;;-1:-1:-1;4566:11:0;;:16;;:44;;;4597:4;4586:24;;;;;;;;;;;;:::i;:::-;4546:72;;;;;;;24869:2:1;4546:72:0;;;24851:21:1;24908:1;24888:18;;;24881:29;24946:4;24926:18;;;24919:32;24968:18;;4546:72:0;24667:325:1;4546:72:0;4417:209;;4310:316;;;:::o;12160:106::-;12218:7;12249:1;12245;:5;:13;;12257:1;12245:13;;;-1:-1:-1;12253:1:0;;12160:106;-1:-1:-1;12160:106:0:o;12342:::-;12400:7;12431:1;12427;:5;:13;;12439:1;12427:13;;3644:367;3849:69;;;3838:10;25278:15:1;;;3849:69:0;;;25260:34:1;25330:15;;;25310:18;;;25303:43;25362:18;;;;25355:34;;;3849:69:0;;;;;;;;;;25172:18:1;;;;3849:69:0;;;;;;;;;3872:28;3849:69;;;3838:81;;-1:-1:-1;;;;3838:10:0;;;;:81;;3849:69;3838:81;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3789:130;;;;3938:7;:57;;;;-1:-1:-1;3950:11:0;;:16;;:44;;;3981:4;3970:24;;;;;;;;;;;;:::i;:::-;3930:73;;;;;;;25602:2:1;3930:73:0;;;25584:21:1;25641:1;25621:18;;;25614:29;25679:5;25659:18;;;25652:33;25702:18;;3930:73:0;25400:326:1;3930:73:0;3778:233;;3644:367;;;;:::o;34946:231::-;35017:12;;:15;;:52;;;35042:7;35063:1;35050:12;;:14;;;;:::i;:::-;35042:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:27;;;;;;35036:33;;35017:52;35008:93;;;;;;;25933:2:1;35008:93:0;;;25915:21:1;25972:2;25952:18;;;25945:30;26011;25991:18;;;25984:58;26059:18;;35008:93:0;25731:352:1;35008:93:0;35110:16;;;;:9;:16;;;;;;;;;:23;;;;;;;;;;;;;35147;;26256:25:1;;;26297:18;;;26290:50;35147:23:0;;26229:18:1;35147:23:0;26088:258:1;34838:97:0;34886:6;:14;;;;;;;;;;;;;34914;;4457:41:1;;;34914:14:0;;4445:2:1;4430:18;34914:14:0;4317:187:1;196:196;264:20;;324:42;313:54;;303:65;;293:93;;382:1;379;372:12;293:93;196:196;;;:::o;397:254::-;465:6;473;526:2;514:9;505:7;501:23;497:32;494:52;;;542:1;539;532:12;494:52;565:29;584:9;565:29;:::i;:::-;555:39;641:2;626:18;;;;613:32;;-1:-1:-1;;;397:254:1:o;656:::-;724:6;732;785:2;773:9;764:7;760:23;756:32;753:52;;;801:1;798;791:12;753:52;837:9;824:23;814:33;;866:38;900:2;889:9;885:18;866:38;:::i;:::-;856:48;;656:254;;;;;:::o;915:118::-;1001:5;994:13;987:21;980:5;977:32;967:60;;1023:1;1020;1013:12;1038:315;1103:6;1111;1164:2;1152:9;1143:7;1139:23;1135:32;1132:52;;;1180:1;1177;1170:12;1132:52;1203:29;1222:9;1203:29;:::i;:::-;1193:39;;1282:2;1271:9;1267:18;1254:32;1295:28;1317:5;1295:28;:::i;:::-;1342:5;1332:15;;;1038:315;;;;;:::o;1358:309::-;1423:6;1431;1484:2;1472:9;1463:7;1459:23;1455:32;1452:52;;;1500:1;1497;1490:12;1452:52;1536:9;1523:23;1513:33;;1596:2;1585:9;1581:18;1568:32;1609:28;1631:5;1609:28;:::i;1672:186::-;1731:6;1784:2;1772:9;1763:7;1759:23;1755:32;1752:52;;;1800:1;1797;1790:12;1752:52;1823:29;1842:9;1823:29;:::i;1863:248::-;1931:6;1939;1992:2;1980:9;1971:7;1967:23;1963:32;1960:52;;;2008:1;2005;1998:12;1960:52;-1:-1:-1;;2031:23:1;;;2101:2;2086:18;;;2073:32;;-1:-1:-1;1863:248:1:o;2360:388::-;2448:6;2501:2;2489:9;2480:7;2476:23;2472:32;2469:52;;;2517:1;2514;2507:12;2469:52;2557:9;2544:23;2590:18;2582:6;2579:30;2576:50;;;2622:1;2619;2612:12;2576:50;2645:22;;2701:2;2683:16;;;2679:25;2676:45;;;2717:1;2714;2707:12;2753:316;2830:6;2838;2846;2899:2;2887:9;2878:7;2874:23;2870:32;2867:52;;;2915:1;2912;2905:12;2867:52;-1:-1:-1;;2938:23:1;;;3008:2;2993:18;;2980:32;;-1:-1:-1;3059:2:1;3044:18;;;3031:32;;2753:316;-1:-1:-1;2753:316:1:o;3256:180::-;3315:6;3368:2;3356:9;3347:7;3343:23;3339:32;3336:52;;;3384:1;3381;3374:12;3336:52;-1:-1:-1;3407:23:1;;3256:180;-1:-1:-1;3256:180:1:o;4509:750::-;4601:6;4609;4617;4670:2;4658:9;4649:7;4645:23;4641:32;4638:52;;;4686:1;4683;4676:12;4638:52;4726:9;4713:23;4755:18;4796:2;4788:6;4785:14;4782:34;;;4812:1;4809;4802:12;4782:34;4850:6;4839:9;4835:22;4825:32;;4895:7;4888:4;4884:2;4880:13;4876:27;4866:55;;4917:1;4914;4907:12;4866:55;4957:2;4944:16;4983:2;4975:6;4972:14;4969:34;;;4999:1;4996;4989:12;4969:34;5054:7;5047:4;5037:6;5034:1;5030:14;5026:2;5022:23;5018:34;5015:47;5012:67;;;5075:1;5072;5065:12;5012:67;5106:4;5098:13;;;;-1:-1:-1;5130:6:1;-1:-1:-1;;5171:20:1;;5158:34;5201:28;5158:34;5201:28;:::i;:::-;5248:5;5238:15;;;4509:750;;;;;:::o;5264:1066::-;5410:4;5439:2;5468;5457:9;5450:21;5490:2;5530;5519:9;5515:18;5575:6;5569:13;5564:2;5553:9;5549:18;5542:41;5630:2;5622:6;5618:15;5612:22;5653:4;5695;5688;5677:9;5673:20;5666:34;5720:6;5755:12;5749:19;5792:6;5784;5777:22;5830:3;5819:9;5815:19;5808:26;;5875:2;5861:12;5857:21;5843:35;;5896:1;5887:10;;5906:398;5920:6;5917:1;5914:13;5906:398;;;5979:13;;6021:9;;6032:42;6017:58;6005:71;;6120:11;;;6114:18;6134;6110:43;6096:12;;;6089:65;6198:11;;6192:18;6212:10;6188:35;6174:12;;;6167:57;6279:15;;;;5942:1;5935:9;;;;;6244:12;;;;5906:398;;;-1:-1:-1;6321:3:1;5264:1066;-1:-1:-1;;;;;;;;5264:1066:1:o;6746:756::-;6854:6;6862;6870;6878;6886;6894;6902;6955:3;6943:9;6934:7;6930:23;6926:33;6923:53;;;6972:1;6969;6962:12;6923:53;7008:9;6995:23;6985:33;;7037:38;7071:2;7060:9;7056:18;7037:38;:::i;:::-;7027:48;;7122:2;7111:9;7107:18;7094:32;7084:42;;7176:2;7165:9;7161:18;7148:32;7189:28;7211:5;7189:28;:::i;:::-;7236:5;-1:-1:-1;7293:3:1;7278:19;;7265:33;7342:4;7329:18;;7317:31;;7307:59;;7362:1;7359;7352:12;7307:59;6746:756;;;;-1:-1:-1;6746:756:1;;;;7385:7;7439:3;7424:19;;7411:33;;-1:-1:-1;7491:3:1;7476:19;;;7463:33;;6746:756;-1:-1:-1;;6746:756:1:o;8040:733::-;8128:6;8136;8144;8152;8205:2;8193:9;8184:7;8180:23;8176:32;8173:52;;;8221:1;8218;8211:12;8173:52;8244:29;8263:9;8244:29;:::i;:::-;8234:39;;8320:2;8309:9;8305:18;8292:32;8282:42;;8375:2;8364:9;8360:18;8347:32;8398:18;8439:2;8431:6;8428:14;8425:34;;;8455:1;8452;8445:12;8425:34;8493:6;8482:9;8478:22;8468:32;;8538:7;8531:4;8527:2;8523:13;8519:27;8509:55;;8560:1;8557;8550:12;8509:55;8600:2;8587:16;8626:2;8618:6;8615:14;8612:34;;;8642:1;8639;8632:12;8612:34;8687:7;8682:2;8673:6;8669:2;8665:15;8661:24;8658:37;8655:57;;;8708:1;8705;8698:12;8655:57;8040:733;;;;-1:-1:-1;;8739:2:1;8731:11;;-1:-1:-1;;;8040:733:1:o;8778:250::-;8863:1;8873:113;8887:6;8884:1;8881:13;8873:113;;;8963:11;;;8957:18;8944:11;;;8937:39;8909:2;8902:10;8873:113;;;-1:-1:-1;;9020:1:1;9002:16;;8995:27;8778:250::o;9033:534::-;9216:6;9209:14;9202:22;9191:9;9184:41;9261:2;9256;9245:9;9241:18;9234:30;9165:4;9293:6;9287:13;9336:6;9331:2;9320:9;9316:18;9309:34;9352:79;9424:6;9419:2;9408:9;9404:18;9399:2;9391:6;9387:15;9352:79;:::i;:::-;9483:2;9471:15;9488:66;9467:88;9452:104;;;;9558:2;9448:113;;9033:534;-1:-1:-1;;;9033:534:1:o;10849:184::-;10901:77;10898:1;10891:88;10998:4;10995:1;10988:15;11022:4;11019:1;11012:15;11038:274;11078:1;11104;11094:189;;11139:77;11136:1;11129:88;11240:4;11237:1;11230:15;11268:4;11265:1;11258:15;11094:189;-1:-1:-1;11297:9:1;;11038:274::o;11317:168::-;11390:9;;;11421;;11438:15;;;11432:22;;11418:37;11408:71;;11459:18;;:::i;12177:128::-;12244:9;;;12265:11;;;12262:37;;;12279:18;;:::i;12706:184::-;12758:77;12755:1;12748:88;12855:4;12852:1;12845:15;12879:4;12876:1;12869:15;12895:125;12960:9;;;12981:10;;;12978:36;;;12994:18;;:::i;13025:195::-;13064:3;13095:66;13088:5;13085:77;13082:103;;13165:18;;:::i;:::-;-1:-1:-1;13212:1:1;13201:13;;13025:195::o;14254:638::-;14378:4;14384:6;14444:11;14431:25;14534:66;14523:8;14507:14;14503:29;14499:102;14479:18;14475:127;14465:155;;14616:1;14613;14606:12;14465:155;14643:33;;14695:20;;;-1:-1:-1;14738:18:1;14727:30;;14724:50;;;14770:1;14767;14760:12;14724:50;14803:4;14791:17;;-1:-1:-1;14862:4:1;14850:17;;14834:14;14830:38;14820:49;;14817:69;;;14882:1;14879;14872:12;14817:69;14254:638;;;;;:::o;16249:284::-;16307:6;16360:2;16348:9;16339:7;16335:23;16331:32;16328:52;;;16376:1;16373;16366:12;16328:52;16415:9;16402:23;16465:18;16458:5;16454:30;16447:5;16444:41;16434:69;;16499:1;16496;16489:12;18074:180;18141:18;18179:10;;;18191;;;18175:27;;18214:11;;;18211:37;;;18228:18;;:::i;19343:184::-;19395:77;19392:1;19385:88;19492:4;19489:1;19482:15;19516:4;19513:1;19506:15;19532:196;19571:3;19599:5;19589:39;;19608:18;;:::i;:::-;-1:-1:-1;19655:66:1;19644:78;;19532:196::o;21038:184::-;21090:77;21087:1;21080:88;21187:4;21184:1;21177:15;21211:4;21208:1;21201:15;22286:271;22469:6;22461;22456:3;22443:33;22425:3;22495:16;;22520:13;;;22495:16;22286:271;-1:-1:-1;22286:271:1:o;24125:287::-;24254:3;24292:6;24286:13;24308:66;24367:6;24362:3;24355:4;24347:6;24343:17;24308:66;:::i;:::-;24390:16;;;;;24125:287;-1:-1:-1;;24125:287:1:o;24417:245::-;24484:6;24537:2;24525:9;24516:7;24512:23;24508:32;24505:52;;;24553:1;24550;24543:12;24505:52;24585:9;24579:16;24604:28;24626:5;24604:28;:::i
Swarm Source
ipfs://3ca0a05dd7bdc76fa7bbffedfe400119002a8bb933f042259ed3b427b674c8c5
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.