ETH Price: $3,645.44 (-0.11%)
 
Transaction Hash
Method
Block
From
To
Mint ETH193285522024-02-28 20:56:47312 days ago1709153807IN
0xC46abE98...434ccE2d3
0.005 ETH0.004205754.51542484
Burn166636492023-02-19 15:52:47686 days ago1676821967IN
0xC46abE98...434ccE2d3
0 ETH0.002796530.38789317
Burn162185172022-12-19 11:43:35748 days ago1671450215IN
0xC46abE98...434ccE2d3
0 ETH0.001173912.75107467
Safe Transfer Fr...155479312022-09-16 18:23:47842 days ago1663352627IN
0xC46abE98...434ccE2d3
0 ETH0.0031036911.61719963
Safe Transfer Fr...155398352022-09-15 14:57:23843 days ago1663253843IN
0xC46abE98...434ccE2d3
0 ETH0.0077553743.97018494
Burn150240162022-06-25 14:05:08925 days ago1656165908IN
0xC46abE98...434ccE2d3
0 ETH0.003060540.82690046
Burn149327782022-06-09 13:14:06941 days ago1654780446IN
0xC46abE98...434ccE2d3
0 ETH0.00363139.44557102
Burn145649032022-04-11 14:21:131000 days ago1649686873IN
0xC46abE98...434ccE2d3
0 ETH0.00369249.26679243
Burn144005702022-03-16 23:42:361026 days ago1647474156IN
0xC46abE98...434ccE2d3
0 ETH0.0050423854.77097983
Burn143854152022-03-14 15:01:271028 days ago1647270087IN
0xC46abE98...434ccE2d3
0 ETH0.00283837.85868489
Burn141362412022-02-04 0:22:011067 days ago1643934121IN
0xC46abE98...434ccE2d3
0 ETH0.0061173295.97467512
Burn139510522022-01-06 9:35:221095 days ago1641461722IN
0xC46abE98...434ccE2d3
0 ETH0.01135082123.29412554
Mint138394292021-12-20 2:40:341112 days ago1639968034IN
0xC46abE98...434ccE2d3
0 ETH0.0049105249.68361523
Burn138286162021-12-18 10:32:031114 days ago1639823523IN
0xC46abE98...434ccE2d3
0 ETH0.0039423752.58255704
Mint ETH136647002021-11-22 13:14:401140 days ago1637586880IN
0xC46abE98...434ccE2d3
0.13581888 ETH0.0071073792.18982652
Burn135591322021-11-05 21:54:451157 days ago1636149285IN
0xC46abE98...434ccE2d3
0 ETH0.0072286778.51883487
Mint ETH135102892021-10-29 5:33:091164 days ago1635485589IN
0xC46abE98...434ccE2d3
0.05 ETH0.01266477164.27496065
Burn134771382021-10-24 0:59:441169 days ago1635037184IN
0xC46abE98...434ccE2d3
0 ETH0.0051478568.67191589
Burn134469552021-10-19 7:49:151174 days ago1634629755IN
0xC46abE98...434ccE2d3
0 ETH0.0036731849
Burn134085632021-10-13 6:53:561180 days ago1634108036IN
0xC46abE98...434ccE2d3
0 ETH0.0067933290.62239532
Burn133974432021-10-11 13:04:181182 days ago1633957458IN
0xC46abE98...434ccE2d3
0 ETH0.0070563596.9531931
Mint133954192021-10-11 5:19:181182 days ago1633929558IN
0xC46abE98...434ccE2d3
0 ETH0.0137722792.75007328
Safe Transfer Fr...133783612021-10-08 13:03:511185 days ago1633698231IN
0xC46abE98...434ccE2d3
0 ETH0.03100428116.06004382
Safe Transfer Fr...133481962021-10-03 19:42:061190 days ago1633290126IN
0xC46abE98...434ccE2d3
0 ETH0.0170286462.61405405
Burn132710752021-09-21 19:41:461202 days ago1632253306IN
0xC46abE98...434ccE2d3
0 ETH0.0120868131.32266251
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
212972512024-11-30 1:35:4736 days ago1732930547
0xC46abE98...434ccE2d3
0.01 ETH
212972502024-11-30 1:35:3536 days ago1732930535
0xC46abE98...434ccE2d3
0.01 ETH
210855342024-10-31 12:11:3566 days ago1730376695
0xC46abE98...434ccE2d3
0.18237813 ETH
193284562024-02-28 20:37:35312 days ago1709152655
0xC46abE98...434ccE2d3
0.19934673 ETH
193283732024-02-28 20:20:59312 days ago1709151659
0xC46abE98...434ccE2d3
0.2 ETH
190694432024-01-23 12:42:59348 days ago1706013779
0xC46abE98...434ccE2d3
0.03258203 ETH
189869052024-01-11 23:19:47360 days ago1705015187
0xC46abE98...434ccE2d3
0.41291681 ETH
189253302024-01-03 7:24:35368 days ago1704266675
0xC46abE98...434ccE2d3
0.05036216 ETH
187573972023-12-10 17:47:47392 days ago1702230467
0xC46abE98...434ccE2d3
0.0005 ETH
167678352023-03-06 7:29:35671 days ago1678087775
0xC46abE98...434ccE2d3
0.05008273 ETH
166798042023-02-21 22:19:59684 days ago1677017999
0xC46abE98...434ccE2d3
0.02902787 ETH
166689762023-02-20 9:49:59685 days ago1676886599
0xC46abE98...434ccE2d3
0.02919692 ETH
166073212023-02-11 18:30:59694 days ago1676140259
0xC46abE98...434ccE2d3
0.09946462 ETH
166072172023-02-11 18:09:59694 days ago1676138999
0xC46abE98...434ccE2d3
0.1 ETH
165747492023-02-07 5:13:47698 days ago1675746827
0xC46abE98...434ccE2d3
0.01905538 ETH
165747442023-02-07 5:12:47698 days ago1675746767
0xC46abE98...434ccE2d3
0.01358931 ETH
165704972023-02-06 14:59:23699 days ago1675695563
0xC46abE98...434ccE2d3
0.18372162 ETH
165373722023-02-01 23:53:11704 days ago1675295591
0xC46abE98...434ccE2d3
0.30224976 ETH
164243232023-01-17 5:07:59719 days ago1673932079
0xC46abE98...434ccE2d3
0.12723673 ETH
162194552022-12-19 14:51:23748 days ago1671461483
0xC46abE98...434ccE2d3
0.24141003 ETH
162184492022-12-19 11:29:59748 days ago1671449399
0xC46abE98...434ccE2d3
0.03680093 ETH
162184412022-12-19 11:28:23748 days ago1671449303
0xC46abE98...434ccE2d3
0.01976732 ETH
160144572022-11-20 23:18:23777 days ago1668986303
0xC46abE98...434ccE2d3
0.5 ETH
155479312022-09-16 18:23:47842 days ago1663352627
0xC46abE98...434ccE2d3
0.04736492 ETH
155399422022-09-15 15:19:23843 days ago1663255163
0xC46abE98...434ccE2d3
0.3 ETH
View All Internal Transactions
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x35C748F2...fdBdd6efF
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
ERC20WrapperV1

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-01-31
*/

// File: node_modules\@openzeppelin\contracts\introspection\IERC165.sol

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <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);
}

// File: @openzeppelin\contracts\token\ERC1155\IERC1155.sol

// SPDX_License_Identifier: MIT

pragma solidity >=0.6.2 <0.8.0;


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

// File: @openzeppelin\contracts\token\ERC1155\IERC1155Receiver.sol

// SPDX_License_Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;


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

// File: node_modules\eth-item-token-standard\IERC1155Views.sol

// SPDX_License_Identifier: MIT



/**
 * @title IERC1155Views - An optional utility interface to improve the ERC-1155 Standard.
 * @dev This interface introduces some additional capabilities for ERC-1155 Tokens.
 */
interface IERC1155Views {

    /**
     * @dev Returns the total supply of the given token id
     * @param objectId the id of the token whose availability you want to know 
     */
    function totalSupply(uint256 objectId) external view returns (uint256);

    /**
     * @dev Returns the name of the given token id
     * @param objectId the id of the token whose name you want to know 
     */
    function name(uint256 objectId) external view returns (string memory);

    /**
     * @dev Returns the symbol of the given token id
     * @param objectId the id of the token whose symbol you want to know 
     */
    function symbol(uint256 objectId) external view returns (string memory);

    /**
     * @dev Returns the decimals of the given token id
     * @param objectId the id of the token whose decimals you want to know 
     */
    function decimals(uint256 objectId) external view returns (uint256);

    /**
     * @dev Returns the uri of the given token id
     * @param objectId the id of the token whose uri you want to know 
     */
    function uri(uint256 objectId) external view returns (string memory);
}

// File: @openzeppelin\contracts\token\ERC20\IERC20.sol

// SPDX_License_Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

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

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

// File: node_modules\eth-item-token-standard\IBaseTokenData.sol

// SPDX_License_Identifier: MIT



interface IBaseTokenData {
    function name() external view returns (string memory);

    function symbol() external view returns (string memory);
}

// File: node_modules\eth-item-token-standard\IERC20Data.sol

// SPDX_License_Identifier: MIT





interface IERC20Data is IBaseTokenData, IERC20 {
    function decimals() external view returns (uint256);
}

// File: node_modules\eth-item-token-standard\IEthItemInteroperableInterface.sol

// SPDX_License_Identifier: MIT





interface IEthItemInteroperableInterface is IERC20, IERC20Data {

    function init(uint256 objectId, string memory name, string memory symbol, uint256 decimals) external;

    function mainInterface() external view returns (address);

    function objectId() external view returns (uint256);

    function mint(address owner, uint256 amount) external;

    function burn(address owner, uint256 amount) external;

    function permitNonce(address sender) external view returns(uint256);

    function permit(address owner, address spender, uint value, uint8 v, bytes32 r, bytes32 s) external;

    function interoperableInterfaceVersion() external pure returns(uint256 ethItemInteroperableInterfaceVersion);
}

// File: eth-item-token-standard\IEthItemMainInterface.sol

// SPDX_License_Identifier: MIT








interface IEthItemMainInterface is IERC1155, IERC1155Views, IBaseTokenData {

    function init(
        address interoperableInterfaceModel,
        string calldata name,
        string calldata symbol
    ) external;

    function mainInterfaceVersion() external pure returns(uint256 ethItemInteroperableVersion);

    function toInteroperableInterfaceAmount(uint256 objectId, uint256 ethItemAmount) external view returns (uint256 interoperableInterfaceAmount);

    function toMainInterfaceAmount(uint256 objectId, uint256 erc20WrapperAmount) external view returns (uint256 mainInterfaceAmount);

    function interoperableInterfaceModel() external view returns (address, uint256);

    function asInteroperable(uint256 objectId) external view returns (IEthItemInteroperableInterface);

    function emitTransferSingleEvent(address sender, address from, address to, uint256 objectId, uint256 amount) external;

    function mint(uint256 amount, string calldata partialUri)
        external
        returns (uint256, address);

    function burn(
        uint256 objectId,
        uint256 amount
    ) external;

    function burnBatch(
        uint256[] calldata objectIds,
        uint256[] calldata amounts
    ) external;

    event NewItem(uint256 indexed objectId, address indexed tokenAddress);
    event Mint(uint256 objectId, address tokenAddress, uint256 amount);
}

// File: contracts\models\common\IEthItemModelBase.sol

//SPDX_License_Identifier: MIT




/**
 * @dev This interface contains the commonn data provided by all the EthItem models
 */
interface IEthItemModelBase is IEthItemMainInterface {

    /**
     * @dev Contract Initialization, the caller of this method should be a Contract containing the logic to provide the EthItemERC20WrapperModel to be used to create ERC20-based objectIds
     * @param name the chosen name for this NFT
     * @param symbol the chosen symbol (Ticker) for this NFT
     */
    function init(string calldata name, string calldata symbol) external;

    /**
     * @return modelVersionNumber The version number of the Model, it should be progressive
     */
    function modelVersion() external pure returns(uint256 modelVersionNumber);

    /**
     * @return factoryAddress the address of the Contract which initialized this EthItem
     */
    function factory() external view returns(address factoryAddress);
}

// File: contracts\models\ERC20Wrapper\1\IERC20WrapperV1.sol

//SPDX_License_Identifier: MIT




/**
 * @title ERC20-Based EthItem, version 1.
 * @dev All the wrapped ERC20 Tokens will be created following this Model.
 * The minting operation can be done by calling the appropriate method given in this interface.
 * The burning operation will send back the original wrapped ERC20 amount.
 * To initalize it, the original 'init(address,string,string)'
 * function of the EthItem Token Standard will be used, but the first address parameter will be the original ERC20 Source Contract to Wrap, and NOT the ERC20Model, which is always taken by the Contract who creates the Wrapper.
 */
interface IERC20WrapperV1 is IEthItemModelBase {

    /**
     * @param objectId the Object Id you want to know info about
     * @return erc20TokenAddress the wrapped ERC20 Token address corresponding to the given objectId
     */
    function source(uint256 objectId) external view returns (address erc20TokenAddress);

     /**
     * @param erc20TokenAddress the wrapped ERC20 Token address you want to know info about
     * @return objectId the id in the collection which correspondes to the given erc20TokenAddress
     */
    function object(address erc20TokenAddress) external view returns (uint256 objectId);

    /**
     * @dev Mint operation.
     * It inhibits and bypasses the original EthItem Token Standard 'mint(uint256,string)'.
     * The logic will execute a transferFrom call to the given erc20TokenAddress to transfer the chosed amount of tokens
     * @param erc20TokenAddress The token address to wrap.
     * @param amount The token amount to wrap
     *
     * @return objectId the id given by this collection to the given erc20TokenAddress. It can be brand new if it is the first time this collection is created. Otherwhise, the firstly-created objectId value will be used.
     * @return wrapperAddress The address ethItemERC20Wrapper generated after the creation of the returned objectId
     */
    function mint(address erc20TokenAddress, uint256 amount) external returns (uint256 objectId, address wrapperAddress);

    function mintETH() external payable returns (uint256 objectId, address wrapperAddress);
}

// File: @openzeppelin\contracts\GSN\Context.sol

// SPDX_License_Identifier: MIT

pragma solidity >=0.6.0 <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 GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

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

// File: @openzeppelin\contracts\math\SafeMath.sol

// SPDX_License_Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

// File: @openzeppelin\contracts\utils\Address.sol

// SPDX_License_Identifier: MIT

pragma solidity >=0.6.2 <0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin\contracts\introspection\ERC165.sol

