Contract 0x4911c336dc62b2e57d1f31cc4f71e889bb46622d 1

Txn Hash Method
Block
From
To
Value [Txn Fee]
0xc5ace4dee2951cdbaba7e6dc48c6b3868c467d1fccb18a63b870457ba92e691fStake93247242021-10-22 2:02:134 hrs 14 mins ago0xa8ed470e45d5f965e293551f6bf0a608248307f1 IN  0x4911c336dc62b2e57d1f31cc4f71e889bb46622d0 HT0.00036675225 2.25
0xb6454976c569024c85f2727e5cb34f4b386848daebb955404c92ba567e004d85Redeem93246932021-10-22 2:00:404 hrs 16 mins ago0xa8ed470e45d5f965e293551f6bf0a608248307f1 IN  0x4911c336dc62b2e57d1f31cc4f71e889bb46622d0 HT0.000285804 2.25
0x9e76f19a2c9f79ea00a5a2ef72245b6ae79b13ce13a8edc2937b57d300791240Redeem92974242021-10-21 3:17:121 day 2 hrs ago0xb1cd3ec6d265bf8296177f80d08e387d844d251b IN  0x4911c336dc62b2e57d1f31cc4f71e889bb46622d0 HT0.000258129 2.25
0x2b3a28c1885f027c8f5f99218e122a2b58d3aac66482879760de81f7b91d1d7fRedeem92713022021-10-20 5:31:052 days 45 mins ago0xf4adc2f895668652b41511d87790ad2cc15be3c7 IN  0x4911c336dc62b2e57d1f31cc4f71e889bb46622d0 HT0.0002581292.25
0xc9edb82d1ac4069f02eb648b20235868a7ac141b030938d072bcd02f20d886bcRedeem92712782021-10-20 5:29:532 days 46 mins ago0xf4adc2f895668652b41511d87790ad2cc15be3c7 IN  0x4911c336dc62b2e57d1f31cc4f71e889bb46622d0 HT0.0002581292.25
0xf434e8bd673c1c1230115077390ae62636a117b88a4098d69a65c657026d1cb4Redeem92712462021-10-20 5:28:172 days 48 mins ago0xf4adc2f895668652b41511d87790ad2cc15be3c7 IN  0x4911c336dc62b2e57d1f31cc4f71e889bb46622d0 HT0.0002581292.25
0x9a1810a70268923cc41409310e06cc3214d08b72266f8385ddb39afb6b91e74dRedeem92712152021-10-20 5:26:442 days 49 mins ago0xf4adc2f895668652b41511d87790ad2cc15be3c7 IN  0x4911c336dc62b2e57d1f31cc4f71e889bb46622d0 HT0.0002581292.25
0xd9b8a7f62436da062d4ec14e6de4ad1af08d42bfdf115e0e621e775f8eabeb59Redeem92712102021-10-20 5:26:292 days 50 mins ago0xf4adc2f895668652b41511d87790ad2cc15be3c7 IN  0x4911c336dc62b2e57d1f31cc4f71e889bb46622d0 HT0.0002581292.25
0x4b21f10fd7540ecaf6252dc1dea21f5758450435a8e6c8dfd393ca8f16ba6985Redeem92711982021-10-20 5:25:532 days 50 mins ago0xf4adc2f895668652b41511d87790ad2cc15be3c7 IN  0x4911c336dc62b2e57d1f31cc4f71e889bb46622d0 HT0.0002581292.25
0x215e5cd21796e2c850107e6367f0a76d384c0eec9ff3f3c1ae24dfe9959381a5Redeem92711732021-10-20 5:24:382 days 52 mins ago0xf4adc2f895668652b41511d87790ad2cc15be3c7 IN  0x4911c336dc62b2e57d1f31cc4f71e889bb46622d0 HT0.0002581022.25
0x02acde52370ef8767a3d7a3f764f7efa83cc07e1f8bda6cb27f0bfa363b948b6Stake91057182021-10-14 11:31:377 days 18 hrs ago0x99cefd21bb1eba4a668cfe85c55fb78f66ef646e IN  0x4911c336dc62b2e57d1f31cc4f71e889bb46622d0 HT0.00037675252.5
0xfe28bbb16de131b9ee807435fd7eb7525fd046f5f2ad1444ac714ee1b84c5b2bStake90699122021-10-13 5:41:139 days 35 mins ago0xb1cd3ec6d265bf8296177f80d08e387d844d251b IN  0x4911c336dc62b2e57d1f31cc4f71e889bb46622d0 HT0.00033907725 2.25
0x23923cb58018345e7964d080da59488ac8f65ac26fb752466c99345481f156eaStake90698532021-10-13 5:38:169 days 38 mins ago0xb1cd3ec6d265bf8296177f80d08e387d844d251b IN  0x4911c336dc62b2e57d1f31cc4f71e889bb46622d0 HT0.00033907725 2.25
0x9f999f754f471bd816c5c755f3d9577a86d6564f0768d2488f2850368d536a66Stake90697622021-10-13 5:33:439 days 42 mins ago0xb1cd3ec6d265bf8296177f80d08e387d844d251b IN  0x4911c336dc62b2e57d1f31cc4f71e889bb46622d0 HT0.00058859325 2.25
0xd349febcbd9bf9ec65c1871a6604ebade5702b61b2552d3af83b021c15251e0cStake90696282021-10-13 5:27:019 days 49 mins ago0xb1cd3ec6d265bf8296177f80d08e387d844d251b IN  0x4911c336dc62b2e57d1f31cc4f71e889bb46622d0 HT0.00061760475 2.25
0xeb50b4b1f60610ead842276e55f73c987d76757ac913fd880ef4d0bfa11a12bbRedeem90688762021-10-13 4:49:259 days 1 hr ago0x331472a021aab53c224f72e4dc835794b0d64891 IN  0x4911c336dc62b2e57d1f31cc4f71e889bb46622d0 HT0.00030191942.7
0xa80acf2245c91a031628e6f78bca3a11c1a052564f6d440fe21146d36f142729Redeem90122852021-10-11 5:39:4611 days 36 mins ago0xe5da5f2d1943626e310cd9b6e61fe2d5365084c2 IN  0x4911c336dc62b2e57d1f31cc4f71e889bb46622d0 HT0.0003350972.7
0x1e7f3d2a1fa9dd1fe8dea0dc6257aad60688e7d809e9da6c9599619acb433f84Stake89817242021-10-10 4:11:4112 days 2 hrs ago0x935d42b7b45fadc515517fcb7abcd9f7e6f5a74e IN  0x4911c336dc62b2e57d1f31cc4f71e889bb46622d0 HT0.00143712252.5
0x6b1f1252902ad53a579faa769ceec7ad9a82a254210c239356b7bef3d2ab3b2bStake89817082021-10-10 4:10:5312 days 2 hrs ago0x935d42b7b45fadc515517fcb7abcd9f7e6f5a74e IN  0x4911c336dc62b2e57d1f31cc4f71e889bb46622d0 HT0.00040248752.5
0x09b71af4092c792e2fbbcda478fe7e20faad7dde75aaf05d464be66a23acdf18Redeem89492982021-10-09 1:10:2113 days 5 hrs ago0x95723ea02b7cc9ac9bc926586384a0646ca71f5b IN  0x4911c336dc62b2e57d1f31cc4f71e889bb46622d0 HT0.0003018872.7
0x28f971e5a5439f216a2a40ebf18fc7764f801c5dcf2a9869dc64f7041bcd8b4bRedeem89492912021-10-09 1:10:0013 days 5 hrs ago0x95723ea02b7cc9ac9bc926586384a0646ca71f5b IN  0x4911c336dc62b2e57d1f31cc4f71e889bb46622d0 HT0.00030191942.7
0xe08e8df7b343cfe9222322c93fa6f32e8812a10872380c9068462ec7568824cbRedeem89492822021-10-09 1:09:3313 days 5 hrs ago0x95723ea02b7cc9ac9bc926586384a0646ca71f5b IN  0x4911c336dc62b2e57d1f31cc4f71e889bb46622d0 HT0.00033512942.7
0x6e4cc55c31e089daa54a8aabd7f0daaebd09ff4c36592f20e61afac801d41c18Stake89334072021-10-08 11:55:4813 days 18 hrs ago0x51f12715dc1ec5d37e29c53552b9adaa47dfe95f IN  0x4911c336dc62b2e57d1f31cc4f71e889bb46622d0 HT0.00040750252.5
0xf94b6c7c8edc67b8d69faba852fc821ba1a9c726769f43b142ab53afee9494cbRedeem89333862021-10-08 11:54:4513 days 18 hrs ago0x51f12715dc1ec5d37e29c53552b9adaa47dfe95f IN  0x4911c336dc62b2e57d1f31cc4f71e889bb46622d0 HT0.000317562.5
0x1f4205c7c6520659d04f4dfab0e1b39b8eecd0005957409fb8a5880049779b08Stake89300782021-10-08 9:09:2113 days 21 hrs ago0x99cefd21bb1eba4a668cfe85c55fb78f66ef646e IN  0x4911c336dc62b2e57d1f31cc4f71e889bb46622d0 HT0.00040248752.5
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Staking

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at hecoinfo.com on 2021-08-11
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.4;


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


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 tokenId) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
      * @dev Safely transfers `tokenId` token from `from` to `to`.
      *
      * Requirements:
      *
      * - `from` cannot be the zero address.
      * - `to` cannot be the zero address.
      * - `tokenId` token must exist and be owned by `from`.
      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
      *
      * Emits a {Transfer} event.
      */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
}


