false
false

Contract Address Details

0xC62851f3AFf144AF113BeE7A2D1774FfD60e56EB

Contract Name
GameNftCollection
Creator
0xd07941–48216c at 0x5e02bd–a1ebff
Balance
0
Tokens
Fetching tokens...
Transactions
0 Transactions
Transfers
0 Transfers
Gas Used
Fetching gas used...
Last Balance Update
4097
Contract is not verified. However, we found a verified contract with the same bytecode in Blockscout DB 0x843678ec256328d4177d02ca999fa5e2e0d905ae.
All metadata displayed below is from that contract. In order to verify current contract, click Verify & Publish button
Verify & Publish
Contract name:
GameNftCollection




Optimization enabled
true
Compiler version
v0.8.9+commit.e5eed63a




Optimization runs
200
Verified at
2024-03-18T04:32:12.420188Z

contracts/gesoten-nft-game-collection.sol

Sol2uml
new
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract GameNftCollection is Ownable {
    IERC1155 public gesotenErc1155Contract;
    address public gesotenErc1155ContractAddr;

    event PackOpened(
        address indexed user,
        uint256[] tokenIds,
        uint256[] amounts
    );

    event Compound(
        address indexed user,
        uint256[] tokenIds,
        uint256[] amounts,
        uint256 newTokenId,
        uint256 mintAmount
    );

    constructor(address _erc1155ContractAddress) {
        gesotenErc1155ContractAddr = _erc1155ContractAddress;
        gesotenErc1155Contract = IERC1155(_erc1155ContractAddress);
    }

    function setERC1155Contract(
        address _erc1155ContractAddress
    ) external onlyOwner {
        require(_erc1155ContractAddress != address(0), "Invalid address");
        gesotenErc1155ContractAddr = _erc1155ContractAddress;
        gesotenErc1155Contract = IERC1155(_erc1155ContractAddress);
    }

    function openPack(
        address to,
        uint256[] memory tokenIds,
        uint256[] memory amounts,
        bytes memory data
    ) external onlyOwner {
        require(to != address(0), "Invalid receiver address");
        require(
            gesotenErc1155ContractAddr != address(0),
            "ERC1155 contract address not set"
        );
        require(tokenIds.length == amounts.length, "Arrays length mismatch");

        (bool success, ) = gesotenErc1155ContractAddr.call(
            abi.encodeWithSignature(
                "mintBatch(address,uint256[],uint256[],bytes)",
                to,
                tokenIds,
                amounts,
                data
            )
        );
        require(success, "MintBatch call failed");

        emit PackOpened(to, tokenIds, amounts);
    }

    function compound(
        uint256[] memory tokenIds,
        uint256[] memory amounts,
        uint256 newTokenId,
        uint256 mintAmount,
        bytes memory data
    ) external onlyOwner {
        require(tokenIds.length == amounts.length, "Arrays length mismatch");
        require(
            gesotenErc1155ContractAddr != address(0),
            "ERC1155 contract address not set"
        );

        (bool burnStatus, ) = gesotenErc1155ContractAddr.call(
            abi.encodeWithSignature(
                "burnBatch(address,uint256[],uint256[])",
                msg.sender,
                tokenIds,
                amounts
            )
        );
        require(burnStatus, "burnBatch call failed");

        (bool mintStatus, ) = gesotenErc1155ContractAddr.call(
            abi.encodeWithSignature(
                "mint(address,uint256,uint256,bytes)",
                msg.sender,
                newTokenId,
                mintAmount,
                data
            )
        );
        require(mintStatus, "Mint failed");

        emit Compound(msg.sender, tokenIds, amounts, newTokenId, mintAmount);
    }
}
        

@openzeppelin/contracts/access/Ownable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @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() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(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");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
          

@openzeppelin/contracts/token/ERC1155/IERC1155.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @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 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;
}
          

@openzeppelin/contracts/utils/Context.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.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 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) {
        return msg.data;
    }
}
          

@openzeppelin/contracts/utils/introspection/IERC165.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

Compiler Settings