// SPDX_License_Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;


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

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

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

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

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

// File: node_modules\eth-item-token-standard\IEthItemMainInterface.sol

// SPDX_License_Identifier: MIT


// File: eth-item-token-standard\EthItemMainInterface.sol

// SPDX_License_Identifier: MIT










/**
 * @title EthItem - An improved ERC1155 token with ERC20 trading capabilities.
 * @dev In the EthItem standard, there is no a centralized storage where to save every objectId info.
 * In fact every NFT data is saved in a specific ERC20 token that can also work as a standalone one, and let transfer parts of an atomic object.
 * The ERC20 represents a unique Token Id, and its supply represents the entire supply of that Token Id.
 * You can instantiate a EthItem as a brand-new one, or as a wrapper for pre-existent classic ERC1155 NFT.
 * In the first case, you can introduce some particular permissions to mint new tokens.
 * In the second case, you need to send your NFTs to the Wrapped EthItem (using the classic safeTransferFrom or safeBatchTransferFrom methods)
 * and it will create a brand new ERC20 Token or mint new supply (in the case some tokens with the same id were transfered before yours).
 */
contract EthItemMainInterface is IEthItemMainInterface, Context, ERC165 {
    using SafeMath for uint256;
    using Address for address;

    bytes4 internal constant _INTERFACEobjectId_ERC1155 = 0xd9b67a26;

    string internal _name;
    string internal _symbol;

    mapping(uint256 => string) internal _objectUris;

    mapping(uint256 => address) internal _dest;
    mapping(address => bool) internal _isMine;

    mapping(address => mapping(address => bool)) internal _operatorApprovals;

    address internal _interoperableInterfaceModel;
    uint256 internal _interoperableInterfaceModelVersion;

    uint256 internal _decimals;

    /**
     * @dev Constructor
     * When you create a EthItem, you can specify if you want to create a brand new one, passing the classic data like name, symbol, amd URI,
     * or wrap a pre-existent ERC1155 NFT, passing its contract address.
     * You can use just one of the two modes at the same time.
     * In both cases, a ERC20 token address is mandatory. It will be used as a model to be cloned for every minted NFT.
     * @param erc20NFTWrapperModel the address of the ERC20 pre-deployed model. I will not be used in the procedure, but just cloned as a brand-new one every time a new NFT is minted.
     * @param name the name of the brand new EthItem to be created. If you are wrapping a pre-existing ERC1155 NFT, this must be blank.
     * @param symbol the symbol of the brand new EthItem to be created. If you are wrapping a pre-existing ERC1155 NFT, this must be blank.
     */
    constructor(
        address erc20NFTWrapperModel,
        string memory name,
        string memory symbol
    ) public {
        if(erc20NFTWrapperModel != address(0)) {
            init(erc20NFTWrapperModel, name, symbol);
        }
    }

    /**
     * @dev Utility method which contains the logic of the constructor.
     * This is a useful trick to instantiate a contract when it is cloned.
     */
    function init(
        address interoperableInterfaceModel,
        string memory name,
        string memory symbol
    ) public virtual override {
        require(
            _interoperableInterfaceModel == address(0),
            "Init already called!"
        );

        require(
            interoperableInterfaceModel != address(0),
            "Model should be a valid ethereum address"
        );
        _interoperableInterfaceModelVersion = IEthItemInteroperableInterface(_interoperableInterfaceModel = interoperableInterfaceModel).interoperableInterfaceVersion();
        require(
            keccak256(bytes(name)) != keccak256(""),
            "Name is mandatory"
        );
        require(
            keccak256(bytes(symbol)) != keccak256(""),
            "Symbol is mandatory"
        );

        _name = name;
        _symbol = symbol;
        _decimals = 18;

        _registerInterface(this.safeBatchTransferFrom.selector);
        _registerInterface(_INTERFACEobjectId_ERC1155);
        _registerInterface(this.balanceOf.selector);
        _registerInterface(this.balanceOfBatch.selector);
        _registerInterface(this.setApprovalForAll.selector);
        _registerInterface(this.isApprovedForAll.selector);
        _registerInterface(this.safeTransferFrom.selector);
        _registerInterface(this.uri.selector);
        _registerInterface(this.totalSupply.selector);
        _registerInterface(0x00ad800c); //name(uint256)
        _registerInterface(0x4e41a1fb); //symbol(uint256)
        _registerInterface(this.decimals.selector);
        _registerInterface(0x06fdde03); //name()
        _registerInterface(0x95d89b41); //symbol()
    }

    function mainInterfaceVersion() public pure virtual override returns(uint256) {
        return 1;
    }

    /**
     * @dev Mint
     * If the EthItem does not wrap a pre-existent NFT, this call is used to mint new NFTs, according to the permission rules provided by the Token creator.
     * @param amount The amount of tokens to be created. It must be greater than 1 unity.
     * @param objectUri The Uri to locate this new token's metadata.
     */
    function mint(uint256 amount, string memory objectUri)
        public
        virtual
        override
        returns (uint256 objectId, address tokenAddress)
    {
        require(
            amount > 1,
            "You need to pass more than a token"
        );
        require(
            keccak256(bytes(objectUri)) != keccak256(""),
            "Uri cannot be empty"
        );
        (objectId, tokenAddress) = _mint(msg.sender, amount);
        _objectUris[objectId] = objectUri;
    }

    /**
     * @dev Burn
     * You can choose to burn your NFTs.
     * In case this Token wraps a pre-existent ERC1155 NFT, you will receive the wrapped NFTs.
     */
    function burn(
        uint256 objectId,
        uint256 amount
    ) public virtual override {
        uint256[] memory objectIds = new uint256[](1);
        objectIds[0] = objectId;
        uint256[] memory amounts = new uint256[](1);
        amounts[0] = amount;
        _burn(msg.sender, objectIds, amounts);
        emit TransferSingle(msg.sender, msg.sender, address(0), objectId, amount);
    }

    /**
     * @dev Burn Batch
     * Same as burn, but for multiple NFTs at the same time
     */
    function burnBatch(
        uint256[] memory objectIds,
        uint256[] memory amounts
    ) public virtual override {
        _burn(msg.sender, objectIds, amounts);
        emit TransferBatch(msg.sender, msg.sender, address(0), objectIds, amounts);
    }

    function _burn(address owner, 
        uint256[] memory objectIds,
        uint256[] memory amounts) internal virtual {
        for (uint256 i = 0; i < objectIds.length; i++) {
            asInteroperable(objectIds[i]).burn(
                owner,
                toInteroperableInterfaceAmount(objectIds[i], amounts[i])
            );
        }
    }

    /**
     * @dev get the address of the ERC20 Contract used as a model
     */
    function interoperableInterfaceModel() public virtual override view returns (address, uint256) {
        return (_interoperableInterfaceModel, _interoperableInterfaceModelVersion);
    }

    /**
     * @dev Gives back the address of the ERC20 Token representing this Token Id
     */
    function asInteroperable(uint256 objectId)
        public
        virtual
        override
        view
        returns (IEthItemInteroperableInterface)
    {
        return IEthItemInteroperableInterface(_dest[objectId]);
    }

    /**
     * @dev Returns the total supply of the given token id
     * @param objectId the id of the token whose availability you want to know
     */
    function totalSupply(uint256 objectId)
        public
        virtual
        override
        view
        returns (uint256)
    {
        return toMainInterfaceAmount(objectId, asInteroperable(objectId).totalSupply());
    }

    /**
     * @dev Returns the name of the given token id
     * @param objectId the id of the token whose name you want to know
     */
    function name(uint256 objectId)
        public
        virtual
        override
        view
        returns (string memory)
    {
        return asInteroperable(objectId).name();
    }

    function name() public virtual override view returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the given token id
     * @param objectId the id of the token whose symbol you want to know
     */
    function symbol(uint256 objectId)
        public
        virtual
        override
        view
        returns (string memory)
    {
        return asInteroperable(objectId).symbol();
    }

    function symbol() public virtual override view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the decimals of the given token id
     */
    function decimals(uint256)
        public
        virtual
        override
        view
        returns (uint256)
    {
        return 1;
    }

    /**
     * @dev Returns the uri of the given token id
     * @param objectId the id of the token whose uri you want to know
     */
    function uri(uint256 objectId)
        public
        virtual
        override
        view
        returns (string memory)
    {
        return _objectUris[objectId];
    }

    /**
     * @dev Classic ERC1155 Standard Method
     */
    function balanceOf(address account, uint256 objectId)
        public
        virtual
        override
        view
        returns (uint256)
    {
        return toMainInterfaceAmount(objectId, asInteroperable(objectId).balanceOf(account));
    }

    /**
     * @dev Classic ERC1155 Standard Method
     */
    function balanceOfBatch(
        address[] memory accounts,
        uint256[] memory objectIds
    ) public virtual override view returns (uint256[] memory balances) {
        balances = new uint256[](accounts.length);
        for (uint256 i = 0; i < accounts.length; i++) {
            balances[i] = balanceOf(accounts[i], objectIds[i]);
        }
    }

    /**
     * @dev Classic ERC1155 Standard Method
     */
    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        address sender = _msgSender();
        require(
            sender != operator,
            "ERC1155: setting approval status for self"
        );

        _operatorApprovals[sender][operator] = approved;
        emit ApprovalForAll(sender, operator, approved);
    }

    /**
     * @dev Classic ERC1155 Standard Method
     */
    function isApprovedForAll(address account, address operator)
        public
        virtual
        override
        view
        returns (bool)
    {
        return _operatorApprovals[account][operator];
    }

    /**
     * @dev Classic ERC1155 Standard Method
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 objectId,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(to != address(0), "ERC1155: transfer to the zero address");
        address operator = _msgSender();
        require(
            from == operator || isApprovedForAll(from, operator),
            "ERC1155: caller is not owner nor approved"
        );

        asInteroperable(objectId).transferFrom(from, to, toInteroperableInterfaceAmount(objectId, amount));

        emit TransferSingle(operator, from, to, objectId, amount);

        _doSafeTransferAcceptanceCheck(
            operator,
            from,
            to,
            objectId,
            amount,
            data
        );
    }

    /**
     * @dev Classic ERC1155 Standard Method
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory objectIds,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(to != address(0), "ERC1155: transfer to the zero address");
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        for (uint256 i = 0; i < objectIds.length; i++) {
            asInteroperable(objectIds[i]).transferFrom(
                from,
                to,
                toInteroperableInterfaceAmount(objectIds[i], amounts[i])
            );
        }

        address operator = _msgSender();

        emit TransferBatch(operator, from, to, objectIds, amounts);

        _doSafeBatchTransferAcceptanceCheck(
            operator,
            from,
            to,
            objectIds,
            amounts,
            data
        );
    }

    function emitTransferSingleEvent(address sender, address from, address to, uint256 objectId, uint256 amount) public override {
        require(_dest[objectId] == msg.sender, "Unauthorized Action!");
        uint256 entireAmount = toMainInterfaceAmount(objectId, amount);
        if(entireAmount == 0) {
            return;
        }
        emit TransferSingle(sender, from, to, objectId, entireAmount);
    }

    function toInteroperableInterfaceAmount(uint256 objectId, uint256 mainInterfaceAmount) public override virtual view returns (uint256 interoperableInterfaceAmount) {
        interoperableInterfaceAmount = mainInterfaceAmount * (10**asInteroperable(objectId).decimals());
    }

    function toMainInterfaceAmount(uint256 objectId, uint256 interoperableInterfaceAmount) public override virtual view returns (uint256 mainInterfaceAmount) {
        mainInterfaceAmount = interoperableInterfaceAmount / (10**asInteroperable(objectId).decimals());
    }

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        if (to.isContract()) {
            try
                IERC1155Receiver(to).onERC1155Received(
                    operator,
                    from,
                    id,
                    amount,
                    data
                )
            returns (bytes4 response) {
                if (
                    response != IERC1155Receiver(to).onERC1155Received.selector
                ) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        if (to.isContract()) {
            try
                IERC1155Receiver(to).onERC1155BatchReceived(
                    operator,
                    from,
                    ids,
                    amounts,
                    data
                )
            returns (bytes4 response) {
                if (
                    response !=
                    IERC1155Receiver(to).onERC1155BatchReceived.selector
                ) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _clone(address original) internal returns (address copy) {
        assembly {
            mstore(
                0,
                or(
                    0x5880730000000000000000000000000000000000000000803b80938091923cF3,
                    mul(original, 0x1000000000000000000)
                )
            )
            copy := create(0, 0, 32)
            switch extcodesize(copy)
                case 0 {
                    invalid()
                }
        }
    }

    function _mint(
        address from,
        uint256 amount
    ) internal virtual returns (uint256 objectId, address wrapperAddress) {
        IEthItemInteroperableInterface wrapper = IEthItemInteroperableInterface(wrapperAddress = _clone(_interoperableInterfaceModel));
        _isMine[_dest[objectId = uint256(wrapperAddress)] = wrapperAddress] = true;
        wrapper.init(objectId, _name, _symbol, _decimals);
        wrapper.mint(from, amount * (10**_decimals));
        emit NewItem(objectId, wrapperAddress);
        emit Mint(objectId, wrapperAddress, amount);
        emit TransferSingle(address(this), address(0), from, objectId, amount);
    }
}

// File: @openzeppelin\contracts\introspection\IERC165.sol

// SPDX_License_Identifier: MIT

pragma solidity >=0.6.0 <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}.
 */

// File: contracts\orchestrator\IEthItemOrchestratorDependantElement.sol

//SPDX_License_Identifier: MIT




interface IEthItemOrchestratorDependantElement is IERC165 {

    /**
     * @dev GET - The DoubleProxy of the DFO linked to this Contract
     */
    function doubleProxy() external view returns (address);

    /**
     * @dev SET - The DoubleProxy of the DFO linked to this Contract
     * It can be done only by the Factory controller
     * @param newDoubleProxy the new DoubleProxy address
     */
    function setDoubleProxy(address newDoubleProxy) external;

    function isAuthorizedOrchestrator(address operator) external view returns(bool);
}

// File: contracts\factory\IEthItemFactory.sol

//SPDX_License_Identifier: MIT




/**
 * @title IEthItemFactory
 * @dev This contract represents the Factory Used to deploy all the EthItems, keeping track of them.
 */
interface IEthItemFactory is IEthItemOrchestratorDependantElement {

    function isModel(address modelAddress) external returns(bool);

    /**
     * @dev GET - The address of the Smart Contract whose code will serve as a model for all the EthItemERC20Wrappers (please see the eth-item-token-standard for further information).
     */
    function ethItemInteroperableInterfaceModel() external view returns (address ethItemInteroperableInterfaceModelAddress, uint256 ethItemInteroperableInterfaceModelVersion);

    /**
     * @dev SET - The address of the Smart Contract whose code will serve as a model for all the EthItemERC20Wrappers (please see the eth-item-token-standard for further information).
     * It can be done only by the Factory controller
     */
    function setEthItemInteroperableInterfaceModel(address ethItemInteroperableInterfaceModelAddress) external;

    /**
     * @dev GET - The address of the Smart Contract whose code will serve as a model for all the Native EthItems.
     * Every EthItem will have its own address, but the code will be cloned from this one.
     */
    function nativeModel() external view returns (address nativeModelAddress, uint256 nativeModelVersion);

    /**
     * @dev SET - The address of the Native EthItem model.
     * It can be done only by the Factory controller
     */
    function setNativeModel(address nativeModelAddress) external;
    function addNativeModel(address nativeModelAddress) external;

    event NativeModel(address indexed);

    /**
     * @dev GET - The address of the Smart Contract whose code will serve as a model for all the Wrapped ERC1155 EthItems.
     * Every EthItem will have its own address, but the code will be cloned from this one.
     */
    function erc1155WrapperModel() external view returns (address erc1155WrapperModelAddress, uint256 erc1155WrapperModelVersion);

    /**
     * @dev SET - The address of the ERC1155 NFT-Based EthItem model.
     * It can be done only by the Factory controller
     */
    function setERC1155WrapperModel(address erc1155WrapperModelAddress) external;
    function addERC1155WrapperModel(address erc1155WrapperModelAddress) external;

    event ERC1155WrapperModel(address indexed);

    /**
     * @dev GET - The address of the Smart Contract whose code will serve as a model for all the Wrapped ERC20 EthItems.
     */
    function erc20WrapperModel() external view returns (address erc20WrapperModelAddress, uint256 erc20WrapperModelVersion);

    /**
     * @dev SET - The address of the Smart Contract whose code will serve as a model for all the Wrapped ERC20 EthItems.
     * It can be done only by the Factory controller
     */
    function setERC20WrapperModel(address erc20WrapperModelAddress) external;
    function addERC20WrapperModel(address erc20WrapperModelAddress) external;

    event ERC20WrapperModel(address indexed);

    /**
     * @dev GET - The address of the Smart Contract whose code will serve as a model for all the Wrapped ERC721 EthItems.
     */
    function erc721WrapperModel() external view returns (address erc721WrapperModelAddress, uint256 erc721WrapperModelVersion);

    /**
     * @dev SET - The address of the Smart Contract whose code will serve as a model for all the Wrapped ERC721 EthItems.
     * It can be done only by the Factory controller
     */
    function setERC721WrapperModel(address erc721WrapperModelAddress) external;
    function addERC721WrapperModel(address erc721WrapperModelAddress) external;

    event ERC721WrapperModel(address indexed);

    /**
     * @dev GET - The elements (numerator and denominator) useful to calculate the percentage fee to be transfered to the DFO for every new Minted EthItem
     */
    function mintFeePercentage() external view returns (uint256 mintFeePercentageNumerator, uint256 mintFeePercentageDenominator);

    /**
     * @dev SET - The element useful to calculate the Percentage fee
     * It can be done only by the Factory controller
     */
    function setMintFeePercentage(uint256 mintFeePercentageNumerator, uint256 mintFeePercentageDenominator) external;

    /**
     * @dev Useful utility method to calculate the percentage fee to transfer to the DFO for the minted EthItem amount.
     * @param erc20WrapperAmount The amount of minted EthItem
     */
    function calculateMintFee(uint256 erc20WrapperAmount) external view returns (uint256 mintFee, address dfoWalletAddress);

    /**
     * @dev GET - The elements (numerator and denominator) useful to calculate the percentage fee to be transfered to the DFO for every Burned EthItem
     */
    function burnFeePercentage() external view returns (uint256 burnFeePercentageNumerator, uint256 burnFeePercentageDenominator);

    /**
     * @dev SET - The element useful to calculate the Percentage fee
     * It can be done only by the Factory controller
     */
    function setBurnFeePercentage(uint256 burnFeePercentageNumerator, uint256 burnFeePercentageDenominator) external;

    /**
     * @dev Useful utility method to calculate the percentage fee to transfer to the DFO for the burned EthItem amount.
     * @param erc20WrapperAmount The amount of burned EthItem
     */
    function calculateBurnFee(uint256 erc20WrapperAmount) external view returns (uint256 burnFee, address dfoWalletAddress);

    /**
     * @dev Business Logic to create a brand-new EthItem.
     * It raises the 'NewNativeCreated' events.
     * @param modelInitCallPayload The ABI-encoded input parameters to be passed to the model to phisically create the NFT.
     * It changes according to the Model Version.
     * @param ethItemAddress The address of the new EthItem
     * @param ethItemInitResponse The ABI-encoded output response eventually received by the Model initialization procedure.
     */
    function createNative(address modelAddress, bytes calldata modelInitCallPayload) external returns (address ethItemAddress, bytes memory ethItemInitResponse);

    event NewNativeCreated(uint256 indexed standardVersion, uint256 indexed wrappedItemModelVersion, uint256 indexed modelVersion, address tokenCreated);
    event NewNativeCreated(address indexed model, uint256 indexed modelVersion, address indexed tokenCreated, address creator);

    /**
     * @dev Business Logic to wrap already existing ERC1155 Tokens to obtain a new NFT-Based EthItem.
     * It raises the 'NewWrappedERC1155Created' events.
     * @param modelInitCallPayload The ABI-encoded input parameters to be passed to the model to phisically create the NFT.
     * It changes according to the Model Version.
     * @param ethItemAddress The address of the new EthItem
     * @param ethItemInitResponse The ABI-encoded output response eventually received by the Model initialization procedure.
     */
    function createWrappedERC1155(address modelAddress, bytes calldata modelInitCallPayload) external returns (address ethItemAddress, bytes memory ethItemInitResponse);

    event NewWrappedERC1155Created(uint256 indexed standardVersion, uint256 indexed wrappedItemModelVersion, uint256 indexed modelVersion, address tokenCreated);
    event NewWrappedERC1155Created(address indexed model, uint256 indexed modelVersion, address indexed tokenCreated, address creator);

    /**
     * @dev Business Logic to wrap already existing ERC20 Tokens to obtain a new NFT-Based EthItem.
     * It raises the 'NewWrappedERC20Created' events.
     * @param modelInitCallPayload The ABI-encoded input parameters to be passed to the model to phisically create the NFT.
     * It changes according to the Model Version.
     * @param ethItemAddress The address of the new EthItem
     * @param ethItemInitResponse The ABI-encoded output response eventually received by the Model initialization procedure.
     */
    function createWrappedERC20(bytes calldata modelInitCallPayload) external returns (address ethItemAddress, bytes memory ethItemInitResponse);

    event NewWrappedERC20Created(uint256 indexed standardVersion, uint256 indexed wrappedItemModelVersion, uint256 indexed modelVersion, address tokenCreated);
    event NewWrappedERC20Created(address indexed model, uint256 indexed modelVersion, address indexed tokenCreated, address creator);

    /**
     * @dev Business Logic to wrap already existing ERC721 Tokens to obtain a new NFT-Based EthItem.
     * It raises the 'NewWrappedERC721Created' events.
     * @param modelInitCallPayload The ABI-encoded input parameters to be passed to the model to phisically create the NFT.
     * It changes according to the Model Version.
     * @param ethItemAddress The address of the new EthItem
     * @param ethItemInitResponse The ABI-encoded output response eventually received by the Model initialization procedure.
     */
    function createWrappedERC721(address modelAddress, bytes calldata modelInitCallPayload) external returns (address ethItemAddress, bytes memory ethItemInitResponse);

    event NewWrappedERC721Created(uint256 indexed standardVersion, uint256 indexed wrappedItemModelVersion, uint256 indexed modelVersion, address tokenCreated);
    event NewWrappedERC721Created(address indexed model, uint256 indexed modelVersion, address indexed tokenCreated, address creator);
}

// File: contracts\models\common\EthItemModelBase.sol

//SPDX_License_Identifier: MIT






