Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 17400697 | 473 days ago | IN | 0 ETH | 0.10015593 |
Loading...
Loading
Contract Name:
Validator
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol"; import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {SafeMath} from "@openzeppelin/contracts/utils/math/SafeMath.sol"; import {IFeeManager} from "./interfaces/IFeeManager.sol"; import {ICollection} from "./interfaces/ICollection.sol"; import {Transfers} from "./Transfers.sol"; import {Auth} from "../security/Auth.sol"; import {Types} from "./libraries/Types.sol"; /** * @author Jonatã Oliveira * @title Validator * @dev Validate marketplace functions and receive/handle platform funds. */ contract Validator is Initializable, ReentrancyGuardUpgradeable, Transfers, Auth { using SafeMath for uint256; struct Services { bool swap; bool offer; bool collectionOffer; } address public MARKETPLACE; IFeeManager private feeManager; Services public services; mapping(address => bool) public allowedCurrencies; /// @custom:oz-upgrades-unsafe-allow constructor constructor() { _disableInitializers(); } function initialize(address _feeManager, address _pool) public initializer { __Auth_init(msg.sender); __ReentrancyGuard_init(); __Transfers_init(_feeManager, _pool); feeManager = IFeeManager(_feeManager); allowedCurrencies[address(0)] = true; } function setMarketplace(address _marketplace) external authorized { require(_marketplace != address(0), "Invalid address"); MARKETPLACE = _marketplace; } function setServices(bool swap, bool offer, bool collectionOffer) external authorized { services = Services(swap, offer, collectionOffer); } function buy(Types.Order calldata _order, bool _completed, address _SENDER) external payable onlyMarketplace swapActive nonReentrant { bytes32 message = keccak256( abi.encodePacked( _order.seller, _order.collection, _order.currency, _order.price, _order.token_id, _order.endTime, _order.salt, _order.royalty, _order.royalty_receiver ) ); bytes32 signedMessage = getSignedMessageHash(message); require(recoverSigner(signedMessage, _order.signature) == _order.seller, "Invalid Order"); require(!_completed, "Order completed or canceled"); require(_order.seller != _SENDER, "Owner cannot buy"); require(block.timestamp < _order.endTime, "Expired order"); require(_order.currency == address(0), "Invalid currency"); if (_order.currency == address(0)) { require(msg.value >= _order.price, "Insufficient amount"); } // Transfer platform fee, royalties and seller amount _transferFeesAndFunds(_order.collection, _order.seller, _order.price, _order.royalty, _order.royalty_receiver); // Transfer NFT token to buyer _transferNFT(_order.collection, _order.seller, _SENDER, _order.token_id); } function acceptOffer(Types.Offer calldata _offer, bool _completed, address _SENDER) external onlyMarketplace offerActive nonReentrant { bytes32 message = keccak256( abi.encodePacked( _offer.offerer, _offer.collection, _offer.price, _offer.token_id, _offer.endTime, _offer.salt, _offer.royalty, _offer.royalty_receiver ) ); bytes32 signedMessage = getSignedMessageHash(message); require(recoverSigner(signedMessage, _offer.signature) == _offer.offerer, "Invalid Offer"); require(!_completed, "Offer completed or canceled"); require(_offer.offerer != _SENDER, "Offerer is the seller"); require(block.timestamp < _offer.endTime, "Expired offer"); // Transfer platform fee and seller amount _transferFeesAndFundsPool(_offer.collection, _offer.offerer, _SENDER, _offer.price, _offer.royalty, _offer.royalty_receiver); // Transfer NFT token to offerrer _transferNFT(_offer.collection, _SENDER, _offer.offerer, _offer.token_id); } function acceptCollectionOffer( Types.CollectionOffer calldata _collectionOffer, uint8 _iteration, address _SENDER ) external onlyMarketplace colOfferActive nonReentrant { bytes32 message = keccak256( abi.encodePacked( _collectionOffer.offerer, _collectionOffer.collection, _collectionOffer.price, _collectionOffer.amount, _collectionOffer.endTime, _collectionOffer.salt, _collectionOffer.royalty, _collectionOffer.royalty_receiver ) ); bytes32 signedMessage = getSignedMessageHash(message); require(recoverSigner(signedMessage, _collectionOffer.signature) == _collectionOffer.offerer, "Invalid Offer"); require(_iteration < _collectionOffer.amount, "Offer completed or canceled"); require(_collectionOffer.offerer != _SENDER, "Offerer is the seller"); require(block.timestamp < _collectionOffer.endTime, "Expired offer"); // Transfer platform fee and seller amount _transferFeesAndFundsPool( _collectionOffer.collection, _collectionOffer.offerer, _SENDER, _collectionOffer.price, _collectionOffer.royalty, _collectionOffer.royalty_receiver ); // Transfer NFT token to offerrer _transferNFT(_collectionOffer.collection, _SENDER, _collectionOffer.offerer, _collectionOffer.token_id); } function recoverSigner(bytes32 message, bytes calldata sig) private pure returns (address) { uint8 v; bytes32 r; bytes32 s; (v, r, s) = splitSignature(sig); return ecrecover(message, v, r, s); } function splitSignature(bytes memory sig) private pure returns (uint8, bytes32, bytes32) { require(sig.length == 65, "Invalid signature"); bytes32 r; bytes32 s; uint8 v; assembly { r := mload(add(sig, 32)) s := mload(add(sig, 64)) v := byte(0, mload(add(sig, 96))) } return (v, r, s); } function getSignedMessageHash(bytes32 _messageHash) public pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", _messageHash)); } modifier onlyMarketplace() { _onlyMarketplace(); _; } function _onlyMarketplace() private view { require(msg.sender == MARKETPLACE && MARKETPLACE != address(0), "!MARKETPLACE"); } modifier swapActive() { _serviceActive(services.swap); _; } modifier offerActive() { _serviceActive(services.offer); _; } modifier colOfferActive() { _serviceActive(services.collectionOffer); _; } function _serviceActive(bool _service) private pure { require(_service, "Service disabled"); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.1) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; import "../../utils/AddressUpgradeable.sol"; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: setting the version to 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _initializing; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuardUpgradeable is Initializable { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; function __ReentrancyGuard_init() internal onlyInitializing { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal onlyInitializing { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; import "../utils/introspection/IERC165.sol"; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); }
// SPDX-License-Identifier: MIT // 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; interface ICollection is IERC721 { function owner() external view returns (address); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; interface IFeeManager { function setCollectionFee(address collection, uint16 fee) external; function removeCollectionFee(address collection) external; function setDefaultFee(uint16 fee) external; function setFeeReceiver(address receiver) external; function getReceiver() external view returns (address); function getFee(address collection) external view returns (uint16); function divider() external view returns (uint16); function getFeeAmount(address collection, uint256 amount) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; interface IPool { event Transfer(address indexed from, address indexed to, uint256 amount); function totalSupply() external view returns (uint256); function balanceOf(address user) external view returns (uint256); function deposit() external payable; function withdraw(uint256) external; function safeWithdraw(address from, address to, uint256 amount) external returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; /** * @title Types * @notice This library contains order types for the Minthree marketplace. */ library Types { struct Order { bytes signature; address seller; address collection; address currency; uint256 price; uint256 endTime; bytes32 salt; uint256 token_id; uint256 royalty; address royalty_receiver; } struct Offer { bytes signature; address offerer; address collection; uint256 price; uint256 endTime; bytes32 salt; uint256 token_id; uint256 royalty; address royalty_receiver; } struct CollectionOffer { bytes signature; address offerer; address collection; uint256 price; uint8 amount; uint256 endTime; bytes32 salt; uint256 token_id; uint256 royalty; address royalty_receiver; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import {IERC2981} from "@openzeppelin/contracts/interfaces/IERC2981.sol"; import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; import {SafeMath} from "@openzeppelin/contracts/utils/math/SafeMath.sol"; import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import {IFeeManager} from "./interfaces/IFeeManager.sol"; import {ICollection} from "./interfaces/ICollection.sol"; import {IPool} from "./interfaces/IPool.sol"; import {Types} from "./libraries/Types.sol"; /** * @author Jonatã Oliveira * @title Transfers * @dev Transfer functions (fees, royalties and others). */ contract Transfers is Initializable { using SafeMath for uint256; IFeeManager private _feeManager; IPool private _pool; function __Transfers_init(address _feeManager_, address _pool_) internal onlyInitializing { _feeManager = IFeeManager(_feeManager_); _pool = IPool(_pool_); } /** * @dev Transfer platform fee, royalty and seller amount * @param _collection address of the token collection * @param _to receiver address * @param _price token price * @param _royalty royalty amount * @param _royalty_receiver royalty receiver address */ function _transferFeesAndFunds(address _collection, address _to, uint256 _price, uint256 _royalty, address _royalty_receiver) internal { uint256 feeAmount = _feeManager.getFeeAmount(_collection, _price); uint256 sellerAmount = _price.sub(feeAmount).sub(_royalty); // Retrieve the fee amount to platform (bool fs, ) = payable(_feeManager.getReceiver()).call{value: feeAmount}(""); require(fs, "Fail: Platform"); // Pay royalty amount (if exists) if (_royalty_receiver != address(0) && _royalty > 0) { (bool hs, ) = payable(_royalty_receiver).call{value: _royalty}(""); require(hs, "Fail: Royalties"); } // Pay value to the seller (bool os, ) = payable(_to).call{value: sellerAmount}(""); require(os, "Fail: Seller"); } /** * @dev Transfer platform fee, royalty and seller amount * @param _collection address of the token collection * @param _from buyer address * @param _to seller address * @param _price price * @param _royalty royalty amount * @param _royalty_receiver royalty receiver address */ function _transferFeesAndFundsPool( address _collection, address _from, address _to, uint256 _price, uint256 _royalty, address _royalty_receiver ) internal { uint256 feeAmount = _feeManager.getFeeAmount(_collection, _price); uint256 sellerAmount = _price.sub(feeAmount).sub(_royalty); // Retrieve the fee amount to platform if (feeAmount > 0) { require(_pool.safeWithdraw(_from, _feeManager.getReceiver(), feeAmount), "Transfer Fee error"); } // Pay royalty amount (if exists) if (_royalty_receiver != address(0) && _royalty > 0) { require(_pool.safeWithdraw(_from, _royalty_receiver, _royalty), "Transfer Fee error"); } // Pay value to the seller require(_pool.safeWithdraw(_from, _to, sellerAmount), "Transfer Seller error"); } /** * @dev Transfer ERC-721 NFT * @param collection address of the token collection * @param from address of the sender * @param to address of the recipient * @param tokenId tokenId */ function _transferNFT(address collection, address from, address to, uint256 tokenId) internal { if (IERC165(collection).supportsInterface(0x80ac58cd)) { IERC721(collection).safeTransferFrom(from, to, tokenId); } else { revert("Invalid collection contract"); } } }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.17; import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; contract Auth is Initializable { address internal owner; mapping(address => bool) internal authorizations; function __Auth_init(address _owner) internal onlyInitializing { owner = _owner; authorizations[_owner] = true; } /** * Function modifier to require caller to be contract owner */ modifier onlyOwner() { _onlyOwner(); _; } /** * Function modifier to require caller to be authorized */ modifier authorized() { _authorized(); _; } /** * Authorize address. Owner only */ function authorize(address adr) public onlyOwner { authorizations[adr] = true; } /** * Remove address' authorization. Owner only */ function unauthorize(address adr) public onlyOwner { authorizations[adr] = false; } /** * Return address authorization status */ function isAuthorized(address adr) public view returns (bool) { return authorizations[adr]; } /** * Check if address is owner */ function _onlyOwner() private view { require(msg.sender == owner, "!OWNER"); } /** * Check if is authorized */ function _authorized() private view { require(authorizations[msg.sender], "!AUTHORIZED"); } /** * Transfer ownership to new address. Caller must be owner. Leaves old owner authorized */ function transferOwnership(address adr) public onlyOwner { require(adr != address(0), "Invalid address"); owner = adr; authorizations[adr] = true; emit OwnershipTransferred(adr); } event OwnershipTransferred(address owner); }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"MARKETPLACE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"address","name":"offerer","type":"address"},{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint8","name":"amount","type":"uint8"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256","name":"token_id","type":"uint256"},{"internalType":"uint256","name":"royalty","type":"uint256"},{"internalType":"address","name":"royalty_receiver","type":"address"}],"internalType":"struct Types.CollectionOffer","name":"_collectionOffer","type":"tuple"},{"internalType":"uint8","name":"_iteration","type":"uint8"},{"internalType":"address","name":"_SENDER","type":"address"}],"name":"acceptCollectionOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"address","name":"offerer","type":"address"},{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256","name":"token_id","type":"uint256"},{"internalType":"uint256","name":"royalty","type":"uint256"},{"internalType":"address","name":"royalty_receiver","type":"address"}],"internalType":"struct Types.Offer","name":"_offer","type":"tuple"},{"internalType":"bool","name":"_completed","type":"bool"},{"internalType":"address","name":"_SENDER","type":"address"}],"name":"acceptOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowedCurrencies","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"authorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"collection","type":"address"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256","name":"token_id","type":"uint256"},{"internalType":"uint256","name":"royalty","type":"uint256"},{"internalType":"address","name":"royalty_receiver","type":"address"}],"internalType":"struct Types.Order","name":"_order","type":"tuple"},{"internalType":"bool","name":"_completed","type":"bool"},{"internalType":"address","name":"_SENDER","type":"address"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_messageHash","type":"bytes32"}],"name":"getSignedMessageHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_feeManager","type":"address"},{"internalType":"address","name":"_pool","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"isAuthorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"services","outputs":[{"internalType":"bool","name":"swap","type":"bool"},{"internalType":"bool","name":"offer","type":"bool"},{"internalType":"bool","name":"collectionOffer","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_marketplace","type":"address"}],"name":"setMarketplace","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"swap","type":"bool"},{"internalType":"bool","name":"offer","type":"bool"},{"internalType":"bool","name":"collectionOffer","type":"bool"}],"name":"setServices","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"unauthorize","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50620000226200002860201b60201c565b620001d3565b600060019054906101000a900460ff16156200007b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000729062000176565b60405180910390fd5b60ff801660008054906101000a900460ff1660ff161015620000ed5760ff6000806101000a81548160ff021916908360ff1602179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860ff604051620000e49190620001b6565b60405180910390a15b565b600082825260208201905092915050565b7f496e697469616c697a61626c653a20636f6e747261637420697320696e69746960008201527f616c697a696e6700000000000000000000000000000000000000000000000000602082015250565b60006200015e602783620000ef565b91506200016b8262000100565b604082019050919050565b6000602082019050818103600083015262000191816200014f565b9050919050565b600060ff82169050919050565b620001b08162000198565b82525050565b6000602082019050620001cd6000830184620001a5565b92915050565b6139df80620001e36000396000f3fe6080604052600436106100dd5760003560e01c8063be626d141161007f578063f2fde38b11610059578063f2fde38b1461029b578063f4129cd1146102c4578063fe9fbb80146102ed578063ffef3cf01461032a576100dd565b8063be626d1414610219578063e832d2d714610235578063f0b37c0414610272576100dd565b806373ad6c2d116100bb57806373ad6c2d1461015d5780637b2b30e31461018657806386e306b5146101b3578063b6a5d7de146101f0576100dd565b8063485cc955146100e25780634b3ab86e1461010b57806366e39d1d14610134575b600080fd5b3480156100ee57600080fd5b50610109600480360381019061010491906123e0565b610355565b005b34801561011757600080fd5b50610132600480360381019061012d9190612458565b610541565b005b34801561014057600080fd5b5061015b60048036038101906101569190612509565b6105d4565b005b34801561016957600080fd5b50610184600480360381019061017f9190612578565b6108e8565b005b34801561019257600080fd5b5061019b6109a3565b6040516101aa939291906125b4565b60405180910390f35b3480156101bf57600080fd5b506101da60048036038101906101d59190612578565b6109e2565b6040516101e791906125eb565b60405180910390f35b3480156101fc57600080fd5b5061021760048036038101906102129190612578565b610a02565b005b610233600480360381019061022e9190612626565b610a65565b005b34801561024157600080fd5b5061025c600480360381019061025791906126cb565b610e74565b6040516102699190612707565b60405180910390f35b34801561027e57600080fd5b5061029960048036038101906102949190612578565b610ea4565b005b3480156102a757600080fd5b506102c260048036038101906102bd9190612578565b610f07565b005b3480156102d057600080fd5b506102eb60048036038101906102e69190612742565b611051565b005b3480156102f957600080fd5b50610314600480360381019061030f9190612578565b61133c565b60405161032191906125eb565b60405180910390f35b34801561033657600080fd5b5061033f611392565b60405161034c91906127c0565b60405180910390f35b60008060019054906101000a900460ff161590508080156103865750600160008054906101000a900460ff1660ff16105b806103b35750610395306113b8565b1580156103b25750600160008054906101000a900460ff1660ff16145b5b6103f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103e99061285e565b60405180910390fd5b60016000806101000a81548160ff021916908360ff160217905550801561042f576001600060016101000a81548160ff0219169083151502179055505b610438336113db565b6104406114c6565b61044a838361151f565b82603860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001603a60008073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550801561053c5760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498600160405161053391906128c3565b60405180910390a15b505050565b6105496115f4565b604051806060016040528084151581526020018315158152602001821515815250603960008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548160ff02191690831515021790555060408201518160000160026101000a81548160ff021916908315150217905550905050505050565b6105dc611682565b6105f7603960000160029054906101000a900460ff1661176f565b6105ff6117b2565b60008360200160208101906106149190612578565b8460400160208101906106279190612578565b856060013586608001602081019061063f91906128de565b8760a001358860c001358961010001358a6101200160208101906106639190612578565b60405160200161067a9897969594939291906129d5565b604051602081830303815290604052805190602001209050600061069d82610e74565b90508460200160208101906106b29190612578565b73ffffffffffffffffffffffffffffffffffffffff166106e1828780600001906106dc9190612a76565b611801565b73ffffffffffffffffffffffffffffffffffffffff1614610737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072e90612b25565b60405180910390fd5b84608001602081019061074a91906128de565b60ff168460ff1610610791576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078890612b91565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168560200160208101906107bb9190612578565b73ffffffffffffffffffffffffffffffffffffffff1603610811576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080890612bfd565b60405180910390fd5b8460a001354210610857576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084e90612c69565b60405180910390fd5b6108a585604001602081019061086d9190612578565b8660200160208101906108809190612578565b8588606001358961010001358a6101200160208101906108a09190612578565b6118bb565b6108d98560400160208101906108bb9190612578565b848760200160208101906108cf9190612578565b8860e00135611d10565b50506108e3611e48565b505050565b6108f06115f4565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361095f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095690612cd5565b60405180910390fd5b80603760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60398060000160009054906101000a900460ff16908060000160019054906101000a900460ff16908060000160029054906101000a900460ff16905083565b603a6020528060005260406000206000915054906101000a900460ff1681565b610a0a611e51565b6001603660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b610a6d611682565b610a88603960000160009054906101000a900460ff1661176f565b610a906117b2565b6000836020016020810190610aa59190612578565b846040016020810190610ab89190612578565b856060016020810190610acb9190612578565b86608001358760e001358860a001358960c001358a61010001358b610120016020810190610af99190612578565b604051602001610b1199989796959493929190612cf5565b6040516020818303038152906040528051906020012090506000610b3482610e74565b9050846020016020810190610b499190612578565b73ffffffffffffffffffffffffffffffffffffffff16610b7882878060000190610b739190612a76565b611801565b73ffffffffffffffffffffffffffffffffffffffff1614610bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc590612de4565b60405180910390fd5b8315610c0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0690612e50565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff16856020016020810190610c399190612578565b73ffffffffffffffffffffffffffffffffffffffff1603610c8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8690612ebc565b60405180910390fd5b8460a001354210610cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccc90612f28565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16856060016020810190610d009190612578565b73ffffffffffffffffffffffffffffffffffffffff1614610d56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4d90612f94565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16856060016020810190610d819190612578565b73ffffffffffffffffffffffffffffffffffffffff1603610de4578460800135341015610de3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dda90613000565b60405180910390fd5b5b610e31856040016020810190610dfa9190612578565b866020016020810190610e0d9190612578565b876080013588610100013589610120016020810190610e2c9190612578565b611ee3565b610e65856040016020810190610e479190612578565b866020016020810190610e5a9190612578565b858860e00135611d10565b5050610e6f611e48565b505050565b600081604051602001610e879190613077565b604051602081830303815290604052805190602001209050919050565b610eac611e51565b6000603660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b610f0f611e51565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7590612cd5565b60405180910390fd5b80603560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001603660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861638160405161104691906127c0565b60405180910390a150565b611059611682565b611074603960000160019054906101000a900460ff1661176f565b61107c6117b2565b60008360200160208101906110919190612578565b8460400160208101906110a49190612578565b85606001358660c0013587608001358860a001358960e001358a6101000160208101906110d19190612578565b6040516020016110e898979695949392919061309d565b604051602081830303815290604052805190602001209050600061110b82610e74565b90508460200160208101906111209190612578565b73ffffffffffffffffffffffffffffffffffffffff1661114f8287806000019061114a9190612a76565b611801565b73ffffffffffffffffffffffffffffffffffffffff16146111a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119c90612b25565b60405180910390fd5b83156111e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111dd90612b91565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168560200160208101906112109190612578565b73ffffffffffffffffffffffffffffffffffffffff1603611266576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125d90612bfd565b60405180910390fd5b846080013542106112ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a390612c69565b60405180910390fd5b6112f98560400160208101906112c29190612578565b8660200160208101906112d59190612578565b8588606001358960e001358a6101000160208101906112f49190612578565b6118bb565b61132d85604001602081019061130f9190612578565b848760200160208101906113239190612578565b8860c00135611d10565b5050611337611e48565b505050565b6000603660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600060019054906101000a900460ff1661142a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611421906131a1565b60405180910390fd5b80603560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001603660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600060019054906101000a900460ff16611515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150c906131a1565b60405180910390fd5b61151d612291565b565b600060019054906101000a900460ff1661156e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611565906131a1565b60405180910390fd5b81603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080603460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b603660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611680576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116779061320d565b60405180910390fd5b565b603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614801561172e5750600073ffffffffffffffffffffffffffffffffffffffff16603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b61176d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176490613279565b60405180910390fd5b565b806117af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a6906132e5565b60405180910390fd5b50565b6002600154036117f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ee90613351565b60405180910390fd5b6002600181905550565b60008060008061185486868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506122e9565b809350819450829550505050600187848484604051600081526020016040526040516118839493929190613380565b6020604051602081039080840390855afa1580156118a5573d6000803e3d6000fd5b5050506020604051035193505050509392505050565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166361b485f688866040518363ffffffff1660e01b815260040161191a9291906133d4565b602060405180830381865afa158015611937573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195b9190613429565b9050600061198484611976848861236290919063ffffffff16565b61236290919063ffffffff16565b90506000821115611b0157603460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f49f589188603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166398aca9226040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5f919061346b565b856040518463ffffffff1660e01b8152600401611a7e93929190613498565b6020604051808303816000875af1158015611a9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac191906134e4565b611b00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af79061355d565b60405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611b3e5750600084115b15611c2557603460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f49f58918885876040518463ffffffff1660e01b8152600401611ba293929190613498565b6020604051808303816000875af1158015611bc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be591906134e4565b611c24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1b9061355d565b60405180910390fd5b5b603460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f49f58918888846040518463ffffffff1660e01b8152600401611c8493929190613498565b6020604051808303816000875af1158015611ca3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc791906134e4565b611d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfd906135c9565b60405180910390fd5b5050505050505050565b8373ffffffffffffffffffffffffffffffffffffffff166301ffc9a76380ac58cd6040518263ffffffff1660e01b8152600401611d4d919061365d565b602060405180830381865afa158015611d6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8e91906134e4565b15611e07578373ffffffffffffffffffffffffffffffffffffffff166342842e0e8484846040518463ffffffff1660e01b8152600401611dd093929190613498565b600060405180830381600087803b158015611dea57600080fd5b505af1158015611dfe573d6000803e3d6000fd5b50505050611e42565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e39906136c4565b60405180910390fd5b50505050565b60018081905550565b603560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed890613730565b60405180910390fd5b565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166361b485f687866040518363ffffffff1660e01b8152600401611f429291906133d4565b602060405180830381865afa158015611f5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f839190613429565b90506000611fac84611f9e848861236290919063ffffffff16565b61236290919063ffffffff16565b90506000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166398aca9226040518163ffffffff1660e01b8152600401602060405180830381865afa15801561201d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612041919061346b565b73ffffffffffffffffffffffffffffffffffffffff168360405161206490613781565b60006040518083038185875af1925050503d80600081146120a1576040519150601f19603f3d011682016040523d82523d6000602084013e6120a6565b606091505b50509050806120ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e1906137e2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156121275750600085115b156121da5760008473ffffffffffffffffffffffffffffffffffffffff168660405161215290613781565b60006040518083038185875af1925050503d806000811461218f576040519150601f19603f3d011682016040523d82523d6000602084013e612194565b606091505b50509050806121d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121cf9061384e565b60405180910390fd5b505b60008773ffffffffffffffffffffffffffffffffffffffff168360405161220090613781565b60006040518083038185875af1925050503d806000811461223d576040519150601f19603f3d011682016040523d82523d6000602084013e612242565b606091505b5050905080612286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227d906138ba565b60405180910390fd5b505050505050505050565b600060019054906101000a900460ff166122e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d7906131a1565b60405180910390fd5b60018081905550565b60008060006041845114612332576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232990613926565b60405180910390fd5b60008060006020870151925060408701519150606087015160001a90508083839550955095505050509193909250565b600081836123709190613975565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123ad82612382565b9050919050565b6123bd816123a2565b81146123c857600080fd5b50565b6000813590506123da816123b4565b92915050565b600080604083850312156123f7576123f6612378565b5b6000612405858286016123cb565b9250506020612416858286016123cb565b9150509250929050565b60008115159050919050565b61243581612420565b811461244057600080fd5b50565b6000813590506124528161242c565b92915050565b60008060006060848603121561247157612470612378565b5b600061247f86828701612443565b935050602061249086828701612443565b92505060406124a186828701612443565b9150509250925092565b600080fd5b600061014082840312156124c7576124c66124ab565b5b81905092915050565b600060ff82169050919050565b6124e6816124d0565b81146124f157600080fd5b50565b600081359050612503816124dd565b92915050565b60008060006060848603121561252257612521612378565b5b600084013567ffffffffffffffff8111156125405761253f61237d565b5b61254c868287016124b0565b935050602061255d868287016124f4565b925050604061256e868287016123cb565b9150509250925092565b60006020828403121561258e5761258d612378565b5b600061259c848285016123cb565b91505092915050565b6125ae81612420565b82525050565b60006060820190506125c960008301866125a5565b6125d660208301856125a5565b6125e360408301846125a5565b949350505050565b600060208201905061260060008301846125a5565b92915050565b6000610140828403121561261d5761261c6124ab565b5b81905092915050565b60008060006060848603121561263f5761263e612378565b5b600084013567ffffffffffffffff81111561265d5761265c61237d565b5b61266986828701612606565b935050602061267a86828701612443565b925050604061268b868287016123cb565b9150509250925092565b6000819050919050565b6126a881612695565b81146126b357600080fd5b50565b6000813590506126c58161269f565b92915050565b6000602082840312156126e1576126e0612378565b5b60006126ef848285016126b6565b91505092915050565b61270181612695565b82525050565b600060208201905061271c60008301846126f8565b92915050565b60006101208284031215612739576127386124ab565b5b81905092915050565b60008060006060848603121561275b5761275a612378565b5b600084013567ffffffffffffffff8111156127795761277861237d565b5b61278586828701612722565b935050602061279686828701612443565b92505060406127a7868287016123cb565b9150509250925092565b6127ba816123a2565b82525050565b60006020820190506127d560008301846127b1565b92915050565b600082825260208201905092915050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b6000612848602e836127db565b9150612853826127ec565b604082019050919050565b600060208201905081810360008301526128778161283b565b9050919050565b6000819050919050565b6000819050919050565b60006128ad6128a86128a38461287e565b612888565b6124d0565b9050919050565b6128bd81612892565b82525050565b60006020820190506128d860008301846128b4565b92915050565b6000602082840312156128f4576128f3612378565b5b6000612902848285016124f4565b91505092915050565b60008160601b9050919050565b60006129238261290b565b9050919050565b600061293582612918565b9050919050565b61294d612948826123a2565b61292a565b82525050565b6000819050919050565b6000819050919050565b61297861297382612953565b61295d565b82525050565b60008160f81b9050919050565b60006129968261297e565b9050919050565b6129ae6129a9826124d0565b61298b565b82525050565b6000819050919050565b6129cf6129ca82612695565b6129b4565b82525050565b60006129e1828b61293c565b6014820191506129f1828a61293c565b601482019150612a018289612967565b602082019150612a11828861299d565b600182019150612a218287612967565b602082019150612a3182866129be565b602082019150612a418285612967565b602082019150612a51828461293c565b6014820191508190509998505050505050505050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612a9357612a92612a67565b5b80840192508235915067ffffffffffffffff821115612ab557612ab4612a6c565b5b602083019250600182023603831315612ad157612ad0612a71565b5b509250929050565b7f496e76616c6964204f6666657200000000000000000000000000000000000000600082015250565b6000612b0f600d836127db565b9150612b1a82612ad9565b602082019050919050565b60006020820190508181036000830152612b3e81612b02565b9050919050565b7f4f6666657220636f6d706c65746564206f722063616e63656c65640000000000600082015250565b6000612b7b601b836127db565b9150612b8682612b45565b602082019050919050565b60006020820190508181036000830152612baa81612b6e565b9050919050565b7f4f666665726572206973207468652073656c6c65720000000000000000000000600082015250565b6000612be76015836127db565b9150612bf282612bb1565b602082019050919050565b60006020820190508181036000830152612c1681612bda565b9050919050565b7f45787069726564206f6666657200000000000000000000000000000000000000600082015250565b6000612c53600d836127db565b9150612c5e82612c1d565b602082019050919050565b60006020820190508181036000830152612c8281612c46565b9050919050565b7f496e76616c696420616464726573730000000000000000000000000000000000600082015250565b6000612cbf600f836127db565b9150612cca82612c89565b602082019050919050565b60006020820190508181036000830152612cee81612cb2565b9050919050565b6000612d01828c61293c565b601482019150612d11828b61293c565b601482019150612d21828a61293c565b601482019150612d318289612967565b602082019150612d418288612967565b602082019150612d518287612967565b602082019150612d6182866129be565b602082019150612d718285612967565b602082019150612d81828461293c565b6014820191508190509a9950505050505050505050565b7f496e76616c6964204f7264657200000000000000000000000000000000000000600082015250565b6000612dce600d836127db565b9150612dd982612d98565b602082019050919050565b60006020820190508181036000830152612dfd81612dc1565b9050919050565b7f4f7264657220636f6d706c65746564206f722063616e63656c65640000000000600082015250565b6000612e3a601b836127db565b9150612e4582612e04565b602082019050919050565b60006020820190508181036000830152612e6981612e2d565b9050919050565b7f4f776e65722063616e6e6f742062757900000000000000000000000000000000600082015250565b6000612ea66010836127db565b9150612eb182612e70565b602082019050919050565b60006020820190508181036000830152612ed581612e99565b9050919050565b7f45787069726564206f7264657200000000000000000000000000000000000000600082015250565b6000612f12600d836127db565b9150612f1d82612edc565b602082019050919050565b60006020820190508181036000830152612f4181612f05565b9050919050565b7f496e76616c69642063757272656e637900000000000000000000000000000000600082015250565b6000612f7e6010836127db565b9150612f8982612f48565b602082019050919050565b60006020820190508181036000830152612fad81612f71565b9050919050565b7f496e73756666696369656e7420616d6f756e7400000000000000000000000000600082015250565b6000612fea6013836127db565b9150612ff582612fb4565b602082019050919050565b6000602082019050818103600083015261301981612fdd565b9050919050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000613061601c83613020565b915061306c8261302b565b601c82019050919050565b600061308282613054565b915061308e82846129be565b60208201915081905092915050565b60006130a9828b61293c565b6014820191506130b9828a61293c565b6014820191506130c98289612967565b6020820191506130d98288612967565b6020820191506130e98287612967565b6020820191506130f982866129be565b6020820191506131098285612967565b602082019150613119828461293c565b6014820191508190509998505050505050505050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b600061318b602b836127db565b91506131968261312f565b604082019050919050565b600060208201905081810360008301526131ba8161317e565b9050919050565b7f21415554484f52495a4544000000000000000000000000000000000000000000600082015250565b60006131f7600b836127db565b9150613202826131c1565b602082019050919050565b60006020820190508181036000830152613226816131ea565b9050919050565b7f214d41524b4554504c4143450000000000000000000000000000000000000000600082015250565b6000613263600c836127db565b915061326e8261322d565b602082019050919050565b6000602082019050818103600083015261329281613256565b9050919050565b7f536572766963652064697361626c656400000000000000000000000000000000600082015250565b60006132cf6010836127db565b91506132da82613299565b602082019050919050565b600060208201905081810360008301526132fe816132c2565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061333b601f836127db565b915061334682613305565b602082019050919050565b6000602082019050818103600083015261336a8161332e565b9050919050565b61337a816124d0565b82525050565b600060808201905061339560008301876126f8565b6133a26020830186613371565b6133af60408301856126f8565b6133bc60608301846126f8565b95945050505050565b6133ce81612953565b82525050565b60006040820190506133e960008301856127b1565b6133f660208301846133c5565b9392505050565b61340681612953565b811461341157600080fd5b50565b600081519050613423816133fd565b92915050565b60006020828403121561343f5761343e612378565b5b600061344d84828501613414565b91505092915050565b600081519050613465816123b4565b92915050565b60006020828403121561348157613480612378565b5b600061348f84828501613456565b91505092915050565b60006060820190506134ad60008301866127b1565b6134ba60208301856127b1565b6134c760408301846133c5565b949350505050565b6000815190506134de8161242c565b92915050565b6000602082840312156134fa576134f9612378565b5b6000613508848285016134cf565b91505092915050565b7f5472616e7366657220466565206572726f720000000000000000000000000000600082015250565b60006135476012836127db565b915061355282613511565b602082019050919050565b600060208201905081810360008301526135768161353a565b9050919050565b7f5472616e736665722053656c6c6572206572726f720000000000000000000000600082015250565b60006135b36015836127db565b91506135be8261357d565b602082019050919050565b600060208201905081810360008301526135e2816135a6565b9050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60008160e01b9050919050565b600061364761364261363d846135e9565b61361f565b6135f3565b9050919050565b6136578161362c565b82525050565b6000602082019050613672600083018461364e565b92915050565b7f496e76616c696420636f6c6c656374696f6e20636f6e74726163740000000000600082015250565b60006136ae601b836127db565b91506136b982613678565b602082019050919050565b600060208201905081810360008301526136dd816136a1565b9050919050565b7f214f574e45520000000000000000000000000000000000000000000000000000600082015250565b600061371a6006836127db565b9150613725826136e4565b602082019050919050565b600060208201905081810360008301526137498161370d565b9050919050565b600081905092915050565b50565b600061376b600083613750565b91506137768261375b565b600082019050919050565b600061378c8261375e565b9150819050919050565b7f4661696c3a20506c6174666f726d000000000000000000000000000000000000600082015250565b60006137cc600e836127db565b91506137d782613796565b602082019050919050565b600060208201905081810360008301526137fb816137bf565b9050919050565b7f4661696c3a20526f79616c746965730000000000000000000000000000000000600082015250565b6000613838600f836127db565b915061384382613802565b602082019050919050565b600060208201905081810360008301526138678161382b565b9050919050565b7f4661696c3a2053656c6c65720000000000000000000000000000000000000000600082015250565b60006138a4600c836127db565b91506138af8261386e565b602082019050919050565b600060208201905081810360008301526138d381613897565b9050919050565b7f496e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b60006139106011836127db565b915061391b826138da565b602082019050919050565b6000602082019050818103600083015261393f81613903565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061398082612953565b915061398b83612953565b92508282039050818111156139a3576139a2613946565b5b9291505056fea264697066735822122029fd394cdb697b992ed2617db5d046b23933c492b081fff9ebf8aed2fe817d5964736f6c63430008110033
Deployed Bytecode
0x6080604052600436106100dd5760003560e01c8063be626d141161007f578063f2fde38b11610059578063f2fde38b1461029b578063f4129cd1146102c4578063fe9fbb80146102ed578063ffef3cf01461032a576100dd565b8063be626d1414610219578063e832d2d714610235578063f0b37c0414610272576100dd565b806373ad6c2d116100bb57806373ad6c2d1461015d5780637b2b30e31461018657806386e306b5146101b3578063b6a5d7de146101f0576100dd565b8063485cc955146100e25780634b3ab86e1461010b57806366e39d1d14610134575b600080fd5b3480156100ee57600080fd5b50610109600480360381019061010491906123e0565b610355565b005b34801561011757600080fd5b50610132600480360381019061012d9190612458565b610541565b005b34801561014057600080fd5b5061015b60048036038101906101569190612509565b6105d4565b005b34801561016957600080fd5b50610184600480360381019061017f9190612578565b6108e8565b005b34801561019257600080fd5b5061019b6109a3565b6040516101aa939291906125b4565b60405180910390f35b3480156101bf57600080fd5b506101da60048036038101906101d59190612578565b6109e2565b6040516101e791906125eb565b60405180910390f35b3480156101fc57600080fd5b5061021760048036038101906102129190612578565b610a02565b005b610233600480360381019061022e9190612626565b610a65565b005b34801561024157600080fd5b5061025c600480360381019061025791906126cb565b610e74565b6040516102699190612707565b60405180910390f35b34801561027e57600080fd5b5061029960048036038101906102949190612578565b610ea4565b005b3480156102a757600080fd5b506102c260048036038101906102bd9190612578565b610f07565b005b3480156102d057600080fd5b506102eb60048036038101906102e69190612742565b611051565b005b3480156102f957600080fd5b50610314600480360381019061030f9190612578565b61133c565b60405161032191906125eb565b60405180910390f35b34801561033657600080fd5b5061033f611392565b60405161034c91906127c0565b60405180910390f35b60008060019054906101000a900460ff161590508080156103865750600160008054906101000a900460ff1660ff16105b806103b35750610395306113b8565b1580156103b25750600160008054906101000a900460ff1660ff16145b5b6103f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103e99061285e565b60405180910390fd5b60016000806101000a81548160ff021916908360ff160217905550801561042f576001600060016101000a81548160ff0219169083151502179055505b610438336113db565b6104406114c6565b61044a838361151f565b82603860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001603a60008073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550801561053c5760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498600160405161053391906128c3565b60405180910390a15b505050565b6105496115f4565b604051806060016040528084151581526020018315158152602001821515815250603960008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548160ff02191690831515021790555060408201518160000160026101000a81548160ff021916908315150217905550905050505050565b6105dc611682565b6105f7603960000160029054906101000a900460ff1661176f565b6105ff6117b2565b60008360200160208101906106149190612578565b8460400160208101906106279190612578565b856060013586608001602081019061063f91906128de565b8760a001358860c001358961010001358a6101200160208101906106639190612578565b60405160200161067a9897969594939291906129d5565b604051602081830303815290604052805190602001209050600061069d82610e74565b90508460200160208101906106b29190612578565b73ffffffffffffffffffffffffffffffffffffffff166106e1828780600001906106dc9190612a76565b611801565b73ffffffffffffffffffffffffffffffffffffffff1614610737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072e90612b25565b60405180910390fd5b84608001602081019061074a91906128de565b60ff168460ff1610610791576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078890612b91565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168560200160208101906107bb9190612578565b73ffffffffffffffffffffffffffffffffffffffff1603610811576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080890612bfd565b60405180910390fd5b8460a001354210610857576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084e90612c69565b60405180910390fd5b6108a585604001602081019061086d9190612578565b8660200160208101906108809190612578565b8588606001358961010001358a6101200160208101906108a09190612578565b6118bb565b6108d98560400160208101906108bb9190612578565b848760200160208101906108cf9190612578565b8860e00135611d10565b50506108e3611e48565b505050565b6108f06115f4565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361095f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095690612cd5565b60405180910390fd5b80603760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60398060000160009054906101000a900460ff16908060000160019054906101000a900460ff16908060000160029054906101000a900460ff16905083565b603a6020528060005260406000206000915054906101000a900460ff1681565b610a0a611e51565b6001603660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b610a6d611682565b610a88603960000160009054906101000a900460ff1661176f565b610a906117b2565b6000836020016020810190610aa59190612578565b846040016020810190610ab89190612578565b856060016020810190610acb9190612578565b86608001358760e001358860a001358960c001358a61010001358b610120016020810190610af99190612578565b604051602001610b1199989796959493929190612cf5565b6040516020818303038152906040528051906020012090506000610b3482610e74565b9050846020016020810190610b499190612578565b73ffffffffffffffffffffffffffffffffffffffff16610b7882878060000190610b739190612a76565b611801565b73ffffffffffffffffffffffffffffffffffffffff1614610bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc590612de4565b60405180910390fd5b8315610c0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0690612e50565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff16856020016020810190610c399190612578565b73ffffffffffffffffffffffffffffffffffffffff1603610c8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8690612ebc565b60405180910390fd5b8460a001354210610cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccc90612f28565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16856060016020810190610d009190612578565b73ffffffffffffffffffffffffffffffffffffffff1614610d56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4d90612f94565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16856060016020810190610d819190612578565b73ffffffffffffffffffffffffffffffffffffffff1603610de4578460800135341015610de3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dda90613000565b60405180910390fd5b5b610e31856040016020810190610dfa9190612578565b866020016020810190610e0d9190612578565b876080013588610100013589610120016020810190610e2c9190612578565b611ee3565b610e65856040016020810190610e479190612578565b866020016020810190610e5a9190612578565b858860e00135611d10565b5050610e6f611e48565b505050565b600081604051602001610e879190613077565b604051602081830303815290604052805190602001209050919050565b610eac611e51565b6000603660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b610f0f611e51565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7590612cd5565b60405180910390fd5b80603560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001603660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861638160405161104691906127c0565b60405180910390a150565b611059611682565b611074603960000160019054906101000a900460ff1661176f565b61107c6117b2565b60008360200160208101906110919190612578565b8460400160208101906110a49190612578565b85606001358660c0013587608001358860a001358960e001358a6101000160208101906110d19190612578565b6040516020016110e898979695949392919061309d565b604051602081830303815290604052805190602001209050600061110b82610e74565b90508460200160208101906111209190612578565b73ffffffffffffffffffffffffffffffffffffffff1661114f8287806000019061114a9190612a76565b611801565b73ffffffffffffffffffffffffffffffffffffffff16146111a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119c90612b25565b60405180910390fd5b83156111e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111dd90612b91565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168560200160208101906112109190612578565b73ffffffffffffffffffffffffffffffffffffffff1603611266576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125d90612bfd565b60405180910390fd5b846080013542106112ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a390612c69565b60405180910390fd5b6112f98560400160208101906112c29190612578565b8660200160208101906112d59190612578565b8588606001358960e001358a6101000160208101906112f49190612578565b6118bb565b61132d85604001602081019061130f9190612578565b848760200160208101906113239190612578565b8860c00135611d10565b5050611337611e48565b505050565b6000603660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600060019054906101000a900460ff1661142a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611421906131a1565b60405180910390fd5b80603560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001603660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600060019054906101000a900460ff16611515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150c906131a1565b60405180910390fd5b61151d612291565b565b600060019054906101000a900460ff1661156e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611565906131a1565b60405180910390fd5b81603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080603460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b603660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611680576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116779061320d565b60405180910390fd5b565b603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614801561172e5750600073ffffffffffffffffffffffffffffffffffffffff16603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b61176d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176490613279565b60405180910390fd5b565b806117af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a6906132e5565b60405180910390fd5b50565b6002600154036117f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ee90613351565b60405180910390fd5b6002600181905550565b60008060008061185486868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506122e9565b809350819450829550505050600187848484604051600081526020016040526040516118839493929190613380565b6020604051602081039080840390855afa1580156118a5573d6000803e3d6000fd5b5050506020604051035193505050509392505050565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166361b485f688866040518363ffffffff1660e01b815260040161191a9291906133d4565b602060405180830381865afa158015611937573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195b9190613429565b9050600061198484611976848861236290919063ffffffff16565b61236290919063ffffffff16565b90506000821115611b0157603460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f49f589188603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166398aca9226040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5f919061346b565b856040518463ffffffff1660e01b8152600401611a7e93929190613498565b6020604051808303816000875af1158015611a9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac191906134e4565b611b00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af79061355d565b60405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611b3e5750600084115b15611c2557603460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f49f58918885876040518463ffffffff1660e01b8152600401611ba293929190613498565b6020604051808303816000875af1158015611bc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be591906134e4565b611c24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1b9061355d565b60405180910390fd5b5b603460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f49f58918888846040518463ffffffff1660e01b8152600401611c8493929190613498565b6020604051808303816000875af1158015611ca3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc791906134e4565b611d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfd906135c9565b60405180910390fd5b5050505050505050565b8373ffffffffffffffffffffffffffffffffffffffff166301ffc9a76380ac58cd6040518263ffffffff1660e01b8152600401611d4d919061365d565b602060405180830381865afa158015611d6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8e91906134e4565b15611e07578373ffffffffffffffffffffffffffffffffffffffff166342842e0e8484846040518463ffffffff1660e01b8152600401611dd093929190613498565b600060405180830381600087803b158015611dea57600080fd5b505af1158015611dfe573d6000803e3d6000fd5b50505050611e42565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e39906136c4565b60405180910390fd5b50505050565b60018081905550565b603560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed890613730565b60405180910390fd5b565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166361b485f687866040518363ffffffff1660e01b8152600401611f429291906133d4565b602060405180830381865afa158015611f5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f839190613429565b90506000611fac84611f9e848861236290919063ffffffff16565b61236290919063ffffffff16565b90506000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166398aca9226040518163ffffffff1660e01b8152600401602060405180830381865afa15801561201d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612041919061346b565b73ffffffffffffffffffffffffffffffffffffffff168360405161206490613781565b60006040518083038185875af1925050503d80600081146120a1576040519150601f19603f3d011682016040523d82523d6000602084013e6120a6565b606091505b50509050806120ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e1906137e2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156121275750600085115b156121da5760008473ffffffffffffffffffffffffffffffffffffffff168660405161215290613781565b60006040518083038185875af1925050503d806000811461218f576040519150601f19603f3d011682016040523d82523d6000602084013e612194565b606091505b50509050806121d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121cf9061384e565b60405180910390fd5b505b60008773ffffffffffffffffffffffffffffffffffffffff168360405161220090613781565b60006040518083038185875af1925050503d806000811461223d576040519150601f19603f3d011682016040523d82523d6000602084013e612242565b606091505b5050905080612286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227d906138ba565b60405180910390fd5b505050505050505050565b600060019054906101000a900460ff166122e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d7906131a1565b60405180910390fd5b60018081905550565b60008060006041845114612332576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232990613926565b60405180910390fd5b60008060006020870151925060408701519150606087015160001a90508083839550955095505050509193909250565b600081836123709190613975565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123ad82612382565b9050919050565b6123bd816123a2565b81146123c857600080fd5b50565b6000813590506123da816123b4565b92915050565b600080604083850312156123f7576123f6612378565b5b6000612405858286016123cb565b9250506020612416858286016123cb565b9150509250929050565b60008115159050919050565b61243581612420565b811461244057600080fd5b50565b6000813590506124528161242c565b92915050565b60008060006060848603121561247157612470612378565b5b600061247f86828701612443565b935050602061249086828701612443565b92505060406124a186828701612443565b9150509250925092565b600080fd5b600061014082840312156124c7576124c66124ab565b5b81905092915050565b600060ff82169050919050565b6124e6816124d0565b81146124f157600080fd5b50565b600081359050612503816124dd565b92915050565b60008060006060848603121561252257612521612378565b5b600084013567ffffffffffffffff8111156125405761253f61237d565b5b61254c868287016124b0565b935050602061255d868287016124f4565b925050604061256e868287016123cb565b9150509250925092565b60006020828403121561258e5761258d612378565b5b600061259c848285016123cb565b91505092915050565b6125ae81612420565b82525050565b60006060820190506125c960008301866125a5565b6125d660208301856125a5565b6125e360408301846125a5565b949350505050565b600060208201905061260060008301846125a5565b92915050565b6000610140828403121561261d5761261c6124ab565b5b81905092915050565b60008060006060848603121561263f5761263e612378565b5b600084013567ffffffffffffffff81111561265d5761265c61237d565b5b61266986828701612606565b935050602061267a86828701612443565b925050604061268b868287016123cb565b9150509250925092565b6000819050919050565b6126a881612695565b81146126b357600080fd5b50565b6000813590506126c58161269f565b92915050565b6000602082840312156126e1576126e0612378565b5b60006126ef848285016126b6565b91505092915050565b61270181612695565b82525050565b600060208201905061271c60008301846126f8565b92915050565b60006101208284031215612739576127386124ab565b5b81905092915050565b60008060006060848603121561275b5761275a612378565b5b600084013567ffffffffffffffff8111156127795761277861237d565b5b61278586828701612722565b935050602061279686828701612443565b92505060406127a7868287016123cb565b9150509250925092565b6127ba816123a2565b82525050565b60006020820190506127d560008301846127b1565b92915050565b600082825260208201905092915050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b6000612848602e836127db565b9150612853826127ec565b604082019050919050565b600060208201905081810360008301526128778161283b565b9050919050565b6000819050919050565b6000819050919050565b60006128ad6128a86128a38461287e565b612888565b6124d0565b9050919050565b6128bd81612892565b82525050565b60006020820190506128d860008301846128b4565b92915050565b6000602082840312156128f4576128f3612378565b5b6000612902848285016124f4565b91505092915050565b60008160601b9050919050565b60006129238261290b565b9050919050565b600061293582612918565b9050919050565b61294d612948826123a2565b61292a565b82525050565b6000819050919050565b6000819050919050565b61297861297382612953565b61295d565b82525050565b60008160f81b9050919050565b60006129968261297e565b9050919050565b6129ae6129a9826124d0565b61298b565b82525050565b6000819050919050565b6129cf6129ca82612695565b6129b4565b82525050565b60006129e1828b61293c565b6014820191506129f1828a61293c565b601482019150612a018289612967565b602082019150612a11828861299d565b600182019150612a218287612967565b602082019150612a3182866129be565b602082019150612a418285612967565b602082019150612a51828461293c565b6014820191508190509998505050505050505050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612a9357612a92612a67565b5b80840192508235915067ffffffffffffffff821115612ab557612ab4612a6c565b5b602083019250600182023603831315612ad157612ad0612a71565b5b509250929050565b7f496e76616c6964204f6666657200000000000000000000000000000000000000600082015250565b6000612b0f600d836127db565b9150612b1a82612ad9565b602082019050919050565b60006020820190508181036000830152612b3e81612b02565b9050919050565b7f4f6666657220636f6d706c65746564206f722063616e63656c65640000000000600082015250565b6000612b7b601b836127db565b9150612b8682612b45565b602082019050919050565b60006020820190508181036000830152612baa81612b6e565b9050919050565b7f4f666665726572206973207468652073656c6c65720000000000000000000000600082015250565b6000612be76015836127db565b9150612bf282612bb1565b602082019050919050565b60006020820190508181036000830152612c1681612bda565b9050919050565b7f45787069726564206f6666657200000000000000000000000000000000000000600082015250565b6000612c53600d836127db565b9150612c5e82612c1d565b602082019050919050565b60006020820190508181036000830152612c8281612c46565b9050919050565b7f496e76616c696420616464726573730000000000000000000000000000000000600082015250565b6000612cbf600f836127db565b9150612cca82612c89565b602082019050919050565b60006020820190508181036000830152612cee81612cb2565b9050919050565b6000612d01828c61293c565b601482019150612d11828b61293c565b601482019150612d21828a61293c565b601482019150612d318289612967565b602082019150612d418288612967565b602082019150612d518287612967565b602082019150612d6182866129be565b602082019150612d718285612967565b602082019150612d81828461293c565b6014820191508190509a9950505050505050505050565b7f496e76616c6964204f7264657200000000000000000000000000000000000000600082015250565b6000612dce600d836127db565b9150612dd982612d98565b602082019050919050565b60006020820190508181036000830152612dfd81612dc1565b9050919050565b7f4f7264657220636f6d706c65746564206f722063616e63656c65640000000000600082015250565b6000612e3a601b836127db565b9150612e4582612e04565b602082019050919050565b60006020820190508181036000830152612e6981612e2d565b9050919050565b7f4f776e65722063616e6e6f742062757900000000000000000000000000000000600082015250565b6000612ea66010836127db565b9150612eb182612e70565b602082019050919050565b60006020820190508181036000830152612ed581612e99565b9050919050565b7f45787069726564206f7264657200000000000000000000000000000000000000600082015250565b6000612f12600d836127db565b9150612f1d82612edc565b602082019050919050565b60006020820190508181036000830152612f4181612f05565b9050919050565b7f496e76616c69642063757272656e637900000000000000000000000000000000600082015250565b6000612f7e6010836127db565b9150612f8982612f48565b602082019050919050565b60006020820190508181036000830152612fad81612f71565b9050919050565b7f496e73756666696369656e7420616d6f756e7400000000000000000000000000600082015250565b6000612fea6013836127db565b9150612ff582612fb4565b602082019050919050565b6000602082019050818103600083015261301981612fdd565b9050919050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000613061601c83613020565b915061306c8261302b565b601c82019050919050565b600061308282613054565b915061308e82846129be565b60208201915081905092915050565b60006130a9828b61293c565b6014820191506130b9828a61293c565b6014820191506130c98289612967565b6020820191506130d98288612967565b6020820191506130e98287612967565b6020820191506130f982866129be565b6020820191506131098285612967565b602082019150613119828461293c565b6014820191508190509998505050505050505050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b600061318b602b836127db565b91506131968261312f565b604082019050919050565b600060208201905081810360008301526131ba8161317e565b9050919050565b7f21415554484f52495a4544000000000000000000000000000000000000000000600082015250565b60006131f7600b836127db565b9150613202826131c1565b602082019050919050565b60006020820190508181036000830152613226816131ea565b9050919050565b7f214d41524b4554504c4143450000000000000000000000000000000000000000600082015250565b6000613263600c836127db565b915061326e8261322d565b602082019050919050565b6000602082019050818103600083015261329281613256565b9050919050565b7f536572766963652064697361626c656400000000000000000000000000000000600082015250565b60006132cf6010836127db565b91506132da82613299565b602082019050919050565b600060208201905081810360008301526132fe816132c2565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061333b601f836127db565b915061334682613305565b602082019050919050565b6000602082019050818103600083015261336a8161332e565b9050919050565b61337a816124d0565b82525050565b600060808201905061339560008301876126f8565b6133a26020830186613371565b6133af60408301856126f8565b6133bc60608301846126f8565b95945050505050565b6133ce81612953565b82525050565b60006040820190506133e960008301856127b1565b6133f660208301846133c5565b9392505050565b61340681612953565b811461341157600080fd5b50565b600081519050613423816133fd565b92915050565b60006020828403121561343f5761343e612378565b5b600061344d84828501613414565b91505092915050565b600081519050613465816123b4565b92915050565b60006020828403121561348157613480612378565b5b600061348f84828501613456565b91505092915050565b60006060820190506134ad60008301866127b1565b6134ba60208301856127b1565b6134c760408301846133c5565b949350505050565b6000815190506134de8161242c565b92915050565b6000602082840312156134fa576134f9612378565b5b6000613508848285016134cf565b91505092915050565b7f5472616e7366657220466565206572726f720000000000000000000000000000600082015250565b60006135476012836127db565b915061355282613511565b602082019050919050565b600060208201905081810360008301526135768161353a565b9050919050565b7f5472616e736665722053656c6c6572206572726f720000000000000000000000600082015250565b60006135b36015836127db565b91506135be8261357d565b602082019050919050565b600060208201905081810360008301526135e2816135a6565b9050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60008160e01b9050919050565b600061364761364261363d846135e9565b61361f565b6135f3565b9050919050565b6136578161362c565b82525050565b6000602082019050613672600083018461364e565b92915050565b7f496e76616c696420636f6c6c656374696f6e20636f6e74726163740000000000600082015250565b60006136ae601b836127db565b91506136b982613678565b602082019050919050565b600060208201905081810360008301526136dd816136a1565b9050919050565b7f214f574e45520000000000000000000000000000000000000000000000000000600082015250565b600061371a6006836127db565b9150613725826136e4565b602082019050919050565b600060208201905081810360008301526137498161370d565b9050919050565b600081905092915050565b50565b600061376b600083613750565b91506137768261375b565b600082019050919050565b600061378c8261375e565b9150819050919050565b7f4661696c3a20506c6174666f726d000000000000000000000000000000000000600082015250565b60006137cc600e836127db565b91506137d782613796565b602082019050919050565b600060208201905081810360008301526137fb816137bf565b9050919050565b7f4661696c3a20526f79616c746965730000000000000000000000000000000000600082015250565b6000613838600f836127db565b915061384382613802565b602082019050919050565b600060208201905081810360008301526138678161382b565b9050919050565b7f4661696c3a2053656c6c65720000000000000000000000000000000000000000600082015250565b60006138a4600c836127db565b91506138af8261386e565b602082019050919050565b600060208201905081810360008301526138d381613897565b9050919050565b7f496e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b60006139106011836127db565b915061391b826138da565b602082019050919050565b6000602082019050818103600083015261393f81613903565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061398082612953565b915061398b83612953565b92508282039050818111156139a3576139a2613946565b5b9291505056fea264697066735822122029fd394cdb697b992ed2617db5d046b23933c492b081fff9ebf8aed2fe817d5964736f6c63430008110033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.