Contract 0xc88690163b10521d5fB86c2ECB293261F7771525 1

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x5808a3a5782315d268fd03de9a952c8b29f0e5d939191fda747a62f91aa73122Withdraw415440092022-06-28 14:35:589 hrs 29 mins ago0x281e17b603c401cb98745c1e103e1724fbbfe140 IN  0xc88690163b10521d5fb86c2ecb293261f77715250 FTM0.002939735997
0x4d3ec2cc4097c22e47ac66feb1fcc0ea7fdee245677bf0e8fa1bd2046f425618Deposit415403542022-06-28 13:27:2610 hrs 38 mins ago0x4ca33e68d0ef079f8efd2982f225646d82103577 IN  0xc88690163b10521d5fb86c2ecb293261f77715250 FTM0.000274324256
0x5fba05037eed18c85511f730b03b8ea4db382577ed0e57d5259a7d0815d475a4Withdraw415402022022-06-28 13:24:5710 hrs 40 mins ago0x4ca33e68d0ef079f8efd2982f225646d82103577 IN  0xc88690163b10521d5fb86c2ecb293261f77715250 FTM0.003731469245
0x29ce586373c19fd621bc507c247f8b905cc36e3412134e056b13a7c694a3d8f3Withdraw415401972022-06-28 13:24:4210 hrs 41 mins ago0x4ca33e68d0ef079f8efd2982f225646d82103577 IN  0xc88690163b10521d5fb86c2ecb293261f77715250 FTM0.003730956128
0x222553519ca8fea2abf0a1e13469631823f110283fae975a1b2459ac07292310Withdraw415391322022-06-28 13:03:1211 hrs 2 mins ago0x8c5b66f05a8609f584c6505df246738d56aa77f0 IN  0xc88690163b10521d5fb86c2ecb293261f77715250 FTM0.000895432061
0x566eeea2719061fa21cf2b4960a90eaa8f896c58b436633b8ed9fc7d257d5e4cWithdraw415374802022-06-28 12:33:5311 hrs 31 mins ago0x8eedc69dce9f12e791261c0bf0fc79e6e37cc758 IN  0xc88690163b10521d5fb86c2ecb293261f77715250 FTM0.00068082857
0xd94e9e846c6cd9d8911c644d375f1588941e4ca555594cf37cf4596b87d34393Deposit415368852022-06-28 12:21:4111 hrs 44 mins ago0xbdd71ca2bdccee92f13faae22ecfe9fecdcbf89f IN  0xc88690163b10521d5fb86c2ecb293261f77715250 FTM0.000341829122
0xbdc9117b10bc44236d2783dcedae59e788b492269caa8dd7408b8f5b5a4bbcd9Deposit415366442022-06-28 12:16:0911 hrs 49 mins ago0xfb6510c1d3cd18306224dfdb15fbae18a0c4e491 IN  0xc88690163b10521d5fb86c2ecb293261f77715250 FTM0.000227482761
0x7d92860a0c336366d7e5a3c7ab504b2f82ec156c44e57d6c54662fca51ba945bWithdraw415365462022-06-28 12:14:2811 hrs 51 mins ago0xfb6510c1d3cd18306224dfdb15fbae18a0c4e491 IN  0xc88690163b10521d5fb86c2ecb293261f77715250 FTM0.005654340287
0x6661bd85d4c59ec26f6a89cde234ee4217fd6d65abd36c53155d5fd99cdff65dWithdraw415136432022-06-28 5:04:3019 hrs 1 min ago0x725ba8d6b5299b6d3b4e923348cb66c14fe6b388 IN  0xc88690163b10521d5fb86c2ecb293261f77715250 FTM0.00036918655
0x8fe823f17d15cd4ce4022e2dfdea62729736cafe63a7bf7046652c609f5b7e75Deposit415005842022-06-28 1:05:5022 hrs 59 mins ago0xc43e5c94f0fcf442db226ab78f4985607d366052 IN  0xc88690163b10521d5fb86c2ecb293261f77715250 FTM0.000421048
0xce330b16b530c4d22f8f2dfdb1e19d8dc2237f89e9bc184edaaf09088e6a0a11Withdraw415004732022-06-28 1:02:5023 hrs 2 mins ago0xc43e5c94f0fcf442db226ab78f4985607d366052 IN  0xc88690163b10521d5fb86c2ecb293261f77715250 FTM0.0043627
0x90305e892b15ed3a351f4ba7071836e4ce0aea12368606a295181db6a224a208Withdraw415004542022-06-28 1:02:3223 hrs 3 mins ago0xc43e5c94f0fcf442db226ab78f4985607d366052 IN  0xc88690163b10521d5fb86c2ecb293261f77715250 FTM0.000313098
0xc354d981072e5ae08f757cbe9221e3857dbb4671ead3054aed43523cc71bad54Withdraw414924492022-06-27 22:37:091 day 1 hr ago0x3f62368637b19b2c6166e6dd33d9eb10eac51b6f IN  0xc88690163b10521d5fb86c2ecb293261f77715250 FTM0.001205399743
0xff34723199188a76d22b01c7eb99b941302555b15b990a67b7540bd301199dc3Withdraw414923502022-06-27 22:35:221 day 1 hr ago0x3f62368637b19b2c6166e6dd33d9eb10eac51b6f IN  0xc88690163b10521d5fb86c2ecb293261f77715250 FTM0.003451510109
0x3b4313cecba5a1700edca4ebfaf9a73aa3c67fa4ff5098ab680ebb4d6aec48cbWithdraw414695392022-06-27 15:32:471 day 8 hrs ago0x281e17b603c401cb98745c1e103e1724fbbfe140 IN  0xc88690163b10521d5fb86c2ecb293261f77715250 FTM0.000280300945
0xe9b5e2f35629a0d668891c0be01d65b7018f5f8b6bfd2b8aacf4f1c18d160e9aWithdraw414654182022-06-27 14:18:051 day 9 hrs ago0x8eedc69dce9f12e791261c0bf0fc79e6e37cc758 IN  0xc88690163b10521d5fb86c2ecb293261f77715250 FTM0.001133239309
0x752128331288e3e15d6c4eaa8f96dcf5239834a96e3dd7e203ddc1da015f3bf6Withdraw414638102022-06-27 13:45:091 day 10 hrs ago0x046ae0974283a9acf5cb4228a93d000c6d0ffd76 IN  0xc88690163b10521d5fb86c2ecb293261f77715250 FTM0.029960414129
0x157c79bb664c53d8a76ea1d2cf5917ea5e67edc6437032a66c36da6c331aaa80Deposit414575542022-06-27 11:46:031 day 12 hrs ago0xfb6510c1d3cd18306224dfdb15fbae18a0c4e491 IN  0xc88690163b10521d5fb86c2ecb293261f77715250 FTM0.000340533769
0xf5fb4f4461918c542cb075127fa37db1039e6d6b68d0a250ffc9595d1a79b74eWithdraw414574652022-06-27 11:44:321 day 12 hrs ago0xfb6510c1d3cd18306224dfdb15fbae18a0c4e491 IN  0xc88690163b10521d5fb86c2ecb293261f77715250 FTM0.000288815306
0x1f5a762ede28d1663cb1b51b037eba098010a0baa72d25ff7ee682ca3fea7f6cWithdraw414517002022-06-27 9:50:501 day 14 hrs ago0xfd3e11001fa63cb0ec2a13df9620690ac8a003a3 IN  0xc88690163b10521d5fb86c2ecb293261f77715250 FTM0.000232478452
0x01fd1cd90e2e5c0c760a04606e9ac3ff150f9230e8467cb0b26c22fdbb2a777bDeposit414489732022-06-27 9:01:071 day 15 hrs ago0x4b093fffa923f46e2b100ea9fcc228136ccdbf98 IN  0xc88690163b10521d5fb86c2ecb293261f77715250 FTM0.000302054605
0x0fc669550883c5f6b8689881fb5000339c220d84b1b00270cd7895613e49819dWithdraw414488512022-06-27 8:58:371 day 15 hrs ago0x4b093fffa923f46e2b100ea9fcc228136ccdbf98 IN  0xc88690163b10521d5fb86c2ecb293261f77715250 FTM0.006694069729
0x16f8e9bd87427501f959a68d770142a88578d4d813db2c4dfaa0e0f93fd5e173Withdraw414412182022-06-27 6:41:331 day 17 hrs ago0x8eedc69dce9f12e791261c0bf0fc79e6e37cc758 IN  0xc88690163b10521d5fb86c2ecb293261f77715250 FTM0.000523832116
0xb9bc567cc9c0eb2cf9b27f7c80a00a188986b9388d5cdd66b12172aeba04463dWithdraw414394682022-06-27 6:12:091 day 17 hrs ago0xbdd71ca2bdccee92f13faae22ecfe9fecdcbf89f IN  0xc88690163b10521d5fb86c2ecb293261f77715250 FTM0.000276702257
[ Download CSV Export 
Latest 1 internal transaction
Parent Txn Hash Block From To Value
0x4ef4c7b3f742f568faa227cf9529eb51ab0995ed6f8bdbcf16fc7eee69b1559f261816522021-12-27 10:02:57183 days 14 hrs ago Scarab Finance: Deployer  Contract Creation0 FTM
[ Download CSV Export 
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0xc03B61E7E0F61E8D7b8A97778c12781b5Ec8bCa0

Contract Name:
GScarabRewardPool

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at FtmScan.com on 2021-12-23
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

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);
}

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;
    }
}

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);
            }
        }
    }
}