abstract contract EthItemModelBase is IEthItemModelBase, EthItemMainInterface(address(0), "", "") {

    address internal _factoryAddress;

    function init(
        address,
        string memory,
        string memory
    ) public virtual override(IEthItemMainInterface, EthItemMainInterface) {
        revert("Cannot directly call this method.");
    }

    function init(
        string memory name,
        string memory symbol
    ) public override virtual {
        require(_factoryAddress == address(0), "Init already called!");
        (address ethItemInteroperableInterfaceModelAddress,) = IEthItemFactory(_factoryAddress = msg.sender).ethItemInteroperableInterfaceModel();
        super.init(ethItemInteroperableInterfaceModelAddress, name, symbol);
    }

    function modelVersion() public override virtual pure returns(uint256) {
        return 1;
    }

    function factory() public override view returns (address) {
        return _factoryAddress;
    }

    function _sendMintFeeToDFO(address from, uint256 objectId, uint256 erc20WrapperAmount) internal virtual returns(uint256 mintFeeToDFO) {
        address dfoWallet;
        (mintFeeToDFO, dfoWallet) = IEthItemFactory(_factoryAddress).calculateMintFee(erc20WrapperAmount);
        if(mintFeeToDFO > 0 && dfoWallet != address(0)) {
            asInteroperable(objectId).transferFrom(from, dfoWallet, mintFeeToDFO);
        }
    }

    function _sendBurnFeeToDFO(address from, uint256 objectId, uint256 erc20WrapperAmount) internal virtual returns(uint256 burnFeeToDFO) {
        address dfoWallet;
        (burnFeeToDFO, dfoWallet) = IEthItemFactory(_factoryAddress).calculateBurnFee(erc20WrapperAmount);
        if(burnFeeToDFO > 0 && dfoWallet != address(0)) {
            asInteroperable(objectId).transferFrom(from, dfoWallet, burnFeeToDFO);
        }
    }

    function mint(uint256, string memory)
        public
        virtual
        override(IEthItemMainInterface, EthItemMainInterface)
        returns (uint256, address)
    {
        revert("Cannot directly call this method.");
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 objectId,
        uint256 amount,
        bytes memory data
    ) public virtual override(IERC1155, EthItemMainInterface) {
        require(to != address(0), "ERC1155: transfer to the zero address");
        address operator = _msgSender();
        require(
            from == operator || isApprovedForAll(from, operator),
            "ERC1155: caller is not owner nor approved"
        );

        _doERC20Transfer(from, to, objectId, amount);

        emit TransferSingle(operator, from, to, objectId, amount);

        _doSafeTransferAcceptanceCheck(
            operator,
            from,
            to,
            objectId,
            amount,
            data
        );
    }

    /**
     * @dev Classic ERC1155 Standard Method
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory objectIds,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override(IERC1155, EthItemMainInterface) {
        require(to != address(0), "ERC1155: transfer to the zero address");
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        for (uint256 i = 0; i < objectIds.length; i++) {
            _doERC20Transfer(from, to, objectIds[i], amounts[i]);
        }

        address operator = _msgSender();

        emit TransferBatch(operator, from, to, objectIds, amounts);

        _doSafeBatchTransferAcceptanceCheck(
            operator,
            from,
            to,
            objectIds,
            amounts,
            data
        );
    }

    function _doERC20Transfer(address from, address to, uint256 objectId, uint256 amount) internal virtual {
        (,uint256 result) = _getCorrectERC20ValueForTransferOrBurn(from, objectId, amount);
        asInteroperable(objectId).transferFrom(from, to, result);
    }

    function _getCorrectERC20ValueForTransferOrBurn(address from, uint256 objectId, uint256 amount) internal virtual view returns(uint256 balanceOfNormal, uint256 result) {
        uint256 toTransfer = toInteroperableInterfaceAmount(objectId, amount);
        uint256 balanceOfDecimals = asInteroperable(objectId).balanceOf(from);
        balanceOfNormal = balanceOf(from, objectId);
        result = amount == balanceOfNormal ? balanceOfDecimals : toTransfer;
    }

    function _burn(
        uint256 objectId,
        uint256 amount
    ) internal virtual returns(uint256 burnt, uint256 burnFeeToDFO) {
        (uint256 balanceOfNormal, uint256 result) = _getCorrectERC20ValueForTransferOrBurn(msg.sender, objectId, amount);
        require(balanceOfNormal >= amount, "Insufficient Amount");
        burnFeeToDFO = _sendBurnFeeToDFO(msg.sender, objectId, result);
        asInteroperable(objectId).burn(msg.sender, burnt = result - burnFeeToDFO);
    }

    function _isUnique(uint256 objectId) internal virtual view returns (bool unique, uint256 unity, uint256 totalSupply, uint256 erc20Decimals) {
        erc20Decimals = asInteroperable(objectId).decimals();
        unity = erc20Decimals <= 1 ? 1 : (10**erc20Decimals);
        totalSupply = asInteroperable(objectId).totalSupply();
        unique = totalSupply <= unity;
    }

    function toMainInterfaceAmount(uint256 objectId, uint256 interoperableInterfaceAmount) public virtual view override(IEthItemMainInterface, EthItemMainInterface) returns (uint256 mainInterfaceAmount) {
        (bool unique, uint256 unity,, uint256 erc20Decimals) = _isUnique(objectId);
        if(unique && interoperableInterfaceAmount < unity) {
            uint256 half = (unity * 51) / 100;
            return mainInterfaceAmount = interoperableInterfaceAmount <= half ? 0 : 1;
        }
        return mainInterfaceAmount = interoperableInterfaceAmount / (10**erc20Decimals);
    }
}

// File: eth-item-token-standard\IERC20Data.sol

// SPDX_License_Identifier: MIT






// File: contracts\models\ERC20Wrapper\1\ERC20WrapperV1.sol

//SPDX_License_Identifier: MIT






contract ERC20WrapperV1 is IERC20WrapperV1, EthItemModelBase {

    uint256 public constant ETHEREUM_OBJECT_ID = uint256(keccak256(bytes("THE ETHEREUM OBJECT IT")));

    mapping(uint256 => address) internal _sources;
    mapping(uint256 => uint256) internal _decimalsMap;
    mapping(address => uint256) internal _objects;

    function init(
        string memory name,
        string memory symbol
    ) public virtual override(IEthItemModelBase, EthItemModelBase) {
        super.init(name, symbol);
        (address interoperableInterfaceModelAddress,) = interoperableInterfaceModel();
        _isMine[_dest[ETHEREUM_OBJECT_ID] = _clone(interoperableInterfaceModelAddress)] = true;
        IEthItemInteroperableInterface(_dest[ETHEREUM_OBJECT_ID]).init(ETHEREUM_OBJECT_ID, "EthereumItem", "IETH", _decimalsMap[ETHEREUM_OBJECT_ID] = _decimals);
        emit NewItem(ETHEREUM_OBJECT_ID, _dest[ETHEREUM_OBJECT_ID]);
        emit Mint(ETHEREUM_OBJECT_ID, _dest[ETHEREUM_OBJECT_ID], 0);
    }

    function source(uint256 objectId) public override virtual view returns (address erc20TokenAddress) {
        erc20TokenAddress = _sources[objectId];
    }

    function object(address erc20TokenAddress) public override virtual view returns (uint256 objectId) {
        objectId = _objects[erc20TokenAddress];
    }

    function mintETH() public virtual payable override returns (uint256 objectId, address wrapperAddress) {
        require(msg.value > 0, "Insufficient amount");
        _mintItems(objectId = ETHEREUM_OBJECT_ID, wrapperAddress = _dest[ETHEREUM_OBJECT_ID], msg.value);
    }

    function mint(address erc20TokenAddress, uint256 amount)
        public
        virtual
        override
        returns (uint256 objectId, address wrapperAddress)
    {
        wrapperAddress = _dest[objectId = _objects[erc20TokenAddress]];
        if (wrapperAddress == address(0)) {
            (address interoperableInterfaceModelAddress,) = interoperableInterfaceModel();
            objectId = uint256(wrapperAddress = _clone(interoperableInterfaceModelAddress));
            _isMine[_dest[objectId] = wrapperAddress] = true;
            _sources[objectId] = erc20TokenAddress;
            _objects[erc20TokenAddress] = objectId;
            (string memory name, string memory symbol, uint256 dec) = _getMintData(erc20TokenAddress);
            _decimalsMap[objectId] = dec;
            IEthItemInteroperableInterface(wrapperAddress).init(objectId, name, symbol, _decimals);
            emit NewItem(objectId, wrapperAddress);
        }
        uint256 balanceBefore = IERC20Data(erc20TokenAddress).balanceOf(address(this));
        _safeTransferFrom(IERC20Data(erc20TokenAddress), msg.sender, address(this), amount);
        _mintItems(objectId, wrapperAddress, IERC20Data(erc20TokenAddress).balanceOf(address(this)) - balanceBefore);
    }

    function _mintItems(uint256 objectId, address wrapperAddress, uint256 amount) internal virtual {
        uint256 itemAmountDecimals = amount * _itemDecimals(objectId);
        asInteroperable(objectId).mint(msg.sender, itemAmountDecimals);
        uint256 itemAmount = itemAmountDecimals - _sendMintFeeToDFO(msg.sender, objectId, itemAmountDecimals);
        if(itemAmount > 0) {
            emit Mint(objectId, wrapperAddress, itemAmount);
            emit TransferSingle(address(this), address(0), msg.sender, objectId, itemAmount);
        }
    }

    function burn(
        uint256 objectId,
        uint256 amount
    ) public virtual override(IEthItemMainInterface) {
        _burn(objectId, amount);
        emit TransferSingle(msg.sender, msg.sender, address(0), objectId, amount);
    }

    function burnBatch(
        uint256[] memory objectIds,
        uint256[] memory amounts
    ) public virtual override(IEthItemMainInterface) {
        for (uint256 i = 0; i < objectIds.length; i++) {
            _burn(objectIds[i], amounts[i]);
        }
        emit TransferBatch(msg.sender, msg.sender, address(0), objectIds, amounts);
    }

    function _burn(
        uint256 objectId,
        uint256 amount
    ) internal virtual override returns(uint256 burnt, uint256) {
        (burnt,) = super._burn(objectId, amount);
        uint256 value = burnt / _itemDecimals(objectId);
        if(objectId == ETHEREUM_OBJECT_ID) {
            msg.sender.transfer(value);
        } else {
            _safeTransfer(IERC20Data(source(objectId)), msg.sender, value);
        }
    }

    function _getMintData(address erc20TokenAddress)
        internal
        virtual
        view
        returns (
            string memory name,
            string memory symbol,
            uint256 dec
        )
    {
        IERC20Data erc20Token = IERC20Data(erc20TokenAddress);
        name = string(abi.encodePacked(_stringValue(erc20Token, "name()", "NAME()"), " item"));
        symbol = string(abi.encodePacked("i", _stringValue(erc20Token, "symbol()", "SYMBOL()")));
        dec = _safeDecimals(erc20Token);
        if(dec == 0) {
            dec = _decimals;
        }
    }

    function _itemDecimals(uint256 objectId) internal view returns(uint256) {
        return (10**(_decimals - _decimalsMap[objectId]));
    }

    function _safeTransfer(IERC20Data erc20Token, address to, uint256 value) internal {
        bytes memory returnData = _call(address(erc20Token), abi.encodeWithSelector(erc20Token.transfer.selector, to, value));
        require(returnData.length == 0 || abi.decode(returnData, (bool)), 'TRANSFER_FAILED');
    }

    function _safeTransferFrom(IERC20Data erc20Token, address from, address to, uint256 value) private {
        bytes memory returnData = _call(address(erc20Token), abi.encodeWithSelector(erc20Token.transferFrom.selector, from, to, value));
        require(returnData.length == 0 || abi.decode(returnData, (bool)), 'TRANSFERFROM_FAILED');
    }

    function _call(address location, bytes memory payload) private returns(bytes memory returnData) {
        assembly {
            let result := call(gas(), location, 0, add(payload, 0x20), mload(payload), 0, 0)
            let size := returndatasize()
            returnData := mload(0x40)
            mstore(returnData, size)
            let returnDataPayloadStart := add(returnData, 0x20)
            returndatacopy(returnDataPayloadStart, 0, size)
            mstore(0x40, add(returnDataPayloadStart, size))
            switch result case 0 {revert(returnDataPayloadStart, size)}
        }
    }

    function _safeDecimals(IERC20Data erc20Token) internal view returns(uint256 dec) {
        (, bytes memory data) = address(erc20Token).staticcall(abi.encodeWithSelector(erc20Token.decimals.selector));
        dec = data.length == 0 ? 0 : abi.decode(data, (uint256));
    }

    function _stringValue(IERC20Data erc20Token, string memory firstTry, string memory secondTry) internal view returns(string memory) {
        (bool success, bytes memory data) = address(erc20Token).staticcall{ gas: 20000 }(abi.encodeWithSignature(firstTry));
        if (!success) {
            (success, data) = address(erc20Token).staticcall{ gas: 20000 }(abi.encodeWithSignature(secondTry));
        }

        if (success && data.length >= 96) {
            (uint256 offset, uint256 len) = abi.decode(data, (uint256, uint256));
            if (offset == 0x20 && len > 0 && len <= 256) {
                return string(abi.decode(data, (bytes)));
            }
        }

        if (success && data.length == 32) {
            uint len = 0;
            while (len < data.length && data[len] >= 0x20 && data[len] <= 0x7E) {
                len++;
            }

            if (len > 0) {
                bytes memory result = new bytes(len);
                for (uint i = 0; i < len; i++) {
                    result[i] = data[i];
                }
                return string(result);
            }
        }

        return _toHex(abi.encodePacked(address(erc20Token)));
    }

    function _toHex(bytes memory data) private pure returns(string memory) {
        bytes memory str = new bytes(2 + data.length * 2);
        str[0] = "0";
        str[1] = "x";
        uint j = 2;
        for (uint i = 0; i < data.length; i++) {
            uint a = uint8(data[i]) >> 4;
            uint b = uint8(data[i]) & 0x0f;
            str[j++] = byte(uint8(a + 48 + (a/10)*39));
            str[j++] = byte(uint8(b + 48 + (b/10)*39));
        }

        return string(str);
    }

    function decimals(uint256 objectId)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return asInteroperable(objectId).decimals();
    }

    function toInteroperableInterfaceAmount(uint256, uint256 mainInterfaceAmount) public override virtual view returns (uint256 interoperableInterfaceAmount) {
        interoperableInterfaceAmount = mainInterfaceAmount;
    }

    function toMainInterfaceAmount(uint256, uint256 interoperableInterfaceAmount) public override(IEthItemMainInterface, EthItemModelBase) virtual view returns (uint256 mainInterfaceAmount) {
        mainInterfaceAmount = interoperableInterfaceAmount;
    }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"objectId","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"objectId","type":"uint256"},{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"}],"name":"NewItem","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"ETHEREUM_OBJECT_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"objectId","type":"uint256"}],"name":"asInteroperable","outputs":[{"internalType":"contract IEthItemInteroperableInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"objectId","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"objectIds","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"balances","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"objectId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"objectIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"objectId","type":"uint256"}],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"objectId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"emitTransferSingleEvent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"interoperableInterfaceModel","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mainInterfaceVersion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"erc20TokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256","name":"objectId","type":"uint256"},{"internalType":"address","name":"wrapperAddress","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"string","name":"","type":"string"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintETH","outputs":[{"internalType":"uint256","name":"objectId","type":"uint256"},{"internalType":"address","name":"wrapperAddress","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"modelVersion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"objectId","type":"uint256"}],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"erc20TokenAddress","type":"address"}],"name":"object","outputs":[{"internalType":"uint256","name":"objectId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"objectIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"objectId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"objectId","type":"uint256"}],"name":"source","outputs":[{"internalType":"address","name":"erc20TokenAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"objectId","type":"uint256"}],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"mainInterfaceAmount","type":"uint256"}],"name":"toInteroperableInterfaceAmount","outputs":[{"internalType":"uint256","name":"interoperableInterfaceAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"interoperableInterfaceAmount","type":"uint256"}],"name":"toMainInterfaceAmount","outputs":[{"internalType":"uint256","name":"mainInterfaceAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"objectId","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"objectId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

Deployed Bytecode

0x6080604052600436106101e15760003560e01c80634e41a1fb11610102578063bd85b03911610095578063e82b15f411610064578063e82b15f414610db5578063e985e9c514610e04578063edb3ba0b146106b6578063f242432a14610e3f576101e1565b8063bd85b03914610d59578063be745fff14610d83578063c45a015514610d98578063ce1570dc14610dad576101e1565b806395d89b41116100d157806395d89b4114610b93578063a22cb46514610ba8578063b2b45df514610be3578063b390c0ab14610d29576101e1565b80634e41a1fb1461084b5780637029144c1461087557806377097fc8146109ab57806383ca4b6f14610a63576101e1565b80632d7f1d2b1161017a57806340dc7bff1161014957806340dc7bff14610686578063434d7d92146106b657806345a0ef80146106865780634e1273f4146106cb576101e1565b80632d7f1d2b146103fa5780632eb2c2d6146104325780633f47e6621461060257806340c10f191461062c576101e1565b806306fdde03116101b657806306fdde031461035e5780630c0f6b71146103735780630e89341c1461039d5780631bf8ee70146103c7576101e1565b8062ad800c146101e6578062fdd58e1461028557806301ffc9a7146102d0578063023b04b214610318575b600080fd5b3480156101f257600080fd5b506102106004803603602081101561020957600080fd5b5035610f15565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561024a578181015183820152602001610232565b50505050905090810190601f1680156102775780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561029157600080fd5b506102be600480360360408110156102a857600080fd5b506001600160a01b03813516906020013561104a565b60408051918252519081900360200190f35b3480156102dc57600080fd5b50610304600480360360208110156102f357600080fd5b50356001600160e01b0319166110dd565b604080519115158252519081900360200190f35b34801561032457600080fd5b506103426004803603602081101561033b57600080fd5b50356110fc565b604080516001600160a01b039092168252519081900360200190f35b34801561036a57600080fd5b50610210611117565b34801561037f57600080fd5b506103426004803603602081101561039657600080fd5b50356111ad565b3480156103a957600080fd5b50610210600480360360208110156103c057600080fd5b50356111c8565b3480156103d357600080fd5b506102be600480360360208110156103ea57600080fd5b50356001600160a01b0316611269565b34801561040657600080fd5b5061040f611284565b604080516001600160a01b03909316835260208301919091528051918290030190f35b34801561043e57600080fd5b50610600600480360360a081101561045557600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561048857600080fd5b82018360208201111561049a57600080fd5b803590602001918460208302840111600160201b831117156104bb57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561050a57600080fd5b82018360208201111561051c57600080fd5b803590602001918460208302840111600160201b8311171561053d57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561058c57600080fd5b82018360208201111561059e57600080fd5b803590602001918460018302840111600160201b831117156105bf57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061129b945050505050565b005b34801561060e57600080fd5b506102be6004803603602081101561062557600080fd5b5035611490565b34801561063857600080fd5b506106656004803603604081101561064f57600080fd5b506001600160a01b038135169060200135611505565b604080519283526001600160a01b0390911660208301528051918290030190f35b34801561069257600080fd5b506102be600480360360408110156106a957600080fd5b5080359060200135611869565b3480156106c257600080fd5b506102be61186e565b3480156106d757600080fd5b506107fb600480360360408110156106ee57600080fd5b810190602081018135600160201b81111561070857600080fd5b82018360208201111561071a57600080fd5b803590602001918460208302840111600160201b8311171561073b57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561078a57600080fd5b82018360208201111561079c57600080fd5b803590602001918460208302840111600160201b831117156107bd57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611873945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561083757818101518382015260200161081f565b505050509050019250505060405180910390f35b34801561085757600080fd5b506102106004803603602081101561086e57600080fd5b503561191c565b34801561088157600080fd5b506106006004803603604081101561089857600080fd5b810190602081018135600160201b8111156108b257600080fd5b8201836020820111156108c457600080fd5b803590602001918460018302840111600160201b831117156108e557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561093757600080fd5b82018360208201111561094957600080fd5b803590602001918460018302840111600160201b8311171561096a57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061195f945050505050565b3480156109b757600080fd5b50610665600480360360408110156109ce57600080fd5b81359190810190604081016020820135600160201b8111156109ef57600080fd5b820183602082011115610a0157600080fd5b803590602001918460018302840111600160201b83111715610a2257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611c41945050505050565b348015610a6f57600080fd5b5061060060048036036040811015610a8657600080fd5b810190602081018135600160201b811115610aa057600080fd5b820183602082011115610ab257600080fd5b803590602001918460208302840111600160201b83111715610ad357600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610b2257600080fd5b820183602082011115610b3457600080fd5b803590602001918460208302840111600160201b83111715610b5557600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611c7b945050505050565b348015610b9f57600080fd5b50610210611da0565b348015610bb457600080fd5b5061060060048036036040811015610bcb57600080fd5b506001600160a01b0381351690602001351515611dfe565b348015610bef57600080fd5b5061060060048036036060811015610c0657600080fd5b6001600160a01b038235169190810190604081016020820135600160201b811115610c3057600080fd5b820183602082011115610c4257600080fd5b803590602001918460018302840111600160201b83111715610c6357600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b811115610cb557600080fd5b820183602082011115610cc757600080fd5b803590602001918460018302840111600160201b83111715610ce857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611ec9945050505050565b348015610d3557600080fd5b5061060060048036036040811015610d4c57600080fd5b5080359060200135611f00565b348015610d6557600080fd5b506102be60048036036020811015610d7c57600080fd5b5035611f40565b348015610d8f57600080fd5b506102be611f8d565b348015610da457600080fd5b50610342611fc2565b610665611fd1565b348015610dc157600080fd5b50610600600480360360a0811015610dd857600080fd5b506001600160a01b03813581169160208101358216916040820135169060608101359060800135612095565b348015610e1057600080fd5b5061030460048036036040811015610e2757600080fd5b506001600160a01b0381358116916020013516612164565b348015610e4b57600080fd5b50610600600480360360a0811015610e6257600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b811115610ea157600080fd5b820183602082011115610eb357600080fd5b803590602001918460018302840111600160201b83111715610ed457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612192945050505050565b6060610f20826111ad565b6001600160a01b03166306fdde036040518163ffffffff1660e01b815260040160006040518083038186803b158015610f5857600080fd5b505afa158015610f6c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610f9557600080fd5b8101908080516040519392919084600160201b821115610fb457600080fd5b908301906020820185811115610fc957600080fd5b8251600160201b811182820188101715610fe257600080fd5b82525081516020918201929091019080838360005b8381101561100f578181015183820152602001610ff7565b50505050905090810190601f16801561103c5780820380516001836020036101000a031916815260200191505b506040525050509050919050565b60006110d682611059846111ad565b6001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156110a557600080fd5b505afa1580156110b9573d6000803e3d6000fd5b505050506040513d60208110156110cf57600080fd5b5051611869565b9392505050565b6001600160e01b03191660009081526020819052604090205460ff1690565b6000908152600b60205260409020546001600160a01b031690565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152606093909290918301828280156111a25780601f10611177576101008083540402835291602001916111a2565b820191906000526020600020905b81548152906001019060200180831161118557829003601f168201915b505050505090505b90565b6000908152600460205260409020546001600160a01b031690565b60008181526003602090815260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084526060939283018282801561125d5780601f106112325761010080835404028352916020019161125d565b820191906000526020600020905b81548152906001019060200180831161124057829003601f168201915b50505050509050919050565b6001600160a01b03166000908152600d602052604090205490565b6007546008546001600160a01b03909116905b9091565b6001600160a01b0384166112e05760405162461bcd60e51b8152600401808060200182810382526025815260200180613ea46025913960400191505060405180910390fd5b6112e86122a8565b6001600160a01b0316856001600160a01b0316148061131357506113138561130e6122a8565b612164565b61134e5760405162461bcd60e51b8152600401808060200182810382526029815260200180613e3a6029913960400191505060405180910390fd5b60005b83518110156113945761138c868686848151811061136b57fe5b602002602001015186858151811061137f57fe5b60200260200101516122ac565b600101611351565b50600061139f6122a8565b9050846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561142657818101518382015260200161140e565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561146557818101518382015260200161144d565b5050505090500194505050505060405180910390a461148881878787878761235f565b505050505050565b600061149b826111ad565b6001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156114d357600080fd5b505afa1580156114e7573d6000803e3d6000fd5b505050506040513d60208110156114fd57600080fd5b505192915050565b6001600160a01b038083166000908152600d602090815260408083205480845260049092529091205490911680611753576000611540611284565b50905061154c81612613565b6001600160a01b03808216600081815260046020908152604080832080546001600160a01b0319908116861790915560058352818420805460ff19166001179055600b83528184208054968d169690911686179055938252600d9052918220819055945090925060609081906115c188612655565b92509250925080600c600088815260200190815260200160002081905550846001600160a01b031663620b29cd8785856009546040518563ffffffff1660e01b8152600401808581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b83811015611650578181015183820152602001611638565b50505050905090810190601f16801561167d5780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838360005b838110156116b0578181015183820152602001611698565b50505050905090810190601f1680156116dd5780820380516001836020036101000a031916815260200191505b509650505050505050600060405180830381600087803b15801561170057600080fd5b505af1158015611714573d6000803e3d6000fd5b50506040516001600160a01b03881692508891507f0c4ad8244c49e226fa47310564e3a7d0bb97b9808742e9159b5fd2e62033f88490600090a3505050505b6000846001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156117a257600080fd5b505afa1580156117b6573d6000803e3d6000fd5b505050506040513d60208110156117cc57600080fd5b505190506117dc853330876127fa565b611861838383886001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561182f57600080fd5b505afa158015611843573d6000803e3d6000fd5b505050506040513d602081101561185957600080fd5b5051036128c3565b509250929050565b919050565b600190565b6060825167ffffffffffffffff8111801561188d57600080fd5b506040519080825280602002602001820160405280156118b7578160200160208202803683370190505b50905060005b8351811015611915576118f68482815181106118d557fe5b60200260200101518483815181106118e957fe5b602002602001015161104a565b82828151811061190257fe5b60209081029190910101526001016118bd565b5092915050565b6060611927826111ad565b6001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b158015610f5857600080fd5b61196982826129df565b6000611973611284565b50905060016005600061198584612613565b6040805180820182526016808252600080516020613e1a8339815191526020928301819052600080516020613e8483398151915260008181526004808652600080516020613ec983398151915280546001600160a01b0319166001600160a01b03998a1690811782558a528987019a909a529786018120805460ff19169a15159a909a1790995584518086018652838152840182905296548451808601865283815284018290526009548551808701875293845292840191909152868852600c928390527f9d609159236712347d921d6681b24b7d759f2c210bac1e1536d113abc3d5337c829055835163620b29cd60e01b81528087019790975260648701919091526080602487015260848601919091526b457468657265756d4974656d60a01b60a486015260c0604486015260c4850193909352630928aa8960e31b60e48501525191169263620b29cd92610104808201939182900301818387803b158015611aef57600080fd5b505af1158015611b03573d6000803e3d6000fd5b50506040805180820182526016808252600080516020613e1a8339815191526020928301819052600080516020613e84833981519152600081815260048552600080516020613ec98339815191525486518088018852948552939094019190915292516001600160a01b0390911694509192507f0c4ad8244c49e226fa47310564e3a7d0bb97b9808742e9159b5fd2e62033f88491a36040805180820182526016808252600080516020613e1a83398151915260209283018190528351808501855291825290820152600080516020613e84833981519152600081815260048352600080516020613ec98339815191525484519283526001600160a01b0316928201929092528083019190915290517f4e3883c75cc9c752bb1db2e406a822e4a75067ae77ad9a0a4d179f2709b9e1f69181900360600190a1505050565b60008060405162461bcd60e51b8152600401808060200182810382526021815260200180613e636021913960400191505060405180910390fd5b60005b8251811015611cc157611cb7838281518110611c9657fe5b6020026020010151838381518110611caa57fe5b6020026020010151612abc565b5050600101611c7e565b5060006001600160a01b0316336001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8585604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015611d48578181015183820152602001611d30565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015611d87578181015183820152602001611d6f565b5050505090500194505050505060405180910390a45050565b60028054604080516020601f60001961010060018716150201909416859004938401819004810282018101909252828152606093909290918301828280156111a25780601f10611177576101008083540402835291602001916111a2565b6000611e086122a8565b9050826001600160a01b0316816001600160a01b03161415611e5b5760405162461bcd60e51b8152600401808060200182810382526029815260200180613ee96029913960400191505060405180910390fd5b6001600160a01b03818116600081815260066020908152604080832094881680845294825291829020805460ff1916871515908117909155825190815291517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319281900390910190a3505050565b60405162461bcd60e51b8152600401808060200182810382526021815260200180613e636021913960400191505060405180910390fd5b611f0a8282612abc565b50506040805183815260208101839052815160009233928392600080516020613dfa833981519152929181900390910190a45050565b6000611f8782611f4f846111ad565b6001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156110a557600080fd5b92915050565b6040805180820190915260168152600080516020613e1a833981519152602090910152600080516020613e8483398151915281565b600a546001600160a01b031690565b6000806000341161201f576040805162461bcd60e51b8152602060048201526013602482015272125b9cdd59999a58da595b9d08185b5bdd5b9d606a1b604482015290519081900360640190fd5b50506040805180820182526016808252600080516020613e1a8339815191526020928301819052835180850190945290835291810191909152600080516020613e8483398151915260008190526004909152600080516020613ec9833981519152546001600160a01b03166112978282346128c3565b6000828152600460205260409020546001600160a01b031633146120f7576040805162461bcd60e51b8152602060048201526014602482015273556e617574686f72697a656420416374696f6e2160601b604482015290519081900360640190fd5b60006121038383611869565b905080612110575061215d565b836001600160a01b0316856001600160a01b0316876001600160a01b0316600080516020613dfa8339815191528685604051808381526020018281526020019250505060405180910390a4505b5050505050565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b6001600160a01b0384166121d75760405162461bcd60e51b8152600401808060200182810382526025815260200180613ea46025913960400191505060405180910390fd5b60006121e16122a8565b9050806001600160a01b0316866001600160a01b0316148061220857506122088682612164565b6122435760405162461bcd60e51b8152600401808060200182810382526029815260200180613e3a6029913960400191505060405180910390fd5b61224f868686866122ac565b846001600160a01b0316866001600160a01b0316826001600160a01b0316600080516020613dfa8339815191528787604051808381526020018281526020019250505060405180910390a4611488818787878787612b61565b3390565b60006122b9858484612cd2565b9150506122c5836111ad565b6001600160a01b03166323b872dd8686846040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050602060405180830381600087803b15801561232c57600080fd5b505af1158015612340573d6000803e3d6000fd5b505050506040513d602081101561235657600080fd5b50505050505050565b612371846001600160a01b0316612d8f565b1561148857836001600160a01b031663bc197c8187878686866040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b838110156123ff5781810151838201526020016123e7565b50505050905001848103835286818151815260200191508051906020019060200280838360005b8381101561243e578181015183820152602001612426565b50505050905001848103825285818151815260200191508051906020019080838360005b8381101561247a578181015183820152602001612462565b50505050905090810190601f1680156124a75780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b1580156124cc57600080fd5b505af19250505080156124f157506040513d60208110156124ec57600080fd5b505160015b6125c4576124fd613cd0565b80612508575061258d565b8060405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561255257818101518382015260200161253a565b50505050905090810190601f16801561257f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b60405162461bcd60e51b8152600401808060200182810382526034815260200180613d766034913960400191505060405180910390fd5b6001600160e01b0319811663bc197c8160e01b146123565760405162461bcd60e51b8152600401808060200182810382526028815260200180613daa6028913960400191505060405180910390fd5b60006901000000000000000000820268803b80938091923cf36258807360e81b01176000526020600080f09050803b801561264d5761264f565bfe5b50919050565b6060806000808490506126a581604051806040016040528060068152602001656e616d65282960d01b815250604051806040016040528060068152602001654e414d45282960d01b815250612d95565b6040516020018082805190602001908083835b602083106126d75780518252601f1990920191602091820191016126b8565b6001836020036101000a0380198251168184511680821785525050505050509050018064206974656d60d81b8152506005019150506040516020818303038152906040529350612768816040518060400160405280600881526020016773796d626f6c282960c01b8152506040518060400160405280600881526020016753594d424f4c282960c01b815250612d95565b6040516020018080606960f81b81525060010182805190602001908083835b602083106127a65780518252601f199092019160209182019101612787565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405292506127e581613297565b9150816127f25760095491505b509193909250565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052606090612857908690613394565b905080516000148061287c575080806020019051602081101561287957600080fd5b50515b61215d576040805162461bcd60e51b81526020600482015260136024820152721514905394d19154919493d357d19052531151606a1b604482015290519081900360640190fd5b60006128ce846133d6565b820290506128db846111ad565b6001600160a01b03166340c10f1933836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561293157600080fd5b505af1158015612945573d6000803e3d6000fd5b5050505060006129563386846133ef565b82039050801561215d57604080518681526001600160a01b038616602082015280820183905290517f4e3883c75cc9c752bb1db2e406a822e4a75067ae77ad9a0a4d179f2709b9e1f69181900360600190a16040805186815260208101839052815133926000923092600080516020613dfa833981519152929181900390910190a45050505050565b600a546001600160a01b031615612a34576040805162461bcd60e51b8152602060048201526014602482015273496e697420616c72656164792063616c6c65642160601b604482015290519081900360640190fd5b600a80546001600160a01b031916339081179091556040805163a826080960e01b815281516000939263a82608099260048082019391829003018186803b158015612a7e57600080fd5b505afa158015612a92573d6000803e3d6000fd5b505050506040513d6040811015612aa857600080fd5b50519050612ab7818484613534565b505050565b600080612ac9848461383c565b5091506000612ad7856133d6565b8381612adf57fe5b6040805180820190915260168152600080516020613e1a833981519152602090910152049050600080516020613e84833981519152851415612b4e57604051339082156108fc029083906000818181858888f19350505050158015612b48573d6000803e3d6000fd5b50611861565b611861612b5a866110fc565b338361392e565b612b73846001600160a01b0316612d8f565b1561148857836001600160a01b031663f23a6e6187878686866040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612c02578181015183820152602001612bea565b50505050905090810190601f168015612c2f5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b158015612c5257600080fd5b505af1925050508015612c7757506040513d6020811015612c7257600080fd5b505160015b612c83576124fd613cd0565b6001600160e01b0319811663f23a6e6160e01b146123565760405162461bcd60e51b8152600401808060200182810382526028815260200180613daa6028913960400191505060405180910390fd5b6000806000612ce18585611869565b90506000612cee866111ad565b6001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612d3a57600080fd5b505afa158015612d4e573d6000803e3d6000fd5b505050506040513d6020811015612d6457600080fd5b50519050612d72878761104a565b9350838514612d815781612d83565b805b92505050935093915050565b3b151590565b606060006060856001600160a01b0316614e2086604051602401604051602081830303815290604052906040518082805190602001908083835b60208310612dee5780518252601f199092019160209182019101612dcf565b51815160001960209485036101000a01908116901991909116179052604080519490920184900390932092860180516001600160e01b03166001600160e01b031990941693909317835251855190945084935090508083835b60208310612e665780518252601f199092019160209182019101612e47565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114612ec7576040519150601f19603f3d011682016040523d82523d6000602084013e612ecc565b606091505b50915091508161300a576040805160048152602481019182905285516001600160a01b03891692614e209291889190819060208401908083835b60208310612f255780518252601f199092019160209182019101612f06565b51815160001960209485036101000a01908116901991909116179052604080519490920184900390932092860180516001600160e01b03166001600160e01b031990941693909317835251855190945084935090508083835b60208310612f9d5780518252601f199092019160209182019101612f7e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114612ffe576040519150601f19603f3d011682016040523d82523d6000602084013e613003565b606091505b5090925090505b81801561301957506060815110155b156131365760008082806020019051604081101561303657600080fd5b5080516020918201519093509150821480156130525750600081115b801561306057506101008111155b156131335782806020019051602081101561307a57600080fd5b8101908080516040519392919084600160201b82111561309957600080fd5b9083019060208201858111156130ae57600080fd5b8251600160201b8111828201881017156130c757600080fd5b82525081516020918201929091019080838360005b838110156130f45781810151838201526020016130dc565b50505050905090810190601f1680156131215780820380516001836020036101000a031916815260200191505b506040525050509450505050506110d6565b50505b818015613144575080516020145b156132595760005b81518110801561317a5750602060f81b82828151811061316857fe5b01602001516001600160f81b03191610155b80156131a45750607e60f81b82828151811061319257fe5b01602001516001600160f81b03191611155b156131b15760010161314c565b80156132575760608167ffffffffffffffff811180156131d057600080fd5b506040519080825280601f01601f1916602001820160405280156131fb576020820181803683370190505b50905060005b8281101561324b5783818151811061321557fe5b602001015160f81c60f81b82828151811061322c57fe5b60200101906001600160f81b031916908160001a905350600101613201565b5093506110d692505050565b505b61328d8660405160200180826001600160a01b031660601b81526014019150506040516020818303038152906040526139f1565b9695505050505050565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b178152915181516000936060936001600160a01b038716939092909182918083835b602083106132fd5780518252601f1990920191602091820191016132de565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d806000811461335d576040519150601f19603f3d011682016040523d82523d6000602084013e613362565b606091505b50915050805160001461338b5780806020019051602081101561338457600080fd5b50516110d6565b60009392505050565b60606000808351602085016000875af13d604051925080835260208301816000823e8082016040528280156133c8576133cc565b8282fd5b5050505092915050565b6000908152600c602052604090205460095403600a0a90565b600a5460408051631702579560e21b815260048101849052815160009384936001600160a01b0390911692635c095e549260248083019392829003018186803b15801561343b57600080fd5b505afa15801561344f573d6000803e3d6000fd5b505050506040513d604081101561346557600080fd5b5080516020909101519092509050811580159061348a57506001600160a01b03811615155b1561352c57613498846111ad565b6001600160a01b03166323b872dd8683856040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050602060405180830381600087803b1580156134ff57600080fd5b505af1158015613513573d6000803e3d6000fd5b505050506040513d602081101561352957600080fd5b50505b509392505050565b6007546001600160a01b031615613589576040805162461bcd60e51b8152602060048201526014602482015273496e697420616c72656164792063616c6c65642160601b604482015290519081900360640190fd5b6001600160a01b0383166135ce5760405162461bcd60e51b8152600401808060200182810382526028815260200180613dd26028913960400191505060405180910390fd5b600780546001600160a01b0319166001600160a01b0385169081179091556040805163440eb4bf60e11b8152905163881d697e91600480820192602092909190829003018186803b15801561362257600080fd5b505afa158015613636573d6000803e3d6000fd5b505050506040513d602081101561364c57600080fd5b5051600855815160208301207fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47014156136c0576040805162461bcd60e51b81526020600482015260116024820152704e616d65206973206d616e6461746f727960781b604482015290519081900360640190fd5b805160208201207fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4701415613731576040805162461bcd60e51b815260206004820152601360248201527253796d626f6c206973206d616e6461746f727960681b604482015290519081900360640190fd5b8151613744906001906020850190613c37565b508051613758906002906020840190613c37565b50601260095561376e631759616b60e11b613b67565b61377e636cdb3d1360e11b613b67565b61378d627eeac760e11b613b67565b61379d6313849cfd60e21b613b67565b6137ad63a22cb46560e01b613b67565b6137bd63e985e9c560e01b613b67565b6137cd637921219560e11b613b67565b6137dd6303a24d0760e21b613b67565b6137ed63bd85b03960e01b613b67565b6137fc622b600360e21b613b67565b61380c634e41a1fb60e01b613b67565b61381c631fa3f33160e11b613b67565b61382c6306fdde0360e01b613b67565b612ab76395d89b4160e01b613b67565b60008060008061384d338787612cd2565b915091508482101561389c576040805162461bcd60e51b8152602060048201526013602482015272125b9cdd59999a58da595b9d08105b5bdd5b9d606a1b604482015290519081900360640190fd5b6138a7338783613beb565b92506138b2866111ad565b6001600160a01b0316639dc29fac338584039650866040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561390d57600080fd5b505af1158015613921573d6000803e3d6000fd5b5050505050509250929050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052606090613983908590613394565b90508051600014806139a857508080602001905160208110156139a557600080fd5b50515b6139eb576040805162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b604482015290519081900360640190fd5b50505050565b606080825160020260020167ffffffffffffffff81118015613a1257600080fd5b506040519080825280601f01601f191660200182016040528015613a3d576020820181803683370190505b509050600360fc1b81600081518110613a5257fe5b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110613a7b57fe5b60200101906001600160f81b031916908160001a905350600260005b8451811015613b5e5760006004868381518110613ab057fe5b602001015160f81c60f81b60f81c60ff16901c60ff1690506000868381518110613ad657fe5b60209101015160f81c600f169050600a8204602702826030010160f81b858580600101965081518110613b0557fe5b60200101906001600160f81b031916908160001a905350600a8104602702816030010160f81b858580600101965081518110613b3d57fe5b60200101906001600160f81b031916908160001a9053505050600101613a97565b50909392505050565b6001600160e01b03198082161415613bc6576040805162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b600a5460408051636ad8826960e01b815260048101849052815160009384936001600160a01b0390911692636ad882699260248083019392829003018186803b15801561343b57600080fd5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613c7857805160ff1916838001178555613ca5565b82800160010185558215613ca5579182015b82811115613ca5578251825591602001919060010190613c8a565b50613cb1929150613cb5565b5090565b5b80821115613cb15760008155600101613cb6565b60e01c90565b600060443d1015613ce0576111aa565b600481823e6308c379a0613cf48251613cca565b14613cfe576111aa565b6040513d600319016004823e80513d67ffffffffffffffff8160248401118184111715613d2e57505050506111aa565b82840192508251915080821115613d4857505050506111aa565b503d83016020828401011115613d60575050506111aa565b601f01601f191681016020016040529150509056fe455243313135353a207472616e7366657220746f206e6f6e2045524331313535526563656976657220696d706c656d656e746572455243313135353a204552433131353552656365697665722072656a656374656420746f6b656e734d6f64656c2073686f756c6420626520612076616c696420657468657265756d2061646472657373c3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6254484520455448455245554d204f424a45435420495400000000000000000000455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656443616e6e6f74206469726563746c792063616c6c2074686973206d6574686f642e186184b38c30620314f957b261f907a96e7bd12c377a91dcf1ef57fdea9aad37455243313135353a207472616e7366657220746f20746865207a65726f2061646472657373c594644bd0e33341c6226d9957a44468f4df101b4bb608726d1c02b52dc370e5455243313135353a2073657474696e6720617070726f76616c2073746174757320666f722073656c66a26469706673582212200438b60d2288c3693062dfbb98f649056cd62a2a73ab9d5cf660b41be0da936364736f6c634300060c0033

Deployed Bytecode Sourcemap

67628:9283:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41474:193;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41474:193:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42871:254;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;42871:254:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;32363:142;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32363:142:0;-1:-1:-1;;;;;;32363:142:0;;:::i;:::-;;;;;;;;;;;;;;;;;;68646:156;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68646:156:0;;:::i;:::-;;;;-1:-1:-1;;;;;68646:156:0;;;;;;;;;;;;;;41675:100;;;;;;;;;;;;;:::i;40688:236::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40688:236:0;;:::i;42619:181::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42619:181:0;;:::i;68810:156::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68810:156:0;-1:-1:-1;;;;;68810:156:0;;:::i;40392:188::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;40392:188:0;;;;;;;;;;;;;;;;;;;;;64258:921;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;64258:921:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64258:921:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64258:921:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64258:921:0;;;;;;;;-1:-1:-1;64258:921:0;;-1:-1:-1;;;;;64258:921:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64258:921:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64258:921:0;;;;;;;;-1:-1:-1;64258:921:0;;-1:-1:-1;;;;;64258:921:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64258:921:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64258:921:0;;-1:-1:-1;64258:921:0;;-1:-1:-1;;;;;64258:921:0:i;:::-;;76219:195;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;76219:195:0;;:::i;69255:1268::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;69255:1268:0;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;69255:1268:0;;;;;;;;;;;;;;;;76422:223;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;76422:223:0;;;;;;;:::i;37983:105::-;;;;;;;;;;;;;:::i;43196:362::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43196:362:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43196:362:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43196:362:0;;;;;;;;-1:-1:-1;43196:362:0;;-1:-1:-1;;;;;43196:362:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43196:362:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43196:362:0;;-1:-1:-1;43196:362:0;;-1:-1:-1;;;;;43196:362:0:i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41929:197;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41929:197:0;;:::i;67965:673::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;67965:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;67965:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;67965:673:0;;;;;;;;-1:-1:-1;67965:673:0;;-1:-1:-1;;;;;67965:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;67965:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;67965:673:0;;-1:-1:-1;67965:673:0;;-1:-1:-1;;;;;67965:673:0:i;63145:237::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63145:237:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63145:237:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63145:237:0;;-1:-1:-1;63145:237:0;;-1:-1:-1;;;;;63145:237:0:i;71351:353::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;71351:353:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;71351:353:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71351:353:0;;;;;;;;-1:-1:-1;71351:353:0;;-1:-1:-1;;;;;71351:353:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;71351:353:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71351:353:0;;-1:-1:-1;71351:353:0;;-1:-1:-1;;;;;71351:353:0:i;42134:104::-;;;;;;;;;;;;;:::i;43629:402::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;43629:402:0;;;;;;;;;;:::i;61407:218::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;61407:218:0;;;;;;;;;;;;;;;-1:-1:-1;;;61407:218:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61407:218:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61407:218:0;;;;;;;;-1:-1:-1;61407:218:0;;-1:-1:-1;;;;;61407:218:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61407:218:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61407:218:0;;-1:-1:-1;61407:218:0;;-1:-1:-1;;;;;61407:218:0:i;71097:246::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71097:246:0;;;;;;;:::i;41090:234::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41090:234:0;;:::i;67698:96::-;;;;;;;;;;;;;:::i;62158:99::-;;;;;;;;;;;;;:::i;68974:273::-;;;:::i;46302:416::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;46302:416:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;44102:218::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;44102:218:0;;;;;;;;;;:::i;63390:797::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;63390:797:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63390:797:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63390:797:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63390:797:0;;-1:-1:-1;63390:797:0;;-1:-1:-1;;;;;63390:797:0:i;41474:193::-;41589:13;41627:25;41643:8;41627:15;:25::i;:::-;-1:-1:-1;;;;;41627:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;41627:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;41627:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;41627:32:0;;;;;;-1:-1:-1;41627:32:0;;;;;;;;;;-1:-1:-1;41627:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41620:39;;41474:193;;;:::o;42871:254::-;43008:7;43040:77;43062:8;43072:25;43088:8;43072:15;:25::i;:::-;-1:-1:-1;;;;;43072:35:0;;43108:7;43072:44;;;;;;;;;;;;;-1:-1:-1;;;;;43072:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43072:44:0;43040:21;:77::i;:::-;43033:84;42871:254;-1:-1:-1;;;42871:254:0:o;32363:142::-;-1:-1:-1;;;;;;32464:33:0;32440:4;32464:33;;;;;;;;;;;;;;32363:142::o;68646:156::-;68718:25;68776:18;;;:8;:18;;;;;;-1:-1:-1;;;;;68776:18:0;;68646:156::o;41675:100::-;41762:5;41755:12;;;;;;;;-1:-1:-1;;41755:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41729:13;;41755:12;;41762:5;;41755:12;;41762:5;41755:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41675:100;;:::o;40688:236::-;40814:30;40900:15;;;:5;:15;;;;;;-1:-1:-1;;;;;40900:15:0;;40688:236::o;42619:181::-;42771:21;;;;:11;:21;;;;;;;;;42764:28;;;;;;-1:-1:-1;;42764:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42733:13;;42764:28;;;42771:21;42764:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42619:181;;;:::o;68810:156::-;-1:-1:-1;;;;;68931:27:0;68891:16;68931:27;;;:8;:27;;;;;;;68810:156::o;40392:188::-;40506:28;;40536:35;;-1:-1:-1;;;;;40506:28:0;;;;40392:188;;;:::o;64258:921::-;-1:-1:-1;;;;;64515:16:0;;64507:66;;;;-1:-1:-1;;;64507:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64614:12;:10;:12::i;:::-;-1:-1:-1;;;;;64606:20:0;:4;-1:-1:-1;;;;;64606:20:0;;:60;;;;64630:36;64647:4;64653:12;:10;:12::i;:::-;64630:16;:36::i;:::-;64584:151;;;;-1:-1:-1;;;64584:151:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64753:9;64748:126;64772:9;:16;64768:1;:20;64748:126;;;64810:52;64827:4;64833:2;64837:9;64847:1;64837:12;;;;;;;;;;;;;;64851:7;64859:1;64851:10;;;;;;;;;;;;;;64810:16;:52::i;:::-;64790:3;;64748:126;;;;64886:16;64905:12;:10;:12::i;:::-;64886:31;;64965:2;-1:-1:-1;;;;;64935:53:0;64959:4;-1:-1:-1;;;;;64935:53:0;64949:8;-1:-1:-1;;;;;64935:53:0;;64969:9;64980:7;64935:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65001:170;65051:8;65074:4;65093:2;65110:9;65134:7;65156:4;65001:35;:170::i;:::-;64258:921;;;;;;:::o;76219:195::-;76338:7;76370:25;76386:8;76370:15;:25::i;:::-;-1:-1:-1;;;;;76370:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;76370:36:0;;76219:195;-1:-1:-1;;76219:195:0:o;69255:1268::-;-1:-1:-1;;;;;69473:27:0;;;69381:16;69473:27;;;:8;:27;;;;;;;;;69456:45;;;:5;:45;;;;;;;69473:27;;69456:45;69516:28;69512:702;;69562:42;69609:29;:27;:29::i;:::-;69561:77;;;69689:42;69696:34;69689:6;:42::i;:::-;-1:-1:-1;;;;;69664:68:0;;;69747:41;69755:15;;;:5;:15;;;;;;;;:32;;-1:-1:-1;;;;;;69755:32:0;;;;;;;;69747:7;:41;;;;;:48;;-1:-1:-1;;69747:48:0;69791:4;69747:48;;;69810:8;:18;;;;;:38;;;;;;;;;;;;;69863:27;;;:8;:27;;;;;:38;;;69664:68;-1:-1:-1;69672:59:0;;-1:-1:-1;69917:18:0;;;;69974:31;69831:17;69974:12;:31::i;:::-;69916:89;;;;;;70045:3;70020:12;:22;70033:8;70020:22;;;;;;;;;;;:28;;;;70094:14;-1:-1:-1;;;;;70063:51:0;;70115:8;70125:4;70131:6;70139:9;;70063:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;70063:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;70169:33:0;;-1:-1:-1;;;;;70169:33:0;;;-1:-1:-1;70177:8:0;;-1:-1:-1;70169:33:0;;;;;69512:702;;;;;70224:21;70259:17;-1:-1:-1;;;;;70248:39:0;;70296:4;70248:54;;;;;;;;;;;;;-1:-1:-1;;;;;70248:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;70248:54:0;;-1:-1:-1;70313:83:0;70342:17;70362:10;70382:4;70389:6;70313:17;:83::i;:::-;70407:108;70418:8;70428:14;70501:13;70455:17;-1:-1:-1;;;;;70444:39:0;;70492:4;70444:54;;;;;;;;;;;;;-1:-1:-1;;;;;70444:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;70444:54:0;:70;70407:10;:108::i;:::-;69255:1268;;;;;;:::o;76422:223::-;76618:19;76422:223;-1:-1:-1;76422:223:0:o;37983:105::-;38079:1;37983:105;:::o;43196:362::-;43338:25;43401:8;:15;43387:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43387:30:0;;43376:41;;43433:9;43428:123;43452:8;:15;43448:1;:19;43428:123;;;43503:36;43513:8;43522:1;43513:11;;;;;;;;;;;;;;43526:9;43536:1;43526:12;;;;;;;;;;;;;;43503:9;:36::i;:::-;43489:8;43498:1;43489:11;;;;;;;;;;;;;;;;;:50;43469:3;;43428:123;;;;43196:362;;;;:::o;41929:197::-;42046:13;42084:25;42100:8;42084:15;:25::i;:::-;-1:-1:-1;;;;;42084:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67965:673;68118:24;68129:4;68135:6;68118:10;:24::i;:::-;68154:42;68201:29;:27;:29::i;:::-;68153:77;;;68323:4;68241:7;:79;68277:42;68284:34;68277:6;:42::i;:::-;67761:31;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;67761:31:0;;;;;;;-1:-1:-1;;;;;;;;;;;;68249:25:0;;;:5;:25;;;-1:-1:-1;;;;;;;;;;;68249:70:0;;-1:-1:-1;;;;;;68249:70:0;-1:-1:-1;;;;;68249:70:0;;;;;;;;68241:79;;;;;;;;;;;;;;:86;;-1:-1:-1;;68241:86:0;;;;;;;;;;;67761:31;;;;;;;;;;;;;;;68369:25;;67761:31;;;;;;;;;;;;;;;68480:9;;67761:31;;;;;;;;;;;;;;;;;68445:32;;;:12;:32;;;;;:44;;;68338:152;;-1:-1:-1;;;68338:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;68338:152:0;;;;;;;;;;;;;;;;-1:-1:-1;;;68338:152:0;;;;;68369:25;;;68338:62;;:152;;;;;;;;;;;-1:-1:-1;68369:25:0;68338:152;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;67761:31:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;67761:31:0;;;;;;;-1:-1:-1;;;;;;;;;;;68534:25:0;;;;:5;:25;;-1:-1:-1;;;;;;;;;;;68534:25:0;67761:31;;;;;;;;;;;;;;;;;;68506:54;;-1:-1:-1;;;;;68534:25:0;;;;-1:-1:-1;67751:42:0;;-1:-1:-1;68506:54:0;;;67761:31;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;67761:31:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;68601:25:0;;;:5;:25;;-1:-1:-1;;;;;;;;;;;68601:25:0;68576:54;;;;;-1:-1:-1;;;;;68601:25:0;68576:54;;;;;;;;;;;;;;;;;;;;;;;;;67965:673;;;:::o;63145:237::-;63297:7;63306;63331:43;;-1:-1:-1;;;63331:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71351:353;71512:9;71507:105;71531:9;:16;71527:1;:20;71507:105;;;71569:31;71575:9;71585:1;71575:12;;;;;;;;;;;;;;71589:7;71597:1;71589:10;;;;;;;;;;;;;;71569:5;:31::i;:::-;-1:-1:-1;;71549:3:0;;71507:105;;;;71673:1;-1:-1:-1;;;;;71627:69:0;71653:10;-1:-1:-1;;;;;71627:69:0;71641:10;-1:-1:-1;;;;;71627:69:0;;71677:9;71688:7;71627:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71351:353;;:::o;42134:104::-;42223:7;42216:14;;;;;;;-1:-1:-1;;42216:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42190:13;;42216:14;;42223:7;;42216:14;;42223:7;42216:14;;;;;;;;;;;;;;;;;;;;;;;;43629:402;43756:14;43773:12;:10;:12::i;:::-;43756:29;;43828:8;-1:-1:-1;;;;;43818:18:0;:6;-1:-1:-1;;;;;43818:18:0;;;43796:109;;;;-1:-1:-1;;;43796:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43918:26:0;;;;;;;:18;:26;;;;;;;;:36;;;;;;;;;;;;;:47;;-1:-1:-1;;43918:47:0;;;;;;;;;;43981:42;;;;;;;;;;;;;;;;;43629:402;;;:::o;61407:218::-;61574:43;;-1:-1:-1;;;61574:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71097:246;71228:23;71234:8;71244:6;71228:5;:23::i;:::-;-1:-1:-1;;71267:68:0;;;;;;;;;;;;;;71314:1;;71294:10;;;;-1:-1:-1;;;;;;;;;;;71267:68:0;;;;;;;;;;71097:246;;:::o;41090:234::-;41212:7;41244:72;41266:8;41276:25;41292:8;41276:15;:25::i;:::-;-1:-1:-1;;;;;41276:37:0;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41244:72;41237:79;41090:234;-1:-1:-1;;41090:234:0:o;67698:96::-;67761:31;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;67761:31:0;;;;;-1:-1:-1;;;;;;;;;;;67698:96:0;:::o;62158:99::-;62234:15;;-1:-1:-1;;;;;62234:15:0;62158:99;:::o;68974:273::-;69034:16;69052:22;69107:1;69095:9;:13;69087:45;;;;;-1:-1:-1;;;69087:45:0;;;;;;;;;;;;-1:-1:-1;;;69087:45:0;;;;;;;;;;;;;;;-1:-1:-1;;67761:31:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;67761:31:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;69202:25:0;;;:5;:25;;;-1:-1:-1;;;;;;;;;;;69202:25:0;-1:-1:-1;;;;;69202:25:0;69143:96;67751:42;69202:25;69229:9;69143:10;:96::i;46302:416::-;46446:15;;;;:5;:15;;;;;;-1:-1:-1;;;;;46446:15:0;46465:10;46446:29;46438:62;;;;;-1:-1:-1;;;46438:62:0;;;;;;;;;;;;-1:-1:-1;;;46438:62:0;;;;;;;;;;;;;;;46511:20;46534:39;46556:8;46566:6;46534:21;:39::i;:::-;46511:62;-1:-1:-1;46587:17:0;46584:55;;46621:7;;;46584:55;46683:2;-1:-1:-1;;;;;46654:56:0;46677:4;-1:-1:-1;;;;;46654:56:0;46669:6;-1:-1:-1;;;;;46654:56:0;-1:-1:-1;;;;;;;;;;;46687:8:0;46697:12;46654:56;;;;;;;;;;;;;;;;;;;;;;;;46302:416;;;;;;;:::o;44102:218::-;-1:-1:-1;;;;;44275:27:0;;;44246:4;44275:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;44102:218::o;63390:797::-;-1:-1:-1;;;;;63622:16:0;;63614:66;;;;-1:-1:-1;;;63614:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63691:16;63710:12;:10;:12::i;:::-;63691:31;;63763:8;-1:-1:-1;;;;;63755:16:0;:4;-1:-1:-1;;;;;63755:16:0;;:52;;;;63775:32;63792:4;63798:8;63775:16;:32::i;:::-;63733:143;;;;-1:-1:-1;;;63733:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63889:44;63906:4;63912:2;63916:8;63926:6;63889:16;:44::i;:::-;63982:2;-1:-1:-1;;;;;63951:52:0;63976:4;-1:-1:-1;;;;;63951:52:0;63966:8;-1:-1:-1;;;;;63951:52:0;-1:-1:-1;;;;;;;;;;;63986:8:0;63996:6;63951:52;;;;;;;;;;;;;;;;;;;;;;;;64016:163;64061:8;64084:4;64103:2;64120:8;64143:6;64164:4;64016:30;:163::i;18490:106::-;18578:10;18490:106;:::o;65187:271::-;65303:14;65321:62;65360:4;65366:8;65376:6;65321:38;:62::i;:::-;65301:82;;;65394:25;65410:8;65394:15;:25::i;:::-;-1:-1:-1;;;;;65394:38:0;;65433:4;65439:2;65443:6;65394:56;;;;;;;;;;;;;-1:-1:-1;;;;;65394:56:0;;;;;;-1:-1:-1;;;;;65394:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;65187:271:0:o;48246:1009::-;48495:15;:2;-1:-1:-1;;;;;48495:13:0;;:15::i;:::-;48491:757;;;48565:2;-1:-1:-1;;;;;48548:43:0;;48614:8;48645:4;48672:3;48698:7;48728:4;48548:203;;;;;;;;;;;;;-1:-1:-1;;;;;48548:203:0;;;;;;-1:-1:-1;;;;;48548:203:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48548:203:0;;;48527:710;;;;:::i;:::-;;;;;;;;49110:6;49103:14;;-1:-1:-1;;;49103:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48527:710;49159:62;;-1:-1:-1;;;49159:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48527:710;-1:-1:-1;;;;;;48836:85:0;;-1:-1:-1;;;48836:85:0;48810:224;;48964:50;;-1:-1:-1;;;48964:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49263:500;49315:12;49537:21;49527:8;49523:36;-1:-1:-1;;;;;49409:169:0;49389:1;49364:229;49628:2;49625:1;49622;49615:16;49607:24;-1:-1:-1;49652:17:0;;49687:58;;;;49645:100;;49687:58;49717:9;49645:100;;49349:407;;;:::o;72162:601::-;72292:18;72325:20;72360:11;72399:21;72434:17;72399:53;;72494:44;72507:10;72494:44;;;;;;;;;;;;;-1:-1:-1;;;72494:44:0;;;;;;;;;;;;;;;;-1:-1:-1;;;72494:44:0;;;:12;:44::i;:::-;72477:71;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;72477:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;72477:71:0;;;;;;;;;;;;;;;;;;;;72463:86;;72598:48;72611:10;72598:48;;;;;;;;;;;;;-1:-1:-1;;;72598:48:0;;;;;;;;;;;;;;;;-1:-1:-1;;;72598:48:0;;;:12;:48::i;:::-;72576:71;;;;;;-1:-1:-1;;;72576:71:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;72576:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72560:88;;72665:25;72679:10;72665:13;:25::i;:::-;72659:31;-1:-1:-1;72704:8:0;72701:55;;72735:9;;72729:15;;72701:55;72162:601;;;;;;:::o;73240:344::-;73403:73;;;-1:-1:-1;;;;;73403:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;73403:73:0;-1:-1:-1;;;73403:73:0;;;73350:23;;73376:101;;73390:10;;73376:5;:101::i;:::-;73350:127;;73496:10;:17;73517:1;73496:22;:56;;;;73533:10;73522:30;;;;;;;;;;;;;;;-1:-1:-1;73522:30:0;73496:56;73488:88;;;;;-1:-1:-1;;;73488:88:0;;;;;;;;;;;;-1:-1:-1;;;73488:88:0;;;;;;;;;;;;;;70531:558;70637:26;70675:23;70689:8;70675:13;:23::i;:::-;70666:6;:32;70637:61;;70709:25;70725:8;70709:15;:25::i;:::-;-1:-1:-1;;;;;70709:30:0;;70740:10;70752:18;70709:62;;;;;;;;;;;;;-1:-1:-1;;;;;70709:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70782:18;70824:59;70842:10;70854:8;70864:18;70824:17;:59::i;:::-;70803:80;;;-1:-1:-1;70897:14:0;;70894:188;;70933:42;;;;;;-1:-1:-1;;;;;70933:42:0;;;;;;;;;;;;;;;;;;;;;;;70995:75;;;;;;;;;;;;;;71037:10;;71033:1;;71018:4;;-1:-1:-1;;;;;;;;;;;70995:75:0;;;;;;;;;;70531:558;;;;;:::o;61633:412::-;61757:15;;-1:-1:-1;;;;;61757:15:0;:29;61749:62;;;;;-1:-1:-1;;;61749:62:0;;;;;;;;;;;;-1:-1:-1;;;61749:62:0;;;;;;;;;;;;;;;61893:15;:28;;-1:-1:-1;;;;;;61893:28:0;61911:10;61893:28;;;;;;61877:82;;;-1:-1:-1;;;61877:82:0;;;;61823:49;;61911:10;61877:80;;:82;;;;;;;;;;;61911:10;61877:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61877:82:0;;-1:-1:-1;61970:67:0;61877:82;62024:4;62030:6;61970:10;:67::i;:::-;61633:412;;;:::o;71712:442::-;71820:13;71835:7;71866:29;71878:8;71888:6;71866:11;:29::i;:::-;-1:-1:-1;71855:40:0;-1:-1:-1;71906:13:0;71930:23;71944:8;71930:13;:23::i;:::-;71922:5;:31;;;;;67761;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;67761:31:0;;;;;71922;;-1:-1:-1;;;;;;;;;;;;71967:30:0;;71964:183;;;72014:26;;:10;;:26;;;;;72034:5;;72014:26;;;;72034:5;72014:10;:26;;;;;;;;;;;;;;;;;;;;;71964:183;;;72073:62;72098:16;72105:8;72098:6;:16::i;:::-;72117:10;72129:5;72073:13;:62::i;47287:951::-;47511:15;:2;-1:-1:-1;;;;;47511:13:0;;:15::i;:::-;47507:724;;;47581:2;-1:-1:-1;;;;;47564:38:0;;47625:8;47656:4;47683:2;47708:6;47737:4;47564:196;;;;;;;;;;;;;-1:-1:-1;;;;;47564:196:0;;;;;;-1:-1:-1;;;;;47564:196:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47564:196:0;;;47543:677;;;;:::i;:::-;-1:-1:-1;;;;;;47845:59:0;;-1:-1:-1;;;47845:59:0;47819:198;;47947:50;;-1:-1:-1;;;47947:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65466:467;65592:23;65617:14;65644:18;65665:48;65696:8;65706:6;65665:30;:48::i;:::-;65644:69;;65724:25;65752;65768:8;65752:15;:25::i;:::-;-1:-1:-1;;;;;65752:35:0;;65788:4;65752:41;;;;;;;;;;;;;-1:-1:-1;;;;;65752:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65752:41:0;;-1:-1:-1;65822:25:0;65832:4;65838:8;65822:9;:25::i;:::-;65804:43;;65877:15;65867:6;:25;:58;;65915:10;65867:58;;;65895:17;65867:58;65858:67;;65466:467;;;;;;;;:::o;25073:422::-;25440:20;25479:8;;;25073:422::o;74491:1212::-;74607:13;74634:12;74648:17;74677:10;-1:-1:-1;;;;;74669:30:0;74706:5;74738:8;74714:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;74714:33:0;;;;;;;;;;;;;;;;-1:-1:-1;;74714:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;74714:33:0;-1:-1:-1;;;;;;74714:33:0;;;;;;;;;74669:79;;;;;-1:-1:-1;74669:79:0;;-1:-1:-1;74669:79:0;-1:-1:-1;74669:79:0;;74714:33;74669:79;;;;;;;;;;-1:-1:-1;;74669:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74633:115;;;;74764:7;74759:139;;74851:34;;;;;;;;;;;;;;;-1:-1:-1;;;;;74806:30:0;;;74843:5;;74851:34;74875:9;;74851:34;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;74851:34:0;;;;;;;;;;;;;;;;-1:-1:-1;;74851:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;74851:34:0;-1:-1:-1;;;;;;74851:34:0;;;;;;;;;74806:80;;;;;-1:-1:-1;74806:80:0;;-1:-1:-1;74806:80:0;-1:-1:-1;74806:80:0;;74851:34;74806:80;;;;;;;;;;-1:-1:-1;;74806:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;74788:98:0;;-1:-1:-1;74788:98:0;-1:-1:-1;74759:139:0;74914:7;:28;;;;;74940:2;74925:4;:11;:17;;74914:28;74910:263;;;74960:14;74976:11;75002:4;74991:36;;;;;;;;;;;;;;;-1:-1:-1;74991:36:0;;;;;;;;;-1:-1:-1;74991:36:0;-1:-1:-1;75046:14:0;;:25;;;;;75070:1;75064:3;:7;75046:25;:39;;;;;75082:3;75075;:10;;75046:39;75042:120;;;75131:4;75120:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;75120:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;75120:25:0;;;;;;-1:-1:-1;75120:25:0;;;;;;;;;;-1:-1:-1;75120:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75106:40;;;;;;;;75042:120;74910:263;;;75189:7;:28;;;;;75200:4;:11;75215:2;75200:17;75189:28;75185:446;;;75234:8;75261:108;75274:4;:11;75268:3;:17;:38;;;;;75302:4;75289:17;;:4;75294:3;75289:9;;;;;;;;;;;;-1:-1:-1;;;;;;75289:9:0;:17;;75268:38;:59;;;;;75323:4;75310:17;;:4;75315:3;75310:9;;;;;;;;;;;;-1:-1:-1;;;;;;75310:9:0;:17;;75268:59;75261:108;;;75348:5;;75261:108;;;75389:7;;75385:235;;75417:19;75449:3;75439:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;75439:14:0;;75417:36;;75477:6;75472:93;75493:3;75489:1;:7;75472:93;;;75538:4;75543:1;75538:7;;;;;;;;;;;;;;;;75526:6;75533:1;75526:9;;;;;;;;;;;:19;-1:-1:-1;;;;;75526:19:0;;;;;;;;-1:-1:-1;75498:3:0;;75472:93;;;-1:-1:-1;75597:6:0;-1:-1:-1;75583:21:0;;-1:-1:-1;;;75583:21:0;75385:235;75185:446;;75650:45;75682:10;75657:37;;;;;;-1:-1:-1;;;;;75657:37:0;;;;;;;;;;;;;;;;;;;;;;75650:6;:45::i;:::-;75643:52;74491:1212;-1:-1:-1;;;;;;74491:1212:0:o;74208:275::-;74355:52;;;;;;;;;;;;;;;;-1:-1:-1;;;;;74355:52:0;-1:-1:-1;;;74355:52:0;;;74324:84;;;;74276:11;;74303:17;;-1:-1:-1;;;;;74324:30:0;;;74355:52;;74324:84;;;;;;74355:52;74324:84;;;;;;;;;;-1:-1:-1;;74324:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74300:108;;;74425:4;:11;74440:1;74425:16;:50;;74459:4;74448:27;;;;;;;;;;;;;;;-1:-1:-1;74448:27:0;74425:50;;;74444:1;74419:56;74208:275;-1:-1:-1;;;74208:275:0:o;73592:608::-;73663:23;73801:1;73798;73788:7;73782:14;73775:4;73766:7;73762:18;73759:1;73749:8;73742:5;73737:66;73829:16;73879:4;73873:11;73859:25;;73917:4;73905:10;73898:24;73982:4;73970:10;73966:21;74043:4;74040:1;74016:22;74001:47;74075:33;;;74069:4;74062:47;74130:6;74137:45;;;;74123:59;;74137:45;74176:4;74152:22;74145:36;74123:59;;;;;73708:485;;;;:::o;72771:140::-;72834:7;72879:22;;;:12;:22;;;;;;72867:9;;:34;72862:2;:40;;72771:140::o;62265:432::-;62482:15;;62466:69;;;-1:-1:-1;;;62466:69:0;;;;;;;;;;62377:20;;;;-1:-1:-1;;;;;62482:15:0;;;;62466:49;;:69;;;;;;;;;;;62482:15;62466:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62466:69:0;;;;;;;;;-1:-1:-1;62466:69:0;-1:-1:-1;62549:16:0;;;;;:43;;-1:-1:-1;;;;;;62569:23:0;;;;62549:43;62546:144;;;62609:25;62625:8;62609:15;:25::i;:::-;-1:-1:-1;;;;;62609:38:0;;62648:4;62654:9;62665:12;62609:69;;;;;;;;;;;;;-1:-1:-1;;;;;62609:69:0;;;;;;-1:-1:-1;;;;;62609:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;62546:144:0;62265:432;;;;;;:::o;36266:1709::-;36450:28;;-1:-1:-1;;;;;36450:28:0;:42;36428:112;;;;;-1:-1:-1;;;36428:112:0;;;;;;;;;;;;-1:-1:-1;;;36428:112:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;36575:41:0;;36553:131;;;;-1:-1:-1;;;36553:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36764:28;:58;;-1:-1:-1;;;;;;36764:58:0;-1:-1:-1;;;;;36764:58:0;;;;;;;;36733:122;;;-1:-1:-1;;;36733:122:0;;;;:120;;:122;;;;;;;;;;;;;;;36764:58;36733:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36733:122:0;36695:35;:160;36888:22;;36733:122;36888:22;;;36914:13;36888:39;;36866:106;;;;;-1:-1:-1;;;36866:106:0;;;;;;;;;;;;-1:-1:-1;;;36866:106:0;;;;;;;;;;;;;;;37005:24;;;;;;37033:13;37005:41;;36983:110;;;;;-1:-1:-1;;;36983:110:0;;;;;;;;;;;;-1:-1:-1;;;36983:110:0;;;;;;;;;;;;;;;37106:12;;;;:5;;:12;;;;;:::i;:::-;-1:-1:-1;37129:16:0;;;;:7;;:16;;;;;:::i;:::-;-1:-1:-1;37168:2:0;37156:9;:14;37183:55;-1:-1:-1;;;37183:18:0;:55::i;:::-;37249:46;-1:-1:-1;;;37249:18:0;:46::i;:::-;37306:43;-1:-1:-1;;;37306:18:0;:43::i;:::-;37360:48;-1:-1:-1;;;37360:18:0;:48::i;:::-;37419:51;-1:-1:-1;;;37419:18:0;:51::i;:::-;37481:50;-1:-1:-1;;;37481:18:0;:50::i;:::-;37542;-1:-1:-1;;;37542:18:0;:50::i;:::-;37603:37;-1:-1:-1;;;37603:18:0;:37::i;:::-;37651:45;-1:-1:-1;;;37651:18:0;:45::i;:::-;37707:30;-1:-1:-1;;;37707:18:0;:30::i;:::-;37764;-1:-1:-1;;;37764:18:0;:30::i;:::-;37823:42;-1:-1:-1;;;37823:18:0;:42::i;:::-;37876:30;-1:-1:-1;;;37876:18:0;:30::i;:::-;37926;-1:-1:-1;;;37926:18:0;:30::i;65941:492::-;66040:13;66055:20;66089:23;66114:14;66132:68;66171:10;66183:8;66193:6;66132:38;:68::i;:::-;66088:112;;;;66238:6;66219:15;:25;;66211:57;;;;;-1:-1:-1;;;66211:57:0;;;;;;;;;;;;-1:-1:-1;;;66211:57:0;;;;;;;;;;;;;;;66294:47;66312:10;66324:8;66334:6;66294:17;:47::i;:::-;66279:62;;66352:25;66368:8;66352:15;:25::i;:::-;-1:-1:-1;;;;;66352:30:0;;66383:10;66412:12;66403:6;:21;66395:29;;;66352:73;;;;;;;;;;;;;-1:-1:-1;;;;;66352:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65941:492;;;;;;;:::o;72919:313::-;73065:63;;;-1:-1:-1;;;;;73065:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;73065:63:0;-1:-1:-1;;;73065:63:0;;;73012:23;;73038:91;;73052:10;;73038:5;:91::i;:::-;73012:117;;73148:10;:17;73169:1;73148:22;:56;;;;73185:10;73174:30;;;;;;;;;;;;;;;-1:-1:-1;73174:30:0;73148:56;73140:84;;;;;-1:-1:-1;;;73140:84:0;;;;;;;;;;;;-1:-1:-1;;;73140:84:0;;;;;;;;;;;;;;;72919:313;;;;:::o;75711:500::-;75767:13;75793:16;75826:4;:11;75840:1;75826:15;75822:1;:19;75812:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;75812:30:0;;75793:49;;-1:-1:-1;;;75853:3:0;75857:1;75853:6;;;;;;;;;;;:12;-1:-1:-1;;;;;75853:12:0;;;;;;;;;-1:-1:-1;;;75876:3:0;75880:1;75876:6;;;;;;;;;;;:12;-1:-1:-1;;;;;75876:12:0;;;;;;;;-1:-1:-1;75908:1:0;75899:6;75920:253;75941:4;:11;75937:1;:15;75920:253;;;75974:6;76001:1;75989:4;75994:1;75989:7;;;;;;;;;;;;;;;;75983:14;;:19;;;;75974:28;;;;76017:6;76032:4;76037:1;76032:7;;;;;;;;;;;;;;;76043:4;76026:21;;-1:-1:-1;76096:2:0;76094:1;:4;76100:2;76093:9;76084:1;76088:2;76084:6;:18;76073:31;;76062:3;76066;;;;;;76062:8;;;;;;;;;;;:42;-1:-1:-1;;;;;76062:42:0;;;;;;;;-1:-1:-1;76153:2:0;76151:1;:4;76157:2;76150:9;76141:1;76145:2;76141:6;:18;76130:31;;76119:3;76123;;;;;;76119:8;;;;;;;;;;;:42;-1:-1:-1;;;;;76119:42:0;;;;;;;;-1:-1:-1;;;75954:3:0;;75920:253;;;-1:-1:-1;76199:3:0;;75711:500;-1:-1:-1;;;75711:500:0:o;32912:201::-;-1:-1:-1;;;;;;32996:25:0;;;;;32988:66;;;;;-1:-1:-1;;;32988:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;33065:33:0;:20;:33;;;;;;;;;;:40;;-1:-1:-1;;33065:40:0;33101:4;33065:40;;;32912:201::o;62705:432::-;62922:15;;62906:69;;;-1:-1:-1;;;62906:69:0;;;;;;;;;;62817:20;;;;-1:-1:-1;;;;;62922:15:0;;;;62906:49;;:69;;;;;;;;;;;62922:15;62906:69;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;110:106;195:3;191:15;;163:53::o;224:739::-;;297:4;279:16;276:26;273:2;;;305:5;;273:2;339:1;-1:-1;;318:23;414:10;357:34;-1:-1;382:8;357:34;:::i;:::-;406:19;396:2;;429:5;;396:2;460;454:9;496:16;-1:-1;;492:24;339:1;454:9;468:49;543:4;537:11;624:16;576:18;624:16;617:4;609:6;605:17;602:39;576:18;568:6;565:30;556:91;553:2;;;655:5;;;;;;553:2;693:6;687:4;683:17;672:28;;725:3;719:10;705:24;;576:18;740:6;737:30;734:2;;;770:5;;;;;;734:2;;847:16;841:4;837:27;807:4;814:6;802:3;794:27;;829:36;826:2;;;868:5;;;;;826:2;89:7;73:14;-1:-1;;69:28;892:50;;807:4;892:50;460:2;881:62;900:3;-1:-1;;267:696;:::o

Swarm Source

ipfs://0438b60d2288c3693062dfbb98f649056cd62a2a73ab9d5cf660b41be0da9363

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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