ETH Price: $3,325.41 (-2.73%)

Contract

0x93c2bad041Fa79B4026654667DCb61e9FeE04250
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Insert Keys143974362022-03-16 11:56:391016 days ago1647431799IN
0x93c2bad0...9FeE04250
0 ETH0.0070577317.81013994
Insert Keys143880082022-03-15 0:31:321018 days ago1647304292IN
0x93c2bad0...9FeE04250
0 ETH0.0083456920.80567031
Insert Keys143879292022-03-15 0:12:471018 days ago1647303167IN
0x93c2bad0...9FeE04250
0 ETH0.0087949221.92614781
Insert Keys143879212022-03-15 0:11:201018 days ago1647303080IN
0x93c2bad0...9FeE04250
0 ETH0.0082500720.8188593
Insert Keys143717862022-03-12 11:53:411020 days ago1647086021IN
0x93c2bad0...9FeE04250
0 ETH0.0050124212.49566211
Insert Keys143709502022-03-12 8:46:541020 days ago1647074814IN
0x93c2bad0...9FeE04250
0 ETH0.0052962213.3846186
Insert Keys143709152022-03-12 8:39:021020 days ago1647074342IN
0x93c2bad0...9FeE04250
0 ETH0.0053571213.53902635
Insert Keys143709042022-03-12 8:36:531020 days ago1647074213IN
0x93c2bad0...9FeE04250
0 ETH0.0053090513.25226461
Insert Keys143708452022-03-12 8:24:271020 days ago1647073467IN
0x93c2bad0...9FeE04250
0 ETH0.0060281215.05034343
Insert Keys143661342022-03-11 14:42:451021 days ago1647009765IN
0x93c2bad0...9FeE04250
0 ETH0.0056433414.09276224
Insert Keys143658512022-03-11 13:37:511021 days ago1647005871IN
0x93c2bad0...9FeE04250
0 ETH0.0056804214.14677739
Insert Keys143657382022-03-11 13:12:401021 days ago1647004360IN
0x93c2bad0...9FeE04250
0 ETH0.0067779617.10095757
Insert Keys143657072022-03-11 13:05:291021 days ago1647003929IN
0x93c2bad0...9FeE04250
0 ETH0.0080390120.04371715
Insert Keys143655222022-03-11 12:24:331021 days ago1647001473IN
0x93c2bad0...9FeE04250
0 ETH0.0058019214.63119693
Insert Keys143621762022-03-10 23:50:111022 days ago1646956211IN
0x93c2bad0...9FeE04250
0 ETH0.0079079319.72613595
Insert Keys143619812022-03-10 23:05:371022 days ago1646953537IN
0x93c2bad0...9FeE04250
0 ETH0.0076120818.97751405
Insert Keys143619742022-03-10 23:04:431022 days ago1646953483IN
0x93c2bad0...9FeE04250
0 ETH0.0075176818.74093151
Insert Keys143619672022-03-10 23:03:211022 days ago1646953401IN
0x93c2bad0...9FeE04250
0 ETH0.0078733219.86261067
Insert Keys143615132022-03-10 21:21:091022 days ago1646947269IN
0x93c2bad0...9FeE04250
0 ETH0.01018125.34859542
Insert Keys143613232022-03-10 20:40:031022 days ago1646944803IN
0x93c2bad0...9FeE04250
0 ETH0.0083664621.09568067
Insert Keys143613042022-03-10 20:36:211022 days ago1646944581IN
0x93c2bad0...9FeE04250
0 ETH0.0077957719.4393443
Insert Keys143610652022-03-10 19:44:191022 days ago1646941459IN
0x93c2bad0...9FeE04250
0 ETH0.013710634.5931362
Insert Keys143600902022-03-10 16:12:151022 days ago1646928735IN
0x93c2bad0...9FeE04250
0 ETH0.0119321829.74695452
Insert Keys143600232022-03-10 15:56:501022 days ago1646927810IN
0x93c2bad0...9FeE04250
0 ETH0.0097702424.64805367
Insert Keys143556682022-03-09 23:44:111023 days ago1646869451IN
0x93c2bad0...9FeE04250
0 ETH0.0120326130
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Crates2020Locksmith

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 2021-01-08
*/

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

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

// SPDX-License-Identifier: MIT

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 @openzeppelin/contracts/cryptography/[email protected]

pragma solidity ^0.6.0;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        // Check the signature length
        if (signature.length != 65) {
            revert("ECDSA: invalid signature length");
        }

        // Divide the signature in r, s and v variables
        bytes32 r;
        bytes32 s;
        uint8 v;

        // ecrecover takes the signature parameters, and the only way to get them
        // currently is to use assembly.
        // solhint-disable-next-line no-inline-assembly
        assembly {
            r := mload(add(signature, 0x20))
            s := mload(add(signature, 0x40))
            v := byte(0, mload(add(signature, 0x60)))
        }

        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            revert("ECDSA: invalid signature 's' value");
        }

        if (v != 27 && v != 28) {
            revert("ECDSA: invalid signature 'v' value");
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        require(signer != address(0), "ECDSA: invalid signature");

        return signer;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * replicates the behavior of the
     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]
     * JSON-RPC method.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }
}


// 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 @animoca/f1dt-ethereum-contracts/contracts/metadata/[email protected]

pragma solidity 0.6.8;

library Crates2020RNGLib {

    struct Metadata {
        uint256 tokenType;
        uint256 tokenSubType;
        uint256 model;
        uint256 team;
        uint256 tokenRarity;
        uint256 label;
        uint256 driver;
        uint256 stat1;
        uint256 stat2;
        uint256 stat3;
        uint256 counter;
    }

    uint256 constant CRATE_TIER_LEGENDARY = 0;
    uint256 constant CRATE_TIER_EPIC = 1;
    uint256 constant CRATE_TIER_RARE = 2;
    uint256 constant CRATE_TIER_COMMON = 3;

    //============================================================================================/
    //================================== Metadata Mappings  ======================================/
    //============================================================================================/

    uint256 internal constant _NF_FLAG = 1 << 255;

    uint256 internal constant _SEASON_ID_2020 = 3;

    uint256 internal constant _TYPE_ID_CAR = 1;
    uint256 internal constant _TYPE_ID_DRIVER = 2;
    uint256 internal constant _TYPE_ID_PART = 3;
    uint256 internal constant _TYPE_ID_GEAR = 4;
    uint256 internal constant _TYPE_ID_TYRES = 5;

    uint256 internal constant _TEAM_ID_ALFA_ROMEO_RACING = 1;
    uint256 internal constant _TEAM_ID_SCUDERIA_FERRARI = 2;
    uint256 internal constant _TEAM_ID_HAAS_F1_TEAM = 3;
    uint256 internal constant _TEAM_ID_MCLAREN_F1_TEAM = 4;
    uint256 internal constant _TEAM_ID_MERCEDES_AMG_PETRONAS_MOTORSPORT = 5;
    uint256 internal constant _TEAM_ID_SPSCORE_RACING_POINT_F1_TEAM = 6;
    uint256 internal constant _TEAM_ID_ASTON_MARTIN_RED_BULL_RACING = 7;
    uint256 internal constant _TEAM_ID_RENAULT_F1_TEAM = 8;
    uint256 internal constant _TEAM_ID_RED_BULL_TORO_ROSSO_HONDA = 9;
    uint256 internal constant _TEAM_ID_ROKIT_WILLIAMS_RACING = 10;

    uint256 internal constant _DRIVER_ID_KIMI_RAIKKONEN = 7;
    uint256 internal constant _DRIVER_ID_ANTONIO_GIOVINAZZI = 99;
    uint256 internal constant _DRIVER_ID_SEBASTIAN_VETTEL = 5;
    uint256 internal constant _DRIVER_ID_CHARLES_LECLERC = 16;
    uint256 internal constant _DRIVER_ID_ROMAIN_GROSJEAN = 8;
    uint256 internal constant _DRIVER_ID_KEVIN_MAGNUSSEN = 20;
    uint256 internal constant _DRIVER_ID_LANDO_NORRIS = 4;
    uint256 internal constant _DRIVER_ID_CARLOS_SAINZ = 55;
    uint256 internal constant _DRIVER_ID_LEWIS_HAMILTON = 44;
    uint256 internal constant _DRIVER_ID_VALTTERI_BOTTAS = 77;
    uint256 internal constant _DRIVER_ID_SERGIO_PEREZ = 11;
    uint256 internal constant _DRIVER_ID_LANCE_STROLL = 18;
    uint256 internal constant _DRIVER_ID_PIERRE_GASLY = 10;
    uint256 internal constant _DRIVER_ID_MAX_VERSTAPPEN = 33;
    uint256 internal constant _DRIVER_ID_DANIEL_RICCIARDO = 3;
    // uint256 internal constant _DRIVER_ID_NICO_HULKENBERG = 27;
    uint256 internal constant _DRIVER_ID_ALEXANDER_ALBON = 23;
    uint256 internal constant _DRIVER_ID_DANIIL_KVYAT = 26;
    uint256 internal constant _DRIVER_ID_GEORGE_RUSSEL = 63;
    // uint256 internal constant _DRIVER_ID_ROBERT_KUBICA = 88;
    uint256 internal constant _DRIVER_ID_ESTEBAN_OCON = 31;
    uint256 internal constant _DRIVER_ID_NICHOLAS_LATIFI = 6;


    //============================================================================================/
    //================================ Racing Stats Min/Max  =====================================/
    //============================================================================================/

    uint256 internal constant _RACING_STATS_T1_RARITY_1_MIN = 800;
    uint256 internal constant _RACING_STATS_T1_RARITY_1_MAX = 900;
    uint256 internal constant _RACING_STATS_T1_RARITY_2_MIN = 710;
    uint256 internal constant _RACING_STATS_T1_RARITY_2_MAX = 810;
    uint256 internal constant _RACING_STATS_T1_RARITY_3_MIN = 680;
    uint256 internal constant _RACING_STATS_T1_RARITY_3_MAX = 780;
    uint256 internal constant _RACING_STATS_T1_RARITY_4_MIN = 610;
    uint256 internal constant _RACING_STATS_T1_RARITY_4_MAX = 710;
    uint256 internal constant _RACING_STATS_T1_RARITY_5_MIN = 570;
    uint256 internal constant _RACING_STATS_T1_RARITY_5_MAX = 680;
    uint256 internal constant _RACING_STATS_T1_RARITY_6_MIN = 540;
    uint256 internal constant _RACING_STATS_T1_RARITY_6_MAX = 650;
    uint256 internal constant _RACING_STATS_T1_RARITY_7_MIN = 500;
    uint256 internal constant _RACING_STATS_T1_RARITY_7_MAX = 580;
    uint256 internal constant _RACING_STATS_T1_RARITY_8_MIN = 480;
    uint256 internal constant _RACING_STATS_T1_RARITY_8_MAX = 550;
    uint256 internal constant _RACING_STATS_T1_RARITY_9_MIN = 450;
    uint256 internal constant _RACING_STATS_T1_RARITY_9_MAX = 540;

    uint256 internal constant _RACING_STATS_T2_RARITY_1_MIN = 500;
    uint256 internal constant _RACING_STATS_T2_RARITY_1_MAX = 600;
    uint256 internal constant _RACING_STATS_T2_RARITY_2_MIN = 420;
    uint256 internal constant _RACING_STATS_T2_RARITY_2_MAX = 520;
    uint256 internal constant _RACING_STATS_T2_RARITY_3_MIN = 380;
    uint256 internal constant _RACING_STATS_T2_RARITY_3_MAX = 480;
    uint256 internal constant _RACING_STATS_T2_RARITY_4_MIN = 340;
    uint256 internal constant _RACING_STATS_T2_RARITY_4_MAX = 440;
    uint256 internal constant _RACING_STATS_T2_RARITY_5_MIN = 330;
    uint256 internal constant _RACING_STATS_T2_RARITY_5_MAX = 430;
    uint256 internal constant _RACING_STATS_T2_RARITY_6_MIN = 290;
    uint256 internal constant _RACING_STATS_T2_RARITY_6_MAX = 390;
    uint256 internal constant _RACING_STATS_T2_RARITY_7_MIN = 250;
    uint256 internal constant _RACING_STATS_T2_RARITY_7_MAX = 350;
    uint256 internal constant _RACING_STATS_T2_RARITY_8_MIN = 240;
    uint256 internal constant _RACING_STATS_T2_RARITY_8_MAX = 340;
    uint256 internal constant _RACING_STATS_T2_RARITY_9_MIN = 200;
    uint256 internal constant _RACING_STATS_T2_RARITY_9_MAX = 300;

    uint256 internal constant _RACING_STATS_T3_RARITY_1_MIN = 500;
    uint256 internal constant _RACING_STATS_T3_RARITY_1_MAX = 600;
    uint256 internal constant _RACING_STATS_T3_RARITY_2_MIN = 420;
    uint256 internal constant _RACING_STATS_T3_RARITY_2_MAX = 520;
    uint256 internal constant _RACING_STATS_T3_RARITY_3_MIN = 380;
    uint256 internal constant _RACING_STATS_T3_RARITY_3_MAX = 480;
    uint256 internal constant _RACING_STATS_T3_RARITY_4_MIN = 340;
    uint256 internal constant _RACING_STATS_T3_RARITY_4_MAX = 440;
    uint256 internal constant _RACING_STATS_T3_RARITY_5_MIN = 330;
    uint256 internal constant _RACING_STATS_T3_RARITY_5_MAX = 430;
    uint256 internal constant _RACING_STATS_T3_RARITY_6_MIN = 290;
    uint256 internal constant _RACING_STATS_T3_RARITY_6_MAX = 390;
    uint256 internal constant _RACING_STATS_T3_RARITY_7_MIN = 250;
    uint256 internal constant _RACING_STATS_T3_RARITY_7_MAX = 350;
    uint256 internal constant _RACING_STATS_T3_RARITY_8_MIN = 240;
    uint256 internal constant _RACING_STATS_T3_RARITY_8_MAX = 340;
    uint256 internal constant _RACING_STATS_T3_RARITY_9_MIN = 200;
    uint256 internal constant _RACING_STATS_T3_RARITY_9_MAX = 300;

    //============================================================================================/
    //================================== Types Drop Rates  =======================================/
    //============================================================================================/

    uint256 internal constant _TYPE_DROP_RATE_THRESH_COMPONENT = 82500;

    //============================================================================================/
    //================================== Rarity Drop Rates  ======================================/
    //============================================================================================/

    uint256 internal constant _COMMON_CRATE_DROP_RATE_THRESH_COMMON = 98.899 * 1000;
    uint256 internal constant _COMMON_CRATE_DROP_RATE_THRESH_RARE = 1 * 1000 + _COMMON_CRATE_DROP_RATE_THRESH_COMMON;
    uint256 internal constant _COMMON_CRATE_DROP_RATE_THRESH_EPIC = 0.1 * 1000 + _COMMON_CRATE_DROP_RATE_THRESH_RARE;

    uint256 internal constant _RARE_CRATE_DROP_RATE_THRESH_COMMON = 96.490 * 1000;
    uint256 internal constant _RARE_CRATE_DROP_RATE_THRESH_RARE = 2.5 * 1000 + _RARE_CRATE_DROP_RATE_THRESH_COMMON;
    uint256 internal constant _RARE_CRATE_DROP_RATE_THRESH_EPIC = 1 * 1000 + _RARE_CRATE_DROP_RATE_THRESH_RARE;

    uint256 internal constant _EPIC_CRATE_DROP_RATE_THRESH_COMMON = 92.4 * 1000;
    uint256 internal constant _EPIC_CRATE_DROP_RATE_THRESH_RARE = 5 * 1000 + _EPIC_CRATE_DROP_RATE_THRESH_COMMON;
    uint256 internal constant _EPIC_CRATE_DROP_RATE_THRESH_EPIC = 2.5 * 1000 + _EPIC_CRATE_DROP_RATE_THRESH_RARE;

    uint256 internal constant _LEGENDARY_CRATE_DROP_RATE_THRESH_COMMON = 84 * 1000;
    uint256 internal constant _LEGENDARY_CRATE_DROP_RATE_THRESH_RARE = 10 * 1000 + _LEGENDARY_CRATE_DROP_RATE_THRESH_COMMON;
    uint256 internal constant _LEGENDARY_CRATE_DROP_RATE_THRESH_EPIC = 5 * 1000 + _LEGENDARY_CRATE_DROP_RATE_THRESH_RARE;

    // Uses crateSeed bits [0;10[
    function generateCrate(uint256 crateSeed, uint256 crateTier, uint256 counter) internal pure returns (uint256[] memory tokens) {
        tokens = new uint256[](5);
        if (crateTier == CRATE_TIER_COMMON) {
            uint256 guaranteedRareDropIndex = crateSeed % 5;

            for (uint256 i = 0; i != 5; ++i) {
                uint256 tokenSeed = uint256(keccak256(abi.encodePacked(crateSeed, i)));
                tokens[i] = _makeTokenId(
                    _generateMetadata(
                        tokenSeed,
                        crateTier,
                        counter,
                        i,
                        i == guaranteedRareDropIndex? CRATE_TIER_RARE: CRATE_TIER_COMMON
                    )
                );
            }
        } else if (crateTier == CRATE_TIER_RARE) {
            (
                uint256 guaranteedRareDropIndex1,
                uint256 guaranteedRareDropIndex2,
                uint256 guaranteedRareDropIndex3
            ) = _generateThreeTokenIndices(crateSeed);

            for (uint256 i = 0; i != 5; ++i) {
                uint256 tokenSeed = uint256(keccak256(abi.encodePacked(crateSeed, i)));
                tokens[i] = _makeTokenId(
                    _generateMetadata(
                        tokenSeed,
                        crateTier,
                        counter,
                        i,
                        (
                            i == guaranteedRareDropIndex1 ||
                            i == guaranteedRareDropIndex2 ||
                            i == guaranteedRareDropIndex3
                        ) ? CRATE_TIER_RARE: CRATE_TIER_COMMON
                    )
                );
            }
        } else if (crateTier == CRATE_TIER_EPIC) {
            (
                uint256 guaranteedRareDropIndex,
                uint256 guaranteedEpicDropIndex
            ) = _generateTwoTokenIndices(crateSeed);

            for (uint256 i = 0; i != 5; ++i) {
                uint256 tokenSeed = uint256(keccak256(abi.encodePacked(crateSeed, i)));
                uint256 minRarityTier = CRATE_TIER_COMMON;
                if (i == guaranteedRareDropIndex) {
                    minRarityTier = CRATE_TIER_RARE;
                } else if (i == guaranteedEpicDropIndex) {
                    minRarityTier = CRATE_TIER_EPIC;
                }
                tokens[i] = _makeTokenId(
                    _generateMetadata(
                        tokenSeed,
                        crateTier,
                        counter,
                        i,
                        minRarityTier
                    )
                );
            }
        } else if (crateTier == CRATE_TIER_LEGENDARY) {
            (
                uint256 guaranteedRareDropIndex,
                uint256 guaranteedLegendaryDropIndex
            ) = _generateTwoTokenIndices(crateSeed);

            for (uint256 i = 0; i != 5; ++i) {
                uint256 tokenSeed = uint256(keccak256(abi.encodePacked(crateSeed, i)));
                uint256 minRarityTier = CRATE_TIER_COMMON;
                if (i == guaranteedRareDropIndex) {
                    minRarityTier = CRATE_TIER_RARE;
                } else if (i == guaranteedLegendaryDropIndex) {
                    minRarityTier = CRATE_TIER_LEGENDARY;
                }
                tokens[i] = _makeTokenId(
                    _generateMetadata(
                        tokenSeed,
                        crateTier,
                        counter,
                        i,
                        minRarityTier
                    )
                );
            }
        } else {
            revert("Crates2020RNG: wrong crate tier");
        }
    }

    /**
     * Select one index, then another
    */ 
    function _generateTwoTokenIndices(uint256 crateSeed) internal pure returns (uint256, uint256) {
        uint256 firstIndex = crateSeed % 5;
        return(
            firstIndex,
            (firstIndex + 1 + ((crateSeed >> 4) % 4)) % 5
        );
    }

    /**
     * To generate 3 random indices in a 5-size array, there are 10 possibilities:
     * value  ->  positions  ->  indices
     *   0        O O X X X     (2, 3, 4)
     *   1        O X O X X     (1, 3, 4)
     *   2        O X X O X     (1, 2, 4)
     *   3        O X X X O     (1, 2, 3)
     *   4        X O O X X     (0, 3, 4)
     *   5        X O X O X     (0, 2, 4)
     *   6        X O X X O     (0, 2, 3)
     *   7        X X O O X     (0, 1, 4)
     *   8        X X O X O     (0, 1, 3)
     *   9        X X X O O     (0, 1, 2)
     */
    function _generateThreeTokenIndices(uint256 crateSeed) internal pure returns (uint256, uint256, uint256) {
        uint256 value = crateSeed % 10;
        if (value == 0) return (2, 3, 4);
        if (value == 1) return (1, 3, 4);
        if (value == 2) return (1, 2, 4);
        if (value == 3) return (1, 2, 3);
        if (value == 4) return (0, 3, 4);
        if (value == 5) return (0, 2, 4);
        if (value == 6) return (0, 2, 3);
        if (value == 7) return (0, 1, 4);
        if (value == 8) return (0, 1, 3);
        if (value == 9) return (0, 1, 2);
    }

    function _generateMetadata(
        uint256 tokenSeed,
        uint256 crateTier,
        uint256 counter,
        uint256 index,
        uint256 minRarityTier
    ) private pure returns (Metadata memory metadata) {
        (uint256 tokenType, uint256 tokenSubType) = _generateType(tokenSeed >> 4, index); // Uses tokenSeed bits [4;41[
        metadata.tokenType = tokenType;
        if (tokenSubType != 0) {
            metadata.tokenSubType = tokenSubType;
        }

        uint256 tokenRarity = _generateRarity(tokenSeed >> 41, crateTier, minRarityTier); // Uses tokenSeed bits [41;73[
        metadata.tokenRarity = tokenRarity;

        if (tokenType == _TYPE_ID_CAR || tokenType == _TYPE_ID_DRIVER) {
            if (tokenRarity > 3) {
                metadata.model = _generateModel(tokenSeed >> 73); // Uses tokenSeed bits [73;81[
            } else {
                uint256 team = _generateTeam(tokenSeed >> 73); // Uses tokenSeed bits [73;81[
                metadata.team = team;
                if (tokenType == _TYPE_ID_DRIVER) {
                    metadata.driver = _generateDriver(tokenSeed >> 81, team); // Uses tokenSeed bits [81;82[;
                }
            }
        }

        (metadata.stat1, metadata.stat2, metadata.stat3) = _generateRacingStats(
            tokenSeed >> 128,
            tokenType,
            tokenRarity
        ); // Uses tokenSeed bits [128;170[
        metadata.counter = counter + index;
    }

    function _generateType(uint256 seed, uint256 index)
        private
        pure
        returns (uint256 tokenType, uint256 tokenSubType)
    {
        if (index == 0) {
            tokenType = 1 + (seed % 2); // Types {1, 2} = {Car, Driver}, using 1 bit
            tokenSubType = 0;
        } else {
            uint256 seedling = seed % 100000; // using > 16 bits, reserve 32
            if (seedling < _TYPE_DROP_RATE_THRESH_COMPONENT) {
                uint256 componentTypeSeed = (seed >> 32) % 3; // Type {3, 4} = {Gear, Part}, using 2 bits
                if (componentTypeSeed == 1) { // 1 chance out of 3
                    tokenType = _TYPE_ID_GEAR;
                    tokenSubType = 1 + ((seed >> 34) % 4); // Subtype [1-4], using 2 bits
                } else { // 2 chances out of 3
                    tokenType = _TYPE_ID_PART;
                    tokenSubType = 1 + ((seed >> 34) % 8); // Subtype [1-8], using 3 bits
                }
            } else {
                tokenType = _TYPE_ID_TYRES;
                tokenSubType = 1 + ((seed >> 32) % 5); // Subtype [1-5], using 3 bits
            }
        }
    }

    function _generateRarity(
        uint256 seed,
        uint256 crateTier,
        uint256 minRarityTier
    ) private pure returns (uint256 tokenRarity) {
        uint256 seedling = seed % 100000; // > 16 bits, reserve 32

        if (crateTier == CRATE_TIER_COMMON) {
            if (minRarityTier == CRATE_TIER_COMMON && seedling < _COMMON_CRATE_DROP_RATE_THRESH_COMMON) {
                return 7 + (seedling % 3); // Rarity [7-9]
            }
            if (seedling < _COMMON_CRATE_DROP_RATE_THRESH_RARE) {
                return 4 + (seedling % 3); // Rarity [4-6]
            }
            if (seedling < _COMMON_CRATE_DROP_RATE_THRESH_EPIC) {
                return 2 + (seedling % 2); // Rarity [2-3]
            }
            return 1;
        }

        if (crateTier == CRATE_TIER_RARE) {
            if (minRarityTier == CRATE_TIER_COMMON && seedling < _RARE_CRATE_DROP_RATE_THRESH_COMMON) {
                return 7 + (seedling % 3); // Rarity [7-9]
            }
            if (seedling < _RARE_CRATE_DROP_RATE_THRESH_RARE) {
                return 4 + (seedling % 3); // Rarity [4-6]
            }
            if (seedling < _RARE_CRATE_DROP_RATE_THRESH_EPIC) {
                return 2 + (seedling % 2); // Rarity [2-3]
            }
            return 1;
        }

        if (crateTier == CRATE_TIER_EPIC) {
            if (minRarityTier == CRATE_TIER_COMMON && seedling < _EPIC_CRATE_DROP_RATE_THRESH_COMMON) {
                return 7 + (seedling % 3); // Rarity [7-9]
            }
            if (
                (minRarityTier == CRATE_TIER_COMMON || minRarityTier == CRATE_TIER_RARE)
                && seedling < _EPIC_CRATE_DROP_RATE_THRESH_RARE
            ) {
                return 4 + (seedling % 3); // Rarity [4-6]
            }
            if (seedling < _EPIC_CRATE_DROP_RATE_THRESH_EPIC) {
                return 2 + (seedling % 2); // Rarity [2-3]
            }
            return 1;
        }

        if (crateTier == CRATE_TIER_LEGENDARY) {
            if (minRarityTier == CRATE_TIER_COMMON && seedling < _LEGENDARY_CRATE_DROP_RATE_THRESH_COMMON) {
                return 7 + (seedling % 3); // Rarity [7-9]
            }
            if (minRarityTier == CRATE_TIER_COMMON || minRarityTier == CRATE_TIER_RARE) {
                if (seedling < _LEGENDARY_CRATE_DROP_RATE_THRESH_RARE) {
                    return 4 + (seedling % 3); // Rarity [4-6]
                }
                if (seedling < _LEGENDARY_CRATE_DROP_RATE_THRESH_EPIC) {
                    return 2 + (seedling % 2); // Rarity [2-3]
                }
            }
            return 1;
        }
    }

    function _generateModel(uint256 seed) private pure returns (uint256 model) {
        model = 1 + (seed % 10);
    }

    function _generateTeam(uint256 seed) private pure returns (uint256 team) {
        team = 1 + (seed % 10);
    }

    function _generateDriver(uint256 seed, uint256 team) private pure returns (uint256 driver) {
        uint256 index = (seed) % 2;

        if (team == _TEAM_ID_ALFA_ROMEO_RACING) {
            driver = [
                _DRIVER_ID_KIMI_RAIKKONEN,
                _DRIVER_ID_ANTONIO_GIOVINAZZI
            ][index];
        } else if (team == _TEAM_ID_SCUDERIA_FERRARI) {
            driver = [
                _DRIVER_ID_SEBASTIAN_VETTEL,
                _DRIVER_ID_CHARLES_LECLERC
            ][index];
        } else if (team == _TEAM_ID_HAAS_F1_TEAM) {
            driver = [
                _DRIVER_ID_ROMAIN_GROSJEAN,
                _DRIVER_ID_KEVIN_MAGNUSSEN
            ][index];
        } else if (team == _TEAM_ID_MCLAREN_F1_TEAM) {
            driver = [
                _DRIVER_ID_LANDO_NORRIS,
                _DRIVER_ID_CARLOS_SAINZ
            ][index];
        } else if (team == _TEAM_ID_MERCEDES_AMG_PETRONAS_MOTORSPORT) {
            driver = [
                _DRIVER_ID_LEWIS_HAMILTON,
                _DRIVER_ID_VALTTERI_BOTTAS
            ][index];
        } else if (team == _TEAM_ID_SPSCORE_RACING_POINT_F1_TEAM) {
            driver = [
                _DRIVER_ID_SERGIO_PEREZ,
                _DRIVER_ID_LANCE_STROLL
            ][index];
        } else if (team == _TEAM_ID_ASTON_MARTIN_RED_BULL_RACING) {
            driver = [
                _DRIVER_ID_ALEXANDER_ALBON,
                _DRIVER_ID_MAX_VERSTAPPEN
            ][index];
        } else if (team == _TEAM_ID_RENAULT_F1_TEAM) {
            driver = [
                _DRIVER_ID_DANIEL_RICCIARDO,
                _DRIVER_ID_ESTEBAN_OCON
            ][index];
        } else if (team == _TEAM_ID_RED_BULL_TORO_ROSSO_HONDA) {
            driver = [
                _DRIVER_ID_PIERRE_GASLY,
                _DRIVER_ID_DANIIL_KVYAT
            ][index];
        } else if (team == _TEAM_ID_ROKIT_WILLIAMS_RACING) {
            driver = [
                _DRIVER_ID_GEORGE_RUSSEL,
                _DRIVER_ID_NICHOLAS_LATIFI
            ][index];
        }
    }

    function _generateRacingStats(
        uint256 seed,
        uint256 tokenType,
        uint256 tokenRarity
    )
        private
        pure
        returns (
            uint256 stat1,
            uint256 stat2,
            uint256 stat3
        )
    {
        uint256 min;
        uint256 max;
        if (tokenType == _TYPE_ID_CAR || tokenType == _TYPE_ID_DRIVER) {
            if (tokenRarity == 1) {
                (min, max) = (_RACING_STATS_T1_RARITY_1_MIN, _RACING_STATS_T1_RARITY_1_MAX);
            } else if (tokenRarity == 2) {
                (min, max) = (_RACING_STATS_T1_RARITY_2_MIN, _RACING_STATS_T1_RARITY_2_MAX);
            } else if (tokenRarity == 3) {
                (min, max) = (_RACING_STATS_T1_RARITY_3_MIN, _RACING_STATS_T1_RARITY_3_MAX);
            } else if (tokenRarity == 4) {
                (min, max) = (_RACING_STATS_T1_RARITY_4_MIN, _RACING_STATS_T1_RARITY_4_MAX);
            } else if (tokenRarity == 5) {
                (min, max) = (_RACING_STATS_T1_RARITY_5_MIN, _RACING_STATS_T1_RARITY_5_MAX);
            } else if (tokenRarity == 6) {
                (min, max) = (_RACING_STATS_T1_RARITY_6_MIN, _RACING_STATS_T1_RARITY_6_MAX);
            } else if (tokenRarity == 7) {
                (min, max) = (_RACING_STATS_T1_RARITY_7_MIN, _RACING_STATS_T1_RARITY_7_MAX);
            } else if (tokenRarity == 8) {
                (min, max) = (_RACING_STATS_T1_RARITY_8_MIN, _RACING_STATS_T1_RARITY_8_MAX);
            } else if (tokenRarity == 9) {
                (min, max) = (_RACING_STATS_T1_RARITY_9_MIN, _RACING_STATS_T1_RARITY_9_MAX);
            } else {
                revert("Wrong token rarity");
            }
        } else if (tokenType == _TYPE_ID_GEAR || tokenType == _TYPE_ID_PART) {
            if (tokenRarity == 1) {
                (min, max) = (_RACING_STATS_T2_RARITY_1_MIN, _RACING_STATS_T2_RARITY_1_MAX);
            } else if (tokenRarity == 2) {
                (min, max) = (_RACING_STATS_T2_RARITY_2_MIN, _RACING_STATS_T2_RARITY_2_MAX);
            } else if (tokenRarity == 3) {
                (min, max) = (_RACING_STATS_T2_RARITY_3_MIN, _RACING_STATS_T2_RARITY_3_MAX);
            } else if (tokenRarity == 4) {
                (min, max) = (_RACING_STATS_T2_RARITY_4_MIN, _RACING_STATS_T2_RARITY_4_MAX);
            } else if (tokenRarity == 5) {
                (min, max) = (_RACING_STATS_T2_RARITY_5_MIN, _RACING_STATS_T2_RARITY_5_MAX);
            } else if (tokenRarity == 6) {
                (min, max) = (_RACING_STATS_T2_RARITY_6_MIN, _RACING_STATS_T2_RARITY_6_MAX);
            } else if (tokenRarity == 7) {
                (min, max) = (_RACING_STATS_T2_RARITY_7_MIN, _RACING_STATS_T2_RARITY_7_MAX);
            } else if (tokenRarity == 8) {
                (min, max) = (_RACING_STATS_T2_RARITY_8_MIN, _RACING_STATS_T2_RARITY_8_MAX);
            } else if (tokenRarity == 9) {
                (min, max) = (_RACING_STATS_T2_RARITY_9_MIN, _RACING_STATS_T2_RARITY_9_MAX);
            } else {
                revert("Wrong token rarity");
            }
        } else if (tokenType == _TYPE_ID_TYRES) {
            if (tokenRarity == 1) {
                (min, max) = (_RACING_STATS_T3_RARITY_1_MIN, _RACING_STATS_T3_RARITY_1_MAX);
            } else if (tokenRarity == 2) {
                (min, max) = (_RACING_STATS_T3_RARITY_2_MIN, _RACING_STATS_T3_RARITY_2_MAX);
            } else if (tokenRarity == 3) {
                (min, max) = (_RACING_STATS_T3_RARITY_3_MIN, _RACING_STATS_T3_RARITY_3_MAX);
            } else if (tokenRarity == 4) {
                (min, max) = (_RACING_STATS_T3_RARITY_4_MIN, _RACING_STATS_T3_RARITY_4_MAX);
            } else if (tokenRarity == 5) {
                (min, max) = (_RACING_STATS_T3_RARITY_5_MIN, _RACING_STATS_T3_RARITY_5_MAX);
            } else if (tokenRarity == 6) {
                (min, max) = (_RACING_STATS_T3_RARITY_6_MIN, _RACING_STATS_T3_RARITY_6_MAX);
            } else if (tokenRarity == 7) {
                (min, max) = (_RACING_STATS_T3_RARITY_7_MIN, _RACING_STATS_T3_RARITY_7_MAX);
            } else if (tokenRarity == 8) {
                (min, max) = (_RACING_STATS_T3_RARITY_8_MIN, _RACING_STATS_T3_RARITY_8_MAX);
            } else if (tokenRarity == 9) {
                (min, max) = (_RACING_STATS_T3_RARITY_9_MIN, _RACING_STATS_T3_RARITY_9_MAX);
            } else {
                revert("Wrong token rarity");
            }
        } else {
            revert("Wrong token type");
        }
        uint256 delta = max - min;
        stat1 = min + (seed % delta);
        stat2 = min + ((seed >> 16) % delta);
        stat3 = min + ((seed >> 32) % delta);
    }

    function _makeTokenId(Metadata memory metadata) private pure returns (uint256 tokenId) {
        tokenId = _NF_FLAG;
        tokenId |= (metadata.tokenType << 240);
        tokenId |= (metadata.tokenSubType << 232);
        tokenId |= (_SEASON_ID_2020 << 224);
        tokenId |= (metadata.model << 192);
        tokenId |= (metadata.team << 184);
        tokenId |= (metadata.tokenRarity << 176);
        tokenId |= (metadata.label << 152);
        tokenId |= (metadata.driver << 136);
        tokenId |= (metadata.stat1 << 120);
        tokenId |= (metadata.stat2 << 104);
        tokenId |= (metadata.stat3 << 88);
        tokenId |= metadata.counter;
    }
}


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

pragma solidity ^0.6.8;



interface IF1DTBurnableCrateKey {
    /**
     * Destroys `amount` of token.
     * @dev Reverts if called by any other than the contract owner.
     * @dev Reverts is `amount` is zero.
     * @param amount Amount of token to burn.
     */
    function burn(uint256 amount) external;

    /**
     * See {IERC20-transferFrom(address,address,uint256)}.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) external;
}

interface IF1DTInventory {
    /**
     * @dev Public function to mint a batch of new tokens
     * Reverts if some the given token IDs already exist
     * @param to address[] List of addresses that will own the minted tokens
     * @param ids uint256[] List of ids of the tokens to be minted
     * @param uris bytes32[] Concatenated metadata URIs of nfts to be minted
     * @param values uint256[] List of quantities of ft to be minted
     */
    function batchMint(address[] calldata to, uint256[] calldata ids, bytes32[] calldata uris, uint256[] calldata values, bool safe) external;
}

contract Crates2020 is Ownable {
    using Crates2020RNGLib for uint256;

    IF1DTInventory immutable public INVENTORY;
    IF1DTBurnableCrateKey immutable public CRATE_KEY_COMMON;
    IF1DTBurnableCrateKey immutable public CRATE_KEY_RARE;
    IF1DTBurnableCrateKey immutable public CRATE_KEY_EPIC;
    IF1DTBurnableCrateKey immutable public CRATE_KEY_LEGENDARY;

    uint256 public counter;

    constructor(
        IF1DTInventory INVENTORY_,
        IF1DTBurnableCrateKey CRATE_KEY_COMMON_,
        IF1DTBurnableCrateKey CRATE_KEY_RARE_,
        IF1DTBurnableCrateKey CRATE_KEY_EPIC_,
        IF1DTBurnableCrateKey CRATE_KEY_LEGENDARY_,
        uint256 counter_
    ) public {
        require(
            address(INVENTORY_) != address(0) &&
            address(CRATE_KEY_COMMON_) != address(0) &&
            address(CRATE_KEY_EPIC_) != address(0) &&
            address(CRATE_KEY_LEGENDARY_) != address(0),
            "Crates: zero address"
        );
        INVENTORY = INVENTORY_;
        CRATE_KEY_COMMON = CRATE_KEY_COMMON_;
        CRATE_KEY_RARE = CRATE_KEY_RARE_;
        CRATE_KEY_EPIC = CRATE_KEY_EPIC_;
        CRATE_KEY_LEGENDARY = CRATE_KEY_LEGENDARY_;
        counter = counter_;
    }

    function transferCrateKeyOwnership(uint256 crateTier, address newOwner) external onlyOwner {
        IF1DTBurnableCrateKey crateKey = _getCrateKey(crateTier);
        crateKey.transferOwnership(newOwner);
    }

    /**
     * Burn some keys in order to mint 2020 season crates.
     * @dev Reverts if `quantity` is zero.
     * @dev Reverts if `crateTier` is not supported.
     * @dev Reverts if the transfer of the crate key to this contract fails (missing approval or insufficient balance).
     * @dev Reverts if this contract is not owner of the `crateTier`-related contract.
     * @dev Reverts if this contract is not minter of the DeltaTimeInventory contract.
     * @param crateTier The tier identifier for the crates to open.
     * @param quantity The number of crates to open.
     * @param seed The seed used for the metadata RNG.
     */
    function _openCrates(uint256 crateTier, uint256 quantity, uint256 seed) internal {
        require(quantity != 0, "Crates: zero quantity");
        IF1DTBurnableCrateKey crateKey = _getCrateKey(crateTier);

        address sender = _msgSender();
        uint256 amount = quantity * 1000000000000000000;

        crateKey.transferFrom(sender, address(this), amount);
        crateKey.burn(amount);

        bytes32[] memory uris = new bytes32[](5);
        uint256[] memory values = new uint256[](5);
        address[] memory to = new address[](5);
        for (uint256 i; i != 5; ++i) {
            values[i] = 1;
            to[i] = sender;
        }

        uint256 counter_ = counter;
        for (uint256 i; i != quantity; ++i) {
            if (i != 0) {
                seed = uint256(keccak256(abi.encode(seed)));
            }
            uint256[] memory tokens = seed.generateCrate(crateTier, counter_);
            INVENTORY.batchMint(to, tokens, uris, values, false);
            counter_ += 5;
        }
        counter = counter_;
    }

    function _getCrateKey(uint256 crateTier) view internal returns (IF1DTBurnableCrateKey) {
        if (crateTier == Crates2020RNGLib.CRATE_TIER_COMMON) {
            return CRATE_KEY_COMMON;
        } else if (crateTier == Crates2020RNGLib.CRATE_TIER_RARE) {
            return CRATE_KEY_RARE;
        } else if (crateTier == Crates2020RNGLib.CRATE_TIER_EPIC) {
            return CRATE_KEY_EPIC;
        } else if (crateTier == Crates2020RNGLib.CRATE_TIER_LEGENDARY) {
            return CRATE_KEY_LEGENDARY;
        } else {
            revert("Crates: wrong crate tier");
        }
    }
}


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