{"outputSelection":{"*":{"*":["*"],"":["*"]}},"optimizer":{"runs":200,"enabled":true},"libraries":{}}
              

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_erc1155ContractAddress","internalType":"address"}]},{"type":"event","name":"Compound","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256[]","name":"tokenIds","internalType":"uint256[]","indexed":false},{"type":"uint256[]","name":"amounts","internalType":"uint256[]","indexed":false},{"type":"uint256","name":"newTokenId","internalType":"uint256","indexed":false},{"type":"uint256","name":"mintAmount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"PackOpened","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256[]","name":"tokenIds","internalType":"uint256[]","indexed":false},{"type":"uint256[]","name":"amounts","internalType":"uint256[]","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"compound","inputs":[{"type":"uint256[]","name":"tokenIds","internalType":"uint256[]"},{"type":"uint256[]","name":"amounts","internalType":"uint256[]"},{"type":"uint256","name":"newTokenId","internalType":"uint256"},{"type":"uint256","name":"mintAmount","internalType":"uint256"},{"type":"bytes","name":"data","internalType":"bytes"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC1155"}],"name":"gesotenErc1155Contract","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"gesotenErc1155ContractAddr","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"openPack","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256[]","name":"tokenIds","internalType":"uint256[]"},{"type":"uint256[]","name":"amounts","internalType":"uint256[]"},{"type":"bytes","name":"data","internalType":"bytes"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setERC1155Contract","inputs":[{"type":"address","name":"_erc1155ContractAddress","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]}]
              

Contract Creation Code