/**
 * @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 tSHARE (rewards).
// Instead, the governance will call tSHARE distributeReward method and send reward to this pool at the beginning.
contract GScarabRewardPool {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    // governance
    address public operator;

    // Info of each user.
    struct UserInfo {
        uint256 amount; // How many LP 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. tSHAREs to distribute per block.
        uint256 lastRewardTime; // Last time that tSHAREs distribution occurs.
        uint256 accTSharePerShare; // Accumulated tSHAREs per share, times 1e18. See below.
        bool isStarted; // if lastRewardTime has passed
    }

    IERC20 public tshare;

    // 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 tSHARE mining starts.
    uint256 public poolStartTime;

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

    uint256 public tSharePerSecond = 0.00186122 ether; // 59500 tshare / (370 days * 24h * 60min * 60s)
    uint256 public runningTime = 370 days; // 370 days
    uint256 public constant TOTAL_REWARDS = 59500 ether;

    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 _tshare,
        uint256 _poolStartTime
    ) public {
        require(block.timestamp < _poolStartTime, "late");
        if (_tshare != address(0)) tshare = IERC20(_tshare);
        poolStartTime = _poolStartTime;
        poolEndTime = poolStartTime + runningTime;
        operator = msg.sender;
    }

    modifier onlyOperator() {
        require(operator == msg.sender, "TShareRewardPool: 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, "TShareRewardPool: existing pool?");
        }
    }

    // Add a new lp 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,
            accTSharePerShare : 0,
            isStarted : _isStarted
            }));
        if (_isStarted) {
            totalAllocPoint = totalAllocPoint.add(_allocPoint);
        }
    }

    // Update the given pool's tSHARE 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(tSharePerSecond);
            return poolEndTime.sub(_fromTime).mul(tSharePerSecond);
        } else {
            if (_toTime <= poolStartTime) return 0;
            if (_fromTime <= poolStartTime) return _toTime.sub(poolStartTime).mul(tSharePerSecond);
            return _toTime.sub(_fromTime).mul(tSharePerSecond);
        }
    }

    // View function to see pending tSHAREs on frontend.
    function pendingShare(uint256 _pid, address _user) external view returns (uint256) {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_user];
        uint256 accTSharePerShare = pool.accTSharePerShare;
        uint256 tokenSupply = pool.token.balanceOf(address(this));
        if (block.timestamp > pool.lastRewardTime && tokenSupply != 0) {
            uint256 _generatedReward = getGeneratedReward(pool.lastRewardTime, block.timestamp);
            uint256 _tshareReward = _generatedReward.mul(pool.allocPoint).div(totalAllocPoint);
            accTSharePerShare = accTSharePerShare.add(_tshareReward.mul(1e18).div(tokenSupply));
        }
        return user.amount.mul(accTSharePerShare).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 _tshareReward = _generatedReward.mul(pool.allocPoint).div(totalAllocPoint);
            pool.accTSharePerShare = pool.accTSharePerShare.add(_tshareReward.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.accTSharePerShare).div(1e18).sub(user.rewardDebt);
            if (_pending > 0) {
                safeTShareTransfer(_sender, _pending);
                emit RewardPaid(_sender, _pending);
            }
        }
        if (_amount > 0) {
            pool.token.safeTransferFrom(_sender, address(this), _amount);
            user.amount = user.amount.add(_amount);
        }
        user.rewardDebt = user.amount.mul(pool.accTSharePerShare).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.accTSharePerShare).div(1e18).sub(user.rewardDebt);
        if (_pending > 0) {
            safeTShareTransfer(_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.accTSharePerShare).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 tshare transfer function, just in case if rounding error causes pool to not have enough tSHAREs.
    function safeTShareTransfer(address _to, uint256 _amount) internal {
        uint256 _tshareBal = tshare.balanceOf(address(this));
        if (_tshareBal > 0) {
            if (_amount > _tshareBal) {
                tshare.safeTransfer(_to, _tshareBal);
            } else {
                tshare.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 + 90 days) {
            // do not allow to drain core token (tSHARE or lps) if less than 90 days after pool ends
            require(_token != tshare, "tshare");
            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);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_tshare","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":[{"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":"pendingShare","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":"accTSharePerShare","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":"_operator","type":"address"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tSharePerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tshare","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"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"}]

6080604052600060045566069cc50cf2e8006007556301e7cb0060085534801561002857600080fd5b506040516118573803806118578339818101604052604081101561004b57600080fd5b508051602090910151428111610091576040805162461bcd60e51b815260206004808301919091526024820152636c61746560e01b604482015290519081900360640190fd5b6001600160a01b038216156100bc57600180546001600160a01b0319166001600160a01b0384161790555b60058190556008540160065550600080546001600160a01b0319163317905561176d806100ea6000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80635f96dc11116100b857806396805e541161007c57806396805e54146103165780639e63d26114610350578063b3ab15fb14610358578063cf4b55cb1461037e578063e2bbb158146103aa578063ee6822a7146103cd57610137565b80635f96dc11146102b1578063630b5ba1146102b95780636e271dd5146102c157806393f1a40b146102c9578063943f013d1461030e57610137565b8063441a3e70116100ff578063441a3e70146101fa57806351eb05a61461021d5780635312ea8e1461023a57806354575af414610257578063570ca7351461028d57610137565b806309cf60911461013c5780631526fe271461015657806317caf6f1146101aa5780631ab06ee5146101b2578063231f0c6a146101d7575b600080fd5b6101446103d5565b60408051918252519081900360200190f35b6101736004803603602081101561016c57600080fd5b50356103e3565b604080516001600160a01b039096168652602086019490945284840192909252606084015215156080830152519081900360a00190f35b61014461042e565b6101d5600480360360408110156101c857600080fd5b5080359060200135610434565b005b610144600480360360408110156101ed57600080fd5b50803590602001356104e2565b6101d56004803603604081101561021057600080fd5b50803590602001356105a7565b6101d56004803603602081101561023357600080fd5b5035610764565b6101d56004803603602081101561025057600080fd5b50356108c2565b6101d56004803603606081101561026d57600080fd5b506001600160a01b0381358116916020810135916040909101351661095e565b610295610aa6565b604080516001600160a01b039092168252519081900360200190f35b610144610ab5565b6101d5610abb565b610144610ade565b6102f5600480360360408110156102df57600080fd5b50803590602001356001600160a01b0316610ae4565b6040805192835260208301919091528051918290030190f35b610144610b08565b6101d56004803603608081101561032c57600080fd5b508035906001600160a01b0360208201351690604081013515159060600135610b0e565b610144610d0b565b6101d56004803603602081101561036e57600080fd5b50356001600160a01b0316610d11565b6101446004803603604081101561039457600080fd5b50803590602001356001600160a01b0316610d7c565b6101d5600480360360408110156103c057600080fd5b5080359060200135610ed8565b610295611048565b690c99805fe37d3e30000081565b600281815481106103f057fe5b6000918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b0390931694509092909160ff1685565b60045481565b6000546001600160a01b0316331461047d5760405162461bcd60e51b815260040180806020018281038252602c81526020018061169b602c913960400191505060405180910390fd5b610485610abb565b60006002838154811061049457fe5b60009182526020909120600590910201600481015490915060ff16156104db576104d7826104d1836001015460045461105790919063ffffffff16565b906110b4565b6004555b6001015550565b60008183106104f3575060006105a1565b600654821061055b57600654831061050d575060006105a1565b60055483116105405761053960075461053360055460065461105790919063ffffffff16565b90611115565b90506105a1565b6105396007546105338560065461105790919063ffffffff16565b600554821161056c575060006105a1565b6005548311610590576105396007546105336005548561105790919063ffffffff16565b600754610539906105338486611057565b92915050565b60003390506000600284815481106105bb57fe5b600091825260208083208784526003825260408085206001600160a01b03881686529092529220805460059092029092019250841115610637576040805162461bcd60e51b81526020600482015260126024820152711dda5d1a191c985dce881b9bdd0819dbdbd960721b604482015290519081900360640190fd5b61064085610764565b600061067d8260010154610677670de0b6b3a76400006106718760030154876000015461111590919063ffffffff16565b9061116e565b90611057565b905080156106cf5761068f84826111d5565b6040805182815290516001600160a01b038616917fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486919081900360200190a25b84156106f95781546106e19086611057565b825582546106f9906001600160a01b0316858761128b565b6003830154825461071791670de0b6b3a76400009161067191611115565b600183015560408051868152905187916001600160a01b038716917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360200190a3505050505050565b60006002828154811061077357fe5b906000526020600020906005020190508060020154421161079457506108bf565b8054604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156107de57600080fd5b505afa1580156107f2573d6000803e3d6000fd5b505050506040513d602081101561080857600080fd5b505190508061081e5750426002909101556108bf565b600482015460ff1661084f576004808301805460ff19166001908117909155830154905461084b916110b4565b6004555b600454156108b65760006108678360020154426104e2565b9050600061088860045461067186600101548561111590919063ffffffff16565b90506108ae6108a38461067184670de0b6b3a7640000611115565b6003860154906110b4565b600385015550505b50426002909101555b50565b6000600282815481106108d157fe5b600091825260208083208584526003825260408085203380875293528420805485825560018201959095556005909302018054909450919291610921916001600160a01b0391909116908361128b565b604080518281529051859133917fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959181900360200190a350505050565b6000546001600160a01b031633146109a75760405162461bcd60e51b815260040180806020018281038252602c81526020018061169b602c913960400191505060405180910390fd5b6006546276a70001421015610a8d576001546001600160a01b0384811691161415610a02576040805162461bcd60e51b815260206004820152600660248201526574736861726560d01b604482015290519081900360640190fd5b60025460005b81811015610a8a57600060028281548110610a1f57fe5b6000918252602090912060059091020180549091506001600160a01b0387811691161415610a81576040805162461bcd60e51b815260206004820152600a6024820152693837b7b6173a37b5b2b760b11b604482015290519081900360640190fd5b50600101610a08565b50505b610aa16001600160a01b038416828461128b565b505050565b6000546001600160a01b031681565b60055481565b60025460005b81811015610ada57610ad281610764565b600101610ac1565b5050565b60065481565b60036020908152600092835260408084209091529082529020805460019091015482565b60085481565b6000546001600160a01b03163314610b575760405162461bcd60e51b815260040180806020018281038252602c81526020018061169b602c913960400191505060405180910390fd5b610b60836112dd565b8115610b6e57610b6e610abb565b600554421015610b9a5780610b865750600554610b95565b600554811015610b9557506005545b610bae565b801580610ba657504281105b15610bae5750425b600060055482111580610bc15750428211155b6040805160a0810182526001600160a01b03878116825260208201898152928201868152600060608401818152861580156080870190815260028054600181018255945295517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace600590940293840180546001600160a01b031916919096161790945594517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf82015590517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad082015592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad184015590517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad2909201805460ff191692151592909217909155909150610d0457600454610d0090866110b4565b6004555b5050505050565b60075481565b6000546001600160a01b03163314610d5a5760405162461bcd60e51b815260040180806020018281038252602c81526020018061169b602c913960400191505060405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b60008060028481548110610d8c57fe5b60009182526020808320878452600380835260408086206001600160a01b03808b168852908552818720600590960290930191820154825482516370a0823160e01b815230600482015292519398509596909590949316926370a0823192602480840193829003018186803b158015610e0457600080fd5b505afa158015610e18573d6000803e3d6000fd5b505050506040513d6020811015610e2e57600080fd5b5051600285015490915042118015610e4557508015155b15610ea2576000610e5a8560020154426104e2565b90506000610e7b60045461067188600101548561111590919063ffffffff16565b9050610e9d610e968461067184670de0b6b3a7640000611115565b85906110b4565b935050505b610ecd8360010154610677670de0b6b3a764000061067186886000015461111590919063ffffffff16565b979650505050505050565b6000339050600060028481548110610eec57fe5b600091825260208083208784526003825260408085206001600160a01b0388168652909252922060059091029091019150610f2685610764565b805415610fb2576000610f5e8260010154610677670de0b6b3a76400006106718760030154876000015461111590919063ffffffff16565b90508015610fb057610f7084826111d5565b6040805182815290516001600160a01b038616917fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486919081900360200190a25b505b8315610fde578154610fcf906001600160a01b0316843087611377565b8054610fdb90856110b4565b81555b60038201548154610ffc91670de0b6b3a76400009161067191611115565b600182015560408051858152905186916001600160a01b038616917f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159181900360200190a35050505050565b6001546001600160a01b031681565b6000828211156110ae576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008282018381101561110e576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b600082611124575060006105a1565b8282028284828161113157fe5b041461110e5760405162461bcd60e51b81526004018080602001828103825260218152602001806116ed6021913960400191505060405180910390fd5b60008082116111c4576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816111cd57fe5b049392505050565b600154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561122057600080fd5b505afa158015611234573d6000803e3d6000fd5b505050506040513d602081101561124a57600080fd5b505190508015610aa1578082111561127857600154611273906001600160a01b0316848361128b565b610aa1565b600154610aa1906001600160a01b031684845b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610aa19084906113d7565b60025460005b81811015610aa157826001600160a01b03166002828154811061130257fe5b60009182526020909120600590910201546001600160a01b0316141561136f576040805162461bcd60e51b815260206004820181905260248201527f545368617265526577617264506f6f6c3a206578697374696e6720706f6f6c3f604482015290519081900360640190fd5b6001016112e3565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526113d19085906113d7565b50505050565b606061142c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166114889092919063ffffffff16565b805190915015610aa15780806020019051602081101561144b57600080fd5b5051610aa15760405162461bcd60e51b815260040180806020018281038252602a81526020018061170e602a913960400191505060405180910390fd5b6060611497848460008561149f565b949350505050565b6060824710156114e05760405162461bcd60e51b81526004018080602001828103825260268152602001806116c76026913960400191505060405180910390fd5b6114e9856115f0565b61153a576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106115795780518252601f19909201916020918201910161155a565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146115db576040519150601f19603f3d011682016040523d82523d6000602084013e6115e0565b606091505b5091509150610ecd8282866115f6565b3b151590565b6060831561160557508161110e565b8251156116155782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561165f578181015183820152602001611647565b50505050905090810190601f16801561168c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fdfe545368617265526577617264506f6f6c3a2063616c6c6572206973206e6f7420746865206f70657261746f72416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220a72cdc011c6c9a018c5ee791e6887497381228b20d09bcf5238aba895018560f64736f6c634300060c0033000000000000000000000000a1cd38e22e79ce78322d14b2a053295e22f0bb770000000000000000000000000000000000000000000000000000000061d72e20

Deployed ByteCode Sourcemap

21175:10625:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22648:51;;;:::i;:::-;;;;;;;;;;;;;;;;22041:26;;;;;;;;;;;;;;;;-1:-1:-1;22041:26:0;;:::i;:::-;;;;-1:-1:-1;;;;;22041:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22286:34;;;:::i;25222:353::-;;;;;;;;;;;;;;;;-1:-1:-1;25222:353:0;;;;;;;:::i;:::-;;25652:661;;;;;;;;;;;;;;;;-1:-1:-1;25652:661:0;;;;;;;:::i;29323:816::-;;;;;;;;;;;;;;;;-1:-1:-1;29323:816:0;;;;;;;:::i;27504:916::-;;;;;;;;;;;;;;;;-1:-1:-1;27504:916:0;;:::i;30210:377::-;;;;;;;;;;;;;;;;-1:-1:-1;30210:377:0;;:::i;31187:610::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31187:610:0;;;;;;;;;;;;;;;;;:::i;21296:23::-;;;:::i;:::-;;;;-1:-1:-1;;;;;21296:23:0;;;;;;;;;;;;;;22373:28;;;:::i;27248:180::-;;;:::i;22452:26::-;;;:::i;22125:64::-;;;;;;;;;;;;;;;;-1:-1:-1;22125:64:0;;;;;;-1:-1:-1;;;;;22125:64:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;22592:37;;;:::i;23846:1278::-;;;;;;;;;;;;;;;;-1:-1:-1;23846:1278:0;;;-1:-1:-1;;;;;23846:1278:0;;;;;;;;;;;;;;;;;:::i;22487:49::-;;;:::i;31078:101::-;;;;;;;;;;;;;;;;-1:-1:-1;31078:101:0;-1:-1:-1;;;;;31078:101:0;;:::i;26379:786::-;;;;;;;;;;;;;;;;-1:-1:-1;26379:786:0;;;;;;-1:-1:-1;;;;;26379:786:0;;:::i;28455:832::-;;;;;;;;;;;;;;;;-1:-1:-1;28455:832:0;;;;;;;:::i;21985:20::-;;;:::i;22648:51::-;22688:11;22648:51;:::o;22041:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22041:26:0;;;;-1:-1:-1;22041:26:0;;;;;;;:::o;22286:34::-;;;;:::o;25222:353::-;23410:8;;-1:-1:-1;;;;;23410:8:0;23422:10;23410:22;23402:79;;;;-1:-1:-1;;;23402:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25301:17:::1;:15;:17::i;:::-;25329:21;25353:8;25362:4;25353:14;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;25382;::::0;::::1;::::0;25353;;-1:-1:-1;25382:14:0::1;;25378:150;;;25431:85;25490:11;25431:36;25451:4;:15;;;25431;;:19;;:36;;;;:::i;:::-;:40:::0;::::1;:85::i;:::-;25413:15;:103:::0;25378:150:::1;25538:15;;:29:::0;-1:-1:-1;25222:353:0:o;25652:661::-;25737:7;25774;25761:9;:20;25757:34;;-1:-1:-1;25790:1:0;25783:8;;25757:34;25817:11;;25806:7;:22;25802:504;;25862:11;;25849:9;:24;25845:38;;-1:-1:-1;25882:1:0;25875:8;;25845:38;25915:13;;25902:9;:26;25898:90;;25937:51;25972:15;;25937:30;25953:13;;25937:11;;:15;;:30;;;;:::i;:::-;:34;;:51::i;:::-;25930:58;;;;25898:90;26010:47;26041:15;;26010:26;26026:9;26010:11;;:15;;:26;;;;:::i;25802:504::-;26105:13;;26094:7;:24;26090:38;;-1:-1:-1;26127:1:0;26120:8;;26090:38;26160:13;;26147:9;:26;26143:86;;26182:47;26213:15;;26182:26;26194:13;;26182:7;:11;;:26;;;;:::i;26143:86::-;26278:15;;26251:43;;:22;:7;26263:9;26251:11;:22::i;25802:504::-;25652:661;;;;:::o;29323:816::-;29390:15;29408:10;29390:28;;29429:21;29453:8;29462:4;29453:14;;;;;;;;;;;;;;;;29502;;;:8;:14;;;;;;-1:-1:-1;;;;;29502:23:0;;;;;;;;;29544:11;;29453:14;;;;;;;;-1:-1:-1;29544:22:0;-1:-1:-1;29544:22:0;29536:53;;;;;-1:-1:-1;;;29536:53:0;;;;;;;;;;;;-1:-1:-1;;;29536:53:0;;;;;;;;;;;;;;;29600:16;29611:4;29600:10;:16::i;:::-;29627;29646:70;29700:4;:15;;;29646:49;29690:4;29646:39;29662:4;:22;;;29646:4;:11;;;:15;;:39;;;;:::i;:::-;:43;;:49::i;:::-;:53;;:70::i;:::-;29627:89;-1:-1:-1;29731:12:0;;29727:131;;29760:37;29779:7;29788:8;29760:18;:37::i;:::-;29817:29;;;;;;;;-1:-1:-1;;;;;29817:29:0;;;;;;;;;;;;;29727:131;29872:11;;29868:138;;29914:11;;:24;;29930:7;29914:15;:24::i;:::-;29900:38;;29953:10;;:41;;-1:-1:-1;;;;;29953:10:0;29977:7;29986;29953:23;:41::i;:::-;30050:22;;;;30034:11;;:49;;30078:4;;30034:39;;:15;:39::i;:49::-;30016:15;;;:67;30099:32;;;;;;;;30117:4;;-1:-1:-1;;;;;30099:32:0;;;;;;;;;;;;29323:816;;;;;;:::o;27504:916::-;27556:21;27580:8;27589:4;27580:14;;;;;;;;;;;;;;;;;;27556:38;;27628:4;:19;;;27609:15;:38;27605:77;;27664:7;;;27605:77;27714:10;;:35;;;-1:-1:-1;;;27714:35:0;;27743:4;27714:35;;;;;;27692:19;;-1:-1:-1;;;;;27714:10:0;;:20;;:35;;;;;;;;;;;;;;:10;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27714:35:0;;-1:-1:-1;27764:16:0;27760:107;;-1:-1:-1;27819:15:0;27797:19;;;;:37;27849:7;;27760:107;27882:14;;;;;;27877:138;;27913:14;;;;:21;;-1:-1:-1;;27913:21:0;27930:4;27913:21;;;;;;27987:15;;;27967;;:36;;:19;:36::i;:::-;27949:15;:54;27877:138;28029:15;;:19;28025:340;;28065:24;28092:56;28111:4;:19;;;28132:15;28092:18;:56::i;:::-;28065:83;;28163:21;28187:58;28229:15;;28187:37;28208:4;:15;;;28187:16;:20;;:37;;;;:::i;:58::-;28163:82;-1:-1:-1;28285:68:0;28312:40;28340:11;28312:23;28163:82;28330:4;28312:17;:23::i;:40::-;28285:22;;;;;:26;:68::i;:::-;28260:22;;;:93;-1:-1:-1;;28025:340:0;-1:-1:-1;28397:15:0;28375:19;;;;:37;27504:916;;:::o;30210:377::-;30269:21;30293:8;30302:4;30293:14;;;;;;;;;;;;;;;;30342;;;:8;:14;;;;;;30357:10;30342:26;;;;;;;30397:11;;30419:15;;;-1:-1:-1;30445:15:0;;:19;;;;30293:14;;;;;30475:10;;30293:14;;-1:-1:-1;30342:26:0;;30397:11;30475:44;;-1:-1:-1;;;;;30475:10:0;;;;;30397:11;30475:23;:44::i;:::-;30535;;;;;;;;30565:4;;30553:10;;30535:44;;;;;;;;;30210:377;;;;:::o;31187:610::-;23410:8;;-1:-1:-1;;;;;23410:8:0;23422:10;23410:22;23402:79;;;;-1:-1:-1;;;23402:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31323:11:::1;;31337:7;31323:21;31305:15;:39;31301:447;;;31481:6;::::0;-1:-1:-1;;;;;31471:16:0;;::::1;31481:6:::0;::::1;31471:16;;31463:35;;;::::0;;-1:-1:-1;;;31463:35:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31463:35:0;;;;;;;;;;;;;::::1;;31530:8;:15:::0;31513:14:::1;31560:177;31588:6;31582:3;:12;31560:177;;;31622:21;31646:8;31655:3;31646:13;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;31696:10:::0;;31646:13;;-1:-1:-1;;;;;;31686:20:0;;::::1;31696:10:::0;::::1;31686:20;;31678:43;;;::::0;;-1:-1:-1;;;31678:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31678:43:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;31596:5:0::1;;31560:177;;;;31301:447;;31758:31;-1:-1:-1::0;;;;;31758:19:0;::::1;31778:2:::0;31782:6;31758:19:::1;:31::i;:::-;31187:610:::0;;;:::o;21296:23::-;;;-1:-1:-1;;;;;21296:23:0;;:::o;22373:28::-;;;;:::o;27248:180::-;27310:8;:15;27293:14;27336:85;27364:6;27358:3;:12;27336:85;;;27394:15;27405:3;27394:10;:15::i;:::-;27372:5;;27336:85;;;;27248:180;:::o;22452:26::-;;;;:::o;22125:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22592:37::-;;;;:::o;23846:1278::-;23410:8;;-1:-1:-1;;;;;23410:8:0;23422:10;23410:22;23402:79;;;;-1:-1:-1;;;23402:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24012:26:::1;24031:6;24012:18;:26::i;:::-;24053:11;24049:61;;;24081:17;:15;:17::i;:::-;24142:13;;24124:15;:31;24120:534;;;24209:20:::0;24205:243:::1;;-1:-1:-1::0;24268:13:0::1;::::0;24205:243:::1;;;24344:13;;24326:15;:31;24322:111;;;-1:-1:-1::0;24400:13:0::1;::::0;24322:111:::1;24120:534;;;24516:20:::0;;;:57:::1;;;24558:15;24540;:33;24516:57;24512:131;;;-1:-1:-1::0;24612:15:0::1;24512:131;24664:15;24711:13;;24692:15;:32;;24691:83;;;;24758:15;24739;:34;;24691:83;24799:213;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;24799:213:0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;24799:213:0;;;;;;;::::1;::::0;::::1;::::0;;;;;;24785:8:::1;:228:::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;24785:228:0::1;::::0;;;::::1;;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24785:228:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;24799:213;;-1:-1:-1;25024:93:0::1;;25073:15;::::0;:32:::1;::::0;25093:11;25073:19:::1;:32::i;:::-;25055:15;:50:::0;25024:93:::1;23492:1;23846:1278:::0;;;;:::o;22487:49::-;;;;:::o;31078:101::-;23410:8;;-1:-1:-1;;;;;23410:8:0;23422:10;23410:22;23402:79;;;;-1:-1:-1;;;23402:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31151:8:::1;:20:::0;;-1:-1:-1;;;;;;31151:20:0::1;-1:-1:-1::0;;;;;31151:20:0;;;::::1;::::0;;;::::1;::::0;;31078:101::o;26379:786::-;26453:7;26473:21;26497:8;26506:4;26497:14;;;;;;;;;;;;;;;;26546;;;:8;:14;;;;;;;-1:-1:-1;;;;;26546:21:0;;;;;;;;;;;26497:14;;;;;;;26606:22;;;;26661:10;;:35;;-1:-1:-1;;;26661:35:0;;26690:4;26661:35;;;;;;26497:14;;-1:-1:-1;26546:21:0;;26606:22;;26497:14;;26661:10;;;:20;;:35;;;;;;;;;;:10;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26661:35:0;26729:19;;;;26661:35;;-1:-1:-1;26711:15:0;:37;:57;;;;-1:-1:-1;26752:16:0;;;26711:57;26707:368;;;26785:24;26812:56;26831:4;:19;;;26852:15;26812:18;:56::i;:::-;26785:83;;26883:21;26907:58;26949:15;;26907:37;26928:4;:15;;;26907:16;:20;;:37;;;;:::i;:58::-;26883:82;-1:-1:-1;27000:63:0;27022:40;27050:11;27022:23;26883:82;27040:4;27022:17;:23::i;:40::-;27000:17;;:21;:63::i;:::-;26980:83;;26707:368;;;27092:65;27141:4;:15;;;27092:44;27131:4;27092:34;27108:17;27092:4;:11;;;:15;;:34;;;;:::i;:65::-;27085:72;26379:786;-1:-1:-1;;;;;;;26379:786:0:o;28455:832::-;28521:15;28539:10;28521:28;;28560:21;28584:8;28593:4;28584:14;;;;;;;;;;;;;;;;28633;;;:8;:14;;;;;;-1:-1:-1;;;;;28633:23:0;;;;;;;;;28584:14;;;;;;;;-1:-1:-1;28667:16:0;28642:4;28667:10;:16::i;:::-;28698:11;;:15;28694:294;;28730:16;28749:70;28803:4;:15;;;28749:49;28793:4;28749:39;28765:4;:22;;;28749:4;:11;;;:15;;:39;;;;:::i;:70::-;28730:89;-1:-1:-1;28838:12:0;;28834:143;;28871:37;28890:7;28899:8;28871:18;:37::i;:::-;28932:29;;;;;;;;-1:-1:-1;;;;;28932:29:0;;;;;;;;;;;;;28834:143;28694:294;;29002:11;;28998:157;;29030:10;;:60;;-1:-1:-1;;;;;29030:10:0;29058:7;29075:4;29082:7;29030:27;:60::i;:::-;29119:11;;:24;;29135:7;29119:15;:24::i;:::-;29105:38;;28998:157;29199:22;;;;29183:11;;:49;;29227:4;;29183:39;;:15;:39::i;:49::-;29165:15;;;:67;29248:31;;;;;;;;29265:4;;-1:-1:-1;;;;;29248:31:0;;;;;;;;;;;;28455:832;;;;;:::o;21985:20::-;;;-1:-1:-1;;;;;21985:20:0;;:::o;5290:158::-;5348:7;5381:1;5376;:6;;5368:49;;;;;-1:-1:-1;;;5368:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5435:5:0;;;5290:158::o;4828:179::-;4886:7;4918:5;;;4942:6;;;;4934:46;;;;;-1:-1:-1;;;4934:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;4998:1;4828:179;-1:-1:-1;;;4828:179:0:o;5707:220::-;5765:7;5789:6;5785:20;;-1:-1:-1;5804:1:0;5797:8;;5785:20;5828:5;;;5832:1;5828;:5;:1;5852:5;;;;;:10;5844:56;;;;-1:-1:-1;;;5844:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6405:153;6463:7;6495:1;6491;:5;6483:44;;;;;-1:-1:-1;;;6483:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6549:1;6545;:5;;;;;;;6405:153;-1:-1:-1;;;6405:153:0:o;30705:365::-;30804:6;;:31;;;-1:-1:-1;;;30804:31:0;;30829:4;30804:31;;;;;;30783:18;;-1:-1:-1;;;;;30804:6:0;;:16;;:31;;;;;;;;;;;;;;:6;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30804:31:0;;-1:-1:-1;30850:14:0;;30846:217;;30895:10;30885:7;:20;30881:171;;;30926:6;;:36;;-1:-1:-1;;;;;30926:6:0;30946:3;30951:10;30926:19;:36::i;:::-;30881:171;;;31003:6;;:33;;-1:-1:-1;;;;;31003:6:0;31023:3;31028:7;17923:177;18033:58;;;-1:-1:-1;;;;;18033:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18033:58:0;-1:-1:-1;;;18033:58:0;;;18006:86;;18026:5;;18006:19;:86::i;23509:262::-;23594:8;:15;23577:14;23620:144;23648:6;23642:3;:12;23620:144;;;23709:6;-1:-1:-1;;;;;23686:29:0;:8;23695:3;23686:13;;;;;;;;;;;;;;;;;;;;;:19;-1:-1:-1;;;;;23686:19:0;:29;;23678:74;;;;;-1:-1:-1;;;23678:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23656:5;;23620:144;;18108:205;18236:68;;;-1:-1:-1;;;;;18236:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18236:68:0;-1:-1:-1;;;18236:68:0;;;18209:96;;18229:5;;18209:19;:96::i;:::-;18108:205;;;;:::o;20228:761::-;20652:23;20678:69;20706:4;20678:69;;;;;;;;;;;;;;;;;20686:5;-1:-1:-1;;;;;20678:27:0;;;:69;;;;;:::i;:::-;20762:17;;20652:95;;-1:-1:-1;20762:21:0;20758:224;;20904:10;20893:30;;;;;;;;;;;;;;;-1:-1:-1;20893:30:0;20885:85;;;;-1:-1:-1;;;20885:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13023:195;13126:12;13158:52;13180:6;13188:4;13194:1;13197:12;13158:21;:52::i;:::-;13151:59;13023:195;-1:-1:-1;;;;13023:195:0:o;14075:530::-;14202:12;14260:5;14235:21;:30;;14227:81;;;;-1:-1:-1;;;14227:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14327:18;14338:6;14327:10;:18::i;:::-;14319:60;;;;;-1:-1:-1;;;14319:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14453:12;14467:23;14494:6;-1:-1:-1;;;;;14494:11:0;14514:5;14522:4;14494:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;14494:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14452:75;;;;14545:52;14563:7;14572:10;14584:12;14545:17;:52::i;10105:422::-;10472:20;10511:8;;;10105:422::o;16615:742::-;16730:12;16759:7;16755:595;;;-1:-1:-1;16790:10:0;16783:17;;16755:595;16904:17;;:21;16900:439;;17167:10;17161:17;17228:15;17215:10;17211:2;17207:19;17200:44;17115:148;17310:12;17303:20;;-1:-1:-1;;;17303:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://a72cdc011c6c9a018c5ee791e6887497381228b20d09bcf5238aba895018560f
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.