Contract 0x913227c2a5107e59cdb48822c0862c6b884be392

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x7e04c11da54d370b1849d05a81b1d4391cd491338d5c83120e0153e8ad8d070eEmergency Withdr...381233482022-05-13 0:26:0510 days 5 hrs ago0x9f81fbecfcc87b990885ee664217d243d3a42ab5 IN  0x913227c2a5107e59cdb48822c0862c6b884be3920 FTM0.9128
0x5a1d1fd816fc9be158c3b3b374cb7ac1403d184f886d7e18043c5010a7d70aecEmergency Withdr...381228002022-05-13 0:11:5610 days 5 hrs ago0x9f81fbecfcc87b990885ee664217d243d3a42ab5 IN  0x913227c2a5107e59cdb48822c0862c6b884be3920 FTM0.067974011588
0x2220d5e7bc5c82b723d24c756607935f29259cd3e65da571ec04d5e19dd4d62dEmergency Withdr...381227942022-05-13 0:11:4710 days 5 hrs ago0x9f81fbecfcc87b990885ee664217d243d3a42ab5 IN  0x913227c2a5107e59cdb48822c0862c6b884be3920 FTM0.067974011588
0x472261427696bc4f6b4ffbb599bdeff8f2a2e4fa5492ff1c54e43ee9391dbae8Emergency Withdr...381225702022-05-13 0:06:3710 days 6 hrs ago0x9f81fbecfcc87b990885ee664217d243d3a42ab5 IN  0x913227c2a5107e59cdb48822c0862c6b884be3920 FTM0.101259450445
0x6a52cb2f72840a015fc27080d580a2414eb14345ad681f689ccf8d3b2643c0c1Emergency Withdr...381223042022-05-13 0:00:2910 days 6 hrs ago0x9f81fbecfcc87b990885ee664217d243d3a42ab5 IN  0x913227c2a5107e59cdb48822c0862c6b884be3920 FTM0.069045912222
0x3571f8a3e8d57a8f7842c6cb3ea94dbd92e868e2475f8edf7aea7eeb03220357Emergency Withdr...381107942022-05-12 18:58:0810 days 11 hrs ago0x9b272dc6689eb6d56d6602c382d9d6f265eac3ec IN  0x913227c2a5107e59cdb48822c0862c6b884be3920 FTM0.10971
0xcdadaa4677b8b1d0bc88fa849373dd6ccde4de25c8e8bc767608d52e35daedf7Withdraw381050572022-05-12 16:21:2010 days 13 hrs ago0x367e76cf64e2630005802354391e8712627866c5 IN  0x913227c2a5107e59cdb48822c0862c6b884be3920 FTM0.07999959533
0x3ed123771ce1c1e59ae3eef776175d533ddf047c626f8a8c9b25e7746f03eff9Withdraw380650322022-05-11 22:44:0711 days 7 hrs ago0x6bb48ee6dc739db470e29e3dcf0c3b34e94277db IN  0x913227c2a5107e59cdb48822c0862c6b884be3920 FTM0.217831376628
0xed09f8fc9690b45212b4e2b9df6bcc26285f1a4db75a1522c64bfcf74486e095Withdraw380549402022-05-11 18:28:0711 days 11 hrs ago0x8f217824b5b1a909074af69ad06f867f18d2d91a IN  0x913227c2a5107e59cdb48822c0862c6b884be3920 FTM0.205545175363
0xf4cdebb76f089a2746e28223e0ec6b2d84c9cfd116b9c5e11414de61858cbc27Emergency Withdr...380493332022-05-11 16:04:4011 days 14 hrs ago0x10c904c4836af7f422a3ff41f799194c243c697d IN  0x913227c2a5107e59cdb48822c0862c6b884be3920 FTM0.11847928358
0x943405d278155dfa68c838e19dee4bcc74ca4e9695c3f5cf5208c8193f1ea2eaWithdraw380381132022-05-11 11:25:4811 days 18 hrs ago0x55038f863531bb761df8628794dc580fbbdb0360 IN  0x913227c2a5107e59cdb48822c0862c6b884be3920 FTM0.156233226389
0x2e29977fe781522f30168e51d3f546f6103e0aedf9aff16a01b994b69b1a6051Withdraw380364042022-05-11 10:40:0111 days 19 hrs ago0x383697a7fef14483920ba9be57c26115383d1dda IN  0x913227c2a5107e59cdb48822c0862c6b884be3920 FTM0.150029378757
0x72f6364d36783a997090c08c7099fc1e90ac3c59d4ad6ab814016e8276dd6972Withdraw380321762022-05-11 8:46:4011 days 21 hrs ago0xfd1490b5bab3013c8a8b483a2e16aabe37388905 IN  0x913227c2a5107e59cdb48822c0862c6b884be3920 FTM0.052152176547
0x9b507e5c09b181240c39236959cdaa1c22f51813f33e3d910bac16fb6d9b1e3cWithdraw380321182022-05-11 8:45:2111 days 21 hrs ago0xfd1490b5bab3013c8a8b483a2e16aabe37388905 IN  0x913227c2a5107e59cdb48822c0862c6b884be3920 FTM0.056144277409
0x63048dff14981d519583c3c6c599a012c754c9934457e2a447b0591d6af1013fWithdraw380320972022-05-11 8:44:5011 days 21 hrs ago0xfd1490b5bab3013c8a8b483a2e16aabe37388905 IN  0x913227c2a5107e59cdb48822c0862c6b884be3920 FTM0.10404601463
0x006eb562c858eb045f83253c3ccc6b5c8ecf0122bcfc2b37d33df2e5cef8c6fbWithdraw380271752022-05-11 6:42:0911 days 23 hrs ago0xa358531e74a5a2b22250aa355b7c88d052a2db99 IN  0x913227c2a5107e59cdb48822c0862c6b884be3920 FTM0.110045124681
0x9ed8328747ce5fb91962535ba4d3d594ee99f601427da4399a48fa87a0047dc6Withdraw380271242022-05-11 6:40:3811 days 23 hrs ago0xa358531e74a5a2b22250aa355b7c88d052a2db99 IN  0x913227c2a5107e59cdb48822c0862c6b884be3920 FTM0.135771668357
0xc1176f19f75787a82ff8fc2bbae36040509bd082b5d1f2616f7fa1f1ea918377Withdraw380263682022-05-11 6:21:0211 days 23 hrs ago0xbcda0d45e5520844138c9273395882a6eb471e58 IN  0x913227c2a5107e59cdb48822c0862c6b884be3920 FTM0.11788451057
0x164144724b752ad991aa7b0aa5c0ad4579497af76b4c7a42d916590eb0fd988eWithdraw380260792022-05-11 6:13:4311 days 23 hrs ago0x99ad066a1d7f94ee2d404c5b556e69a68a3b15d4 IN  0x913227c2a5107e59cdb48822c0862c6b884be3920 FTM0.094322813183
0xe81cf5bf5c18058bf2e87494da0f747bbd3d64c32471e66c12f29b50cff94db7Withdraw380253722022-05-11 5:57:0312 days 14 mins ago0x07a656f51a48c52b5c4f0427e89df0d7cee71acb IN  0x913227c2a5107e59cdb48822c0862c6b884be3920 FTM0.07815151237
0x77a3037402f4237ed4ab02d36471a29899826c5a703dfc30e82bca1fafae9543Deposit380245662022-05-11 5:35:2112 days 35 mins ago0x10c904c4836af7f422a3ff41f799194c243c697d IN  0x913227c2a5107e59cdb48822c0862c6b884be3920 FTM0.133561832929
0x03954752e6ffa63d45839c8b045a11b623277e58b20ad7585f574d8457693922Withdraw380232442022-05-11 5:01:2112 days 1 hr ago0x07a656f51a48c52b5c4f0427e89df0d7cee71acb IN  0x913227c2a5107e59cdb48822c0862c6b884be3920 FTM0.065555040983
0x47fff70f4ebca6339a9d65681dabf40a06eaeafae8f5bd76b5d112d2bd59db51Withdraw380231742022-05-11 4:59:3012 days 1 hr ago0x174ec3dd777a4d02fa2305a451141c3c151cf65b IN  0x913227c2a5107e59cdb48822c0862c6b884be3920 FTM0.058412591507
0x9c0676b7d1bcd34cf6f0bbc45e2d4fd7f932b75b4c05267580075d9123334a57Withdraw380208742022-05-11 4:08:4012 days 2 hrs ago0x85883d55b63574092336746a1872088dd94166e8 IN  0x913227c2a5107e59cdb48822c0862c6b884be3920 FTM0.082776027671
0x08ba1f44f8bf30b6854e34607561be0520d499226dde67ef68965b8d941bd319Withdraw380208432022-05-11 4:08:0712 days 2 hrs ago0x85883d55b63574092336746a1872088dd94166e8 IN  0x913227c2a5107e59cdb48822c0862c6b884be3920 FTM0.038303216531
[ Download CSV Export 
Latest 1 internal transaction
Parent Txn Hash Block From To Value
0x62819938fd915d127b87fa80028bd0929bab95fb3edd47497582887b11f5527b377048142022-05-06 19:31:1516 days 10 hrs ago 0xaff39e2f03b556475ad4a107c96a41215db8c5c3  Contract Creation0 FTM
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TornadoGenesisRewardPool

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at FtmScan.com on 2022-05-06
*/

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}