Verify & Publish
0x608060405234801561001057600080fd5b50604051610d82380380610d8283398101604081905261002f916100b7565b61003833610067565b600280546001600160a01b039092166001600160a01b03199283168117909155600180549092161790556100e7565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156100c957600080fd5b81516001600160a01b03811681146100e057600080fd5b9392505050565b610c8c806100f66000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063715018a61161005b578063715018a6146100f75780638da5cb5b146100ff578063dcde62f714610110578063f2fde38b1461012357600080fd5b80633df5b2161461008d5780634a76506a146100a25780635c584d4a146100b5578063706029d2146100e4575b600080fd5b6100a061009b366004610912565b610136565b005b6100a06100b03660046109ca565b6103f7565b6002546100c8906001600160a01b031681565b6040516001600160a01b03909116815260200160405180910390f35b6100a06100f23660046109ec565b610473565b6100a06106a4565b6000546001600160a01b03166100c8565b6001546100c8906001600160a01b031681565b6100a06101313660046109ca565b6106b8565b61013e610731565b835185511461018d5760405162461bcd60e51b8152602060048201526016602482015275082e4e4c2f2e640d8cadccee8d040dad2e6dac2e8c6d60531b60448201526064015b60405180910390fd5b6002546001600160a01b03166101e55760405162461bcd60e51b815260206004820181905260248201527f4552433131353520636f6e74726163742061646472657373206e6f74207365746044820152606401610184565b6002546040516000916001600160a01b03169061020a90339089908990602401610ac0565b60408051601f198184030181529181526020820180516001600160e01b0316631ac8311560e21b1790525161023f9190610b30565b6000604051808303816000865af19150503d806000811461027c576040519150601f19603f3d011682016040523d82523d6000602084013e610281565b606091505b50509050806102ca5760405162461bcd60e51b8152602060048201526015602482015274189d5c9b90985d18da0818d85b1b0819985a5b1959605a1b6044820152606401610184565b6002546040516000916001600160a01b0316906102f1903390889088908890602401610b78565b60408051601f198184030181529181526020820180516001600160e01b031663731133e960e01b179052516103269190610b30565b6000604051808303816000865af19150503d8060008114610363576040519150601f19603f3d011682016040523d82523d6000602084013e610368565b606091505b50509050806103a75760405162461bcd60e51b815260206004820152600b60248201526a135a5b9d0819985a5b195960aa1b6044820152606401610184565b336001600160a01b03167fbc4147e7d95265d2b50e41f2c17127902f399866c206768b2020372b7aba99ef888888886040516103e69493929190610ba5565b60405180910390a250505050505050565b6103ff610731565b6001600160a01b0381166104475760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610184565b600280546001600160a01b039092166001600160a01b0319928316811790915560018054909216179055565b61047b610731565b6001600160a01b0384166104d15760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964207265636569766572206164647265737300000000000000006044820152606401610184565b6002546001600160a01b03166105295760405162461bcd60e51b815260206004820181905260248201527f4552433131353520636f6e74726163742061646472657373206e6f74207365746044820152606401610184565b81518351146105735760405162461bcd60e51b8152602060048201526016602482015275082e4e4c2f2e640d8cadccee8d040dad2e6dac2e8c6d60531b6044820152606401610184565b6002546040516000916001600160a01b03169061059a908790879087908790602401610bde565b60408051601f198184030181529181526020820180516001600160e01b0316630fbfeffd60e11b179052516105cf9190610b30565b6000604051808303816000865af19150503d806000811461060c576040519150601f19603f3d011682016040523d82523d6000602084013e610611565b606091505b505090508061065a5760405162461bcd60e51b8152602060048201526015602482015274135a5b9d10985d18da0818d85b1b0819985a5b1959605a1b6044820152606401610184565b846001600160a01b03167ff7abfe87506a99dfe239c7c8cdb614b8c0bd515135b3897f983d0dd4c657aeaf8585604051610695929190610c28565b60405180910390a25050505050565b6106ac610731565b6106b6600061078b565b565b6106c0610731565b6001600160a01b0381166107255760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610184565b61072e8161078b565b50565b6000546001600160a01b031633146106b65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610184565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561081a5761081a6107db565b604052919050565b600082601f83011261083357600080fd5b8135602067ffffffffffffffff82111561084f5761084f6107db565b8160051b61085e8282016107f1565b928352848101820192828101908785111561087857600080fd5b83870192505b848310156108975782358252918301919083019061087e565b979650505050505050565b600082601f8301126108b357600080fd5b813567ffffffffffffffff8111156108cd576108cd6107db565b6108e0601f8201601f19166020016107f1565b8181528460208386010111156108f557600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561092a57600080fd5b853567ffffffffffffffff8082111561094257600080fd5b61094e89838a01610822565b9650602088013591508082111561096457600080fd5b61097089838a01610822565b95506040880135945060608801359350608088013591508082111561099457600080fd5b506109a1888289016108a2565b9150509295509295909350565b80356001600160a01b03811681146109c557600080fd5b919050565b6000602082840312156109dc57600080fd5b6109e5826109ae565b9392505050565b60008060008060808587031215610a0257600080fd5b610a0b856109ae565b9350602085013567ffffffffffffffff80821115610a2857600080fd5b610a3488838901610822565b94506040870135915080821115610a4a57600080fd5b610a5688838901610822565b93506060870135915080821115610a6c57600080fd5b50610a79878288016108a2565b91505092959194509250565b600081518084526020808501945080840160005b83811015610ab557815187529582019590820190600101610a99565b509495945050505050565b6001600160a01b0384168152606060208201819052600090610ae490830185610a85565b8281036040840152610af68185610a85565b9695505050505050565b60005b83811015610b1b578181015183820152602001610b03565b83811115610b2a576000848401525b50505050565b60008251610b42818460208701610b00565b9190910192915050565b60008151808452610b64816020860160208601610b00565b601f01601f19169290920160200192915050565b60018060a01b0385168152836020820152826040820152608060608201526000610af66080830184610b4c565b608081526000610bb86080830187610a85565b8281036020840152610bca8187610a85565b604084019590955250506060015292915050565b6001600160a01b0385168152608060208201819052600090610c0290830186610a85565b8281036040840152610c148186610a85565b905082810360608401526108978185610b4c565b604081526000610c3b6040830185610a85565b8281036020840152610c4d8185610a85565b9594505050505056fea2646970667358221220f8b3347b98e292af7d01ab244e9989301aef2eb5a9a937cf85ae353ef1410f8d64736f6c63430008090033000000000000000000000000a0782ea41afe61e9aac45a408e51d9ed1b3eda07

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106100885760003560e01c8063715018a61161005b578063715018a6146100f75780638da5cb5b146100ff578063dcde62f714610110578063f2fde38b1461012357600080fd5b80633df5b2161461008d5780634a76506a146100a25780635c584d4a146100b5578063706029d2146100e4575b600080fd5b6100a061009b366004610912565b610136565b005b6100a06100b03660046109ca565b6103f7565b6002546100c8906001600160a01b031681565b6040516001600160a01b03909116815260200160405180910390f35b6100a06100f23660046109ec565b610473565b6100a06106a4565b6000546001600160a01b03166100c8565b6001546100c8906001600160a01b031681565b6100a06101313660046109ca565b6106b8565b61013e610731565b835185511461018d5760405162461bcd60e51b8152602060048201526016602482015275082e4e4c2f2e640d8cadccee8d040dad2e6dac2e8c6d60531b60448201526064015b60405180910390fd5b6002546001600160a01b03166101e55760405162461bcd60e51b815260206004820181905260248201527f4552433131353520636f6e74726163742061646472657373206e6f74207365746044820152606401610184565b6002546040516000916001600160a01b03169061020a90339089908990602401610ac0565b60408051601f198184030181529181526020820180516001600160e01b0316631ac8311560e21b1790525161023f9190610b30565b6000604051808303816000865af19150503d806000811461027c576040519150601f19603f3d011682016040523d82523d6000602084013e610281565b606091505b50509050806102ca5760405162461bcd60e51b8152602060048201526015602482015274189d5c9b90985d18da0818d85b1b0819985a5b1959605a1b6044820152606401610184565b6002546040516000916001600160a01b0316906102f1903390889088908890602401610b78565b60408051601f198184030181529181526020820180516001600160e01b031663731133e960e01b179052516103269190610b30565b6000604051808303816000865af19150503d8060008114610363576040519150601f19603f3d011682016040523d82523d6000602084013e610368565b606091505b50509050806103a75760405162461bcd60e51b815260206004820152600b60248201526a135a5b9d0819985a5b195960aa1b6044820152606401610184565b336001600160a01b03167fbc4147e7d95265d2b50e41f2c17127902f399866c206768b2020372b7aba99ef888888886040516103e69493929190610ba5565b60405180910390a250505050505050565b6103ff610731565b6001600160a01b0381166104475760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610184565b600280546001600160a01b039092166001600160a01b0319928316811790915560018054909216179055565b61047b610731565b6001600160a01b0384166104d15760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964207265636569766572206164647265737300000000000000006044820152606401610184565b6002546001600160a01b03166105295760405162461bcd60e51b815260206004820181905260248201527f4552433131353520636f6e74726163742061646472657373206e6f74207365746044820152606401610184565b81518351146105735760405162461bcd60e51b8152602060048201526016602482015275082e4e4c2f2e640d8cadccee8d040dad2e6dac2e8c6d60531b6044820152606401610184565b6002546040516000916001600160a01b03169061059a908790879087908790602401610bde565b60408051601f198184030181529181526020820180516001600160e01b0316630fbfeffd60e11b179052516105cf9190610b30565b6000604051808303816000865af19150503d806000811461060c576040519150601f19603f3d011682016040523d82523d6000602084013e610611565b606091505b505090508061065a5760405162461bcd60e51b8152602060048201526015602482015274135a5b9d10985d18da0818d85b1b0819985a5b1959605a1b6044820152606401610184565b846001600160a01b03167ff7abfe87506a99dfe239c7c8cdb614b8c0bd515135b3897f983d0dd4c657aeaf8585604051610695929190610c28565b60405180910390a25050505050565b6106ac610731565b6106b6600061078b565b565b6106c0610731565b6001600160a01b0381166107255760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610184565b61072e8161078b565b50565b6000546001600160a01b031633146106b65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610184565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561081a5761081a6107db565b604052919050565b600082601f83011261083357600080fd5b8135602067ffffffffffffffff82111561084f5761084f6107db565b8160051b61085e8282016107f1565b928352848101820192828101908785111561087857600080fd5b83870192505b848310156108975782358252918301919083019061087e565b979650505050505050565b600082601f8301126108b357600080fd5b813567ffffffffffffffff8111156108cd576108cd6107db565b6108e0601f8201601f19166020016107f1565b8181528460208386010111156108f557600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561092a57600080fd5b853567ffffffffffffffff8082111561094257600080fd5b61094e89838a01610822565b9650602088013591508082111561096457600080fd5b61097089838a01610822565b95506040880135945060608801359350608088013591508082111561099457600080fd5b506109a1888289016108a2565b9150509295509295909350565b80356001600160a01b03811681146109c557600080fd5b919050565b6000602082840312156109dc57600080fd5b6109e5826109ae565b9392505050565b60008060008060808587031215610a0257600080fd5b610a0b856109ae565b9350602085013567ffffffffffffffff80821115610a2857600080fd5b610a3488838901610822565b94506040870135915080821115610a4a57600080fd5b610a5688838901610822565b93506060870135915080821115610a6c57600080fd5b50610a79878288016108a2565b91505092959194509250565b600081518084526020808501945080840160005b83811015610ab557815187529582019590820190600101610a99565b509495945050505050565b6001600160a01b0384168152606060208201819052600090610ae490830185610a85565b8281036040840152610af68185610a85565b9695505050505050565b60005b83811015610b1b578181015183820152602001610b03565b83811115610b2a576000848401525b50505050565b60008251610b42818460208701610b00565b9190910192915050565b60008151808452610b64816020860160208601610b00565b601f01601f19169290920160200192915050565b60018060a01b0385168152836020820152826040820152608060608201526000610af66080830184610b4c565b608081526000610bb86080830187610a85565b8281036020840152610bca8187610a85565b604084019590955250506060015292915050565b6001600160a01b0385168152608060208201819052600090610c0290830186610a85565b8281036040840152610c148186610a85565b905082810360608401526108978185610b4c565b604081526000610c3b6040830185610a85565b8281036020840152610c4d8185610a85565b9594505050505056fea2646970667358221220f8b3347b98e292af7d01ab244e9989301aef2eb5a9a937cf85ae353ef1410f8d64736f6c63430008090033