/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data) external;
}


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}


/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {

    /**
        @dev Handles the receipt of a single ERC1155 token type. This function is
        called at the end of a `safeTransferFrom` after the balance has been updated.
        To accept the transfer, this must return
        `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
        (i.e. 0xf23a6e61, or its own function selector).
        @param operator The address which initiated the transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param id The ID of the token being transferred
        @param value The amount of tokens being transferred
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
    */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    )
        external
        returns(bytes4);

    /**
        @dev Handles the receipt of a multiple ERC1155 token types. This function
        is called at the end of a `safeBatchTransferFrom` after the balances have
        been updated. To accept the transfer(s), this must return
        `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
        (i.e. 0xbc197c81, or its own function selector).
        @param operator The address which initiated the batch transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param ids An array containing ids of each token being transferred (order and length must match values array)
        @param values An array containing amounts of each token being transferred (order and length must match ids array)
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
    */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    )
        external
        returns(bytes4);
}


/*
 * @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 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) {
        return msg.sender;
    }

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


/**
 * @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.
 */
abstract 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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual 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;
    }
}


interface IStaking {
    // events
    event Stake(
        address indexed fromAddress,
        address indexed toAddress,
        address nftAddress,
        uint256 tokenId,
        uint256 amount,
        uint256 schema,
        uint256 orderId
    );

    event Redeem(
        address indexed fromAddress,
        address indexed toAddress,
        address nftAddress,
        uint256 tokenId,
        uint256 amount,
        uint256 schema,
        uint256 orderId
    );

    function stake(
        address[] memory nftAddresses,
        uint256[] memory tokenIds,
        uint256[] memory amounts,
        uint256[] memory schemas,
        uint256[] memory orderIds,
        bytes32[] memory sigRs,
        bytes32[] memory sigSs,
        uint8[] memory sigVs
    ) external;

    function redeem(
        address[] memory nftAddresses,
        uint256[] memory tokenIds,
        uint256[] memory amounts,
        uint256[] memory schemas,
        uint256[] memory orderIds,
        bytes32[] memory sigRs,
        bytes32[] memory sigSs,
        uint8[] memory sigVs
    ) external;
}


/**
 * https://github.com/maticnetwork/pos-portal/blob/master/contracts/common/Initializable.sol
 */
contract Initializable {
    bool inited = false;

    modifier initializer() {
        require(!inited, "already inited");
        _;
        inited = true;
    }
}


/**
 * https://github.com/maticnetwork/pos-portal/blob/master/contracts/common/EIP712Base.sol
 */
contract EIP712Base is Initializable {
    struct EIP712Domain {
        string name;
        string version;
        address verifyingContract;
        bytes32 salt;
    }

    string public constant ERC712_VERSION = "1";

    bytes32 internal constant EIP712_DOMAIN_TYPEHASH =
        keccak256(
            bytes(
                "EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)"
            )
        );
    bytes32 internal domainSeperator;

    // supposed to be called once while initializing.
    // one of the contractsa that inherits this contract follows proxy pattern
    // so it is not possible to do this in a constructor
    function _initializeEIP712(string memory name) internal initializer {
        _setDomainSeperator(name);
    }

    function _setDomainSeperator(string memory name) internal {
        domainSeperator = keccak256(
            abi.encode(
                EIP712_DOMAIN_TYPEHASH,
                keccak256(bytes(name)),
                keccak256(bytes(ERC712_VERSION)),
                address(this),
                bytes32(getChainId())
            )
        );
    }

    function getDomainSeperator() public view returns (bytes32) {
        return domainSeperator;
    }

    function getChainId() public view returns (uint256) {
        uint256 id;
        assembly {
            id := chainid()
        }
        return id;
    }

    /**
     * Accept message hash and returns hash message in EIP712 compatible form
     * So that it can be used to recover signer from signature signed using EIP712 formatted data
     * https://eips.ethereum.org/EIPS/eip-712
     * "\\x19" makes the encoding deterministic
     * "\\x01" is the version byte to make it compatible to EIP-191
     */
    function toTypedMessageHash(bytes32 messageHash)
        internal
        view
        returns (bytes32)
    {
        return
            keccak256(
                abi.encodePacked("\x19\x01", getDomainSeperator(), messageHash)
            );
    }
}


interface IAddressesProvider {
    function addSigner(address signer) external;

    function removeSigner(address signer) external;

    function isSigner(address signer) external view returns (bool);

    function setAddress(bytes32 key, address addr) external;

    function getAddress(bytes32 key) external view returns (address);

    function setPlatformAccount(address platformAccount) external;

    function getPlatformAccount() external view returns (address);

    function safeGetPlatformAccount() external view returns (address);
}