// File @openzeppelin/contracts/math/[email protected]



pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}


// File @openzeppelin/contracts/utils/[email protected]



pragma solidity >=0.6.2 <0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


// File @openzeppelin/contracts/token/ERC20/[email protected]



pragma solidity >=0.6.0 <0.8.0;



/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}



// Note that this pool has no minter key of TORNADO (rewards).
// Instead, the governance will call TORNADO distributeReward method and send reward to this pool at the beginning.
contract TornadoGenesisRewardPool {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    // governance
    address public operator;

    // Info of each user.
    struct UserInfo {
        uint256 amount; // How many tokens the user has provided.
        uint256 rewardDebt; // Reward debt. See explanation below.
    }

    // Info of each pool.
    struct PoolInfo {
        IERC20 token; // Address of LP token contract.
        uint256 allocPoint; // How many allocation points assigned to this pool. TORNADO to distribute.
        uint256 lastRewardTime; // Last time that TORNADO distribution occurs.
        uint256 accTornadoPerShare; // Accumulated TORNADO per share, times 1e18. See below.
        bool isStarted; // if lastRewardBlock has passed
    }

    IERC20 public tornado;
    address public shiba;

    // Info of each pool.
    PoolInfo[] public poolInfo;

    // Info of each user that stakes LP tokens.
    mapping(uint256 => mapping(address => UserInfo)) public userInfo;

    // Total allocation points. Must be the sum of all allocation points in all pools.
    uint256 public totalAllocPoint = 0;

    // The time when TORNADO mining starts.
    uint256 public poolStartTime;

    // The time when TORNADO mining ends.
    uint256 public poolEndTime;


    uint public daoFee;
    address public daoAddress;


    // MAINNET
     uint256 public tornadoPerSecond = 0.2662037 ether; // 23000 TORNADO / (24h * 60min * 60s) 0.2662037
     uint256 public runningTime = 1 days; // 1 days
     uint256 public constant TOTAL_REWARDS = 23000 ether;
    // END MAINNET

    event Deposit(address indexed user, uint256 indexed pid, uint256 amount);
    event Withdraw(address indexed user, uint256 indexed pid, uint256 amount);
    event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount);
    event RewardPaid(address indexed user, uint256 amount);

    constructor(
        address _tornado,
        uint256 _poolStartTime
    ) public {
        require(block.timestamp < _poolStartTime, "late");
        if (_tornado != address(0)) tornado = IERC20(_tornado);
        daoFee = 0;
        daoAddress = address(0x0);
        poolStartTime = _poolStartTime;
        poolEndTime = poolStartTime + runningTime;
        operator = msg.sender;
    }

    modifier onlyOperator() {
        require(operator == msg.sender, "TornadoGenesisPool: caller is not the operator");
        _;
    }

    function checkPoolDuplicate(IERC20 _token) internal view {
        uint256 length = poolInfo.length;
        for (uint256 pid = 0; pid < length; ++pid) {
            require(poolInfo[pid].token != _token, "TornadoGenesisPool: existing pool?");
        }
    }

    // Add a new token to the pool. Can only be called by the owner.
    function add(
        uint256 _allocPoint,
        IERC20 _token,
        bool _withUpdate,
        uint256 _lastRewardTime
    ) public onlyOperator {
        checkPoolDuplicate(_token);
        if (_withUpdate) {
            massUpdatePools();
        }
        if (block.timestamp < poolStartTime) {
            // chef is sleeping
            if (_lastRewardTime == 0) {
                _lastRewardTime = poolStartTime;
            } else {
                if (_lastRewardTime < poolStartTime) {
                    _lastRewardTime = poolStartTime;
                }
            }
        } else {
            // chef is cooking
            if (_lastRewardTime == 0 || _lastRewardTime < block.timestamp) {
                _lastRewardTime = block.timestamp;
            }
        }
        bool _isStarted =
        (_lastRewardTime <= poolStartTime) ||
        (_lastRewardTime <= block.timestamp);
        poolInfo.push(PoolInfo({
            token : _token,
            allocPoint : _allocPoint,
            lastRewardTime : _lastRewardTime,
            accTornadoPerShare : 0,
            isStarted : _isStarted
            }));
        if (_isStarted) {
            totalAllocPoint = totalAllocPoint.add(_allocPoint);
        }
    }

    // Update the given pool's TORNADO allocation point. Can only be called by the owner.
    function set(uint256 _pid, uint256 _allocPoint) public onlyOperator {
        massUpdatePools();
        PoolInfo storage pool = poolInfo[_pid];
        if (pool.isStarted) {
            totalAllocPoint = totalAllocPoint.sub(pool.allocPoint).add(
                _allocPoint
            );
        }
        pool.allocPoint = _allocPoint;
    }

    // Return accumulate rewards over the given _from to _to block.
    function getGeneratedReward(uint256 _fromTime, uint256 _toTime) public view returns (uint256) {
        if (_fromTime >= _toTime) return 0;
        if (_toTime >= poolEndTime) {
            if (_fromTime >= poolEndTime) return 0;
            if (_fromTime <= poolStartTime) return poolEndTime.sub(poolStartTime).mul(tornadoPerSecond);
            return poolEndTime.sub(_fromTime).mul(tornadoPerSecond);
        } else {
            if (_toTime <= poolStartTime) return 0;
            if (_fromTime <= poolStartTime) return _toTime.sub(poolStartTime).mul(tornadoPerSecond);
            return _toTime.sub(_fromTime).mul(tornadoPerSecond);
        }
    }

    // View function to see pending TORNADO on frontend.
    function pendingTORNADO(uint256 _pid, address _user) external view returns (uint256) {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_user];
        uint256 accTornadoPerShare = pool.accTornadoPerShare;
        uint256 tokenSupply = pool.token.balanceOf(address(this));
        if (block.timestamp > pool.lastRewardTime && tokenSupply != 0) {
            uint256 _generatedReward = getGeneratedReward(pool.lastRewardTime, block.timestamp);
            uint256 _tornadoReward = _generatedReward.mul(pool.allocPoint).div(totalAllocPoint);
            accTornadoPerShare = accTornadoPerShare.add(_tornadoReward.mul(1e18).div(tokenSupply));
        }
        return user.amount.mul(accTornadoPerShare).div(1e18).sub(user.rewardDebt);
    }

    // Update reward variables for all pools. Be careful of gas spending!
    function massUpdatePools() public {
        uint256 length = poolInfo.length;
        for (uint256 pid = 0; pid < length; ++pid) {
            updatePool(pid);
        }
    }

    // Update reward variables of the given pool to be up-to-date.
    function updatePool(uint256 _pid) public {
        PoolInfo storage pool = poolInfo[_pid];
        if (block.timestamp <= pool.lastRewardTime) {
            return;
        }
        uint256 tokenSupply = pool.token.balanceOf(address(this));
        if (tokenSupply == 0) {
            pool.lastRewardTime = block.timestamp;
            return;
        }
        if (!pool.isStarted) {
            pool.isStarted = true;
            totalAllocPoint = totalAllocPoint.add(pool.allocPoint);
        }
        if (totalAllocPoint > 0) {
            uint256 _generatedReward = getGeneratedReward(pool.lastRewardTime, block.timestamp);
            uint256 _tornadoReward = _generatedReward.mul(pool.allocPoint).div(totalAllocPoint);
            pool.accTornadoPerShare = pool.accTornadoPerShare.add(_tornadoReward.mul(1e18).div(tokenSupply));
        }
        pool.lastRewardTime = block.timestamp;
    }

    // Deposit LP tokens.
    function deposit(uint256 _pid, uint256 _amount) public {
        address _sender = msg.sender;
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_sender];
        updatePool(_pid);
        if (user.amount > 0) {
            uint256 _pending = user.amount.mul(pool.accTornadoPerShare).div(1e18).sub(user.rewardDebt);
            if (_pending > 0) {
                safeTornadoTransfer(_sender, _pending);
                emit RewardPaid(_sender, _pending);
            }
        }
        if (_amount > 0) {
            pool.token.safeTransferFrom(_sender, address(this), _amount);

            uint _fee = _amount.mul( daoFee ).div( 10000 );
            pool.token.safeTransfer(daoAddress, _fee);
            uint256 _amountSubFee = _amount.sub(_fee);

            if(address(pool.token) == shiba) {
                user.amount = user.amount.add(_amountSubFee.mul(9900).div(10000));
            } else {
                user.amount = user.amount.add(_amountSubFee);
            }
        }
        user.rewardDebt = user.amount.mul(pool.accTornadoPerShare).div(1e18);
        emit Deposit(_sender, _pid, _amount);
    }

    // Withdraw LP tokens.
    function withdraw(uint256 _pid, uint256 _amount) public {
        address _sender = msg.sender;
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_sender];
        require(user.amount >= _amount, "withdraw: not good");
        updatePool(_pid);
        uint256 _pending = user.amount.mul(pool.accTornadoPerShare).div(1e18).sub(user.rewardDebt);
        if (_pending > 0) {
            safeTornadoTransfer(_sender, _pending);
            emit RewardPaid(_sender, _pending);
        }
        if (_amount > 0) {
            user.amount = user.amount.sub(_amount);
            pool.token.safeTransfer(_sender, _amount);
        }
        user.rewardDebt = user.amount.mul(pool.accTornadoPerShare).div(1e18);
        emit Withdraw(_sender, _pid, _amount);
    }

    // Withdraw without caring about rewards. EMERGENCY ONLY.
    function emergencyWithdraw(uint256 _pid) public {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];
        uint256 _amount = user.amount;
        user.amount = 0;
        user.rewardDebt = 0;
        pool.token.safeTransfer(msg.sender, _amount);
        emit EmergencyWithdraw(msg.sender, _pid, _amount);
    }

    // Safe TORNADO transfer function, just in case if rounding error causes pool to not have enough TORNADO.
    function safeTornadoTransfer(address _to, uint256 _amount) internal {
        uint256 _tornadoBalance = tornado.balanceOf(address(this));
        if (_tornadoBalance > 0) {
            if (_amount > _tornadoBalance) {
                tornado.safeTransfer(_to, _tornadoBalance);
            } else {
                tornado.safeTransfer(_to, _amount);
            }
        }
    }

    function setOperator(address _operator) external onlyOperator {
        operator = _operator;
    }

    function governanceRecoverUnsupported(IERC20 _token, uint256 amount, address to) external onlyOperator {
        if (block.timestamp < poolEndTime + 30 days) {
            // do not allow to drain core token (TORNADO or lps) if less than 30 days after pool ends
            require(_token != tornado, "tornado");
            uint256 length = poolInfo.length;
            for (uint256 pid = 0; pid < length; ++pid) {
                PoolInfo storage pool = poolInfo[pid];
                require(_token != pool.token, "pool.token");
            }
        }
        _token.safeTransfer(to, amount);
    }

    function setDaoFee(address _address, uint _fee) external onlyOperator {
        require(_fee <= 200, "Max fee 2%");
        daoAddress = _address;
        daoFee = _fee;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_tornado","type":"address"},{"internalType":"uint256","name":"_poolStartTime","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"TOTAL_REWARDS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"bool","name":"_withUpdate","type":"bool"},{"internalType":"uint256","name":"_lastRewardTime","type":"uint256"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"daoAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"daoFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fromTime","type":"uint256"},{"internalType":"uint256","name":"_toTime","type":"uint256"}],"name":"getGeneratedReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"governanceRecoverUnsupported","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingTORNADO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardTime","type":"uint256"},{"internalType":"uint256","name":"accTornadoPerShare","type":"uint256"},{"internalType":"bool","name":"isStarted","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"runningTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setDaoFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shiba","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tornado","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tornadoPerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260006005556703b1bedad0650800600a5562015180600b5534801561002857600080fd5b50604051611a5e380380611a5e8339818101604052604081101561004b57600080fd5b508051602090910151428111610091576040805162461bcd60e51b815260206004808301919091526024820152636c61746560e01b604482015290519081900360640190fd5b6001600160a01b038216156100bc57600180546001600160a01b0319166001600160a01b0384161790555b60006008819055600980546001600160a01b03199081169091556006839055600b5490920160075580549091163317905550611961806100fd6000396000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c806354575af4116100de57806393f1a40b11610097578063b3ab15fb11610071578063b3ab15fb146103fc578063d763914714610422578063e2bbb1581461042a578063f1c5202f1461044d57610173565b806393f1a40b14610375578063943f013d146103ba57806396805e54146103c257610173565b806354575af414610317578063570ca7351461034d5780635f96dc1114610355578063630b5ba11461035d5780636673816b146103655780636e271dd51461036d57610173565b8063231f0c6a11610130578063231f0c6a146102635780632957b83914610286578063441a3e701461028e5780634628acf9146102b157806351eb05a6146102dd5780635312ea8e146102fa57610173565b806308c577151461017857806309cf6091146101a65780631526fe27146101c057806317caf6f1146102145780631ab06ee51461021c5780632131c68c1461023f575b600080fd5b6101a46004803603604081101561018e57600080fd5b506001600160a01b038135169060200135610455565b005b6101ae610507565b60408051918252519081900360200190f35b6101dd600480360360208110156101d657600080fd5b5035610515565b604080516001600160a01b039096168652602086019490945284840192909252606084015215156080830152519081900360a00190f35b6101ae610560565b6101a46004803603604081101561023257600080fd5b5080359060200135610566565b610247610614565b604080516001600160a01b039092168252519081900360200190f35b6101ae6004803603604081101561027957600080fd5b5080359060200135610623565b6101ae6106e8565b6101a4600480360360408110156102a457600080fd5b50803590602001356106ee565b6101ae600480360360408110156102c757600080fd5b50803590602001356001600160a01b03166108ab565b6101a4600480360360208110156102f357600080fd5b5035610a0c565b6101a46004803603602081101561031057600080fd5b5035610b6a565b6101a46004803603606081101561032d57600080fd5b506001600160a01b03813581169160208101359160409091013516610c06565b610247610d4f565b6101ae610d5e565b6101a4610d64565b610247610d87565b6101ae610d96565b6103a16004803603604081101561038b57600080fd5b50803590602001356001600160a01b0316610d9c565b6040805192835260208301919091528051918290030190f35b6101ae610dc0565b6101a4600480360360808110156103d857600080fd5b508035906001600160a01b0360208201351690604081013515159060600135610dc6565b6101a46004803603602081101561041257600080fd5b50356001600160a01b0316610fc3565b61024761102e565b6101a46004803603604081101561044057600080fd5b508035906020013561103d565b6101ae611237565b6000546001600160a01b0316331461049e5760405162461bcd60e51b815260040180806020018281038252602e815260200180611891602e913960400191505060405180910390fd5b60c88111156104e1576040805162461bcd60e51b815260206004820152600a6024820152694d61782066656520322560b01b604482015290519081900360640190fd5b600980546001600160a01b0319166001600160a01b039390931692909217909155600855565b6904ded51e9cc70060000081565b6003818154811061052257fe5b6000918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b0390931694509092909160ff1685565b60055481565b6000546001600160a01b031633146105af5760405162461bcd60e51b815260040180806020018281038252602e815260200180611891602e913960400191505060405180910390fd5b6105b7610d64565b6000600383815481106105c657fe5b60009182526020909120600590910201600481015490915060ff161561060d5761060982610603836001015460055461123d90919063ffffffff16565b9061129a565b6005555b6001015550565b6009546001600160a01b031681565b6000818310610634575060006106e2565b600754821061069c57600754831061064e575060006106e2565b60065483116106815761067a600a5461067460065460075461123d90919063ffffffff16565b906112fb565b90506106e2565b61067a600a546106748560075461123d90919063ffffffff16565b60065482116106ad575060006106e2565b60065483116106d15761067a600a546106746006548561123d90919063ffffffff16565b600a5461067a90610674848661123d565b92915050565b60085481565b600033905060006003848154811061070257fe5b600091825260208083208784526004825260408085206001600160a01b0388168652909252922080546005909202909201925084111561077e576040805162461bcd60e51b81526020600482015260126024820152711dda5d1a191c985dce881b9bdd0819dbdbd960721b604482015290519081900360640190fd5b61078785610a0c565b60006107c482600101546107be670de0b6b3a76400006107b8876003015487600001546112fb90919063ffffffff16565b90611354565b9061123d565b90508015610816576107d684826113bb565b6040805182815290516001600160a01b038616917fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486919081900360200190a25b8415610840578154610828908661123d565b82558254610840906001600160a01b03168587611471565b6003830154825461085e91670de0b6b3a7640000916107b8916112fb565b600183015560408051868152905187916001600160a01b038716917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360200190a3505050505050565b600080600384815481106108bb57fe5b60009182526020808320878452600480835260408086206001600160a01b038a811688529085528187206005969096029093016003810154815483516370a0823160e01b81523095810195909552925191985095969491909316926370a08231926024808201939291829003018186803b15801561093857600080fd5b505afa15801561094c573d6000803e3d6000fd5b505050506040513d602081101561096257600080fd5b505160028501549091504211801561097957508015155b156109d657600061098e856002015442610623565b905060006109af6005546107b88860010154856112fb90919063ffffffff16565b90506109d16109ca846107b884670de0b6b3a76400006112fb565b859061129a565b935050505b610a0183600101546107be670de0b6b3a76400006107b88688600001546112fb90919063ffffffff16565b979650505050505050565b600060038281548110610a1b57fe5b9060005260206000209060050201905080600201544211610a3c5750610b67565b8054604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015610a8657600080fd5b505afa158015610a9a573d6000803e3d6000fd5b505050506040513d6020811015610ab057600080fd5b5051905080610ac6575042600290910155610b67565b600482015460ff16610af75760048201805460ff19166001908117909155820154600554610af39161129a565b6005555b60055415610b5e576000610b0f836002015442610623565b90506000610b306005546107b88660010154856112fb90919063ffffffff16565b9050610b56610b4b846107b884670de0b6b3a76400006112fb565b60038601549061129a565b600385015550505b50426002909101555b50565b600060038281548110610b7957fe5b600091825260208083208584526004825260408085203380875293528420805485825560018201959095556005909302018054909450919291610bc9916001600160a01b03919091169083611471565b604080518281529051859133917fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959181900360200190a350505050565b6000546001600160a01b03163314610c4f5760405162461bcd60e51b815260040180806020018281038252602e815260200180611891602e913960400191505060405180910390fd5b60075462278d0001421015610d36576001546001600160a01b0384811691161415610cab576040805162461bcd60e51b8152602060048201526007602482015266746f726e61646f60c81b604482015290519081900360640190fd5b60035460005b81811015610d3357600060038281548110610cc857fe5b6000918252602090912060059091020180549091506001600160a01b0387811691161415610d2a576040805162461bcd60e51b815260206004820152600a6024820152693837b7b6173a37b5b2b760b11b604482015290519081900360640190fd5b50600101610cb1565b50505b610d4a6001600160a01b0384168284611471565b505050565b6000546001600160a01b031681565b60065481565b60035460005b81811015610d8357610d7b81610a0c565b600101610d6a565b5050565b6001546001600160a01b031681565b60075481565b60046020908152600092835260408084209091529082529020805460019091015482565b600b5481565b6000546001600160a01b03163314610e0f5760405162461bcd60e51b815260040180806020018281038252602e815260200180611891602e913960400191505060405180910390fd5b610e18836114c3565b8115610e2657610e26610d64565b600654421015610e525780610e3e5750600654610e4d565b600654811015610e4d57506006545b610e66565b801580610e5e57504281105b15610e665750425b600060065482111580610e795750428211155b6040805160a0810182526001600160a01b03878116825260208201898152928201868152600060608401818152861580156080870190815260038054600181018255945295517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b600590940293840180546001600160a01b031916919096161790945594517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c82015590517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d82015592517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85e84015590517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85f909201805460ff191692151592909217909155909150610fbc57600554610fb8908661129a565b6005555b5050505050565b6000546001600160a01b0316331461100c5760405162461bcd60e51b815260040180806020018281038252602e815260200180611891602e913960400191505060405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031681565b600033905060006003848154811061105157fe5b600091825260208083208784526004825260408085206001600160a01b038816865290925292206005909102909101915061108b85610a0c565b8054156111175760006110c382600101546107be670de0b6b3a76400006107b8876003015487600001546112fb90919063ffffffff16565b90508015611115576110d584826113bb565b6040805182815290516001600160a01b038616917fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486919081900360200190a25b505b83156111cd578154611134906001600160a01b0316843087611547565b60006111516127106107b8600854886112fb90919063ffffffff16565b6009548454919250611170916001600160a01b03908116911683611471565b600061117c868361123d565b60025485549192506001600160a01b03918216911614156111bb576111b46111ac6127106107b8846126ac6112fb565b84549061129a565b83556111ca565b82546111c7908261129a565b83555b50505b600382015481546111eb91670de0b6b3a7640000916107b8916112fb565b600182015560408051858152905186916001600160a01b038616917f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159181900360200190a35050505050565b600a5481565b600082821115611294576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6000828201838110156112f4576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60008261130a575060006106e2565b8282028284828161131757fe5b04146112f45760405162461bcd60e51b81526004018080602001828103825260218152602001806118e16021913960400191505060405180910390fd5b60008082116113aa576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816113b357fe5b049392505050565b600154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561140657600080fd5b505afa15801561141a573d6000803e3d6000fd5b505050506040513d602081101561143057600080fd5b505190508015610d4a578082111561145e57600154611459906001600160a01b03168483611471565b610d4a565b600154610d4a906001600160a01b031684845b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610d4a9084906115a7565b60035460005b81811015610d4a57826001600160a01b0316600382815481106114e857fe5b60009182526020909120600590910201546001600160a01b0316141561153f5760405162461bcd60e51b81526004018080602001828103825260228152602001806118bf6022913960400191505060405180910390fd5b6001016114c9565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526115a19085906115a7565b50505050565b60606115fc826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166116589092919063ffffffff16565b805190915015610d4a5780806020019051602081101561161b57600080fd5b5051610d4a5760405162461bcd60e51b815260040180806020018281038252602a815260200180611902602a913960400191505060405180910390fd5b6060611667848460008561166f565b949350505050565b6060824710156116b05760405162461bcd60e51b815260040180806020018281038252602681526020018061186b6026913960400191505060405180910390fd5b6116b9856117c0565b61170a576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106117495780518252601f19909201916020918201910161172a565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146117ab576040519150601f19603f3d011682016040523d82523d6000602084013e6117b0565b606091505b5091509150610a018282866117c6565b3b151590565b606083156117d55750816112f4565b8251156117e55782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561182f578181015183820152602001611817565b50505050905090810190601f16801561185c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fdfe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c546f726e61646f47656e65736973506f6f6c3a2063616c6c6572206973206e6f7420746865206f70657261746f72546f726e61646f47656e65736973506f6f6c3a206578697374696e6720706f6f6c3f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220a8f41e64b83779e8af3087aedd51c4a3cbe29500dc70272e08609a7762ec22eb64736f6c634300060c0033000000000000000000000000d52b62982ca95dfe73b9e57ec81f153e0a9148d90000000000000000000000000000000000000000000000000000000062790240

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000d52b62982ca95dfe73b9e57ec81f153e0a9148d90000000000000000000000000000000000000000000000000000000062790240

-----Decoded View---------------
Arg [0] : _tornado (address): 0xd52b62982ca95dfe73b9e57ec81f153e0a9148d9
Arg [1] : _poolStartTime (uint256): 1652097600

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000d52b62982ca95dfe73b9e57ec81f153e0a9148d9
Arg [1] : 0000000000000000000000000000000000000000000000000000000062790240


Deployed ByteCode Sourcemap

22226:11413:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33457:179;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;33457:179:0;;;;;;;;:::i;:::-;;23803:51;;;:::i;:::-;;;;;;;;;;;;;;;;23116:26;;;;;;;;;;;;;;;;-1:-1:-1;23116:26:0;;:::i;:::-;;;;-1:-1:-1;;;;;23116:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23361:34;;;:::i;26467:353::-;;;;;;;;;;;;;;;;-1:-1:-1;26467:353:0;;;;;;;:::i;23591:25::-;;;:::i;:::-;;;;-1:-1:-1;;;;;23591:25:0;;;;;;;;;;;;;;26897:665;;;;;;;;;;;;;;;;-1:-1:-1;26897:665:0;;;;;;;:::i;23566:18::-;;;:::i;30944:819::-;;;;;;;;;;;;;;;;-1:-1:-1;30944:819:0;;;;;;;:::i;27628:795::-;;;;;;;;;;;;;;;;-1:-1:-1;27628:795:0;;;;;;-1:-1:-1;;;;;27628:795:0;;:::i;28762:920::-;;;;;;;;;;;;;;;;-1:-1:-1;28762:920:0;;:::i;31834:377::-;;;;;;;;;;;;;;;;-1:-1:-1;31834:377:0;;:::i;32836:613::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;32836:613:0;;;;;;;;;;;;;;;;;:::i;22354:23::-;;;:::i;23449:28::-;;;:::i;28506:180::-;;;:::i;23032:21::-;;;:::i;23529:26::-;;;:::i;23200:64::-;;;;;;;;;;;;;;;;-1:-1:-1;23200:64:0;;;;;;-1:-1:-1;;;;;23200:64:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;23750:35;;;:::i;25089:1279::-;;;;;;;;;;;;;;;;-1:-1:-1;25089:1279:0;;;-1:-1:-1;;;;;25089:1279:0;;;;;;;;;;;;;;;;;:::i;32727:101::-;;;;;;;;;;;;;;;;-1:-1:-1;32727:101:0;-1:-1:-1;;;;;32727:101:0;;:::i;23060:20::-;;;:::i;29717:1191::-;;;;;;;;;;;;;;;;-1:-1:-1;29717:1191:0;;;;;;;:::i;23644:49::-;;;:::i;33457:179::-;24646:8;;-1:-1:-1;;;;;24646:8:0;24658:10;24646:22;24638:81;;;;-1:-1:-1;;;24638:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33554:3:::1;33546:4;:11;;33538:34;;;::::0;;-1:-1:-1;;;33538:34:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33538:34:0;;;;;;;;;;;;;::::1;;33583:10;:21:::0;;-1:-1:-1;;;;;;33583:21:0::1;-1:-1:-1::0;;;;;33583:21:0;;;::::1;::::0;;;::::1;::::0;;;33615:6:::1;:13:::0;33457:179::o;23803:51::-;23843:11;23803:51;:::o;23116:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23116:26:0;;;;-1:-1:-1;23116:26:0;;;;;;;:::o;23361:34::-;;;;:::o;26467:353::-;24646:8;;-1:-1:-1;;;;;24646:8:0;24658:10;24646:22;24638:81;;;;-1:-1:-1;;;24638:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26546:17:::1;:15;:17::i;:::-;26574:21;26598:8;26607:4;26598:14;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;26627;::::0;::::1;::::0;26598;;-1:-1:-1;26627:14:0::1;;26623:150;;;26676:85;26735:11;26676:36;26696:4;:15;;;26676;;:19;;:36;;;;:::i;:::-;:40:::0;::::1;:85::i;:::-;26658:15;:103:::0;26623:150:::1;26783:15;;:29:::0;-1:-1:-1;26467:353:0:o;23591:25::-;;;-1:-1:-1;;;;;23591:25:0;;:::o;26897:665::-;26982:7;27019;27006:9;:20;27002:34;;-1:-1:-1;27035:1:0;27028:8;;27002:34;27062:11;;27051:7;:22;27047:508;;27107:11;;27094:9;:24;27090:38;;-1:-1:-1;27127:1:0;27120:8;;27090:38;27160:13;;27147:9;:26;27143:91;;27182:52;27217:16;;27182:30;27198:13;;27182:11;;:15;;:30;;;;:::i;:::-;:34;;:52::i;:::-;27175:59;;;;27143:91;27256:48;27287:16;;27256:26;27272:9;27256:11;;:15;;:26;;;;:::i;27047:508::-;27352:13;;27341:7;:24;27337:38;;-1:-1:-1;27374:1:0;27367:8;;27337:38;27407:13;;27394:9;:26;27390:87;;27429:48;27460:16;;27429:26;27441:13;;27429:7;:11;;:26;;;;:::i;27390:87::-;27526:16;;27499:44;;:22;:7;27511:9;27499:11;:22::i;27047:508::-;26897:665;;;;:::o;23566:18::-;;;;:::o;30944:819::-;31011:15;31029:10;31011:28;;31050:21;31074:8;31083:4;31074:14;;;;;;;;;;;;;;;;31123;;;:8;:14;;;;;;-1:-1:-1;;;;;31123:23:0;;;;;;;;;31165:11;;31074:14;;;;;;;;-1:-1:-1;31165:22:0;-1:-1:-1;31165:22:0;31157:53;;;;;-1:-1:-1;;;31157:53:0;;;;;;;;;;;;-1:-1:-1;;;31157:53:0;;;;;;;;;;;;;;;31221:16;31232:4;31221:10;:16::i;:::-;31248;31267:71;31322:4;:15;;;31267:50;31312:4;31267:40;31283:4;:23;;;31267:4;:11;;;:15;;:40;;;;:::i;:::-;:44;;:50::i;:::-;:54;;:71::i;:::-;31248:90;-1:-1:-1;31353:12:0;;31349:132;;31382:38;31402:7;31411:8;31382:19;:38::i;:::-;31440:29;;;;;;;;-1:-1:-1;;;;;31440:29:0;;;;;;;;;;;;;31349:132;31495:11;;31491:138;;31537:11;;:24;;31553:7;31537:15;:24::i;:::-;31523:38;;31576:10;;:41;;-1:-1:-1;;;;;31576:10:0;31600:7;31609;31576:23;:41::i;:::-;31673:23;;;;31657:11;;:50;;31702:4;;31657:40;;:15;:40::i;:50::-;31639:15;;;:68;31723:32;;;;;;;;31741:4;;-1:-1:-1;;;;;31723:32:0;;;;;;;;;;;;30944:819;;;;;;:::o;27628:795::-;27704:7;27724:21;27748:8;27757:4;27748:14;;;;;;;;;;;;;;;;27797;;;:8;:14;;;;;;;-1:-1:-1;;;;;27797:21:0;;;;;;;;;;;27748:14;;;;;;;;27858:23;;;;27914:10;;:35;;-1:-1:-1;;;27914:35:0;;27943:4;27914:35;;;;;;;;;27748:14;;-1:-1:-1;27797:21:0;;27748:14;27914:10;;;;;:20;;:35;;;;;27748:14;27914:35;;;;;;:10;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27914:35:0;27982:19;;;;27914:35;;-1:-1:-1;27964:15:0;:37;:57;;;;-1:-1:-1;28005:16:0;;;27964:57;27960:372;;;28038:24;28065:56;28084:4;:19;;;28105:15;28065:18;:56::i;:::-;28038:83;;28136:22;28161:58;28203:15;;28161:37;28182:4;:15;;;28161:16;:20;;:37;;;;:::i;:58::-;28136:83;-1:-1:-1;28255:65:0;28278:41;28307:11;28278:24;28136:83;28297:4;28278:18;:24::i;:41::-;28255:18;;:22;:65::i;:::-;28234:86;;27960:372;;;28349:66;28399:4;:15;;;28349:45;28389:4;28349:35;28365:18;28349:4;:11;;;:15;;:35;;;;:::i;:66::-;28342:73;27628:795;-1:-1:-1;;;;;;;27628:795:0:o;28762:920::-;28814:21;28838:8;28847:4;28838:14;;;;;;;;;;;;;;;;;;28814:38;;28886:4;:19;;;28867:15;:38;28863:77;;28922:7;;;28863:77;28972:10;;:35;;;-1:-1:-1;;;28972:35:0;;29001:4;28972:35;;;;;;28950:19;;-1:-1:-1;;;;;28972:10:0;;:20;;:35;;;;;;;;;;;;;;:10;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28972:35:0;;-1:-1:-1;29022:16:0;29018:107;;-1:-1:-1;29077:15:0;29055:19;;;;:37;29107:7;;29018:107;29140:14;;;;;;29135:138;;29171:14;;;:21;;-1:-1:-1;;29171:21:0;29188:4;29171:21;;;;;;29245:15;;;29225;;:36;;:19;:36::i;:::-;29207:15;:54;29135:138;29287:15;;:19;29283:344;;29323:24;29350:56;29369:4;:19;;;29390:15;29350:18;:56::i;:::-;29323:83;;29421:22;29446:58;29488:15;;29446:37;29467:4;:15;;;29446:16;:20;;:37;;;;:::i;:58::-;29421:83;-1:-1:-1;29545:70:0;29573:41;29602:11;29573:24;29421:83;29592:4;29573:18;:24::i;:41::-;29545:23;;;;;:27;:70::i;:::-;29519:23;;;:96;-1:-1:-1;;29283:344:0;-1:-1:-1;29659:15:0;29637:19;;;;:37;28762:920;;:::o;31834:377::-;31893:21;31917:8;31926:4;31917:14;;;;;;;;;;;;;;;;31966;;;:8;:14;;;;;;31981:10;31966:26;;;;;;;32021:11;;32043:15;;;-1:-1:-1;32069:15:0;;:19;;;;31917:14;;;;;32099:10;;31917:14;;-1:-1:-1;31966:26:0;;32021:11;32099:44;;-1:-1:-1;;;;;32099:10:0;;;;;32021:11;32099:23;:44::i;:::-;32159;;;;;;;;32189:4;;32177:10;;32159:44;;;;;;;;;31834:377;;;;:::o;32836:613::-;24646:8;;-1:-1:-1;;;;;24646:8:0;24658:10;24646:22;24638:81;;;;-1:-1:-1;;;24638:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32972:11:::1;;32986:7;32972:21;32954:15;:39;32950:450;;;33131:7;::::0;-1:-1:-1;;;;;33121:17:0;;::::1;33131:7:::0;::::1;33121:17;;33113:37;;;::::0;;-1:-1:-1;;;33113:37:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33113:37:0;;;;;;;;;;;;;::::1;;33182:8;:15:::0;33165:14:::1;33212:177;33240:6;33234:3;:12;33212:177;;;33274:21;33298:8;33307:3;33298:13;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;33348:10:::0;;33298:13;;-1:-1:-1;;;;;;33338:20:0;;::::1;33348:10:::0;::::1;33338:20;;33330:43;;;::::0;;-1:-1:-1;;;33330:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33330:43:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;33248:5:0::1;;33212:177;;;;32950:450;;33410:31;-1:-1:-1::0;;;;;33410:19:0;::::1;33430:2:::0;33434:6;33410:19:::1;:31::i;:::-;32836:613:::0;;;:::o;22354:23::-;;;-1:-1:-1;;;;;22354:23:0;;:::o;23449:28::-;;;;:::o;28506:180::-;28568:8;:15;28551:14;28594:85;28622:6;28616:3;:12;28594:85;;;28652:15;28663:3;28652:10;:15::i;:::-;28630:5;;28594:85;;;;28506:180;:::o;23032:21::-;;;-1:-1:-1;;;;;23032:21:0;;:::o;23529:26::-;;;;:::o;23200:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23750:35::-;;;;:::o;25089:1279::-;24646:8;;-1:-1:-1;;;;;24646:8:0;24658:10;24646:22;24638:81;;;;-1:-1:-1;;;24638:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25255:26:::1;25274:6;25255:18;:26::i;:::-;25296:11;25292:61;;;25324:17;:15;:17::i;:::-;25385:13;;25367:15;:31;25363:534;;;25452:20:::0;25448:243:::1;;-1:-1:-1::0;25511:13:0::1;::::0;25448:243:::1;;;25587:13;;25569:15;:31;25565:111;;;-1:-1:-1::0;25643:13:0::1;::::0;25565:111:::1;25363:534;;;25759:20:::0;;;:57:::1;;;25801:15;25783;:33;25759:57;25755:131;;;-1:-1:-1::0;25855:15:0::1;25755:131;25907:15;25954:13;;25935:15;:32;;25934:83;;;;26001:15;25982;:34;;25934:83;26042:214;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;26042:214:0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;26042:214:0;;;;;;;::::1;::::0;::::1;::::0;;;;;;26028:8:::1;:229:::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;26028:229:0::1;::::0;;;::::1;;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26028:229:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;26042:214;;-1:-1:-1;26268:93:0::1;;26317:15;::::0;:32:::1;::::0;26337:11;26317:19:::1;:32::i;:::-;26299:15;:50:::0;26268:93:::1;24730:1;25089:1279:::0;;;;:::o;32727:101::-;24646:8;;-1:-1:-1;;;;;24646:8:0;24658:10;24646:22;24638:81;;;;-1:-1:-1;;;24638:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32800:8:::1;:20:::0;;-1:-1:-1;;;;;;32800:20:0::1;-1:-1:-1::0;;;;;32800:20:0;;;::::1;::::0;;;::::1;::::0;;32727:101::o;23060:20::-;;;-1:-1:-1;;;;;23060:20:0;;:::o;29717:1191::-;29783:15;29801:10;29783:28;;29822:21;29846:8;29855:4;29846:14;;;;;;;;;;;;;;;;29895;;;:8;:14;;;;;;-1:-1:-1;;;;;29895:23:0;;;;;;;;;29846:14;;;;;;;;-1:-1:-1;29929:16:0;29904:4;29929:10;:16::i;:::-;29960:11;;:15;29956:296;;29992:16;30011:71;30066:4;:15;;;30011:50;30056:4;30011:40;30027:4;:23;;;30011:4;:11;;;:15;;:40;;;;:::i;:71::-;29992:90;-1:-1:-1;30101:12:0;;30097:144;;30134:38;30154:7;30163:8;30134:19;:38::i;:::-;30196:29;;;;;;;;-1:-1:-1;;;;;30196:29:0;;;;;;;;;;;;;30097:144;29956:296;;30266:11;;30262:513;;30294:10;;:60;;-1:-1:-1;;;;;30294:10:0;30322:7;30339:4;30346:7;30294:27;:60::i;:::-;30371:9;30383:34;30410:5;30383:21;30396:6;;30383:7;:11;;:21;;;;:::i;:34::-;30456:10;;30432;;30371:46;;-1:-1:-1;30432:41:0;;-1:-1:-1;;;;;30432:10:0;;;;30456;30371:46;30432:23;:41::i;:::-;30488:21;30512:17;:7;30524:4;30512:11;:17::i;:::-;30572:5;;30557:10;;30488:41;;-1:-1:-1;;;;;;30557:10:0;;;30572:5;;30549:28;30546:218;;;30612:51;30628:34;30656:5;30628:23;:13;30646:4;30628:17;:23::i;:34::-;30612:11;;;:15;:51::i;:::-;30598:65;;30546:218;;;30718:11;;:30;;30734:13;30718:15;:30::i;:::-;30704:44;;30546:218;30262:513;;;30819:23;;;;30803:11;;:50;;30848:4;;30803:40;;:15;:40::i;:50::-;30785:15;;;:68;30869:31;;;;;;;;30886:4;;-1:-1:-1;;;;;30869:31:0;;;;;;;;;;;;29717:1191;;;;;:::o;23644:49::-;;;;:::o;6050:158::-;6108:7;6141:1;6136;:6;;6128:49;;;;;-1:-1:-1;;;6128:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6195:5:0;;;6050:158::o;5588:179::-;5646:7;5678:5;;;5702:6;;;;5694:46;;;;;-1:-1:-1;;;5694:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;5758:1;5588:179;-1:-1:-1;;;5588:179:0:o;6467:220::-;6525:7;6549:6;6545:20;;-1:-1:-1;6564:1:0;6557:8;;6545:20;6588:5;;;6592:1;6588;:5;:1;6612:5;;;;;:10;6604:56;;;;-1:-1:-1;;;6604:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7165:153;7223:7;7255:1;7251;:5;7243:44;;;;;-1:-1:-1;;;7243:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;7309:1;7305;:5;;;;;;;7165:153;-1:-1:-1;;;7165:153:0:o;32330:389::-;32435:7;;:32;;;-1:-1:-1;;;32435:32:0;;32461:4;32435:32;;;;;;32409:23;;-1:-1:-1;;;;;32435:7:0;;:17;;:32;;;;;;;;;;;;;;:7;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32435:32:0;;-1:-1:-1;32482:19:0;;32478:234;;32532:15;32522:7;:25;32518:183;;;32568:7;;:42;;-1:-1:-1;;;;;32568:7:0;32589:3;32594:15;32568:20;:42::i;:::-;32518:183;;;32651:7;;:34;;-1:-1:-1;;;;;32651:7:0;32672:3;32677:7;18968:177;19078:58;;;-1:-1:-1;;;;;19078:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19078:58:0;-1:-1:-1;;;19078:58:0;;;19051:86;;19071:5;;19051:19;:86::i;24747:264::-;24832:8;:15;24815:14;24858:146;24886:6;24880:3;:12;24858:146;;;24947:6;-1:-1:-1;;;;;24924:29:0;:8;24933:3;24924:13;;;;;;;;;;;;;;;;;;;;;:19;-1:-1:-1;;;;;24924:19:0;:29;;24916:76;;;;-1:-1:-1;;;24916:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24894:5;;24858:146;;19153:205;19281:68;;;-1:-1:-1;;;;;19281:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19281:68:0;-1:-1:-1;;;19281:68:0;;;19254:96;;19274:5;;19254:19;:96::i;:::-;19153:205;;;;:::o;21273:761::-;21697:23;21723:69;21751:4;21723:69;;;;;;;;;;;;;;;;;21731:5;-1:-1:-1;;;;;21723:27:0;;;:69;;;;;:::i;:::-;21807:17;;21697:95;;-1:-1:-1;21807:21:0;21803:224;;21949:10;21938:30;;;;;;;;;;;;;;;-1:-1:-1;21938:30:0;21930:85;;;;-1:-1:-1;;;21930:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13955:195;14058:12;14090:52;14112:6;14120:4;14126:1;14129:12;14090:21;:52::i;:::-;14083:59;13955:195;-1:-1:-1;;;;13955:195:0:o;15007:530::-;15134:12;15192:5;15167:21;:30;;15159:81;;;;-1:-1:-1;;;15159:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15259:18;15270:6;15259:10;:18::i;:::-;15251:60;;;;;-1:-1:-1;;;15251:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15385:12;15399:23;15426:6;-1:-1:-1;;;;;15426:11:0;15446:5;15454:4;15426:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15426:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15384:75;;;;15477:52;15495:7;15504:10;15516:12;15477:17;:52::i;11037:422::-;11404:20;11443:8;;;11037:422::o;17547:742::-;17662:12;17691:7;17687:595;;;-1:-1:-1;17722:10:0;17715:17;;17687:595;17836:17;;:21;17832:439;;18099:10;18093:17;18160:15;18147:10;18143:2;18139:19;18132:44;18047:148;18242:12;18235:20;;-1:-1:-1;;;18235:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://a8f41e64b83779e8af3087aedd51c4a3cbe29500dc70272e08609a7762ec22eb
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Validator ID :
0 FTM

Amount Staked
0

Amount Delegated
0

Staking Total
0

Staking Start Epoch
0

Staking Start Time
0

Proof of Importance
0

Origination Score
0

Validation Score
0

Active
0

Online
0

Downtime
0 s
Address Amount claimed Rewards Created On Epoch Created On
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.