Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 110 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Create Vault | 18316225 | 490 days ago | IN | 0 ETH | 0.01166096 | ||||
Create Vault | 18292875 | 493 days ago | IN | 0 ETH | 0.03113421 | ||||
Create Vault | 18278268 | 495 days ago | IN | 0 ETH | 0.04142731 | ||||
Create Vault | 18277373 | 495 days ago | IN | 0 ETH | 0.02434212 | ||||
Create Vault | 18273215 | 496 days ago | IN | 0 ETH | 0.01963864 | ||||
Create Vault | 18273051 | 496 days ago | IN | 0 ETH | 0.02179049 | ||||
Create Vault | 18237404 | 501 days ago | IN | 0 ETH | 0.01554071 | ||||
Create Vault | 18215358 | 504 days ago | IN | 0 ETH | 0.04744892 | ||||
Create Vault | 18212293 | 504 days ago | IN | 0 ETH | 0.0142916 | ||||
Create Vault | 18201842 | 506 days ago | IN | 0 ETH | 0.01599073 | ||||
Create Vault | 18165891 | 511 days ago | IN | 0 ETH | 0.03716159 | ||||
Create Vault | 18158968 | 512 days ago | IN | 0 ETH | 0.01139402 | ||||
Create Vault | 18137842 | 515 days ago | IN | 0 ETH | 0.02495416 | ||||
Create Vault | 18129394 | 516 days ago | IN | 0 ETH | 0.04428923 | ||||
Create Vault | 18115509 | 518 days ago | IN | 0 ETH | 0.04670002 | ||||
Create Vault | 18115453 | 518 days ago | IN | 0 ETH | 0.00140473 | ||||
Create Vault | 18094704 | 521 days ago | IN | 0 ETH | 0.02953806 | ||||
Create Vault | 18080500 | 523 days ago | IN | 0 ETH | 0.01807076 | ||||
Create Vault | 18077182 | 523 days ago | IN | 0 ETH | 0.04669749 | ||||
Create Vault | 18073771 | 524 days ago | IN | 0 ETH | 0.08525312 | ||||
Create Vault | 18012226 | 532 days ago | IN | 0 ETH | 0.04748241 | ||||
Create Vault | 18011253 | 532 days ago | IN | 0 ETH | 0.02671977 | ||||
Create Vault | 18003559 | 534 days ago | IN | 0 ETH | 0.01974979 | ||||
Create Vault | 17971746 | 538 days ago | IN | 0 ETH | 0.09822745 | ||||
Create Vault | 17971694 | 538 days ago | IN | 0 ETH | 0.10523034 |
Latest 25 internal transactions (View All)
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
VaultFactory
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-10-01 */ // File: contracts/interfaces/IVaultFactory.sol pragma solidity 0.8.4; interface IVaultFactory { function notifyUnlock(bool isCompletelyUnlocked) external; } // File: contracts/interfaces/IVault.sol pragma solidity 0.8.4; interface IVault { function getBeneficiary() external view returns (address); } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // 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 (last updated v4.7.0) (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)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @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/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (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`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev 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 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 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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); } // File: contracts/interfaces/IVaultKey.sol pragma solidity 0.8.4; interface IVaultKey is IERC721 { function mintKey(address to) external; function lastMintedKeyId(address to) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol // OpenZeppelin Contracts (last updated v4.7.0) (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: contracts/interfaces/IDepositHandler.sol pragma solidity 0.8.4; interface IDepositHandler { struct FungibleTokenDeposit { address tokenAddress; uint256 amount; bool isLP; } struct NonFungibleTokenDeposit { address tokenAddress; uint256 tokenId; } struct MultiTokenDeposit { address tokenAddress; uint256 tokenId; uint256 amount; } } // File: contracts/vault/Vault.sol pragma solidity 0.8.4; contract Vault is IDepositHandler, IVault, IERC721Receiver, IERC1155Receiver { IVaultFactory public immutable vaultFactoryContract; IVaultKey public immutable vaultKeyContract; uint256 public immutable vaultKeyId; uint256 public immutable lockTimestamp; uint256 public immutable unlockTimestamp; bool public isUnlocked; modifier onlyKeyHolder() { require(vaultKeyContract.ownerOf(vaultKeyId) == msg.sender, "Vault:onlyKeyHolder:UNAUTHORIZED"); _; } modifier onlyUnlockable() { require(block.timestamp >= unlockTimestamp, "Vault:onlyUnlockable:PREMATURE"); _; } constructor( address _vaultKeyContractAddress, uint256 _keyId, uint256 _unlockTimestamp ) { vaultFactoryContract = IVaultFactory(msg.sender); vaultKeyContract = IVaultKey(_vaultKeyContractAddress); vaultKeyId = _keyId; lockTimestamp = block.timestamp; unlockTimestamp = _unlockTimestamp; isUnlocked = false; } function getBeneficiary() external view override returns (address) { return vaultKeyContract.ownerOf(vaultKeyId); } function onERC721Received( address, address, uint256, bytes calldata ) external pure override returns (bytes4) { return this.onERC721Received.selector; } function onERC1155Received( address, address, uint256, uint256, bytes calldata ) external pure override returns (bytes4) { return this.onERC1155Received.selector; } function onERC1155BatchReceived( address, address, uint256[] calldata, uint256[] calldata, bytes calldata ) external pure override returns (bytes4) { return this.onERC1155BatchReceived.selector; } function supportsInterface(bytes4 interfaceId) external pure override returns (bool) { return interfaceId == type(IERC721Receiver).interfaceId || interfaceId == type(IERC1155Receiver).interfaceId; } } // File: contracts/vault/MultiVault.sol pragma solidity 0.8.4; contract MultiVault is Vault { using SafeERC20 for IERC20; FungibleTokenDeposit[] public fungibleTokenDeposits; NonFungibleTokenDeposit[] public nonFungibleTokenDeposits; MultiTokenDeposit[] public multiTokenDeposits; constructor( address _vaultKeyContractAddress, uint256 _keyId, uint256 _unlockTimestamp, FungibleTokenDeposit[] memory _fungibleTokenDeposits, NonFungibleTokenDeposit[] memory _nonFungibleTokenDeposits, MultiTokenDeposit[] memory _multiTokenDeposits ) Vault(_vaultKeyContractAddress, _keyId, _unlockTimestamp) { for (uint256 i = 0; i < _fungibleTokenDeposits.length; i++) { fungibleTokenDeposits.push(_fungibleTokenDeposits[i]); } for (uint256 i = 0; i < _nonFungibleTokenDeposits.length; i++) { nonFungibleTokenDeposits.push(_nonFungibleTokenDeposits[i]); } for (uint256 i = 0; i < _multiTokenDeposits.length; i++) { multiTokenDeposits.push(_multiTokenDeposits[i]); } } function unlock(bytes memory data) external onlyKeyHolder onlyUnlockable { require(!isUnlocked, "MultiVault:unlock:ALREADY_OPEN: Vault has already been unlocked"); for (uint256 i = 0; i < fungibleTokenDeposits.length; i++) { IERC20 token = IERC20(fungibleTokenDeposits[i].tokenAddress); uint256 balance = token.balanceOf(address(this)); // in case a token is duplicated, only one transfer is required, hence the check if (balance > 0) { token.safeTransfer(msg.sender, balance); } } for (uint256 i = 0; i < nonFungibleTokenDeposits.length; i++) { IERC721(nonFungibleTokenDeposits[i].tokenAddress).safeTransferFrom( address(this), msg.sender, nonFungibleTokenDeposits[i].tokenId ); } for (uint256 i = 0; i < multiTokenDeposits.length; i++) { IERC1155(multiTokenDeposits[i].tokenAddress).safeTransferFrom( address(this), msg.sender, multiTokenDeposits[i].tokenId, multiTokenDeposits[i].amount, data ); } isUnlocked = true; vaultFactoryContract.notifyUnlock(true); } function partialFungibleTokenUnlock(address _tokenAddress, uint256 _tokenAmount) external onlyKeyHolder onlyUnlockable { require(_isLockedFungibleAddress(_tokenAddress), "MultiVault:partialFungibleTokenUnlock:INVALID_TOKEN"); IERC20(_tokenAddress).safeTransfer(msg.sender, _tokenAmount); vaultFactoryContract.notifyUnlock(_isCompletelyUnlocked()); } function partialNonFungibleTokenUnlock(address _tokenAddress, uint256 _tokenId) external onlyKeyHolder onlyUnlockable { require(_isLockedNonFungibleAddress(_tokenAddress), "MultiVault:partialNonFungibleTokenUnlock:INVALID_TOKEN"); IERC721(_tokenAddress).safeTransferFrom(address(this), msg.sender, _tokenId); vaultFactoryContract.notifyUnlock(_isCompletelyUnlocked()); } function partialMultiTokenUnlock( address _tokenAddress, uint256 _tokenId, uint256 _tokenAmount, bytes calldata data ) external onlyKeyHolder onlyUnlockable { require(_isLockedMultiAddress(_tokenAddress), "MultiVault:partialMultiTokenUnlock:INVALID_TOKEN"); IERC1155(_tokenAddress).safeTransferFrom(address(this), msg.sender, _tokenId, _tokenAmount, data); vaultFactoryContract.notifyUnlock(_isCompletelyUnlocked()); } function _isLockedFungibleAddress(address _tokenAddress) private view returns (bool) { for (uint256 i = 0; i < fungibleTokenDeposits.length; i++) { if (_tokenAddress == fungibleTokenDeposits[i].tokenAddress) { return true; } } return false; } function _isLockedNonFungibleAddress(address _tokenAddress) private view returns (bool) { for (uint256 i = 0; i < nonFungibleTokenDeposits.length; i++) { if (_tokenAddress == nonFungibleTokenDeposits[i].tokenAddress) { return true; } } return false; } function _isLockedMultiAddress(address _tokenAddress) private view returns (bool) { for (uint256 i = 0; i < multiTokenDeposits.length; i++) { if (_tokenAddress == multiTokenDeposits[i].tokenAddress) { return true; } } return false; } function _isCompletelyUnlocked() private view returns (bool) { for (uint256 i = 0; i < fungibleTokenDeposits.length; i++) { if (IERC20(fungibleTokenDeposits[i].tokenAddress).balanceOf(address(this)) > 0) { return false; } } for (uint256 i = 0; i < nonFungibleTokenDeposits.length; i++) { if (IERC721(nonFungibleTokenDeposits[i].tokenAddress).balanceOf(address(this)) > 0) { return false; } } for (uint256 i = 0; i < multiTokenDeposits.length; i++) { MultiTokenDeposit memory deposit = multiTokenDeposits[i]; if (IERC1155(deposit.tokenAddress).balanceOf(address(this), deposit.tokenId) > 0) { return false; } } return true; } } // File: contracts/vault/FungibleVestingVault.sol pragma solidity 0.8.4; contract FungibleVestingVault is IDepositHandler, Vault { using SafeERC20 for IERC20; mapping(address => uint256) public lastVestingTimestamp; address[] public tokenAddresses; constructor( address _vaultKeyContractAddress, uint256 _keyId, uint256 _vestingEndTimestamp, FungibleTokenDeposit[] memory _fungibleTokenDeposits ) Vault(_vaultKeyContractAddress, _keyId, _vestingEndTimestamp) { for (uint256 i = 0; i < _fungibleTokenDeposits.length; i++) { tokenAddresses.push(_fungibleTokenDeposits[i].tokenAddress); lastVestingTimestamp[_fungibleTokenDeposits[i].tokenAddress] = block.timestamp; } } function vest() external onlyKeyHolder { for (uint256 i = 0; i < tokenAddresses.length; i++) { uint256 amountAvailable = getTokenAvailability(tokenAddresses[i]); if (amountAvailable > 0) { IERC20(tokenAddresses[i]).safeTransfer(msg.sender, amountAvailable); lastVestingTimestamp[tokenAddresses[i]] = block.timestamp; } } isUnlocked = _isCompletelyUnlocked(); vaultFactoryContract.notifyUnlock(isUnlocked); } function partialVest(address _tokenAddress) external onlyKeyHolder { require( _isLockedFungibleAddress(_tokenAddress), "FungibleVestingVault:partialFungibleTokenVesting:INVALID_TOKEN" ); uint256 amountAvailable = getTokenAvailability(_tokenAddress); IERC20(_tokenAddress).safeTransfer(msg.sender, amountAvailable); lastVestingTimestamp[_tokenAddress] = block.timestamp; isUnlocked = _isCompletelyUnlocked(); vaultFactoryContract.notifyUnlock(isUnlocked); } function getTokenAvailability(address tokenAddress) public view returns (uint256) { // Send over all remaining tokens in the case where the unlock // timestamp has already expired. Otherwise vest linearly. uint256 balance = IERC20(tokenAddress).balanceOf(address(this)); if (block.timestamp >= unlockTimestamp) { return balance; } return (balance * (block.timestamp - lastVestingTimestamp[tokenAddress])) / (unlockTimestamp - lastVestingTimestamp[tokenAddress]); } function _isCompletelyUnlocked() private view returns (bool) { for (uint256 i = 0; i < tokenAddresses.length; i++) { if (IERC20(tokenAddresses[i]).balanceOf(address(this)) > 0) { return false; } } return true; } function _isLockedFungibleAddress(address _tokenAddress) private view returns (bool) { for (uint256 i = 0; i < tokenAddresses.length; i++) { if (_tokenAddress == tokenAddresses[i]) { return true; } } return false; } } // File: contracts/interfaces/IPaymentModule.sol pragma solidity 0.8.4; interface IPaymentModule is IDepositHandler { struct PaymentHolder { address tokenAddress; uint256 amount; uint256 payment; } function processPayment( address vault, address user, address referrer, FungibleTokenDeposit[] memory fungibleTokenDeposits, NonFungibleTokenDeposit[] memory nonFungibleTokenDeposits, MultiTokenDeposit[] memory multiTokenDeposit, bool isVesting ) external; } // File: contracts/VaultFactory.sol pragma solidity 0.8.4; contract VaultFactory is IDepositHandler { enum VaultStatus { Inactive, Locked, Unlocked } mapping(uint256 => address) public vaultByKey; mapping(address => VaultStatus) public vaultStatus; address public owner; IVaultKey public keyNFT; IPaymentModule public paymentModule; uint256 public maxTokensPerVault; event MaxTokensUpdated(uint256 indexed oldMax, uint256 indexed newMax); event PaymentModuleUpdated(address indexed oldModule, address indexed newModule); event VaultUnlocked(address indexed vault, uint256 timestamp, bool isCompletelyUnlocked); event VaultCreated( address indexed vault, uint256 indexed key, address benefactor, address indexed beneficiary, uint256 unlockTimestamp, FungibleTokenDeposit[] fungibleTokenDeposits, NonFungibleTokenDeposit[] nonFungibleTokenDeposits, MultiTokenDeposit[] multiTokenDeposits, bool isVesting ); constructor( address keyNFTAddress, address paymentModuleAddress, uint256 maxTokens ) { keyNFT = IVaultKey(keyNFTAddress); paymentModule = IPaymentModule(paymentModuleAddress); owner = msg.sender; maxTokensPerVault = maxTokens; } function setMaxTokensPerVault(uint256 newMax) external { require(msg.sender == owner, "VaultFactory:setMaxTokensPerVault:OWNER_ONLY"); uint256 oldMax = maxTokensPerVault; maxTokensPerVault = newMax; emit MaxTokensUpdated(oldMax, newMax); } function createVault( address referrer, address beneficiary, uint256 unlockTimestamp, FungibleTokenDeposit[] memory fungibleTokenDeposits, NonFungibleTokenDeposit[] memory nonFungibleTokenDeposits, MultiTokenDeposit[] memory multiTokenDeposits, bool isVesting ) external { require(unlockTimestamp >= block.timestamp, "VaultFactory:createVault:UNLOCK_IN_PAST"); require( fungibleTokenDeposits.length > 0 || nonFungibleTokenDeposits.length > 0 || multiTokenDeposits.length > 0, "VaultFactory:createVault:NO_DEPOSITS" ); require( fungibleTokenDeposits.length + nonFungibleTokenDeposits.length + multiTokenDeposits.length < maxTokensPerVault, "VaultFactory:createVault:MAX_DEPOSITS_EXCEEDED" ); for (uint256 i = 0; i < fungibleTokenDeposits.length; i++) { require(fungibleTokenDeposits[i].amount > 0, "VaultFactory:createVault:ZERO_DEPOSIT"); } for (uint256 i = 0; i < multiTokenDeposits.length; i++) { require(multiTokenDeposits[i].amount > 0, "VaultFactory:createVault:ZERO_DEPOSIT"); } // Mint a key for the new vault. keyNFT.mintKey(beneficiary); uint256 keyId = keyNFT.lastMintedKeyId(beneficiary); // Early definition of vault address variable to allow usage by the // conditional branches of this function. address vault; if (isVesting) { require( nonFungibleTokenDeposits.length == 0 && multiTokenDeposits.length == 0, "VaultFactory:createVault:ONLY_FUNGIBLE_VESTING" ); vault = _createVestingVault(keyId, unlockTimestamp, fungibleTokenDeposits); } else { vault = _createBatchVault( keyId, unlockTimestamp, fungibleTokenDeposits, nonFungibleTokenDeposits, multiTokenDeposits ); } paymentModule.processPayment( vault, msg.sender, referrer, fungibleTokenDeposits, nonFungibleTokenDeposits, multiTokenDeposits, isVesting ); vaultByKey[keyId] = vault; vaultStatus[vault] = VaultStatus.Locked; emit VaultCreated( vault, keyId, msg.sender, beneficiary, unlockTimestamp, fungibleTokenDeposits, nonFungibleTokenDeposits, multiTokenDeposits, isVesting ); } function notifyUnlock(bool isCompletelyUnlocked) external { require(vaultStatus[msg.sender] == VaultStatus.Locked, "VaultFactory:notifyUnlock:ALREADY_FULL_UNLOCKED"); if (isCompletelyUnlocked) { vaultStatus[msg.sender] = VaultStatus.Unlocked; } emit VaultUnlocked(msg.sender, block.timestamp, isCompletelyUnlocked); } function updateOwner(address newOwner) external { require(msg.sender == owner, "VaultFactory:updateOwner:OWNER_ONLY"); owner = newOwner; } function updatePaymentModule(address newModule) external { require(msg.sender == owner, "VaultFactory:updatePaymentModule:OWNER_ONLY"); address oldModule = address(paymentModule); paymentModule = IPaymentModule(newModule); emit PaymentModuleUpdated(oldModule, newModule); } function _createVestingVault( uint256 keyId, uint256 unlockTimestamp, FungibleTokenDeposit[] memory fungibleTokenDeposits ) private returns (address) { FungibleVestingVault vault = new FungibleVestingVault( address(keyNFT), keyId, unlockTimestamp, fungibleTokenDeposits ); return address(vault); } function _createBatchVault( uint256 keyId, uint256 unlockTimestamp, FungibleTokenDeposit[] memory fungibleTokenDeposits, NonFungibleTokenDeposit[] memory nonFungibleTokenDeposits, MultiTokenDeposit[] memory multiTokenDeposits ) private returns (address) { MultiVault vault = new MultiVault( address(keyNFT), keyId, unlockTimestamp, fungibleTokenDeposits, nonFungibleTokenDeposits, multiTokenDeposits ); return address(vault); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"keyNFTAddress","type":"address"},{"internalType":"address","name":"paymentModuleAddress","type":"address"},{"internalType":"uint256","name":"maxTokens","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"oldMax","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"MaxTokensUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldModule","type":"address"},{"indexed":true,"internalType":"address","name":"newModule","type":"address"}],"name":"PaymentModuleUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"vault","type":"address"},{"indexed":true,"internalType":"uint256","name":"key","type":"uint256"},{"indexed":false,"internalType":"address","name":"benefactor","type":"address"},{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"unlockTimestamp","type":"uint256"},{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"isLP","type":"bool"}],"indexed":false,"internalType":"struct IDepositHandler.FungibleTokenDeposit[]","name":"fungibleTokenDeposits","type":"tuple[]"},{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"indexed":false,"internalType":"struct IDepositHandler.NonFungibleTokenDeposit[]","name":"nonFungibleTokenDeposits","type":"tuple[]"},{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"indexed":false,"internalType":"struct IDepositHandler.MultiTokenDeposit[]","name":"multiTokenDeposits","type":"tuple[]"},{"indexed":false,"internalType":"bool","name":"isVesting","type":"bool"}],"name":"VaultCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"vault","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isCompletelyUnlocked","type":"bool"}],"name":"VaultUnlocked","type":"event"},{"inputs":[{"internalType":"address","name":"referrer","type":"address"},{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"unlockTimestamp","type":"uint256"},{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"isLP","type":"bool"}],"internalType":"struct IDepositHandler.FungibleTokenDeposit[]","name":"fungibleTokenDeposits","type":"tuple[]"},{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"internalType":"struct IDepositHandler.NonFungibleTokenDeposit[]","name":"nonFungibleTokenDeposits","type":"tuple[]"},{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IDepositHandler.MultiTokenDeposit[]","name":"multiTokenDeposits","type":"tuple[]"},{"internalType":"bool","name":"isVesting","type":"bool"}],"name":"createVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"keyNFT","outputs":[{"internalType":"contract IVaultKey","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokensPerVault","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"isCompletelyUnlocked","type":"bool"}],"name":"notifyUnlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paymentModule","outputs":[{"internalType":"contract IPaymentModule","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"setMaxTokensPerVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"updateOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newModule","type":"address"}],"name":"updatePaymentModule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"vaultByKey","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"vaultStatus","outputs":[{"internalType":"enum VaultFactory.VaultStatus","name":"","type":"uint8"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50604051620051163803806200511683398101604081905261003191610091565b600380546001600160a01b039485166001600160a01b03199182161790915560048054939094169281169290921790925560028054909116331790556005556100cc565b80516001600160a01b038116811461008c57600080fd5b919050565b6000806000606084860312156100a5578283fd5b6100ae84610075565b92506100bc60208501610075565b9150604084015190509250925092565b61503a80620000dc6000396000f3fe60806040523480156200001157600080fd5b5060043610620000d95760003560e01c8063b9f53fc3116200008b578063e46d96a21162000062578063e46d96a214620001e4578063e71324bd14620001fb578063f4ddaef3146200020f57600080fd5b8063b9f53fc3146200016c578063d0cf00541462000198578063de1db43a14620001cd57600080fd5b806378546fa211620000c057806378546fa21462000128578063880cdc3114620001415780638da5cb5b146200015857600080fd5b806330a1cc9614620000de5780633cf57c61146200010f575b600080fd5b600454620000f2906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b620001266200012036600462000f34565b62000226565b005b6200013260055481565b60405190815260200162000106565b620001266200015236600462000d6a565b620002e5565b600254620000f2906001600160a01b031681565b620000f26200017d36600462000f34565b6000602081905290815260409020546001600160a01b031681565b620001be620001a936600462000d6a565b60016020526000908152604090205460ff1681565b604051620001069190620011da565b62000126620001de36600462000d6a565b6200037c565b62000126620001f536600462000f17565b6200045d565b600354620000f2906001600160a01b031681565b620001266200022036600462000d8e565b62000568565b6002546001600160a01b03163314620002ac5760405162461bcd60e51b815260206004820152602c60248201527f5661756c74466163746f72793a7365744d6178546f6b656e735065725661756c60448201527f743a4f574e45525f4f4e4c59000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6005805490829055604051829082907fed0b12faffd2cf512a39ed490e2449ef21e0fceb01dfbd1b163d455947cde7bb90600090a35050565b6002546001600160a01b031633146200034d5760405162461bcd60e51b815260206004820152602360248201527f5661756c74466163746f72793a7570646174654f776e65723a4f574e45525f4f6044820152624e4c5960e81b6064820152608401620002a3565b6002805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6002546001600160a01b03163314620003fe5760405162461bcd60e51b815260206004820152602b60248201527f5661756c74466163746f72793a7570646174655061796d656e744d6f64756c6560448201527f3a4f574e45525f4f4e4c590000000000000000000000000000000000000000006064820152608401620002a3565b600480546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907fb9cd00730add6e591032c866c4356d07d8e8a417427b3898f6b2a3f451c13b9d90600090a35050565b60013360009081526001602052604090205460ff1660028111156200049257634e487b7160e01b600052602160045260246000fd5b14620005075760405162461bcd60e51b815260206004820152602f60248201527f5661756c74466163746f72793a6e6f74696679556e6c6f636b3a414c5245414460448201527f595f46554c4c5f554e4c4f434b454400000000000000000000000000000000006064820152608401620002a3565b80156200052957336000908152600160205260409020805460ff191660021790555b60408051428152821515602082015233917f78a7bc4bfc94fe86303e760b594b28d27a71fd56199715f6dd6186edf54158b7910160405180910390a250565b42851015620005e05760405162461bcd60e51b815260206004820152602760248201527f5661756c74466163746f72793a6372656174655661756c743a554e4c4f434b5f60448201527f494e5f50415354000000000000000000000000000000000000000000000000006064820152608401620002a3565b600084511180620005f2575060008351115b80620005ff575060008251115b620006595760405162461bcd60e51b8152602060048201526024808201527f5661756c74466163746f72793a6372656174655661756c743a4e4f5f4445504f6044820152635349545360e01b6064820152608401620002a3565b6005548251845186516200066e9190620012b0565b6200067a9190620012b0565b10620006ef5760405162461bcd60e51b815260206004820152602e60248201527f5661756c74466163746f72793a6372656174655661756c743a4d41585f44455060448201527f4f534954535f45584345454445440000000000000000000000000000000000006064820152608401620002a3565b60005b84518110156200079d5760008582815181106200071f57634e487b7160e01b600052603260045260246000fd5b60200260200101516020015111620007885760405162461bcd60e51b815260206004820152602560248201527f5661756c74466163746f72793a6372656174655661756c743a5a45524f5f44456044820152641413d4d25560da1b6064820152608401620002a3565b806200079481620012cb565b915050620006f2565b5060005b82518110156200084c576000838281518110620007ce57634e487b7160e01b600052603260045260246000fd5b60200260200101516040015111620008375760405162461bcd60e51b815260206004820152602560248201527f5661756c74466163746f72793a6372656174655661756c743a5a45524f5f44456044820152641413d4d25560da1b6064820152608401620002a3565b806200084381620012cb565b915050620007a1565b506003546040516369d0465960e11b81526001600160a01b0388811660048301529091169063d3a08cb290602401600060405180830381600087803b1580156200089557600080fd5b505af1158015620008aa573d6000803e3d6000fd5b5050600354604051632bed542b60e01b81526001600160a01b038a81166004830152600094509091169150632bed542b9060240160206040518083038186803b158015620008f757600080fd5b505afa1580156200090c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000932919062000f4d565b905060008215620009d55784511580156200094c57508351155b620009c05760405162461bcd60e51b815260206004820152602e60248201527f5661756c74466163746f72793a6372656174655661756c743a4f4e4c595f465560448201527f4e4749424c455f56455354494e470000000000000000000000000000000000006064820152608401620002a3565b620009cd82888862000b0e565b9050620009e7565b620009e4828888888862000b6e565b90505b60048054604051631cfe324560e21b81526001600160a01b03909116916373f8c9149162000a2491859133918f918d918d918d918d910162001058565b600060405180830381600087803b15801562000a3f57600080fd5b505af115801562000a54573d6000803e3d6000fd5b505050600083815260208181526040808320805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038716908117909155835260019182905290912080549192509060ff191682800217905550876001600160a01b031682826001600160a01b03167f525b2435dc9cf297200a04c2498178593679ce420b75066d8c9c75054b73c361338b8b8b8b8b60405162000afb96959493929190620010cf565b60405180910390a4505050505050505050565b600080600360009054906101000a90046001600160a01b031685858560405162000b389062000bd4565b62000b47949392919062001139565b604051809103906000f08015801562000b64573d6000803e3d6000fd5b5095945050505050565b600080600360009054906101000a90046001600160a01b0316878787878760405162000b9a9062000be2565b62000bab9695949392919062001173565b604051809103906000f08015801562000bc8573d6000803e3d6000fd5b50979650505050505050565b611663806200131683390190565b61268c806200297983390190565b80356001600160a01b038116811462000c0857600080fd5b919050565b600082601f83011262000c1e578081fd5b8135602062000c3762000c318362001289565b62001255565b8281528181019085830160608086028801850189101562000c56578687fd5b865b8681101562000cac5781838b03121562000c70578788fd5b62000c7a62001203565b62000c858462000bf0565b81528387013587820152604080850135908201528552938501939181019160010162000c58565b509198975050505050505050565b600082601f83011262000ccb578081fd5b8135602062000cde62000c318362001289565b80838252828201915082860187848660061b890101111562000cfe578586fd5b855b8581101562000d4c57604080838b03121562000d1a578788fd5b62000d246200122f565b62000d2f8462000bf0565b815283870135878201528552938501939091019060010162000d00565b5090979650505050505050565b8035801515811462000c0857600080fd5b60006020828403121562000d7c578081fd5b62000d878262000bf0565b9392505050565b600080600080600080600060e0888a03121562000da9578283fd5b62000db48862000bf0565b965062000dc46020890162000bf0565b95506040880135945067ffffffffffffffff6060890135111562000de6578283fd5b6060880135880189601f82011262000dfc578384fd5b62000e0c62000c31823562001289565b8082358252602082019150602083018c60206060863502860101111562000e31578687fd5b865b843581101562000e99576060828f03121562000e4d578788fd5b62000e5762001203565b62000e628362000bf0565b81526020830135602082015262000e7c6040840162000d59565b604082015284526020909301926060919091019060010162000e33565b505080965050505067ffffffffffffffff6080890135111562000eba578283fd5b62000ecc8960808a01358a0162000cba565b925067ffffffffffffffff60a0890135111562000ee7578182fd5b62000ef98960a08a01358a0162000c0d565b915062000f0960c0890162000d59565b905092959891949750929550565b60006020828403121562000f29578081fd5b62000d878262000d59565b60006020828403121562000f46578081fd5b5035919050565b60006020828403121562000f5f578081fd5b5051919050565b6000815180845260208085019450808401835b8381101562000fb857815180516001600160a01b0316885283810151848901526040908101511515908801526060909601959082019060010162000f79565b509495945050505050565b6000815180845260208085019450808401835b8381101562000fb857815180516001600160a01b031688528381015184890152604090810151908801526060909601959082019060010162000fd6565b6000815180845260208085019450808401835b8381101562000fb857815180516001600160a01b03168852830151838801526040909601959082019060010162001026565b60006001600160a01b03808a168352808916602084015280881660408401525060e060608301526200108e60e083018762000f66565b8281036080840152620010a2818762001013565b905082810360a0840152620010b8818662000fc3565b91505082151560c083015298975050505050505050565b6001600160a01b038716815285602082015260c060408201526000620010f960c083018762000f66565b82810360608401526200110d818762001013565b9050828103608084015262001123818662000fc3565b91505082151560a0830152979650505050505050565b6001600160a01b038516815283602082015282604082015260806060820152600062001169608083018462000f66565b9695505050505050565b6001600160a01b038716815285602082015284604082015260c060608201526000620011a360c083018662000f66565b8281036080840152620011b7818662001013565b905082810360a0840152620011cd818562000fc3565b9998505050505050505050565b6020810160038310620011fd57634e487b7160e01b600052602160045260246000fd5b91905290565b6040516060810167ffffffffffffffff81118282101715620012295762001229620012ff565b60405290565b6040805190810167ffffffffffffffff81118282101715620012295762001229620012ff565b604051601f8201601f1916810167ffffffffffffffff81118282101715620012815762001281620012ff565b604052919050565b600067ffffffffffffffff821115620012a657620012a6620012ff565b5060051b60200190565b60008219821115620012c657620012c6620012e9565b500190565b6000600019821415620012e257620012e2620012e9565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfe6101206040523480156200001257600080fd5b506040516200166338038062001663833981016040819052620000359162000159565b33606090811b60805284901b6001600160601b03191660a05260c08390524260e0526101008290526000805460ff191681555b8151811015620001315760028282815181106200009557634e487b7160e01b600052603260045260246000fd5b6020908102919091018101515182546001808201855560009485529284200180546001600160a01b0319166001600160a01b039092169190911790558351429290859085908110620000f757634e487b7160e01b600052603260045260246000fd5b602090810291909101810151516001600160a01b0316825281019190915260400160002055806200012881620002d3565b91505062000068565b505050505062000311565b80516001600160a01b03811681146200015457600080fd5b919050565b600080600080608085870312156200016f578384fd5b6200017a856200013c565b93506020808601519350604080870151935060608088015160018060401b0380821115620001a6578586fd5b818a0191508a601f830112620001ba578586fd5b815181811115620001cf57620001cf620002fb565b620001df868260051b01620002a0565b8181528681019250838701858302850188018e1015620001fd578889fd5b8894505b82851015620002635785818f03121562000219578889fd5b6200022362000275565b6200022e826200013c565b815288820151898201528782015180151581146200024a578a8bfd5b8189015284526001949094019392870192850162000201565b50999c989b5096995050505050505050565b604051606081016001600160401b03811182821017156200029a576200029a620002fb565b60405290565b604051601f8201601f191681016001600160401b0381118282101715620002cb57620002cb620002fb565b604052919050565b6000600019821415620002f457634e487b7160e01b81526011600452602481fd5b5060010190565b634e487b7160e01b600052604160045260246000fd5b60805160601c60a05160601c60c05160e051610100516112c1620003a2600039600081816102230152818161098301526109cd0152600061024a0152600081816102b30152818161034e015281816105f201526108530152600081816101ef0152818161037e01528181610622015261087c0152600081816101a70152818161057d01526107dc01526112c16000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c80638380edb711610097578063cf3ba42311610066578063cf3ba4231461028e578063e4dfeac0146102ae578063e5df8b84146102d5578063f23a6e61146102e857600080fd5b80638380edb714610211578063aa082a9d1461021e578063b544bf8314610245578063bc197c811461026c57600080fd5b8063565a2e2c116100d3578063565a2e2c146101825780636e2d47f6146101a25780636fb1d79e146101c9578063796b658b146101ea57600080fd5b806301ffc9a714610105578063150b7a021461012d578063458efde3146101655780634c8d0bbd1461016f575b600080fd5b610118610113366004611119565b610308565b60405190151581526020015b60405180910390f35b61014c61013b36600461100e565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610124565b61016d61033f565b005b61016d61017d366004610f1b565b6105e3565b61018a610844565b6040516001600160a01b039091168152602001610124565b61018a7f000000000000000000000000000000000000000000000000000000000000000081565b6101dc6101d7366004610f1b565b610903565b604051908152602001610124565b61018a7f000000000000000000000000000000000000000000000000000000000000000081565b6000546101189060ff1681565b6101dc7f000000000000000000000000000000000000000000000000000000000000000081565b6101dc7f000000000000000000000000000000000000000000000000000000000000000081565b61014c61027a366004610f53565b63bc197c8160e01b98975050505050505050565b6101dc61029c366004610f1b565b60016020526000908152604090205481565b6101dc7f000000000000000000000000000000000000000000000000000000000000000081565b61018a6102e3366004611141565b610a2f565b61014c6102f636600461107f565b63f23a6e6160e01b9695505050505050565b60006001600160e01b03198216630a85bd0160e11b148061033957506001600160e01b03198216630271189760e51b145b92915050565b6040516331a9108f60e11b81527f0000000000000000000000000000000000000000000000000000000000000000600482015233906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636352211e9060240160206040518083038186803b1580156103c057600080fd5b505afa1580156103d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103f89190610f37565b6001600160a01b0316146104535760405162461bcd60e51b815260206004820181905260248201527f5661756c743a6f6e6c794b6579486f6c6465723a554e415554484f52495a454460448201526064015b60405180910390fd5b60005b6002548110156105495760006104a06002838154811061048657634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316610903565b90508015610536576104ea3382600285815481106104ce57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03169190610a59565b42600160006002858154811061051057634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020555b508061054181611242565b915050610456565b50610552610ac5565b6000805460ff19169115159182179055604051637236cb5160e11b815260ff909116151560048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e46d96a290602401600060405180830381600087803b1580156105c957600080fd5b505af11580156105dd573d6000803e3d6000fd5b50505050565b6040516331a9108f60e11b81527f0000000000000000000000000000000000000000000000000000000000000000600482015233906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636352211e9060240160206040518083038186803b15801561066457600080fd5b505afa158015610678573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061069c9190610f37565b6001600160a01b0316146106f25760405162461bcd60e51b815260206004820181905260248201527f5661756c743a6f6e6c794b6579486f6c6465723a554e415554484f52495a4544604482015260640161044a565b6106fb81610ba2565b61076d5760405162461bcd60e51b815260206004820152603e60248201527f46756e6769626c6556657374696e675661756c743a7061727469616c46756e6760448201527f69626c65546f6b656e56657374696e673a494e56414c49445f544f4b454e0000606482015260840161044a565b600061077882610903565b905061078e6001600160a01b0383163383610a59565b6001600160a01b03821660009081526001602052604090204290556107b1610ac5565b6000805460ff19169115159182179055604051637236cb5160e11b815260ff909116151560048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e46d96a290602401600060405180830381600087803b15801561082857600080fd5b505af115801561083c573d6000803e3d6000fd5b505050505050565b6040516331a9108f60e11b81527f000000000000000000000000000000000000000000000000000000000000000060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690636352211e9060240160206040518083038186803b1580156108c657600080fd5b505afa1580156108da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108fe9190610f37565b905090565b6040516370a0823160e01b815230600482015260009081906001600160a01b038416906370a082319060240160206040518083038186803b15801561094757600080fd5b505afa15801561095b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097f9190611159565b90507f000000000000000000000000000000000000000000000000000000000000000042106109ae5792915050565b6001600160a01b0383166000908152600160205260409020546109f1907f00000000000000000000000000000000000000000000000000000000000000006111ff565b6001600160a01b038416600090815260016020526040902054610a1490426111ff565b610a1e90836111e0565b610a2891906111c0565b9392505050565b60028181548110610a3f57600080fd5b6000918252602090912001546001600160a01b0316905081565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b179052610ac0908490610c14565b505050565b6000805b600254811015610b9a57600060028281548110610af657634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015610b4257600080fd5b505afa158015610b56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7a9190611159565b1115610b8857600091505090565b80610b9281611242565b915050610ac9565b506001905090565b6000805b600254811015610c0b5760028181548110610bd157634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0384811691161415610bf95750600192915050565b80610c0381611242565b915050610ba6565b50600092915050565b6000610c69826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610cf99092919063ffffffff16565b805190915015610ac05780806020019051810190610c8791906110f9565b610ac05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161044a565b6060610d088484600085610d10565b949350505050565b606082471015610d885760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161044a565b6001600160a01b0385163b610ddf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161044a565b600080866001600160a01b03168587604051610dfb9190611171565b60006040518083038185875af1925050503d8060008114610e38576040519150601f19603f3d011682016040523d82523d6000602084013e610e3d565b606091505b5091509150610e4d828286610e58565b979650505050505050565b60608315610e67575081610a28565b825115610e775782518084602001fd5b8160405162461bcd60e51b815260040161044a919061118d565b60008083601f840112610ea2578182fd5b50813567ffffffffffffffff811115610eb9578182fd5b6020830191508360208260051b8501011115610ed457600080fd5b9250929050565b60008083601f840112610eec578182fd5b50813567ffffffffffffffff811115610f03578182fd5b602083019150836020828501011115610ed457600080fd5b600060208284031215610f2c578081fd5b8135610a2881611273565b600060208284031215610f48578081fd5b8151610a2881611273565b60008060008060008060008060a0898b031215610f6e578384fd5b8835610f7981611273565b97506020890135610f8981611273565b9650604089013567ffffffffffffffff80821115610fa5578586fd5b610fb18c838d01610e91565b909850965060608b0135915080821115610fc9578586fd5b610fd58c838d01610e91565b909650945060808b0135915080821115610fed578384fd5b50610ffa8b828c01610edb565b999c989b5096995094979396929594505050565b600080600080600060808688031215611025578081fd5b853561103081611273565b9450602086013561104081611273565b935060408601359250606086013567ffffffffffffffff811115611062578182fd5b61106e88828901610edb565b969995985093965092949392505050565b60008060008060008060a08789031215611097578182fd5b86356110a281611273565b955060208701356110b281611273565b94506040870135935060608701359250608087013567ffffffffffffffff8111156110db578283fd5b6110e789828a01610edb565b979a9699509497509295939492505050565b60006020828403121561110a578081fd5b81518015158114610a28578182fd5b60006020828403121561112a578081fd5b81356001600160e01b031981168114610a28578182fd5b600060208284031215611152578081fd5b5035919050565b60006020828403121561116a578081fd5b5051919050565b60008251611183818460208701611216565b9190910192915050565b60208152600082518060208401526111ac816040850160208701611216565b601f01601f19169190910160400192915050565b6000826111db57634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156111fa576111fa61125d565b500290565b6000828210156112115761121161125d565b500390565b60005b83811015611231578181015183820152602001611219565b838111156105dd5750506000910152565b60006000198214156112565761125661125d565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461128857600080fd5b5056fea2646970667358221220fd0cffbb96c6e807f6772cf6c047d2bc50578eaa568e7e73a5c5a8b1c521a93564736f6c634300080400336101206040523480156200001257600080fd5b506040516200268c3803806200268c8339810160408190526200003591620003b7565b33606090811b60805286901b6001600160601b03191660a05260c08590524260e0526101008490526000805460ff191681555b8351811015620001125760018482815181106200009557634e487b7160e01b600052603260045260246000fd5b602090810291909101810151825460018082018555600094855293839020825160039092020180546001600160a01b0319166001600160a01b0390921691909117815591810151928201929092556040909101516002909101805460ff1916911515919091179055806200010981620005c0565b91505062000068565b5060005b8251811015620001a15760028382815181106200014357634e487b7160e01b600052603260045260246000fd5b602090810291909101810151825460018082018555600094855293839020825160029092020180546001600160a01b0319166001600160a01b03909216919091178155910151910155806200019881620005c0565b91505062000116565b5060005b815181101562000241576003828281518110620001d257634e487b7160e01b600052603260045260246000fd5b602090810291909101810151825460018082018555600094855293839020825160039092020180546001600160a01b0319166001600160a01b039092169190911781559181015192820192909255604090910151600290910155806200023881620005c0565b915050620001a5565b50505050505050620005fe565b80516001600160a01b03811681146200026657600080fd5b919050565b600082601f8301126200027c578081fd5b81516020620002956200028f836200059a565b62000567565b82815281810190858301606080860288018501891015620002b4578687fd5b865b868110156200030a5781838b031215620002ce578788fd5b620002d862000517565b620002e3846200024e565b815283870151878201526040808501519082015285529385019391810191600101620002b6565b509198975050505050505050565b600082601f83011262000329578081fd5b815160206200033c6200028f836200059a565b80838252828201915082860187848660061b89010111156200035c578586fd5b855b85811015620003aa57604080838b03121562000378578788fd5b6200038262000542565b6200038d846200024e565b81528387015187820152855293850193909101906001016200035e565b5090979650505050505050565b60008060008060008060c08789031215620003d0578182fd5b620003db876200024e565b6020880151604089015160608a015192985090965094506001600160401b038082111562000407578384fd5b818901915089601f8301126200041b578384fd5b81516200042c6200028f826200059a565b80828252602082019150602085018d60206060860288010111156200044f578788fd5b8795505b83861015620004bd576060818f0312156200046c578788fd5b6200047662000517565b62000481826200024e565b81526020820151602082015260408201518015158114620004a057898afd5b604082015283526001959095019460209092019160600162000453565b5060808c01519097509350505080821115620004d7578384fd5b620004e58a838b0162000318565b935060a0890151915080821115620004fb578283fd5b506200050a89828a016200026b565b9150509295509295509295565b604051606081016001600160401b03811182821017156200053c576200053c620005e8565b60405290565b604080519081016001600160401b03811182821017156200053c576200053c620005e8565b604051601f8201601f191681016001600160401b0381118282101715620005925762000592620005e8565b604052919050565b60006001600160401b03821115620005b657620005b6620005e8565b5060051b60200190565b6000600019821415620005e157634e487b7160e01b81526011600452602481fd5b5060010190565b634e487b7160e01b600052604160045260246000fd5b60805160601c60a05160601c60c05160e05161010051611fc5620006c7600039600081816102fa0152818161051a0152818161084401528181610e9c01526112060152600061034201526000818161038b015281816104130152818161074201528181610cdb01528181610d9a0152611104015260008181610247015281816104430152818161077201528181610d0401528181610dca01526111340152600081816102200152818161066b01528181610c6d01528181610fef01526113050152611fc56000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c80638380edb7116100b2578063b0bd17d211610081578063bc197c8111610066578063bc197c8114610364578063e4dfeac014610386578063f23a6e61146103ad57600080fd5b8063b0bd17d21461032a578063b544bf831461033d57600080fd5b80638380edb71461027c57806385fde44c14610289578063a608b317146102bb578063aa082a9d146102f557600080fd5b806348c89491116101095780636e2d47f6116100ee5780636e2d47f61461021b578063796b658b1461024257806381763bf11461026957600080fd5b806348c89491146101e8578063565a2e2c146101fb57600080fd5b806301ffc9a71461013b578063150b7a021461016357806330fde4e31461019b578063469a417a146101b0575b600080fd5b61014e610149366004611d1d565b6103cd565b60405190151581526020015b60405180910390f35b610182610171366004611b9c565b630a85bd0160e11b95945050505050565b6040516001600160e01b0319909116815260200161015a565b6101ae6101a9366004611c87565b610404565b005b6101c36101be366004611def565b6106f6565b604080516001600160a01b03909416845260208401929092529082015260600161015a565b6101ae6101f6366004611d45565b610733565b610203610ccc565b6040516001600160a01b03909116815260200161015a565b6102037f000000000000000000000000000000000000000000000000000000000000000081565b6102037f000000000000000000000000000000000000000000000000000000000000000081565b6101ae610277366004611cb2565b610d8b565b60005461014e9060ff1681565b61029c610297366004611def565b61107d565b604080516001600160a01b03909316835260208301919091520161015a565b6102ce6102c9366004611def565b6110b5565b604080516001600160a01b039094168452602084019290925215159082015260600161015a565b61031c7f000000000000000000000000000000000000000000000000000000000000000081565b60405190815260200161015a565b6101ae610338366004611c87565b6110f5565b61031c7f000000000000000000000000000000000000000000000000000000000000000081565b610182610372366004611ae1565b63bc197c8160e01b98975050505050505050565b61031c7f000000000000000000000000000000000000000000000000000000000000000081565b6101826103bb366004611c0d565b63f23a6e6160e01b9695505050505050565b60006001600160e01b03198216630a85bd0160e11b14806103fe57506001600160e01b03198216630271189760e51b145b92915050565b6040516331a9108f60e11b81527f0000000000000000000000000000000000000000000000000000000000000000600482015233906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636352211e9060240160206040518083038186803b15801561048557600080fd5b505afa158015610499573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104bd9190611ac5565b6001600160a01b0316146105185760405162461bcd60e51b815260206004820181905260248201527f5661756c743a6f6e6c794b6579486f6c6465723a554e415554484f52495a454460448201526064015b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000004210156105885760405162461bcd60e51b815260206004820152601e60248201527f5661756c743a6f6e6c79556e6c6f636b61626c653a5052454d41545552450000604482015260640161050f565b6105918261133a565b6106035760405162461bcd60e51b815260206004820152603660248201527f4d756c74695661756c743a7061727469616c4e6f6e46756e6769626c65546f6b60448201527f656e556e6c6f636b3a494e56414c49445f544f4b454e00000000000000000000606482015260840161050f565b604051632142170760e11b8152306004820152336024820152604481018290526001600160a01b038316906342842e0e90606401600060405180830381600087803b15801561065157600080fd5b505af1158015610665573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e46d96a26106a06113b1565b6040518263ffffffff1660e01b81526004016106c0911515815260200190565b600060405180830381600087803b1580156106da57600080fd5b505af11580156106ee573d6000803e3d6000fd5b505050505050565b6003818154811061070657600080fd5b60009182526020909120600390910201805460018201546002909201546001600160a01b03909116925083565b6040516331a9108f60e11b81527f0000000000000000000000000000000000000000000000000000000000000000600482015233906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636352211e9060240160206040518083038186803b1580156107b457600080fd5b505afa1580156107c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ec9190611ac5565b6001600160a01b0316146108425760405162461bcd60e51b815260206004820181905260248201527f5661756c743a6f6e6c794b6579486f6c6465723a554e415554484f52495a4544604482015260640161050f565b7f00000000000000000000000000000000000000000000000000000000000000004210156108b25760405162461bcd60e51b815260206004820152601e60248201527f5661756c743a6f6e6c79556e6c6f636b61626c653a5052454d41545552450000604482015260640161050f565b60005460ff161561092b5760405162461bcd60e51b815260206004820152603f60248201527f4d756c74695661756c743a756e6c6f636b3a414c52454144595f4f50454e3a2060448201527f5661756c742068617320616c7265616479206265656e20756e6c6f636b656400606482015260840161050f565b60005b600154811015610a185760006001828154811061095b57634e487b7160e01b600052603260045260246000fd5b60009182526020822060039190910201546040516370a0823160e01b81523060048201526001600160a01b03909116925082906370a082319060240160206040518083038186803b1580156109af57600080fd5b505afa1580156109c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e79190611e07565b90508015610a0357610a036001600160a01b0383163383611674565b50508080610a1090611f3a565b91505061092e565b5060005b600254811015610b1c5760028181548110610a4757634e487b7160e01b600052603260045260246000fd5b600091825260209091206002918202015481546001600160a01b03909116916342842e0e913091339186908110610a8e57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600160029092020101546040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015610af157600080fd5b505af1158015610b05573d6000803e3d6000fd5b505050508080610b1490611f3a565b915050610a1c565b5060005b600354811015610c3d5760038181548110610b4b57634e487b7160e01b600052603260045260246000fd5b600091825260209091206003918202015481546001600160a01b039091169163f242432a913091339186908110610b9257634e487b7160e01b600052603260045260246000fd5b90600052602060002090600302016001015460038681548110610bc557634e487b7160e01b600052603260045260246000fd5b906000526020600020906003020160020154876040518663ffffffff1660e01b8152600401610bf8959493929190611ebf565b600060405180830381600087803b158015610c1257600080fd5b505af1158015610c26573d6000803e3d6000fd5b505050508080610c3590611f3a565b915050610b20565b506000805460ff19166001908117909155604051637236cb5160e11b815260048101919091526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e46d96a290602401600060405180830381600087803b158015610cb157600080fd5b505af1158015610cc5573d6000803e3d6000fd5b5050505050565b6040516331a9108f60e11b81527f000000000000000000000000000000000000000000000000000000000000000060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690636352211e9060240160206040518083038186803b158015610d4e57600080fd5b505afa158015610d62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d869190611ac5565b905090565b6040516331a9108f60e11b81527f0000000000000000000000000000000000000000000000000000000000000000600482015233906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636352211e9060240160206040518083038186803b158015610e0c57600080fd5b505afa158015610e20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e449190611ac5565b6001600160a01b031614610e9a5760405162461bcd60e51b815260206004820181905260248201527f5661756c743a6f6e6c794b6579486f6c6465723a554e415554484f52495a4544604482015260640161050f565b7f0000000000000000000000000000000000000000000000000000000000000000421015610f0a5760405162461bcd60e51b815260206004820152601e60248201527f5661756c743a6f6e6c79556e6c6f636b61626c653a5052454d41545552450000604482015260640161050f565b610f13856116e0565b610f855760405162461bcd60e51b815260206004820152603060248201527f4d756c74695661756c743a7061727469616c4d756c7469546f6b656e556e6c6f60448201527f636b3a494e56414c49445f544f4b454e00000000000000000000000000000000606482015260840161050f565b604051637921219560e11b81526001600160a01b0386169063f242432a90610fbb90309033908990899089908990600401611e67565b600060405180830381600087803b158015610fd557600080fd5b505af1158015610fe9573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e46d96a26110246113b1565b6040518263ffffffff1660e01b8152600401611044911515815260200190565b600060405180830381600087803b15801561105e57600080fd5b505af1158015611072573d6000803e3d6000fd5b505050505050505050565b6002818154811061108d57600080fd5b6000918252602090912060029091020180546001909101546001600160a01b03909116915082565b600181815481106110c557600080fd5b60009182526020909120600390910201805460018201546002909201546001600160a01b03909116925060ff1683565b6040516331a9108f60e11b81527f0000000000000000000000000000000000000000000000000000000000000000600482015233906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636352211e9060240160206040518083038186803b15801561117657600080fd5b505afa15801561118a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ae9190611ac5565b6001600160a01b0316146112045760405162461bcd60e51b815260206004820181905260248201527f5661756c743a6f6e6c794b6579486f6c6465723a554e415554484f52495a4544604482015260640161050f565b7f00000000000000000000000000000000000000000000000000000000000000004210156112745760405162461bcd60e51b815260206004820152601e60248201527f5661756c743a6f6e6c79556e6c6f636b61626c653a5052454d41545552450000604482015260640161050f565b61127d8261174e565b6112ef5760405162461bcd60e51b815260206004820152603360248201527f4d756c74695661756c743a7061727469616c46756e6769626c65546f6b656e5560448201527f6e6c6f636b3a494e56414c49445f544f4b454e00000000000000000000000000606482015260840161050f565b6113036001600160a01b0383163383611674565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e46d96a26106a06113b1565b6000805b6002548110156113a8576002818154811061136957634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b03848116911614156113965750600192915050565b806113a081611f3a565b91505061133e565b50600092915050565b6000805b60015481101561148b576000600182815481106113e257634e487b7160e01b600052603260045260246000fd5b60009182526020909120600390910201546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561143357600080fd5b505afa158015611447573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146b9190611e07565b111561147957600091505090565b8061148381611f3a565b9150506113b5565b5060005b600254811015611565576000600282815481106114bc57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561150d57600080fd5b505afa158015611521573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115459190611e07565b111561155357600091505090565b8061155d81611f3a565b91505061148f565b5060005b60035481101561166c5760006003828154811061159657634e487b7160e01b600052603260045260246000fd5b600091825260208083206040805160608101825260039490940290910180546001600160a01b03168085526001820154938501849052600290910154848301529051627eeac760e11b8152306004820152602481019290925291935062fdd58e9060440160206040518083038186803b15801561161257600080fd5b505afa158015611626573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164a9190611e07565b11156116595760009250505090565b508061166481611f3a565b915050611569565b506001905090565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b1790526116db9084906117bc565b505050565b6000805b6003548110156113a8576003818154811061170f57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600390910201546001600160a01b038481169116141561173c5750600192915050565b8061174681611f3a565b9150506116e4565b6000805b6001548110156113a8576001818154811061177d57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600390910201546001600160a01b03848116911614156117aa5750600192915050565b806117b481611f3a565b915050611752565b6000611811826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166118a19092919063ffffffff16565b8051909150156116db578080602001905181019061182f9190611cfd565b6116db5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161050f565b60606118b084846000856118ba565b90505b9392505050565b6060824710156119325760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161050f565b6001600160a01b0385163b6119895760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161050f565b600080866001600160a01b031685876040516119a59190611e4b565b60006040518083038185875af1925050503d80600081146119e2576040519150601f19603f3d011682016040523d82523d6000602084013e6119e7565b606091505b50915091506119f7828286611a02565b979650505050505050565b60608315611a115750816118b3565b825115611a215782518084602001fd5b8160405162461bcd60e51b815260040161050f9190611ef7565b60008083601f840112611a4c578081fd5b50813567ffffffffffffffff811115611a63578182fd5b6020830191508360208260051b8501011115611a7e57600080fd5b9250929050565b60008083601f840112611a96578182fd5b50813567ffffffffffffffff811115611aad578182fd5b602083019150836020828501011115611a7e57600080fd5b600060208284031215611ad6578081fd5b81516118b381611f77565b60008060008060008060008060a0898b031215611afc578384fd5b8835611b0781611f77565b97506020890135611b1781611f77565b9650604089013567ffffffffffffffff80821115611b33578586fd5b611b3f8c838d01611a3b565b909850965060608b0135915080821115611b57578586fd5b611b638c838d01611a3b565b909650945060808b0135915080821115611b7b578384fd5b50611b888b828c01611a85565b999c989b5096995094979396929594505050565b600080600080600060808688031215611bb3578081fd5b8535611bbe81611f77565b94506020860135611bce81611f77565b935060408601359250606086013567ffffffffffffffff811115611bf0578182fd5b611bfc88828901611a85565b969995985093965092949392505050565b60008060008060008060a08789031215611c25578182fd5b8635611c3081611f77565b95506020870135611c4081611f77565b94506040870135935060608701359250608087013567ffffffffffffffff811115611c69578283fd5b611c7589828a01611a85565b979a9699509497509295939492505050565b60008060408385031215611c99578182fd5b8235611ca481611f77565b946020939093013593505050565b600080600080600060808688031215611cc9578081fd5b8535611cd481611f77565b94506020860135935060408601359250606086013567ffffffffffffffff811115611bf0578182fd5b600060208284031215611d0e578081fd5b815180151581146118b3578182fd5b600060208284031215611d2e578081fd5b81356001600160e01b0319811681146118b3578182fd5b600060208284031215611d56578081fd5b813567ffffffffffffffff80821115611d6d578283fd5b818401915084601f830112611d80578283fd5b813581811115611d9257611d92611f61565b604051601f8201601f19908116603f01168101908382118183101715611dba57611dba611f61565b81604052828152876020848701011115611dd2578586fd5b826020860160208301379182016020019490945295945050505050565b600060208284031215611e00578081fd5b5035919050565b600060208284031215611e18578081fd5b5051919050565b60008151808452611e37816020860160208601611f0a565b601f01601f19169290920160200192915050565b60008251611e5d818460208701611f0a565b9190910192915050565b60006001600160a01b03808916835280881660208401525085604083015284606083015260a060808301528260a0830152828460c084013781830160c090810191909152601f909201601f1916010195945050505050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a060808301526119f760a0830184611e1f565b6020815260006118b36020830184611e1f565b60005b83811015611f25578181015183820152602001611f0d565b83811115611f34576000848401525b50505050565b6000600019821415611f5a57634e487b7160e01b81526011600452602481fd5b5060010190565b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611f8c57600080fd5b5056fea2646970667358221220a1a228a3dca0ea7d81523e00197fce14e0f7b408a79fba81b0d56a9bbfbc89be64736f6c63430008040033a264697066735822122071d1c3ecf4c904b5ed2f68c59e97b6965a97cb8b6b3b857a12e3109dfb74d73f64736f6c63430008040033000000000000000000000000d7df4d751a16a6e2a68c1a383e6aee94baff7a9f0000000000000000000000000423ea54aab6ad2ac768ff243a7ab7cf57ace03c0000000000000000000000000000000000000000000000000000000000000064
Deployed Bytecode
0x60806040523480156200001157600080fd5b5060043610620000d95760003560e01c8063b9f53fc3116200008b578063e46d96a21162000062578063e46d96a214620001e4578063e71324bd14620001fb578063f4ddaef3146200020f57600080fd5b8063b9f53fc3146200016c578063d0cf00541462000198578063de1db43a14620001cd57600080fd5b806378546fa211620000c057806378546fa21462000128578063880cdc3114620001415780638da5cb5b146200015857600080fd5b806330a1cc9614620000de5780633cf57c61146200010f575b600080fd5b600454620000f2906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b620001266200012036600462000f34565b62000226565b005b6200013260055481565b60405190815260200162000106565b620001266200015236600462000d6a565b620002e5565b600254620000f2906001600160a01b031681565b620000f26200017d36600462000f34565b6000602081905290815260409020546001600160a01b031681565b620001be620001a936600462000d6a565b60016020526000908152604090205460ff1681565b604051620001069190620011da565b62000126620001de36600462000d6a565b6200037c565b62000126620001f536600462000f17565b6200045d565b600354620000f2906001600160a01b031681565b620001266200022036600462000d8e565b62000568565b6002546001600160a01b03163314620002ac5760405162461bcd60e51b815260206004820152602c60248201527f5661756c74466163746f72793a7365744d6178546f6b656e735065725661756c60448201527f743a4f574e45525f4f4e4c59000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6005805490829055604051829082907fed0b12faffd2cf512a39ed490e2449ef21e0fceb01dfbd1b163d455947cde7bb90600090a35050565b6002546001600160a01b031633146200034d5760405162461bcd60e51b815260206004820152602360248201527f5661756c74466163746f72793a7570646174654f776e65723a4f574e45525f4f6044820152624e4c5960e81b6064820152608401620002a3565b6002805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6002546001600160a01b03163314620003fe5760405162461bcd60e51b815260206004820152602b60248201527f5661756c74466163746f72793a7570646174655061796d656e744d6f64756c6560448201527f3a4f574e45525f4f4e4c590000000000000000000000000000000000000000006064820152608401620002a3565b600480546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907fb9cd00730add6e591032c866c4356d07d8e8a417427b3898f6b2a3f451c13b9d90600090a35050565b60013360009081526001602052604090205460ff1660028111156200049257634e487b7160e01b600052602160045260246000fd5b14620005075760405162461bcd60e51b815260206004820152602f60248201527f5661756c74466163746f72793a6e6f74696679556e6c6f636b3a414c5245414460448201527f595f46554c4c5f554e4c4f434b454400000000000000000000000000000000006064820152608401620002a3565b80156200052957336000908152600160205260409020805460ff191660021790555b60408051428152821515602082015233917f78a7bc4bfc94fe86303e760b594b28d27a71fd56199715f6dd6186edf54158b7910160405180910390a250565b42851015620005e05760405162461bcd60e51b815260206004820152602760248201527f5661756c74466163746f72793a6372656174655661756c743a554e4c4f434b5f60448201527f494e5f50415354000000000000000000000000000000000000000000000000006064820152608401620002a3565b600084511180620005f2575060008351115b80620005ff575060008251115b620006595760405162461bcd60e51b8152602060048201526024808201527f5661756c74466163746f72793a6372656174655661756c743a4e4f5f4445504f6044820152635349545360e01b6064820152608401620002a3565b6005548251845186516200066e9190620012b0565b6200067a9190620012b0565b10620006ef5760405162461bcd60e51b815260206004820152602e60248201527f5661756c74466163746f72793a6372656174655661756c743a4d41585f44455060448201527f4f534954535f45584345454445440000000000000000000000000000000000006064820152608401620002a3565b60005b84518110156200079d5760008582815181106200071f57634e487b7160e01b600052603260045260246000fd5b60200260200101516020015111620007885760405162461bcd60e51b815260206004820152602560248201527f5661756c74466163746f72793a6372656174655661756c743a5a45524f5f44456044820152641413d4d25560da1b6064820152608401620002a3565b806200079481620012cb565b915050620006f2565b5060005b82518110156200084c576000838281518110620007ce57634e487b7160e01b600052603260045260246000fd5b60200260200101516040015111620008375760405162461bcd60e51b815260206004820152602560248201527f5661756c74466163746f72793a6372656174655661756c743a5a45524f5f44456044820152641413d4d25560da1b6064820152608401620002a3565b806200084381620012cb565b915050620007a1565b506003546040516369d0465960e11b81526001600160a01b0388811660048301529091169063d3a08cb290602401600060405180830381600087803b1580156200089557600080fd5b505af1158015620008aa573d6000803e3d6000fd5b5050600354604051632bed542b60e01b81526001600160a01b038a81166004830152600094509091169150632bed542b9060240160206040518083038186803b158015620008f757600080fd5b505afa1580156200090c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000932919062000f4d565b905060008215620009d55784511580156200094c57508351155b620009c05760405162461bcd60e51b815260206004820152602e60248201527f5661756c74466163746f72793a6372656174655661756c743a4f4e4c595f465560448201527f4e4749424c455f56455354494e470000000000000000000000000000000000006064820152608401620002a3565b620009cd82888862000b0e565b9050620009e7565b620009e4828888888862000b6e565b90505b60048054604051631cfe324560e21b81526001600160a01b03909116916373f8c9149162000a2491859133918f918d918d918d918d910162001058565b600060405180830381600087803b15801562000a3f57600080fd5b505af115801562000a54573d6000803e3d6000fd5b505050600083815260208181526040808320805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038716908117909155835260019182905290912080549192509060ff191682800217905550876001600160a01b031682826001600160a01b03167f525b2435dc9cf297200a04c2498178593679ce420b75066d8c9c75054b73c361338b8b8b8b8b60405162000afb96959493929190620010cf565b60405180910390a4505050505050505050565b600080600360009054906101000a90046001600160a01b031685858560405162000b389062000bd4565b62000b47949392919062001139565b604051809103906000f08015801562000b64573d6000803e3d6000fd5b5095945050505050565b600080600360009054906101000a90046001600160a01b0316878787878760405162000b9a9062000be2565b62000bab9695949392919062001173565b604051809103906000f08015801562000bc8573d6000803e3d6000fd5b50979650505050505050565b611663806200131683390190565b61268c806200297983390190565b80356001600160a01b038116811462000c0857600080fd5b919050565b600082601f83011262000c1e578081fd5b8135602062000c3762000c318362001289565b62001255565b8281528181019085830160608086028801850189101562000c56578687fd5b865b8681101562000cac5781838b03121562000c70578788fd5b62000c7a62001203565b62000c858462000bf0565b81528387013587820152604080850135908201528552938501939181019160010162000c58565b509198975050505050505050565b600082601f83011262000ccb578081fd5b8135602062000cde62000c318362001289565b80838252828201915082860187848660061b890101111562000cfe578586fd5b855b8581101562000d4c57604080838b03121562000d1a578788fd5b62000d246200122f565b62000d2f8462000bf0565b815283870135878201528552938501939091019060010162000d00565b5090979650505050505050565b8035801515811462000c0857600080fd5b60006020828403121562000d7c578081fd5b62000d878262000bf0565b9392505050565b600080600080600080600060e0888a03121562000da9578283fd5b62000db48862000bf0565b965062000dc46020890162000bf0565b95506040880135945067ffffffffffffffff6060890135111562000de6578283fd5b6060880135880189601f82011262000dfc578384fd5b62000e0c62000c31823562001289565b8082358252602082019150602083018c60206060863502860101111562000e31578687fd5b865b843581101562000e99576060828f03121562000e4d578788fd5b62000e5762001203565b62000e628362000bf0565b81526020830135602082015262000e7c6040840162000d59565b604082015284526020909301926060919091019060010162000e33565b505080965050505067ffffffffffffffff6080890135111562000eba578283fd5b62000ecc8960808a01358a0162000cba565b925067ffffffffffffffff60a0890135111562000ee7578182fd5b62000ef98960a08a01358a0162000c0d565b915062000f0960c0890162000d59565b905092959891949750929550565b60006020828403121562000f29578081fd5b62000d878262000d59565b60006020828403121562000f46578081fd5b5035919050565b60006020828403121562000f5f578081fd5b5051919050565b6000815180845260208085019450808401835b8381101562000fb857815180516001600160a01b0316885283810151848901526040908101511515908801526060909601959082019060010162000f79565b509495945050505050565b6000815180845260208085019450808401835b8381101562000fb857815180516001600160a01b031688528381015184890152604090810151908801526060909601959082019060010162000fd6565b6000815180845260208085019450808401835b8381101562000fb857815180516001600160a01b03168852830151838801526040909601959082019060010162001026565b60006001600160a01b03808a168352808916602084015280881660408401525060e060608301526200108e60e083018762000f66565b8281036080840152620010a2818762001013565b905082810360a0840152620010b8818662000fc3565b91505082151560c083015298975050505050505050565b6001600160a01b038716815285602082015260c060408201526000620010f960c083018762000f66565b82810360608401526200110d818762001013565b9050828103608084015262001123818662000fc3565b91505082151560a0830152979650505050505050565b6001600160a01b038516815283602082015282604082015260806060820152600062001169608083018462000f66565b9695505050505050565b6001600160a01b038716815285602082015284604082015260c060608201526000620011a360c083018662000f66565b8281036080840152620011b7818662001013565b905082810360a0840152620011cd818562000fc3565b9998505050505050505050565b6020810160038310620011fd57634e487b7160e01b600052602160045260246000fd5b91905290565b6040516060810167ffffffffffffffff81118282101715620012295762001229620012ff565b60405290565b6040805190810167ffffffffffffffff81118282101715620012295762001229620012ff565b604051601f8201601f1916810167ffffffffffffffff81118282101715620012815762001281620012ff565b604052919050565b600067ffffffffffffffff821115620012a657620012a6620012ff565b5060051b60200190565b60008219821115620012c657620012c6620012e9565b500190565b6000600019821415620012e257620012e2620012e9565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfe6101206040523480156200001257600080fd5b506040516200166338038062001663833981016040819052620000359162000159565b33606090811b60805284901b6001600160601b03191660a05260c08390524260e0526101008290526000805460ff191681555b8151811015620001315760028282815181106200009557634e487b7160e01b600052603260045260246000fd5b6020908102919091018101515182546001808201855560009485529284200180546001600160a01b0319166001600160a01b039092169190911790558351429290859085908110620000f757634e487b7160e01b600052603260045260246000fd5b602090810291909101810151516001600160a01b0316825281019190915260400160002055806200012881620002d3565b91505062000068565b505050505062000311565b80516001600160a01b03811681146200015457600080fd5b919050565b600080600080608085870312156200016f578384fd5b6200017a856200013c565b93506020808601519350604080870151935060608088015160018060401b0380821115620001a6578586fd5b818a0191508a601f830112620001ba578586fd5b815181811115620001cf57620001cf620002fb565b620001df868260051b01620002a0565b8181528681019250838701858302850188018e1015620001fd578889fd5b8894505b82851015620002635785818f03121562000219578889fd5b6200022362000275565b6200022e826200013c565b815288820151898201528782015180151581146200024a578a8bfd5b8189015284526001949094019392870192850162000201565b50999c989b5096995050505050505050565b604051606081016001600160401b03811182821017156200029a576200029a620002fb565b60405290565b604051601f8201601f191681016001600160401b0381118282101715620002cb57620002cb620002fb565b604052919050565b6000600019821415620002f457634e487b7160e01b81526011600452602481fd5b5060010190565b634e487b7160e01b600052604160045260246000fd5b60805160601c60a05160601c60c05160e051610100516112c1620003a2600039600081816102230152818161098301526109cd0152600061024a0152600081816102b30152818161034e015281816105f201526108530152600081816101ef0152818161037e01528181610622015261087c0152600081816101a70152818161057d01526107dc01526112c16000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c80638380edb711610097578063cf3ba42311610066578063cf3ba4231461028e578063e4dfeac0146102ae578063e5df8b84146102d5578063f23a6e61146102e857600080fd5b80638380edb714610211578063aa082a9d1461021e578063b544bf8314610245578063bc197c811461026c57600080fd5b8063565a2e2c116100d3578063565a2e2c146101825780636e2d47f6146101a25780636fb1d79e146101c9578063796b658b146101ea57600080fd5b806301ffc9a714610105578063150b7a021461012d578063458efde3146101655780634c8d0bbd1461016f575b600080fd5b610118610113366004611119565b610308565b60405190151581526020015b60405180910390f35b61014c61013b36600461100e565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610124565b61016d61033f565b005b61016d61017d366004610f1b565b6105e3565b61018a610844565b6040516001600160a01b039091168152602001610124565b61018a7f000000000000000000000000000000000000000000000000000000000000000081565b6101dc6101d7366004610f1b565b610903565b604051908152602001610124565b61018a7f000000000000000000000000000000000000000000000000000000000000000081565b6000546101189060ff1681565b6101dc7f000000000000000000000000000000000000000000000000000000000000000081565b6101dc7f000000000000000000000000000000000000000000000000000000000000000081565b61014c61027a366004610f53565b63bc197c8160e01b98975050505050505050565b6101dc61029c366004610f1b565b60016020526000908152604090205481565b6101dc7f000000000000000000000000000000000000000000000000000000000000000081565b61018a6102e3366004611141565b610a2f565b61014c6102f636600461107f565b63f23a6e6160e01b9695505050505050565b60006001600160e01b03198216630a85bd0160e11b148061033957506001600160e01b03198216630271189760e51b145b92915050565b6040516331a9108f60e11b81527f0000000000000000000000000000000000000000000000000000000000000000600482015233906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636352211e9060240160206040518083038186803b1580156103c057600080fd5b505afa1580156103d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103f89190610f37565b6001600160a01b0316146104535760405162461bcd60e51b815260206004820181905260248201527f5661756c743a6f6e6c794b6579486f6c6465723a554e415554484f52495a454460448201526064015b60405180910390fd5b60005b6002548110156105495760006104a06002838154811061048657634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316610903565b90508015610536576104ea3382600285815481106104ce57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03169190610a59565b42600160006002858154811061051057634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020555b508061054181611242565b915050610456565b50610552610ac5565b6000805460ff19169115159182179055604051637236cb5160e11b815260ff909116151560048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e46d96a290602401600060405180830381600087803b1580156105c957600080fd5b505af11580156105dd573d6000803e3d6000fd5b50505050565b6040516331a9108f60e11b81527f0000000000000000000000000000000000000000000000000000000000000000600482015233906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636352211e9060240160206040518083038186803b15801561066457600080fd5b505afa158015610678573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061069c9190610f37565b6001600160a01b0316146106f25760405162461bcd60e51b815260206004820181905260248201527f5661756c743a6f6e6c794b6579486f6c6465723a554e415554484f52495a4544604482015260640161044a565b6106fb81610ba2565b61076d5760405162461bcd60e51b815260206004820152603e60248201527f46756e6769626c6556657374696e675661756c743a7061727469616c46756e6760448201527f69626c65546f6b656e56657374696e673a494e56414c49445f544f4b454e0000606482015260840161044a565b600061077882610903565b905061078e6001600160a01b0383163383610a59565b6001600160a01b03821660009081526001602052604090204290556107b1610ac5565b6000805460ff19169115159182179055604051637236cb5160e11b815260ff909116151560048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e46d96a290602401600060405180830381600087803b15801561082857600080fd5b505af115801561083c573d6000803e3d6000fd5b505050505050565b6040516331a9108f60e11b81527f000000000000000000000000000000000000000000000000000000000000000060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690636352211e9060240160206040518083038186803b1580156108c657600080fd5b505afa1580156108da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108fe9190610f37565b905090565b6040516370a0823160e01b815230600482015260009081906001600160a01b038416906370a082319060240160206040518083038186803b15801561094757600080fd5b505afa15801561095b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097f9190611159565b90507f000000000000000000000000000000000000000000000000000000000000000042106109ae5792915050565b6001600160a01b0383166000908152600160205260409020546109f1907f00000000000000000000000000000000000000000000000000000000000000006111ff565b6001600160a01b038416600090815260016020526040902054610a1490426111ff565b610a1e90836111e0565b610a2891906111c0565b9392505050565b60028181548110610a3f57600080fd5b6000918252602090912001546001600160a01b0316905081565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b179052610ac0908490610c14565b505050565b6000805b600254811015610b9a57600060028281548110610af657634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015610b4257600080fd5b505afa158015610b56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7a9190611159565b1115610b8857600091505090565b80610b9281611242565b915050610ac9565b506001905090565b6000805b600254811015610c0b5760028181548110610bd157634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0384811691161415610bf95750600192915050565b80610c0381611242565b915050610ba6565b50600092915050565b6000610c69826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610cf99092919063ffffffff16565b805190915015610ac05780806020019051810190610c8791906110f9565b610ac05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161044a565b6060610d088484600085610d10565b949350505050565b606082471015610d885760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161044a565b6001600160a01b0385163b610ddf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161044a565b600080866001600160a01b03168587604051610dfb9190611171565b60006040518083038185875af1925050503d8060008114610e38576040519150601f19603f3d011682016040523d82523d6000602084013e610e3d565b606091505b5091509150610e4d828286610e58565b979650505050505050565b60608315610e67575081610a28565b825115610e775782518084602001fd5b8160405162461bcd60e51b815260040161044a919061118d565b60008083601f840112610ea2578182fd5b50813567ffffffffffffffff811115610eb9578182fd5b6020830191508360208260051b8501011115610ed457600080fd5b9250929050565b60008083601f840112610eec578182fd5b50813567ffffffffffffffff811115610f03578182fd5b602083019150836020828501011115610ed457600080fd5b600060208284031215610f2c578081fd5b8135610a2881611273565b600060208284031215610f48578081fd5b8151610a2881611273565b60008060008060008060008060a0898b031215610f6e578384fd5b8835610f7981611273565b97506020890135610f8981611273565b9650604089013567ffffffffffffffff80821115610fa5578586fd5b610fb18c838d01610e91565b909850965060608b0135915080821115610fc9578586fd5b610fd58c838d01610e91565b909650945060808b0135915080821115610fed578384fd5b50610ffa8b828c01610edb565b999c989b5096995094979396929594505050565b600080600080600060808688031215611025578081fd5b853561103081611273565b9450602086013561104081611273565b935060408601359250606086013567ffffffffffffffff811115611062578182fd5b61106e88828901610edb565b969995985093965092949392505050565b60008060008060008060a08789031215611097578182fd5b86356110a281611273565b955060208701356110b281611273565b94506040870135935060608701359250608087013567ffffffffffffffff8111156110db578283fd5b6110e789828a01610edb565b979a9699509497509295939492505050565b60006020828403121561110a578081fd5b81518015158114610a28578182fd5b60006020828403121561112a578081fd5b81356001600160e01b031981168114610a28578182fd5b600060208284031215611152578081fd5b5035919050565b60006020828403121561116a578081fd5b5051919050565b60008251611183818460208701611216565b9190910192915050565b60208152600082518060208401526111ac816040850160208701611216565b601f01601f19169190910160400192915050565b6000826111db57634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156111fa576111fa61125d565b500290565b6000828210156112115761121161125d565b500390565b60005b83811015611231578181015183820152602001611219565b838111156105dd5750506000910152565b60006000198214156112565761125661125d565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461128857600080fd5b5056fea2646970667358221220fd0cffbb96c6e807f6772cf6c047d2bc50578eaa568e7e73a5c5a8b1c521a93564736f6c634300080400336101206040523480156200001257600080fd5b506040516200268c3803806200268c8339810160408190526200003591620003b7565b33606090811b60805286901b6001600160601b03191660a05260c08590524260e0526101008490526000805460ff191681555b8351811015620001125760018482815181106200009557634e487b7160e01b600052603260045260246000fd5b602090810291909101810151825460018082018555600094855293839020825160039092020180546001600160a01b0319166001600160a01b0390921691909117815591810151928201929092556040909101516002909101805460ff1916911515919091179055806200010981620005c0565b91505062000068565b5060005b8251811015620001a15760028382815181106200014357634e487b7160e01b600052603260045260246000fd5b602090810291909101810151825460018082018555600094855293839020825160029092020180546001600160a01b0319166001600160a01b03909216919091178155910151910155806200019881620005c0565b91505062000116565b5060005b815181101562000241576003828281518110620001d257634e487b7160e01b600052603260045260246000fd5b602090810291909101810151825460018082018555600094855293839020825160039092020180546001600160a01b0319166001600160a01b039092169190911781559181015192820192909255604090910151600290910155806200023881620005c0565b915050620001a5565b50505050505050620005fe565b80516001600160a01b03811681146200026657600080fd5b919050565b600082601f8301126200027c578081fd5b81516020620002956200028f836200059a565b62000567565b82815281810190858301606080860288018501891015620002b4578687fd5b865b868110156200030a5781838b031215620002ce578788fd5b620002d862000517565b620002e3846200024e565b815283870151878201526040808501519082015285529385019391810191600101620002b6565b509198975050505050505050565b600082601f83011262000329578081fd5b815160206200033c6200028f836200059a565b80838252828201915082860187848660061b89010111156200035c578586fd5b855b85811015620003aa57604080838b03121562000378578788fd5b6200038262000542565b6200038d846200024e565b81528387015187820152855293850193909101906001016200035e565b5090979650505050505050565b60008060008060008060c08789031215620003d0578182fd5b620003db876200024e565b6020880151604089015160608a015192985090965094506001600160401b038082111562000407578384fd5b818901915089601f8301126200041b578384fd5b81516200042c6200028f826200059a565b80828252602082019150602085018d60206060860288010111156200044f578788fd5b8795505b83861015620004bd576060818f0312156200046c578788fd5b6200047662000517565b62000481826200024e565b81526020820151602082015260408201518015158114620004a057898afd5b604082015283526001959095019460209092019160600162000453565b5060808c01519097509350505080821115620004d7578384fd5b620004e58a838b0162000318565b935060a0890151915080821115620004fb578283fd5b506200050a89828a016200026b565b9150509295509295509295565b604051606081016001600160401b03811182821017156200053c576200053c620005e8565b60405290565b604080519081016001600160401b03811182821017156200053c576200053c620005e8565b604051601f8201601f191681016001600160401b0381118282101715620005925762000592620005e8565b604052919050565b60006001600160401b03821115620005b657620005b6620005e8565b5060051b60200190565b6000600019821415620005e157634e487b7160e01b81526011600452602481fd5b5060010190565b634e487b7160e01b600052604160045260246000fd5b60805160601c60a05160601c60c05160e05161010051611fc5620006c7600039600081816102fa0152818161051a0152818161084401528181610e9c01526112060152600061034201526000818161038b015281816104130152818161074201528181610cdb01528181610d9a0152611104015260008181610247015281816104430152818161077201528181610d0401528181610dca01526111340152600081816102200152818161066b01528181610c6d01528181610fef01526113050152611fc56000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c80638380edb7116100b2578063b0bd17d211610081578063bc197c8111610066578063bc197c8114610364578063e4dfeac014610386578063f23a6e61146103ad57600080fd5b8063b0bd17d21461032a578063b544bf831461033d57600080fd5b80638380edb71461027c57806385fde44c14610289578063a608b317146102bb578063aa082a9d146102f557600080fd5b806348c89491116101095780636e2d47f6116100ee5780636e2d47f61461021b578063796b658b1461024257806381763bf11461026957600080fd5b806348c89491146101e8578063565a2e2c146101fb57600080fd5b806301ffc9a71461013b578063150b7a021461016357806330fde4e31461019b578063469a417a146101b0575b600080fd5b61014e610149366004611d1d565b6103cd565b60405190151581526020015b60405180910390f35b610182610171366004611b9c565b630a85bd0160e11b95945050505050565b6040516001600160e01b0319909116815260200161015a565b6101ae6101a9366004611c87565b610404565b005b6101c36101be366004611def565b6106f6565b604080516001600160a01b03909416845260208401929092529082015260600161015a565b6101ae6101f6366004611d45565b610733565b610203610ccc565b6040516001600160a01b03909116815260200161015a565b6102037f000000000000000000000000000000000000000000000000000000000000000081565b6102037f000000000000000000000000000000000000000000000000000000000000000081565b6101ae610277366004611cb2565b610d8b565b60005461014e9060ff1681565b61029c610297366004611def565b61107d565b604080516001600160a01b03909316835260208301919091520161015a565b6102ce6102c9366004611def565b6110b5565b604080516001600160a01b039094168452602084019290925215159082015260600161015a565b61031c7f000000000000000000000000000000000000000000000000000000000000000081565b60405190815260200161015a565b6101ae610338366004611c87565b6110f5565b61031c7f000000000000000000000000000000000000000000000000000000000000000081565b610182610372366004611ae1565b63bc197c8160e01b98975050505050505050565b61031c7f000000000000000000000000000000000000000000000000000000000000000081565b6101826103bb366004611c0d565b63f23a6e6160e01b9695505050505050565b60006001600160e01b03198216630a85bd0160e11b14806103fe57506001600160e01b03198216630271189760e51b145b92915050565b6040516331a9108f60e11b81527f0000000000000000000000000000000000000000000000000000000000000000600482015233906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636352211e9060240160206040518083038186803b15801561048557600080fd5b505afa158015610499573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104bd9190611ac5565b6001600160a01b0316146105185760405162461bcd60e51b815260206004820181905260248201527f5661756c743a6f6e6c794b6579486f6c6465723a554e415554484f52495a454460448201526064015b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000004210156105885760405162461bcd60e51b815260206004820152601e60248201527f5661756c743a6f6e6c79556e6c6f636b61626c653a5052454d41545552450000604482015260640161050f565b6105918261133a565b6106035760405162461bcd60e51b815260206004820152603660248201527f4d756c74695661756c743a7061727469616c4e6f6e46756e6769626c65546f6b60448201527f656e556e6c6f636b3a494e56414c49445f544f4b454e00000000000000000000606482015260840161050f565b604051632142170760e11b8152306004820152336024820152604481018290526001600160a01b038316906342842e0e90606401600060405180830381600087803b15801561065157600080fd5b505af1158015610665573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e46d96a26106a06113b1565b6040518263ffffffff1660e01b81526004016106c0911515815260200190565b600060405180830381600087803b1580156106da57600080fd5b505af11580156106ee573d6000803e3d6000fd5b505050505050565b6003818154811061070657600080fd5b60009182526020909120600390910201805460018201546002909201546001600160a01b03909116925083565b6040516331a9108f60e11b81527f0000000000000000000000000000000000000000000000000000000000000000600482015233906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636352211e9060240160206040518083038186803b1580156107b457600080fd5b505afa1580156107c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ec9190611ac5565b6001600160a01b0316146108425760405162461bcd60e51b815260206004820181905260248201527f5661756c743a6f6e6c794b6579486f6c6465723a554e415554484f52495a4544604482015260640161050f565b7f00000000000000000000000000000000000000000000000000000000000000004210156108b25760405162461bcd60e51b815260206004820152601e60248201527f5661756c743a6f6e6c79556e6c6f636b61626c653a5052454d41545552450000604482015260640161050f565b60005460ff161561092b5760405162461bcd60e51b815260206004820152603f60248201527f4d756c74695661756c743a756e6c6f636b3a414c52454144595f4f50454e3a2060448201527f5661756c742068617320616c7265616479206265656e20756e6c6f636b656400606482015260840161050f565b60005b600154811015610a185760006001828154811061095b57634e487b7160e01b600052603260045260246000fd5b60009182526020822060039190910201546040516370a0823160e01b81523060048201526001600160a01b03909116925082906370a082319060240160206040518083038186803b1580156109af57600080fd5b505afa1580156109c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e79190611e07565b90508015610a0357610a036001600160a01b0383163383611674565b50508080610a1090611f3a565b91505061092e565b5060005b600254811015610b1c5760028181548110610a4757634e487b7160e01b600052603260045260246000fd5b600091825260209091206002918202015481546001600160a01b03909116916342842e0e913091339186908110610a8e57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600160029092020101546040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015610af157600080fd5b505af1158015610b05573d6000803e3d6000fd5b505050508080610b1490611f3a565b915050610a1c565b5060005b600354811015610c3d5760038181548110610b4b57634e487b7160e01b600052603260045260246000fd5b600091825260209091206003918202015481546001600160a01b039091169163f242432a913091339186908110610b9257634e487b7160e01b600052603260045260246000fd5b90600052602060002090600302016001015460038681548110610bc557634e487b7160e01b600052603260045260246000fd5b906000526020600020906003020160020154876040518663ffffffff1660e01b8152600401610bf8959493929190611ebf565b600060405180830381600087803b158015610c1257600080fd5b505af1158015610c26573d6000803e3d6000fd5b505050508080610c3590611f3a565b915050610b20565b506000805460ff19166001908117909155604051637236cb5160e11b815260048101919091526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e46d96a290602401600060405180830381600087803b158015610cb157600080fd5b505af1158015610cc5573d6000803e3d6000fd5b5050505050565b6040516331a9108f60e11b81527f000000000000000000000000000000000000000000000000000000000000000060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690636352211e9060240160206040518083038186803b158015610d4e57600080fd5b505afa158015610d62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d869190611ac5565b905090565b6040516331a9108f60e11b81527f0000000000000000000000000000000000000000000000000000000000000000600482015233906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636352211e9060240160206040518083038186803b158015610e0c57600080fd5b505afa158015610e20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e449190611ac5565b6001600160a01b031614610e9a5760405162461bcd60e51b815260206004820181905260248201527f5661756c743a6f6e6c794b6579486f6c6465723a554e415554484f52495a4544604482015260640161050f565b7f0000000000000000000000000000000000000000000000000000000000000000421015610f0a5760405162461bcd60e51b815260206004820152601e60248201527f5661756c743a6f6e6c79556e6c6f636b61626c653a5052454d41545552450000604482015260640161050f565b610f13856116e0565b610f855760405162461bcd60e51b815260206004820152603060248201527f4d756c74695661756c743a7061727469616c4d756c7469546f6b656e556e6c6f60448201527f636b3a494e56414c49445f544f4b454e00000000000000000000000000000000606482015260840161050f565b604051637921219560e11b81526001600160a01b0386169063f242432a90610fbb90309033908990899089908990600401611e67565b600060405180830381600087803b158015610fd557600080fd5b505af1158015610fe9573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e46d96a26110246113b1565b6040518263ffffffff1660e01b8152600401611044911515815260200190565b600060405180830381600087803b15801561105e57600080fd5b505af1158015611072573d6000803e3d6000fd5b505050505050505050565b6002818154811061108d57600080fd5b6000918252602090912060029091020180546001909101546001600160a01b03909116915082565b600181815481106110c557600080fd5b60009182526020909120600390910201805460018201546002909201546001600160a01b03909116925060ff1683565b6040516331a9108f60e11b81527f0000000000000000000000000000000000000000000000000000000000000000600482015233906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636352211e9060240160206040518083038186803b15801561117657600080fd5b505afa15801561118a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ae9190611ac5565b6001600160a01b0316146112045760405162461bcd60e51b815260206004820181905260248201527f5661756c743a6f6e6c794b6579486f6c6465723a554e415554484f52495a4544604482015260640161050f565b7f00000000000000000000000000000000000000000000000000000000000000004210156112745760405162461bcd60e51b815260206004820152601e60248201527f5661756c743a6f6e6c79556e6c6f636b61626c653a5052454d41545552450000604482015260640161050f565b61127d8261174e565b6112ef5760405162461bcd60e51b815260206004820152603360248201527f4d756c74695661756c743a7061727469616c46756e6769626c65546f6b656e5560448201527f6e6c6f636b3a494e56414c49445f544f4b454e00000000000000000000000000606482015260840161050f565b6113036001600160a01b0383163383611674565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e46d96a26106a06113b1565b6000805b6002548110156113a8576002818154811061136957634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b03848116911614156113965750600192915050565b806113a081611f3a565b91505061133e565b50600092915050565b6000805b60015481101561148b576000600182815481106113e257634e487b7160e01b600052603260045260246000fd5b60009182526020909120600390910201546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561143357600080fd5b505afa158015611447573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146b9190611e07565b111561147957600091505090565b8061148381611f3a565b9150506113b5565b5060005b600254811015611565576000600282815481106114bc57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561150d57600080fd5b505afa158015611521573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115459190611e07565b111561155357600091505090565b8061155d81611f3a565b91505061148f565b5060005b60035481101561166c5760006003828154811061159657634e487b7160e01b600052603260045260246000fd5b600091825260208083206040805160608101825260039490940290910180546001600160a01b03168085526001820154938501849052600290910154848301529051627eeac760e11b8152306004820152602481019290925291935062fdd58e9060440160206040518083038186803b15801561161257600080fd5b505afa158015611626573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164a9190611e07565b11156116595760009250505090565b508061166481611f3a565b915050611569565b506001905090565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b1790526116db9084906117bc565b505050565b6000805b6003548110156113a8576003818154811061170f57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600390910201546001600160a01b038481169116141561173c5750600192915050565b8061174681611f3a565b9150506116e4565b6000805b6001548110156113a8576001818154811061177d57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600390910201546001600160a01b03848116911614156117aa5750600192915050565b806117b481611f3a565b915050611752565b6000611811826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166118a19092919063ffffffff16565b8051909150156116db578080602001905181019061182f9190611cfd565b6116db5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161050f565b60606118b084846000856118ba565b90505b9392505050565b6060824710156119325760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161050f565b6001600160a01b0385163b6119895760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161050f565b600080866001600160a01b031685876040516119a59190611e4b565b60006040518083038185875af1925050503d80600081146119e2576040519150601f19603f3d011682016040523d82523d6000602084013e6119e7565b606091505b50915091506119f7828286611a02565b979650505050505050565b60608315611a115750816118b3565b825115611a215782518084602001fd5b8160405162461bcd60e51b815260040161050f9190611ef7565b60008083601f840112611a4c578081fd5b50813567ffffffffffffffff811115611a63578182fd5b6020830191508360208260051b8501011115611a7e57600080fd5b9250929050565b60008083601f840112611a96578182fd5b50813567ffffffffffffffff811115611aad578182fd5b602083019150836020828501011115611a7e57600080fd5b600060208284031215611ad6578081fd5b81516118b381611f77565b60008060008060008060008060a0898b031215611afc578384fd5b8835611b0781611f77565b97506020890135611b1781611f77565b9650604089013567ffffffffffffffff80821115611b33578586fd5b611b3f8c838d01611a3b565b909850965060608b0135915080821115611b57578586fd5b611b638c838d01611a3b565b909650945060808b0135915080821115611b7b578384fd5b50611b888b828c01611a85565b999c989b5096995094979396929594505050565b600080600080600060808688031215611bb3578081fd5b8535611bbe81611f77565b94506020860135611bce81611f77565b935060408601359250606086013567ffffffffffffffff811115611bf0578182fd5b611bfc88828901611a85565b969995985093965092949392505050565b60008060008060008060a08789031215611c25578182fd5b8635611c3081611f77565b95506020870135611c4081611f77565b94506040870135935060608701359250608087013567ffffffffffffffff811115611c69578283fd5b611c7589828a01611a85565b979a9699509497509295939492505050565b60008060408385031215611c99578182fd5b8235611ca481611f77565b946020939093013593505050565b600080600080600060808688031215611cc9578081fd5b8535611cd481611f77565b94506020860135935060408601359250606086013567ffffffffffffffff811115611bf0578182fd5b600060208284031215611d0e578081fd5b815180151581146118b3578182fd5b600060208284031215611d2e578081fd5b81356001600160e01b0319811681146118b3578182fd5b600060208284031215611d56578081fd5b813567ffffffffffffffff80821115611d6d578283fd5b818401915084601f830112611d80578283fd5b813581811115611d9257611d92611f61565b604051601f8201601f19908116603f01168101908382118183101715611dba57611dba611f61565b81604052828152876020848701011115611dd2578586fd5b826020860160208301379182016020019490945295945050505050565b600060208284031215611e00578081fd5b5035919050565b600060208284031215611e18578081fd5b5051919050565b60008151808452611e37816020860160208601611f0a565b601f01601f19169290920160200192915050565b60008251611e5d818460208701611f0a565b9190910192915050565b60006001600160a01b03808916835280881660208401525085604083015284606083015260a060808301528260a0830152828460c084013781830160c090810191909152601f909201601f1916010195945050505050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a060808301526119f760a0830184611e1f565b6020815260006118b36020830184611e1f565b60005b83811015611f25578181015183820152602001611f0d565b83811115611f34576000848401525b50505050565b6000600019821415611f5a57634e487b7160e01b81526011600452602481fd5b5060010190565b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611f8c57600080fd5b5056fea2646970667358221220a1a228a3dca0ea7d81523e00197fce14e0f7b408a79fba81b0d56a9bbfbc89be64736f6c63430008040033a264697066735822122071d1c3ecf4c904b5ed2f68c59e97b6965a97cb8b6b3b857a12e3109dfb74d73f64736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000d7df4d751a16a6e2a68c1a383e6aee94baff7a9f0000000000000000000000000423ea54aab6ad2ac768ff243a7ab7cf57ace03c0000000000000000000000000000000000000000000000000000000000000064
-----Decoded View---------------
Arg [0] : keyNFTAddress (address): 0xd7Df4d751a16a6E2A68C1a383E6aEE94bafF7A9F
Arg [1] : paymentModuleAddress (address): 0x0423eA54AAB6aD2Ac768FF243a7AB7cf57aCE03c
Arg [2] : maxTokens (uint256): 100
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000d7df4d751a16a6e2a68c1a383e6aee94baff7a9f
Arg [1] : 0000000000000000000000000423ea54aab6ad2ac768ff243a7ab7cf57ace03c
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000064
Deployed Bytecode Sourcemap
44576:6274:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44877:35;;;;;-1:-1:-1;;;;;44877:35:0;;;;;;-1:-1:-1;;;;;7530:55:1;;;7512:74;;7500:2;7485:18;44877:35:0;;;;;;;;45918:284;;;;;;:::i;:::-;;:::i;:::-;;44919:32;;;;;;;;;16729:25:1;;;16717:2;16702:18;44919:32:0;16684:76:1;49342:161:0;;;;;;:::i;:::-;;:::i;44820:20::-;;;;;-1:-1:-1;;;;;44820:20:0;;;44709:45;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;44709:45:0;;;44761:50;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;49511:316::-;;;;;;:::i;:::-;;:::i;48959:375::-;;;;;;:::i;:::-;;:::i;44847:23::-;;;;;-1:-1:-1;;;;;44847:23:0;;;46210:2741;;;;;;:::i;:::-;;:::i;45918:284::-;46006:5;;-1:-1:-1;;;;;46006:5:0;45992:10;:19;45984:76;;;;-1:-1:-1;;;45984:76:0;;15552:2:1;45984:76:0;;;15534:21:1;15591:2;15571:18;;;15564:30;15630:34;15610:18;;;15603:62;15701:14;15681:18;;;15674:42;15733:19;;45984:76:0;;;;;;;;;46090:17;;;46118:26;;;;46162:32;;46138:6;;46090:17;;46162:32;;46073:14;;46162:32;45918:284;;:::o;49342:161::-;49423:5;;-1:-1:-1;;;;;49423:5:0;49409:10;:19;49401:67;;;;-1:-1:-1;;;49401:67:0;;16381:2:1;49401:67:0;;;16363:21:1;16420:2;16400:18;;;16393:30;16459:34;16439:18;;;16432:62;-1:-1:-1;;;16510:18:1;;;16503:33;16553:19;;49401:67:0;16353:225:1;49401:67:0;49479:5;:16;;-1:-1:-1;;49479:16:0;-1:-1:-1;;;;;49479:16:0;;;;;;;;;;49342:161::o;49511:316::-;49601:5;;-1:-1:-1;;;;;49601:5:0;49587:10;:19;49579:75;;;;-1:-1:-1;;;49579:75:0;;13091:2:1;49579:75:0;;;13073:21:1;13130:2;13110:18;;;13103:30;13169:34;13149:18;;;13142:62;13240:13;13220:18;;;13213:41;13271:19;;49579:75:0;13063:233:1;49579:75:0;49693:13;;;-1:-1:-1;;;;;49718:41:0;;;-1:-1:-1;;49718:41:0;;;;;;;49777:42;;49693:13;;;49718:41;49693:13;;49777:42;;49665:17;;49777:42;49511:316;;:::o;48959:375::-;49063:18;49048:10;49036:23;;;;:11;:23;;;;;;;;:45;;;;;;-1:-1:-1;;;49036:45:0;;;;;;;;;;49028:105;;;;-1:-1:-1;;;49028:105:0;;15965:2:1;49028:105:0;;;15947:21:1;16004:2;15984:18;;;15977:30;16043:34;16023:18;;;16016:62;16114:17;16094:18;;;16087:45;16149:19;;49028:105:0;15937:237:1;49028:105:0;49150:20;49146:99;;;49199:10;49187:23;;;;:11;:23;;;;;:46;;-1:-1:-1;;49187:46:0;49213:20;49187:46;;;49146:99;49262:64;;;49288:15;16933:25:1;;17001:14;;16994:22;16989:2;16974:18;;16967:50;49276:10:0;;49262:64;;16906:18:1;49262:64:0;;;;;;;48959:375;:::o;46210:2741::-;46587:15;46568;:34;;46560:86;;;;-1:-1:-1;;;46560:86:0;;14729:2:1;46560:86:0;;;14711:21:1;14768:2;14748:18;;;14741:30;14807:34;14787:18;;;14780:62;14878:9;14858:18;;;14851:37;14905:19;;46560:86:0;14701:229:1;46560:86:0;46710:1;46679:21;:28;:32;:71;;;;46749:1;46715:24;:31;:35;46679:71;:104;;;;46782:1;46754:18;:25;:29;46679:104;46657:190;;;;-1:-1:-1;;;46657:190:0;;13909:2:1;46657:190:0;;;13891:21:1;13948:2;13928:18;;;13921:30;13987:34;13967:18;;;13960:62;-1:-1:-1;;;14038:18:1;;;14031:34;14082:19;;46657:190:0;13881:226:1;46657:190:0;46990:17;;46945:18;:25;46911:24;:31;46880:21;:28;:62;;;;:::i;:::-;:90;;;;:::i;:::-;:127;46858:223;;;;-1:-1:-1;;;46858:223:0;;15137:2:1;46858:223:0;;;15119:21:1;15176:2;15156:18;;;15149:30;15215:34;15195:18;;;15188:62;15286:16;15266:18;;;15259:44;15320:19;;46858:223:0;15109:236:1;46858:223:0;47097:9;47092:171;47116:21;:28;47112:1;:32;47092:171;;;47208:1;47174:21;47196:1;47174:24;;;;;;-1:-1:-1;;;47174:24:0;;;;;;;;;;;;;;;:31;;;:35;47166:85;;;;-1:-1:-1;;;47166:85:0;;13503:2:1;47166:85:0;;;13485:21:1;13542:2;13522:18;;;13515:30;13581:34;13561:18;;;13554:62;-1:-1:-1;;;13632:18:1;;;13625:35;13677:19;;47166:85:0;13475:227:1;47166:85:0;47146:3;;;;:::i;:::-;;;;47092:171;;;;47278:9;47273:165;47297:18;:25;47293:1;:29;47273:165;;;47383:1;47352:18;47371:1;47352:21;;;;;;-1:-1:-1;;;47352:21:0;;;;;;;;;;;;;;;:28;;;:32;47344:82;;;;-1:-1:-1;;;47344:82:0;;13503:2:1;47344:82:0;;;13485:21:1;13542:2;13522:18;;;13515:30;13581:34;13561:18;;;13554:62;-1:-1:-1;;;13632:18:1;;;13625:35;13677:19;;47344:82:0;13475:227:1;47344:82:0;47324:3;;;;:::i;:::-;;;;47273:165;;;-1:-1:-1;47492:6:0;;:27;;-1:-1:-1;;;47492:27:0;;-1:-1:-1;;;;;7530:55:1;;;47492:27:0;;;7512:74:1;47492:6:0;;;;:14;;7485:18:1;;47492:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;47546:6:0;;:35;;-1:-1:-1;;;47546:35:0;;-1:-1:-1;;;;;7530:55:1;;;47546:35:0;;;7512:74:1;47530:13:0;;-1:-1:-1;47546:6:0;;;;-1:-1:-1;47546:22:0;;7485:18:1;;47546:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47530:51;;47722:13;47752:9;47748:562;;;47804:31;;:36;:70;;;;-1:-1:-1;47844:25:0;;:30;47804:70;47778:178;;;;-1:-1:-1;;;47778:178:0;;14314:2:1;47778:178:0;;;14296:21:1;14353:2;14333:18;;;14326:30;14392:34;14372:18;;;14365:62;14463:16;14443:18;;;14436:44;14497:19;;47778:178:0;14286:236:1;47778:178:0;47981:66;48001:5;48008:15;48025:21;47981:19;:66::i;:::-;47973:74;;47748:562;;;48088:210;48124:5;48148:15;48182:21;48222:24;48265:18;48088:17;:210::i;:::-;48080:218;;47748:562;48322:13;;;:239;;-1:-1:-1;;;48322:239:0;;-1:-1:-1;;;;;48322:13:0;;;;:28;;:239;;48365:5;;48385:10;;48410:8;;48433:21;;48469:24;;48508:18;;48541:9;;48322:239;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;48574:10:0;:17;;;;;;;;;;;:25;;-1:-1:-1;;48574:25:0;-1:-1:-1;;;;;48574:25:0;;;;;;;;48610:18;;-1:-1:-1;48610:18:0;;;;;;;:39;;-1:-1:-1;;;48610:18:0;-1:-1:-1;;48610:39:0;-1:-1:-1;;48610:39:0;;;;;48759:11;-1:-1:-1;;;;;48667:276:0;48714:5;48694;-1:-1:-1;;;;;48667:276:0;;48734:10;48785:15;48815:21;48851:24;48890:18;48923:9;48667:276;;;;;;;;;;;:::i;:::-;;;;;;;;46210:2741;;;;;;;;;:::o;49835:415::-;50008:7;50028:26;50104:6;;;;;;;;;-1:-1:-1;;;;;50104:6:0;50126:5;50146:15;50176:21;50057:151;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50028:180:0;49835:415;-1:-1:-1;;;;;49835:415:0:o;50258:589::-;50553:7;50573:16;50629:6;;;;;;;;;-1:-1:-1;;;;;50629:6:0;50651:5;50671:15;50701:21;50737:24;50776:18;50592:213;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50573:232:0;50258:589;-1:-1:-1;;;;;;;50258:589:0:o;-1:-1:-1:-;;;;;;;;:::o;:::-;;;;;;;;:::o;14:196:1:-;82:20;;-1:-1:-1;;;;;131:54:1;;121:65;;111:2;;200:1;197;190:12;111:2;63:147;;;:::o;215:1055::-;286:5;339:3;332:4;324:6;320:17;316:27;306:2;;361:5;354;347:20;306:2;401:6;388:20;427:4;451:80;467:63;527:2;467:63;:::i;:::-;451:80;:::i;:::-;565:15;;;596:12;;;;628:15;;;662:4;697:11;;;685:24;;681:33;;678:42;-1:-1:-1;675:2:1;;;737:5;730;723:20;675:2;763:5;777:464;791:2;788:1;785:9;777:464;;;858:2;852:3;847;843:13;839:22;836:2;;;878:5;871;864:20;836:2;912:22;;:::i;:::-;961:23;980:3;961:23;:::i;:::-;947:38;;1034:12;;;1021:26;1005:14;;;998:50;1071:2;1122:12;;;1109:26;1093:14;;;1086:50;1149:18;;1187:12;;;;1219;;;;809:1;802:9;777:464;;;-1:-1:-1;1259:5:1;;296:974;-1:-1:-1;;;;;;;;296:974:1:o;1275:976::-;1352:5;1405:3;1398:4;1390:6;1386:17;1382:27;1372:2;;1427:5;1420;1413:20;1372:2;1467:6;1454:20;1493:4;1517:80;1533:63;1593:2;1533:63;:::i;1517:80::-;1619:3;1643:2;1638:3;1631:15;1671:2;1666:3;1662:12;1655:19;;1706:2;1698:6;1694:15;1758:3;1753:2;1747;1744:1;1740:10;1732:6;1728:23;1724:32;1721:41;1718:2;;;1779:5;1772;1765:20;1718:2;1805:5;1819:403;1833:2;1830:1;1827:9;1819:403;;;1888:4;1927:2;1921:3;1916;1912:13;1908:22;1905:2;;;1947:5;1940;1933:20;1905:2;1981:22;;:::i;:::-;2030:23;2049:3;2030:23;:::i;:::-;2016:38;;2103:12;;;2090:26;2074:14;;;2067:50;2130:18;;2168:12;;;;2200;;;;1851:1;1844:9;1819:403;;;-1:-1:-1;2240:5:1;;1362:889;-1:-1:-1;;;;;;;1362:889:1:o;2256:160::-;2321:20;;2377:13;;2370:21;2360:32;;2350:2;;2406:1;2403;2396:12;2421:196;2480:6;2533:2;2521:9;2512:7;2508:23;2504:32;2501:2;;;2554:6;2546;2539:22;2501:2;2582:29;2601:9;2582:29;:::i;:::-;2572:39;2491:126;-1:-1:-1;;;2491:126:1:o;2622:2180::-;2921:6;2929;2937;2945;2953;2961;2969;3022:3;3010:9;3001:7;2997:23;2993:33;2990:2;;;3044:6;3036;3029:22;2990:2;3072:29;3091:9;3072:29;:::i;:::-;3062:39;;3120:38;3154:2;3143:9;3139:18;3120:38;:::i;:::-;3110:48;;3205:2;3194:9;3190:18;3177:32;3167:42;;3258:18;3252:2;3241:9;3237:18;3224:32;3221:56;3218:2;;;3295:6;3287;3280:22;3218:2;3366;3355:9;3351:18;3338:32;3327:9;3323:48;3409:7;3402:4;3398:2;3394:13;3390:27;3380:2;;3436:6;3428;3421:22;3380:2;3465:94;3481:77;3554:2;3541:16;3481:77;:::i;3465:94::-;3581:3;3618:2;3605:16;3600:3;3593:29;3647:2;3642:3;3638:12;3631:19;;3678:2;3674;3670:11;3741:7;3736:2;3730;3725;3712:16;3708:25;3704:2;3700:34;3696:43;3693:56;3690:2;;;3767:6;3759;3752:22;3690:2;3794:6;3809:462;3836:2;3823:16;3820:1;3817:23;3809:462;;;3908:2;3902:3;3893:7;3889:17;3885:26;3882:2;;;3929:6;3921;3914:22;3882:2;3964:22;;:::i;:::-;4013:23;4032:3;4013:23;:::i;:::-;4006:5;3999:38;4095:2;4090:3;4086:12;4073:26;4068:2;4061:5;4057:14;4050:50;4136:29;4161:2;4156:3;4152:12;4136:29;:::i;:::-;4131:2;4120:14;;4113:53;4179:18;;4226:2;4217:12;;;;4258:2;4249:12;;;;;3855:1;3848:9;3809:462;;;3813:3;;4290:5;4280:15;;;;;4345:18;4338:3;4327:9;4323:19;4310:33;4307:57;4304:2;;;4382:6;4374;4367:22;4304:2;4410:111;4513:7;4505:3;4494:9;4490:19;4477:33;4466:9;4462:49;4410:111;:::i;:::-;4400:121;;4571:18;4564:3;4553:9;4549:19;4536:33;4533:57;4530:2;;;4608:6;4600;4593:22;4530:2;4636:105;4733:7;4725:3;4714:9;4710:19;4697:33;4686:9;4682:49;4636:105;:::i;:::-;4626:115;;4760:36;4791:3;4780:9;4776:19;4760:36;:::i;:::-;4750:46;;2980:1822;;;;;;;;;;:::o;4807:190::-;4863:6;4916:2;4904:9;4895:7;4891:23;4887:32;4884:2;;;4937:6;4929;4922:22;4884:2;4965:26;4981:9;4965:26;:::i;5002:190::-;5061:6;5114:2;5102:9;5093:7;5089:23;5085:32;5082:2;;;5135:6;5127;5120:22;5082:2;-1:-1:-1;5163:23:1;;5072:120;-1:-1:-1;5072:120:1:o;5197:194::-;5267:6;5320:2;5308:9;5299:7;5295:23;5291:32;5288:2;;;5341:6;5333;5326:22;5288:2;-1:-1:-1;5369:16:1;;5278:113;-1:-1:-1;5278:113:1:o;5396:689::-;5469:3;5507:5;5501:12;5534:6;5529:3;5522:19;5560:4;5589:2;5584:3;5580:12;5573:19;;5626:2;5619:5;5615:14;5647:3;5659:401;5673:6;5670:1;5667:13;5659:401;;;5732:13;;5774:9;;-1:-1:-1;;;;;5770:58:1;5758:71;;5869:11;;;5863:18;5849:12;;;5842:40;5905:4;5963:11;;;5957:18;5950:26;5943:34;5929:12;;;5922:56;6007:4;5998:14;;;;6035:15;;;;5695:1;5688:9;5659:401;;;-1:-1:-1;6076:3:1;;5477:608;-1:-1:-1;;;;;5477:608:1:o;6090:670::-;6160:3;6198:5;6192:12;6225:6;6220:3;6213:19;6251:4;6280:2;6275:3;6271:12;6264:19;;6317:2;6310:5;6306:14;6338:3;6350:385;6364:6;6361:1;6358:13;6350:385;;;6423:13;;6465:9;;-1:-1:-1;;;;;6461:58:1;6449:71;;6560:11;;;6554:18;6540:12;;;6533:40;6596:4;6640:11;;;6634:18;6620:12;;;6613:40;6682:4;6673:14;;;;6710:15;;;;6386:1;6379:9;6350:385;;6765:596;6841:3;6879:5;6873:12;6906:6;6901:3;6894:19;6932:4;6961:2;6956:3;6952:12;6945:19;;6998:2;6991:5;6987:14;7019:3;7031:305;7045:6;7042:1;7039:13;7031:305;;;7104:13;;7146:9;;-1:-1:-1;;;;;7142:58:1;7130:71;;7241:11;;7235:18;7221:12;;;7214:40;7283:4;7274:14;;;;7311:15;;;;7067:1;7060:9;7031:305;;7597:1344;8229:4;-1:-1:-1;;;;;8339:2:1;8331:6;8327:15;8316:9;8309:34;8391:2;8383:6;8379:15;8374:2;8363:9;8359:18;8352:43;8443:2;8435:6;8431:15;8426:2;8415:9;8411:18;8404:43;;8483:3;8478:2;8467:9;8463:18;8456:31;8510:77;8582:3;8571:9;8567:19;8559:6;8510:77;:::i;:::-;8636:9;8628:6;8624:22;8618:3;8607:9;8603:19;8596:51;8670:67;8730:6;8722;8670:67;:::i;:::-;8656:81;;8786:9;8778:6;8774:22;8768:3;8757:9;8753:19;8746:51;8814:61;8868:6;8860;8814:61;:::i;:::-;8806:69;;;8926:6;8919:14;8912:22;8906:3;8895:9;8891:19;8884:51;8238:703;;;;;;;;;;:::o;8946:1233::-;-1:-1:-1;;;;;9591:6:1;9587:55;9576:9;9569:74;9679:6;9674:2;9663:9;9659:18;9652:34;9722:3;9717:2;9706:9;9702:18;9695:31;9550:4;9749:77;9821:3;9810:9;9806:19;9798:6;9749:77;:::i;:::-;9874:9;9866:6;9862:22;9857:2;9846:9;9842:18;9835:50;9908:67;9968:6;9960;9908:67;:::i;:::-;9894:81;;10024:9;10016:6;10012:22;10006:3;9995:9;9991:19;9984:51;10052:61;10106:6;10098;10052:61;:::i;:::-;10044:69;;;10164:6;10157:14;10150:22;10144:3;10133:9;10129:19;10122:51;9559:620;;;;;;;;;:::o;10184:621::-;-1:-1:-1;;;;;10527:6:1;10523:55;10512:9;10505:74;10615:6;10610:2;10599:9;10595:18;10588:34;10658:6;10653:2;10642:9;10638:18;10631:34;10701:3;10696:2;10685:9;10681:18;10674:31;10486:4;10722:77;10794:3;10783:9;10779:19;10771:6;10722:77;:::i;:::-;10714:85;10495:310;-1:-1:-1;;;;;;10495:310:1:o;10810:1223::-;-1:-1:-1;;;;;11461:6:1;11457:55;11446:9;11439:74;11549:6;11544:2;11533:9;11529:18;11522:34;11592:6;11587:2;11576:9;11572:18;11565:34;11635:3;11630:2;11619:9;11615:18;11608:31;11420:4;11662:77;11734:3;11723:9;11719:19;11711:6;11662:77;:::i;:::-;11788:9;11780:6;11776:22;11770:3;11759:9;11755:19;11748:51;11822:67;11882:6;11874;11822:67;:::i;:::-;11808:81;;11938:9;11930:6;11926:22;11920:3;11909:9;11905:19;11898:51;11966:61;12020:6;12012;11966:61;:::i;:::-;11958:69;11429:604;-1:-1:-1;;;;;;;;;11429:604:1:o;12540:344::-;12688:2;12673:18;;12721:1;12710:13;;12700:2;;12766:10;12761:3;12757:20;12754:1;12747:31;12801:4;12798:1;12791:15;12829:4;12826:1;12819:15;12700:2;12853:25;;;12655:229;:::o;17028:253::-;17100:2;17094:9;17142:4;17130:17;;17177:18;17162:34;;17198:22;;;17159:62;17156:2;;;17224:18;;:::i;:::-;17260:2;17253:22;17074:207;:::o;17286:257::-;17358:4;17352:11;;;17390:17;;17437:18;17422:34;;17458:22;;;17419:62;17416:2;;;17484:18;;:::i;17548:275::-;17619:2;17613:9;17684:2;17665:13;;-1:-1:-1;;17661:27:1;17649:40;;17719:18;17704:34;;17740:22;;;17701:62;17698:2;;;17766:18;;:::i;:::-;17802:2;17795:22;17593:230;;-1:-1:-1;17593:230:1:o;17828:203::-;17908:4;17941:18;17933:6;17930:30;17927:2;;;17963:18;;:::i;:::-;-1:-1:-1;18008:1:1;18004:14;18020:4;18000:25;;17917:114::o;18036:128::-;18076:3;18107:1;18103:6;18100:1;18097:13;18094:2;;;18113:18;;:::i;:::-;-1:-1:-1;18149:9:1;;18084:80::o;18169:135::-;18208:3;-1:-1:-1;;18229:17:1;;18226:2;;;18249:18;;:::i;:::-;-1:-1:-1;18296:1:1;18285:13;;18216:88::o;18309:127::-;18370:10;18365:3;18361:20;18358:1;18351:31;18401:4;18398:1;18391:15;18425:4;18422:1;18415:15;18441:127;18502:10;18497:3;18493:20;18490:1;18483:31;18533:4;18530:1;18523:15;18557:4;18554:1;18547:15
Swarm Source
ipfs://71d1c3ecf4c904b5ed2f68c59e97b6965a97cb8b6b3b857a12e3109dfb74d73f
Loading...
Loading
Loading...
Loading
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.