contract Staking is IStaking, Ownable, ERC165, IERC1155Receiver, EIP712Base {
    IAddressesProvider private _addressesProvider;

    function getAddressesProvider() public view returns (address) {
        return address(_addressesProvider);
    }

    function setAddressesProvider(address addressesProviderAddress)
        public
        onlyOwner
    {
        _addressesProvider = IAddressesProvider(addressesProviderAddress);
    }

    bytes32 constant STAKING_REQUEST_TYPEHASH =
        keccak256(
            "StakingRequest(address nftAddress,uint256 tokenId,uint256 amount,uint256 schema,uint256 orderId)"
        );

    struct StakingRequest {
        address nftAddress;
        uint256 tokenId;
        uint256 amount;
        uint256 schema;
        uint256 orderId;
    }

    // setter
    function hashStakingRequest(StakingRequest memory request)
        internal
        pure
        returns (bytes32)
    {
        return
            keccak256(
                abi.encode(
                    STAKING_REQUEST_TYPEHASH,
                    request.nftAddress,
                    request.tokenId,
                    request.amount,
                    request.schema,
                    request.orderId
                )
            );
    }

    string private _name = "Staking";

    constructor() {
        _initializeEIP712(_name);
    }

    function name() external view returns (string memory) {
        return _name;
    }

    mapping(uint256 => address) private _orderUser;
    mapping(uint256 => uint256) private _orderAmount;

    function stake(
        address[] memory nftAddresses,
        uint256[] memory tokenIds,
        uint256[] memory amounts,
        uint256[] memory schemas,
        uint256[] memory orderIds,
        bytes32[] memory sigRs,
        bytes32[] memory sigSs,
        uint8[] memory sigVs
    ) external override {
        require(
            nftAddresses.length == tokenIds.length,
            "Stake: nftAddresses length does not match tokenIds length"
        );
        require(
            nftAddresses.length == amounts.length,
            "Stake: nftAddresses length does not match amounts length"
        );
        require(
            nftAddresses.length == schemas.length,
            "Stake: nftAddresses length does not match schemas length"
        );
        require(
            nftAddresses.length == orderIds.length,
            "Stake: nftAddresses length does not match orderIds length"
        );
        require(
            nftAddresses.length == sigRs.length,
            "Stake: nftAddresses length does not match sigR length"
        );
        require(
            nftAddresses.length == sigSs.length,
            "Stake: nftAddresses length does not match sigS length"
        );
        require(
            nftAddresses.length == sigVs.length,
            "Stake: nftAddresses length does not match sigV length"
        );
        require(
            nftAddresses.length <= 30,
            "Stake: batch amount must less than 30"
        );

        uint256 _len = nftAddresses.length;

        for (uint256 _i; _i < _len; _i++) {
            address nftAddress = nftAddresses[_i];
            uint256 tokenId = tokenIds[_i];
            uint256 amount = amounts[_i];
            uint256 schema = schemas[_i];
            uint256 orderId = orderIds[_i];
            bytes32 sigR = sigRs[_i];
            bytes32 sigS = sigSs[_i];
            uint8 sigV = sigVs[_i];

            StakingRequest memory request = StakingRequest({
                nftAddress: nftAddress,
                tokenId: tokenId,
                amount: amount,
                schema: schema,
                orderId: orderId
            });

            require(
                verifyStaking(request, sigR, sigS, sigV),
                "Staking: invalid signature"
            );

            _transferNFT(
                schema,
                nftAddress,
                msg.sender,
                address(this),
                tokenId,
                amount
            );
            _orderUser[orderId] = msg.sender;
            _orderAmount[orderId] = amount;

            emit Stake(
                msg.sender,
                address(this),
                nftAddress,
                tokenId,
                amount,
                schema,
                orderId
            );
        }
    }

    function redeem(
        address[] memory nftAddresses,
        uint256[] memory tokenIds,
        uint256[] memory amounts,
        uint256[] memory schemas,
        uint256[] memory orderIds,
        bytes32[] memory sigRs,
        bytes32[] memory sigSs,
        uint8[] memory sigVs
    ) external override {
        require(
            nftAddresses.length == tokenIds.length,
            "redeem: nftAddresses length does not match tokenIds length"
        );
        require(
            nftAddresses.length == amounts.length,
            "redeem: nftAddresses length does not match amounts length"
        );
        require(
            nftAddresses.length == schemas.length,
            "redeem: nftAddresses length does not match schemas length"
        );
        require(
            nftAddresses.length == orderIds.length,
            "redeem: nftAddresses length does not match orderIds length"
        );
        require(
            nftAddresses.length == sigRs.length,
            "Stake: nftAddresses length does not match sigR length"
        );
        require(
            nftAddresses.length == sigSs.length,
            "Stake: nftAddresses length does not match sigS length"
        );
        require(
            nftAddresses.length == sigVs.length,
            "Stake: nftAddresses length does not match sigV length"
        );
        require(
            nftAddresses.length <= 30,
            "redeem: batch amount must less than 30"
        );

        uint256 _len = nftAddresses.length;

        for (uint256 _i; _i < _len; _i++) {
            address nftAddress = nftAddresses[_i];
            uint256 tokenId = tokenIds[_i];
            uint256 amount = amounts[_i];
            uint256 schema = schemas[_i];
            uint256 orderId = orderIds[_i];
            bytes32 sigR = sigRs[_i];
            bytes32 sigS = sigSs[_i];
            uint8 sigV = sigVs[_i];

            StakingRequest memory request = StakingRequest({
                nftAddress: nftAddress,
                tokenId: tokenId,
                amount: amount,
                schema: schema,
                orderId: orderId
            });

            require(
                verifyStaking(request, sigR, sigS, sigV),
                "Staking: invalid signature"
            );

            require(
                _orderUser[orderId] == msg.sender,
                "redeem: order owner does not match"
            );
            require(
                _orderAmount[orderId] == amount,
                "redeem: order amount does not match"
            );

            _transferNFT(
                schema,
                nftAddress,
                address(this),
                msg.sender,
                tokenId,
                amount
            );

            delete _orderUser[orderId];
            delete _orderAmount[orderId];

            emit Redeem(
                address(this),
                msg.sender,
                nftAddress,
                tokenId,
                amount,
                schema,
                orderId
            );
        }
    }

    function verifyStaking(
        StakingRequest memory request,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) internal view returns (bool) {
        require(
            address(_addressesProvider) != address(0),
            "Staking: addresses provider is not set"
        );
        return
            _addressesProvider.isSigner(
                ecrecover(
                    toTypedMessageHash(hashStakingRequest(request)),
                    sigV,
                    sigR,
                    sigS
                )
            );
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC165, IERC165)
        returns (bool)
    {
        return
            interfaceId == type(IERC1155Receiver).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    function onERC1155Received(
        address,
        address,
        uint256,
        uint256,
        bytes memory
    ) public view override returns (bytes4) {
        return IERC1155Receiver(this).onERC1155Received.selector;
    }

    function onERC1155BatchReceived(
        address,
        address,
        uint256[] memory,
        uint256[] memory,
        bytes memory
    ) public view override returns (bytes4) {
        return IERC1155Receiver(this).onERC1155BatchReceived.selector;
    }

    function _transferNFT(
        uint256 schema,
        address nftAddress,
        address from,
        address to,
        uint256 tokenId,
        uint256 amount
    ) internal {
        if (schema == 721) {
            require(amount == 1, "Stake: erc721 amount must be 1");
            IERC721(nftAddress).transferFrom(from, to, tokenId);
        } else if (schema == 1155) {
            require(amount > 0, "Stake: erc1155 amount must be greater than 0");
            IERC1155(nftAddress).safeTransferFrom(
                from,
                to,
                tokenId,
                amount,
                ""
            );
        } else {
            revert("Stake: unknown schema");
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"fromAddress","type":"address"},{"indexed":true,"internalType":"address","name":"toAddress","type":"address"},{"indexed":false,"internalType":"address","name":"nftAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"schema","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"orderId","type":"uint256"}],"name":"Redeem","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"fromAddress","type":"address"},{"indexed":true,"internalType":"address","name":"toAddress","type":"address"},{"indexed":false,"internalType":"address","name":"nftAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"schema","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"orderId","type":"uint256"}],"name":"Stake","type":"event"},{"inputs":[],"name":"ERC712_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAddressesProvider","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDomainSeperator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"nftAddresses","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"schemas","type":"uint256[]"},{"internalType":"uint256[]","name":"orderIds","type":"uint256[]"},{"internalType":"bytes32[]","name":"sigRs","type":"bytes32[]"},{"internalType":"bytes32[]","name":"sigSs","type":"bytes32[]"},{"internalType":"uint8[]","name":"sigVs","type":"uint8[]"}],"name":"redeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addressesProviderAddress","type":"address"}],"name":"setAddressesProvider","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"nftAddresses","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"schemas","type":"uint256[]"},{"internalType":"uint256[]","name":"orderIds","type":"uint256[]"},{"internalType":"bytes32[]","name":"sigRs","type":"bytes32[]"},{"internalType":"bytes32[]","name":"sigSs","type":"bytes32[]"},{"internalType":"uint8[]","name":"sigVs","type":"uint8[]"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6000805460ff60a01b1916905560c060405260076080819052665374616b696e6760c81b60a09081526200003791600391906200024f565b503480156200004557600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35062000125600380546200009a90620002f5565b80601f0160208091040260200160405190810160405280929190818152602001828054620000c890620002f5565b8015620001195780601f10620000ed5761010080835404028352916020019162000119565b820191906000526020600020905b815481529060010190602001808311620000fb57829003601f168201915b50506200012b92505050565b62000332565b600054600160a01b900460ff16156200017b5760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481a5b9a5d195960921b604482015260640160405180910390fd5b62000186816200019c565b506000805460ff60a01b1916600160a01b179055565b6040518060800160405280604f815260200162001dec604f913980516020918201208251838301206040805180820190915260018152603160f81b930192909252907fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6304660408051602081019690965285019390935260608401919091526001600160a01b0316608083015260a082015260c00160408051601f19818403018152919052805160209091012060015550565b8280546200025d90620002f5565b90600052602060002090601f016020900481019282620002815760008555620002cc565b82601f106200029c57805160ff1916838001178555620002cc565b82800160010185558215620002cc579182015b82811115620002cc578251825591602001919060010190620002af565b50620002da929150620002de565b5090565b5b80821115620002da5760008155600101620002df565b600181811c908216806200030a57607f821691505b602082108114156200032c57634e487b7160e01b600052602260045260246000fd5b50919050565b611aaa80620003426000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c80638da5cb5b1161008c578063bc197c8111610066578063bc197c81146101cc578063f23a6e6114610204578063f2fde38b14610223578063fe65acfe1461023657600080fd5b80638da5cb5b146101815780638f7f26bc146101a6578063936636ac146101b957600080fd5b806320379ee5116100c857806320379ee51461014c5780633408e4701461015e5780636722997a14610164578063715018a61461017957600080fd5b806301ffc9a7146100ef57806306fdde03146101175780630f7e59701461012c575b600080fd5b6101026100fd3660046117ee565b610247565b60405190151581526020015b60405180910390f35b61011f61027e565b60405161010e9190611816565b61011f604051806040016040528060018152602001603160f81b81525081565b6001545b60405190815260200161010e565b46610150565b61017761017236600461156d565b610310565b005b610177610365565b6000546001600160a01b03165b6040516001600160a01b03909116815260200161010e565b6101776101b4366004611697565b6103d9565b6101776101c7366004611697565b6108e5565b6101eb6101da36600461158e565b63bc197c8160e01b95945050505050565b6040516001600160e01b0319909116815260200161010e565b6101eb610212366004611634565b63f23a6e6160e01b95945050505050565b61017761023136600461156d565b610ebd565b6002546001600160a01b031661018e565b60006001600160e01b03198216630271189760e51b148061027857506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606003805461028d906119bc565b80601f01602080910402602001604051908101604052809291908181526020018280546102b9906119bc565b80156103065780601f106102db57610100808354040283529160200191610306565b820191906000526020600020905b8154815290600101906020018083116102e957829003601f168201915b5050505050905090565b6000546001600160a01b031633146103435760405162461bcd60e51b815260040161033a906118ac565b60405180910390fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461038f5760405162461bcd60e51b815260040161033a906118ac565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b865188511461043e5760405162461bcd60e51b81526020600482015260396024820152600080516020611a5583398151915260448201527f6e6f74206d6174636820746f6b656e496473206c656e67746800000000000000606482015260840161033a565b85518851146104a35760405162461bcd60e51b81526020600482015260386024820152600080516020611a5583398151915260448201527f6e6f74206d6174636820616d6f756e7473206c656e6774680000000000000000606482015260840161033a565b84518851146105085760405162461bcd60e51b81526020600482015260386024820152600080516020611a5583398151915260448201527f6e6f74206d6174636820736368656d6173206c656e6774680000000000000000606482015260840161033a565b835188511461056d5760405162461bcd60e51b81526020600482015260396024820152600080516020611a5583398151915260448201527f6e6f74206d61746368206f72646572496473206c656e67746800000000000000606482015260840161033a565b825188511461058e5760405162461bcd60e51b815260040161033a90611924565b81518851146105af5760405162461bcd60e51b815260040161033a90611869565b80518851146105d05760405162461bcd60e51b815260040161033a906118e1565b601e885111156106305760405162461bcd60e51b815260206004820152602560248201527f5374616b653a20626174636820616d6f756e74206d757374206c6573732074686044820152640616e2033360dc1b606482015260840161033a565b875160005b818110156108d95760008a828151811061065f57634e487b7160e01b600052603260045260246000fd5b6020026020010151905060008a838151811061068b57634e487b7160e01b600052603260045260246000fd5b6020026020010151905060008a84815181106106b757634e487b7160e01b600052603260045260246000fd5b6020026020010151905060008a85815181106106e357634e487b7160e01b600052603260045260246000fd5b6020026020010151905060008a868151811061070f57634e487b7160e01b600052603260045260246000fd5b6020026020010151905060008a878151811061073b57634e487b7160e01b600052603260045260246000fd5b6020026020010151905060008a888151811061076757634e487b7160e01b600052603260045260246000fd5b6020026020010151905060008a898151811061079357634e487b7160e01b600052603260045260246000fd5b6020026020010151905060006040518060a001604052808a6001600160a01b031681526020018981526020018881526020018781526020018681525090506107dd81858585610fa7565b6108295760405162461bcd60e51b815260206004820152601a60248201527f5374616b696e673a20696e76616c6964207369676e6174757265000000000000604482015260640161033a565b610837868a33308c8c61110b565b600085815260046020908152604080832080546001600160a01b0319163390811790915560058352928190208a905580516001600160a01b038d1681529182018b9052810189905260608101889052608081018790523091907f732a8a4bf87c0bc92f595808c9029391e114513d430a98a5694b0a5050c6eb219060a00160405180910390a350505050505050505080806108d1906119f7565b915050610635565b50505050505050505050565b865188511461094a5760405162461bcd60e51b815260206004820152603a6024820152600080516020611a3583398151915260448201527f206e6f74206d6174636820746f6b656e496473206c656e677468000000000000606482015260840161033a565b85518851146109af5760405162461bcd60e51b81526020600482015260396024820152600080516020611a3583398151915260448201527f206e6f74206d6174636820616d6f756e7473206c656e67746800000000000000606482015260840161033a565b8451885114610a145760405162461bcd60e51b81526020600482015260396024820152600080516020611a3583398151915260448201527f206e6f74206d6174636820736368656d6173206c656e67746800000000000000606482015260840161033a565b8351885114610a795760405162461bcd60e51b815260206004820152603a6024820152600080516020611a3583398151915260448201527f206e6f74206d61746368206f72646572496473206c656e677468000000000000606482015260840161033a565b8251885114610a9a5760405162461bcd60e51b815260040161033a90611924565b8151885114610abb5760405162461bcd60e51b815260040161033a90611869565b8051885114610adc5760405162461bcd60e51b815260040161033a906118e1565b601e88511115610b3d5760405162461bcd60e51b815260206004820152602660248201527f72656465656d3a20626174636820616d6f756e74206d757374206c6573732074604482015265068616e2033360d41b606482015260840161033a565b875160005b818110156108d95760008a8281518110610b6c57634e487b7160e01b600052603260045260246000fd5b6020026020010151905060008a8381518110610b9857634e487b7160e01b600052603260045260246000fd5b6020026020010151905060008a8481518110610bc457634e487b7160e01b600052603260045260246000fd5b6020026020010151905060008a8581518110610bf057634e487b7160e01b600052603260045260246000fd5b6020026020010151905060008a8681518110610c1c57634e487b7160e01b600052603260045260246000fd5b6020026020010151905060008a8781518110610c4857634e487b7160e01b600052603260045260246000fd5b6020026020010151905060008a8881518110610c7457634e487b7160e01b600052603260045260246000fd5b6020026020010151905060008a8981518110610ca057634e487b7160e01b600052603260045260246000fd5b6020026020010151905060006040518060a001604052808a6001600160a01b03168152602001898152602001888152602001878152602001868152509050610cea81858585610fa7565b610d365760405162461bcd60e51b815260206004820152601a60248201527f5374616b696e673a20696e76616c6964207369676e6174757265000000000000604482015260640161033a565b6000858152600460205260409020546001600160a01b03163314610da75760405162461bcd60e51b815260206004820152602260248201527f72656465656d3a206f72646572206f776e657220646f6573206e6f74206d61746044820152610c6d60f31b606482015260840161033a565b6000858152600560205260409020548714610e105760405162461bcd60e51b815260206004820152602360248201527f72656465656d3a206f7264657220616d6f756e7420646f6573206e6f74206d616044820152620e8c6d60eb1b606482015260840161033a565b610e1e868a30338c8c61110b565b600085815260046020908152604080832080546001600160a01b0319169055600582528083209290925581516001600160a01b038c1681529081018a90529081018890526060810187905260808101869052339030907f3e97c919630eebc6ccb5b935177cd8e77e8564d32d02f01451c9341c1857b08b9060a00160405180910390a35050505050505050508080610eb5906119f7565b915050610b42565b6000546001600160a01b03163314610ee75760405162461bcd60e51b815260040161033a906118ac565b6001600160a01b038116610f4c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161033a565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6002546000906001600160a01b03166110115760405162461bcd60e51b815260206004820152602660248201527f5374616b696e673a206164647265737365732070726f7669646572206973206e6044820152651bdd081cd95d60d21b606482015260840161033a565b6002546001600160a01b0316637df73e276001611035611030896112de565b611378565b6040805160008152602081018083529290925260ff871690820152606081018890526080810187905260a0016020604051602081039080840390855afa158015611083573d6000803e3d6000fd5b5050604051601f198101516001600160e01b031960e085901b1682526001600160a01b03166004820152602401905060206040518083038186803b1580156110ca57600080fd5b505afa1580156110de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110291906117ce565b95945050505050565b856102d114156111d557806001146111655760405162461bcd60e51b815260206004820152601e60248201527f5374616b653a2065726337323120616d6f756e74206d75737420626520310000604482015260640161033a565b6040516323b872dd60e01b81526001600160a01b0385811660048301528481166024830152604482018490528616906323b872dd906064015b600060405180830381600087803b1580156111b857600080fd5b505af11580156111cc573d6000803e3d6000fd5b505050506112d6565b85610483141561129657600081116112445760405162461bcd60e51b815260206004820152602c60248201527f5374616b653a206572633131353520616d6f756e74206d75737420626520677260448201526b06561746572207468616e20360a41b606482015260840161033a565b604051637921219560e11b81526001600160a01b0385811660048301528481166024830152604482018490526064820183905260a06084830152600060a483015286169063f242432a9060c40161119e565b60405162461bcd60e51b81526020600482015260156024820152745374616b653a20756e6b6e6f776e20736368656d6160581b604482015260640161033a565b505050505050565b60007f271beaff1001157f04f9e3347e1c88836d78b5f67c0b76c7e4d272cd6852f9cb8260000151836020015184604001518560600151866080015160405160200161135b969594939291909586526001600160a01b0394909416602086015260408501929092526060840152608083015260a082015260c00190565b604051602081830303815290604052805190602001209050919050565b600061138360015490565b60405161190160f01b602082015260228101919091526042810183905260620161135b565b80356001600160a01b03811681146113bf57600080fd5b919050565b600082601f8301126113d4578081fd5b813560206113e96113e483611998565b611967565b80838252828201915082860187848660051b8901011115611408578586fd5b855b8581101561142d5761141b826113a8565b8452928401929084019060010161140a565b5090979650505050505050565b600082601f83011261144a578081fd5b8135602061145a6113e483611998565b80838252828201915082860187848660051b8901011115611479578586fd5b855b8581101561142d5781358452928401929084019060010161147b565b600082601f8301126114a7578081fd5b813560206114b76113e483611998565b80838252828201915082860187848660051b89010111156114d6578586fd5b855b8581101561142d57813560ff811681146114f0578788fd5b845292840192908401906001016114d8565b600082601f830112611512578081fd5b813567ffffffffffffffff81111561152c5761152c611a1e565b61153f601f8201601f1916602001611967565b818152846020838601011115611553578283fd5b816020850160208301379081016020019190915292915050565b60006020828403121561157e578081fd5b611587826113a8565b9392505050565b600080600080600060a086880312156115a5578081fd5b6115ae866113a8565b94506115bc602087016113a8565b9350604086013567ffffffffffffffff808211156115d8578283fd5b6115e489838a0161143a565b945060608801359150808211156115f9578283fd5b61160589838a0161143a565b9350608088013591508082111561161a578283fd5b5061162788828901611502565b9150509295509295909350565b600080600080600060a0868803121561164b578081fd5b611654866113a8565b9450611662602087016113a8565b93506040860135925060608601359150608086013567ffffffffffffffff81111561168b578182fd5b61162788828901611502565b600080600080600080600080610100898b0312156116b3578283fd5b883567ffffffffffffffff808211156116ca578485fd5b6116d68c838d016113c4565b995060208b01359150808211156116eb578485fd5b6116f78c838d0161143a565b985060408b013591508082111561170c578485fd5b6117188c838d0161143a565b975060608b013591508082111561172d578485fd5b6117398c838d0161143a565b965060808b013591508082111561174e578485fd5b61175a8c838d0161143a565b955060a08b013591508082111561176f578485fd5b61177b8c838d0161143a565b945060c08b0135915080821115611790578384fd5b61179c8c838d0161143a565b935060e08b01359150808211156117b1578283fd5b506117be8b828c01611497565b9150509295985092959890939650565b6000602082840312156117df578081fd5b81518015158114611587578182fd5b6000602082840312156117ff578081fd5b81356001600160e01b031981168114611587578182fd5b6000602080835283518082850152825b8181101561184257858101830151858201604001528201611826565b818111156118535783604083870101525b50601f01601f1916929092016040019392505050565b6020808252603590820152600080516020611a558339815191526040820152740dcdee840dac2e8c6d040e6d2cea640d8cadccee8d605b1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252603590820152600080516020611a558339815191526040820152740dcdee840dac2e8c6d040e6d2ceac40d8cadccee8d605b1b606082015260800190565b6020808252603590820152600080516020611a558339815191526040820152740dcdee840dac2e8c6d040e6d2cea440d8cadccee8d605b1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff8111828210171561199057611990611a1e565b604052919050565b600067ffffffffffffffff8211156119b2576119b2611a1e565b5060051b60200190565b600181811c908216806119d057607f821691505b602082108114156119f157634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611a1757634e487b7160e01b81526011600452602481fd5b5060010190565b634e487b7160e01b600052604160045260246000fdfe72656465656d3a206e6674416464726573736573206c656e67746820646f65735374616b653a206e6674416464726573736573206c656e67746820646f657320a26469706673582212207c8c785e41d9b0df3cbd08d1715fa4c608fe90a8d07572f2ee45a5d4b54e7b7664736f6c63430008040033454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c7429

Deployed ByteCode Sourcemap

19774:9969:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28167:299;;;;;;:::i;:::-;;:::i;:::-;;;10409:14:1;;10402:22;10384:41;;10372:2;10357:18;28167:299:0;;;;;;;;21195:85;;;:::i;:::-;;;;;;;:::i;17306:43::-;;;;;;;;;;;;;;;-1:-1:-1;;;17306:43:0;;;;;18302:101;18380:15;;18302:101;;;10582:25:1;;;10570:2;10555:18;18302:101:0;10537:76:1;18411:161:0;18525:9;18411:161;;20034:188;;;;;;:::i;:::-;;:::i;:::-;;15036:148;;;:::i;14385:87::-;14431:7;14458:6;-1:-1:-1;;;;;14458:6:0;14385:87;;;-1:-1:-1;;;;;8691:32:1;;;8673:51;;8661:2;8646:18;14385:87:0;8628:102:1;21398:2903:0;;;;;;:::i;:::-;;:::i;24309:3193::-;;;;;;:::i;:::-;;:::i;28724:270::-;;;;;;:::i;:::-;-1:-1:-1;;;28724:270:0;;;;;;;;;;;-1:-1:-1;;;;;;11749:33:1;;;11731:52;;11719:2;11704:18;28724:270:0;11686:103:1;28474:242:0;;;;;;:::i;:::-;-1:-1:-1;;;28474:242:0;;;;;;;;15339:244;;;;;;:::i;:::-;;:::i;19911:115::-;19999:18;;-1:-1:-1;;;;;19999:18:0;19911:115;;28167:299;28314:4;-1:-1:-1;;;;;;28356:49:0;;-1:-1:-1;;;28356:49:0;;:102;;-1:-1:-1;;;;;;;;;;10062:40:0;;;28422:36;28336:122;28167:299;-1:-1:-1;;28167:299:0:o;21195:85::-;21234:13;21267:5;21260:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21195:85;:::o;20034:188::-;14431:7;14458:6;-1:-1:-1;;;;;14458:6:0;13107:10;14605:23;14597:68;;;;-1:-1:-1;;;14597:68:0;;;;;;;:::i;:::-;;;;;;;;;20149:18:::1;:65:::0;;-1:-1:-1;;;;;;20149:65:0::1;-1:-1:-1::0;;;;;20149:65:0;;;::::1;::::0;;;::::1;::::0;;20034:188::o;15036:148::-;14431:7;14458:6;-1:-1:-1;;;;;14458:6:0;13107:10;14605:23;14597:68;;;;-1:-1:-1;;;14597:68:0;;;;;;;:::i;:::-;15143:1:::1;15127:6:::0;;15106:40:::1;::::0;-1:-1:-1;;;;;15127:6:0;;::::1;::::0;15106:40:::1;::::0;15143:1;;15106:40:::1;15174:1;15157:19:::0;;-1:-1:-1;;;;;;15157:19:0::1;::::0;;15036:148::o;21398:2903::-;21773:8;:15;21750:12;:19;:38;21728:145;;;;-1:-1:-1;;;21728:145:0;;18676:2:1;21728:145:0;;;18658:21:1;18715:2;18695:18;;;18688:30;-1:-1:-1;;;;;;;;;;;18734:18:1;;;18727:62;18825:27;18805:18;;;18798:55;18870:19;;21728:145:0;18648:247:1;21728:145:0;21929:7;:14;21906:12;:19;:37;21884:143;;;;-1:-1:-1;;;21884:143:0;;14667:2:1;21884:143:0;;;14649:21:1;14706:2;14686:18;;;14679:30;-1:-1:-1;;;;;;;;;;;14725:18:1;;;14718:62;14816:26;14796:18;;;14789:54;14860:19;;21884:143:0;14639:246:1;21884:143:0;22083:7;:14;22060:12;:19;:37;22038:143;;;;-1:-1:-1;;;22038:143:0;;21125:2:1;22038:143:0;;;21107:21:1;21164:2;21144:18;;;21137:30;-1:-1:-1;;;;;;;;;;;21183:18:1;;;21176:62;21274:26;21254:18;;;21247:54;21318:19;;22038:143:0;21097:246:1;22038:143:0;22237:8;:15;22214:12;:19;:38;22192:145;;;;-1:-1:-1;;;22192:145:0;;20344:2:1;22192:145:0;;;20326:21:1;20383:2;20363:18;;;20356:30;-1:-1:-1;;;;;;;;;;;20402:18:1;;;20395:62;20493:27;20473:18;;;20466:55;20538:19;;22192:145:0;20316:247:1;22192:145:0;22393:5;:12;22370;:19;:35;22348:138;;;;-1:-1:-1;;;22348:138:0;;;;;;;:::i;:::-;22542:5;:12;22519;:19;:35;22497:138;;;;-1:-1:-1;;;22497:138:0;;;;;;;:::i;:::-;22691:5;:12;22668;:19;:35;22646:138;;;;-1:-1:-1;;;22646:138:0;;;;;;;:::i;:::-;22840:2;22817:12;:19;:25;;22795:112;;;;-1:-1:-1;;;22795:112:0;;17422:2:1;22795:112:0;;;17404:21:1;17461:2;17441:18;;;17434:30;17500:34;17480:18;;;17473:62;-1:-1:-1;;;17551:18:1;;;17544:35;17596:19;;22795:112:0;17394:227:1;22795:112:0;22935:19;;22920:12;22967:1327;22989:4;22984:2;:9;22967:1327;;;23016:18;23037:12;23050:2;23037:16;;;;;;-1:-1:-1;;;23037:16:0;;;;;;;;;;;;;;;23016:37;;23068:15;23086:8;23095:2;23086:12;;;;;;-1:-1:-1;;;23086:12:0;;;;;;;;;;;;;;;23068:30;;23113:14;23130:7;23138:2;23130:11;;;;;;-1:-1:-1;;;23130:11:0;;;;;;;;;;;;;;;23113:28;;23156:14;23173:7;23181:2;23173:11;;;;;;-1:-1:-1;;;23173:11:0;;;;;;;;;;;;;;;23156:28;;23199:15;23217:8;23226:2;23217:12;;;;;;-1:-1:-1;;;23217:12:0;;;;;;;;;;;;;;;23199:30;;23244:12;23259:5;23265:2;23259:9;;;;;;-1:-1:-1;;;23259:9:0;;;;;;;;;;;;;;;23244:24;;23283:12;23298:5;23304:2;23298:9;;;;;;-1:-1:-1;;;23298:9:0;;;;;;;;;;;;;;;23283:24;;23322:10;23335:5;23341:2;23335:9;;;;;;-1:-1:-1;;;23335:9:0;;;;;;;;;;;;;;;23322:22;;23361:29;23393:208;;;;;;;;23439:10;-1:-1:-1;;;;;23393:208:0;;;;;23477:7;23393:208;;;;23511:6;23393:208;;;;23544:6;23393:208;;;;23578:7;23393:208;;;23361:240;;23644:40;23658:7;23667:4;23673;23679;23644:13;:40::i;:::-;23618:128;;;;-1:-1:-1;;;23618:128:0;;20770:2:1;23618:128:0;;;20752:21:1;20809:2;20789:18;;;20782:30;20848:28;20828:18;;;20821:56;20894:18;;23618:128:0;20742:176:1;23618:128:0;23763:193;23794:6;23819:10;23848;23885:4;23909:7;23935:6;23763:12;:193::i;:::-;23971:19;;;;:10;:19;;;;;;;;:32;;-1:-1:-1;;;;;;23971:32:0;23993:10;23971:32;;;;;;24018:12;:21;;;;;;:30;;;24070:212;;-1:-1:-1;;;;;10027:32:1;;10009:51;;10076:18;;;10069:34;;;10119:18;;10112:34;;;10177:2;10162:18;;10155:34;;;10220:3;10205:19;;10198:35;;;24131:4:0;;23993:10;24070:212;;9996:3:1;9981:19;24070:212:0;;;;;;;22967:1327;;;;;;;;;22995:4;;;;;:::i;:::-;;;;22967:1327;;;;21398:2903;;;;;;;;;:::o;24309:3193::-;24685:8;:15;24662:12;:19;:38;24640:146;;;;-1:-1:-1;;;24640:146:0;;16227:2:1;24640:146:0;;;16209:21:1;16266:2;16246:18;;;16239:30;-1:-1:-1;;;;;;;;;;;16285:18:1;;;16278:62;16376:28;16356:18;;;16349:56;16422:19;;24640:146:0;16199:248:1;24640:146:0;24842:7;:14;24819:12;:19;:37;24797:144;;;;-1:-1:-1;;;24797:144:0;;17828:2:1;24797:144:0;;;17810:21:1;17867:2;17847:18;;;17840:30;-1:-1:-1;;;;;;;;;;;17886:18:1;;;17879:62;17977:27;17957:18;;;17950:55;18022:19;;24797:144:0;17800:247:1;24797:144:0;24997:7;:14;24974:12;:19;:37;24952:144;;;;-1:-1:-1;;;24952:144:0;;15451:2:1;24952:144:0;;;15433:21:1;15490:2;15470:18;;;15463:30;-1:-1:-1;;;;;;;;;;;15509:18:1;;;15502:62;15600:27;15580:18;;;15573:55;15645:19;;24952:144:0;15423:247:1;24952:144:0;25152:8;:15;25129:12;:19;:38;25107:146;;;;-1:-1:-1;;;25107:146:0;;13818:2:1;25107:146:0;;;13800:21:1;13857:2;13837:18;;;13830:30;-1:-1:-1;;;;;;;;;;;13876:18:1;;;13869:62;13967:28;13947:18;;;13940:56;14013:19;;25107:146:0;13790:248:1;25107:146:0;25309:5;:12;25286;:19;:35;25264:138;;;;-1:-1:-1;;;25264:138:0;;;;;;;:::i;:::-;25458:5;:12;25435;:19;:35;25413:138;;;;-1:-1:-1;;;25413:138:0;;;;;;;:::i;:::-;25607:5;:12;25584;:19;:35;25562:138;;;;-1:-1:-1;;;25562:138:0;;;;;;;:::i;:::-;25756:2;25733:12;:19;:25;;25711:113;;;;-1:-1:-1;;;25711:113:0;;17015:2:1;25711:113:0;;;16997:21:1;17054:2;17034:18;;;17027:30;17093:34;17073:18;;;17066:62;-1:-1:-1;;;17144:18:1;;;17137:36;17190:19;;25711:113:0;16987:228:1;25711:113:0;25852:19;;25837:12;25884:1611;25906:4;25901:2;:9;25884:1611;;;25933:18;25954:12;25967:2;25954:16;;;;;;-1:-1:-1;;;25954:16:0;;;;;;;;;;;;;;;25933:37;;25985:15;26003:8;26012:2;26003:12;;;;;;-1:-1:-1;;;26003:12:0;;;;;;;;;;;;;;;25985:30;;26030:14;26047:7;26055:2;26047:11;;;;;;-1:-1:-1;;;26047:11:0;;;;;;;;;;;;;;;26030:28;;26073:14;26090:7;26098:2;26090:11;;;;;;-1:-1:-1;;;26090:11:0;;;;;;;;;;;;;;;26073:28;;26116:15;26134:8;26143:2;26134:12;;;;;;-1:-1:-1;;;26134:12:0;;;;;;;;;;;;;;;26116:30;;26161:12;26176:5;26182:2;26176:9;;;;;;-1:-1:-1;;;26176:9:0;;;;;;;;;;;;;;;26161:24;;26200:12;26215:5;26221:2;26215:9;;;;;;-1:-1:-1;;;26215:9:0;;;;;;;;;;;;;;;26200:24;;26239:10;26252:5;26258:2;26252:9;;;;;;-1:-1:-1;;;26252:9:0;;;;;;;;;;;;;;;26239:22;;26278:29;26310:208;;;;;;;;26356:10;-1:-1:-1;;;;;26310:208:0;;;;;26394:7;26310:208;;;;26428:6;26310:208;;;;26461:6;26310:208;;;;26495:7;26310:208;;;26278:240;;26561:40;26575:7;26584:4;26590;26596;26561:13;:40::i;:::-;26535:128;;;;-1:-1:-1;;;26535:128:0;;20770:2:1;26535:128:0;;;20752:21:1;20809:2;20789:18;;;20782:30;20848:28;20828:18;;;20821:56;20894:18;;26535:128:0;20742:176:1;26535:128:0;26706:19;;;;:10;:19;;;;;;-1:-1:-1;;;;;26706:19:0;26729:10;26706:33;26680:129;;;;-1:-1:-1;;;26680:129:0;;13008:2:1;26680:129:0;;;12990:21:1;13047:2;13027:18;;;13020:30;13086:34;13066:18;;;13059:62;-1:-1:-1;;;13137:18:1;;;13130:32;13179:19;;26680:129:0;12980:224:1;26680:129:0;26850:21;;;;:12;:21;;;;;;:31;;26824:128;;;;-1:-1:-1;;;26824:128:0;;12604:2:1;26824:128:0;;;12586:21:1;12643:2;12623:18;;;12616:30;12682:34;12662:18;;;12655:62;-1:-1:-1;;;12733:18:1;;;12726:33;12776:19;;26824:128:0;12576:225:1;26824:128:0;26969:193;27000:6;27025:10;27062:4;27086:10;27115:7;27141:6;26969:12;:193::i;:::-;27186:19;;;;:10;:19;;;;;;;;27179:26;;-1:-1:-1;;;;;;27179:26:0;;;27227:12;:21;;;;;27220:28;;;;27270:213;;-1:-1:-1;;;;;10027:32:1;;10009:51;;10076:18;;;10069:34;;;10119:18;;;10112:34;;;10177:2;10162:18;;10155:34;;;10220:3;10205:19;;10198:35;;;27327:10:0;;27303:4;;27270:213;;9996:3:1;9981:19;27270:213:0;;;;;;;25884:1611;;;;;;;;;25912:4;;;;;:::i;:::-;;;;25884:1611;;15339:244;14431:7;14458:6;-1:-1:-1;;;;;14458:6:0;13107:10;14605:23;14597:68;;;;-1:-1:-1;;;14597:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15428:22:0;::::1;15420:73;;;::::0;-1:-1:-1;;;15420:73:0;;13411:2:1;15420:73:0::1;::::0;::::1;13393:21:1::0;13450:2;13430:18;;;13423:30;13489:34;13469:18;;;13462:62;-1:-1:-1;;;13540:18:1;;;13533:36;13586:19;;15420:73:0::1;13383:228:1::0;15420:73:0::1;15530:6;::::0;;15509:38:::1;::::0;-1:-1:-1;;;;;15509:38:0;;::::1;::::0;15530:6;::::1;::::0;15509:38:::1;::::0;::::1;15558:6;:17:::0;;-1:-1:-1;;;;;;15558:17:0::1;-1:-1:-1::0;;;;;15558:17:0;;;::::1;::::0;;;::::1;::::0;;15339:244::o;27510:585::-;27717:18;;27670:4;;-1:-1:-1;;;;;27717:18:0;27687:129;;;;-1:-1:-1;;;27687:129:0;;19937:2:1;27687:129:0;;;19919:21:1;19976:2;19956:18;;;19949:30;20015:34;19995:18;;;19988:62;-1:-1:-1;;;20066:18:1;;;20059:36;20112:19;;27687:129:0;19909:228:1;27687:129:0;27847:18;;-1:-1:-1;;;;;27847:18:0;:27;:18;27925:47;27944:27;27963:7;27944:18;:27::i;:::-;27925:18;:47::i;:::-;27893:179;;;;;;;;;;;;11411:25:1;;;;11484:4;11472:17;;11452:18;;;11445:45;11506:18;;;11499:34;;;11549:18;;;11542:34;;;11383:19;;27893:179:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27893:179:0;;-1:-1:-1;;27893:179:0;;;-1:-1:-1;;;;;;27847:240:0;;;;;;;-1:-1:-1;;;;;8691:32:1;27847:240:0;;;8673:51:1;8646:18;;;-1:-1:-1;27847:240:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27827:260;27510:585;-1:-1:-1;;;;;27510:585:0:o;29002:738::-;29204:6;29214:3;29204:13;29200:533;;;29242:6;29252:1;29242:11;29234:54;;;;-1:-1:-1;;;29234:54:0;;15092:2:1;29234:54:0;;;15074:21:1;15131:2;15111:18;;;15104:30;15170:32;15150:18;;;15143:60;15220:18;;29234:54:0;15064:180:1;29234:54:0;29303:51;;-1:-1:-1;;;29303:51:0;;-1:-1:-1;;;;;8993:15:1;;;29303:51:0;;;8975:34:1;9045:15;;;9025:18;;;9018:43;9077:18;;;9070:34;;;29303:32:0;;;;;8910:18:1;;29303:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29200:533;;;29376:6;29386:4;29376:14;29372:361;;;29424:1;29415:6;:10;29407:67;;;;-1:-1:-1;;;29407:67:0;;19524:2:1;29407:67:0;;;19506:21:1;19563:2;19543:18;;;19536:30;19602:34;19582:18;;;19575:62;-1:-1:-1;;;19653:18:1;;;19646:42;19705:19;;29407:67:0;19496:234:1;29407:67:0;29489:168;;-1:-1:-1;;;29489:168:0;;-1:-1:-1;;;;;9466:15:1;;;29489:168:0;;;9448:34:1;9518:15;;;9498:18;;;9491:43;9550:18;;;9543:34;;;9593:18;;;9586:34;;;9428:3;9636:19;;;9629:32;-1:-1:-1;9677:19:1;;;9670:33;29489:37:0;;;;;9720:19:1;;29489:168:0;9400:345:1;29372:361:0;29690:31;;-1:-1:-1;;;29690:31:0;;15877:2:1;29690:31:0;;;15859:21:1;15916:2;15896:18;;;15889:30;-1:-1:-1;;;15935:18:1;;;15928:51;15996:18;;29690:31:0;15849:171:1;29372:361:0;29002:738;;;;;;:::o;20609:472::-;20718:7;20283:133;20871:7;:18;;;20912:7;:15;;;20950:7;:14;;;20987:7;:14;;;21024:7;:15;;;20791:267;;;;;;;;;;;;10905:25:1;;;-1:-1:-1;;;;;10966:32:1;;;;10961:2;10946:18;;10939:60;11030:2;11015:18;;11008:34;;;;11073:2;11058:18;;11051:34;11116:3;11101:19;;11094:35;10986:3;11145:19;;11138:35;10892:3;10877:19;;10859:320;20791:267:0;;;;;;;;;;;;;20763:310;;;;;;20743:330;;20609:472;;;:::o;18941:258::-;19040:7;19142:20;18380:15;;;18302:101;19142:20;19113:63;;-1:-1:-1;;;19113:63:0;;;8388:27:1;8431:11;;;8424:27;;;;8467:12;;;8460:28;;;8504:12;;19113:63:0;8378:144:1;14:173;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:699::-;246:5;299:3;292:4;284:6;280:17;276:27;266:2;;321:5;314;307:20;266:2;361:6;348:20;387:4;411:60;427:43;467:2;427:43;:::i;:::-;411:60;:::i;:::-;493:3;517:2;512:3;505:15;545:2;540:3;536:12;529:19;;580:2;572:6;568:15;632:3;627:2;621;618:1;614:10;606:6;602:23;598:32;595:41;592:2;;;653:5;646;639:20;592:2;679:5;693:169;707:2;704:1;701:9;693:169;;;764:23;783:3;764:23;:::i;:::-;752:36;;808:12;;;;840;;;;725:1;718:9;693:169;;;-1:-1:-1;880:5:1;;256:635;-1:-1:-1;;;;;;;256:635:1:o;896:693::-;950:5;1003:3;996:4;988:6;984:17;980:27;970:2;;1025:5;1018;1011:20;970:2;1065:6;1052:20;1091:4;1115:60;1131:43;1171:2;1131:43;:::i;1115:60::-;1197:3;1221:2;1216:3;1209:15;1249:2;1244:3;1240:12;1233:19;;1284:2;1276:6;1272:15;1336:3;1331:2;1325;1322:1;1318:10;1310:6;1306:23;1302:32;1299:41;1296:2;;;1357:5;1350;1343:20;1296:2;1383:5;1397:163;1411:2;1408:1;1405:9;1397:163;;;1468:17;;1456:30;;1506:12;;;;1538;;;;1429:1;1422:9;1397:163;;2292:798;2344:5;2397:3;2390:4;2382:6;2378:17;2374:27;2364:2;;2419:5;2412;2405:20;2364:2;2459:6;2446:20;2485:4;2509:60;2525:43;2565:2;2525:43;:::i;2509:60::-;2591:3;2615:2;2610:3;2603:15;2643:2;2638:3;2634:12;2627:19;;2678:2;2670:6;2666:15;2730:3;2725:2;2719;2716:1;2712:10;2704:6;2700:23;2696:32;2693:41;2690:2;;;2751:5;2744;2737:20;2690:2;2777:5;2791:270;2805:2;2802:1;2799:9;2791:270;;;2876:3;2863:17;2924:4;2917:5;2913:16;2906:5;2903:27;2893:2;;2948:5;2941;2934:20;2893:2;2969:18;;3007:12;;;;3039;;;;2823:1;2816:9;2791:270;;3095:550;3137:5;3190:3;3183:4;3175:6;3171:17;3167:27;3157:2;;3212:5;3205;3198:20;3157:2;3252:6;3239:20;3278:18;3274:2;3271:26;3268:2;;;3300:18;;:::i;:::-;3344:55;3387:2;3368:13;;-1:-1:-1;;3364:27:1;3393:4;3360:38;3344:55;:::i;:::-;3424:2;3415:7;3408:19;3470:3;3463:4;3458:2;3450:6;3446:15;3442:26;3439:35;3436:2;;;3491:5;3484;3477:20;3436:2;3560;3553:4;3545:6;3541:17;3534:4;3525:7;3521:18;3508:55;3583:16;;;3601:4;3579:27;3572:42;;;;3587:7;3147:498;-1:-1:-1;;3147:498:1:o;3650:196::-;3709:6;3762:2;3750:9;3741:7;3737:23;3733:32;3730:2;;;3783:6;3775;3768:22;3730:2;3811:29;3830:9;3811:29;:::i;:::-;3801:39;3720:126;-1:-1:-1;;;3720:126:1:o;3851:983::-;4005:6;4013;4021;4029;4037;4090:3;4078:9;4069:7;4065:23;4061:33;4058:2;;;4112:6;4104;4097:22;4058:2;4140:29;4159:9;4140:29;:::i;:::-;4130:39;;4188:38;4222:2;4211:9;4207:18;4188:38;:::i;:::-;4178:48;;4277:2;4266:9;4262:18;4249:32;4300:18;4341:2;4333:6;4330:14;4327:2;;;4362:6;4354;4347:22;4327:2;4390:61;4443:7;4434:6;4423:9;4419:22;4390:61;:::i;:::-;4380:71;;4504:2;4493:9;4489:18;4476:32;4460:48;;4533:2;4523:8;4520:16;4517:2;;;4554:6;4546;4539:22;4517:2;4582:63;4637:7;4626:8;4615:9;4611:24;4582:63;:::i;:::-;4572:73;;4698:3;4687:9;4683:19;4670:33;4654:49;;4728:2;4718:8;4715:16;4712:2;;;4749:6;4741;4734:22;4712:2;;4777:51;4820:7;4809:8;4798:9;4794:24;4777:51;:::i;:::-;4767:61;;;4048:786;;;;;;;;:::o;4839:626::-;4943:6;4951;4959;4967;4975;5028:3;5016:9;5007:7;5003:23;4999:33;4996:2;;;5050:6;5042;5035:22;4996:2;5078:29;5097:9;5078:29;:::i;:::-;5068:39;;5126:38;5160:2;5149:9;5145:18;5126:38;:::i;:::-;5116:48;;5211:2;5200:9;5196:18;5183:32;5173:42;;5262:2;5251:9;5247:18;5234:32;5224:42;;5317:3;5306:9;5302:19;5289:33;5345:18;5337:6;5334:30;5331:2;;;5382:6;5374;5367:22;5331:2;5410:49;5451:7;5442:6;5431:9;5427:22;5410:49;:::i;5470:2042::-;5790:6;5798;5806;5814;5822;5830;5838;5846;5899:3;5887:9;5878:7;5874:23;5870:33;5867:2;;;5921:6;5913;5906:22;5867:2;5966:9;5953:23;5995:18;6036:2;6028:6;6025:14;6022:2;;;6057:6;6049;6042:22;6022:2;6085:61;6138:7;6129:6;6118:9;6114:22;6085:61;:::i;:::-;6075:71;;6199:2;6188:9;6184:18;6171:32;6155:48;;6228:2;6218:8;6215:16;6212:2;;;6249:6;6241;6234:22;6212:2;6277:63;6332:7;6321:8;6310:9;6306:24;6277:63;:::i;:::-;6267:73;;6393:2;6382:9;6378:18;6365:32;6349:48;;6422:2;6412:8;6409:16;6406:2;;;6443:6;6435;6428:22;6406:2;6471:63;6526:7;6515:8;6504:9;6500:24;6471:63;:::i;:::-;6461:73;;6587:2;6576:9;6572:18;6559:32;6543:48;;6616:2;6606:8;6603:16;6600:2;;;6637:6;6629;6622:22;6600:2;6665:63;6720:7;6709:8;6698:9;6694:24;6665:63;:::i;:::-;6655:73;;6781:3;6770:9;6766:19;6753:33;6737:49;;6811:2;6801:8;6798:16;6795:2;;;6832:6;6824;6817:22;6795:2;6860:63;6915:7;6904:8;6893:9;6889:24;6860:63;:::i;:::-;6850:73;;6976:3;6965:9;6961:19;6948:33;6932:49;;7006:2;6996:8;6993:16;6990:2;;;7027:6;7019;7012:22;6990:2;7055:63;7110:7;7099:8;7088:9;7084:24;7055:63;:::i;:::-;7045:73;;7171:3;7160:9;7156:19;7143:33;7127:49;;7201:2;7191:8;7188:16;7185:2;;;7222:6;7214;7207:22;7185:2;7250:63;7305:7;7294:8;7283:9;7279:24;7250:63;:::i;:::-;7240:73;;7366:3;7355:9;7351:19;7338:33;7322:49;;7396:2;7386:8;7383:16;7380:2;;;7417:6;7409;7402:22;7380:2;;7445:61;7498:7;7487:8;7476:9;7472:24;7445:61;:::i;:::-;7435:71;;;5857:1655;;;;;;;;;;;:::o;7517:297::-;7584:6;7637:2;7625:9;7616:7;7612:23;7608:32;7605:2;;;7658:6;7650;7643:22;7605:2;7695:9;7689:16;7748:5;7741:13;7734:21;7727:5;7724:32;7714:2;;7775:6;7767;7760:22;7819:306;7877:6;7930:2;7918:9;7909:7;7905:23;7901:32;7898:2;;;7951:6;7943;7936:22;7898:2;7982:23;;-1:-1:-1;;;;;;8034:32:1;;8024:43;;8014:2;;8086:6;8078;8071:22;11794:603;11906:4;11935:2;11964;11953:9;11946:21;11996:6;11990:13;12039:6;12034:2;12023:9;12019:18;12012:34;12064:4;12077:140;12091:6;12088:1;12085:13;12077:140;;;12186:14;;;12182:23;;12176:30;12152:17;;;12171:2;12148:26;12141:66;12106:10;;12077:140;;;12235:6;12232:1;12229:13;12226:2;;;12305:4;12300:2;12291:6;12280:9;12276:22;12272:31;12265:45;12226:2;-1:-1:-1;12381:2:1;12360:15;-1:-1:-1;;12356:29:1;12341:45;;;;12388:2;12337:54;;11915:482;-1:-1:-1;;;11915:482:1:o;14043:417::-;14245:2;14227:21;;;14284:2;14264:18;;;14257:30;-1:-1:-1;;;;;;;;;;;14318:2:1;14303:18;;14296:62;-1:-1:-1;;;14389:2:1;14374:18;;14367:51;14450:3;14435:19;;14217:243::o;16452:356::-;16654:2;16636:21;;;16673:18;;;16666:30;16732:34;16727:2;16712:18;;16705:62;16799:2;16784:18;;16626:182::o;18052:417::-;18254:2;18236:21;;;18293:2;18273:18;;;18266:30;-1:-1:-1;;;;;;;;;;;18327:2:1;18312:18;;18305:62;-1:-1:-1;;;18398:2:1;18383:18;;18376:51;18459:3;18444:19;;18226:243::o;18900:417::-;19102:2;19084:21;;;19141:2;19121:18;;;19114:30;-1:-1:-1;;;;;;;;;;;19175:2:1;19160:18;;19153:62;-1:-1:-1;;;19246:2:1;19231:18;;19224:51;19307:3;19292:19;;19074:243::o;21530:275::-;21601:2;21595:9;21666:2;21647:13;;-1:-1:-1;;21643:27:1;21631:40;;21701:18;21686:34;;21722:22;;;21683:62;21680:2;;;21748:18;;:::i;:::-;21784:2;21777:22;21575:230;;-1:-1:-1;21575:230:1:o;21810:183::-;21870:4;21903:18;21895:6;21892:30;21889:2;;;21925:18;;:::i;:::-;-1:-1:-1;21970:1:1;21966:14;21982:4;21962:25;;21879:114::o;21998:380::-;22077:1;22073:12;;;;22120;;;22141:2;;22195:4;22187:6;22183:17;22173:27;;22141:2;22248;22240:6;22237:14;22217:18;22214:38;22211:2;;;22294:10;22289:3;22285:20;22282:1;22275:31;22329:4;22326:1;22319:15;22357:4;22354:1;22347:15;22211:2;;22053:325;;;:::o;22383:236::-;22422:3;-1:-1:-1;;22443:17:1;;22440:2;;;-1:-1:-1;;;22483:33:1;;22539:4;22536:1;22529:15;22569:4;22490:3;22557:17;22440:2;-1:-1:-1;22611:1:1;22600:13;;22430:189::o;22624:127::-;22685:10;22680:3;22676:20;22673:1;22666:31;22716:4;22713:1;22706:15;22740:4;22737:1;22730:15

Swarm Source

ipfs://7c8c785e41d9b0df3cbd08d1715fa4c608fe90a8d07572f2ee45a5d4b54e7b76
Block Transaction Gas Used Reward
Age Block Fee Address Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading