Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 54 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Buy ERC1155Norma... | 15730305 | 584 days ago | IN | 0 ETH | 0.00247211 | ||||
Buy ERC1155Norma... | 15722680 | 585 days ago | IN | 0 ETH | 0.00372923 | ||||
Buy ERC1155Norma... | 15721971 | 585 days ago | IN | 0 ETH | 0.00446605 | ||||
Buy ERC1155Norma... | 15721266 | 586 days ago | IN | 0 ETH | 0.00531611 | ||||
Buy ERC1155Norma... | 15721241 | 586 days ago | IN | 0 ETH | 0.00517063 | ||||
Buy ERC1155Norma... | 15721235 | 586 days ago | IN | 0 ETH | 0.00536398 | ||||
Buy NFT Normal | 15721213 | 586 days ago | IN | 0 ETH | 0.00503606 | ||||
Buy ERC1155Norma... | 15717966 | 586 days ago | IN | 0 ETH | 0.0061297 | ||||
Buy ERC1155Norma... | 15717925 | 586 days ago | IN | 0 ETH | 0.01020577 | ||||
Buy ERC1155Norma... | 15708022 | 587 days ago | IN | 0 ETH | 0.00400109 | ||||
Buy ERC1155Norma... | 15708017 | 587 days ago | IN | 0 ETH | 0.00487168 | ||||
Buy ERC1155Norma... | 15708012 | 587 days ago | IN | 0 ETH | 0.00449484 | ||||
Buy ERC1155Norma... | 15707947 | 587 days ago | IN | 0 ETH | 0.0051065 | ||||
Buy ERC1155Norma... | 15707911 | 587 days ago | IN | 0 ETH | 0.0040357 | ||||
Buy ERC1155Norma... | 15707503 | 587 days ago | IN | 0 ETH | 0.00385617 | ||||
Buy ERC1155Norma... | 15706884 | 588 days ago | IN | 0 ETH | 0.00349482 | ||||
Buy ERC1155Norma... | 15648269 | 596 days ago | IN | 0 ETH | 0.00170577 | ||||
Buy ERC1155Norma... | 15648208 | 596 days ago | IN | 0 ETH | 0.00180108 | ||||
Buy ERC1155Norma... | 15648187 | 596 days ago | IN | 0 ETH | 0.00164459 | ||||
Buy ERC1155Norma... | 15648163 | 596 days ago | IN | 0 ETH | 0.00197855 | ||||
Buy ERC1155Norma... | 15648144 | 596 days ago | IN | 0 ETH | 0.00202892 | ||||
Buy ERC1155Norma... | 15648107 | 596 days ago | IN | 0 ETH | 0.00175484 | ||||
Buy ERC1155Norma... | 15648094 | 596 days ago | IN | 0 ETH | 0.00239276 | ||||
Buy ERC1155Norma... | 15648074 | 596 days ago | IN | 0 ETH | 0.00193956 | ||||
Buy ERC1155Norma... | 15648007 | 596 days ago | IN | 0 ETH | 0.0018359 |
Loading...
Loading
Contract Name:
PrimezExchange
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-22 */ // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // 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 (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @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) { return a + b; } /** * @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 a - b; } /** * @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) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting 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 a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting 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) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * 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) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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"); (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"); (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"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount ) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // File: Primez_Exchange/libraries/TransferHelper.sol pragma solidity 0.8.0; // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library TransferHelper { function safeApprove(address token, address to, uint value) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper: APPROVE_FAILED"); } function safeTransfer(address token, address to, uint value) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper: TRANSFER_FAILED"); } function safeTransferFrom(address token, address from, address to, uint value) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper: TRANSFER_FROM_FAILED"); } function safeTransferETH(address to, uint value) internal { (bool success,) = to.call{value:value}(new bytes(0)); require(success, "TransferHelper: ETH_TRANSFER_FAILED"); } } // File: Primez_Exchange/interfaces/IStableToken.sol pragma solidity 0.8.0; interface IStableToken { function allowance(address owner, address spender) external returns (uint); function transferFrom(address sender, address recipient, uint256 amount) external; } // File: Primez_Exchange/interfaces/IERC165.sol // OpenZeppelin Contracts v4.3.2 (utils/introspection/IERC165.sol) pragma solidity 0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: Primez_Exchange/interfaces/IERC1155.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol) pragma solidity ^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 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: Primez_Exchange/interfaces/IERC721.sol // OpenZeppelin Contracts v4.3.2 (token/ERC721/IERC721.sol) pragma solidity 0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: Primez_Exchange/PrimezExchange.sol //SPDX-License-Identifier: MIT pragma solidity 0.8.0; contract PrimezExchange is Ownable { using ECDSA for bytes32; using SafeERC20 for ERC20; using SafeMath for uint256; //contract: ERC721A address public ERC721; //contract: ERC1155 address public ERC1155; // Address is owner of list contract address public admin; // Mitigating Replay Attacks mapping(address => mapping(uint256 => bool)) seenNonces; // Addresses running auction NFT mapping(address => bool) public whitelistAddress; struct Data { address[5] tradeAddress; uint256[4] attributes; } struct DataERC1155 { address[5] tradeAddress; uint256[5] attributes; } // Events //ERC721 // addrs: from, to, token event BuyNFTNormal(address[3] addrs, uint256 tokenId, uint256 amount); event BuyNFTETH(address[3] addrs, uint256 tokenId, uint256 amount); event AuctionNFT(address[3] addrs, uint256 tokenId, uint256 amount); event AcceptOfferNFT(address[3] addrs, uint256 tokenId, uint256 amount); //ERC1155 // addrs: from, to, token event BuyERC1155Normal(address[3] addrs, uint256 tokenId, uint256 amount, uint256 value); event BuyERC1155ETH(address[3] addrs, uint256 tokenId, uint256 amount, uint256 value); event AcceptOfferERC1155(address[3] addrs, uint256 tokenId, uint256 amount, uint256 value); event AuctionERC1155(address[3] addrs, uint256 tokenId, uint256 amount, uint256 value); constructor(address _erc721, address _erc1155) public { ERC721 = _erc721; ERC1155 = _erc1155; whitelistAddress[msg.sender] = true; admin = msg.sender; } function setERC721(address _erc721) public onlyOwner { ERC721 = _erc721; } function setERC1155(address _erc1155) public onlyOwner { ERC1155 = _erc1155; } function setWhitelistAddress(address _address, bool approved) public onlyOwner { whitelistAddress[_address] = approved; } function setAdminAddress(address _admin) public onlyOwner { admin = _admin; } modifier verifySignature( uint256 nonce, address[5] memory _tradeAddress, uint256[4] memory _attributes, bytes memory signature ) { // This recreates the message hash that was signed on the client. bytes32 hash = keccak256( abi.encodePacked( msg.sender, nonce, _tradeAddress, _attributes ) ); bytes32 messageHash = hash.toEthSignedMessageHash(); // Verify that the message's signer is the owner of the order require(messageHash.recover(signature) == owner(), "Invalid signature"); require(!seenNonces[msg.sender][nonce], "Used nonce"); seenNonces[msg.sender][nonce] = true; _; } function checkFeeProductExits( address[5] memory _tradeAddress, uint256[4] memory _attributes ) private returns (uint256 amount, uint256 feeOwner, uint256 feeAdmin) { uint256 totalFeeTrade; // Check fee for owner if (_tradeAddress[3] != address(0)) { feeOwner = _attributes[0].mul(_attributes[2]).div(1000); totalFeeTrade += feeOwner; } // Check fee for admin if (_tradeAddress[4] != address(0)) { feeAdmin = _attributes[0].mul(_attributes[3]).div(1000); totalFeeTrade += feeAdmin; } amount = _attributes[0].sub(totalFeeTrade); } // Buy NFT normal by token ERC-20 // address[5]: buyer, seller, token, fee, feeAdmin // uint256[4]: amount, tokenId, feePercent, feePercentAdmin function buyNFTNormal( address[5] memory _tradeAddress, uint256[4] memory _attributes, uint256 nonce, bytes memory signature ) external verifySignature(nonce, _tradeAddress, _attributes, signature) { Data memory tradeInfo = Data({ tradeAddress: _tradeAddress, attributes: _attributes }); // check allowance of buyer require( IERC20(tradeInfo.tradeAddress[2]).allowance(msg.sender, address(this)) >= tradeInfo.attributes[0], "token allowance too low" ); (uint256 amount, uint256 feeOwner, uint256 feeAdmin) = checkFeeProductExits( tradeInfo.tradeAddress, tradeInfo.attributes ); if (feeOwner != 0) { // transfer token to fee address ERC20(tradeInfo.tradeAddress[2]).safeTransferFrom( tradeInfo.tradeAddress[0], tradeInfo.tradeAddress[3], feeOwner ); } if (feeAdmin != 0) { // transfer token to fee address ERC20(tradeInfo.tradeAddress[2]).safeTransferFrom( tradeInfo.tradeAddress[0], tradeInfo.tradeAddress[4], feeAdmin ); } // transfer token from buyer to seller ERC20(tradeInfo.tradeAddress[2]).safeTransferFrom( msg.sender, tradeInfo.tradeAddress[1], amount ); IERC721(ERC721).safeTransferFrom( tradeInfo.tradeAddress[1], msg.sender, tradeInfo.attributes[1] ); emit BuyNFTNormal( [msg.sender, tradeInfo.tradeAddress[1], tradeInfo.tradeAddress[2]], tradeInfo.attributes[1], tradeInfo.attributes[0] ); } // Buy NFT normal by ETH // address[5]: buyer, seller, token, fee, feeAdmin // uint256[4]: amount, tokenId, feePercent, feePercentAdmin function buyNFTETH( address[5] memory _tradeAddress, uint256[4] memory _attributes, uint256 nonce, bytes memory signature ) external payable verifySignature(nonce, _tradeAddress, _attributes, signature) { Data memory tradeInfo = Data({ tradeAddress: _tradeAddress, attributes: _attributes }); (uint256 amount, uint256 feeOwner, uint256 feeAdmin) = checkFeeProductExits( tradeInfo.tradeAddress, tradeInfo.attributes ); // transfer eth to fee address if (feeOwner != 0) { TransferHelper.safeTransferETH(tradeInfo.tradeAddress[3], feeOwner); } // transfer eth to admin address if (feeAdmin != 0) { TransferHelper.safeTransferETH(tradeInfo.tradeAddress[4], feeAdmin); } TransferHelper.safeTransferETH(tradeInfo.tradeAddress[1], amount); IERC721(ERC721).safeTransferFrom( tradeInfo.tradeAddress[1], msg.sender, tradeInfo.attributes[1] ); // refund dust eth, if any if (msg.value > tradeInfo.attributes[0]) TransferHelper.safeTransferETH( msg.sender, msg.value - tradeInfo.attributes[0] ); emit BuyNFTETH( [msg.sender, tradeInfo.tradeAddress[1], tradeInfo.tradeAddress[2]], tradeInfo.attributes[1], tradeInfo.attributes[0] ); } // Auction NFT // address[5]: buyer, seller, token, fee, feeAdmin // uint256[4]: amount, tokenId, feePercent, feePercentAdmin function auctionNFT( address[5] memory _tradeAddress, uint256[4] memory _attributes ) external { Data memory tradeInfo = Data({ tradeAddress: _tradeAddress, attributes: _attributes }); // Check address execute auction require( whitelistAddress[msg.sender] == true, "Address is not in whitelist" ); // check allowance of buyer require( IERC20(tradeInfo.tradeAddress[2]).allowance( tradeInfo.tradeAddress[0], address(this) ) >= tradeInfo.attributes[0], "token allowance too low" ); if (tradeInfo.tradeAddress[1] == admin) { require( IERC721(ERC721).isApprovedForAll(admin, address(this)), "tokenId do not approve for contract" ); } else { require( IERC721(ERC721).getApproved(tradeInfo.attributes[1]) == address(this), "tokenId do not approve for contract" ); } (uint256 amount, uint256 feeOwner, uint256 feeAdmin) = checkFeeProductExits( tradeInfo.tradeAddress, tradeInfo.attributes ); if (feeOwner != 0) { // transfer token to fee address ERC20(tradeInfo.tradeAddress[2]).safeTransferFrom( tradeInfo.tradeAddress[0], tradeInfo.tradeAddress[3], feeOwner ); } if (feeAdmin != 0) { // transfer token to fee address ERC20(tradeInfo.tradeAddress[2]).safeTransferFrom( tradeInfo.tradeAddress[0], tradeInfo.tradeAddress[4], feeAdmin ); } // transfer token from buyer to seller ERC20(tradeInfo.tradeAddress[2]).safeTransferFrom( tradeInfo.tradeAddress[0], tradeInfo.tradeAddress[1], amount ); IERC721(ERC721).safeTransferFrom( tradeInfo.tradeAddress[1], tradeInfo.tradeAddress[0], tradeInfo.attributes[1] ); emit AuctionNFT( [msg.sender, tradeInfo.tradeAddress[1], tradeInfo.tradeAddress[2]], tradeInfo.attributes[1], tradeInfo.attributes[0] ); } // Accept offer from buyer // address[5]: buyer, seller, token, fee, feeAdmin // uint256[4]: amount, tokenId, feePercent, feePercentAdmin function acceptOfferNFT( address[5] memory _tradeAddress, uint256[4] memory _attributes, uint256 nonce, bytes memory signature ) external verifySignature(nonce, _tradeAddress, _attributes, signature) { Data memory tradeInfo = Data({ tradeAddress: _tradeAddress, attributes: _attributes }); require( IERC721(ERC721).getApproved(tradeInfo.attributes[1]) == address(this), "tokenId do not approve for contract" ); // check allowance of buyer require( IERC20(tradeInfo.tradeAddress[2]).allowance( tradeInfo.tradeAddress[0], address(this) ) >= tradeInfo.attributes[0], "token allowance too low" ); (uint256 amount, uint256 feeOwner, uint256 feeAdmin) = checkFeeProductExits( tradeInfo.tradeAddress, tradeInfo.attributes ); if (feeOwner != 0) { // transfer token to fee address ERC20(tradeInfo.tradeAddress[2]).safeTransferFrom( tradeInfo.tradeAddress[0], tradeInfo.tradeAddress[3], feeOwner ); } if (feeAdmin != 0) { // transfer token to fee address ERC20(tradeInfo.tradeAddress[2]).safeTransferFrom( tradeInfo.tradeAddress[0], tradeInfo.tradeAddress[4], feeAdmin ); } // transfer token from buyer to seller ERC20(tradeInfo.tradeAddress[2]).safeTransferFrom( tradeInfo.tradeAddress[0], msg.sender, amount ); IERC721(ERC721).safeTransferFrom( tradeInfo.tradeAddress[1], tradeInfo.tradeAddress[0], tradeInfo.attributes[1] ); emit AcceptOfferNFT( [msg.sender, tradeInfo.tradeAddress[1], tradeInfo.tradeAddress[2]], tradeInfo.attributes[1], tradeInfo.attributes[0] ); } //Handle for ERC1155 // address[5]: buyer, seller, token, fee, feeAdmin // uint256[4]: amount, tokenId, feePercent, feePercentAdmin, value modifier verifySignatureERC1155( uint256 nonce, address[5] memory _tradeAddress, uint256[5] memory _attributes, bytes memory signature ) { // This recreates the message hash that was signed on the client. bytes32 hash = keccak256( abi.encodePacked( msg.sender, nonce, _tradeAddress, _attributes ) ); bytes32 messageHash = hash.toEthSignedMessageHash(); // Verify that the message's signer is the owner of the order require(messageHash.recover(signature) == owner(), "Invalid signature"); require(!seenNonces[msg.sender][nonce], "Used nonce"); seenNonces[msg.sender][nonce] = true; _; } function checkFeeProductExitsERC1155( address[5] memory _tradeAddress, uint256[5] memory _attributes ) private returns (uint256 amount, uint256 feeOwner, uint256 feeAdmin) { uint256 totalFeeTrade; // Check fee for owner if (_tradeAddress[3] != address(0)) { feeOwner = _attributes[0].mul(_attributes[2]).div(1000); totalFeeTrade += feeOwner; } // Check fee for admin if (_tradeAddress[4] != address(0)) { feeAdmin = _attributes[0].mul(_attributes[3]).div(1000); totalFeeTrade += feeAdmin; } amount = _attributes[0].sub(totalFeeTrade); } // Buy NFT normal by token ERC-20 // address[5]: buyer, seller, token, fee, feeAdmin // uint256[5]: amount, tokenId, feePercent, feePercentAdmin function buyERC1155Normal( address[5] memory _tradeAddress, uint256[5] memory _attributes, uint256 nonce, bytes memory signature ) external verifySignatureERC1155(nonce, _tradeAddress, _attributes, signature) { DataERC1155 memory tradeInfo = DataERC1155({ tradeAddress: _tradeAddress, attributes: _attributes }); // check allowance of buyer require( IERC20(tradeInfo.tradeAddress[2]).allowance(msg.sender, address(this)) >= tradeInfo.attributes[0], "token allowance too low" ); (uint256 amount, uint256 feeOwner, uint256 feeAdmin) = checkFeeProductExitsERC1155( tradeInfo.tradeAddress, tradeInfo.attributes ); if (feeOwner != 0) { // transfer token to fee address ERC20(tradeInfo.tradeAddress[2]).safeTransferFrom( tradeInfo.tradeAddress[0], tradeInfo.tradeAddress[3], feeOwner ); } if (feeAdmin != 0) { // transfer token to fee address ERC20(tradeInfo.tradeAddress[2]).safeTransferFrom( tradeInfo.tradeAddress[0], tradeInfo.tradeAddress[4], feeAdmin ); } // transfer token from buyer to seller ERC20(tradeInfo.tradeAddress[2]).safeTransferFrom( msg.sender, tradeInfo.tradeAddress[1], amount ); IERC1155(ERC1155).safeTransferFrom( tradeInfo.tradeAddress[1], msg.sender, tradeInfo.attributes[1], tradeInfo.attributes[4], "" ); emit BuyERC1155Normal( [msg.sender, tradeInfo.tradeAddress[1], tradeInfo.tradeAddress[2]], tradeInfo.attributes[1], tradeInfo.attributes[0], tradeInfo.attributes[4] ); } // Buy NFT normal by token ERC-20 // address[5]: buyer, seller, token, fee, feeAdmin // uint256[5]: amount, tokenId, feePercent, feePercentAdmin, value function buyERC1155ETH( address[5] memory _tradeAddress, uint256[5] memory _attributes, uint256 nonce, bytes memory signature ) external payable verifySignatureERC1155(nonce, _tradeAddress, _attributes, signature) { DataERC1155 memory tradeInfo = DataERC1155({ tradeAddress: _tradeAddress, attributes: _attributes }); (uint256 amount, uint256 feeOwner, uint256 feeAdmin) = checkFeeProductExitsERC1155( tradeInfo.tradeAddress, tradeInfo.attributes ); // transfer eth to fee address if (feeOwner != 0) { TransferHelper.safeTransferETH(tradeInfo.tradeAddress[3], feeOwner); } // transfer eth to admin address if (feeAdmin != 0) { TransferHelper.safeTransferETH(tradeInfo.tradeAddress[4], feeAdmin); } TransferHelper.safeTransferETH(tradeInfo.tradeAddress[1], amount); IERC1155(ERC1155).safeTransferFrom( tradeInfo.tradeAddress[1], msg.sender, tradeInfo.attributes[1], tradeInfo.attributes[4], "" ); // refund dust eth, if any if (msg.value > tradeInfo.attributes[0]) TransferHelper.safeTransferETH( msg.sender, msg.value - tradeInfo.attributes[0] ); emit BuyERC1155ETH( [msg.sender, tradeInfo.tradeAddress[1], tradeInfo.tradeAddress[2]], tradeInfo.attributes[1], tradeInfo.attributes[0], tradeInfo.attributes[4] ); } // Accept offer from buyer // address[5]: buyer, seller, token, fee, feeAdmin // uint256[5]: amount, tokenId, feePercent, feePercentAdmin, value function acceptOfferERC1155( address[5] memory _tradeAddress, uint256[5] memory _attributes, uint256 nonce, bytes memory signature ) external verifySignatureERC1155(nonce, _tradeAddress, _attributes, signature) { DataERC1155 memory tradeInfo = DataERC1155({ tradeAddress: _tradeAddress, attributes: _attributes }); require( IERC1155(ERC1155).isApprovedForAll(tradeInfo.tradeAddress[1], address(this)), "tokenId do not approve for contract" ); // check allowance of buyer require( IERC20(tradeInfo.tradeAddress[2]).allowance( tradeInfo.tradeAddress[0], address(this) ) >= tradeInfo.attributes[0], "token allowance too low" ); (uint256 amount, uint256 feeOwner, uint256 feeAdmin) = checkFeeProductExitsERC1155( tradeInfo.tradeAddress, tradeInfo.attributes ); if (feeOwner != 0) { // transfer token to fee address ERC20(tradeInfo.tradeAddress[2]).safeTransferFrom( tradeInfo.tradeAddress[0], tradeInfo.tradeAddress[3], feeOwner ); } if (feeAdmin != 0) { // transfer token to fee address ERC20(tradeInfo.tradeAddress[2]).safeTransferFrom( tradeInfo.tradeAddress[0], tradeInfo.tradeAddress[4], feeAdmin ); } // transfer token from buyer to seller ERC20(tradeInfo.tradeAddress[2]).safeTransferFrom( tradeInfo.tradeAddress[0], msg.sender, amount ); IERC1155(ERC1155).safeTransferFrom( tradeInfo.tradeAddress[1], tradeInfo.tradeAddress[0], tradeInfo.attributes[1], tradeInfo.attributes[4], "" ); emit AcceptOfferERC1155( [msg.sender, tradeInfo.tradeAddress[1], tradeInfo.tradeAddress[2]], tradeInfo.attributes[1], tradeInfo.attributes[0], tradeInfo.attributes[4] ); } // Auction NFT // address[5]: buyer, seller, token, fee, feeAdmin // uint256[5]: amount, tokenId, feePercent, feePercentAdmin, value function auctionERC1155( address[5] memory _tradeAddress, uint256[5] memory _attributes ) external { DataERC1155 memory tradeInfo = DataERC1155({ tradeAddress: _tradeAddress, attributes: _attributes }); // Check address execute auction require( whitelistAddress[msg.sender] == true, "Address is not in whitelist" ); // check allowance of buyer require( IERC20(tradeInfo.tradeAddress[2]).allowance( tradeInfo.tradeAddress[0], address(this) ) >= tradeInfo.attributes[0], "token allowance too low" ); require( IERC1155(ERC1155).isApprovedForAll(tradeInfo.tradeAddress[1], address(this)), "tokenId do not approve for contract" ); (uint256 amount, uint256 feeOwner, uint256 feeAdmin) = checkFeeProductExitsERC1155( tradeInfo.tradeAddress, tradeInfo.attributes ); if (feeOwner != 0) { // transfer token to fee address ERC20(tradeInfo.tradeAddress[2]).safeTransferFrom( tradeInfo.tradeAddress[0], tradeInfo.tradeAddress[3], feeOwner ); } if (feeAdmin != 0) { // transfer token to fee address ERC20(tradeInfo.tradeAddress[2]).safeTransferFrom( tradeInfo.tradeAddress[0], tradeInfo.tradeAddress[4], feeAdmin ); } // transfer token from buyer to seller ERC20(tradeInfo.tradeAddress[2]).safeTransferFrom( tradeInfo.tradeAddress[0], tradeInfo.tradeAddress[1], amount ); IERC1155(ERC1155).safeTransferFrom( tradeInfo.tradeAddress[1], tradeInfo.tradeAddress[0], tradeInfo.attributes[1], tradeInfo.attributes[4], "" ); emit AuctionERC1155( [msg.sender, tradeInfo.tradeAddress[1], tradeInfo.tradeAddress[2]], tradeInfo.attributes[1], tradeInfo.attributes[0], tradeInfo.attributes[4] ); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_erc721","type":"address"},{"internalType":"address","name":"_erc1155","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[3]","name":"addrs","type":"address[3]"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"AcceptOfferERC1155","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[3]","name":"addrs","type":"address[3]"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AcceptOfferNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[3]","name":"addrs","type":"address[3]"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"AuctionERC1155","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[3]","name":"addrs","type":"address[3]"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AuctionNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[3]","name":"addrs","type":"address[3]"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"BuyERC1155ETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[3]","name":"addrs","type":"address[3]"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"BuyERC1155Normal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[3]","name":"addrs","type":"address[3]"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BuyNFTETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[3]","name":"addrs","type":"address[3]"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BuyNFTNormal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"ERC1155","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ERC721","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[5]","name":"_tradeAddress","type":"address[5]"},{"internalType":"uint256[5]","name":"_attributes","type":"uint256[5]"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"acceptOfferERC1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[5]","name":"_tradeAddress","type":"address[5]"},{"internalType":"uint256[4]","name":"_attributes","type":"uint256[4]"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"acceptOfferNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[5]","name":"_tradeAddress","type":"address[5]"},{"internalType":"uint256[5]","name":"_attributes","type":"uint256[5]"}],"name":"auctionERC1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[5]","name":"_tradeAddress","type":"address[5]"},{"internalType":"uint256[4]","name":"_attributes","type":"uint256[4]"}],"name":"auctionNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[5]","name":"_tradeAddress","type":"address[5]"},{"internalType":"uint256[5]","name":"_attributes","type":"uint256[5]"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"buyERC1155ETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[5]","name":"_tradeAddress","type":"address[5]"},{"internalType":"uint256[5]","name":"_attributes","type":"uint256[5]"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"buyERC1155Normal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[5]","name":"_tradeAddress","type":"address[5]"},{"internalType":"uint256[4]","name":"_attributes","type":"uint256[4]"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"buyNFTETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[5]","name":"_tradeAddress","type":"address[5]"},{"internalType":"uint256[4]","name":"_attributes","type":"uint256[4]"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"buyNFTNormal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"setAdminAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_erc1155","type":"address"}],"name":"setERC1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_erc721","type":"address"}],"name":"setERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setWhitelistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200311138038062003111833981016040819052620000349162000115565b6200004862000042620000a4565b620000a8565b600180546001600160a01b03199081166001600160a01b039485161782556002805482169390941692909217909255336000818152600560205260409020805460ff19169093179092556003805490911690911790556200014c565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146200011057600080fd5b919050565b6000806040838503121562000128578182fd5b6200013383620000f8565b91506200014360208401620000f8565b90509250929050565b612fb5806200015c6000396000f3fe6080604052600436106101135760003560e01c8063715018a6116100a0578063e412304711610064578063e4123047146102b7578063f0f1d937146102d7578063f2fde38b146102f7578063f851a44014610317578063fb3f05841461032c57610113565b8063715018a614610245578063841eefcb1461025a5780638425abff1461026d5780638da5cb5b1461028257806397c0e0031461029757610113565b80632d255471116100e75780632d2554711461018d57806336a7abd3146101b8578063384e112a146101d85780633f914aef146101f8578063415665851461021857610113565b80625900c414610118578063094144a51461013a578063285d5d491461015a5780632c1e816d1461016d575b600080fd5b34801561012457600080fd5b5061013861013336600461275f565b61034c565b005b34801561014657600080fd5b506101386101553660046126ba565b61073f565b61013861016836600461275f565b6107a0565b34801561017957600080fd5b506101386101883660046126ba565b6109d4565b34801561019957600080fd5b506101a2610a35565b6040516101af91906129e8565b60405180910390f35b3480156101c457600080fd5b506101386101d33660046126ba565b610a44565b3480156101e457600080fd5b506101386101f33660046127f6565b610aa5565b34801561020457600080fd5b506101386102133660046126f2565b610d97565b34801561022457600080fd5b506102386102333660046126ba565b610e01565b6040516101af9190612aba565b34801561025157600080fd5b50610138610e16565b6101386102683660046127f6565b610e61565b34801561027957600080fd5b506101a2611074565b34801561028e57600080fd5b506101a2611083565b3480156102a357600080fd5b506101386102b23660046127f6565b611092565b3480156102c357600080fd5b506101386102d236600461272a565b6113e0565b3480156102e357600080fd5b506101386102f23660046127ca565b61178d565b34801561030357600080fd5b506101386103123660046126ba565b611a5f565b34801561032357600080fd5b506101a2611ad0565b34801561033857600080fd5b5061013861034736600461275f565b611adf565b8184848360003385858560405160200161036994939291906128d5565b604051602081830303815290604052805190602001209050600061038c82611d7d565b9050610396611083565b6001600160a01b03166103a98285611dad565b6001600160a01b0316146103d85760405162461bcd60e51b81526004016103cf90612c01565b60405180910390fd5b33600090815260046020908152604080832089845290915290205460ff16156104135760405162461bcd60e51b81526004016103cf90612d62565b3360009081526004602081815260408084208a8552825292839020805460ff19166001908117909155835180850185528e81528083018e90529054918d0151935163020604bf60e21b8152909330936001600160a01b039093169263081812fc9261047f929101612e8d565b60206040518083038186803b15801561049757600080fd5b505afa1580156104ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104cf91906126d6565b6001600160a01b0316146104f55760405162461bcd60e51b81526004016103cf90612d86565b602081015151815160408082015191519051636eb1769f60e11b81526001600160a01b039092169163dd62ed3e916105319130906004016129fc565b60206040518083038186803b15801561054957600080fd5b505afa15801561055d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105819190612865565b101561059f5760405162461bcd60e51b81526004016103cf90612cb4565b60008060006105b684600001518560200151611dd1565b925092509250816000146105f55783516105f59060005b60200201518551606081015190859060025b60200201516001600160a01b0316929190611e73565b801561061a57835161061a9060005b60200201518551608081015190849060026105df565b83516106359060005b602002015185513390869060026105df565b600154845160208082015191518188015190910151604051632142170760e11b81526001600160a01b03909416936342842e0e936106799390929091600401612a16565b600060405180830381600087803b15801561069357600080fd5b505af11580156106a7573d6000803e3d6000fd5b5050604080516060810190915233815286517f4085991e69330815d98dbc345ed9f93b3977fd35f64ef268b72d7248cc4d431d9350909150602082019060015b602090810291909101516001600160a01b039081168352885160409081015190911692820192909252878101519081015190519151610727939290612a72565b60405180910390a15050505050505050505050505050565b610747611ed1565b6001600160a01b0316610758611083565b6001600160a01b03161461077e5760405162461bcd60e51b81526004016103cf90612d2d565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b818484836000338585856040516020016107bd94939291906128d5565b60405160208183030381529060405280519060200120905060006107e082611d7d565b90506107ea611083565b6001600160a01b03166107fd8285611dad565b6001600160a01b0316146108235760405162461bcd60e51b81526004016103cf90612c01565b33600090815260046020908152604080832089845290915290205460ff161561085e5760405162461bcd60e51b81526004016103cf90612d62565b3360009081526004602090815260408083208984528252808320805460ff1916600117905580518082019091528c81529081018b90529080806108a18e8e611dd1565b925092509250816000146108c35783516108c39060035b602002015183611ed5565b80156108dd5783516108dd9060045b602002015182611ed5565b83516108f19060015b602002015184611ed5565b60015484516020908101518187015190910151604051632142170760e11b81526001600160a01b03909316926342842e0e92610934929091339190600401612a16565b600060405180830381600087803b15801561094e57600080fd5b505af1158015610962573d6000803e3d6000fd5b5050505060208401515134111561099557602084015161099590339060005b60200201516109909034612eed565b611ed5565b604080516060810190915233815284517f0e4cb43501fcdb341a36642903dbed4ff417d75ff624446c17e261aac89f8bb79190602082019060016106e7565b6109dc611ed1565b6001600160a01b03166109ed611083565b6001600160a01b031614610a135760405162461bcd60e51b81526004016103cf90612d2d565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031681565b610a4c611ed1565b6001600160a01b0316610a5d611083565b6001600160a01b031614610a835760405162461bcd60e51b81526004016103cf90612d2d565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b81848483600033858585604051602001610ac29493929190612938565b6040516020818303038152906040528051906020012090506000610ae582611d7d565b9050610aef611083565b6001600160a01b0316610b028285611dad565b6001600160a01b031614610b285760405162461bcd60e51b81526004016103cf90612c01565b33600090815260046020908152604080832089845290915290205460ff1615610b635760405162461bcd60e51b81526004016103cf90612d62565b3360008181526004602081815260408084208b8552825292839020805460ff19166001179055825180840184528e81529081018d90528c518e8401519351636eb1769f60e11b8152919490936001600160a01b03169263dd62ed3e92610bcc92913091016129fc565b60206040518083038186803b158015610be457600080fd5b505afa158015610bf8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1c9190612865565b1015610c3a5760405162461bcd60e51b81526004016103cf90612cb4565b6000806000610c5184600001518560200151611f67565b92509250925081600014610c6c578351610c6c9060006105cd565b8015610c7f578351610c7f906000610604565b8351610c9a90339060015b60200201518651869060026105df565b60025484516020908101518187015191820151608090920151604051637921219560e11b81526001600160a01b039094169363f242432a93610ce193923392600401612a3a565b600060405180830381600087803b158015610cfb57600080fd5b505af1158015610d0f573d6000803e3d6000fd5b5050604080516060810190915233815286517ff1f9c9bb54eb6a26630059bad988f745f23e629759d6aa0608a17c2ed62400839350909150602082019060015b602090810291909101516001600160a01b0390811683528851604001511691810191909152868101519081015181519091600460200201516040516107279493929190612a91565b610d9f611ed1565b6001600160a01b0316610db0611083565b6001600160a01b031614610dd65760405162461bcd60e51b81526004016103cf90612d2d565b6001600160a01b03919091166000908152600560205260409020805460ff1916911515919091179055565b60056020526000908152604090205460ff1681565b610e1e611ed1565b6001600160a01b0316610e2f611083565b6001600160a01b031614610e555760405162461bcd60e51b81526004016103cf90612d2d565b610e5f6000611feb565b565b81848483600033858585604051602001610e7e9493929190612938565b6040516020818303038152906040528051906020012090506000610ea182611d7d565b9050610eab611083565b6001600160a01b0316610ebe8285611dad565b6001600160a01b031614610ee45760405162461bcd60e51b81526004016103cf90612c01565b33600090815260046020908152604080832089845290915290205460ff1615610f1f5760405162461bcd60e51b81526004016103cf90612d62565b3360009081526004602090815260408083208984528252808320805460ff1916600117905580518082019091528c81529081018b9052908080610f628e8e611f67565b92509250925081600014610f7d578351610f7d9060036108b8565b8015610f90578351610f909060046108d2565b8351610f9d9060016108e6565b60025484516020908101518187015191820151608090920151604051637921219560e11b81526001600160a01b039094169363f242432a93610fe493923392600401612a3a565b600060405180830381600087803b158015610ffe57600080fd5b505af1158015611012573d6000803e3d6000fd5b505050506020840151513411156110355760208401516110359033906000610981565b604080516060810190915233815284517f9166c6e8b7ae4cc64f1dba7d4bb07fb1365594cb5586c835c5ee42d4e995c0dc919060208201906001610d4f565b6001546001600160a01b031681565b6000546001600160a01b031690565b818484836000338585856040516020016110af9493929190612938565b60405160208183030381529060405280519060200120905060006110d282611d7d565b90506110dc611083565b6001600160a01b03166110ef8285611dad565b6001600160a01b0316146111155760405162461bcd60e51b81526004016103cf90612c01565b33600090815260046020908152604080832089845290915290205460ff16156111505760405162461bcd60e51b81526004016103cf90612d62565b3360009081526004602081815260408084208a8552825292839020805460ff19166001179055825180840184528d81528082018d9052600254918e0151935163e985e9c560e01b815290936001600160a01b039092169263e985e9c5926111bb9290913091016129fc565b60206040518083038186803b1580156111d357600080fd5b505afa1580156111e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120b9190612849565b6112275760405162461bcd60e51b81526004016103cf90612d86565b602081015151815160408082015191519051636eb1769f60e11b81526001600160a01b039092169163dd62ed3e916112639130906004016129fc565b60206040518083038186803b15801561127b57600080fd5b505afa15801561128f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b39190612865565b10156112d15760405162461bcd60e51b81526004016103cf90612cb4565b60008060006112e884600001518560200151611f67565b925092509250816000146113035783516113039060006105cd565b8015611316578351611316906000610604565b8351611323906000610623565b600254845160208082015191518188015191820151608090920151604051637921219560e11b81526001600160a01b039095169463f242432a9461136e949093929091600401612a3a565b600060405180830381600087803b15801561138857600080fd5b505af115801561139c573d6000803e3d6000fd5b5050604080516060810190915233815286517fa82426dddeeb5eed3c287d3274ebee87a056c20c8f2241adc46d8177ad012f3d935090915060208201906001610d4f565b60408051808201825283815260208082018490523360009081526005909152919091205460ff1615156001146114285760405162461bcd60e51b81526004016103cf90612b84565b602081015151815160408082015191519051636eb1769f60e11b81526001600160a01b039092169163dd62ed3e916114649130906004016129fc565b60206040518083038186803b15801561147c57600080fd5b505afa158015611490573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b49190612865565b10156114d25760405162461bcd60e51b81526004016103cf90612cb4565b6003548151602001516001600160a01b03908116911614156115955760015460035460405163e985e9c560e01b81526001600160a01b039283169263e985e9c5926115249291169030906004016129fc565b60206040518083038186803b15801561153c57600080fd5b505afa158015611550573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115749190612849565b6115905760405162461bcd60e51b81526004016103cf90612d86565b611642565b600154602082810151015160405163020604bf60e21b815230926001600160a01b03169163081812fc916115cc9190600401612e8d565b60206040518083038186803b1580156115e457600080fd5b505afa1580156115f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161c91906126d6565b6001600160a01b0316146116425760405162461bcd60e51b81526004016103cf90612d86565b600080600061165984600001518560200151611dd1565b925092509250816000146116745783516116749060006105cd565b8015611687578351611687906000610604565b835161169e9060005b602002015185516001610c8a565b600154845160208082015191518188015190910151604051632142170760e11b81526001600160a01b03909416936342842e0e936116e29390929091600401612a16565b600060405180830381600087803b1580156116fc57600080fd5b505af1158015611710573d6000803e3d6000fd5b50506040805160608101825233815287516020908101516001600160a01b0390811682840152895184015116828401528089015190810151905192517fcd8f7eef42f2560ef5550d3bacc1d672e5d9d1fc3744b1b10e41531051407392955061177d945091929091612a72565b60405180910390a1505050505050565b60408051808201825283815260208082018490523360009081526005909152919091205460ff1615156001146117d55760405162461bcd60e51b81526004016103cf90612b84565b602081015151815160408082015191519051636eb1769f60e11b81526001600160a01b039092169163dd62ed3e916118119130906004016129fc565b60206040518083038186803b15801561182957600080fd5b505afa15801561183d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118619190612865565b101561187f5760405162461bcd60e51b81526004016103cf90612cb4565b60025481516020015160405163e985e9c560e01b81526001600160a01b039092169163e985e9c5916118b59130906004016129fc565b60206040518083038186803b1580156118cd57600080fd5b505afa1580156118e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119059190612849565b6119215760405162461bcd60e51b81526004016103cf90612d86565b600080600061193884600001518560200151611f67565b925092509250816000146119535783516119539060006105cd565b8015611966578351611966906000610604565b8351611973906000611690565b600254845160208082015191518188015191820151608090920151604051637921219560e11b81526001600160a01b039095169463f242432a946119be949093929091600401612a3a565b600060405180830381600087803b1580156119d857600080fd5b505af11580156119ec573d6000803e3d6000fd5b50506040805160608101825233815287516020908101516001600160a01b0390811682840152895184015116828401528089015190810151815160809092015193517f0de5d6ba7371cfff4dde12ead6f48ab1c05df6d65d37aceb1184bfe0015ab8df965061177d955092939092612a91565b611a67611ed1565b6001600160a01b0316611a78611083565b6001600160a01b031614611a9e5760405162461bcd60e51b81526004016103cf90612d2d565b6001600160a01b038116611ac45760405162461bcd60e51b81526004016103cf90612bbb565b611acd81611feb565b50565b6003546001600160a01b031681565b81848483600033858585604051602001611afc94939291906128d5565b6040516020818303038152906040528051906020012090506000611b1f82611d7d565b9050611b29611083565b6001600160a01b0316611b3c8285611dad565b6001600160a01b031614611b625760405162461bcd60e51b81526004016103cf90612c01565b33600090815260046020908152604080832089845290915290205460ff1615611b9d5760405162461bcd60e51b81526004016103cf90612d62565b3360008181526004602081815260408084208b8552825292839020805460ff19166001179055825180840184528e81529081018d90528c518e8401519351636eb1769f60e11b8152919490936001600160a01b03169263dd62ed3e92611c0692913091016129fc565b60206040518083038186803b158015611c1e57600080fd5b505afa158015611c32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c569190612865565b1015611c745760405162461bcd60e51b81526004016103cf90612cb4565b6000806000611c8b84600001518560200151611dd1565b92509250925081600014611ca6578351611ca69060006105cd565b8015611cb9578351611cb9906000610604565b8351611cc89033906001610c8a565b60015484516020908101518187015190910151604051632142170760e11b81526001600160a01b03909316926342842e0e92611d0b929091339190600401612a16565b600060405180830381600087803b158015611d2557600080fd5b505af1158015611d39573d6000803e3d6000fd5b5050604080516060810190915233815286517f47525166a98ecafd898e3fe0e0babcece7be6bf0737681ee59a30f64c49ab58f9350909150602082019060016106e7565b600081604051602001611d9091906129b7565b604051602081830303815290604052805190602001209050919050565b6000806000611dbc858561203b565b91509150611dc9816120ab565b509392505050565b60008080808086600360200201516001600160a01b031614611e2357611e146103e8611e0e8760025b60200201518860005b6020020151906121d8565b906121eb565b9250611e208382612e96565b90505b60808601516001600160a01b031615611e5657611e476103e8611e0e876003611dfa565b9150611e538282612e96565b90505b611e69818660005b6020020151906121f7565b9350509250925092565b611ecb846323b872dd60e01b858585604051602401611e9493929190612a16565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612203565b50505050565b3390565b604080516000808252602082019092526001600160a01b038416908390604051611eff919061299b565b60006040518083038185875af1925050503d8060008114611f3c576040519150601f19603f3d011682016040523d82523d6000602084013e611f41565b606091505b5050905080611f625760405162461bcd60e51b81526004016103cf90612e00565b505050565b60008080808086600360200201516001600160a01b031614611fac57611f9d6103e8611e0e8760025b6020020151886000611e03565b9250611fa98382612e96565b90505b60808601516001600160a01b031615611fdf57611fd06103e8611e0e876003611f90565b9150611fdc8282612e96565b90505b611e6981866000611e5e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000808251604114156120725760208301516040840151606085015160001a61206687828585612292565b945094505050506120a4565b82516040141561209c5760208301516040840151612091868383612372565b9350935050506120a4565b506000905060025b9250929050565b60008160048111156120cd57634e487b7160e01b600052602160045260246000fd5b14156120d857611acd565b60018160048111156120fa57634e487b7160e01b600052602160045260246000fd5b14156121185760405162461bcd60e51b81526004016103cf90612b16565b600281600481111561213a57634e487b7160e01b600052602160045260246000fd5b14156121585760405162461bcd60e51b81526004016103cf90612b4d565b600381600481111561217a57634e487b7160e01b600052602160045260246000fd5b14156121985760405162461bcd60e51b81526004016103cf90612c2c565b60048160048111156121ba57634e487b7160e01b600052602160045260246000fd5b1415611acd5760405162461bcd60e51b81526004016103cf90612ceb565b60006121e48284612ece565b9392505050565b60006121e48284612eae565b60006121e48284612eed565b6000612258826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166123ab9092919063ffffffff16565b805190915015611f6257808060200190518101906122769190612849565b611f625760405162461bcd60e51b81526004016103cf90612e43565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156122c95750600090506003612369565b8460ff16601b141580156122e157508460ff16601c14155b156122f25750600090506004612369565b6000600187878787604051600081526020016040526040516123179493929190612ac5565b6020604051602081039080840390855afa158015612339573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661236257600060019250925050612369565b9150600090505b94509492505050565b6000806001600160ff1b0383168161238f60ff86901c601b612e96565b905061239d87828885612292565b935093505050935093915050565b60606123ba84846000856123c2565b949350505050565b6060824710156123e45760405162461bcd60e51b81526004016103cf90612c6e565b6123ed85612482565b6124095760405162461bcd60e51b81526004016103cf90612dc9565b600080866001600160a01b03168587604051612425919061299b565b60006040518083038185875af1925050503d8060008114612462576040519150601f19603f3d011682016040523d82523d6000602084013e612467565b606091505b50915091506124778282866124b3565b979650505050505050565b600080826001600160a01b0316803b806020016040519081016040528181526000908060200190933c511192915050565b606083156124c25750816121e4565b8251156124d25782518084602001fd5b8160405162461bcd60e51b81526004016103cf9190612ae3565b600082601f8301126124fc578081fd5b60405160a0810181811067ffffffffffffffff8211171561251f5761251f612f46565b604052808360a08101861015612533578384fd5b835b600581101561255e57813561254981612f5c565b83526020928301929190910190600101612535565b509195945050505050565b600082601f830112612579578081fd5b6040516080810181811067ffffffffffffffff8211171561259c5761259c612f46565b6040528083608081018610156125b0578384fd5b835b600481101561255e5781358352602092830192909101906001016125b2565b600082601f8301126125e1578081fd5b60405160a0810181811067ffffffffffffffff8211171561260457612604612f46565b604052808360a08101861015612618578384fd5b835b600581101561255e57813583526020928301929091019060010161261a565b600082601f830112612649578081fd5b813567ffffffffffffffff8082111561266457612664612f46565b604051601f8301601f19168101602001828111828210171561268857612688612f46565b60405282815284830160200186101561269f578384fd5b82602086016020830137918201602001929092529392505050565b6000602082840312156126cb578081fd5b81356121e481612f5c565b6000602082840312156126e7578081fd5b81516121e481612f5c565b60008060408385031215612704578081fd5b823561270f81612f5c565b9150602083013561271f81612f71565b809150509250929050565b600080610120838503121561273d578182fd5b61274784846124ec565b91506127568460a08501612569565b90509250929050565b6000806000806101608587031215612775578182fd5b61277f86866124ec565b935061278e8660a08701612569565b9250610120850135915061014085013567ffffffffffffffff8111156127b2578182fd5b6127be87828801612639565b91505092959194509250565b60008061014083850312156127dd578182fd5b6127e784846124ec565b91506127568460a085016125d1565b600080600080610180858703121561280c578384fd5b61281686866124ec565b93506128258660a087016125d1565b9250610140850135915061016085013567ffffffffffffffff8111156127b2578182fd5b60006020828403121561285a578081fd5b81516121e481612f71565b600060208284031215612876578081fd5b5051919050565b8060005b6003811015611ecb5781516001600160a01b0316845260209384019390910190600101612881565b8060005b6005811015611ecb5781516001600160a01b03168452602093840193909101906001016128ad565b60006bffffffffffffffffffffffff198660601b1682528460148301526128ff60348301856128a9565b60d4820183825b6004811015612925578151835260209283019290910190600101612906565b5050506101548201905095945050505050565b60006bffffffffffffffffffffffff198660601b16825284601483015261296260348301856128a9565b60d4820183825b6005811015612988578151835260209283019290910190600101612969565b5050506101748201905095945050505050565b600082516129ad818460208701612f04565b9190910192915050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b60a08101612a80828661287d565b606082019390935260800152919050565b60c08101612a9f828761287d565b8460608301528360808301528260a083015295945050505050565b901515815260200190565b93845260ff9290921660208401526040830152606082015260800190565b6000602082528251806020840152612b02816040850160208701612f04565b601f01601f19169190910160400192915050565b60208082526018908201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604082015260600190565b6020808252601f908201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604082015260600190565b6020808252601b908201527f41646472657373206973206e6f7420696e2077686974656c6973740000000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b602080825260119082015270496e76616c6964207369676e617475726560781b604082015260600190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604082015261756560f01b606082015260800190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b60208082526017908201527f746f6b656e20616c6c6f77616e636520746f6f206c6f77000000000000000000604082015260600190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604082015261756560f01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600a908201526955736564206e6f6e636560b01b604082015260600190565b60208082526023908201527f746f6b656e496420646f206e6f7420617070726f766520666f7220636f6e74726040820152621858dd60ea1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526023908201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960408201526213115160ea1b606082015260800190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b90815260200190565b60008219821115612ea957612ea9612f30565b500190565b600082612ec957634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615612ee857612ee8612f30565b500290565b600082821015612eff57612eff612f30565b500390565b60005b83811015612f1f578181015183820152602001612f07565b83811115611ecb5750506000910152565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611acd57600080fd5b8015158114611acd57600080fdfea2646970667358221220a1380b40333cb10978403b2aa02f2d57a020c3e9fffdf4c9ea64568f3c4a346c64736f6c634300080000330000000000000000000000008b27337fadacbed85343de06cf9eec70736cb838000000000000000000000000b2268bfa40cdace4a4b25d12a7d76f210b1c2dbb
Deployed Bytecode
0x6080604052600436106101135760003560e01c8063715018a6116100a0578063e412304711610064578063e4123047146102b7578063f0f1d937146102d7578063f2fde38b146102f7578063f851a44014610317578063fb3f05841461032c57610113565b8063715018a614610245578063841eefcb1461025a5780638425abff1461026d5780638da5cb5b1461028257806397c0e0031461029757610113565b80632d255471116100e75780632d2554711461018d57806336a7abd3146101b8578063384e112a146101d85780633f914aef146101f8578063415665851461021857610113565b80625900c414610118578063094144a51461013a578063285d5d491461015a5780632c1e816d1461016d575b600080fd5b34801561012457600080fd5b5061013861013336600461275f565b61034c565b005b34801561014657600080fd5b506101386101553660046126ba565b61073f565b61013861016836600461275f565b6107a0565b34801561017957600080fd5b506101386101883660046126ba565b6109d4565b34801561019957600080fd5b506101a2610a35565b6040516101af91906129e8565b60405180910390f35b3480156101c457600080fd5b506101386101d33660046126ba565b610a44565b3480156101e457600080fd5b506101386101f33660046127f6565b610aa5565b34801561020457600080fd5b506101386102133660046126f2565b610d97565b34801561022457600080fd5b506102386102333660046126ba565b610e01565b6040516101af9190612aba565b34801561025157600080fd5b50610138610e16565b6101386102683660046127f6565b610e61565b34801561027957600080fd5b506101a2611074565b34801561028e57600080fd5b506101a2611083565b3480156102a357600080fd5b506101386102b23660046127f6565b611092565b3480156102c357600080fd5b506101386102d236600461272a565b6113e0565b3480156102e357600080fd5b506101386102f23660046127ca565b61178d565b34801561030357600080fd5b506101386103123660046126ba565b611a5f565b34801561032357600080fd5b506101a2611ad0565b34801561033857600080fd5b5061013861034736600461275f565b611adf565b8184848360003385858560405160200161036994939291906128d5565b604051602081830303815290604052805190602001209050600061038c82611d7d565b9050610396611083565b6001600160a01b03166103a98285611dad565b6001600160a01b0316146103d85760405162461bcd60e51b81526004016103cf90612c01565b60405180910390fd5b33600090815260046020908152604080832089845290915290205460ff16156104135760405162461bcd60e51b81526004016103cf90612d62565b3360009081526004602081815260408084208a8552825292839020805460ff19166001908117909155835180850185528e81528083018e90529054918d0151935163020604bf60e21b8152909330936001600160a01b039093169263081812fc9261047f929101612e8d565b60206040518083038186803b15801561049757600080fd5b505afa1580156104ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104cf91906126d6565b6001600160a01b0316146104f55760405162461bcd60e51b81526004016103cf90612d86565b602081015151815160408082015191519051636eb1769f60e11b81526001600160a01b039092169163dd62ed3e916105319130906004016129fc565b60206040518083038186803b15801561054957600080fd5b505afa15801561055d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105819190612865565b101561059f5760405162461bcd60e51b81526004016103cf90612cb4565b60008060006105b684600001518560200151611dd1565b925092509250816000146105f55783516105f59060005b60200201518551606081015190859060025b60200201516001600160a01b0316929190611e73565b801561061a57835161061a9060005b60200201518551608081015190849060026105df565b83516106359060005b602002015185513390869060026105df565b600154845160208082015191518188015190910151604051632142170760e11b81526001600160a01b03909416936342842e0e936106799390929091600401612a16565b600060405180830381600087803b15801561069357600080fd5b505af11580156106a7573d6000803e3d6000fd5b5050604080516060810190915233815286517f4085991e69330815d98dbc345ed9f93b3977fd35f64ef268b72d7248cc4d431d9350909150602082019060015b602090810291909101516001600160a01b039081168352885160409081015190911692820192909252878101519081015190519151610727939290612a72565b60405180910390a15050505050505050505050505050565b610747611ed1565b6001600160a01b0316610758611083565b6001600160a01b03161461077e5760405162461bcd60e51b81526004016103cf90612d2d565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b818484836000338585856040516020016107bd94939291906128d5565b60405160208183030381529060405280519060200120905060006107e082611d7d565b90506107ea611083565b6001600160a01b03166107fd8285611dad565b6001600160a01b0316146108235760405162461bcd60e51b81526004016103cf90612c01565b33600090815260046020908152604080832089845290915290205460ff161561085e5760405162461bcd60e51b81526004016103cf90612d62565b3360009081526004602090815260408083208984528252808320805460ff1916600117905580518082019091528c81529081018b90529080806108a18e8e611dd1565b925092509250816000146108c35783516108c39060035b602002015183611ed5565b80156108dd5783516108dd9060045b602002015182611ed5565b83516108f19060015b602002015184611ed5565b60015484516020908101518187015190910151604051632142170760e11b81526001600160a01b03909316926342842e0e92610934929091339190600401612a16565b600060405180830381600087803b15801561094e57600080fd5b505af1158015610962573d6000803e3d6000fd5b5050505060208401515134111561099557602084015161099590339060005b60200201516109909034612eed565b611ed5565b604080516060810190915233815284517f0e4cb43501fcdb341a36642903dbed4ff417d75ff624446c17e261aac89f8bb79190602082019060016106e7565b6109dc611ed1565b6001600160a01b03166109ed611083565b6001600160a01b031614610a135760405162461bcd60e51b81526004016103cf90612d2d565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031681565b610a4c611ed1565b6001600160a01b0316610a5d611083565b6001600160a01b031614610a835760405162461bcd60e51b81526004016103cf90612d2d565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b81848483600033858585604051602001610ac29493929190612938565b6040516020818303038152906040528051906020012090506000610ae582611d7d565b9050610aef611083565b6001600160a01b0316610b028285611dad565b6001600160a01b031614610b285760405162461bcd60e51b81526004016103cf90612c01565b33600090815260046020908152604080832089845290915290205460ff1615610b635760405162461bcd60e51b81526004016103cf90612d62565b3360008181526004602081815260408084208b8552825292839020805460ff19166001179055825180840184528e81529081018d90528c518e8401519351636eb1769f60e11b8152919490936001600160a01b03169263dd62ed3e92610bcc92913091016129fc565b60206040518083038186803b158015610be457600080fd5b505afa158015610bf8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1c9190612865565b1015610c3a5760405162461bcd60e51b81526004016103cf90612cb4565b6000806000610c5184600001518560200151611f67565b92509250925081600014610c6c578351610c6c9060006105cd565b8015610c7f578351610c7f906000610604565b8351610c9a90339060015b60200201518651869060026105df565b60025484516020908101518187015191820151608090920151604051637921219560e11b81526001600160a01b039094169363f242432a93610ce193923392600401612a3a565b600060405180830381600087803b158015610cfb57600080fd5b505af1158015610d0f573d6000803e3d6000fd5b5050604080516060810190915233815286517ff1f9c9bb54eb6a26630059bad988f745f23e629759d6aa0608a17c2ed62400839350909150602082019060015b602090810291909101516001600160a01b0390811683528851604001511691810191909152868101519081015181519091600460200201516040516107279493929190612a91565b610d9f611ed1565b6001600160a01b0316610db0611083565b6001600160a01b031614610dd65760405162461bcd60e51b81526004016103cf90612d2d565b6001600160a01b03919091166000908152600560205260409020805460ff1916911515919091179055565b60056020526000908152604090205460ff1681565b610e1e611ed1565b6001600160a01b0316610e2f611083565b6001600160a01b031614610e555760405162461bcd60e51b81526004016103cf90612d2d565b610e5f6000611feb565b565b81848483600033858585604051602001610e7e9493929190612938565b6040516020818303038152906040528051906020012090506000610ea182611d7d565b9050610eab611083565b6001600160a01b0316610ebe8285611dad565b6001600160a01b031614610ee45760405162461bcd60e51b81526004016103cf90612c01565b33600090815260046020908152604080832089845290915290205460ff1615610f1f5760405162461bcd60e51b81526004016103cf90612d62565b3360009081526004602090815260408083208984528252808320805460ff1916600117905580518082019091528c81529081018b9052908080610f628e8e611f67565b92509250925081600014610f7d578351610f7d9060036108b8565b8015610f90578351610f909060046108d2565b8351610f9d9060016108e6565b60025484516020908101518187015191820151608090920151604051637921219560e11b81526001600160a01b039094169363f242432a93610fe493923392600401612a3a565b600060405180830381600087803b158015610ffe57600080fd5b505af1158015611012573d6000803e3d6000fd5b505050506020840151513411156110355760208401516110359033906000610981565b604080516060810190915233815284517f9166c6e8b7ae4cc64f1dba7d4bb07fb1365594cb5586c835c5ee42d4e995c0dc919060208201906001610d4f565b6001546001600160a01b031681565b6000546001600160a01b031690565b818484836000338585856040516020016110af9493929190612938565b60405160208183030381529060405280519060200120905060006110d282611d7d565b90506110dc611083565b6001600160a01b03166110ef8285611dad565b6001600160a01b0316146111155760405162461bcd60e51b81526004016103cf90612c01565b33600090815260046020908152604080832089845290915290205460ff16156111505760405162461bcd60e51b81526004016103cf90612d62565b3360009081526004602081815260408084208a8552825292839020805460ff19166001179055825180840184528d81528082018d9052600254918e0151935163e985e9c560e01b815290936001600160a01b039092169263e985e9c5926111bb9290913091016129fc565b60206040518083038186803b1580156111d357600080fd5b505afa1580156111e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120b9190612849565b6112275760405162461bcd60e51b81526004016103cf90612d86565b602081015151815160408082015191519051636eb1769f60e11b81526001600160a01b039092169163dd62ed3e916112639130906004016129fc565b60206040518083038186803b15801561127b57600080fd5b505afa15801561128f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b39190612865565b10156112d15760405162461bcd60e51b81526004016103cf90612cb4565b60008060006112e884600001518560200151611f67565b925092509250816000146113035783516113039060006105cd565b8015611316578351611316906000610604565b8351611323906000610623565b600254845160208082015191518188015191820151608090920151604051637921219560e11b81526001600160a01b039095169463f242432a9461136e949093929091600401612a3a565b600060405180830381600087803b15801561138857600080fd5b505af115801561139c573d6000803e3d6000fd5b5050604080516060810190915233815286517fa82426dddeeb5eed3c287d3274ebee87a056c20c8f2241adc46d8177ad012f3d935090915060208201906001610d4f565b60408051808201825283815260208082018490523360009081526005909152919091205460ff1615156001146114285760405162461bcd60e51b81526004016103cf90612b84565b602081015151815160408082015191519051636eb1769f60e11b81526001600160a01b039092169163dd62ed3e916114649130906004016129fc565b60206040518083038186803b15801561147c57600080fd5b505afa158015611490573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b49190612865565b10156114d25760405162461bcd60e51b81526004016103cf90612cb4565b6003548151602001516001600160a01b03908116911614156115955760015460035460405163e985e9c560e01b81526001600160a01b039283169263e985e9c5926115249291169030906004016129fc565b60206040518083038186803b15801561153c57600080fd5b505afa158015611550573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115749190612849565b6115905760405162461bcd60e51b81526004016103cf90612d86565b611642565b600154602082810151015160405163020604bf60e21b815230926001600160a01b03169163081812fc916115cc9190600401612e8d565b60206040518083038186803b1580156115e457600080fd5b505afa1580156115f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161c91906126d6565b6001600160a01b0316146116425760405162461bcd60e51b81526004016103cf90612d86565b600080600061165984600001518560200151611dd1565b925092509250816000146116745783516116749060006105cd565b8015611687578351611687906000610604565b835161169e9060005b602002015185516001610c8a565b600154845160208082015191518188015190910151604051632142170760e11b81526001600160a01b03909416936342842e0e936116e29390929091600401612a16565b600060405180830381600087803b1580156116fc57600080fd5b505af1158015611710573d6000803e3d6000fd5b50506040805160608101825233815287516020908101516001600160a01b0390811682840152895184015116828401528089015190810151905192517fcd8f7eef42f2560ef5550d3bacc1d672e5d9d1fc3744b1b10e41531051407392955061177d945091929091612a72565b60405180910390a1505050505050565b60408051808201825283815260208082018490523360009081526005909152919091205460ff1615156001146117d55760405162461bcd60e51b81526004016103cf90612b84565b602081015151815160408082015191519051636eb1769f60e11b81526001600160a01b039092169163dd62ed3e916118119130906004016129fc565b60206040518083038186803b15801561182957600080fd5b505afa15801561183d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118619190612865565b101561187f5760405162461bcd60e51b81526004016103cf90612cb4565b60025481516020015160405163e985e9c560e01b81526001600160a01b039092169163e985e9c5916118b59130906004016129fc565b60206040518083038186803b1580156118cd57600080fd5b505afa1580156118e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119059190612849565b6119215760405162461bcd60e51b81526004016103cf90612d86565b600080600061193884600001518560200151611f67565b925092509250816000146119535783516119539060006105cd565b8015611966578351611966906000610604565b8351611973906000611690565b600254845160208082015191518188015191820151608090920151604051637921219560e11b81526001600160a01b039095169463f242432a946119be949093929091600401612a3a565b600060405180830381600087803b1580156119d857600080fd5b505af11580156119ec573d6000803e3d6000fd5b50506040805160608101825233815287516020908101516001600160a01b0390811682840152895184015116828401528089015190810151815160809092015193517f0de5d6ba7371cfff4dde12ead6f48ab1c05df6d65d37aceb1184bfe0015ab8df965061177d955092939092612a91565b611a67611ed1565b6001600160a01b0316611a78611083565b6001600160a01b031614611a9e5760405162461bcd60e51b81526004016103cf90612d2d565b6001600160a01b038116611ac45760405162461bcd60e51b81526004016103cf90612bbb565b611acd81611feb565b50565b6003546001600160a01b031681565b81848483600033858585604051602001611afc94939291906128d5565b6040516020818303038152906040528051906020012090506000611b1f82611d7d565b9050611b29611083565b6001600160a01b0316611b3c8285611dad565b6001600160a01b031614611b625760405162461bcd60e51b81526004016103cf90612c01565b33600090815260046020908152604080832089845290915290205460ff1615611b9d5760405162461bcd60e51b81526004016103cf90612d62565b3360008181526004602081815260408084208b8552825292839020805460ff19166001179055825180840184528e81529081018d90528c518e8401519351636eb1769f60e11b8152919490936001600160a01b03169263dd62ed3e92611c0692913091016129fc565b60206040518083038186803b158015611c1e57600080fd5b505afa158015611c32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c569190612865565b1015611c745760405162461bcd60e51b81526004016103cf90612cb4565b6000806000611c8b84600001518560200151611dd1565b92509250925081600014611ca6578351611ca69060006105cd565b8015611cb9578351611cb9906000610604565b8351611cc89033906001610c8a565b60015484516020908101518187015190910151604051632142170760e11b81526001600160a01b03909316926342842e0e92611d0b929091339190600401612a16565b600060405180830381600087803b158015611d2557600080fd5b505af1158015611d39573d6000803e3d6000fd5b5050604080516060810190915233815286517f47525166a98ecafd898e3fe0e0babcece7be6bf0737681ee59a30f64c49ab58f9350909150602082019060016106e7565b600081604051602001611d9091906129b7565b604051602081830303815290604052805190602001209050919050565b6000806000611dbc858561203b565b91509150611dc9816120ab565b509392505050565b60008080808086600360200201516001600160a01b031614611e2357611e146103e8611e0e8760025b60200201518860005b6020020151906121d8565b906121eb565b9250611e208382612e96565b90505b60808601516001600160a01b031615611e5657611e476103e8611e0e876003611dfa565b9150611e538282612e96565b90505b611e69818660005b6020020151906121f7565b9350509250925092565b611ecb846323b872dd60e01b858585604051602401611e9493929190612a16565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612203565b50505050565b3390565b604080516000808252602082019092526001600160a01b038416908390604051611eff919061299b565b60006040518083038185875af1925050503d8060008114611f3c576040519150601f19603f3d011682016040523d82523d6000602084013e611f41565b606091505b5050905080611f625760405162461bcd60e51b81526004016103cf90612e00565b505050565b60008080808086600360200201516001600160a01b031614611fac57611f9d6103e8611e0e8760025b6020020151886000611e03565b9250611fa98382612e96565b90505b60808601516001600160a01b031615611fdf57611fd06103e8611e0e876003611f90565b9150611fdc8282612e96565b90505b611e6981866000611e5e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000808251604114156120725760208301516040840151606085015160001a61206687828585612292565b945094505050506120a4565b82516040141561209c5760208301516040840151612091868383612372565b9350935050506120a4565b506000905060025b9250929050565b60008160048111156120cd57634e487b7160e01b600052602160045260246000fd5b14156120d857611acd565b60018160048111156120fa57634e487b7160e01b600052602160045260246000fd5b14156121185760405162461bcd60e51b81526004016103cf90612b16565b600281600481111561213a57634e487b7160e01b600052602160045260246000fd5b14156121585760405162461bcd60e51b81526004016103cf90612b4d565b600381600481111561217a57634e487b7160e01b600052602160045260246000fd5b14156121985760405162461bcd60e51b81526004016103cf90612c2c565b60048160048111156121ba57634e487b7160e01b600052602160045260246000fd5b1415611acd5760405162461bcd60e51b81526004016103cf90612ceb565b60006121e48284612ece565b9392505050565b60006121e48284612eae565b60006121e48284612eed565b6000612258826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166123ab9092919063ffffffff16565b805190915015611f6257808060200190518101906122769190612849565b611f625760405162461bcd60e51b81526004016103cf90612e43565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156122c95750600090506003612369565b8460ff16601b141580156122e157508460ff16601c14155b156122f25750600090506004612369565b6000600187878787604051600081526020016040526040516123179493929190612ac5565b6020604051602081039080840390855afa158015612339573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661236257600060019250925050612369565b9150600090505b94509492505050565b6000806001600160ff1b0383168161238f60ff86901c601b612e96565b905061239d87828885612292565b935093505050935093915050565b60606123ba84846000856123c2565b949350505050565b6060824710156123e45760405162461bcd60e51b81526004016103cf90612c6e565b6123ed85612482565b6124095760405162461bcd60e51b81526004016103cf90612dc9565b600080866001600160a01b03168587604051612425919061299b565b60006040518083038185875af1925050503d8060008114612462576040519150601f19603f3d011682016040523d82523d6000602084013e612467565b606091505b50915091506124778282866124b3565b979650505050505050565b600080826001600160a01b0316803b806020016040519081016040528181526000908060200190933c511192915050565b606083156124c25750816121e4565b8251156124d25782518084602001fd5b8160405162461bcd60e51b81526004016103cf9190612ae3565b600082601f8301126124fc578081fd5b60405160a0810181811067ffffffffffffffff8211171561251f5761251f612f46565b604052808360a08101861015612533578384fd5b835b600581101561255e57813561254981612f5c565b83526020928301929190910190600101612535565b509195945050505050565b600082601f830112612579578081fd5b6040516080810181811067ffffffffffffffff8211171561259c5761259c612f46565b6040528083608081018610156125b0578384fd5b835b600481101561255e5781358352602092830192909101906001016125b2565b600082601f8301126125e1578081fd5b60405160a0810181811067ffffffffffffffff8211171561260457612604612f46565b604052808360a08101861015612618578384fd5b835b600581101561255e57813583526020928301929091019060010161261a565b600082601f830112612649578081fd5b813567ffffffffffffffff8082111561266457612664612f46565b604051601f8301601f19168101602001828111828210171561268857612688612f46565b60405282815284830160200186101561269f578384fd5b82602086016020830137918201602001929092529392505050565b6000602082840312156126cb578081fd5b81356121e481612f5c565b6000602082840312156126e7578081fd5b81516121e481612f5c565b60008060408385031215612704578081fd5b823561270f81612f5c565b9150602083013561271f81612f71565b809150509250929050565b600080610120838503121561273d578182fd5b61274784846124ec565b91506127568460a08501612569565b90509250929050565b6000806000806101608587031215612775578182fd5b61277f86866124ec565b935061278e8660a08701612569565b9250610120850135915061014085013567ffffffffffffffff8111156127b2578182fd5b6127be87828801612639565b91505092959194509250565b60008061014083850312156127dd578182fd5b6127e784846124ec565b91506127568460a085016125d1565b600080600080610180858703121561280c578384fd5b61281686866124ec565b93506128258660a087016125d1565b9250610140850135915061016085013567ffffffffffffffff8111156127b2578182fd5b60006020828403121561285a578081fd5b81516121e481612f71565b600060208284031215612876578081fd5b5051919050565b8060005b6003811015611ecb5781516001600160a01b0316845260209384019390910190600101612881565b8060005b6005811015611ecb5781516001600160a01b03168452602093840193909101906001016128ad565b60006bffffffffffffffffffffffff198660601b1682528460148301526128ff60348301856128a9565b60d4820183825b6004811015612925578151835260209283019290910190600101612906565b5050506101548201905095945050505050565b60006bffffffffffffffffffffffff198660601b16825284601483015261296260348301856128a9565b60d4820183825b6005811015612988578151835260209283019290910190600101612969565b5050506101748201905095945050505050565b600082516129ad818460208701612f04565b9190910192915050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b60a08101612a80828661287d565b606082019390935260800152919050565b60c08101612a9f828761287d565b8460608301528360808301528260a083015295945050505050565b901515815260200190565b93845260ff9290921660208401526040830152606082015260800190565b6000602082528251806020840152612b02816040850160208701612f04565b601f01601f19169190910160400192915050565b60208082526018908201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604082015260600190565b6020808252601f908201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604082015260600190565b6020808252601b908201527f41646472657373206973206e6f7420696e2077686974656c6973740000000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b602080825260119082015270496e76616c6964207369676e617475726560781b604082015260600190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604082015261756560f01b606082015260800190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b60208082526017908201527f746f6b656e20616c6c6f77616e636520746f6f206c6f77000000000000000000604082015260600190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604082015261756560f01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600a908201526955736564206e6f6e636560b01b604082015260600190565b60208082526023908201527f746f6b656e496420646f206e6f7420617070726f766520666f7220636f6e74726040820152621858dd60ea1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526023908201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960408201526213115160ea1b606082015260800190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b90815260200190565b60008219821115612ea957612ea9612f30565b500190565b600082612ec957634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615612ee857612ee8612f30565b500290565b600082821015612eff57612eff612f30565b500390565b60005b83811015612f1f578181015183820152602001612f07565b83811115611ecb5750506000910152565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611acd57600080fd5b8015158114611acd57600080fdfea2646970667358221220a1380b40333cb10978403b2aa02f2d57a020c3e9fffdf4c9ea64568f3c4a346c64736f6c63430008000033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000008b27337fadacbed85343de06cf9eec70736cb838000000000000000000000000b2268bfa40cdace4a4b25d12a7d76f210b1c2dbb
-----Decoded View---------------
Arg [0] : _erc721 (address): 0x8b27337fADaCBEd85343de06cF9Eec70736cb838
Arg [1] : _erc1155 (address): 0xB2268bFA40CdacE4a4B25D12A7D76f210B1c2dbb
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000008b27337fadacbed85343de06cf9eec70736cb838
Arg [1] : 000000000000000000000000b2268bfa40cdace4a4b25d12a7d76f210b1c2dbb
Deployed Bytecode Sourcemap
63060:23055:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73283:2144;;;;;;;;;;-1:-1:-1;73283:2144:0;;;;;:::i;:::-;;:::i;:::-;;64758:88;;;;;;;;;;-1:-1:-1;64758:88:0;;;;;:::i;:::-;;:::i;68943:1574::-;;;;;;:::i;:::-;;:::i;65120:91::-;;;;;;;;;;-1:-1:-1;65120:91:0;;;;;:::i;:::-;;:::i;63279:22::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64854:92;;;;;;;;;;-1:-1:-1;64854:92:0;;;;;:::i;:::-;;:::i;77259:2040::-;;;;;;;;;;-1:-1:-1;77259:2040:0;;;;;:::i;:::-;;:::i;64954:158::-;;;;;;;;;;-1:-1:-1;64954:158:0;;;;;:::i;:::-;;:::i;63517:48::-;;;;;;;;;;-1:-1:-1;63517:48:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;18150:103::-;;;;;;;;;;;;;:::i;79474:1705::-;;;;;;:::i;:::-;;:::i;63224:21::-;;;;;;;;;;;;;:::i;17499:87::-;;;;;;;;;;;;;:::i;81347:2282::-;;;;;;;;;;-1:-1:-1;81347:2282:0;;;;;:::i;:::-;;:::i;70666:2456::-;;;;;;;;;;-1:-1:-1;70666:2456:0;;;;;:::i;:::-;;:::i;83785:2327::-;;;;;;;;;;-1:-1:-1;83785:2327:0;;;;;:::i;:::-;;:::i;18408:201::-;;;;;;;;;;-1:-1:-1;18408:201:0;;;;;:::i;:::-;;:::i;63352:20::-;;;;;;;;;;;;;:::i;66875:1909::-;;;;;;;;;;-1:-1:-1;66875:1909:0;;;;;:::i;:::-;;:::i;73283:2144::-;73478:5;73485:13;73500:11;73513:9;65476:12;65550:10;65579:5;65603:13;65635:11;65515:146;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65491:181;;;;;;65476:196;;65683:19;65705:29;:4;:27;:29::i;:::-;65683:51;;65858:7;:5;:7::i;:::-;-1:-1:-1;;;;;65824:41:0;:30;:11;65844:9;65824:19;:30::i;:::-;-1:-1:-1;;;;;65824:41:0;;65816:71;;;;-1:-1:-1;;;65816:71:0;;;;;;;:::i;:::-;;;;;;;;;65918:10;65907:22;;;;:10;:22;;;;;;;;:29;;;;;;;;;;;65906:30;65898:53;;;;-1:-1:-1;;;65898:53:0;;;;;;;:::i;:::-;65973:10;65962:22;;;;:10;:22;;;;;;;;:29;;;;;;;;;:36;;-1:-1:-1;;65962:36:0;65994:4;65962:36;;;;;;73559:97;;;;::::1;::::0;;;;;;;::::1;::::0;;;73699:6;;73719:23;;::::1;::::0;73691:52;;-1:-1:-1;;;73691:52:0;;73559:97;;73755:4:::1;::::0;-1:-1:-1;;;;;73699:6:0;;::::1;::::0;73691:27:::1;::::0;:52:::1;::::0;73719:23;73691:52:::1;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;73691:69:0::1;;73669:154;;;;-1:-1:-1::0;;;73669:154:0::1;;;;;;;:::i;:::-;74031:20;::::0;::::1;::::0;:23;73900:22;;:25;;;::::1;::::0;73955;;73893:134;;-1:-1:-1;;;73893:134:0;;-1:-1:-1;;;;;73893:43:0;;::::1;::::0;::::1;::::0;:134:::1;::::0;74007:4:::1;::::0;73893:134:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:161;;73871:234;;;;-1:-1:-1::0;;;73871:234:0::1;;;;;;;:::i;:::-;74119:14;74135:16:::0;74153::::1;74173:103;74208:9;:22;;;74245:9;:20;;;74173;:103::i;:::-;74118:158;;;;;;74291:8;74303:1;74291:13;74287:271;;74435:22:::0;;74367:179:::1;::::0;74435:22:::1;:25;;;;::::0;74479:22;;:25;;::::1;::::0;;74523:8;;74396:1:::1;74373:25;;;;::::0;-1:-1:-1;;;;;74367:49:0::1;::::0;:179;;:49:::1;:179::i;:::-;74574:13:::0;;74570:271:::1;;74718:22:::0;;74650:179:::1;::::0;74718:22:::1;:25;;;;::::0;74762:22;;:25;;::::1;::::0;;74806:8;;74679:1:::1;74656:25;::::0;74650:179:::1;74965:22:::0;;74901:146:::1;::::0;74965:22:::1;:25;;;;::::0;74907:22;;75005:10:::1;::::0;75030:6;;74930:1:::1;74907:25;::::0;74901:146:::1;75068:6;::::0;75107:22;;:25:::1;::::0;;::::1;::::0;75147;;75187:20;;::::1;::::0;:23;;::::1;::::0;75060:161:::1;::::0;-1:-1:-1;;;75060:161:0;;-1:-1:-1;;;;;75068:6:0;;::::1;::::0;75060:32:::1;::::0;:161:::1;::::0;75107:25;;75147;;75060:161:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;75237:182:0::1;::::0;;::::1;::::0;::::1;::::0;;;75267:10:::1;75237:182:::0;;75279:22;;75237:182:::1;::::0;-1:-1:-1;75237:182:0;;-1:-1:-1;75237:182:0::1;::::0;::::1;::::0;75302:1:::1;75279:25;;::::0;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;75237:182:0;;::::1;::::0;;75306:22;;:25;;;::::1;::::0;75237:182;;::::1;::::0;;::::1;::::0;;;;75347:20;;::::1;::::0;:23;;::::1;::::0;75385;;75237:182;;::::1;::::0;;75385:23;75237:182:::1;:::i;:::-;;;;;;;;66009:1;;;;73283:2144:::0;;;;;;;;;;:::o;64758:88::-;17730:12;:10;:12::i;:::-;-1:-1:-1;;;;;17719:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;17719:23:0;;17711:68;;;;-1:-1:-1;;;17711:68:0;;;;;;;:::i;:::-;64822:6:::1;:16:::0;;-1:-1:-1;;;;;;64822:16:0::1;-1:-1:-1::0;;;;;64822:16:0;;;::::1;::::0;;;::::1;::::0;;64758:88::o;68943:1574::-;69168:5;69175:13;69190:11;69203:9;65476:12;65550:10;65579:5;65603:13;65635:11;65515:146;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65491:181;;;;;;65476:196;;65683:19;65705:29;:4;:27;:29::i;:::-;65683:51;;65858:7;:5;:7::i;:::-;-1:-1:-1;;;;;65824:41:0;:30;:11;65844:9;65824:19;:30::i;:::-;-1:-1:-1;;;;;65824:41:0;;65816:71;;;;-1:-1:-1;;;65816:71:0;;;;;;;:::i;:::-;65918:10;65907:22;;;;:10;:22;;;;;;;;:29;;;;;;;;;;;65906:30;65898:53;;;;-1:-1:-1;;;65898:53:0;;;;;;;:::i;:::-;65973:10;65962:22;;;;:10;:22;;;;;;;;:29;;;;;;;;:36;;-1:-1:-1;;65962:36:0;65994:4;65962:36;;;69254:97;;;;::::1;::::0;;;;;;;;::::1;::::0;;;;65962:22;;69417:103:::1;69288:13:::0;69328:11;69417:20:::1;:103::i;:::-;69362:158;;;;;;69575:8;69587:1;69575:13;69571:113;;69636:22:::0;;69605:67:::1;::::0;69659:1:::1;69636:25;;;;;69663:8;69605:30;:67::i;:::-;69742:13:::0;;69738:113:::1;;69803:22:::0;;69772:67:::1;::::0;69826:1:::1;69803:25;;;;;69830:8;69772:30;:67::i;:::-;69894:22:::0;;69863:65:::1;::::0;69917:1:::1;69894:25;;;;;69921:6;69863:30;:65::i;:::-;69949:6;::::0;69988:22;;:25:::1;::::0;;::::1;::::0;70053:20;;::::1;::::0;:23;;::::1;::::0;69941:146:::1;::::0;-1:-1:-1;;;69941:146:0;;-1:-1:-1;;;;;69949:6:0;;::::1;::::0;69941:32:::1;::::0;:146:::1;::::0;69988:25;;70028:10:::1;::::0;70053:23;69941:146:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;;70150:20:0::1;::::0;::::1;::::0;:23;70138:9:::1;:35;70134:182;;;70278:20;::::0;::::1;::::0;70188:128:::1;::::0;70237:10:::1;::::0;70299:1:::1;70278:23;;;;::::0;70266:35:::1;::::0;:9:::1;:35;:::i;:::-;70188:30;:128::i;:::-;70332:177;::::0;;::::1;::::0;::::1;::::0;;;70357:10:::1;70332:177:::0;;70369:22;;70332:177:::1;::::0;;::::1;::::0;::::1;::::0;70392:1:::1;70369:25;::::0;65120:91;17730:12;:10;:12::i;:::-;-1:-1:-1;;;;;17719:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;17719:23:0;;17711:68;;;;-1:-1:-1;;;17711:68:0;;;;;;;:::i;:::-;65189:5:::1;:14:::0;;-1:-1:-1;;;;;;65189:14:0::1;-1:-1:-1::0;;;;;65189:14:0;;;::::1;::::0;;;::::1;::::0;;65120:91::o;63279:22::-;;;-1:-1:-1;;;;;63279:22:0;;:::o;64854:92::-;17730:12;:10;:12::i;:::-;-1:-1:-1;;;;;17719:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;17719:23:0;;17711:68;;;;-1:-1:-1;;;17711:68:0;;;;;;;:::i;:::-;64920:7:::1;:18:::0;;-1:-1:-1;;;;;;64920:18:0::1;-1:-1:-1::0;;;;;64920:18:0;;;::::1;::::0;;;::::1;::::0;;64854:92::o;77259:2040::-;77463:5;77470:13;77485:11;77498:9;75853:12;75927:10;75956:5;75980:13;76012:11;75892:146;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;75868:181;;;;;;75853:196;;76060:19;76082:29;:4;:27;:29::i;:::-;76060:51;;76235:7;:5;:7::i;:::-;-1:-1:-1;;;;;76201:41:0;:30;:11;76221:9;76201:19;:30::i;:::-;-1:-1:-1;;;;;76201:41:0;;76193:71;;;;-1:-1:-1;;;76193:71:0;;;;;;;:::i;:::-;76295:10;76284:22;;;;:10;:22;;;;;;;;:29;;;;;;;;;;;76283:30;76275:53;;;;-1:-1:-1;;;76275:53:0;;;;;;;:::i;:::-;76350:10;76339:22;;;;:10;:22;;;;;;;;:29;;;;;;;;;:36;;-1:-1:-1;;76339:36:0;76371:4;76339:36;;;77551:104;;;;::::1;::::0;;;;;;;::::1;::::0;;;77816:23;;77732:25;;::::1;::::0;77725:70;;-1:-1:-1;;;77725:70:0;;77551:104;;77816:23;;-1:-1:-1;;;;;77725:43:0::1;::::0;::::1;::::0;:70:::1;::::0;76350:10;77789:4:::1;::::0;77725:70:::1;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:114;;77703:187;;;;-1:-1:-1::0;;;77703:187:0::1;;;;;;;:::i;:::-;77902:14;77918:16:::0;77936::::1;77956:110;77998:9;:22;;;78035:9;:20;;;77956:27;:110::i;:::-;77901:165;;;;;;78083:8;78095:1;78083:13;78079:271;;78227:22:::0;;78159:179:::1;::::0;78227:22:::1;:25;::::0;78159:179:::1;78366:13:::0;;78362:271:::1;;78510:22:::0;;78442:179:::1;::::0;78510:22:::1;:25;::::0;78442:179:::1;78782:22:::0;;78693:146:::1;::::0;78757:10:::1;::::0;78805:1:::1;78782:25;;;;::::0;78699:22;;78822:6;;78722:1:::1;78699:25;::::0;78693:146:::1;78859:7;::::0;78899:22;;:25:::1;::::0;;::::1;::::0;78964:20;;::::1;::::0;:23;;::::1;::::0;79002;;;::::1;::::0;78850:203:::1;::::0;-1:-1:-1;;;78850:203:0;;-1:-1:-1;;;;;78859:7:0;;::::1;::::0;78850:34:::1;::::0;:203:::1;::::0;78899:25;78939:10:::1;::::0;79023:1:::1;78850:203;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;79069:222:0::1;::::0;;::::1;::::0;::::1;::::0;;;79101:10:::1;79069:222:::0;;79113:22;;79069:222:::1;::::0;-1:-1:-1;79069:222:0;;-1:-1:-1;79069:222:0::1;::::0;::::1;::::0;79136:1:::1;79113:25;;::::0;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;79069:222:0;;::::1;::::0;;79140:22;;:25;::::1;::::0;79069:222:::1;::::0;;::::1;::::0;;;;79181:20;;::::1;::::0;:23;;::::1;::::0;79219;;79181;;79278:1:::1;79257:23;;;;79069:222;;;;;;;;;:::i;64954:158::-:0;17730:12;:10;:12::i;:::-;-1:-1:-1;;;;;17719:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;17719:23:0;;17711:68;;;;-1:-1:-1;;;17711:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;65067:26:0;;;::::1;;::::0;;;:16:::1;:26;::::0;;;;:37;;-1:-1:-1;;65067:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;64954:158::o;63517:48::-;;;;;;;;;;;;;;;:::o;18150:103::-;17730:12;:10;:12::i;:::-;-1:-1:-1;;;;;17719:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;17719:23:0;;17711:68;;;;-1:-1:-1;;;17711:68:0;;;;;;;:::i;:::-;18215:30:::1;18242:1;18215:18;:30::i;:::-;18150:103::o:0;79474:1705::-;79710:5;79717:13;79732:11;79745:9;75853:12;75927:10;75956:5;75980:13;76012:11;75892:146;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;75868:181;;;;;;75853:196;;76060:19;76082:29;:4;:27;:29::i;:::-;76060:51;;76235:7;:5;:7::i;:::-;-1:-1:-1;;;;;76201:41:0;:30;:11;76221:9;76201:19;:30::i;:::-;-1:-1:-1;;;;;76201:41:0;;76193:71;;;;-1:-1:-1;;;76193:71:0;;;;;;;:::i;:::-;76295:10;76284:22;;;;:10;:22;;;;;;;;:29;;;;;;;;;;;76283:30;76275:53;;;;-1:-1:-1;;;76275:53:0;;;;;;;:::i;:::-;76350:10;76339:22;;;;:10;:22;;;;;;;;:29;;;;;;;;:36;;-1:-1:-1;;76339:36:0;76371:4;76339:36;;;79803:104;;;;::::1;::::0;;;;;;;;::::1;::::0;;;;76339:22;;79973:110:::1;79844:13:::0;79884:11;79973:27:::1;:110::i;:::-;79918:165;;;;;;80138:8;80150:1;80138:13;80134:113;;80199:22:::0;;80168:67:::1;::::0;80222:1:::1;80199:25;::::0;80168:67:::1;80305:13:::0;;80301:113:::1;;80366:22:::0;;80335:67:::1;::::0;80389:1:::1;80366:25;::::0;80335:67:::1;80457:22:::0;;80426:65:::1;::::0;80480:1:::1;80457:25;::::0;80426:65:::1;80513:7;::::0;80553:22;;:25:::1;::::0;;::::1;::::0;80618:20;;::::1;::::0;:23;;::::1;::::0;80656;;;::::1;::::0;80504:203:::1;::::0;-1:-1:-1;;;80504:203:0;;-1:-1:-1;;;;;80513:7:0;;::::1;::::0;80504:34:::1;::::0;:203:::1;::::0;80553:25;80593:10:::1;::::0;80677:1:::1;80504:203;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;;80770:20:0::1;::::0;::::1;::::0;:23;80758:9:::1;:35;80754:182;;;80898:20;::::0;::::1;::::0;80808:128:::1;::::0;80857:10:::1;::::0;80919:1:::1;80898:23;::::0;80808:128:::1;80952:219;::::0;;::::1;::::0;::::1;::::0;;;80981:10:::1;80952:219:::0;;80993:22;;80952:219:::1;::::0;;::::1;::::0;::::1;::::0;81016:1:::1;80993:25;::::0;63224:21;;;-1:-1:-1;;;;;63224:21:0;;:::o;17499:87::-;17545:7;17572:6;-1:-1:-1;;;;;17572:6:0;17499:87;:::o;81347:2282::-;81553:5;81560:13;81575:11;81588:9;75853:12;75927:10;75956:5;75980:13;76012:11;75892:146;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;75868:181;;;;;;75853:196;;76060:19;76082:29;:4;:27;:29::i;:::-;76060:51;;76235:7;:5;:7::i;:::-;-1:-1:-1;;;;;76201:41:0;:30;:11;76221:9;76201:19;:30::i;:::-;-1:-1:-1;;;;;76201:41:0;;76193:71;;;;-1:-1:-1;;;76193:71:0;;;;;;;:::i;:::-;76295:10;76284:22;;;;:10;:22;;;;;;;;:29;;;;;;;;;;;76283:30;76275:53;;;;-1:-1:-1;;;76275:53:0;;;;;;;:::i;:::-;76350:10;76339:22;;;;:10;:22;;;;;;;;:29;;;;;;;;;:36;;-1:-1:-1;;76339:36:0;76371:4;76339:36;;;81641:104;;;;::::1;::::0;;;;;;;::::1;::::0;;;81789:7:::1;::::0;81815:25;;::::1;::::0;81780:76;;-1:-1:-1;;;81780:76:0;;81641:104;;-1:-1:-1;;;;;81789:7:0;;::::1;::::0;81780:34:::1;::::0;:76:::1;::::0;81815:25;;81850:4:::1;::::0;81780:76:::1;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;81758:161;;;;-1:-1:-1::0;;;81758:161:0::1;;;;;;;:::i;:::-;82127:20;::::0;::::1;::::0;:23;81996:22;;:25;;;::::1;::::0;82051;;81989:134;;-1:-1:-1;;;81989:134:0;;-1:-1:-1;;;;;81989:43:0;;::::1;::::0;::::1;::::0;:134:::1;::::0;82103:4:::1;::::0;81989:134:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:161;;81967:234;;;;-1:-1:-1::0;;;81967:234:0::1;;;;;;;:::i;:::-;82215:14;82231:16:::0;82249::::1;82269:110;82311:9;:22;;;82348:9;:20;;;82269:27;:110::i;:::-;82214:165;;;;;;82394:8;82406:1;82394:13;82390:271;;82538:22:::0;;82470:179:::1;::::0;82538:22:::1;:25;::::0;82470:179:::1;82677:13:::0;;82673:271:::1;;82821:22:::0;;82753:179:::1;::::0;82821:22:::1;:25;::::0;82753:179:::1;83068:22:::0;;83004:146:::1;::::0;83068:22:::1;:25;::::0;83004:146:::1;83172:7;::::0;83212:22;;:25:::1;::::0;;::::1;::::0;83252;;83292:20;;::::1;::::0;:23;;::::1;::::0;83330;;;::::1;::::0;83163:218:::1;::::0;-1:-1:-1;;;83163:218:0;;-1:-1:-1;;;;;83172:7:0;;::::1;::::0;83163:34:::1;::::0;:218:::1;::::0;83212:25;;83252;83292:23;;83351:1:::1;83163:218;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;83397:224:0::1;::::0;;::::1;::::0;::::1;::::0;;;83431:10:::1;83397:224:::0;;83443:22;;83397:224:::1;::::0;-1:-1:-1;83397:224:0;;-1:-1:-1;83397:224:0::1;::::0;::::1;::::0;83466:1:::1;83443:25;::::0;70666:2456;70819:97;;;;;;;;;;;;;;;;;;71008:10;70795:21;70991:28;;;:16;:28;;;;;;;;;;:36;;:28;:36;70969:113;;;;-1:-1:-1;;;70969:113:0;;;;;;;:::i;:::-;71290:20;;;;:23;71159:22;;:25;;;;;71214;;71152:134;;-1:-1:-1;;;71152:134:0;;-1:-1:-1;;;;;71152:43:0;;;;;;:134;;71266:4;;71152:134;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:161;;71130:234;;;;-1:-1:-1;;;71130:234:0;;;;;;;:::i;:::-;71408:5;;71379:22;;:25;;;-1:-1:-1;;;;;71379:34:0;;;71408:5;;71379:34;71375:417;;;71464:6;;71489:5;;71456:54;;-1:-1:-1;;;71456:54:0;;-1:-1:-1;;;;;71464:6:0;;;;71456:32;;:54;;71489:5;;;71504:4;;71456:54;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71430:151;;;;-1:-1:-1;;;71430:151:0;;;;;;;:::i;:::-;71375:417;;;71648:6;;71668:20;;;;;:23;;71640:52;;-1:-1:-1;;;71640:52:0;;71704:4;;-1:-1:-1;;;;;71648:6:0;;71640:27;;:52;;71668:23;71640:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;71640:69:0;;71614:166;;;;-1:-1:-1;;;71614:166:0;;;;;;;:::i;:::-;71805:14;71821:16;71839;71859:103;71894:9;:22;;;71931:9;:20;;;71859;:103::i;:::-;71804:158;;;;;;71977:8;71989:1;71977:13;71973:271;;72121:22;;72053:179;;72121:22;:25;;72053:179;72260:13;;72256:271;;72404:22;;72336:179;;72404:22;:25;;72336:179;72651:22;;72587:161;;72651:22;:25;;;;;72691:22;;72714:1;72691:25;;72587:161;72767:6;;72806:22;;:25;;;;;72846;;72886:20;;;;:23;;;;72759:161;;-1:-1:-1;;;72759:161:0;;-1:-1:-1;;;;;72767:6:0;;;;72759:32;;:161;;72806:25;;72846;;72759:161;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;72936:178:0;;;;;;;;72962:10;72936:178;;72974:22;;72936:178;72974:25;;;;-1:-1:-1;;;;;72936:178:0;;;;;;;73001:22;;:25;;;72936:178;;;;;73042:20;;;;:23;;;;73080;;72936:178;;;;-1:-1:-1;72936:178:0;;-1:-1:-1;72936:178:0;;73042:23;;72936:178;:::i;:::-;;;;;;;;70666:2456;;;;;;:::o;83785:2327::-;83949:104;;;;;;;;;;;;;;;;;;84145:10;83918:28;84128;;;:16;:28;;;;;;;;;;:36;;:28;:36;84106:113;;;;-1:-1:-1;;;84106:113:0;;;;;;;:::i;:::-;84427:20;;;;:23;84296:22;;:25;;;;;84351;;84289:134;;-1:-1:-1;;;84289:134:0;;-1:-1:-1;;;;;84289:43:0;;;;;;:134;;84403:4;;84289:134;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:161;;84267:234;;;;-1:-1:-1;;;84267:234:0;;;;;;;:::i;:::-;84545:7;;84571:22;;:25;;;84536:76;;-1:-1:-1;;;84536:76:0;;-1:-1:-1;;;;;84545:7:0;;;;84536:34;;:76;;84606:4;;84536:76;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;84514:161;;;;-1:-1:-1;;;84514:161:0;;;;;;;:::i;:::-;84689:14;84705:16;84723;84743:110;84785:9;:22;;;84822:9;:20;;;84743:27;:110::i;:::-;84688:165;;;;;;84868:8;84880:1;84868:13;84864:271;;85012:22;;84944:179;;85012:22;:25;;84944:179;85151:13;;85147:271;;85295:22;;85227:179;;85295:22;:25;;85227:179;85542:22;;85478:161;;85542:22;:25;;85478:161;85659:7;;85699:22;;:25;;;;;85739;;85779:20;;;;:23;;;;85817;;;;;85650:218;;-1:-1:-1;;;85650:218:0;;-1:-1:-1;;;;;85659:7:0;;;;85650:34;;:218;;85699:25;;85739;85779:23;;85838:1;85650:218;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;85884:220:0;;;;;;;;85914:10;85884:220;;85926:22;;85884:220;85926:25;;;;-1:-1:-1;;;;;85884:220:0;;;;;;;85953:22;;:25;;;85884:220;;;;;85994:20;;;;:23;;;;86032;;86070;;;;;85884:220;;;;-1:-1:-1;85884:220:0;;-1:-1:-1;85884:220:0;;85994:23;;85884:220;:::i;18408:201::-;17730:12;:10;:12::i;:::-;-1:-1:-1;;;;;17719:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;17719:23:0;;17711:68;;;;-1:-1:-1;;;17711:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18497:22:0;::::1;18489:73;;;;-1:-1:-1::0;;;18489:73:0::1;;;;;;;:::i;:::-;18573:28;18592:8;18573:18;:28::i;:::-;18408:201:::0;:::o;63352:20::-;;;-1:-1:-1;;;;;63352:20:0;;:::o;66875:1909::-;67068:5;67075:13;67090:11;67103:9;65476:12;65550:10;65579:5;65603:13;65635:11;65515:146;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65491:181;;;;;;65476:196;;65683:19;65705:29;:4;:27;:29::i;:::-;65683:51;;65858:7;:5;:7::i;:::-;-1:-1:-1;;;;;65824:41:0;:30;:11;65844:9;65824:19;:30::i;:::-;-1:-1:-1;;;;;65824:41:0;;65816:71;;;;-1:-1:-1;;;65816:71:0;;;;;;;:::i;:::-;65918:10;65907:22;;;;:10;:22;;;;;;;;:29;;;;;;;;;;;65906:30;65898:53;;;;-1:-1:-1;;;65898:53:0;;;;;;;:::i;:::-;65973:10;65962:22;;;;:10;:22;;;;;;;;:29;;;;;;;;;:36;;-1:-1:-1;;65962:36:0;65994:4;65962:36;;;67149:97;;;;::::1;::::0;;;;;;;::::1;::::0;;;67407:23;;67323:25;;::::1;::::0;67316:70;;-1:-1:-1;;;67316:70:0;;67149:97;;67407:23;;-1:-1:-1;;;;;67316:43:0::1;::::0;::::1;::::0;:70:::1;::::0;65973:10;67380:4:::1;::::0;67316:70:::1;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:114;;67294:187;;;;-1:-1:-1::0;;;67294:187:0::1;;;;;;;:::i;:::-;67493:14;67509:16:::0;67527::::1;67547:103;67582:9;:22;;;67619:9;:20;;;67547;:103::i;:::-;67492:158;;;;;;67667:8;67679:1;67667:13;67663:271;;67811:22:::0;;67743:179:::1;::::0;67811:22:::1;:25;::::0;67743:179:::1;67950:13:::0;;67946:271:::1;;68094:22:::0;;68026:179:::1;::::0;68094:22:::1;:25;::::0;68026:179:::1;68366:22:::0;;68277:146:::1;::::0;68341:10:::1;::::0;68389:1:::1;68366:25;::::0;68277:146:::1;68442:6;::::0;68481:22;;:25:::1;::::0;;::::1;::::0;68546:20;;::::1;::::0;:23;;::::1;::::0;68434:146:::1;::::0;-1:-1:-1;;;68434:146:0;;-1:-1:-1;;;;;68442:6:0;;::::1;::::0;68434:32:::1;::::0;:146:::1;::::0;68481:25;;68521:10:::1;::::0;68546:23;68434:146:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;68596:180:0::1;::::0;;::::1;::::0;::::1;::::0;;;68624:10:::1;68596:180:::0;;68636:22;;68596:180:::1;::::0;-1:-1:-1;68596:180:0;;-1:-1:-1;68596:180:0::1;::::0;::::1;::::0;68659:1:::1;68636:25;::::0;49858:269;49927:7;50113:4;50060:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;50050:69;;;;;;50043:76;;49858:269;;;:::o;46056:231::-;46134:7;46155:17;46174:18;46196:27;46207:4;46213:9;46196:10;:27::i;:::-;46154:69;;;;46234:18;46246:5;46234:11;:18::i;:::-;-1:-1:-1;46270:9:0;46056:231;-1:-1:-1;;;46056:231:0:o;66026:681::-;66162:14;;;;;66293:13;66307:1;66293:16;;;;-1:-1:-1;;;;;66293:30:0;;66289:158;;66351:44;66390:4;66351:34;66370:11;66382:1;66370:14;;;;;66351:11;66363:1;66351:14;;;;;;:18;:34::i;:::-;:38;;:44::i;:::-;66340:55;-1:-1:-1;66410:25:0;66340:55;66410:25;;:::i;:::-;;;66289:158;66493:16;;;;-1:-1:-1;;;;;66493:30:0;;66489:158;;66551:44;66590:4;66551:34;66570:11;66582:1;66570:14;;66551:44;66540:55;-1:-1:-1;66610:25:0;66540:55;66610:25;;:::i;:::-;;;66489:158;66666:33;66685:13;66666:11;66678:1;66666:14;;;;;;:18;:33::i;:::-;66657:42;;66026:681;;;;;;:::o;22762:248::-;22906:96;22926:5;22956:27;;;22985:4;22991:2;22995:5;22933:68;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;22933:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;22933:68:0;-1:-1:-1;;;;;;22933:68:0;;;;;;;;;;22906:19;:96::i;:::-;22762:248;;;;:::o;16223:98::-;16303:10;16223:98;:::o;52547:195::-;52655:12;;;52617;52655;;;;;;;;;-1:-1:-1;;;;;52634:7:0;;;52648:5;;52634:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52616:52;;;52687:7;52679:55;;;;-1:-1:-1;;;52679:55:0;;;;;;;:::i;:::-;52547:195;;;:::o;76403:688::-;76546:14;;;;;76677:13;76691:1;76677:16;;;;-1:-1:-1;;;;;76677:30:0;;76673:158;;76735:44;76774:4;76735:34;76754:11;76766:1;76754:14;;;;;76735:11;76747:1;76735:14;;:44;76724:55;-1:-1:-1;76794:25:0;76724:55;76794:25;;:::i;:::-;;;76673:158;76877:16;;;;-1:-1:-1;;;;;76877:30:0;;76873:158;;76935:44;76974:4;76935:34;76954:11;76966:1;76954:14;;76935:44;76924:55;-1:-1:-1;76994:25:0;76924:55;76994:25;;:::i;:::-;;;76873:158;77050:33;77069:13;77050:11;77062:1;77050:14;;18769:191;18843:16;18862:6;;-1:-1:-1;;;;;18879:17:0;;;-1:-1:-1;;;;;;18879:17:0;;;;;;18912:40;;18862:6;;;;;;;18912:40;;18843:16;18912:40;18769:191;;:::o;43946:1308::-;44027:7;44036:12;44261:9;:16;44281:2;44261:22;44257:990;;;44557:4;44542:20;;44536:27;44607:4;44592:20;;44586:27;44665:4;44650:20;;44644:27;44300:9;44636:36;44708:25;44719:4;44636:36;44536:27;44586;44708:10;:25::i;:::-;44701:32;;;;;;;;;44257:990;44755:9;:16;44775:2;44755:22;44751:496;;;45030:4;45015:20;;45009:27;45081:4;45066:20;;45060:27;45123:23;45134:4;45009:27;45060;45123:10;:23::i;:::-;45116:30;;;;;;;;44751:496;-1:-1:-1;45195:1:0;;-1:-1:-1;45199:35:0;44751:496;43946:1308;;;;;:::o;42217:643::-;42295:20;42286:5;:29;;;;;;-1:-1:-1;;;42286:29:0;;;;;;;;;;42282:571;;;42332:7;;42282:571;42393:29;42384:5;:38;;;;;;-1:-1:-1;;;42384:38:0;;;;;;;;;;42380:473;;;42439:34;;-1:-1:-1;;;42439:34:0;;;;;;;:::i;42380:473::-;42504:35;42495:5;:44;;;;;;-1:-1:-1;;;42495:44:0;;;;;;;;;;42491:362;;;42556:41;;-1:-1:-1;;;42556:41:0;;;;;;;:::i;42491:362::-;42628:30;42619:5;:39;;;;;;-1:-1:-1;;;42619:39:0;;;;;;;;;;42615:238;;;42675:44;;-1:-1:-1;;;42675:44:0;;;;;;;:::i;42615:238::-;42750:30;42741:5;:39;;;;;;-1:-1:-1;;;42741:39:0;;;;;;;;;;42737:116;;;42797:44;;-1:-1:-1;;;42797:44:0;;;;;;;:::i;3614:98::-;3672:7;3699:5;3703:1;3699;:5;:::i;:::-;3692:12;3614:98;-1:-1:-1;;;3614:98:0:o;4013:::-;4071:7;4098:5;4102:1;4098;:5;:::i;3257:98::-;3315:7;3342:5;3346:1;3342;:5;:::i;25116:716::-;25540:23;25566:69;25594:4;25566:69;;;;;;;;;;;;;;;;;25574:5;-1:-1:-1;;;;;25566:27:0;;;:69;;;;;:::i;:::-;25650:17;;25540:95;;-1:-1:-1;25650:21:0;25646:179;;25747:10;25736:30;;;;;;;;;;;;:::i;:::-;25728:85;;;;-1:-1:-1;;;25728:85:0;;;;;;;:::i;47508:1632::-;47639:7;;48573:66;48560:79;;48556:163;;;-1:-1:-1;48672:1:0;;-1:-1:-1;48676:30:0;48656:51;;48556:163;48733:1;:7;;48738:2;48733:7;;:18;;;;;48744:1;:7;;48749:2;48744:7;;48733:18;48729:102;;;-1:-1:-1;48784:1:0;;-1:-1:-1;48788:30:0;48768:51;;48729:102;48928:14;48945:24;48955:4;48961:1;48964;48967;48945:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;48945:24:0;;-1:-1:-1;;48945:24:0;;;-1:-1:-1;;;;;;;48984:20:0;;48980:103;;49037:1;49041:29;49021:50;;;;;;;48980:103;49103:6;-1:-1:-1;49111:20:0;;-1:-1:-1;47508:1632:0;;;;;;;;:::o;46550:344::-;46664:7;;-1:-1:-1;;;;;46710:80:0;;46664:7;46817:25;46833:3;46818:18;;;46840:2;46817:25;:::i;:::-;46801:42;;46861:25;46872:4;46878:1;46881;46884;46861:10;:25::i;:::-;46854:32;;;;;;46550:344;;;;;;:::o;11019:229::-;11156:12;11188:52;11210:6;11218:4;11224:1;11227:12;11188:21;:52::i;:::-;11181:59;11019:229;-1:-1:-1;;;;11019:229:0:o;12139:510::-;12309:12;12367:5;12342:21;:30;;12334:81;;;;-1:-1:-1;;;12334:81:0;;;;;;;:::i;:::-;12434:18;12445:6;12434:10;:18::i;:::-;12426:60;;;;-1:-1:-1;;;12426:60:0;;;;;;;:::i;:::-;12500:12;12514:23;12541:6;-1:-1:-1;;;;;12541:11:0;12560:5;12567:4;12541:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12499:73;;;;12590:51;12607:7;12616:10;12628:12;12590:16;:51::i;:::-;12583:58;12139:510;-1:-1:-1;;;;;;;12139:510:0:o;8274:326::-;8334:4;8591:1;8569:7;-1:-1:-1;;;;;8569:12:0;;;;;;;;;;;;;;;;;;;;;;;;:19;:23;;8274:326;-1:-1:-1;;8274:326:0:o;14825:712::-;14975:12;15004:7;15000:530;;;-1:-1:-1;15035:10:0;15028:17;;15000:530;15149:17;;:21;15145:374;;15347:10;15341:17;15408:15;15395:10;15391:2;15387:19;15380:44;15295:148;15490:12;15483:20;;-1:-1:-1;;;15483:20:0;;;;;;;;:::i;14:786:1:-;;122:3;115:4;107:6;103:17;99:27;89:2;;144:5;137;130:20;89:2;181;175:9;223:3;215:6;211:16;293:6;281:10;278:22;257:18;245:10;242:34;239:62;236:2;;;304:18;;:::i;:::-;340:2;333:22;375:6;401;434:3;422:16;;419:25;-1:-1:-1;416:2:1;;;461:5;454;447:20;416:2;487:5;501:269;515:4;512:1;509:11;501:269;;;588:3;575:17;605:33;632:5;605:33;:::i;:::-;651:18;;692:4;716:12;;;;748;;;;;535:1;528:9;501:269;;;-1:-1:-1;788:6:1;;79:721;-1:-1:-1;;;;;79:721:1:o;805:720::-;;924:3;917:4;909:6;905:17;901:27;891:2;;946:5;939;932:20;891:2;983;977:9;1025:3;1017:6;1013:16;1095:6;1083:10;1080:22;1059:18;1047:10;1044:34;1041:62;1038:2;;;1106:18;;:::i;:::-;1142:2;1135:22;1177:6;1203;1236:3;1224:16;;1221:25;-1:-1:-1;1218:2:1;;;1263:5;1256;1249:20;1218:2;1289:5;1303:192;1317:4;1314:1;1311:11;1303:192;;;1376:17;;1364:30;;1417:4;1441:12;;;;1473;;;;1337:1;1330:9;1303:192;;1530:709;;1638:3;1631:4;1623:6;1619:17;1615:27;1605:2;;1660:5;1653;1646:20;1605:2;1697;1691:9;1739:3;1731:6;1727:16;1809:6;1797:10;1794:22;1773:18;1761:10;1758:34;1755:62;1752:2;;;1820:18;;:::i;:::-;1856:2;1849:22;1891:6;1917;1950:3;1938:16;;1935:25;-1:-1:-1;1932:2:1;;;1977:5;1970;1963:20;1932:2;2003:5;2017:192;2031:4;2028:1;2025:11;2017:192;;;2090:17;;2078:30;;2131:4;2155:12;;;;2187;;;;2051:1;2044:9;2017:192;;2244:712;;2341:3;2334:4;2326:6;2322:17;2318:27;2308:2;;2363:5;2356;2349:20;2308:2;2403:6;2390:20;2429:18;2466:2;2462;2459:10;2456:2;;;2472:18;;:::i;:::-;2521:2;2515:9;2590:2;2571:13;;-1:-1:-1;;2567:27:1;2555:40;;2597:4;2551:51;2617:18;;;2637:22;;;2614:46;2611:2;;;2663:18;;:::i;:::-;2699:2;2692:22;2723:18;;;2760:15;;;2777:4;2756:26;2753:35;-1:-1:-1;2750:2:1;;;2805:5;2798;2791:20;2750:2;2873;2866:4;2858:6;2854:17;2847:4;2839:6;2835:17;2822:54;2896:15;;;2913:4;2892:26;2885:41;;;;2900:6;2298:658;-1:-1:-1;;;2298:658:1:o;2961:259::-;;3073:2;3061:9;3052:7;3048:23;3044:32;3041:2;;;3094:6;3086;3079:22;3041:2;3138:9;3125:23;3157:33;3184:5;3157:33;:::i;3225:263::-;;3348:2;3336:9;3327:7;3323:23;3319:32;3316:2;;;3369:6;3361;3354:22;3316:2;3406:9;3400:16;3425:33;3452:5;3425:33;:::i;3493:396::-;;;3619:2;3607:9;3598:7;3594:23;3590:32;3587:2;;;3640:6;3632;3625:22;3587:2;3684:9;3671:23;3703:33;3730:5;3703:33;:::i;:::-;3755:5;-1:-1:-1;3812:2:1;3797:18;;3784:32;3825;3784;3825;:::i;:::-;3876:7;3866:17;;;3577:312;;;;;:::o;3894:369::-;;;4069:3;4057:9;4048:7;4044:23;4040:33;4037:2;;;4091:6;4083;4076:22;4037:2;4119:49;4160:7;4149:9;4119:49;:::i;:::-;4109:59;;4187:70;4249:7;4243:3;4232:9;4228:19;4187:70;:::i;:::-;4177:80;;4027:236;;;;;:::o;4268:659::-;;;;;4486:3;4474:9;4465:7;4461:23;4457:33;4454:2;;;4508:6;4500;4493:22;4454:2;4536:49;4577:7;4566:9;4536:49;:::i;:::-;4526:59;;4604:70;4666:7;4660:3;4649:9;4645:19;4604:70;:::i;:::-;4594:80;;4721:3;4710:9;4706:19;4693:33;4683:43;;4777:3;4766:9;4762:19;4749:33;4805:18;4797:6;4794:30;4791:2;;;4842:6;4834;4827:22;4791:2;4870:51;4913:7;4904:6;4893:9;4889:22;4870:51;:::i;:::-;4860:61;;;4444:483;;;;;;;:::o;4932:358::-;;;5107:3;5095:9;5086:7;5082:23;5078:33;5075:2;;;5129:6;5121;5114:22;5075:2;5157:49;5198:7;5187:9;5157:49;:::i;:::-;5147:59;;5225;5276:7;5270:3;5259:9;5255:19;5225:59;:::i;5295:648::-;;;;;5513:3;5501:9;5492:7;5488:23;5484:33;5481:2;;;5535:6;5527;5520:22;5481:2;5563:49;5604:7;5593:9;5563:49;:::i;:::-;5553:59;;5631;5682:7;5676:3;5665:9;5661:19;5631:59;:::i;:::-;5621:69;;5737:3;5726:9;5722:19;5709:33;5699:43;;5793:3;5782:9;5778:19;5765:33;5821:18;5813:6;5810:30;5807:2;;;5858:6;5850;5843:22;5948:257;;6068:2;6056:9;6047:7;6043:23;6039:32;6036:2;;;6089:6;6081;6074:22;6036:2;6126:9;6120:16;6145:30;6169:5;6145:30;:::i;6210:194::-;;6333:2;6321:9;6312:7;6308:23;6304:32;6301:2;;;6354:6;6346;6339:22;6301:2;-1:-1:-1;6382:16:1;;6291:113;-1:-1:-1;6291:113:1:o;6409:357::-;6507:5;6530:1;6540:220;6554:4;6551:1;6548:11;6540:220;;;6617:13;;-1:-1:-1;;;;;6613:39:1;6601:52;;6676:4;6700:12;;;;6735:15;;;;6649:1;6567:9;6540:220;;6771:368;6880:5;6903:1;6913:220;6927:4;6924:1;6921:11;6913:220;;;6990:13;;-1:-1:-1;;;;;6986:39:1;6974:52;;7049:4;7073:12;;;;7108:15;;;;7022:1;6940:9;6913:220;;7144:831;;7486:26;7482:31;7473:6;7469:2;7465:15;7461:53;7456:3;7449:66;7545:6;7540:2;7535:3;7531:12;7524:28;7561:62;7619:2;7614:3;7610:12;7602:6;7561:62;:::i;:::-;7654:3;7649;7645:13;7704:6;7728:3;7740:200;7754:4;7751:1;7748:11;7740:200;;;7815:13;;7801:28;;7852:4;7878:14;;;;7915:15;;;;7774:1;7767:9;7740:200;;;7744:3;;;7965;7960;7956:13;7949:20;;7439:536;;;;;;;:::o;7980:831::-;;8322:26;8318:31;8309:6;8305:2;8301:15;8297:53;8292:3;8285:66;8381:6;8376:2;8371:3;8367:12;8360:28;8397:62;8455:2;8450:3;8446:12;8438:6;8397:62;:::i;:::-;8490:3;8485;8481:13;8540:6;8564:3;8576:200;8590:4;8587:1;8584:11;8576:200;;;8651:13;;8637:28;;8688:4;8714:14;;;;8751:15;;;;8610:1;8603:9;8576:200;;;8580:3;;;8801;8796;8792:13;8785:20;;8275:536;;;;;;;:::o;8816:274::-;;8983:6;8977:13;8999:53;9045:6;9040:3;9033:4;9025:6;9021:17;8999:53;:::i;:::-;9068:16;;;;;8953:137;-1:-1:-1;;8953:137:1:o;9095:380::-;9337:66;9325:79;;9429:2;9420:12;;9413:28;;;;9466:2;9457:12;;9315:160::o;9480:203::-;-1:-1:-1;;;;;9644:32:1;;;;9626:51;;9614:2;9599:18;;9581:102::o;9688:304::-;-1:-1:-1;;;;;9918:15:1;;;9900:34;;9970:15;;9965:2;9950:18;;9943:43;9850:2;9835:18;;9817:175::o;9997:375::-;-1:-1:-1;;;;;10255:15:1;;;10237:34;;10307:15;;;;10302:2;10287:18;;10280:43;10354:2;10339:18;;10332:34;;;;10187:2;10172:18;;10154:218::o;10377:630::-;-1:-1:-1;;;;;10728:15:1;;;10710:34;;10780:15;;;;10775:2;10760:18;;10753:43;10827:2;10812:18;;10805:34;10870:2;10855:18;;10848:34;;;;10690:3;10913;10898:19;;10891:32;;;10377:630;10939:19;;;10932:33;10997:3;10982:19;;10662:345::o;11012:390::-;11248:3;11233:19;;11261:48;11237:9;11291:6;11261:48;:::i;:::-;11340:2;11325:18;;11318:34;;;;11383:3;11368:19;11361:35;11215:187;;-1:-1:-1;11215:187:1:o;11407:462::-;11671:3;11656:19;;11684:48;11660:9;11714:6;11684:48;:::i;:::-;11768:6;11763:2;11752:9;11748:18;11741:34;11812:6;11806:3;11795:9;11791:19;11784:35;11856:6;11850:3;11839:9;11835:19;11828:35;11638:231;;;;;;;:::o;11874:187::-;12039:14;;12032:22;12014:41;;12002:2;11987:18;;11969:92::o;12066:398::-;12293:25;;;12366:4;12354:17;;;;12349:2;12334:18;;12327:45;12403:2;12388:18;;12381:34;12446:2;12431:18;;12424:34;12280:3;12265:19;;12247:217::o;12469:383::-;;12618:2;12607:9;12600:21;12650:6;12644:13;12693:6;12688:2;12677:9;12673:18;12666:34;12709:66;12768:6;12763:2;12752:9;12748:18;12743:2;12735:6;12731:15;12709:66;:::i;:::-;12836:2;12815:15;-1:-1:-1;;12811:29:1;12796:45;;;;12843:2;12792:54;;12590:262;-1:-1:-1;;12590:262:1:o;12857:348::-;13059:2;13041:21;;;13098:2;13078:18;;;13071:30;13137:26;13132:2;13117:18;;13110:54;13196:2;13181:18;;13031:174::o;13210:355::-;13412:2;13394:21;;;13451:2;13431:18;;;13424:30;13490:33;13485:2;13470:18;;13463:61;13556:2;13541:18;;13384:181::o;13570:351::-;13772:2;13754:21;;;13811:2;13791:18;;;13784:30;13850:29;13845:2;13830:18;;13823:57;13912:2;13897:18;;13744:177::o;13926:402::-;14128:2;14110:21;;;14167:2;14147:18;;;14140:30;14206:34;14201:2;14186:18;;14179:62;-1:-1:-1;;;14272:2:1;14257:18;;14250:36;14318:3;14303:19;;14100:228::o;14333:341::-;14535:2;14517:21;;;14574:2;14554:18;;;14547:30;-1:-1:-1;;;14608:2:1;14593:18;;14586:47;14665:2;14650:18;;14507:167::o;14679:398::-;14881:2;14863:21;;;14920:2;14900:18;;;14893:30;14959:34;14954:2;14939:18;;14932:62;-1:-1:-1;;;15025:2:1;15010:18;;15003:32;15067:3;15052:19;;14853:224::o;15082:402::-;15284:2;15266:21;;;15323:2;15303:18;;;15296:30;15362:34;15357:2;15342:18;;15335:62;-1:-1:-1;;;15428:2:1;15413:18;;15406:36;15474:3;15459:19;;15256:228::o;15489:347::-;15691:2;15673:21;;;15730:2;15710:18;;;15703:30;15769:25;15764:2;15749:18;;15742:53;15827:2;15812:18;;15663:173::o;15841:398::-;16043:2;16025:21;;;16082:2;16062:18;;;16055:30;16121:34;16116:2;16101:18;;16094:62;-1:-1:-1;;;16187:2:1;16172:18;;16165:32;16229:3;16214:19;;16015:224::o;16244:356::-;16446:2;16428:21;;;16465:18;;;16458:30;16524:34;16519:2;16504:18;;16497:62;16591:2;16576:18;;16418:182::o;16605:334::-;16807:2;16789:21;;;16846:2;16826:18;;;16819:30;-1:-1:-1;;;16880:2:1;16865:18;;16858:40;16930:2;16915:18;;16779:160::o;16944:399::-;17146:2;17128:21;;;17185:2;17165:18;;;17158:30;17224:34;17219:2;17204:18;;17197:62;-1:-1:-1;;;17290:2:1;17275:18;;17268:33;17333:3;17318:19;;17118:225::o;17348:353::-;17550:2;17532:21;;;17589:2;17569:18;;;17562:30;17628:31;17623:2;17608:18;;17601:59;17692:2;17677:18;;17522:179::o;17706:399::-;17908:2;17890:21;;;17947:2;17927:18;;;17920:30;17986:34;17981:2;17966:18;;17959:62;-1:-1:-1;;;18052:2:1;18037:18;;18030:33;18095:3;18080:19;;17880:225::o;18110:406::-;18312:2;18294:21;;;18351:2;18331:18;;;18324:30;18390:34;18385:2;18370:18;;18363:62;-1:-1:-1;;;18456:2:1;18441:18;;18434:40;18506:3;18491:19;;18284:232::o;18521:177::-;18667:25;;;18655:2;18640:18;;18622:76::o;18703:128::-;;18774:1;18770:6;18767:1;18764:13;18761:2;;;18780:18;;:::i;:::-;-1:-1:-1;18816:9:1;;18751:80::o;18836:217::-;;18902:1;18892:2;;-1:-1:-1;;;18927:31:1;;18981:4;18978:1;18971:15;19009:4;18934:1;18999:15;18892:2;-1:-1:-1;19038:9:1;;18882:171::o;19058:168::-;;19164:1;19160;19156:6;19152:14;19149:1;19146:21;19141:1;19134:9;19127:17;19123:45;19120:2;;;19171:18;;:::i;:::-;-1:-1:-1;19211:9:1;;19110:116::o;19231:125::-;;19299:1;19296;19293:8;19290:2;;;19304:18;;:::i;:::-;-1:-1:-1;19341:9:1;;19280:76::o;19361:258::-;19433:1;19443:113;19457:6;19454:1;19451:13;19443:113;;;19533:11;;;19527:18;19514:11;;;19507:39;19479:2;19472:10;19443:113;;;19574:6;19571:1;19568:13;19565:2;;;-1:-1:-1;;19609:1:1;19591:16;;19584:27;19414:205::o;19624:127::-;19685:10;19680:3;19676:20;19673:1;19666:31;19716:4;19713:1;19706:15;19740:4;19737:1;19730:15;19756:127;19817:10;19812:3;19808:20;19805:1;19798:31;19848:4;19845:1;19838:15;19872:4;19869:1;19862:15;19888:133;-1:-1:-1;;;;;19965:31:1;;19955:42;;19945:2;;20011:1;20008;20001:12;20026:120;20114:5;20107:13;20100:21;20093:5;20090:32;20080:2;;20136:1;20133;20126:12
Swarm Source
ipfs://a1380b40333cb10978403b2aa02f2d57a020c3e9fffdf4c9ea64568f3c4a346c
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 25 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.