pragma solidity ^0.6.8;





contract Crates2020Locksmith is Crates2020 {
    using ECDSA for bytes32;

    // account => crateTier => nonce
    mapping(address => mapping(uint256 => uint256)) public nonces;

    address public signerKey;

    constructor(
        IF1DTInventory INVENTORY_,
        IF1DTBurnableCrateKey COMMON_CRATE_,
        IF1DTBurnableCrateKey RARE_CRATE_,
        IF1DTBurnableCrateKey EPIC_CRATE_,
        IF1DTBurnableCrateKey LEGENDARY_CRATE_,
        uint256 counter_
    ) public Crates2020(INVENTORY_, COMMON_CRATE_, RARE_CRATE_, EPIC_CRATE_, LEGENDARY_CRATE_, counter_) {}

    function setSignerKey(address signerKey_) external onlyOwner {
        signerKey = signerKey_;
    }

    /**
     * Burn some keys in order to mint 2020 season crates.
     * @dev reverts if `crateTier` is not supported.
     * @dev reverts if `quantity` is zero or more than 5.
     * @dev reverts if `signerKey` has not been set.
     * @dev reverts if `sig` is not verified to be a signature as described below.
     * @dev Reverts if the transfer of the crate key to this contract fails (missing approval or insufficient balance).
     * @dev Reverts if this contract is not owner of the `crateTier`-related contract.
     * @dev Reverts if this contract is not minter of the DeltaTimeInventory contract.
     * @param crateTier The tier identifier for the crates to open.
     * @param quantity The number of keys to burn / crates to open.
     * @param sig The signature for keccak256(abi.encode(sender, crateTier, nonce))
     *  signed by the private key paired to the public key `signerKey`, where:
     *  - `sender` is the msg.sender,
     *  - `crateTier` is the tier of crate to open,
     *  - `nonce` is the currently tracked nonce, accessed via `nonces(sender, crateTier)`.
     */
    function insertKeys(uint256 crateTier, uint256 quantity, bytes calldata sig) external {
        require(crateTier <= Crates2020RNGLib.CRATE_TIER_COMMON, "Locksmith: wrong crate tier");
        require(quantity <= 5, "Locksmith: above max quantity");

        address signerKey_ = signerKey;
        require(signerKey_ != address(0), "Locksmith: signer key not set");

        address sender = _msgSender();
        uint256 nonce = nonces[sender][crateTier];
        bytes32 hash_ = keccak256(abi.encode(sender, crateTier, nonce));
        require(hash_.toEthSignedMessageHash().recover(sig) == signerKey_, "Locksmith: invalid signature");

        uint256 seed = uint256(keccak256(sig));
        _openCrates(crateTier, quantity, seed);

        nonces[sender][crateTier] = nonce + 1;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IF1DTInventory","name":"INVENTORY_","type":"address"},{"internalType":"contract IF1DTBurnableCrateKey","name":"COMMON_CRATE_","type":"address"},{"internalType":"contract IF1DTBurnableCrateKey","name":"RARE_CRATE_","type":"address"},{"internalType":"contract IF1DTBurnableCrateKey","name":"EPIC_CRATE_","type":"address"},{"internalType":"contract IF1DTBurnableCrateKey","name":"LEGENDARY_CRATE_","type":"address"},{"internalType":"uint256","name":"counter_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"CRATE_KEY_COMMON","outputs":[{"internalType":"contract IF1DTBurnableCrateKey","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CRATE_KEY_EPIC","outputs":[{"internalType":"contract IF1DTBurnableCrateKey","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CRATE_KEY_LEGENDARY","outputs":[{"internalType":"contract IF1DTBurnableCrateKey","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CRATE_KEY_RARE","outputs":[{"internalType":"contract IF1DTBurnableCrateKey","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INVENTORY","outputs":[{"internalType":"contract IF1DTInventory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"counter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"crateTier","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"insertKeys","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"signerKey_","type":"address"}],"name":"setSignerKey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signerKey","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"crateTier","type":"uint256"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferCrateKeyOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101206040523480156200001257600080fd5b506040516200206f3803806200206f833981810160405260c08110156200003857600080fd5b508051602082015160408301516060840151608085015160a09095015193949293919290918585858585856000620000786001600160e01b03620001a216565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600160a01b03861615801590620000e357506001600160a01b03851615155b8015620000f857506001600160a01b03831615155b80156200010d57506001600160a01b03821615155b6200015f576040805162461bcd60e51b815260206004820152601460248201527f4372617465733a207a65726f2061646472657373000000000000000000000000604482015290519081900360640190fd5b6001600160601b0319606096871b811660805294861b851660a05292851b841660c05290841b831660e05290921b166101005260015550620001a6945050505050565b3390565b60805160601c60a05160601c60c05160601c60e05160601c6101005160601c611e616200020e6000398061033152806109f652508061044152806109ca5250806107fb528061099a5250806107d7528061096a52508061081f5280610f435250611e616000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c8063715018a61161008c578063bf55411111610066578063bf55411114610249578063d88a8b1314610251578063de5d547e14610259578063f2fde38b14610261576100ea565b8063715018a6146101bd5780638da5cb5b146101c557806394b14fea146101cd576100ea565b80633104e614116100c85780633104e614146101435780634289cae61461016f578063502e1a161461017757806361bc221a146101b5576100ea565b8063040cdfa4146100ef5780631b36b4df14610117578063229417f51461013b575b600080fd5b6101156004803603602081101561010557600080fd5b50356001600160a01b0316610287565b005b61011f610320565b604080516001600160a01b039092168252519081900360200190f35b61011f61032f565b6101156004803603604081101561015957600080fd5b50803590602001356001600160a01b0316610353565b61011f61043f565b6101a36004803603604081101561018d57600080fd5b506001600160a01b038135169060200135610463565b60408051918252519081900360200190f35b6101a3610480565b610115610486565b61011f610547565b610115600480360360608110156101e357600080fd5b81359160208101359181019060608101604082013564010000000081111561020a57600080fd5b82018360208201111561021c57600080fd5b8035906020019184600183028401116401000000008311171561023e57600080fd5b509092509050610556565b61011f6107d5565b61011f6107f9565b61011f61081d565b6101156004803603602081101561027757600080fd5b50356001600160a01b0316610841565b61028f610958565b6000546001600160a01b039081169116146102f1576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6003805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6003546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000081565b61035b610958565b6000546001600160a01b039081169116146103bd576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60006103c88361095c565b9050806001600160a01b031663f2fde38b836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561042257600080fd5b505af1158015610436573d6000803e3d6000fd5b50505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600260209081526000928352604080842090915290825290205481565b60015481565b61048e610958565b6000546001600160a01b039081169116146104f0576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36000805473ffffffffffffffffffffffffffffffffffffffff19169055565b6000546001600160a01b031690565b60038411156105ac576040805162461bcd60e51b815260206004820152601b60248201527f4c6f636b736d6974683a2077726f6e6720637261746520746965720000000000604482015290519081900360640190fd5b6005831115610602576040805162461bcd60e51b815260206004820152601d60248201527f4c6f636b736d6974683a2061626f7665206d6178207175616e74697479000000604482015290519081900360640190fd5b6003546001600160a01b031680610660576040805162461bcd60e51b815260206004820152601d60248201527f4c6f636b736d6974683a207369676e6572206b6579206e6f7420736574000000604482015290519081900360640190fd5b600061066a610958565b6001600160a01b0380821660008181526002602090815260408083208c8452825291829020548251808301949094528383018c90526060808501829052835180860390910181526080850180855281519184019190912060a0601f8c018590049094028601840190945289815295965094919387169261071692918a918a9182910183828082843760009201919091525061070a9250869150610a6c9050565b9063ffffffff610abd16565b6001600160a01b031614610771576040805162461bcd60e51b815260206004820152601c60248201527f4c6f636b736d6974683a20696e76616c6964207369676e617475726500000000604482015290519081900360640190fd5b60008686604051808383808284376040519201829003909120945061079f93508c92508b9150849050610ca4565b50506001600160a01b03909116600090815260026020908152604080832098835297905295909520600190950190945550505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b610849610958565b6000546001600160a01b039081169116146108ab576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166108f05760405162461bcd60e51b8152600401808060200182810382526026815260200180611dc26026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b3390565b6000600382141561098e57507f0000000000000000000000000000000000000000000000000000000000000000610a67565b60028214156109be57507f0000000000000000000000000000000000000000000000000000000000000000610a67565b60018214156109ee57507f0000000000000000000000000000000000000000000000000000000000000000610a67565b81610a1a57507f0000000000000000000000000000000000000000000000000000000000000000610a67565b6040805162461bcd60e51b815260206004820152601860248201527f4372617465733a2077726f6e6720637261746520746965720000000000000000604482015290519081900360640190fd5b919050565b604080517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602080830191909152603c8083019490945282518083039094018452605c909101909152815191012090565b60008151604114610b15576040805162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015290519081900360640190fd5b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115610b865760405162461bcd60e51b8152600401808060200182810382526022815260200180611de86022913960400191505060405180910390fd5b8060ff16601b14158015610b9e57508060ff16601c14155b15610bda5760405162461bcd60e51b8152600401808060200182810382526022815260200180611e0a6022913960400191505060405180910390fd5b60408051600080825260208083018085528a905260ff85168385015260608301879052608083018690529251909260019260a080820193601f1981019281900390910190855afa158015610c32573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610c9a576040805162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fd5b9695505050505050565b81610cf6576040805162461bcd60e51b815260206004820152601560248201527f4372617465733a207a65726f207175616e746974790000000000000000000000604482015290519081900360640190fd5b6000610d018461095c565b90506000610d0d610958565b604080517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b038084166004830152306024830152670de0b6b3a764000088026044830181905292519394509192918516916323b872dd916064808201926020929091908290030181600087803b158015610d8f57600080fd5b505af1158015610da3573d6000803e3d6000fd5b505050506040513d6020811015610db957600080fd5b5050604080517f42966c680000000000000000000000000000000000000000000000000000000081526004810183905290516001600160a01b038516916342966c6891602480830192600092919082900301818387803b158015610e1c57600080fd5b505af1158015610e30573d6000803e3d6000fd5b505060408051600580825260c082019092526060935091506020820160a080368337505060408051600580825260c0820190925292935060609291506020820160a080368337505060408051600580825260c0820190925292935060609291506020820160a08036833701905050905060005b80600514610ef2576001838281518110610eb957fe5b60200260200101818152505085828281518110610ed257fe5b6001600160a01b0390921660209283029190910190910152600101610ea3565b5060015460005b8981146110ec578015610f2c576040805160208082019b909b5281518082038c0181529082019091528051990198909820975b6060610f3f8a8d8563ffffffff6110fb16565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e6fd76fe8583898960006040518663ffffffff1660e01b815260040180806020018060200180602001806020018615151515815260200185810385528a818151815260200191508051906020019060200280838360005b83811015610fdb578181015183820152602001610fc3565b50505050905001858103845289818151815260200191508051906020019060200280838360005b8381101561101a578181015183820152602001611002565b50505050905001858103835288818151815260200191508051906020019060200280838360005b83811015611059578181015183820152602001611041565b50505050905001858103825287818151815260200191508051906020019060200280838360005b83811015611098578181015183820152602001611080565b505050509050019950505050505050505050600060405180830381600087803b1580156110c457600080fd5b505af11580156110d8573d6000803e3d6000fd5b505050600593909301925050600101610ef9565b50600155505050505050505050565b60408051600580825260c082019092526060916020820160a08036833701905050905060038314156111aa576005840660005b806005146111a3576040805160208082018990528183018490528251808303840181526060909201909252805191012061118361117e82888886888114611176576003611179565b60025b6113e0565b6114c8565b84838151811061118f57fe5b60209081029190910101525060010161112e565b50506113d9565b60028314156112505760008060006111c18761157c565b9194509250905060005b80600514611247576040805160208082018b90528183018490528251808303840181526060909201909252805191012061122761117e828a8a868a81148061121257508988145b8061121c57508888145b611176576003611179565b86838151811061123357fe5b6020908102919091010152506001016111cb565b505050506113d9565b60018314156112f45760008061126586611697565b909250905060005b806005146112ec576040805160208082018a9052818301849052825180830384018152606090920190925280519101206003848314156112af575060026112bb565b838314156112bb575060015b6112cb61117e838a8a87866113e0565b8684815181106112d757fe5b6020908102919091010152505060010161126d565b5050506113d9565b8261138c5760008061130586611697565b909250905060005b806005146112ec576040805160208082018a90528183018490528251808303840181526060909201909252805191012060038483141561134f5750600261135b565b8383141561135b575060005b61136b61117e838a8a87866113e0565b86848151811061137757fe5b6020908102919091010152505060010161130d565b6040805162461bcd60e51b815260206004820152601f60248201527f43726174657332303230524e473a2077726f6e67206372617465207469657200604482015290519081900360640190fd5b9392505050565b6113e8611d67565b6000806113f9600489901c866116b2565b8185529092509050801561140f57602083018190525b600061142060298a901c8987611732565b60808501819052905060018314806114385750600283145b1561149457600381111561145d5761145360498a901c6118c3565b6040850152611494565b600061146c60498b901c6118c3565b60608601819052905060028414156114925761148c60518b901c826118cd565b60c08601525b505b6114a360808a901c8483611a9c565b61012087015261010086015260e0850152505050929091016101408301525092915050565b8051602082015160408301516060840151608085015160a086015160c08088015160e08901516101008a01516101208b0151610140909b015160589b909b1b60689190911b60789290921b60889390931b60989590951b60b09690961b60b89790971b9790931b60e89890981b60f09990991b989098179690961794909417929092171717919091179190911717177f80000003000000000000000000000000000000000000000000000000000000001790565b60008080600a84068061159b5750600292506003915060049050611690565b80600114156115b65750600192506003915060049050611690565b80600214156115d15750600192506002915060049050611690565b80600314156115ec5750600192506002915060039050611690565b80600414156116075750600092506003915060049050611690565b80600514156116225750600092506002915060049050611690565b806006141561163d5750600092506002915060039050611690565b80600714156116585750600092506001915060049050611690565b80600814156116735750600092506001915060039050611690565b806009141561168e5750600092506001915060029050611690565b505b9193909250565b600580820692600160049390931c6003168401929092010690565b600080826116c9575050600180831601600061172b565b620186a0840662014244811015611718576003602086901c066001811415611700576004935083602287901c066001019250611712565b600393506008602287901c0660010192505b50611729565b6005925082602086901c0660010191505b505b9250929050565b6000620186a0840660038414156117aa5760038314801561175557506201825381105b1561176a576003815b066007019150506113d9565b6201863b811015611785576003815b066004019150506113d9565b6201869f8110156117a0576002815b066002019150506113d9565b60019150506113d9565b60028414156117f8576003831480156117c55750620178ea81105b156117d25760038161175e565b620182ae8110156117e557600381611779565b620186968110156117a057600281611794565b600184141561185d576003831480156118135750620168f081105b156118205760038161175e565b600383148061182f5750600283145b801561183d575062017c7881105b1561184a57600381611779565b6201863c8110156117a057600281611794565b836118bb5760038314801561187457506201482081105b156118815760038161175e565b60038314806118905750600283145b156117a05762016f308110156118a857600381611779565b620182b88110156117a057600281611794565b509392505050565b600a900660010190565b600060018084169083141561190a57604051806040016040528060078152602001606381525081600281106118fe57fe5b60200201519150611a95565b600283141561193557604051806040016040528060058152602001601081525081600281106118fe57fe5b600383141561196057604051806040016040528060088152602001601481525081600281106118fe57fe5b600483141561198b57604051806040016040528060048152602001603781525081600281106118fe57fe5b60058314156119b6576040518060400160405280602c8152602001604d81525081600281106118fe57fe5b60068314156119e1576040518060400160405280600b8152602001601281525081600281106118fe57fe5b6007831415611a0c57604051806040016040528060178152602001602181525081600281106118fe57fe5b6008831415611a3757604051806040016040528060038152602001601f81525081600281106118fe57fe5b6009831415611a62576040518060400160405280600a8152602001601a81525081600281106118fe57fe5b600a831415611a95576040518060400160405280603f815260200160068152508160028110611a8d57fe5b602002015191505b5092915050565b60008060008060006001871480611ab35750600287145b15611bd9578560011415611acf57506103209050610384611bd4565b8560021415611ae657506102c6905061032a611bd4565b8560031415611afd57506102a8905061030c611bd4565b8560041415611b14575061026290506102c6611bd4565b8560051415611b2b575061023a90506102a8611bd4565b8560061415611b42575061021c905061028a611bd4565b8560071415611b5957506101f49050610244611bd4565b8560081415611b7057506101e09050610226611bd4565b8560091415611b8757506101c2905061021c611bd4565b6040805162461bcd60e51b815260206004820152601260248201527f57726f6e6720746f6b656e207261726974790000000000000000000000000000604482015290519081900360640190fd5b611d26565b6004871480611be85750600387145b15611cb9578560011415611c0457506101f49050610258611bd4565b8560021415611c1b57506101a49050610208611bd4565b8560031415611c32575061017c90506101e0611bd4565b8560041415611c49575061015490506101b8611bd4565b8560051415611c60575061014a90506101ae611bd4565b8560061415611c7757506101229050610186611bd4565b8560071415611c8d575060fa905061015e611bd4565b8560081415611ca3575060f09050610154611bd4565b8560091415611b87575060c8905061012c611bd4565b6005871415611cd9578560011415611c0457506101f49050610258611bd4565b6040805162461bcd60e51b815260206004820152601060248201527f57726f6e6720746f6b656e207479706500000000000000000000000000000000604482015290519081900360640190fd5b818103808981611d3257fe5b06830195508060108a901c81611d4457fe5b06830194508060208a901c81611d5657fe5b068301935050505093509350939050565b6040518061016001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345434453413a20696e76616c6964207369676e6174757265202773272076616c756545434453413a20696e76616c6964207369676e6174757265202776272076616c7565a264697066735822122009ba47badea363291d20541a582009e3be007e2fc0e0d373fe670109e6a4306964736f6c634300060800330000000000000000000000002af75676692817d85121353f0d6e8e9ae6ad55760000000000000000000000007e439a012e06b9bd4a9a08a0a945b46bea3a215b0000000000000000000000005694bce5b6f06dcd69028d40ab856efc295a524b000000000000000000000000012408dd7d43a6b3949bdaa281c123b19652a0dc00000000000000000000000017acddb7053be19e852e64dc5a344b599756f5570000000000000000000000000000000000000000000000000000000000000001

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100ea5760003560e01c8063715018a61161008c578063bf55411111610066578063bf55411114610249578063d88a8b1314610251578063de5d547e14610259578063f2fde38b14610261576100ea565b8063715018a6146101bd5780638da5cb5b146101c557806394b14fea146101cd576100ea565b80633104e614116100c85780633104e614146101435780634289cae61461016f578063502e1a161461017757806361bc221a146101b5576100ea565b8063040cdfa4146100ef5780631b36b4df14610117578063229417f51461013b575b600080fd5b6101156004803603602081101561010557600080fd5b50356001600160a01b0316610287565b005b61011f610320565b604080516001600160a01b039092168252519081900360200190f35b61011f61032f565b6101156004803603604081101561015957600080fd5b50803590602001356001600160a01b0316610353565b61011f61043f565b6101a36004803603604081101561018d57600080fd5b506001600160a01b038135169060200135610463565b60408051918252519081900360200190f35b6101a3610480565b610115610486565b61011f610547565b610115600480360360608110156101e357600080fd5b81359160208101359181019060608101604082013564010000000081111561020a57600080fd5b82018360208201111561021c57600080fd5b8035906020019184600183028401116401000000008311171561023e57600080fd5b509092509050610556565b61011f6107d5565b61011f6107f9565b61011f61081d565b6101156004803603602081101561027757600080fd5b50356001600160a01b0316610841565b61028f610958565b6000546001600160a01b039081169116146102f1576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6003805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6003546001600160a01b031681565b7f00000000000000000000000017acddb7053be19e852e64dc5a344b599756f55781565b61035b610958565b6000546001600160a01b039081169116146103bd576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60006103c88361095c565b9050806001600160a01b031663f2fde38b836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561042257600080fd5b505af1158015610436573d6000803e3d6000fd5b50505050505050565b7f000000000000000000000000012408dd7d43a6b3949bdaa281c123b19652a0dc81565b600260209081526000928352604080842090915290825290205481565b60015481565b61048e610958565b6000546001600160a01b039081169116146104f0576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36000805473ffffffffffffffffffffffffffffffffffffffff19169055565b6000546001600160a01b031690565b60038411156105ac576040805162461bcd60e51b815260206004820152601b60248201527f4c6f636b736d6974683a2077726f6e6720637261746520746965720000000000604482015290519081900360640190fd5b6005831115610602576040805162461bcd60e51b815260206004820152601d60248201527f4c6f636b736d6974683a2061626f7665206d6178207175616e74697479000000604482015290519081900360640190fd5b6003546001600160a01b031680610660576040805162461bcd60e51b815260206004820152601d60248201527f4c6f636b736d6974683a207369676e6572206b6579206e6f7420736574000000604482015290519081900360640190fd5b600061066a610958565b6001600160a01b0380821660008181526002602090815260408083208c8452825291829020548251808301949094528383018c90526060808501829052835180860390910181526080850180855281519184019190912060a0601f8c018590049094028601840190945289815295965094919387169261071692918a918a9182910183828082843760009201919091525061070a9250869150610a6c9050565b9063ffffffff610abd16565b6001600160a01b031614610771576040805162461bcd60e51b815260206004820152601c60248201527f4c6f636b736d6974683a20696e76616c6964207369676e617475726500000000604482015290519081900360640190fd5b60008686604051808383808284376040519201829003909120945061079f93508c92508b9150849050610ca4565b50506001600160a01b03909116600090815260026020908152604080832098835297905295909520600190950190945550505050565b7f0000000000000000000000007e439a012e06b9bd4a9a08a0a945b46bea3a215b81565b7f0000000000000000000000005694bce5b6f06dcd69028d40ab856efc295a524b81565b7f0000000000000000000000002af75676692817d85121353f0d6e8e9ae6ad557681565b610849610958565b6000546001600160a01b039081169116146108ab576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166108f05760405162461bcd60e51b8152600401808060200182810382526026815260200180611dc26026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b3390565b6000600382141561098e57507f0000000000000000000000007e439a012e06b9bd4a9a08a0a945b46bea3a215b610a67565b60028214156109be57507f0000000000000000000000005694bce5b6f06dcd69028d40ab856efc295a524b610a67565b60018214156109ee57507f000000000000000000000000012408dd7d43a6b3949bdaa281c123b19652a0dc610a67565b81610a1a57507f00000000000000000000000017acddb7053be19e852e64dc5a344b599756f557610a67565b6040805162461bcd60e51b815260206004820152601860248201527f4372617465733a2077726f6e6720637261746520746965720000000000000000604482015290519081900360640190fd5b919050565b604080517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602080830191909152603c8083019490945282518083039094018452605c909101909152815191012090565b60008151604114610b15576040805162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015290519081900360640190fd5b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115610b865760405162461bcd60e51b8152600401808060200182810382526022815260200180611de86022913960400191505060405180910390fd5b8060ff16601b14158015610b9e57508060ff16601c14155b15610bda5760405162461bcd60e51b8152600401808060200182810382526022815260200180611e0a6022913960400191505060405180910390fd5b60408051600080825260208083018085528a905260ff85168385015260608301879052608083018690529251909260019260a080820193601f1981019281900390910190855afa158015610c32573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610c9a576040805162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fd5b9695505050505050565b81610cf6576040805162461bcd60e51b815260206004820152601560248201527f4372617465733a207a65726f207175616e746974790000000000000000000000604482015290519081900360640190fd5b6000610d018461095c565b90506000610d0d610958565b604080517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b038084166004830152306024830152670de0b6b3a764000088026044830181905292519394509192918516916323b872dd916064808201926020929091908290030181600087803b158015610d8f57600080fd5b505af1158015610da3573d6000803e3d6000fd5b505050506040513d6020811015610db957600080fd5b5050604080517f42966c680000000000000000000000000000000000000000000000000000000081526004810183905290516001600160a01b038516916342966c6891602480830192600092919082900301818387803b158015610e1c57600080fd5b505af1158015610e30573d6000803e3d6000fd5b505060408051600580825260c082019092526060935091506020820160a080368337505060408051600580825260c0820190925292935060609291506020820160a080368337505060408051600580825260c0820190925292935060609291506020820160a08036833701905050905060005b80600514610ef2576001838281518110610eb957fe5b60200260200101818152505085828281518110610ed257fe5b6001600160a01b0390921660209283029190910190910152600101610ea3565b5060015460005b8981146110ec578015610f2c576040805160208082019b909b5281518082038c0181529082019091528051990198909820975b6060610f3f8a8d8563ffffffff6110fb16565b90507f0000000000000000000000002af75676692817d85121353f0d6e8e9ae6ad55766001600160a01b031663e6fd76fe8583898960006040518663ffffffff1660e01b815260040180806020018060200180602001806020018615151515815260200185810385528a818151815260200191508051906020019060200280838360005b83811015610fdb578181015183820152602001610fc3565b50505050905001858103845289818151815260200191508051906020019060200280838360005b8381101561101a578181015183820152602001611002565b50505050905001858103835288818151815260200191508051906020019060200280838360005b83811015611059578181015183820152602001611041565b50505050905001858103825287818151815260200191508051906020019060200280838360005b83811015611098578181015183820152602001611080565b505050509050019950505050505050505050600060405180830381600087803b1580156110c457600080fd5b505af11580156110d8573d6000803e3d6000fd5b505050600593909301925050600101610ef9565b50600155505050505050505050565b60408051600580825260c082019092526060916020820160a08036833701905050905060038314156111aa576005840660005b806005146111a3576040805160208082018990528183018490528251808303840181526060909201909252805191012061118361117e82888886888114611176576003611179565b60025b6113e0565b6114c8565b84838151811061118f57fe5b60209081029190910101525060010161112e565b50506113d9565b60028314156112505760008060006111c18761157c565b9194509250905060005b80600514611247576040805160208082018b90528183018490528251808303840181526060909201909252805191012061122761117e828a8a868a81148061121257508988145b8061121c57508888145b611176576003611179565b86838151811061123357fe5b6020908102919091010152506001016111cb565b505050506113d9565b60018314156112f45760008061126586611697565b909250905060005b806005146112ec576040805160208082018a9052818301849052825180830384018152606090920190925280519101206003848314156112af575060026112bb565b838314156112bb575060015b6112cb61117e838a8a87866113e0565b8684815181106112d757fe5b6020908102919091010152505060010161126d565b5050506113d9565b8261138c5760008061130586611697565b909250905060005b806005146112ec576040805160208082018a90528183018490528251808303840181526060909201909252805191012060038483141561134f5750600261135b565b8383141561135b575060005b61136b61117e838a8a87866113e0565b86848151811061137757fe5b6020908102919091010152505060010161130d565b6040805162461bcd60e51b815260206004820152601f60248201527f43726174657332303230524e473a2077726f6e67206372617465207469657200604482015290519081900360640190fd5b9392505050565b6113e8611d67565b6000806113f9600489901c866116b2565b8185529092509050801561140f57602083018190525b600061142060298a901c8987611732565b60808501819052905060018314806114385750600283145b1561149457600381111561145d5761145360498a901c6118c3565b6040850152611494565b600061146c60498b901c6118c3565b60608601819052905060028414156114925761148c60518b901c826118cd565b60c08601525b505b6114a360808a901c8483611a9c565b61012087015261010086015260e0850152505050929091016101408301525092915050565b8051602082015160408301516060840151608085015160a086015160c08088015160e08901516101008a01516101208b0151610140909b015160589b909b1b60689190911b60789290921b60889390931b60989590951b60b09690961b60b89790971b9790931b60e89890981b60f09990991b989098179690961794909417929092171717919091179190911717177f80000003000000000000000000000000000000000000000000000000000000001790565b60008080600a84068061159b5750600292506003915060049050611690565b80600114156115b65750600192506003915060049050611690565b80600214156115d15750600192506002915060049050611690565b80600314156115ec5750600192506002915060039050611690565b80600414156116075750600092506003915060049050611690565b80600514156116225750600092506002915060049050611690565b806006141561163d5750600092506002915060039050611690565b80600714156116585750600092506001915060049050611690565b80600814156116735750600092506001915060039050611690565b806009141561168e5750600092506001915060029050611690565b505b9193909250565b600580820692600160049390931c6003168401929092010690565b600080826116c9575050600180831601600061172b565b620186a0840662014244811015611718576003602086901c066001811415611700576004935083602287901c066001019250611712565b600393506008602287901c0660010192505b50611729565b6005925082602086901c0660010191505b505b9250929050565b6000620186a0840660038414156117aa5760038314801561175557506201825381105b1561176a576003815b066007019150506113d9565b6201863b811015611785576003815b066004019150506113d9565b6201869f8110156117a0576002815b066002019150506113d9565b60019150506113d9565b60028414156117f8576003831480156117c55750620178ea81105b156117d25760038161175e565b620182ae8110156117e557600381611779565b620186968110156117a057600281611794565b600184141561185d576003831480156118135750620168f081105b156118205760038161175e565b600383148061182f5750600283145b801561183d575062017c7881105b1561184a57600381611779565b6201863c8110156117a057600281611794565b836118bb5760038314801561187457506201482081105b156118815760038161175e565b60038314806118905750600283145b156117a05762016f308110156118a857600381611779565b620182b88110156117a057600281611794565b509392505050565b600a900660010190565b600060018084169083141561190a57604051806040016040528060078152602001606381525081600281106118fe57fe5b60200201519150611a95565b600283141561193557604051806040016040528060058152602001601081525081600281106118fe57fe5b600383141561196057604051806040016040528060088152602001601481525081600281106118fe57fe5b600483141561198b57604051806040016040528060048152602001603781525081600281106118fe57fe5b60058314156119b6576040518060400160405280602c8152602001604d81525081600281106118fe57fe5b60068314156119e1576040518060400160405280600b8152602001601281525081600281106118fe57fe5b6007831415611a0c57604051806040016040528060178152602001602181525081600281106118fe57fe5b6008831415611a3757604051806040016040528060038152602001601f81525081600281106118fe57fe5b6009831415611a62576040518060400160405280600a8152602001601a81525081600281106118fe57fe5b600a831415611a95576040518060400160405280603f815260200160068152508160028110611a8d57fe5b602002015191505b5092915050565b60008060008060006001871480611ab35750600287145b15611bd9578560011415611acf57506103209050610384611bd4565b8560021415611ae657506102c6905061032a611bd4565b8560031415611afd57506102a8905061030c611bd4565b8560041415611b14575061026290506102c6611bd4565b8560051415611b2b575061023a90506102a8611bd4565b8560061415611b42575061021c905061028a611bd4565b8560071415611b5957506101f49050610244611bd4565b8560081415611b7057506101e09050610226611bd4565b8560091415611b8757506101c2905061021c611bd4565b6040805162461bcd60e51b815260206004820152601260248201527f57726f6e6720746f6b656e207261726974790000000000000000000000000000604482015290519081900360640190fd5b611d26565b6004871480611be85750600387145b15611cb9578560011415611c0457506101f49050610258611bd4565b8560021415611c1b57506101a49050610208611bd4565b8560031415611c32575061017c90506101e0611bd4565b8560041415611c49575061015490506101b8611bd4565b8560051415611c60575061014a90506101ae611bd4565b8560061415611c7757506101229050610186611bd4565b8560071415611c8d575060fa905061015e611bd4565b8560081415611ca3575060f09050610154611bd4565b8560091415611b87575060c8905061012c611bd4565b6005871415611cd9578560011415611c0457506101f49050610258611bd4565b6040805162461bcd60e51b815260206004820152601060248201527f57726f6e6720746f6b656e207479706500000000000000000000000000000000604482015290519081900360640190fd5b818103808981611d3257fe5b06830195508060108a901c81611d4457fe5b06830194508060208a901c81611d5657fe5b068301935050505093509350939050565b6040518061016001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345434453413a20696e76616c6964207369676e6174757265202773272076616c756545434453413a20696e76616c6964207369676e6174757265202776272076616c7565a264697066735822122009ba47badea363291d20541a582009e3be007e2fc0e0d373fe670109e6a4306964736f6c63430006080033

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

0000000000000000000000002af75676692817d85121353f0d6e8e9ae6ad55760000000000000000000000007e439a012e06b9bd4a9a08a0a945b46bea3a215b0000000000000000000000005694bce5b6f06dcd69028d40ab856efc295a524b000000000000000000000000012408dd7d43a6b3949bdaa281c123b19652a0dc00000000000000000000000017acddb7053be19e852e64dc5a344b599756f5570000000000000000000000000000000000000000000000000000000000000001

-----Decoded View---------------
Arg [0] : INVENTORY_ (address): 0x2aF75676692817d85121353f0D6e8E9aE6AD5576
Arg [1] : COMMON_CRATE_ (address): 0x7e439A012E06b9Bd4a9A08A0A945B46Bea3a215b
Arg [2] : RARE_CRATE_ (address): 0x5694bcE5b6F06DCd69028D40ab856Efc295A524b
Arg [3] : EPIC_CRATE_ (address): 0x012408Dd7D43a6b3949BdAA281C123B19652A0dC
Arg [4] : LEGENDARY_CRATE_ (address): 0x17ACDdB7053BE19e852e64Dc5A344b599756f557
Arg [5] : counter_ (uint256): 1

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000002af75676692817d85121353f0d6e8e9ae6ad5576
Arg [1] : 0000000000000000000000007e439a012e06b9bd4a9a08a0a945b46bea3a215b
Arg [2] : 0000000000000000000000005694bce5b6f06dcd69028d40ab856efc295a524b
Arg [3] : 000000000000000000000000012408dd7d43a6b3949bdaa281c123b19652a0dc
Arg [4] : 00000000000000000000000017acddb7053be19e852e64dc5a344b599756f557
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000001


Deployed Bytecode Sourcemap

44373:2629:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44373:2629:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;44970:102:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;44970:102:0;-1:-1:-1;;;;;44970:102:0;;:::i;:::-;;44563:24;;;:::i;:::-;;;;-1:-1:-1;;;;;44563:24:0;;;;;;;;;;;;;;40743:58;;;:::i;41679:213::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;41679:213:0;;;;;;-1:-1:-1;;;;;41679:213:0;;:::i;40683:53::-;;;:::i;44493:61::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;44493:61:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;40810:22;;;:::i;2821:148::-;;;:::i;2179:79::-;;;:::i;46194:805::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;46194:805:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;46194:805:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;46194:805: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;46194:805:0;;-1:-1:-1;46194:805:0;-1:-1:-1;46194:805:0;:::i;40561:55::-;;;:::i;40623:53::-;;;:::i;40513:41::-;;;:::i;3124:244::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;3124:244:0;-1:-1:-1;;;;;3124:244:0;;:::i;44970:102::-;2401:12;:10;:12::i;:::-;2391:6;;-1:-1:-1;;;;;2391:6:0;;;:22;;;2383:67;;;;;-1:-1:-1;;;2383:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45042:9:::1;:22:::0;;-1:-1:-1;;45042:22:0::1;-1:-1:-1::0;;;;;45042:22:0;;;::::1;::::0;;;::::1;::::0;;44970:102::o;44563:24::-;;;-1:-1:-1;;;;;44563:24:0;;:::o;40743:58::-;;;:::o;41679:213::-;2401:12;:10;:12::i;:::-;2391:6;;-1:-1:-1;;;;;2391:6:0;;;:22;;;2383:67;;;;;-1:-1:-1;;;2383:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41781:30:::1;41814:23;41827:9;41814:12;:23::i;:::-;41781:56;;41848:8;-1:-1:-1::0;;;;;41848:26:0::1;;41875:8;41848:36;;;;;;;;;;;;;-1:-1:-1::0;;;;;41848:36:0::1;-1:-1:-1::0;;;;;41848:36:0::1;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;41848:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;41848:36:0;;;;2461:1;41679:213:::0;;:::o;40683:53::-;;;:::o;44493:61::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;40810:22::-;;;;:::o;2821:148::-;2401:12;:10;:12::i;:::-;2391:6;;-1:-1:-1;;;;;2391:6:0;;;:22;;;2383:67;;;;;-1:-1:-1;;;2383:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2928:1:::1;2912:6:::0;;2891:40:::1;::::0;-1:-1:-1;;;;;2912:6:0;;::::1;::::0;2891:40:::1;::::0;2928:1;;2891:40:::1;2959:1;2942:19:::0;;-1:-1:-1;;2942:19:0::1;::::0;;2821:148::o;2179:79::-;2217:7;2244:6;-1:-1:-1;;;;;2244:6:0;2179:79;:::o;46194:805::-;11882:1;46299:9;:47;;46291:87;;;;;-1:-1:-1;;;46291:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;46409:1;46397:8;:13;;46389:55;;;;;-1:-1:-1;;;46389:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;46478:9;;-1:-1:-1;;;;;46478:9:0;46506:24;46498:66;;;;;-1:-1:-1;;;46498:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;46577:14;46594:12;:10;:12::i;:::-;-1:-1:-1;;;;;46633:14:0;;;46617:13;46633:14;;;:6;:14;;;;;;;;:25;;;;;;;;;;46695:36;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;46695:36:0;;;;;;46685:47;;;;;;;;;46751:43;;;;;;;;;;;;;;;;;;;;46577:29;;-1:-1:-1;46633:25:0;46685:47;;46751:57;;;:43;;46695:36;46790:3;;;;;;46751:43;46790:3;;;;46751:43;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;46751:30:0;;-1:-1:-1;46751:5:0;;-1:-1:-1;46751:28:0;;-1:-1:-1;46751:30:0:i;:::-;:38;:43;:38;:43;:::i;:::-;-1:-1:-1;;;;;46751:57:0;;46743:98;;;;;-1:-1:-1;;;46743:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;46854:12;46887:3;;46877:14;;;;;30:3:-1;22:6;14;1:33;46877:14:0;;45:16:-1;;46877:14:0;;;;;;;-1:-1:-1;46903:38:0;;-1:-1:-1;46915:9:0;;-1:-1:-1;46926:8:0;;-1:-1:-1;46877:14:0;;-1:-1:-1;46903:11:0;:38::i;:::-;-1:-1:-1;;;;;;;46954:14:0;;;;;;;:6;:14;;;;;;;;:25;;;;;;;;;;46990:1;46982:9;;;46954:37;;;-1:-1:-1;;;;46194:805:0:o;40561:55::-;;;:::o;40623:53::-;;;:::o;40513:41::-;;;:::o;3124:244::-;2401:12;:10;:12::i;:::-;2391:6;;-1:-1:-1;;;;;2391:6:0;;;:22;;;2383:67;;;;;-1:-1:-1;;;2383:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3213:22:0;::::1;3205:73;;;;-1:-1:-1::0;;;3205:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3315:6;::::0;;3294:38:::1;::::0;-1:-1:-1;;;;;3294:38:0;;::::1;::::0;3315:6;::::1;::::0;3294:38:::1;::::0;::::1;3343:6;:17:::0;;-1:-1:-1;;3343:17:0::1;-1:-1:-1::0;;;;;3343:17:0;;;::::1;::::0;;;::::1;::::0;;3124:244::o;727:106::-;815:10;727:106;:::o;43639:600::-;43703:21;11882:1;43741:9;:47;43737:495;;;-1:-1:-1;43812:16:0;43805:23;;43737:495;11837:1;43850:9;:45;43846:386;;;-1:-1:-1;43919:14:0;43912:21;;43846:386;11794:1;43955:9;:45;43951:281;;;-1:-1:-1;44024:14:0;44017:21;;43951:281;44060:50;44056:176;;-1:-1:-1;44134:19:0;44127:26;;44056:176;44186:34;;;-1:-1:-1;;;44186:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;44056:176;43639:600;;;:::o;6880:269::-;7082:58;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;7082:58:0;;;;;;;7072:69;;;;;;6880:269::o;4496:2110::-;4574:7;4637:9;:16;4657:2;4637:22;4633:96;;4676:41;;;-1:-1:-1;;;4676:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;4633:96;5090:4;5075:20;;5069:27;5136:4;5121:20;;5115:27;5190:4;5175:20;;5169:27;4798:9;5161:36;6120:66;6107:79;;6103:156;;;6203:44;;-1:-1:-1;;;6203:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6103:156;6275:1;:7;;6280:2;6275:7;;:18;;;;;6286:1;:7;;6291:2;6286:7;;6275:18;6271:95;;;6310:44;;-1:-1:-1;;;6310:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6271:95;6480:24;;;6463:14;6480:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6463:14;;6480:24;;;;;;;-1:-1:-1;;6480:24:0;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;6480:24:0;;-1:-1:-1;;6480:24:0;;;-1:-1:-1;;;;;;;6523:20:0;;6515:57;;;;;-1:-1:-1;;;6515:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6592:6;4496:2110;-1:-1:-1;;;;;;4496:2110:0:o;42552:1079::-;42652:13;42644:47;;;;;-1:-1:-1;;;42644:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;42702:30;42735:23;42748:9;42735:12;:23::i;:::-;42702:56;;42771:14;42788:12;:10;:12::i;:::-;42871:52;;;;;;-1:-1:-1;;;;;42871:52:0;;;;;;;42909:4;42871:52;;;;42839:19;42828:30;;42871:52;;;;;;;;42771:29;;-1:-1:-1;42828:30:0;;42871:21;;;;;;:52;;;;;;;;;;;;;;;42811:14;42871:21;:52;;;2:2:-1;;;;27:1;24;17:12;2:2;42871:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42871:52:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;42934:21:0;;;;;;;;;;;;;;-1:-1:-1;;;;;42934:13:0;;;;;:21;;;;;-1:-1:-1;;42934:21:0;;;;;;;-1:-1:-1;42934:13:0;:21;;;2:2:-1;;;;27:1;24;17:12;2:2;42934:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;42992:16:0;;;43006:1;42992:16;;;;;;;;;42968:21;;-1:-1:-1;42992:16:0;-1:-1:-1;42992:16:0;;;17:15:-1;;109:14;42992:16:0;88:42:-1;-1:-1;;43045:16:0;;;43059:1;43045:16;;;;;;;;;42968:40;;-1:-1:-1;43019:23:0;;43045:16;-1:-1:-1;43045:16:0;;;17:15:-1;;109:14;43045:16:0;88:42:-1;-1:-1;;43094:16:0;;;43108:1;43094:16;;;;;;;;;43019:42;;-1:-1:-1;43072:19:0;;43094:16;-1:-1:-1;43094:16:0;;;17:15:-1;;109:14;43094:16:0;88:42:-1;144:17;;-1:-1;43094:16:0;43072:38;;43126:9;43121:98;43137:1;43142;43137:6;43121:98;;43177:1;43165:6;43172:1;43165:9;;;;;;;;;;;;;:13;;;;;43201:6;43193:2;43196:1;43193:5;;;;;;;;-1:-1:-1;;;;;43193:14:0;;;:5;;;;;;;;;;;:14;43145:3;;43121:98;;;-1:-1:-1;43250:7:0;;43231:16;43268:327;43289:8;43284:1;:13;43268:327;;43323:6;;43319:90;;43375:16;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;43375:16:0;;;;;;43365:27;;;;;;;;;43319:90;43423:23;43449:39;:4;43468:9;43479:8;43449:39;:18;:39;:::i;:::-;43423:65;;43503:9;-1:-1:-1;;;;;43503:19:0;;43523:2;43527:6;43535:4;43541:6;43549:5;43503:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;43503:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;43503:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;43503:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;43503:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43503:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;43582:1:0;43570:13;;;;;-1:-1:-1;;43299:3:0;;43268:327;;;-1:-1:-1;43605:7:0;:18;-1:-1:-1;;;;;;;;;42552:1079:0:o;20615:3797::-;20761:16;;;20775:1;20761:16;;;;;;;;;20716:23;;20761:16;;;17:15:-1;;109:14;20761:16:0;88:42:-1;144:17;;-1:-1;20761:16:0;20752:25;;11882:1;20792:9;:30;20788:3617;;;20885:1;20873:13;;20839:31;20903:488;20923:1;20928;20923:6;20903:488;;20993:30;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;20993:30:0;;;;;;;20983:41;;;;;21056:319;21091:265;20983:41;21171:9;21207:7;21021:1;21269:28;;;:64;;11882:1;21269:64;;;11837:1;21269:64;21091:17;:265::i;:::-;21056:12;:319::i;:::-;21044:6;21051:1;21044:9;;;;;;;;;;;;;;;;;:331;-1:-1:-1;20931:3:0;;20903:488;;;;20788:3617;;;;11837:1;21412:9;:28;21408:2997;;;21476:32;21527;21578;21628:37;21655:9;21628:26;:37::i;:::-;21457:208;;-1:-1:-1;21457:208:0;-1:-1:-1;21457:208:0;-1:-1:-1;21687:9:0;21682:672;21702:1;21707;21702:6;21682:672;;21772:30;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;21772:30:0;;;;;;;21762:41;;;;;21835:503;21870:449;21762:41;21950:9;21986:7;21800:1;22079:29;;;;:91;;;22146:24;22141:1;:29;22079:91;:153;;;;22208:24;22203:1;:29;22079:153;22048:248;;11882:1;22048:248;;21835:503;21823:6;21830:1;21823:9;;;;;;;;;;;;;;;;;:515;-1:-1:-1;21710:3:0;;21682:672;;;;21408:2997;;;;;;11794:1;22375:9;:28;22371:2034;;;22439:31;22489;22538:35;22563:9;22538:24;:35::i;:::-;22420:153;;-1:-1:-1;22420:153:0;-1:-1:-1;22595:9:0;22590:737;22610:1;22615;22610:6;22590:737;;22680:30;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;22680:30:0;;;;;;;22670:41;;;;;11882:1;22795:28;;;22791:222;;;-1:-1:-1;11837:1:0;22791:222;;;22914:23;22909:1;:28;22905:108;;;-1:-1:-1;11794:1:0;22905:108;23043:268;23078:214;23122:9;23158;23194:7;23228:1;23256:13;23078:17;:214::i;23043:268::-;23031:6;23038:1;23031:9;;;;;;;;;;;;;;;;;:280;-1:-1:-1;;22618:3:0;;22590:737;;;;22371:2034;;;;;23348:33;23344:1061;;23417:31;23467:36;23521:35;23546:9;23521:24;:35::i;:::-;23398:158;;-1:-1:-1;23398:158:0;-1:-1:-1;23578:9:0;23573:747;23593:1;23598;23593:6;23573:747;;23663:30;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;23663:30:0;;;;;;;23653:41;;;;;11882:1;23778:28;;;23774:232;;;-1:-1:-1;11837:1:0;23774:232;;;23897:28;23892:1;:33;23888:118;;;-1:-1:-1;11751:1:0;23888:118;24036:268;24071:214;24115:9;24151;24187:7;24221:1;24249:13;24071:17;:214::i;24036:268::-;24024:6;24031:1;24024:9;;;;;;;;;;;;;;;;;:280;-1:-1:-1;;23601:3:0;;23573:747;;23344:1061;24352:41;;;-1:-1:-1;;;24352:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;23344:1061;20615:3797;;;;;:::o;25911:1484::-;26105:24;;:::i;:::-;26143:17;26162:20;26186:36;26213:1;26200:9;:14;;26216:5;26186:13;:36::i;:::-;26263:30;;;26142:80;;-1:-1:-1;26142:80:0;-1:-1:-1;26308:17:0;;26304:86;;26342:21;;;:36;;;26304:86;26402:19;26424:58;26453:2;26440:9;:15;;26457:9;26468:13;26424:15;:58::i;:::-;26524:20;;;:34;;;26402:80;-1:-1:-1;12346:1:0;26575:25;;;:57;;;12398:1;26604:9;:28;26575:57;26571:563;;;26667:1;26653:11;:15;26649:474;;;26706:31;26734:2;26721:9;:15;;26706:14;:31::i;:::-;26689:14;;;:48;26649:474;;;26809:12;26824:30;26851:2;26838:9;:15;;26824:13;:30::i;:::-;26904:13;;;:20;;;26809:45;-1:-1:-1;12398:1:0;26947:28;;26943:165;;;27018:38;27047:2;27034:9;:15;;27051:4;27018:15;:38::i;:::-;27000:15;;;:56;26943:165;26649:474;;27197:112;27245:3;27232:9;:16;;27263:9;27287:11;27197:20;:112::i;:::-;27179:14;;;27146:163;27163:14;;;27146:163;27147:14;;;27146:163;-1:-1:-1;;;27372:15:0;;;;27353:16;;;:34;-1:-1:-1;27147:8:0;25911:1484;-1:-1:-1;;25911:1484:0:o;38342:674::-;38481:18;;38530:21;;;;38628:14;;;;38673:13;;;;38717:20;;;;38768:14;;;;38646:3;38813:15;;;;38601:3;38859:14;;;38904;;;;38949;;;;38992:16;;;;;38967:2;38949:20;;;;38922:3;38904:21;;;;38877:3;38859:21;;;;38832:3;38813:22;;;;38786:3;38768:21;;;;38741:3;38717:27;;;;38690:3;38673:20;;;;38628:21;;;;38555:3;38530:28;;;;38503:3;38481:25;;;;38518:41;;;;38616:34;;;;38661:33;;;;38705:40;;;;38756:34;38801:35;38847:34;;;;38892;;;;38937:33;38981:27;38570:35;38981:27;;38342:674::o;25319:584::-;25397:7;;;25463:2;25451:14;;;25476:32;;-1:-1:-1;25500:1:0;;-1:-1:-1;25503:1:0;;-1:-1:-1;25506:1:0;;-1:-1:-1;25492:16:0;;25476:32;25523:5;25532:1;25523:10;25519:32;;;-1:-1:-1;25543:1:0;;-1:-1:-1;25546:1:0;;-1:-1:-1;25549:1:0;;-1:-1:-1;25535:16:0;;25519:32;25566:5;25575:1;25566:10;25562:32;;;-1:-1:-1;25586:1:0;;-1:-1:-1;25589:1:0;;-1:-1:-1;25592:1:0;;-1:-1:-1;25578:16:0;;25562:32;25609:5;25618:1;25609:10;25605:32;;;-1:-1:-1;25629:1:0;;-1:-1:-1;25632:1:0;;-1:-1:-1;25635:1:0;;-1:-1:-1;25621:16:0;;25605:32;25652:5;25661:1;25652:10;25648:32;;;-1:-1:-1;25672:1:0;;-1:-1:-1;25675:1:0;;-1:-1:-1;25678:1:0;;-1:-1:-1;25664:16:0;;25648:32;25695:5;25704:1;25695:10;25691:32;;;-1:-1:-1;25715:1:0;;-1:-1:-1;25718:1:0;;-1:-1:-1;25721:1:0;;-1:-1:-1;25707:16:0;;25691:32;25738:5;25747:1;25738:10;25734:32;;;-1:-1:-1;25758:1:0;;-1:-1:-1;25761:1:0;;-1:-1:-1;25764:1:0;;-1:-1:-1;25750:16:0;;25734:32;25781:5;25790:1;25781:10;25777:32;;;-1:-1:-1;25801:1:0;;-1:-1:-1;25804:1:0;;-1:-1:-1;25807:1:0;;-1:-1:-1;25793:16:0;;25777:32;25824:5;25833:1;25824:10;25820:32;;;-1:-1:-1;25844:1:0;;-1:-1:-1;25847:1:0;;-1:-1:-1;25850:1:0;;-1:-1:-1;25836:16:0;;25820:32;25867:5;25876:1;25867:10;25863:32;;;-1:-1:-1;25887:1:0;;-1:-1:-1;25890:1:0;;-1:-1:-1;25893:1:0;;-1:-1:-1;25879:16:0;;25863:32;25319:584;;;;;;;:::o;24477:260::-;24615:1;24603:13;;;;24687:1;24711;24693:14;;;;24692:20;;24674:39;;;;;;24673:45;;24477:260::o;27403:1159::-;27504:17;;27565:10;27561:994;;-1:-1:-1;;27609:8:0;;;;27604:14;27693:1;27561:994;;;27753:6;27746:13;;18969:5;27809:43;;27805:739;;;27916:1;27910:2;27902:10;;;27901:16;28005:1;27984:22;;27980:395;;;12498:1;;-1:-1:-1;12498:1:0;28129:2;28121:10;;;28120:16;28115:1;:22;28100:37;;27980:395;;;12448:1;;-1:-1:-1;28322:1:0;28316:2;28308:10;;;28307:16;28302:1;:22;28287:37;;27980:395;27805:739;;;;12549:1;;-1:-1:-1;12549:1:0;28489:2;28481:10;;;28480:16;28475:1;:22;28460:37;;27805:739;27561:994;;27403:1159;;;;;:::o;28570:2681::-;28707:19;28765:6;28758:13;;11882:1;28813:30;;28809:537;;;11882:1;28864:13;:34;:86;;;;;19354:13;28902:8;:48;28864:86;28860:168;;;28994:1;28983:8;:12;;28978:1;:18;28971:25;;;;;28860:168;19438:48;29046:46;;29042:128;;;29136:1;29125:8;:12;;29120:1;:18;29113:25;;;;;29042:128;19557:48;29188:46;;29184:128;;;29278:1;29267:8;:12;;29262:1;:18;29255:25;;;;;29184:128;29333:1;29326:8;;;;;28809:537;11837:1;29362:9;:28;29358:529;;;11882:1;29411:13;:34;:84;;;;;19678:13;29449:8;:46;29411:84;29407:166;;;29539:1;29528:8;:12;;29407:166;19760:48;29591:44;;29587:126;;;29679:1;29668:8;:12;;29587:126;19877:44;29731;;29727:126;;;29819:1;29808:8;:12;;29358:529;11794:1;29903:9;:28;29899:654;;;11882:1;29952:13;:34;:84;;;;;19994:11;29990:8;:46;29952:84;29948:166;;;30080:1;30069:8;:12;;29948:166;11882:1;30151:13;:34;:70;;;;11837:1;30189:13;:32;30151:70;30150:137;;;;-1:-1:-1;20074:46:0;30243:44;;30150:137;30128:251;;;30345:1;30334:8;:12;;30128:251;20189:46;30397:44;;30393:126;;;30485:1;30474:8;:12;;29899:654;30569:33;30565:679;;11882:1;30623:13;:34;:89;;;;;20313:9;30661:8;:51;30623:89;30619:171;;;30756:1;30745:8;:12;;30619:171;11882:1;30808:13;:34;:70;;;;11837:1;30846:13;:32;30808:70;30804:406;;;20396:52;30903:49;;30899:139;;;31000:1;30989:8;:12;;30899:139;20522:49;31060;;31056:139;;;31157:1;31146:8;:12;;30565:679;28570:2681;;;;;;:::o;31259:117::-;31365:2;31358:9;;31353:1;:15;;31259:117::o;31506:2100::-;31581:14;31624:10;;;;;31651:34;;31647:1952;;;31711:114;;;;;;;;13285:1;31711:114;;;;13351:2;31711:114;;;31819:5;31711:114;;;;;;;;;;;31702:123;;31647:1952;;;12676:1;31847:4;:33;31843:1756;;;31906:113;;;;;;;;13416:1;31906:113;;;;13479:2;31906:113;;;32013:5;31906:113;;;;;;31843:1756;12734:1;32041:4;:29;32037:1562;;;32096:112;;;;;;;;13543:1;32096:112;;;;13606:2;32096:112;;;32202:5;32096:112;;;;;;32037:1562;12795:1;32230:4;:32;32226:1373;;;32288:106;;;;;;;;13667:1;32288:106;;;;13727:2;32288:106;;;32388:5;32288:106;;;;;;32226:1373;12873:1;32416:4;:49;32412:1187;;;32491:111;;;;;;;;13790:2;32491:111;;;;13854:2;32491:111;;;32596:5;32491:111;;;;;;32412:1187;12947:1;32624:4;:45;32620:979;;;32695:106;;;;;;;;13915:2;32695:106;;;;13976:2;32695:106;;;32795:5;32695:106;;;;;;32620:979;13021:1;32823:4;:45;32819:780;;;32894:111;;;;;;;;14295:2;32894:111;;;;14100:2;32894:111;;;32999:5;32894:111;;;;;;32819:780;13082:1;33027:4;:32;33023:576;;;33085:110;;;;;;;;14165:1;33085:110;;;;14544:2;33085:110;;;33189:5;33085:110;;;;;;33023:576;13153:1;33217:4;:42;33213:386;;;33285:106;;;;;;;;14037:2;33285:106;;;;14356:2;33285:106;;;33385:5;33285:106;;;;;;33213:386;13220:2;33413:4;:38;33409:190;;;33477:110;;;;;;;;14418:2;33477:110;;;;14608:1;33477:110;;;33581:5;33477:110;;;;;;;;;;;33468:119;;33409:190;31506:2100;;;;;:::o;33614:4720::-;33795:13;33823;33851;33892:11;33914;12346:1;33940:9;:25;:57;;;;12398:1;33969:9;:28;33940:57;33936:4222;;;34018:11;34033:1;34018:16;34014:1305;;;-1:-1:-1;14983:3:0;;-1:-1:-1;15051:3:0;34014:1305;;;34156:11;34171:1;34156:16;34152:1167;;;-1:-1:-1;15119:3:0;;-1:-1:-1;15187:3:0;34152:1167;;;34294:11;34309:1;34294:16;34290:1029;;;-1:-1:-1;15255:3:0;;-1:-1:-1;15323:3:0;34290:1029;;;34432:11;34447:1;34432:16;34428:891;;;-1:-1:-1;15391:3:0;;-1:-1:-1;15459:3:0;34428:891;;;34570:11;34585:1;34570:16;34566:753;;;-1:-1:-1;15527:3:0;;-1:-1:-1;15595:3:0;34566:753;;;34708:11;34723:1;34708:16;34704:615;;;-1:-1:-1;15663:3:0;;-1:-1:-1;15731:3:0;34704:615;;;34846:11;34861:1;34846:16;34842:477;;;-1:-1:-1;15799:3:0;;-1:-1:-1;15867:3:0;34842:477;;;34984:11;34999:1;34984:16;34980:339;;;-1:-1:-1;15935:3:0;;-1:-1:-1;16003:3:0;34980:339;;;35122:11;35137:1;35122:16;35118:201;;;-1:-1:-1;16071:3:0;;-1:-1:-1;16139:3:0;35118:201;;;35275:28;;;-1:-1:-1;;;35275:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;35118:201;33936:4222;;;12498:1;35340:9;:26;:56;;;;12448:1;35370:9;:26;35340:56;35336:2822;;;35417:11;35432:1;35417:16;35413:1305;;;-1:-1:-1;16209:3:0;;-1:-1:-1;16277:3:0;35413:1305;;;35555:11;35570:1;35555:16;35551:1167;;;-1:-1:-1;16345:3:0;;-1:-1:-1;16413:3:0;35551:1167;;;35693:11;35708:1;35693:16;35689:1029;;;-1:-1:-1;16481:3:0;;-1:-1:-1;16549:3:0;35689:1029;;;35831:11;35846:1;35831:16;35827:891;;;-1:-1:-1;16617:3:0;;-1:-1:-1;16685:3:0;35827:891;;;35969:11;35984:1;35969:16;35965:753;;;-1:-1:-1;16753:3:0;;-1:-1:-1;16821:3:0;35965:753;;;36107:11;36122:1;36107:16;36103:615;;;-1:-1:-1;16889:3:0;;-1:-1:-1;16957:3:0;36103:615;;;36245:11;36260:1;36245:16;36241:477;;;-1:-1:-1;17025:3:0;;-1:-1:-1;17093:3:0;36241:477;;;36383:11;36398:1;36383:16;36379:339;;;-1:-1:-1;17161:3:0;;-1:-1:-1;17229:3:0;36379:339;;;36521:11;36536:1;36521:16;36517:201;;;-1:-1:-1;17297:3:0;;-1:-1:-1;17365:3:0;36517:201;;35336:2822;12549:1;36739:9;:27;36735:1423;;;36787:11;36802:1;36787:16;36783:1305;;;-1:-1:-1;17435:3:0;;-1:-1:-1;17503:3:0;36783:1305;;36735:1423;38120:26;;;-1:-1:-1;;;38120:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;36735:1423;38184:9;;;;38219:4;38184:9;38219:12;;;;;38212:3;:20;38204:28;;38273:5;38267:2;38259:4;:10;;38258:20;;;;;;38251:3;:28;38243:36;;38320:5;38314:2;38306:4;:10;;38305:20;;;;;;38298:3;:28;38290:36;;33614:4720;;;;;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://09ba47badea363291d20541a582009e3be007e2fc0e0d373fe670109e6a43069

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

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