Contract 0x8204894C8AB1b3A322f2Dae576cf9CbB3EFde63b 1

 

Contract Overview

Balance:
0 Ether

EtherValue:
$0.00

Token:
 
Txn Hash
Method
Block
From
To
Value
0xf7974b81447680fd2cae94583a73626c76a126d0a494dff4de02329af1a4d41cClaim Rewards148344242022-05-24 7:14:54126 days 6 hrs ago0x08b5d278a116665aeecf16e60f87891abbbe492a IN  0x8204894c8ab1b3a322f2dae576cf9cbb3efde63b0 Ether0.01356424 13.76998283
0x9aefbb27f3daaf02a85babf2a78a457b5eb4d288ae4d8cedc011f2c003e72207Unstake Nft147210522022-05-06 3:01:19144 days 10 hrs ago0x2e792573d31fc30b3c76775485beec3c347478cc IN  0x8204894c8ab1b3a322f2dae576cf9cbb3efde63b0 Ether0.00585408 58.3814232
0x76716a9ddaf88aca84a61b0da2e15b951d5ee9924f4acd82bf51af45532ae587Unstake Nft147208002022-05-06 2:04:24144 days 11 hrs ago0x2e792573d31fc30b3c76775485beec3c347478cc IN  0x8204894c8ab1b3a322f2dae576cf9cbb3efde63b0 Ether0.00313516 31.26999382
0x9266acabcccd032ea6d7432577f161d33e1a6b6514139a8e11aa90cead6d5b30Unstake Nft147207952022-05-06 2:03:17144 days 11 hrs ago0x2e792573d31fc30b3c76775485beec3c347478cc IN  0x8204894c8ab1b3a322f2dae576cf9cbb3efde63b0 Ether0.00330301 32.93627189
0xf2e0a5746898b5a99c0b4990d5ef5158d956e58324acc46e15a6cf2d4d423b98Unstake Nft147207902022-05-06 2:02:08144 days 11 hrs ago0x2e792573d31fc30b3c76775485beec3c347478cc IN  0x8204894c8ab1b3a322f2dae576cf9cbb3efde63b0 Ether0.00501643 34.59231372
0x72d0e2a5ea7ed8ccb73ce88b04abc5fc86c34a012e6af2e75e0cdaa006a4fbf9Unstake Nft138317802021-12-18 22:19:38282 days 15 hrs ago0x38ba2d6bdcd7999ee6a409eda0ec96b163500f6d IN  0x8204894c8ab1b3a322f2dae576cf9cbb3efde63b0 Ether0.00436958 43.57693124
0xc3bb46c4cc57c3687160935edc9e3bf0d572d1cfd029d30c400c4c775a3ac9b7Unstake Nft138317352021-12-18 22:10:38282 days 15 hrs ago0x38ba2d6bdcd7999ee6a409eda0ec96b163500f6d IN  0x8204894c8ab1b3a322f2dae576cf9cbb3efde63b0 Ether0.00436194 43.49551032
0xb0f1e9bbd9093a083b40135a701b4ea035fdc4b740bb1258794ddbdb4e1fc63fUnstake Nft138317282021-12-18 22:09:47282 days 15 hrs ago0x38ba2d6bdcd7999ee6a409eda0ec96b163500f6d IN  0x8204894c8ab1b3a322f2dae576cf9cbb3efde63b0 Ether0.00852146 47.54540098
0x73a7cc76e23ca277a83eb7374e7e786a81a43299f52ed09a65c9d61d624f3d85Unstake Nft138061992021-12-14 23:18:37286 days 14 hrs agoConnieDigital: Deployer IN  0x8204894c8ab1b3a322f2dae576cf9cbb3efde63b0 Ether0.01267386 70.71366787
0x1bd1929d9f49d403ad9fc2ccc95bb209f3451500cba11c50028ceef58ffa995bUnstake Nft132206802021-09-14 0:43:58378 days 12 hrs agoENS Name iamlagend.eth IN  0x8204894c8ab1b3a322f2dae576cf9cbb3efde63b0 Ether0.00751329 41.92034533
0x65dc1158eb96ab15cff71545cd5ba7d66d837139483c97711c8cdbcf6a86a995Unstake Nft130606862021-08-20 6:59:01403 days 6 hrs ago0x730d82aed9fc7aebc5264c381e8fda092aaf1872 IN  0x8204894c8ab1b3a322f2dae576cf9cbb3efde63b0 Ether0.00358759 35.7740233
0x9a81803d34de2b850e6b282547550201dfabd6cf784f0db12c1061968fff26acUnstake Nft130606862021-08-20 6:59:01403 days 6 hrs ago0x730d82aed9fc7aebc5264c381e8fda092aaf1872 IN  0x8204894c8ab1b3a322f2dae576cf9cbb3efde63b0 Ether0.00309126 30.82484909
0x25f2d766070b0715a48defa58e5c98976dc897d2ad15050ee44abd90e2bba41dUnstake Nft130606692021-08-20 6:54:35403 days 6 hrs ago0x730d82aed9fc7aebc5264c381e8fda092aaf1872 IN  0x8204894c8ab1b3a322f2dae576cf9cbb3efde63b0 Ether0.00642826 35.86641918
0xd3c2d597ef2ff82a4fbd463b0daeff7a5216fcac21191cc105980057db1b00c0Unstake Nft128811482021-07-23 6:57:01431 days 6 hrs ago0x730d82aed9fc7aebc5264c381e8fda092aaf1872 IN  0x8204894c8ab1b3a322f2dae576cf9cbb3efde63b0 Ether0.0039430122
0x2c0b80e38a8337d496f822f739ed5159e4b4cc7c1850a20ec6151dbc7a9bc813Claim Rewards126254682021-06-13 10:02:59471 days 3 hrs agoENS Name notenough.eth IN  0x8204894c8ab1b3a322f2dae576cf9cbb3efde63b0 Ether0.003695627
0xa6f2a6893428ec1b0470e7ba676d05b9072c4efa6c845f053ce22cce1fdc42e1Unstake Nft125835592021-06-06 22:06:26477 days 15 hrs ago0x3b6b628930e56136cf95dd44e4b8ae98c89dbd6e IN  0x8204894c8ab1b3a322f2dae576cf9cbb3efde63b0 Ether0.0016098111.1
0xd35731ddb87f7b6288213d79a4e4219821bf3f9c6be472e81419a3892cdb71abUnstake Nft125797222021-06-06 7:56:24478 days 5 hrs ago0x08b5d278a116665aeecf16e60f87891abbbe492a IN  0x8204894c8ab1b3a322f2dae576cf9cbb3efde63b0 Ether0.0014039914
0x9c09c65ac60cd0e13e85e18798dbcee3fc95cf53e60a38b3312263cb502a8c07Unstake Nft125797162021-06-06 7:55:09478 days 5 hrs ago0x08b5d278a116665aeecf16e60f87891abbbe492a IN  0x8204894c8ab1b3a322f2dae576cf9cbb3efde63b0 Ether0.0003395914
0xf13dc598ee8c09fbc5fa812b23080fd039cf69761e919cd28082da773be11e27Unstake Nft125797162021-06-06 7:55:09478 days 5 hrs ago0x08b5d278a116665aeecf16e60f87891abbbe492a IN  0x8204894c8ab1b3a322f2dae576cf9cbb3efde63b0 Ether0.0014038214
0x1c73f96782baca7597eb1eb07a23a516c0c9d07a7ab028488517a65006292f2fUnstake Nft125797112021-06-06 7:54:04478 days 5 hrs ago0x08b5d278a116665aeecf16e60f87891abbbe492a IN  0x8204894c8ab1b3a322f2dae576cf9cbb3efde63b0 Ether0.0014039914
0x2a31dec036f9b4b9c340aed103d0598b6bed21e31d0b7c36d2b5009dc3353ec7Unstake Nft125797112021-06-06 7:54:04478 days 5 hrs ago0x08b5d278a116665aeecf16e60f87891abbbe492a IN  0x8204894c8ab1b3a322f2dae576cf9cbb3efde63b0 Ether0.0014039914
0x1673f9d1babd0344fc7e1b79c9e19e397f1555ac89555c62cb776d8b9b306696Unstake Nft125797102021-06-06 7:53:58478 days 5 hrs ago0x08b5d278a116665aeecf16e60f87891abbbe492a IN  0x8204894c8ab1b3a322f2dae576cf9cbb3efde63b0 Ether0.0014038214
0xb9aeabe30f6c23667df1d155eb79f39712390937511c59a3b92ff36fa6d6b65cUnstake Nft125797062021-06-06 7:52:33478 days 5 hrs ago0x08b5d278a116665aeecf16e60f87891abbbe492a IN  0x8204894c8ab1b3a322f2dae576cf9cbb3efde63b0 Ether0.0030453321
0x21643b3bbb11c5cabd745651ba4e916d3016daf060a4874b4f7ae9b0f68a7e4fClaim Rewards125430692021-05-31 15:58:06483 days 21 hrs ago0xef1a58be674508e40f3650de90c1ff2828fc98a6 IN  0x8204894c8ab1b3a322f2dae576cf9cbb3efde63b0 Ether0.0144735725
0x4286589341a06e8b843d7ae0915879929dc88d6e3a064079bdf2d588e6678468Unstake Nft125401452021-05-31 5:07:11484 days 8 hrs agoENS Name monomesa.eth IN  0x8204894c8ab1b3a322f2dae576cf9cbb3efde63b0 Ether0.0017046417
[ Download CSV Export 
View more zero value Internal Transactions in Advanced View mode
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DeltaTimeStakingBeta

Compiler Version
v0.6.8+commit.0bbfe453

Optimization Enabled:
Yes with 2000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-09-14
*/

// Sources flattened with buidler v1.4.3 https://buidler.dev

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;


/**
 * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow
 * checks.
 *
 * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can
 * easily result in undesired exploitation or bugs, since developers usually
 * assume that overflows raise errors. `SafeCast` restores this intuition by
 * reverting the transaction when such 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.
 *
 * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing
 * all math on `uint256` and `int256` and then downcasting.
 */
library SafeCast {

    /**
     * @dev Returns the downcasted uint128 from uint256, reverting on
     * overflow (when the input is greater than largest uint128).
     *
     * Counterpart to Solidity's `uint128` operator.
     *
     * Requirements:
     *
     * - input must fit into 128 bits
     */
    function toUint128(uint256 value) internal pure returns (uint128) {
        require(value < 2**128, "SafeCast: value doesn\'t fit in 128 bits");
        return uint128(value);
    }

    /**
     * @dev Returns the downcasted uint64 from uint256, reverting on
     * overflow (when the input is greater than largest uint64).
     *
     * Counterpart to Solidity's `uint64` operator.
     *
     * Requirements:
     *
     * - input must fit into 64 bits
     */
    function toUint64(uint256 value) internal pure returns (uint64) {
        require(value < 2**64, "SafeCast: value doesn\'t fit in 64 bits");
        return uint64(value);
    }

    /**
     * @dev Returns the downcasted uint32 from uint256, reverting on
     * overflow (when the input is greater than largest uint32).
     *
     * Counterpart to Solidity's `uint32` operator.
     *
     * Requirements:
     *
     * - input must fit into 32 bits
     */
    function toUint32(uint256 value) internal pure returns (uint32) {
        require(value < 2**32, "SafeCast: value doesn\'t fit in 32 bits");
        return uint32(value);
    }

    /**
     * @dev Returns the downcasted uint16 from uint256, reverting on
     * overflow (when the input is greater than largest uint16).
     *
     * Counterpart to Solidity's `uint16` operator.
     *
     * Requirements:
     *
     * - input must fit into 16 bits
     */
    function toUint16(uint256 value) internal pure returns (uint16) {
        require(value < 2**16, "SafeCast: value doesn\'t fit in 16 bits");
        return uint16(value);
    }

    /**
     * @dev Returns the downcasted uint8 from uint256, reverting on
     * overflow (when the input is greater than largest uint8).
     *
     * Counterpart to Solidity's `uint8` operator.
     *
     * Requirements:
     *
     * - input must fit into 8 bits.
     */
    function toUint8(uint256 value) internal pure returns (uint8) {
        require(value < 2**8, "SafeCast: value doesn\'t fit in 8 bits");
        return uint8(value);
    }

    /**
     * @dev Converts a signed int256 into an unsigned uint256.
     *
     * Requirements:
     *
     * - input must be greater than or equal to 0.
     */
    function toUint256(int256 value) internal pure returns (uint256) {
        require(value >= 0, "SafeCast: value must be positive");
        return uint256(value);
    }

    /**
     * @dev Returns the downcasted int128 from int256, reverting on
     * overflow (when the input is less than smallest int128 or
     * greater than largest int128).
     *
     * Counterpart to Solidity's `int128` operator.
     *
     * Requirements:
     *
     * - input must fit into 128 bits
     *
     * _Available since v3.1._
     */
    function toInt128(int256 value) internal pure returns (int128) {
        require(value >= -2**127 && value < 2**127, "SafeCast: value doesn\'t fit in 128 bits");
        return int128(value);
    }

    /**
     * @dev Returns the downcasted int64 from int256, reverting on
     * overflow (when the input is less than smallest int64 or
     * greater than largest int64).
     *
     * Counterpart to Solidity's `int64` operator.
     *
     * Requirements:
     *
     * - input must fit into 64 bits
     *
     * _Available since v3.1._
     */
    function toInt64(int256 value) internal pure returns (int64) {
        require(value >= -2**63 && value < 2**63, "SafeCast: value doesn\'t fit in 64 bits");
        return int64(value);
    }

    /**
     * @dev Returns the downcasted int32 from int256, reverting on
     * overflow (when the input is less than smallest int32 or
     * greater than largest int32).
     *
     * Counterpart to Solidity's `int32` operator.
     *
     * Requirements:
     *
     * - input must fit into 32 bits
     *
     * _Available since v3.1._
     */
    function toInt32(int256 value) internal pure returns (int32) {
        require(value >= -2**31 && value < 2**31, "SafeCast: value doesn\'t fit in 32 bits");
        return int32(value);
    }

    /**
     * @dev Returns the downcasted int16 from int256, reverting on
     * overflow (when the input is less than smallest int16 or
     * greater than largest int16).
     *
     * Counterpart to Solidity's `int16` operator.
     *
     * Requirements:
     *
     * - input must fit into 16 bits
     *
     * _Available since v3.1._
     */
    function toInt16(int256 value) internal pure returns (int16) {
        require(value >= -2**15 && value < 2**15, "SafeCast: value doesn\'t fit in 16 bits");
        return int16(value);
    }

    /**
     * @dev Returns the downcasted int8 from int256, reverting on
     * overflow (when the input is less than smallest int8 or
     * greater than largest int8).
     *
     * Counterpart to Solidity's `int8` operator.
     *
     * Requirements:
     *
     * - input must fit into 8 bits.
     *
     * _Available since v3.1._
     */
    function toInt8(int256 value) internal pure returns (int8) {
        require(value >= -2**7 && value < 2**7, "SafeCast: value doesn\'t fit in 8 bits");
        return int8(value);
    }

    /**
     * @dev Converts an unsigned uint256 into a signed int256.
     *
     * Requirements:
     *
     * - input must be less than or equal to maxInt256.
     */
    function toInt256(uint256 value) internal pure returns (int256) {
        require(value < 2**255, "SafeCast: value doesn't fit in an int256");
        return int256(value);
    }
}


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

pragma solidity ^0.6.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

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

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

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

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

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

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

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


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

pragma solidity ^0.6.0;

/**
 * @title SignedSafeMath
 * @dev Signed math operations with safety checks that revert on error.
 */
library SignedSafeMath {
    int256 constant private _INT256_MIN = -2**255;

        /**
     * @dev Returns the multiplication of two signed integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        require(!(a == -1 && b == _INT256_MIN), "SignedSafeMath: multiplication overflow");

        int256 c = a * b;
        require(c / a == b, "SignedSafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two signed integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        require(b != 0, "SignedSafeMath: division by zero");
        require(!(b == -1 && a == _INT256_MIN), "SignedSafeMath: division overflow");

        int256 c = a / b;

        return c;
    }

    /**
     * @dev Returns the subtraction of two signed integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a), "SignedSafeMath: subtraction overflow");

        return c;
    }

    /**
     * @dev Returns the addition of two signed integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a), "SignedSafeMath: addition overflow");

        return c;
    }
}


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

pragma solidity ^0.6.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}


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

pragma solidity ^0.6.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


// File @animoca/ethereum-contracts-erc20_base/contracts/token/ERC20/[email protected]

/*
https://github.com/OpenZeppelin/openzeppelin-contracts

The MIT License (MIT)

Copyright (c) 2016-2019 zOS Global Limited

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/

pragma solidity 0.6.8;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {

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

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

    /**
     * @dev Returns the 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);
}


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

pragma solidity ^0.6.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}


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

pragma solidity ^0.6.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor () internal {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view override returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}


// File @animoca/ethereum-contracts-assets_inventory/contracts/token/ERC1155/[email protected]

pragma solidity 0.6.8;

/**
 * @title ERC-1155 Multi Token Standard, token receiver
 * @dev See https://eips.ethereum.org/EIPS/eip-1155
 * Interface for any contract that wants to support transfers from ERC1155 asset contracts.
 * Note: The ERC-165 identifier for this interface is 0x4e2312e0.
 */
interface IERC1155TokenReceiver {

    /**
     * @notice Handle the receipt of a single ERC1155 token type.
     * @dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeTransferFrom` after the balance has been updated.
     * This function MUST return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` (i.e. 0xf23a6e61) if it accepts the transfer.
     * This function MUST revert if it rejects the transfer.
     * Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller.
     * @param operator  The address which initiated the transfer (i.e. msg.sender)
     * @param from      The address which previously owned the token
     * @param id        The ID of the token being transferred
     * @param value     The amount of tokens being transferred
     * @param data      Additional data with no specified format
     * @return bytes4   `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
    */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @notice Handle the receipt of multiple ERC1155 token types.
     * @dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeBatchTransferFrom` after the balances have been updated.
     * This function MUST return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` (i.e. 0xbc197c81) if it accepts the transfer(s).
     * This function MUST revert if it rejects the transfer(s).
     * Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller.
     * @param operator  The address which initiated the batch transfer (i.e. msg.sender)
     * @param from      The address which previously owned the token
     * @param ids       An array containing ids of each token being transferred (order and length must match _values array)
     * @param values    An array containing amounts of each token being transferred (order and length must match _ids array)
     * @param data      Additional data with no specified format
     * @return          `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
    */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}


// File @animoca/ethereum-contracts-assets_inventory/contracts/token/ERC1155/[email protected]

pragma solidity 0.6.8;



abstract contract ERC1155TokenReceiver is IERC1155TokenReceiver, ERC165 {

    // bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))
    bytes4 internal constant _ERC1155_RECEIVED = 0xf23a6e61;

    // bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))
    bytes4 internal constant _ERC1155_BATCH_RECEIVED = 0xbc197c81;

    bytes4 internal constant _ERC1155_REJECTED = 0xffffffff;

    constructor() internal {
        _registerInterface(type(IERC1155TokenReceiver).interfaceId);
    }
}


// File @animoca/ethereum-contracts-nft_staking/contracts/staking/[email protected]

pragma solidity 0.6.8;







/**
 * @title NFT Staking
 * Distribute ERC20 rewards over discrete-time schedules for the staking of NFTs.
 * This contract is designed on a self-service model, where users will stake NFTs, unstake NFTs and claim rewards through their own transactions only.
 */
abstract contract NftStaking is ERC1155TokenReceiver, Ownable {
    using SafeCast for uint256;
    using SafeMath for uint256;
    using SignedSafeMath for int256;

    event RewardsAdded(uint256 startPeriod, uint256 endPeriod, uint256 rewardsPerCycle);

    event Started();

    event NftStaked(address staker, uint256 cycle, uint256 tokenId, uint256 weight);

    event NftUnstaked(address staker, uint256 cycle, uint256 tokenId, uint256 weight);

    event RewardsClaimed(address staker, uint256 cycle, uint256 startPeriod, uint256 periods, uint256 amount);

    event HistoriesUpdated(address staker, uint256 startCycle, uint256 stakerStake, uint256 globalStake);

    event Disabled();

    /**
     * Used to represent the current staking status of an NFT.
     * Optimised for use in storage.
     */
    struct TokenInfo {
        address owner;
        uint64 weight;
        uint16 depositCycle;
        uint16 withdrawCycle;
    }

    /**
     * Used as a historical record of change of stake.
     * Stake represents an aggregation of staked token weights.
     * Optimised for use in storage.
     */
    struct Snapshot {
        uint128 stake;
        uint128 startCycle;
    }

    /**
     * Used to represent a staker's information about the next claim.
     * Optimised for use in storage.
     */
    struct NextClaim {
        uint16 period;
        uint64 globalSnapshotIndex;
        uint64 stakerSnapshotIndex;
    }

    /**
     * Used as a container to hold result values from computing rewards.
     */
    struct ComputedClaim {
        uint16 startPeriod;
        uint16 periods;
        uint256 amount;
    }

    bool public enabled = true;

    uint256 public totalRewardsPool;

    uint256 public startTimestamp;

    IERC20 public immutable rewardsTokenContract;
    IWhitelistedNftContract public immutable whitelistedNftContract;

    uint32 public immutable cycleLengthInSeconds;
    uint16 public immutable periodLengthInCycles;

    Snapshot[] public globalHistory;

    /* staker => snapshots*/
    mapping(address => Snapshot[]) public stakerHistories;

    /* staker => next claim */
    mapping(address => NextClaim) public nextClaims;

    /* tokenId => token info */
    mapping(uint256 => TokenInfo) public tokenInfos;

    /* period => rewardsPerCycle */
    mapping(uint256 => uint256) public rewardsSchedule;

    modifier hasStarted() {
        require(startTimestamp != 0, "NftStaking: staking not started");
        _;
    }

    modifier hasNotStarted() {
        require(startTimestamp == 0, "NftStaking: staking has started");
        _;
    }

    modifier isEnabled() {
        require(enabled, "NftStaking: contract is not enabled");
        _;
    }

    modifier isNotEnabled() {
        require(!enabled, "NftStaking: contract is enabled");
        _;
    }

    /**
     * Constructor.
     * @dev Reverts if the period length value is zero.
     * @dev Reverts if the cycle length value is zero.
     * @dev Warning: cycles and periods need to be calibrated carefully. Small values will increase computation load while estimating and claiming rewards. Big values will increase the time to wait before a new period becomes claimable.
     * @param cycleLengthInSeconds_ The length of a cycle, in seconds.
     * @param periodLengthInCycles_ The length of a period, in cycles.
     * @param whitelistedNftContract_ The ERC1155-compliant (optional ERC721-compliance) contract from which staking is accepted.
     * @param rewardsTokenContract_ The ERC20-based token used as staking rewards.
     */
    constructor(
        uint32 cycleLengthInSeconds_,
        uint16 periodLengthInCycles_,
        IWhitelistedNftContract whitelistedNftContract_,
        IERC20 rewardsTokenContract_
    ) internal {
        require(cycleLengthInSeconds_ >= 1 minutes, "NftStaking: invalid cycle length");
        require(periodLengthInCycles_ >= 2, "NftStaking: invalid period length");

        cycleLengthInSeconds = cycleLengthInSeconds_;
        periodLengthInCycles = periodLengthInCycles_;
        whitelistedNftContract = whitelistedNftContract_;
        rewardsTokenContract = rewardsTokenContract_;
    }

    /*                                            Admin Public Functions                                            */

    /**
     * Adds `rewardsPerCycle` reward amount for the period range from `startPeriod` to `endPeriod`, inclusive, to the rewards schedule.
     * The necessary amount of reward tokens is transferred to the contract. Cannot be used for past periods.
     * Can only be used to add rewards and not to remove them.
     * @dev Reverts if not called by the owner.
     * @dev Reverts if the start period is zero.
     * @dev Reverts if the end period precedes the start period.
     * @dev Reverts if attempting to add rewards for a period earlier than the current, after staking has started.
     * @dev Reverts if the reward tokens transfer fails.
     * @dev The rewards token contract emits an ERC20 Transfer event for the reward tokens transfer.
     * @dev Emits a RewardsAdded event.
     * @param startPeriod The starting period (inclusive).
     * @param endPeriod The ending period (inclusive).
     * @param rewardsPerCycle The reward amount to add for each cycle within range.
     */
    function addRewardsForPeriods(
        uint16 startPeriod,
        uint16 endPeriod,
        uint256 rewardsPerCycle
    ) external onlyOwner {
        require(startPeriod != 0 && startPeriod <= endPeriod, "NftStaking: wrong period range");

        uint16 periodLengthInCycles_ = periodLengthInCycles;

        if (startTimestamp != 0) {
            require(
                startPeriod >= _getCurrentPeriod(periodLengthInCycles_),
                "NftStaking: already committed reward schedule"
            );
        }

        for (uint256 period = startPeriod; period <= endPeriod; ++period) {
            rewardsSchedule[period] = rewardsSchedule[period].add(rewardsPerCycle);
        }

        uint256 addedRewards = rewardsPerCycle.mul(periodLengthInCycles_).mul(endPeriod - startPeriod + 1);

        totalRewardsPool = totalRewardsPool.add(addedRewards);

        require(
            rewardsTokenContract.transferFrom(msg.sender, address(this), addedRewards),
            "NftStaking: failed to add funds to the reward pool"
        );

        emit RewardsAdded(startPeriod, endPeriod, rewardsPerCycle);
    }

    /**
     * Starts the first cycle of staking, enabling users to stake NFTs.
     * @dev Reverts if not called by the owner.
     * @dev Reverts if the staking has already started.
     * @dev Emits a Started event.
     */
    function start() public onlyOwner hasNotStarted {
        startTimestamp = now;
        emit Started();
    }

    /**
     * Permanently disables all staking and claiming.
     * This is an emergency recovery feature which is NOT part of the normal contract operation.
     * @dev Reverts if not called by the owner.
     * @dev Emits a Disabled event.
     */
    function disable() public onlyOwner {
        enabled = false;
        emit Disabled();
    }

    /**
     * Withdraws a specified amount of reward tokens from the contract it has been disabled.
     * @dev Reverts if not called by the owner.
     * @dev Reverts if the contract has not been disabled.
     * @dev Reverts if the reward tokens transfer fails.
     * @dev The rewards token contract emits an ERC20 Transfer event for the reward tokens transfer.
     * @param amount The amount to withdraw.
     */
    function withdrawRewardsPool(uint256 amount) public onlyOwner isNotEnabled {
        require(
            rewardsTokenContract.transfer(msg.sender, amount),
            "NftStaking: failed to withdraw from the rewards pool"
        );
    }

    /*                                             ERC1155TokenReceiver                                             */

    function onERC1155Received(
        address, /*operator*/
        address from,
        uint256 id,
        uint256, /*value*/
        bytes calldata /*data*/
    ) external virtual override returns (bytes4) {
        _stakeNft(id, from);
        return _ERC1155_RECEIVED;
    }

    function onERC1155BatchReceived(
        address, /*operator*/
        address from,
        uint256[] calldata ids,
        uint256[] calldata, /*values*/
        bytes calldata /*data*/
    ) external virtual override returns (bytes4) {
        for (uint256 i = 0; i < ids.length; ++i) {
            _stakeNft(ids[i], from);
        }
        return _ERC1155_BATCH_RECEIVED;
    }

    /*                                            Staking Public Functions                                            */

    /**
     * Unstakes a deposited NFT from the contract and updates the histories accordingly.
     * The NFT's weight will not count for the current cycle.
     * @dev Reverts if the caller is not the original owner of the NFT.
     * @dev While the contract is enabled, reverts if the NFT is still frozen.
     * @dev Reverts if the NFT transfer back to the original owner fails.
     * @dev If ERC1155 safe transfers are supported by the receiver wallet, the whitelisted NFT contract emits an ERC1155 TransferSingle event for the NFT transfer back to the staker.
     * @dev If ERC1155 safe transfers are not supported by the receiver wallet, the whitelisted NFT contract emits an ERC721 Transfer event for the NFT transfer back to the staker.
     * @dev While the contract is enabled, emits a HistoriesUpdated event.
     * @dev Emits a NftUnstaked event.
     * @param tokenId The token identifier, referencing the NFT being unstaked.
     */
    function unstakeNft(uint256 tokenId) external virtual {
        TokenInfo memory tokenInfo = tokenInfos[tokenId];

        require(tokenInfo.owner == msg.sender, "NftStaking: token not staked or incorrect token owner");

        uint16 currentCycle = _getCycle(now);

        if (enabled) {
            // ensure that at least an entire cycle has elapsed before unstaking the token to avoid
            // an exploit where a full cycle would be claimable if staking just before the end
            // of a cycle and unstaking right after the start of the new cycle
            require(currentCycle - tokenInfo.depositCycle >= 2, "NftStaking: token still frozen");

            _updateHistories(msg.sender, -int128(tokenInfo.weight), currentCycle);

            // clear the token owner to ensure it cannot be unstaked again without being re-staked
            tokenInfo.owner = address(0);

            // set the withdrawal cycle to ensure it cannot be re-staked during the same cycle
            tokenInfo.withdrawCycle = currentCycle;

            tokenInfos[tokenId] = tokenInfo;
        }

        try whitelistedNftContract.safeTransferFrom(address(this), msg.sender, tokenId, 1, "")  {} catch {
            // the above call to the ERC1155 safeTransferFrom() function may fail if the recipient
            // is a contract wallet not implementing the ERC1155TokenReceiver interface
            // if this happens, the transfer falls back to a call to the ERC721 (non-safe) transferFrom function.
            whitelistedNftContract.transferFrom(address(this), msg.sender, tokenId);
        }

        emit NftUnstaked(msg.sender, currentCycle, tokenId, tokenInfo.weight);
    }

    /**
     * Estimates the claimable rewards for the specified maximum number of past periods, starting at the next claimable period.
     * Estimations can be done only for periods which have already ended.
     * The maximum number of periods to claim can be calibrated to chunk down claims in several transactions to accomodate gas constraints.
     * @param maxPeriods The maximum number of periods to calculate for.
     * @return startPeriod The first period on which the computation starts.
     * @return periods The number of periods computed for.
     * @return amount The total claimable rewards.
     */
    function estimateRewards(uint16 maxPeriods)
        external
        view
        isEnabled
        hasStarted
        returns (
            uint16 startPeriod,
            uint16 periods,
            uint256 amount
        )
    {
        (ComputedClaim memory claim, ) = _computeRewards(msg.sender, maxPeriods);
        startPeriod = claim.startPeriod;
        periods = claim.periods;
        amount = claim.amount;
    }

    /**
     * Claims the claimable rewards for the specified maximum number of past periods, starting at the next claimable period.
     * Claims can be done only for periods which have already ended.
     * The maximum number of periods to claim can be calibrated to chunk down claims in several transactions to accomodate gas constraints.
     * @dev Reverts if the reward tokens transfer fails.
     * @dev The rewards token contract emits an ERC20 Transfer event for the reward tokens transfer.
     * @dev Emits a RewardsClaimed event.
     * @param maxPeriods The maximum number of periods to claim for.
     */
    function claimRewards(uint16 maxPeriods) external isEnabled hasStarted {
        NextClaim memory nextClaim = nextClaims[msg.sender];

        (ComputedClaim memory claim, NextClaim memory newNextClaim) = _computeRewards(msg.sender, maxPeriods);

        // free up memory on already processed staker snapshots
        Snapshot[] storage stakerHistory = stakerHistories[msg.sender];
        while (nextClaim.stakerSnapshotIndex < newNextClaim.stakerSnapshotIndex) {
            delete stakerHistory[nextClaim.stakerSnapshotIndex++];
        }

        if (claim.periods == 0) {
            return;
        }

        if (nextClaims[msg.sender].period == 0) {
            return;
        }

        Snapshot memory lastStakerSnapshot = stakerHistory[stakerHistory.length - 1];

        uint256 lastClaimedCycle = (claim.startPeriod + claim.periods - 1) * periodLengthInCycles;
        if (
            lastClaimedCycle >= lastStakerSnapshot.startCycle && // the claim reached the last staker snapshot
            lastStakerSnapshot.stake == 0 // and nothing is staked in the last staker snapshot
        ) {
            // re-init the next claim
            delete nextClaims[msg.sender];
        } else {
            nextClaims[msg.sender] = newNextClaim;
        }

        if (claim.amount != 0) {
            require(rewardsTokenContract.transfer(msg.sender, claim.amount), "NftStaking: failed to transfer rewards");
        }

        emit RewardsClaimed(msg.sender, _getCycle(now), claim.startPeriod, claim.periods, claim.amount);
    }

    /*                                            Utility Public Functions                                            */

    /**
     * Retrieves the current cycle (index-1 based).
     * @return The current cycle (index-1 based).
     */
    function getCurrentCycle() external view returns (uint16) {
        return _getCycle(now);
    }

    /**
     * Retrieves the current period (index-1 based).
     * @return The current period (index-1 based).
     */
    function getCurrentPeriod() external view returns (uint16) {
        return _getCurrentPeriod(periodLengthInCycles);
    }

    /**
     * Retrieves the last global snapshot index, if any.
     * @dev Reverts if the global history is empty.
     * @return The last global snapshot index.
     */
    function lastGlobalSnapshotIndex() external view returns (uint256) {
        uint256 length = globalHistory.length;
        require(length != 0, "NftStaking: empty global history");
        return length - 1;
    }

    /**
     * Retrieves the last staker snapshot index, if any.
     * @dev Reverts if the staker history is empty.
     * @return The last staker snapshot index.
     */
    function lastStakerSnapshotIndex(address staker) external view returns (uint256) {
        uint256 length = stakerHistories[staker].length;
        require(length != 0, "NftStaking: empty staker history");
        return length - 1;
    }

    /*                                            Staking Internal Functions                                            */

    /**
     * Stakes the NFT received by the contract for its owner. The NFT's weight will count for the current cycle.
     * @dev Reverts if the caller is not the whitelisted NFT contract.
     * @dev Emits an HistoriesUpdated event.
     * @dev Emits an NftStaked event.
     * @param tokenId Identifier of the staked NFT.
     * @param tokenOwner Owner of the staked NFT.
     */
    function _stakeNft(uint256 tokenId, address tokenOwner) internal isEnabled hasStarted {
        require(address(whitelistedNftContract) == msg.sender, "NftStaking: contract not whitelisted");

        uint64 weight = _validateAndGetNftWeight(tokenId);

        uint16 periodLengthInCycles_ = periodLengthInCycles;
        uint16 currentCycle = _getCycle(now);

        _updateHistories(tokenOwner, int128(weight), currentCycle);

        // initialise the next claim if it was the first stake for this staker or if
        // the next claim was re-initialised (ie. rewards were claimed until the last
        // staker snapshot and the last staker snapshot has no stake)
        if (nextClaims[tokenOwner].period == 0) {
            uint16 currentPeriod = _getPeriod(currentCycle, periodLengthInCycles_);
            nextClaims[tokenOwner] = NextClaim(currentPeriod, uint64(globalHistory.length - 1), 0);
        }

        uint16 withdrawCycle = tokenInfos[tokenId].withdrawCycle;
        require(currentCycle != withdrawCycle, "NftStaking: unstaked token cooldown");

        // set the staked token's info
        tokenInfos[tokenId] = TokenInfo(tokenOwner, weight, currentCycle, 0);

        emit NftStaked(tokenOwner, currentCycle, tokenId, weight);
    }

    /**
     * Calculates the amount of rewards for a staker over a capped number of periods.
     * @dev Processes until the specified maximum number of periods to claim is reached, or the last computable period is reached, whichever occurs first.
     * @param staker The staker for whom the rewards will be computed.
     * @param maxPeriods Maximum number of periods over which to compute the rewards.
     * @return claim the result of computation
     * @return nextClaim the next claim which can be used to update the staker's state
     */
    function _computeRewards(address staker, uint16 maxPeriods)
        internal
        view
        returns (ComputedClaim memory claim, NextClaim memory nextClaim)
    {
        // computing 0 periods
        if (maxPeriods == 0) {
            return (claim, nextClaim);
        }

        // the history is empty
        if (globalHistory.length == 0) {
            return (claim, nextClaim);
        }

        nextClaim = nextClaims[staker];
        claim.startPeriod = nextClaim.period;

        // nothing has been staked yet
        if (claim.startPeriod == 0) {
            return (claim, nextClaim);
        }

        uint16 periodLengthInCycles_ = periodLengthInCycles;
        uint16 endClaimPeriod = _getCurrentPeriod(periodLengthInCycles_);

        // current period is not claimable
        if (nextClaim.period == endClaimPeriod) {
            return (claim, nextClaim);
        }

        // retrieve the next snapshots if they exist
        Snapshot[] memory stakerHistory = stakerHistories[staker];

        Snapshot memory globalSnapshot = globalHistory[nextClaim.globalSnapshotIndex];
        Snapshot memory stakerSnapshot = stakerHistory[nextClaim.stakerSnapshotIndex];
        Snapshot memory nextGlobalSnapshot;
        Snapshot memory nextStakerSnapshot;

        if (nextClaim.globalSnapshotIndex != globalHistory.length - 1) {
            nextGlobalSnapshot = globalHistory[nextClaim.globalSnapshotIndex + 1];
        }
        if (nextClaim.stakerSnapshotIndex != stakerHistory.length - 1) {
            nextStakerSnapshot = stakerHistory[nextClaim.stakerSnapshotIndex + 1];
        }

        // excludes the current period
        claim.periods = endClaimPeriod - nextClaim.period;

        if (maxPeriods < claim.periods) {
            claim.periods = maxPeriods;
        }

        // re-calibrate the end claim period based on the actual number of
        // periods to claim. nextClaim.period will be updated to this value
        // after exiting the loop
        endClaimPeriod = nextClaim.period + claim.periods;

        // iterate over periods
        while (nextClaim.period != endClaimPeriod) {
            uint16 nextPeriodStartCycle = nextClaim.period * periodLengthInCycles_ + 1;
            uint256 rewardPerCycle = rewardsSchedule[nextClaim.period];
            uint256 startCycle = nextPeriodStartCycle - periodLengthInCycles_;
            uint256 endCycle = 0;

            // iterate over global snapshots
            while (endCycle != nextPeriodStartCycle) {
                // find the range-to-claim starting cycle, where the current
                // global snapshot, the current staker snapshot, and the current
                // period overlap
                if (globalSnapshot.startCycle > startCycle) {
                    startCycle = globalSnapshot.startCycle;
                }
                if (stakerSnapshot.startCycle > startCycle) {
                    startCycle = stakerSnapshot.startCycle;
                }

                // find the range-to-claim ending cycle, where the current
                // global snapshot, the current staker snapshot, and the current
                // period no longer overlap. The end cycle is exclusive of the
                // range-to-claim and represents the beginning cycle of the next
                // range-to-claim
                endCycle = nextPeriodStartCycle;
                if ((nextGlobalSnapshot.startCycle != 0) && (nextGlobalSnapshot.startCycle < endCycle)) {
                    endCycle = nextGlobalSnapshot.startCycle;
                }

                // only calculate and update the claimable rewards if there is
                // something to calculate with
                if ((globalSnapshot.stake != 0) && (stakerSnapshot.stake != 0) && (rewardPerCycle != 0)) {
                    uint256 snapshotReward = (endCycle - startCycle).mul(rewardPerCycle).mul(stakerSnapshot.stake);
                    snapshotReward /= globalSnapshot.stake;

                    claim.amount = claim.amount.add(snapshotReward);
                }

                // advance the current global snapshot to the next (if any)
                // if its cycle range has been fully processed and if the next
                // snapshot starts at most on next period first cycle
                if (nextGlobalSnapshot.startCycle == endCycle) {
                    globalSnapshot = nextGlobalSnapshot;
                    ++nextClaim.globalSnapshotIndex;

                    if (nextClaim.globalSnapshotIndex != globalHistory.length - 1) {
                        nextGlobalSnapshot = globalHistory[nextClaim.globalSnapshotIndex + 1];
                    } else {
                        nextGlobalSnapshot = Snapshot(0, 0);
                    }
                }

                // advance the current staker snapshot to the next (if any)
                // if its cycle range has been fully processed and if the next
                // snapshot starts at most on next period first cycle
                if (nextStakerSnapshot.startCycle == endCycle) {
                    stakerSnapshot = nextStakerSnapshot;
                    ++nextClaim.stakerSnapshotIndex;

                    if (nextClaim.stakerSnapshotIndex != stakerHistory.length - 1) {
                        nextStakerSnapshot = stakerHistory[nextClaim.stakerSnapshotIndex + 1];
                    } else {
                        nextStakerSnapshot = Snapshot(0, 0);
                    }
                }
            }

            ++nextClaim.period;
        }

        return (claim, nextClaim);
    }

    /**
     * Updates the global and staker histories at the current cycle with a new difference in stake.
     * @dev Emits a HistoriesUpdated event.
     * @param staker The staker who is updating the history.
     * @param stakeDelta The difference to apply to the current stake.
     * @param currentCycle The current cycle.
     */
    function _updateHistories(
        address staker,
        int128 stakeDelta,
        uint16 currentCycle
    ) internal {
        uint256 stakerSnapshotIndex = _updateHistory(stakerHistories[staker], stakeDelta, currentCycle);
        uint256 globalSnapshotIndex = _updateHistory(globalHistory, stakeDelta, currentCycle);

        emit HistoriesUpdated(
            staker,
            currentCycle,
            stakerHistories[staker][stakerSnapshotIndex].stake,
            globalHistory[globalSnapshotIndex].stake
        );
    }

    /**
     * Updates the history at the current cycle with a new difference in stake.
     * @dev It will update the latest snapshot if it starts at the current cycle, otherwise will create a new snapshot with the updated stake.
     * @param history The history to update.
     * @param stakeDelta The difference to apply to the current stake.
     * @param currentCycle The current cycle.
     * @return snapshotIndex Index of the snapshot that was updated or created (i.e. the latest snapshot index).
     */
    function _updateHistory(
        Snapshot[] storage history,
        int128 stakeDelta,
        uint16 currentCycle
    ) internal returns (uint256 snapshotIndex) {
        uint256 historyLength = history.length;
        uint128 snapshotStake;

        if (historyLength != 0) {
            // there is an existing snapshot
            snapshotIndex = historyLength - 1;
            Snapshot storage snapshot = history[snapshotIndex];
            snapshotStake = uint256(int256(snapshot.stake).add(stakeDelta)).toUint128();

            if (snapshot.startCycle == currentCycle) {
                // update the snapshot if it starts on the current cycle
                snapshot.stake = snapshotStake;
                return snapshotIndex;
            }

            // update the snapshot index (as a reflection that a new latest
            // snapshot will be added to the history), if there was already an
            // existing snapshot
            snapshotIndex += 1;
        } else {
            // the snapshot index (as a reflection that a new latest snapshot
            // will be added to the history) should already be initialized
            // correctly to the default value 0

            // the stake delta will not be negative, if we have no history, as
            // that would indicate that we are unstaking without having staked
            // anything first
            snapshotStake = uint128(stakeDelta);
        }

        Snapshot memory snapshot;
        snapshot.stake = snapshotStake;
        snapshot.startCycle = currentCycle;

        // add a new snapshot in the history
        history.push(snapshot);
    }

    /*                                           Utility Internal Functions                                           */

    /**
     * Retrieves the cycle (index-1 based) at the specified timestamp.
     * @dev Reverts if the specified timestamp is earlier than the beginning of the staking schedule
     * @param timestamp The timestamp for which the cycle is derived from.
     * @return The cycle (index-1 based) at the specified timestamp.
     */
    function _getCycle(uint256 timestamp) internal view returns (uint16) {
        require(timestamp >= startTimestamp, "NftStaking: timestamp preceeds contract start");
        return (((timestamp - startTimestamp) / uint256(cycleLengthInSeconds)) + 1).toUint16();
    }

    /**
     * Retrieves the period (index-1 based) for the specified cycle and period length.
     * @dev reverts if the specified cycle is zero.
     * @param cycle The cycle within the period to retrieve.
     * @param periodLengthInCycles_ Length of a period, in cycles.
     * @return The period (index-1 based) for the specified cycle and period length.
     */
    function _getPeriod(uint16 cycle, uint16 periodLengthInCycles_) internal pure returns (uint16) {
        require(cycle != 0, "NftStaking: cycle cannot be zero");
        return (cycle - 1) / periodLengthInCycles_ + 1;
    }

    /**
     * Retrieves the current period (index-1 based).
     * @param periodLengthInCycles_ Length of a period, in cycles.
     * @return The current period (index-1 based).
     */
    function _getCurrentPeriod(uint16 periodLengthInCycles_) internal view returns (uint16) {
        return _getPeriod(_getCycle(now), periodLengthInCycles_);
    }

    /*                                                Internal Hooks                                                */

    /**
     * Abstract function which validates whether or not an NFT is accepted for staking and retrieves its associated weight.
     * @dev MUST throw if the token is invalid.
     * @param tokenId uint256 token identifier of the NFT.
     * @return uint64 the weight of the NFT.
     */
    function _validateAndGetNftWeight(uint256 tokenId) internal virtual view returns (uint64);
}

/**
 * @notice Interface for the NftStaking whitelisted NFT contract.
 */
interface IWhitelistedNftContract {
    /**
     * ERC1155: Transfers `value` amount of an `id` from  `from` to `to` (with safety call). 
     * @dev Caller must be approved to manage the tokens being transferred out of the `from` account (see "Approval" section of the standard).
     * @dev MUST revert if `to` is the zero address.
     * @dev MUST revert if balance of holder for token `id` is lower than the `value` sent.
     * @dev MUST revert on any other error.
     * @dev MUST emit the `TransferSingle` event to reflect the balance change (see "Safe Transfer Rules" section of the standard).
     * @dev After the above conditions are met, this function MUST check if `to` is a smart contract (e.g. code size > 0). If so, it MUST call `onERC1155Received` on `to` and act appropriately (see "Safe Transfer Rules" section of the standard).
     * @param from Source address
     * @param to Target address
     * @param id ID of the token type
     * @param value Transfer amount
     * @param data Additional data with no specified format, MUST be sent unaltered in call to `onERC1155Received` on `to`
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external;

    /**
     * @notice ERC721: Transfers the ownership of a given token ID to another address.
     * Usage of this method is discouraged, use `safeTransferFrom` whenever possible.
     * Requires the msg sender to be the owner, approved, or operator.
     * @param from current owner of the token.
     * @param to address to receive the ownership of the given token ID.
     * @param tokenId uint256 ID of the token to be transferred.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;
}


// File @animoca/f1dt-ethereum-contracts/contracts/staking/[email protected]

pragma solidity 0.6.8;


/**
 * @title Delta Time Staking Beta
 * This contract allows owners of Delta Time 2019 Car NFTs to stake them in exchange for REVV rewards.
 */
contract DeltaTimeStakingBeta is NftStaking {
    mapping(uint256 => uint64) public weightsByRarity;

    /**
     * Constructor.
     * @param cycleLengthInSeconds_ The length of a cycle, in seconds.
     * @param periodLengthInCycles_ The length of a period, in cycles.
     * @param inventoryContract IWhitelistedNftContract the DeltaTimeInventory contract.
     * @param revvContract IERC20 the REVV contract.
     * @param rarities uint256[] the supported DeltaTimeInventory NFT rarities.
     * @param weights uint64[] the staking weights associated to the NFT rarities.
     */
    constructor(
        uint32 cycleLengthInSeconds_,
        uint16 periodLengthInCycles_,
        IWhitelistedNftContract inventoryContract,
        IERC20 revvContract,
        uint256[] memory rarities,
        uint64[] memory weights
    ) public NftStaking(cycleLengthInSeconds_, periodLengthInCycles_, inventoryContract, revvContract) {
        require(rarities.length == weights.length, "NftStaking: wrong arguments");
        for (uint256 i = 0; i < rarities.length; ++i) {
            weightsByRarity[rarities[i]] = weights[i];
        }
    }

    /**
     * Verifes that the token is eligible and returns its associated weight.
     * Throws if the token is not a 2019 Car NFT.
     * @param nftId uint256 token identifier of the NFT.
     * @return uint64 the weight of the NFT.
     */
    function _validateAndGetNftWeight(uint256 nftId) internal virtual override view returns (uint64) {
        // Ids bits layout specification:
        // https://github.com/animocabrands/f1dt-core_metadata/blob/v0.1.1/src/constants.js
        uint256 nonFungible = (nftId >> 255) & 1;
        uint256 tokenType = (nftId >> 240) & 0xFF;
        uint256 tokenSeason = (nftId >> 224) & 0xFF;
        uint256 tokenRarity = (nftId >> 176) & 0xFF;

        // For interpretation of values, refer to: https://github.com/animocabrands/f1dt-core_metadata/tree/v0.1.1/src/mappings
        // Types: https://github.com/animocabrands/f1dt-core_metadata/blob/v0.1.1/src/mappings/Common/Types/NameById.js
        // Seasons: https://github.com/animocabrands/f1dt-core_metadata/blob/v0.1.1/src/mappings/Common/Seasons/NameById.js
        // Rarities: https://github.com/animocabrands/f1dt-core_metadata/blob/v0.1.1/src/mappings/Common/Rarities/TierByRarity.js
        require(nonFungible == 1 && tokenType == 1 && tokenSeason == 2, "NftStaking: wrong token");

        return weightsByRarity[tokenRarity];
    }
}


// File contracts/Contracts.sol

pragma solidity 0.6.8;

// import "@animoca/ethereum-contracts-erc20_base/contracts/mocks/token/ERC20/ERC20Mock.sol";
// import "@animoca/f1dt-ethereum-contracts/contracts/token/ERC20/REVV.sol";
// import "@animoca/f1dt-ethereum-contracts/contracts/token/ERC1155721/DeltaTimeInventoryV2.sol";
// import "@animoca/f1dt-ethereum-contracts/contracts/metadata/DeltaTimeCoreMetadata.sol";
// import "@animoca/f1dt-ethereum-contracts/contracts/token/ERC1155721/NFTRepairCentre.sol";

// import "@animoca/f1dt-ethereum-contracts/contracts/sale/REVVSale.sol";
// import "@animoca/f1dt-ethereum-contracts/contracts/sale/QualifyingGameSale.sol";
// import "@animoca/f1dt-ethereum-contracts/contracts/token/ERC721/TrackTickets.sol";

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint32","name":"cycleLengthInSeconds_","type":"uint32"},{"internalType":"uint16","name":"periodLengthInCycles_","type":"uint16"},{"internalType":"contract IWhitelistedNftContract","name":"inventoryContract","type":"address"},{"internalType":"contract IERC20","name":"revvContract","type":"address"},{"internalType":"uint256[]","name":"rarities","type":"uint256[]"},{"internalType":"uint64[]","name":"weights","type":"uint64[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"Disabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"startCycle","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakerStake","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"globalStake","type":"uint256"}],"name":"HistoriesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"cycle","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"weight","type":"uint256"}],"name":"NftStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"cycle","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"weight","type":"uint256"}],"name":"NftUnstaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"startPeriod","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endPeriod","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardsPerCycle","type":"uint256"}],"name":"RewardsAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"cycle","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startPeriod","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"periods","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsClaimed","type":"event"},{"anonymous":false,"inputs":[],"name":"Started","type":"event"},{"inputs":[{"internalType":"uint16","name":"startPeriod","type":"uint16"},{"internalType":"uint16","name":"endPeriod","type":"uint16"},{"internalType":"uint256","name":"rewardsPerCycle","type":"uint256"}],"name":"addRewardsForPeriods","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"maxPeriods","type":"uint16"}],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cycleLengthInSeconds","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"maxPeriods","type":"uint16"}],"name":"estimateRewards","outputs":[{"internalType":"uint16","name":"startPeriod","type":"uint16"},{"internalType":"uint16","name":"periods","type":"uint16"},{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentCycle","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentPeriod","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"globalHistory","outputs":[{"internalType":"uint128","name":"stake","type":"uint128"},{"internalType":"uint128","name":"startCycle","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastGlobalSnapshotIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"lastStakerSnapshotIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nextClaims","outputs":[{"internalType":"uint16","name":"period","type":"uint16"},{"internalType":"uint64","name":"globalSnapshotIndex","type":"uint64"},{"internalType":"uint64","name":"stakerSnapshotIndex","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodLengthInCycles","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardsSchedule","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsTokenContract","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakerHistories","outputs":[{"internalType":"uint128","name":"stake","type":"uint128"},{"internalType":"uint128","name":"startCycle","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"start","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenInfos","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint64","name":"weight","type":"uint64"},{"internalType":"uint16","name":"depositCycle","type":"uint16"},{"internalType":"uint16","name":"withdrawCycle","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRewardsPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"unstakeNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"weightsByRarity","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistedNftContract","outputs":[{"internalType":"contract IWhitelistedNftContract","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawRewardsPool","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101006040526001805460ff60a01b1916600160a01b1790553480156200002557600080fd5b506040516200342738038062003427833981810160405260c08110156200004b57600080fd5b81516020830151604080850151606086015160808701805193519597949692959194919392820192846401000000008211156200008757600080fd5b9083019060208201858111156200009d57600080fd5b8251866020820283011164010000000082111715620000bb57600080fd5b82525081516020918201928201910280838360005b83811015620000ea578181015183820152602001620000d0565b50505050905001604052602001805160405193929190846401000000008211156200011457600080fd5b9083019060208201858111156200012a57600080fd5b82518660208202830111640100000000821117156200014857600080fd5b82525081516020918201928201910280838360005b83811015620001775781810151838201526020016200015d565b5050505090500160405250505085858585620001a06301ffc9a760e01b620003dd60201b60201c565b620001bb630271189760e51b6001600160e01b03620003dd16565b6000620001d06001600160e01b036200046216565b600180546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350603c8463ffffffff1610156200027b576040805162461bcd60e51b815260206004820181905260248201527f4e66745374616b696e673a20696e76616c6964206379636c65206c656e677468604482015290519081900360640190fd5b60028361ffff161015620002c15760405162461bcd60e51b8152600401808060200182810382526021815260200180620034066021913960400191505060405180910390fd5b60e093841b6001600160e01b03191660c05260f09290921b6001600160f01b031916909252606091821b6001600160601b031990811660a052911b16608052805182511462000357576040805162461bcd60e51b815260206004820152601b60248201527f4e66745374616b696e673a2077726f6e6720617267756d656e74730000000000604482015290519081900360640190fd5b60005b8251811015620003d0578181815181106200037157fe5b6020026020010151600960008584815181106200038a57fe5b6020026020010151815260200190815260200160002060006101000a8154816001600160401b0302191690836001600160401b031602179055508060010190506200035a565b5050505050505062000466565b6001600160e01b031980821614156200043d576040805162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b3390565b60805160601c60a05160601c60c05160e01c60e05160f01c612f22620004e4600039806107c4528061080952806114435280611ac65280611dc4528061255a525080610874528061230f525080610d495280610de752806111fd52806124e652508061107152806111d952806115995280611c135250612f226000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806373a3234611610104578063bc197c81116100a2578063e6fd48bc11610071578063e6fd48bc14610697578063f23a6e611461069f578063f2fde38b14610734578063f81649b41461075a576101da565b8063bc197c81146104ff578063be26ed7f14610661578063be9a655514610669578063cc60fbf114610671576101da565b80638da5cb5b116100de5780638da5cb5b146104aa5780639de2e1cb146104ce5780639e7cfd49146104d6578063a522bbaa146104de576101da565b806373a323461461042b5780637b62e040146104485780637c13774b14610450576101da565b8063238dafe01161017c5780635a32502d1161014b5780635a32502d1461036c57806369628952146103b25780636b42600014610406578063715018a614610423576101da565b8063238dafe0146103355780632ef3ff6f1461033d5780632f2770db146103455780634fc5b8491461034f576101da565b8063086146d2116101b8578063086146d21461028b5780630bc2b269146102935780630d2cb02a146102e55780632217f16514610306576101da565b806301ffc9a7146101df5780630320d053146102325780630503c9bb14610251575b600080fd5b61021e600480360360208110156101f557600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661078b565b604080519115158252519081900360200190f35b61023a6107c2565b6040805161ffff9092168252519081900360200190f35b61026e6004803603602081101561026757600080fd5b50356107e6565b6040805167ffffffffffffffff9092168252519081900360200190f35b61023a610802565b6102bf600480360360408110156102a957600080fd5b506001600160a01b038135169060200135610832565b604080516001600160801b03938416815291909216602082015281519081900390910190f35b6102ed610872565b6040805163ffffffff9092168252519081900360200190f35b6103236004803603602081101561031c57600080fd5b5035610896565b60408051918252519081900360200190f35b61021e6108a8565b6103236108b8565b61034d6108be565b005b6102bf6004803603602081101561036557600080fd5b503561097b565b61038d6004803603602081101561038257600080fd5b503561ffff166109ad565b6040805161ffff94851681529290931660208301528183015290519081900360600190f35b6103d8600480360360208110156103c857600080fd5b50356001600160a01b0316610a7e565b6040805161ffff909416845267ffffffffffffffff9283166020850152911682820152519081900360600190f35b61034d6004803603602081101561041c57600080fd5b5035610ab7565b61034d610ea7565b61034d6004803603602081101561044157600080fd5b5035610f68565b610323611123565b61046d6004803603602081101561046657600080fd5b5035611184565b604080516001600160a01b03909516855267ffffffffffffffff909316602085015261ffff91821684840152166060830152519081900360800190f35b6104b26111c8565b604080516001600160a01b039092168252519081900360200190f35b6104b26111d7565b6104b26111fb565b61034d600480360360208110156104f457600080fd5b503561ffff1661121f565b61062c600480360360a081101561051557600080fd5b6001600160a01b03823581169260208101359091169181019060608101604082013564010000000081111561054957600080fd5b82018360208201111561055b57600080fd5b8035906020019184602083028401116401000000008311171561057d57600080fd5b91939092909160208101903564010000000081111561059b57600080fd5b8201836020820111156105ad57600080fd5b803590602001918460208302840111640100000000831117156105cf57600080fd5b9193909290916020810190356401000000008111156105ed57600080fd5b8201836020820111156105ff57600080fd5b8035906020019184600183028401116401000000008311171561062157600080fd5b5090925090506116c8565b604080517fffffffff000000000000000000000000000000000000000000000000000000009092168252519081900360200190f35b61023a611727565b61034d611732565b6103236004803603602081101561068757600080fd5b50356001600160a01b0316611820565b610323611895565b61062c600480360360a08110156106b557600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a0810160808201356401000000008111156106f557600080fd5b82018360208201111561070757600080fd5b8035906020019184600183028401116401000000008311171561072957600080fd5b50909250905061189b565b61034d6004803603602081101561074a57600080fd5b50356001600160a01b03166118d3565b61034d6004803603606081101561077057600080fd5b5061ffff8135811691602081013590911690604001356119eb565b7fffffffff000000000000000000000000000000000000000000000000000000001660009081526020819052604090205460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000081565b60096020526000908152604090205467ffffffffffffffff1681565b600061082d7f0000000000000000000000000000000000000000000000000000000000000000611d0e565b905090565b6005602052816000526040600020818154811061084b57fe5b6000918252602090912001546001600160801b038082169350600160801b90910416905082565b7f000000000000000000000000000000000000000000000000000000000000000081565b60086020526000908152604090205481565b600154600160a01b900460ff1681565b60025481565b6108c6611d28565b6001546001600160a01b03908116911614610928576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040517f75884cdadc4a89e8b545db800057f06ec7f5338a08183c7ba515f2bfdd9fe1e190600090a1565b6004818154811061098857fe5b6000918252602090912001546001600160801b038082169250600160801b9091041682565b6000806000600160149054906101000a900460ff166109fd5760405162461bcd60e51b8152600401808060200182810382526023815260200180612e1b6023913960400191505060405180910390fd5b600354610a51576040805162461bcd60e51b815260206004820152601f60248201527f4e66745374616b696e673a207374616b696e67206e6f74207374617274656400604482015290519081900360640190fd5b610a59612c54565b610a633386611d2c565b50805160208201516040909201519097919650945092505050565b60066020526000908152604090205461ffff81169067ffffffffffffffff6201000082048116916a010000000000000000000090041683565b610abf612c74565b50600081815260076020908152604091829020825160808101845290546001600160a01b03811680835267ffffffffffffffff600160a01b8304169383019390935261ffff600160e01b8204811694830194909452600160f01b900490921660608301523314610b605760405162461bcd60e51b8152600401808060200182810382526035815260200180612cd96035913960400191505060405180910390fd5b6000610b6b426122c7565b600154909150600160a01b900460ff1615610cec5760028260400151820361ffff161015610be0576040805162461bcd60e51b815260206004820152601e60248201527f4e66745374616b696e673a20746f6b656e207374696c6c2066726f7a656e0000604482015290519081900360640190fd5b610bfc33836020015167ffffffffffffffff1660000383612349565b600080835261ffff808316606085019081528583526007602090815260409384902086518154928801519588015193518516600160f01b027dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff94909516600160e01b027fffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff67ffffffffffffffff909716600160a01b027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff6001600160a01b039390931673ffffffffffffffffffffffffffffffffffffffff199095169490941791909116929092179490941617161790555b604080517ff242432a000000000000000000000000000000000000000000000000000000008152306004820152336024820152604481018590526001606482015260a06084820152600060a4820181905291516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263f242432a9260e4808201939182900301818387803b158015610d8c57600080fd5b505af1925050508015610d9d575060015b610e4757604080517f23b872dd0000000000000000000000000000000000000000000000000000000081523060048201523360248201526044810185905290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916323b872dd91606480830192600092919082900301818387803b158015610e2e57600080fd5b505af1158015610e42573d6000803e3d6000fd5b505050505b6020808301516040805133815261ffff85169381019390935282810186905267ffffffffffffffff9091166060830152517fa809c38c1b1d8f31236741c657ba4d5b0c25cefab4c1cbc9a0ca5f96a774a15d9181900360800190a1505050565b610eaf611d28565b6001546001600160a01b03908116911614610f11576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36001805473ffffffffffffffffffffffffffffffffffffffff19169055565b610f70611d28565b6001546001600160a01b03908116911614610fd2576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600154600160a01b900460ff1615611031576040805162461bcd60e51b815260206004820152601f60248201527f4e66745374616b696e673a20636f6e747261637420697320656e61626c656400604482015290519081900360640190fd5b604080517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526024810183905290516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163a9059cbb9160448083019260209291908290030181600087803b1580156110b957600080fd5b505af11580156110cd573d6000803e3d6000fd5b505050506040513d60208110156110e357600080fd5b50516111205760405162461bcd60e51b8152600401808060200182810382526034815260200180612eb96034913960400191505060405180910390fd5b50565b6004546000908061117b576040805162461bcd60e51b815260206004820181905260248201527f4e66745374616b696e673a20656d70747920676c6f62616c20686973746f7279604482015290519081900360640190fd5b60001901905090565b6007602052600090815260409020546001600160a01b0381169067ffffffffffffffff600160a01b8204169061ffff600160e01b8204811691600160f01b90041684565b6001546001600160a01b031690565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600154600160a01b900460ff166112675760405162461bcd60e51b8152600401808060200182810382526023815260200180612e1b6023913960400191505060405180910390fd5b6003546112bb576040805162461bcd60e51b815260206004820152601f60248201527f4e66745374616b696e673a207374616b696e67206e6f74207374617274656400604482015290519081900360640190fd5b6112c3612c54565b50336000908152600660209081526040918290208251606081018452905461ffff8116825267ffffffffffffffff6201000082048116938301939093526a0100000000000000000000900490911691810191909152611320612c54565b611328612c54565b6113323385611d2c565b33600090815260056020526040902091935091505b816040015167ffffffffffffffff16846040015167ffffffffffffffff1610156113b3578084604001805180919060010167ffffffffffffffff1667ffffffffffffffff1681525067ffffffffffffffff16815481106113a357fe5b6000918252602082200155611347565b602083015161ffff166113c95750505050611120565b3360009081526006602052604090205461ffff166113ea5750505050611120565b6113f2612c9b565b81548290600019810190811061140457fe5b6000918252602091829020604080518082019091529101546001600160801b038082168352600160801b909104168183018190529186015186519193507f00000000000000000000000000000000000000000000000000000000000000009101600019010261ffff16908110801590611485575081516001600160801b0316155b156114c45733600090815260066020526040902080547fffffffffffffffffffffffffffff00000000000000000000000000000000000016905561154a565b3360009081526006602090815260409182902086518154928801519388015161ffff1990931661ffff9091161769ffffffffffffffff000019166201000067ffffffffffffffff94851602177fffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffff166a010000000000000000000093909216929092021790555b6040850151156116485760408086015181517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481019190915290516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163a9059cbb9160448083019260209291908290030181600087803b1580156115e157600080fd5b505af11580156115f5573d6000803e3d6000fd5b505050506040513d602081101561160b57600080fd5b50516116485760405162461bcd60e51b8152600401808060200182810382526026815260200180612e936026913960400191505060405180910390fd5b7f5619b8583bbbb0760d27ac9ff844cec866b333bf7ad0262c2d809ff42f22e5fc33611673426122c7565b87516020808a01516040808c015181516001600160a01b03909716875261ffff95861693870193909352928416858401529290921660608401526080830191909152519081900360a00190a150505050505050565b6000805b868110156116f8576116f08888838181106116e357fe5b905060200201358a612448565b6001016116cc565b507fbc197c81000000000000000000000000000000000000000000000000000000009998505050505050505050565b600061082d426122c7565b61173a611d28565b6001546001600160a01b0390811691161461179c576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600354156117f1576040805162461bcd60e51b815260206004820152601f60248201527f4e66745374616b696e673a207374616b696e6720686173207374617274656400604482015290519081900360640190fd5b426003556040517fd8cea0ecd56872ff072e771658b5682ffe4de16d752947f79597d600ea56f7a990600090a1565b6001600160a01b0381166000908152600560205260408120548061188b576040805162461bcd60e51b815260206004820181905260248201527f4e66745374616b696e673a20656d707479207374616b657220686973746f7279604482015290519081900360640190fd5b6000190192915050565b60035481565b60006118a78587612448565b507ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b6118db611d28565b6001546001600160a01b0390811691161461193d576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166119825760405162461bcd60e51b8152600401808060200182810382526026815260200180612d0e6026913960400191505060405180910390fd5b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6119f3611d28565b6001546001600160a01b03908116911614611a55576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61ffff831615801590611a7057508161ffff168361ffff1611155b611ac1576040805162461bcd60e51b815260206004820152601e60248201527f4e66745374616b696e673a2077726f6e6720706572696f642072616e67650000604482015290519081900360640190fd5b6003547f00000000000000000000000000000000000000000000000000000000000000009015611b3a57611af481611d0e565b61ffff168461ffff161015611b3a5760405162461bcd60e51b815260040180806020018281038252602d815260200180612dee602d913960400191505060405180910390fd5b61ffff84165b8361ffff168111611b8157600081815260086020526040902054611b6a908463ffffffff61284716565b600082815260086020526040902055600101611b40565b506000611bb485850360010161ffff16611ba88461ffff16866128a890919063ffffffff16565b9063ffffffff6128a816565b600254909150611bca908263ffffffff61284716565b600255604080517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810183905290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916323b872dd9160648083019260209291908290030181600087803b158015611c5b57600080fd5b505af1158015611c6f573d6000803e3d6000fd5b505050506040513d6020811015611c8557600080fd5b5051611cc25760405162461bcd60e51b8152600401808060200182810382526032815260200180612e3e6032913960400191505060405180910390fd5b6040805161ffff80881682528616602082015280820185905290517fbff8d5ced955e6f69a19ecc71d313996f6ddfed652cdb458859af89e2f0768359181900360600190a15050505050565b6000611d22611d1c426122c7565b83612901565b92915050565b3390565b611d34612c54565b611d3c612c54565b61ffff8316611d4a576122c0565b600454611d56576122c0565b506001600160a01b0383166000908152600660209081526040918290208251606081018452905461ffff811680835267ffffffffffffffff6201000083048116948401949094526a010000000000000000000090910490921692810192909252808352611dc2576122c0565b7f00000000000000000000000000000000000000000000000000000000000000006000611dee82611d0e565b90508061ffff16836000015161ffff161415611e0c57506122c09050565b6001600160a01b0386166000908152600560209081526040808320805482518185028101850190935280835260609492939192909184015b82821015611e8d57600084815260209081902060408051808201909152908401546001600160801b038082168352600160801b9091041681830152825260019092019101611e44565b505050509050611e9b612c9b565b6004856020015167ffffffffffffffff1681548110611eb657fe5b6000918252602091829020604080518082019091529101546001600160801b038082168352600160801b90910416918101919091529050611ef5612c9b565b82866040015167ffffffffffffffff1681518110611f0f57fe5b60200260200101519050611f21612c9b565b611f29612c9b565b600454602089015167ffffffffffffffff1660001990910114611f9c576004886020015160010167ffffffffffffffff1681548110611f6457fe5b6000918252602091829020604080518082019091529101546001600160801b038082168352600160801b909104169181019190915291505b6001855103886040015167ffffffffffffffff1614611fdd5784886040015160010167ffffffffffffffff1681518110611fd257fe5b602002602001015190505b875161ffff908703811660208b01819052908b1610156120025761ffff8a1660208a01525b602089015188510195505b8561ffff16886000015161ffff16146122b857875161ffff808216600090815260086020526040812054928a0260018181019493918c90030116905b8361ffff1681146122a3578188602001516001600160801b0316111561207a5787602001516001600160801b031691505b8187602001516001600160801b031611156120a05786602001516001600160801b031691505b50602085015161ffff8416906001600160801b0316158015906120cf57508086602001516001600160801b0316105b156120e4575060208501516001600160801b03165b87516001600160801b031615801590612106575086516001600160801b031615155b801561211157508215155b1561217157865160009061213a906001600160801b0316611ba88585038763ffffffff6128a816565b89519091506001600160801b0316818161215057fe5b04905061216a818f6040015161284790919063ffffffff16565b60408f0152505b8086602001516001600160801b0316141561221f5760208c01805160010167ffffffffffffffff1690819052600454969850889660001901146122085760048c6020015160010167ffffffffffffffff16815481106121cc57fe5b6000918252602091829020604080518082019091529101546001600160801b038082168352600160801b9091041691810191909152955061221f565b604080518082019091526000808252602082015295505b8085602001516001600160801b0316141561229e5760408c01805160010167ffffffffffffffff169081905289519597508795600019011461228757888c6040015160010167ffffffffffffffff168151811061227857fe5b6020026020010151945061229e565b604080518082019091526000808252602082015294505b612049565b5050895160010161ffff168a525061200d9050565b505050505050505b9250929050565b600060035482101561230a5760405162461bcd60e51b815260040180806020018281038252602d815260200180612dc1602d913960400191505060405180910390fd5b611d227f000000000000000000000000000000000000000000000000000000000000000063ffffffff1660035484038161234057fe5b04600101612979565b6001600160a01b038316600090815260056020526040812061236c9084846129c0565b9050600061237c600485856129c0565b90507f6b53edb1a2d26a789b4466210277239d9ab872345e93a9f6028058e71e64c186858460056000896001600160a01b03166001600160a01b0316815260200190815260200160002085815481106123d157fe5b600091825260209091200154600480546001600160801b0390921691869081106123f757fe5b60009182526020918290200154604080516001600160a01b03909616865261ffff909416918501919091526001600160801b0391821684840152166060830152519081900360800190a15050505050565b600154600160a01b900460ff166124905760405162461bcd60e51b8152600401808060200182810382526023815260200180612e1b6023913960400191505060405180910390fd5b6003546124e4576040805162461bcd60e51b815260206004820152601f60248201527f4e66745374616b696e673a207374616b696e67206e6f74207374617274656400604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461254b5760405162461bcd60e51b8152600401808060200182810382526024815260200180612d7c6024913960400191505060405180910390fd5b600061255683612afe565b90507f00000000000000000000000000000000000000000000000000000000000000006000612584426122c7565b905061259b848467ffffffffffffffff1683612349565b6001600160a01b03841660009081526006602052604090205461ffff1661267e5760006125c88284612901565b6040805160608101825261ffff92831681526004546000190167ffffffffffffffff908116602080840191825260008486018181526001600160a01b038d168252600690925294909420925183549151945161ffff1990921695169490941769ffffffffffffffff000019166201000093821693909302929092177fffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffff166a01000000000000000000009390921692909202179055505b60008581526007602052604090205461ffff600160f01b90910481169082168114156126db5760405162461bcd60e51b8152600401808060200182810382526023815260200180612e706023913960400191505060405180910390fd5b6040518060800160405280866001600160a01b031681526020018567ffffffffffffffff1681526020018361ffff168152602001600061ffff168152506007600088815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550604082015181600001601c6101000a81548161ffff021916908361ffff160217905550606082015181600001601e6101000a81548161ffff021916908361ffff1602179055509050507f233fb303155fae76e94af13009e2c90416950cf561d3cd13f807618243feda4a8583888760405180856001600160a01b03166001600160a01b031681526020018461ffff1681526020018381526020018267ffffffffffffffff16815260200194505050505060405180910390a1505050505050565b6000828201838110156128a1576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6000826128b757506000611d22565b828202828482816128c457fe5b04146128a15760405162461bcd60e51b8152600401808060200182810382526021815260200180612da06021913960400191505060405180910390fd5b600061ffff8316612959576040805162461bcd60e51b815260206004820181905260248201527f4e66745374616b696e673a206379636c652063616e6e6f74206265207a65726f604482015290519081900360640190fd5b8161ffff166001840361ffff168161296d57fe5b04600101905092915050565b60006201000082106129bc5760405162461bcd60e51b8152600401808060200182810382526026815260200180612cb36026913960400191505060405180910390fd5b5090565b8254600090818115612a7f5760018203925060008684815481106129e057fe5b60009182526020909120018054909150612a1690612a11906001600160801b0316600f89900b63ffffffff612bab16565b612c10565b81549092506001600160801b03600160801b9091041661ffff86161415612a735780547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166001600160801b0392909216919091179055506128a1565b60018401935050612a82565b50835b612a8a612c9b565b6001600160801b03918216815261ffff851660208083019182528854600181018a5560008a81529190912092519201805491518416600160801b029284167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117909216179055509392505050565b600060ff82811c9060f084901c81169060e085901c81169060b086901c16600184148015612b2c5750826001145b8015612b385750816002145b612b89576040805162461bcd60e51b815260206004820152601760248201527f4e66745374616b696e673a2077726f6e6720746f6b656e000000000000000000604482015290519081900360640190fd5b60009081526009602052604090205467ffffffffffffffff1695945050505050565b6000828201818312801590612bc05750838112155b80612bd55750600083128015612bd557508381125b6128a15760405162461bcd60e51b8152600401808060200182810382526021815260200180612d5b6021913960400191505060405180910390fd5b6000600160801b82106129bc5760405162461bcd60e51b8152600401808060200182810382526027815260200180612d346027913960400191505060405180910390fd5b604080516060810182526000808252602082018190529181019190915290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b60408051808201909152600080825260208201529056fe53616665436173743a2076616c756520646f65736e27742066697420696e20313620626974734e66745374616b696e673a20746f6b656e206e6f74207374616b6564206f7220696e636f727265637420746f6b656e206f776e65724f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737353616665436173743a2076616c756520646f65736e27742066697420696e2031323820626974735369676e6564536166654d6174683a206164646974696f6e206f766572666c6f774e66745374616b696e673a20636f6e7472616374206e6f742077686974656c6973746564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774e66745374616b696e673a2074696d657374616d7020707265636565647320636f6e74726163742073746172744e66745374616b696e673a20616c726561647920636f6d6d697474656420726577617264207363686564756c654e66745374616b696e673a20636f6e7472616374206973206e6f7420656e61626c65644e66745374616b696e673a206661696c656420746f206164642066756e647320746f207468652072657761726420706f6f6c4e66745374616b696e673a20756e7374616b656420746f6b656e20636f6f6c646f776e4e66745374616b696e673a206661696c656420746f207472616e7366657220726577617264734e66745374616b696e673a206661696c656420746f2077697468647261772066726f6d20746865207265776172647320706f6f6ca264697066735822122081955e225474796d05a47e8183c21d8e55ac458c001190a69d177b92393d0e3e64736f6c634300060800334e66745374616b696e673a20696e76616c696420706572696f64206c656e677468000000000000000000000000000000000000000000000000000000000001518000000000000000000000000000000000000000000000000000000000000000030000000000000000000000002af75676692817d85121353f0d6e8e9ae6ad5576000000000000000000000000557b933a7c2c45672b610f8954a3deb39a51a8ca00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001

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

000000000000000000000000000000000000000000000000000000000001518000000000000000000000000000000000000000000000000000000000000000030000000000000000000000002af75676692817d85121353f0d6e8e9ae6ad5576000000000000000000000000557b933a7c2c45672b610f8954a3deb39a51a8ca00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001

-----Decoded View---------------
Arg [0] : cycleLengthInSeconds_ (uint32): 86400
Arg [1] : periodLengthInCycles_ (uint16): 3
Arg [2] : inventoryContract (address): 0x2aF75676692817d85121353f0D6e8E9aE6AD5576
Arg [3] : revvContract (address): 0x557B933a7C2c45672B610F8954A3deB39a51A8Ca
Arg [4] : rarities (uint256[]): 0,1,2,3,4,5,6,7,8,9
Arg [5] : weights (uint64[]): 480,60,12,12,2,2,2,1,1,1

-----Encoded View---------------
28 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000015180
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [2] : 0000000000000000000000002af75676692817d85121353f0d6e8e9ae6ad5576
Arg [3] : 000000000000000000000000557b933a7c2c45672b610f8954a3deb39a51a8ca
Arg [4] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000220
Arg [6] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [17] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [18] : 00000000000000000000000000000000000000000000000000000000000001e0
Arg [19] : 000000000000000000000000000000000000000000000000000000000000003c
Arg [20] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [21] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [22] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [23] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [24] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [25] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [26] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [27] : 0000000000000000000000000000000000000000000000000000000000000001


Deployed ByteCode Sourcemap

61317:2534:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;61317:2534:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;24255:142:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;24255:142:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;31307:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;61368:49;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;61368:49:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;44694:124;;;:::i;31430:53::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;31430:53:0;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;31430:53:0;;;;;;;;;;;;;;;;;;;;;;;;31256:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31706:50;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;31706:50:0;;:::i;:::-;;;;;;;;;;;;;;;;31020:26;;;:::i;31055:31::-;;;:::i;36518:96::-;;;:::i;:::-;;31360:31;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;31360:31:0;;:::i;41557:439::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;41557:439:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31524:47;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;31524:47:0;-1:-1:-1;;;;;31524:47:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39207:1715;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;39207:1715:0;;:::i;17776:148::-;;;:::i;37049:245::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;37049:245:0;;:::i;45003:218::-;;;:::i;31613:47::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;31613:47:0;;:::i;:::-;;;;-1:-1:-1;;;;;31613:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17134:79;;;:::i;:::-;;;;-1:-1:-1;;;;;17134:79:0;;;;;;;;;;;;;;31133:44;;;:::i;31184:63::-;;;:::i;42632:1578::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;42632:1578:0;;;;:::i;37719:393::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;37719:393:0;;;;;;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;37719:393:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;37719:393:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;37719:393:0;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;37719:393:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;37719:393:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;37719:393:0;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;37719:393:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;37719:393:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;37719:393:0;;-1:-1:-1;37719:393:0;-1:-1:-1;37719:393:0;:::i;:::-;;;;;;;;;;;;;;;;;;;44464:98;;;:::i;36141:112::-;;;:::i;45406:242::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;45406:242:0;-1:-1:-1;;;;;45406:242:0;;:::i;31095:29::-;;;:::i;37424:287::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;37424:287:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;37424:287:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;37424:287:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;37424:287:0;;-1:-1:-1;37424:287:0;-1:-1:-1;37424:287:0;:::i;18079:244::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;18079:244:0;-1:-1:-1;;;;;18079:244:0;;:::i;34748:1152::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;34748:1152:0;;;;;;;;;;;;;;;;;;:::i;24255:142::-;24356:33;;24332:4;24356:33;;;;;;;;;;;;;;24255:142::o;31307:44::-;;;:::o;61368:49::-;;;;;;;;;;;;;;;:::o;44694:124::-;44745:6;44771:39;44789:20;44771:17;:39::i;:::-;44764:46;;44694:124;:::o;31430:53::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31430:53:0;;;;-1:-1:-1;;;;31430:53:0;;;;;-1:-1:-1;31430:53:0;:::o;31256:44::-;;;:::o;31706:50::-;;;;;;;;;;;;;:::o;31020:26::-;;;-1:-1:-1;;;31020:26:0;;;;;:::o;31055:31::-;;;;:::o;36518:96::-;17356:12;:10;:12::i;:::-;17346:6;;-1:-1:-1;;;;;17346:6:0;;;:22;;;17338:67;;;;;-1:-1:-1;;;17338:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36565:7:::1;:15:::0;;;::::1;::::0;;36596:10:::1;::::0;::::1;::::0;36575:5:::1;::::0;36596:10:::1;36518:96::o:0;31360:31::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31360:31:0;;;;-1:-1:-1;;;;31360:31:0;;;;;:::o;41557:439::-;41704:18;41737:14;41766;32056:7;;;;;;;;;;;32048:55;;;;-1:-1:-1;;;32048:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31806:14:::1;::::0;31798:63:::1;;;::::0;;-1:-1:-1;;;31798:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;41809:26:::2;;:::i;:::-;41841:39;41857:10;41869;41841:15;:39::i;:::-;-1:-1:-1::0;41905:17:0;;41943:13:::2;::::0;::::2;::::0;41976:12:::2;::::0;;::::2;::::0;41905:17;;41943:13;;-1:-1:-1;41976:12:0;-1:-1:-1;41557:439:0;-1:-1:-1;;;41557:439:0:o;31524:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39207:1715::-;39272:26;;:::i;:::-;-1:-1:-1;39301:19:0;;;;:10;:19;;;;;;;;;39272:48;;;;;;;;;-1:-1:-1;;;;;39272:48:0;;;;;;-1:-1:-1;;;39272:48:0;;;;;;;;;;;-1:-1:-1;;;39272:48:0;;;;;;;;;;;-1:-1:-1;;;39272:48:0;;;;;;;;;39360:10;39341:29;39333:95;;;;-1:-1:-1;;;39333:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39441:19;39463:14;39473:3;39463:9;:14::i;:::-;39494:7;;39441:36;;-1:-1:-1;;;;39494:7:0;;;;39490:832;;;39844:1;39818:9;:22;;;39803:12;:37;:42;;;;39795:85;;;;;-1:-1:-1;;;39795:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;39897:69;39914:10;39934:9;:16;;;39927:24;;39926:25;;39953:12;39897:16;:69::i;:::-;40109:1;40083:28;;;40224:38;;;;:23;;;:38;;;40279:19;;;:10;:19;;;;;;;;;:31;;;;;;;;;;;;;;;;-1:-1:-1;;;40279:31:0;;;;;;-1:-1:-1;;;40279:31:0;;;;;;-1:-1:-1;;;40279:31:0;;-1:-1:-1;;;;;40279:31:0;;;;-1:-1:-1;;40279:31:0;;;;;;;;;;;;;;;;;;;;;;;;39490:832;40338:82;;;;;;40386:4;40338:82;;;;40393:10;40338:82;;;;;;;;;;40414:1;40338:82;;;;;;;;;-1:-1:-1;40338:82:0;;;;;;;;-1:-1:-1;;;;;40338:22:0;:39;;;;:82;;;;;;;;;;;-1:-1:-1;40338:39:0;:82;;;2:2:-1;;;;27:1;24;17:12;2:2;40338:82:0;;;;;;;;;;;;;;40334:499;;40750:71;;;;;;40794:4;40750:71;;;;40801:10;40750:71;;;;;;;;;;;;-1:-1:-1;;;;;40750:22:0;:35;;;;:71;;;;;-1:-1:-1;;40750:71:0;;;;;;;-1:-1:-1;40750:35:0;:71;;;2:2:-1;;;;27:1;24;17:12;2:2;40750:71:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40750:71:0;;;;40334:499;40897:16;;;;;40850:64;;;40862:10;40850:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39207:1715;;;:::o;17776:148::-;17356:12;:10;:12::i;:::-;17346:6;;-1:-1:-1;;;;;17346:6:0;;;:22;;;17338:67;;;;;-1:-1:-1;;;17338:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17867:6:::1;::::0;17846:40:::1;::::0;17883:1:::1;::::0;-1:-1:-1;;;;;17867:6:0::1;::::0;17846:40:::1;::::0;17883:1;;17846:40:::1;17897:6;:19:::0;;-1:-1:-1;;17897:19:0::1;::::0;;17776:148::o;37049:245::-;17356:12;:10;:12::i;:::-;17346:6;;-1:-1:-1;;;;;17346:6:0;;;:22;;;17338:67;;;;;-1:-1:-1;;;17338:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32175:7:::1;::::0;-1:-1:-1;;;32175:7:0;::::1;;;32174:8;32166:52;;;::::0;;-1:-1:-1;;;32166:52:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;37157:49:::2;::::0;;;;;37187:10:::2;37157:49;::::0;::::2;::::0;;;;;;;;;-1:-1:-1;;;;;37157:20:0::2;:29;::::0;::::2;::::0;:49;;;;;::::2;::::0;;;;;;;;-1:-1:-1;37157:29:0;:49;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;37157:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;37157:49:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::2;4:2;-1:-1:::0;37157:49:0;37135:151:::2;;;;-1:-1:-1::0;;;37135:151:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37049:245:::0;:::o;45003:218::-;45098:13;:20;45061:7;;45137:11;45129:56;;;;;-1:-1:-1;;;45129:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45203:10:0;;-1:-1:-1;45003:218:0;:::o;31613:47::-;;;;;;;;;;;;-1:-1:-1;;;;;31613:47:0;;;;-1:-1:-1;;;31613:47:0;;;;;-1:-1:-1;;;31613:47:0;;;;;-1:-1:-1;;;31613:47:0;;;;:::o;17134:79::-;17199:6;;-1:-1:-1;;;;;17199:6:0;17134:79;:::o;31133:44::-;;;:::o;31184:63::-;;;:::o;42632:1578::-;32056:7;;-1:-1:-1;;;32056:7:0;;;;32048:55;;;;-1:-1:-1;;;32048:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31806:14:::1;::::0;31798:63:::1;;;::::0;;-1:-1:-1;;;31798:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;42714:26:::2;;:::i;:::-;-1:-1:-1::0;42754:10:0::2;42743:22;::::0;;;:10:::2;:22;::::0;;;;;;;;42714:51;;::::2;::::0;::::2;::::0;;;;::::2;::::0;::::2;::::0;;::::2;::::0;;::::2;::::0;::::2;::::0;;::::2;::::0;;;;;;::::2;::::0;;::::2;::::0;;;;;;;42779:26:::2;;:::i;:::-;42807:29;;:::i;:::-;42840:39;42856:10;42868;42840:15;:39::i;:::-;43008:10;42957:32;42992:27:::0;;;:15:::2;:27;::::0;;;;42778:101;;-1:-1:-1;42778:101:0;-1:-1:-1;43030:153:0::2;43069:12;:32;;;43037:64;;:9;:29;;;:64;;;43030:153;;;43125:13;43139:9;:29;;:31;;;;;;;;;;;;;::::0;43125:46:::2;;;;;;;;;;;::::0;;;::::2;::::0;;::::2;43118:53:::0;43030:153:::2;;;43199:13;::::0;::::2;::::0;:18:::2;;43195:57;;43234:7;;;;;;43195:57;43279:10;43268:22;::::0;;;:10:::2;:22;::::0;;;;:29;::::2;;43264:73;;43319:7;;;;;;43264:73;43349:34;;:::i;:::-;43400:20:::0;;43386:13;;-1:-1:-1;;43400:24:0;;;43386:39;::::2;;;;;;::::0;;;::::2;::::0;;;;43349:76:::2;::::0;;;;::::2;::::0;;;43386:39;::::2;43349:76:::0;-1:-1:-1;;;;;43349:76:0;;::::2;::::0;;-1:-1:-1;;;43349:76:0;;::::2;;::::0;;::::2;::::0;;;43486:13;;::::2;::::0;43466:17;;43349:76;;-1:-1:-1;43507:20:0::2;43466:33:::0;::::2;-1:-1:-1::0;;43466:37:0;43465:62:::2;43438:89;;::::0;43556:49;::::2;::::0;::::2;::::0;:141:::2;;-1:-1:-1::0;43668:24:0;;-1:-1:-1;;;;;43668:29:0::2;::::0;43556:141:::2;43538:389;;;43834:10;43823:22;::::0;;;:10:::2;:22;::::0;;;;43816:29;;;;;;43538:389:::2;;;43889:10;43878:22;::::0;;;:10:::2;:22;::::0;;;;;;;;:37;;;;;;::::2;::::0;;;::::2;::::0;-1:-1:-1;;43878:37:0;;::::2;;::::0;;::::2;;-1:-1:-1::0;;43878:37:0::2;::::0;::::2;::::0;;::::2;;;::::0;::::2;::::0;;;;::::2;::::0;;;::::2;;::::0;;43538:389:::2;43943:12;::::0;::::2;::::0;:17;43939:156:::2;;44027:12;::::0;;::::2;::::0;43985:55;;;;;44015:10:::2;43985:55;::::0;::::2;::::0;;;;;;;;;;-1:-1:-1;;;;;43985:20:0::2;:29;::::0;::::2;::::0;:55;;;;;::::2;::::0;;;;;;;;-1:-1:-1;43985:29:0;:55;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;43985:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;43985:55:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::2;4:2;-1:-1:::0;43985:55:0;43977:106:::2;;;;-1:-1:-1::0;;;43977:106:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44112:90;44127:10;44139:14;44149:3;44139:9;:14::i;:::-;44155:17:::0;;44174:13:::2;::::0;;::::2;::::0;44189:12:::2;::::0;;::::2;::::0;44112:90;;-1:-1:-1;;;;;44112:90:0;;::::2;::::0;;::::2;::::0;;::::2;::::0;;::::2;::::0;;;;;;::::2;::::0;;;;;;;::::2;::::0;;;;;;;;;;;;;;;;;;;::::2;31872:1;;;;;;42632:1578:::0;:::o;37719:393::-;37954:6;;37973:91;37993:14;;;37973:91;;;38029:23;38039:3;;38043:1;38039:6;;;;;;;;;;;;;38047:4;38029:9;:23::i;:::-;38009:3;;37973:91;;;-1:-1:-1;38081:23:0;;37719:393;-1:-1:-1;;;;;;;;;37719:393:0:o;44464:98::-;44514:6;44540:14;44550:3;44540:9;:14::i;36141:112::-;17356:12;:10;:12::i;:::-;17346:6;;-1:-1:-1;;;;;17346:6:0;;;:22;;;17338:67;;;;;-1:-1:-1;;;17338:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31933:14:::1;::::0;:19;31925:63:::1;;;::::0;;-1:-1:-1;;;31925:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;36217:3:::2;36200:14;:20:::0;36236:9:::2;::::0;::::2;::::0;;;::::2;36141:112::o:0;45406:242::-;-1:-1:-1;;;;;45515:23:0;;45478:7;45515:23;;;:15;:23;;;;;:30;45564:11;45556:56;;;;;-1:-1:-1;;;45556:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45630:10:0;;45406:242;-1:-1:-1;;45406:242:0:o;31095:29::-;;;;:::o;37424:287::-;37630:6;37649:19;37659:2;37663:4;37649:9;:19::i;:::-;-1:-1:-1;37686:17:0;37424:287;;;;;;;;:::o;18079:244::-;17356:12;:10;:12::i;:::-;17346:6;;-1:-1:-1;;;;;17346:6:0;;;:22;;;17338:67;;;;;-1:-1:-1;;;17338:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18168:22:0;::::1;18160:73;;;;-1:-1:-1::0;;;18160:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18270:6;::::0;18249:38:::1;::::0;-1:-1:-1;;;;;18249:38:0;;::::1;::::0;18270:6:::1;::::0;18249:38:::1;::::0;18270:6:::1;::::0;18249:38:::1;18298:6;:17:::0;;-1:-1:-1;;18298:17:0::1;-1:-1:-1::0;;;;;18298:17:0;;;::::1;::::0;;;::::1;::::0;;18079:244::o;34748:1152::-;17356:12;:10;:12::i;:::-;17346:6;;-1:-1:-1;;;;;17346:6:0;;;:22;;;17338:67;;;;;-1:-1:-1;;;17338:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34913:16:::1;::::0;::::1;::::0;;::::1;::::0;:44:::1;;;34948:9;34933:24;;:11;:24;;;;34913:44;34905:87;;;::::0;;-1:-1:-1;;;34905:87:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;35073:14;::::0;35036:20:::1;::::0;35073:19;35069:214:::1;;35150:40;35168:21;35150:17;:40::i;:::-;35135:55;;:11;:55;;;;35109:162;;;;-1:-1:-1::0;;;35109:162:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35300:28;::::0;::::1;35295:163;35340:9;35330:19;;:6;:19;35295:163;;35402:23;::::0;;;:15:::1;:23;::::0;;;;;:44:::1;::::0;35430:15;35402:44:::1;:27;:44;:::i;:::-;35376:23;::::0;;;:15:::1;:23;::::0;;;;:70;35351:8:::1;;35295:163;;;;35470:20;35493:75;35552:11;35540:9;:23;35566:1;35540:27;35493:75;;:42;35513:21;35493:42;;:15;:19;;:42;;;;:::i;:::-;:46:::0;:75:::1;:46;:75;:::i;:::-;35600:16;::::0;35470:98;;-1:-1:-1;35600:34:0::1;::::0;35470:98;35600:34:::1;:20;:34;:::i;:::-;35581:16;:53:::0;35669:74:::1;::::0;;;;;35703:10:::1;35669:74;::::0;::::1;::::0;35723:4:::1;35669:74:::0;;;;;;;;;;;;-1:-1:-1;;;;;35669:20:0::1;:33;::::0;::::1;::::0;:74;;;;;::::1;::::0;;;;;;;;-1:-1:-1;35669:33:0;:74;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;35669:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;35669:74:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;35669:74:0;35647:174:::1;;;;-1:-1:-1::0;;;35647:174:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35839:53;::::0;;::::1;::::0;;::::1;::::0;;;::::1;;::::0;::::1;::::0;;;;;;;;;::::1;::::0;;;;;;;::::1;17416:1;;34748:1152:::0;;;:::o;58404:163::-;58484:6;58510:49;58521:14;58531:3;58521:9;:14::i;:::-;58537:21;58510:10;:49::i;:::-;58503:56;58404:163;-1:-1:-1;;58404:163:0:o;15682:106::-;15770:10;15682:106;:::o;48024:5717::-;48134:26;;:::i;:::-;48162;;:::i;:::-;48242:15;;;48238:73;;48274:25;;48238:73;48360:13;:20;48356:83;;48402:25;;48356:83;-1:-1:-1;;;;;;48463:18:0;;;;;;:10;:18;;;;;;;;;48451:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48492:36;;;48581:80;;48624:25;;48581:80;48704:20;48673:28;48759:40;48704:20;48759:17;:40::i;:::-;48735:64;;48880:14;48860:34;;:9;:16;;;:34;;;48856:92;;;-1:-1:-1;48911:25:0;;-1:-1:-1;48911:25:0;48856:92;-1:-1:-1;;;;;49048:23:0;;;;;;:15;:23;;;;;;;;49014:57;;;;;;;;;;;;;;;;;:31;;:57;;49048:23;;49014:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49014:57:0;;;;;-1:-1:-1;;;49014:57:0;;;;;;;;;;;;;;;;;;;;;;;;;49084:30;;:::i;:::-;49117:13;49131:9;:29;;;49117:44;;;;;;;;;;;;;;;;;;;49084:77;;;;;;;;;49117:44;;49084:77;-1:-1:-1;;;;;49084:77:0;;;;;-1:-1:-1;;;49084:77:0;;;;;;;;;;;;-1:-1:-1;49172:30:0;;:::i;:::-;49205:13;49219:9;:29;;;49205:44;;;;;;;;;;;;;;;;49172:77;;49260:34;;:::i;:::-;49305;;:::i;:::-;49389:13;:20;49356:29;;;;:57;;-1:-1:-1;;49389:24:0;;;49356:57;49352:159;;49451:13;49465:9;:29;;;49497:1;49465:33;49451:48;;;;;;;;;;;;;;;;;;;49430:69;;;;;;;;;49451:48;;49430:69;-1:-1:-1;;;;;49430:69:0;;;;;-1:-1:-1;;;49430:69:0;;;;;;;;;;;;-1:-1:-1;49352:159:0;49581:1;49558:13;:20;:24;49525:9;:29;;;:57;;;49521:159;;49620:13;49634:9;:29;;;49666:1;49634:33;49620:48;;;;;;;;;;;;;;;;49599:69;;49521:159;49765:16;;49732:49;49748:33;;;49732:49;;:13;;;:49;;;49798:26;;;;49794:85;;;49841:26;;;:13;;;:26;49794:85;50115:13;;;;50096:16;;:32;;-1:-1:-1;50174:3522:0;50201:14;50181:34;;:9;:16;;;:34;;;50174:3522;;50262:16;;50346:33;;;;50232:27;50346:33;;;:15;:33;;;;;;50262:40;;;50305:1;50262:44;;;;50346:33;50415:44;;;;;50394:65;;50557:3093;50576:20;50564:32;;:8;:32;50557:3093;;50844:10;50816:14;:25;;;-1:-1:-1;;;;;50816:38:0;;50812:125;;;50892:14;:25;;;-1:-1:-1;;;;;50879:38:0;;;50812:125;50987:10;50959:14;:25;;;-1:-1:-1;;;;;50959:38:0;;50955:125;;;51035:14;:25;;;-1:-1:-1;;;;;51022:38:0;;;50955:125;-1:-1:-1;51510:29:0;;;;51455:31;;;;-1:-1:-1;;;;;51510:34:0;;;;;51509:82;;;51582:8;51550:18;:29;;;-1:-1:-1;;;;;51550:40:0;;51509:82;51505:171;;;-1:-1:-1;51627:29:0;;;;-1:-1:-1;;;;;51616:40:0;51505:171;51829:20;;-1:-1:-1;;;;;51829:25:0;;;;;51828:58;;-1:-1:-1;51860:20:0;;-1:-1:-1;;;;;51860:25:0;;;51828:58;:83;;;;-1:-1:-1;51891:19:0;;;51828:83;51824:359;;;52009:20;;51936:22;;51961:69;;-1:-1:-1;;;;;51961:69:0;:43;51962:21;;;51989:14;51961:43;:27;:43;:::i;:69::-;52071:20;;51936:94;;-1:-1:-1;;;;;;52053:38:0;51936:94;52053:38;;;;;;;;52131:32;52148:14;52131:5;:12;;;:16;;:32;;;;:::i;:::-;52116:12;;;:47;-1:-1:-1;51824:359:0;52468:8;52435:18;:29;;;-1:-1:-1;;;;;52435:41:0;;52431:478;;;52561:29;;;52559:31;;;;;;;;;;52652:13;:20;52518:18;;-1:-1:-1;52518:18:0;;-1:-1:-1;;52652:24:0;52619:57;52615:275;;52726:13;52740:9;:29;;;52772:1;52740:33;52726:48;;;;;;;;;;;;;;;;;;;52705:69;;;;;;;;;52726:48;;52705:69;-1:-1:-1;;;;;52705:69:0;;;;;-1:-1:-1;;;52705:69:0;;;;;;;;;;;;-1:-1:-1;52615:275:0;;;52852:14;;;;;;;;;-1:-1:-1;52852:14:0;;;;;;;;-1:-1:-1;52615:275:0;53194:8;53161:18;:29;;;-1:-1:-1;;;;;53161:41:0;;53157:478;;;53287:29;;;53285:31;;;;;;;;;;53378:20;;53244:18;;-1:-1:-1;53244:18:0;;-1:-1:-1;;53378:24:0;53345:57;53341:275;;53452:13;53466:9;:29;;;53498:1;53466:33;53452:48;;;;;;;;;;;;;;;;53431:69;;53341:275;;;53578:14;;;;;;;;;-1:-1:-1;53578:14:0;;;;;;;;-1:-1:-1;53341:275:0;50557:3093;;;-1:-1:-1;;53666:18:0;;;;;;;;-1:-1:-1;50174:3522:0;;-1:-1:-1;50174:3522:0;;-1:-1:-1;;;;;;;48024:5717:0;;;;;;:::o;57325:270::-;57386:6;57426:14;;57413:9;:27;;57405:85;;;;-1:-1:-1;;;57405:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57508:79;57549:20;57541:29;;57523:14;;57511:9;:26;57510:60;;;;;;57574:1;57509:66;57508:77;:79::i;54094:548::-;-1:-1:-1;;;;;54275:23:0;;54230:27;54275:23;;;:15;:23;;;;;54260:65;;54300:10;54312:12;54260:14;:65::i;:::-;54230:95;;54336:27;54366:55;54381:13;54396:10;54408:12;54366:14;:55::i;:::-;54336:85;;54439:195;54470:6;54491:12;54518:15;:23;54534:6;-1:-1:-1;;;;;54518:23:0;-1:-1:-1;;;;;54518:23:0;;;;;;;;;;;;54542:19;54518:44;;;;;;;;;;;;;;;;;:50;54583:13;:34;;-1:-1:-1;;;;;54518:50:0;;;;54597:19;;54583:34;;;;;;;;;;;;;;;;:40;54439:195;;;-1:-1:-1;;;;;54439:195:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54439:195:0;;;;;;;54583:40;54439:195;;;;;;;;;;;;;54094:548;;;;;:::o;46175:1285::-;32056:7;;-1:-1:-1;;;32056:7:0;;;;32048:55;;;;-1:-1:-1;;;32048:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31806:14:::1;::::0;31798:63:::1;;;::::0;;-1:-1:-1;;;31798:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;46288:22:::2;-1:-1:-1::0;;;;;46280:45:0::2;46315:10;46280:45;46272:94;;;;-1:-1:-1::0;;;46272:94:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46379:13;46395:33;46420:7;46395:24;:33::i;:::-;46379:49:::0;-1:-1:-1;46472:20:0::2;46441:28;46525:14;46535:3;46525:9;:14::i;:::-;46503:36;;46552:58;46569:10;46588:6;46581:14;;46597:12;46552:16;:58::i;:::-;-1:-1:-1::0;;;;;46871:22:0;::::2;;::::0;;;:10:::2;:22;::::0;;;;:29;::::2;;46867:238;;46922:20;46945:47;46956:12;46970:21;46945:10;:47::i;:::-;47032:61;::::0;;::::2;::::0;::::2;::::0;;::::2;::::0;;::::2;::::0;;47064:13:::2;:20:::0;-1:-1:-1;;47064:24:0;47032:61:::2;::::0;;::::2;;::::0;;::::2;::::0;;;-1:-1:-1;47032:61:0;;;;;;-1:-1:-1;;;;;47007:22:0;::::2;::::0;;:10:::2;:22:::0;;;;;;;:86;;;;;;;;-1:-1:-1;;47007:86:0;;::::2;::::0;::::2;::::0;;;::::2;-1:-1:-1::0;;47007:86:0::2;::::0;;;::::2;::::0;;;::::2;::::0;;;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;::::2;;::::0;;-1:-1:-1;46867:238:0::2;47117:20;47140:19:::0;;;:10:::2;:19;::::0;;;;:33;::::2;-1:-1:-1::0;;;47140:33:0;;::::2;::::0;::::2;::::0;47192:29;::::2;::::0;::::2;;47184:77;;;;-1:-1:-1::0;;;47184:77:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47336:46;;;;;;;;47346:10;-1:-1:-1::0;;;;;47336:46:0::2;;;;;47358:6;47336:46;;;;;;47366:12;47336:46;;;;;;47380:1;47336:46;;;;::::0;47314:10:::2;:19;47325:7;47314:19;;;;;;;;;;;:68;;;;;;;;;;;;;-1:-1:-1::0;;;;;47314:68:0::2;;;;;-1:-1:-1::0;;;;;47314:68:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47400:52;47410:10;47422:12;47436:7;47445:6;47400:52;;;;-1:-1:-1::0;;;;;47400:52:0::2;-1:-1:-1::0;;;;;47400:52:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31872:1;;;;46175:1285:::0;;:::o;7802:181::-;7860:7;7892:5;;;7916:6;;;;7908:46;;;;;-1:-1:-1;;;7908:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;7974:1;7802:181;-1:-1:-1;;;7802:181:0:o;9156:471::-;9214:7;9459:6;9455:47;;-1:-1:-1;9489:1:0;9482:8;;9455:47;9526:5;;;9530:1;9526;:5;:1;9550:5;;;;;:10;9542:56;;;;-1:-1:-1;;;9542:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57978:226;58065:6;58092:10;;;58084:55;;;;;-1:-1:-1;;;58084:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58171:21;58157:35;;58166:1;58158:5;:9;58157:35;;;;;;;;58195:1;58157:39;58150:46;;57978:226;;;;:::o;2674:179::-;2730:6;2765:5;2757;:13;2749:65;;;;-1:-1:-1;;;2749:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2839:5:0;2674:179::o;55172:1683::-;55374:14;;55316:21;;;55437:18;;55433:1211;;55550:1;55534:13;:17;55518:33;;55566:25;55594:7;55602:13;55594:22;;;;;;;;;;;;;;;;;55662:14;;55594:22;;-1:-1:-1;55647:59:0;;55655:38;;-1:-1:-1;;;;;55662:14:0;55655:38;;;;;:26;:38;:::i;:::-;55647:57;:59::i;:::-;55727:19;;55631:75;;-1:-1:-1;;;;;;;;;55727:19:0;;;;:35;;;;55723:219;;;55857:30;;;;-1:-1:-1;;;;;55857:30:0;;;;;;;;;;-1:-1:-1;55906:20:0;;55723:219;56166:1;56149:18;;;;55433:1211;;;;-1:-1:-1;56621:10:0;55433:1211;56656:24;;:::i;:::-;-1:-1:-1;;;;;56691:30:0;;;;;56732:34;;;:19;;;;:34;;;27:10:-1;;39:1;23:18;;45:23;;56691:14:0;56825:22;;;;;;;;;;;;;;;;;-1:-1:-1;;;56825:22:0;;;;;;;;;;;;;;;;;;-1:-1:-1;55172:1683:0;;;;;:::o;62739:1109::-;62828:6;63015:3;63006:12;;;;63064:3;63055:12;;;63054:21;;;63118:3;63109:12;;;63108:21;;;63172:3;63163:12;;;63162:21;63022:1;63710:16;;:34;;;;;63730:9;63743:1;63730:14;63710:34;:54;;;;;63748:11;63763:1;63748:16;63710:54;63702:90;;;;;-1:-1:-1;;;63702:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;63812:28;;;;:15;:28;;;;;;;;;62739:1109;-1:-1:-1;;;;;62739:1109:0:o;14830:215::-;14886:6;14916:5;;;14941:6;;;;;;:16;;;14956:1;14951;:6;;14941:16;14940:38;;;;14967:1;14963;:5;:14;;;;;14976:1;14972;:5;14963:14;14932:84;;;;-1:-1:-1;;;14932:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1235:184;1292:7;-1:-1:-1;;;1320:5:0;:14;1312:67;;;;-1:-1:-1;;;1312:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://81955e225474796d05a47e8183c21d8e55ac458c001190a69d177b92393d0e3e
Block Transaction Difficulty Gas Used Reward
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.

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.