More Info
Private Name Tags
ContractCreator
Latest 6 from a total of 6 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Detach NFT721 | 14427938 | 1073 days ago | IN | 0 ETH | 0.00424973 | ||||
Attach NFT721 | 14424130 | 1073 days ago | IN | 0.00013499 ETH | 0.00458883 | ||||
Detach NFT721 | 14424116 | 1073 days ago | IN | 0 ETH | 0.00271455 | ||||
Attach NFT721 | 14423701 | 1073 days ago | IN | 0.00013499 ETH | 0.00515727 | ||||
Detach NFT721 | 14423325 | 1073 days ago | IN | 0 ETH | 0.00366482 | ||||
Add NFT721Token | 14422706 | 1073 days ago | IN | 0 ETH | 0.00175869 |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
NFT721Bridge
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; pragma experimental ABIEncoderV2; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/security/Pausable.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; import "../interfaces/INFT721Bridge.sol"; import "../interfaces/vendor/IERC721Mintable.sol"; import "../interfaces/vendor/IERC721Receiver.sol"; contract NFT721Bridge is Ownable, Pausable, ReentrancyGuard, INFT721Bridge, IERC721Receiver { using SafeMath for uint256; address[] nft721List; mapping(address => NFT721FeeInfo) nft721Fee; mapping(address => mapping(bytes32 => bool)) nft721Vault; constructor () { } function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external override returns (bytes4) { require(_nft721TokenRegistered(msg.sender), "token not registered"); require(IERC721Mintable(msg.sender).ownerOf(tokenId) == address(this), "token not received"); bytes32 tokenSig = keccak256(abi.encodePacked(_getChainId(), msg.sender, tokenId)); require(tokenSig == keccak256(data), "token sig should be the same"); nft721Vault[msg.sender][tokenSig] = true; return this.onERC721Received.selector; } function addNFT721Token(address token, NFT721FeeInfo memory feeInfo) external override onlyOwner { require(!_nft721TokenRegistered(token), "token registered"); nft721List.push(token); nft721Fee[token] = feeInfo; emit NFT721TokenAdded(token); emit NFT721FeeUpdated(token, feeInfo.feeAmount, feeInfo.volatilityCoefficient); } function updateNFT721TokenFee(address token, NFT721FeeInfo memory feeInfo) external override onlyOwner { require(_nft721TokenRegistered(token), "token not registered"); nft721Fee[token] = feeInfo; emit NFT721FeeUpdated(token, feeInfo.feeAmount, feeInfo.volatilityCoefficient); } function removeNFT721Token(address token) external override onlyOwner { require(_nft721TokenRegistered(token), "token not registered"); uint8 index = 0; for (uint8 i = 0; i < nft721List.length; i++) { if (nft721List[i] == token) { index = i; } } address[] memory newNFT721List = new address[](nft721List.length-1); for (uint8 j = 0; j < newNFT721List.length; j++) { if (j < index) { newNFT721List[j] = nft721List[j]; } else { newNFT721List[j] = nft721List[j + 1]; } } nft721List = newNFT721List; emit NFT721TokenRemoved(token); } function estimateFee(address token) public view override returns (uint256) { require(_nft721TokenRegistered(token), "token not registered"); return nft721Fee[token].feeAmount.mul(nft721Fee[token].volatilityCoefficient).div(100); } function estimateFee(address token, uint256 amount) public view override returns (uint256) { return estimateFee(token).mul(amount); } function attachNFT721(address token, uint256 tokenId) public payable override whenNotPaused { require(msg.value >= estimateFee(token), "not enough fee"); _attachNFT721(token, tokenId); payable(address(this)).transfer(msg.value); emit NFT721Attached(token, msg.sender, tokenId); } function attachNFT721Batch(address token, uint256[] memory tokenIds) public payable override whenNotPaused { require(msg.value >= estimateFee(token, tokenIds.length), "not enough fee"); require(tokenIds.length > 0, "should provide tokenIds"); for (uint256 i = 0; i < tokenIds.length; i++) { _attachNFT721(token, tokenIds[i]); } payable(address(this)).transfer(msg.value); emit NFT721AttachedBatch(token, msg.sender, tokenIds); } function detachNFT721(address token, address to, uint256 tokenId) external override onlyOwner whenNotPaused { _detachNFT721(token, to, tokenId); emit NFT721Detached(token, to, tokenId); } function detachNFT721Batch(address token, address to, uint256[] memory tokenIds) external override onlyOwner whenNotPaused { require(tokenIds.length > 0, "should provide tokenIds"); for (uint256 i = 0; i < tokenIds.length; i++) { _detachNFT721(token, to, tokenIds[i]); } emit NFT721DetachedBatch(token, to, tokenIds); } function _nft721TokenRegistered(address token) private view returns (bool registered) { for (uint8 i = 0; i < nft721List.length; i++) { if (nft721List[i] == token) { registered = true; } } } function _attachNFT721(address token, uint256 tokenId) private nonReentrant { require(_nft721TokenRegistered(token), "token contract not registered"); require(IERC721Mintable(token).isApprovedForAll(msg.sender, address(this)) || IERC721Mintable(token).getApproved(tokenId) == address(this), "should approve first"); require(IERC721Mintable(token).ownerOf(tokenId) == msg.sender, "sender should own the token"); bytes memory data = abi.encodePacked( _getChainId(), token, tokenId ); IERC721Mintable(token).safeTransferFrom(msg.sender, address(this), tokenId, data); require(nft721Vault[token][keccak256(data)], "nft attach in vault failure"); } function _detachNFT721(address token, address to, uint256 tokenId) private nonReentrant { require(_nft721TokenRegistered(token), "token contract not registered"); try IERC721Mintable(token).ownerOf(tokenId) returns (address owner) { require(owner == address(this), "vault should own the token"); IERC721Mintable(token).safeTransferFrom(address(this), to, tokenId); } catch(bytes memory) { IERC721Mintable(token).mint(to, tokenId); } // delete nft721Vault[token][keccak256(abi.encodePacked(_getChainId(), token, tokenId))]; } function _getChainId() private view returns (uint256) { uint256 chainId = block.chainid; // assembly { // chainId := chainid() // } return chainId; } function emergencyWithdrawNFT(address token, uint256 tokenId) public override onlyOwner { IERC721Mintable(token).transferFrom(address(this), msg.sender, tokenId); } function withdrawFee(address settler) public override onlyOwner { payable(settler).transfer(address(this).balance); } receive() external payable {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @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 ReentrancyGuard { // 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; constructor() { _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() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (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 substraction 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: UNLICENSED pragma solidity ^0.8.0; pragma experimental ABIEncoderV2; interface INFT721Bridge { struct NFT721FeeInfo { uint256 feeAmount; // gasPrice * gasLimit uint256 volatilityCoefficient; // uint: 0.01, % } event NFT721TokenAdded( address indexed token ); event NFT721FeeUpdated( address indexed token, uint256 feeAmount, uint256 volatilityCoefficient ); event NFT721TokenRemoved( address indexed token ); event NFT721Attached( address indexed token, address account, uint256 tokenId ); event NFT721AttachedBatch( address indexed token, address account, uint256[] tokenId ); event NFT721Detached( address indexed token, address account, uint256 tokenId ); event NFT721DetachedBatch( address indexed token, address account, uint256[] tokenId ); function addNFT721Token(address token, NFT721FeeInfo memory feeInfo) external; function updateNFT721TokenFee(address token, NFT721FeeInfo memory feeInfo) external; function removeNFT721Token(address token) external; function estimateFee(address token) external returns (uint256); function estimateFee(address token, uint256 amount) external returns (uint256); function attachNFT721(address token, uint256 tokenId) external payable; function attachNFT721Batch(address token, uint256[] memory tokenId) external payable; function detachNFT721(address token, address to, uint256 tokenId) external; function detachNFT721Batch(address token, address to, uint256[] memory tokenIds) external; function emergencyWithdrawNFT(address token, uint256 tokenId) external; function withdrawFee(address settler) external; }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; pragma experimental ABIEncoderV2; import "@openzeppelin/contracts/access/IAccessControl.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; interface IERC721Mintable is IERC721, IAccessControl { function mint(address to, uint256 tokenId) external; function mint(address to) external; }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; pragma experimental ABIEncoderV2; import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (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`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// 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 v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
{ "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":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"NFT721Attached","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenId","type":"uint256[]"}],"name":"NFT721AttachedBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"NFT721Detached","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenId","type":"uint256[]"}],"name":"NFT721DetachedBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"feeAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"volatilityCoefficient","type":"uint256"}],"name":"NFT721FeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"}],"name":"NFT721TokenAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"}],"name":"NFT721TokenRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"components":[{"internalType":"uint256","name":"feeAmount","type":"uint256"},{"internalType":"uint256","name":"volatilityCoefficient","type":"uint256"}],"internalType":"struct INFT721Bridge.NFT721FeeInfo","name":"feeInfo","type":"tuple"}],"name":"addNFT721Token","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"attachNFT721","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"attachNFT721Batch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"detachNFT721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"detachNFT721Batch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"emergencyWithdrawNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"estimateFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"estimateFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"removeNFT721Token","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"components":[{"internalType":"uint256","name":"feeAmount","type":"uint256"},{"internalType":"uint256","name":"volatilityCoefficient","type":"uint256"}],"internalType":"struct INFT721Bridge.NFT721FeeInfo","name":"feeInfo","type":"tuple"}],"name":"updateNFT721TokenFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"settler","type":"address"}],"name":"withdrawFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b5062000032620000266200005960201b60201c565b6200006160201b60201c565b60008060146101000a81548160ff0219169083151502179055506001808190555062000125565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61343e80620001356000396000f3fe6080604052600436106100f75760003560e01c80638da5cb5b1161008a5780639ac6a71c116100595780639ac6a71c14610310578063b6b0ccbe14610339578063f2fde38b14610355578063f54867bb1461037e576100fe565b80638da5cb5b1461026a5780638f467cf714610295578063922b8079146102be578063990e4320146102e7576100fe565b806357463d35116100c657806357463d35146101cf5780635c975abb1461020c578063715018a6146102375780638d08161b1461024e576100fe565b80631099cc3f14610103578063150b7a021461012c57806317e33f15146101695780631ac3ddeb146101a6576100fe565b366100fe57005b600080fd5b34801561010f57600080fd5b5061012a600480360381019061012591906123e9565b6103a7565b005b34801561013857600080fd5b50610153600480360381019061014e919061249f565b61056f565b6040516101609190612aff565b60405180910390f35b34801561017557600080fd5b50610190600480360381019061018b91906125af565b6107bb565b60405161019d9190612cfa565b60405180910390f35b3480156101b257600080fd5b506101cd60048036038101906101c89190612397565b6107e0565b005b3480156101db57600080fd5b506101f660048036038101906101f19190612397565b6108a6565b6040516102039190612cfa565b60405180910390f35b34801561021857600080fd5b506102216109a1565b60405161022e9190612ae4565b60405180910390f35b34801561024357600080fd5b5061024c6109b7565b005b610268600480360381019061026391906125af565b610a3f565b005b34801561027657600080fd5b5061027f610b77565b60405161028c91906129c4565b60405180910390f35b3480156102a157600080fd5b506102bc60048036038101906102b79190612573565b610ba0565b005b3480156102ca57600080fd5b506102e560048036038101906102e091906125af565b610dbe565b005b3480156102f357600080fd5b5061030e60048036038101906103099190612450565b610ead565b005b34801561031c57600080fd5b5061033760048036038101906103329190612397565b610fd1565b005b610353600480360381019061034e919061251f565b61143d565b005b34801561036157600080fd5b5061037c60048036038101906103779190612397565b61161b565b005b34801561038a57600080fd5b506103a560048036038101906103a09190612573565b611713565b005b6103af61188a565b73ffffffffffffffffffffffffffffffffffffffff166103cd610b77565b73ffffffffffffffffffffffffffffffffffffffff1614610423576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161041a90612c1a565b60405180910390fd5b61042b6109a1565b1561046b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046290612bba565b60405180910390fd5b60008151116104af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104a690612b1a565b60405180910390fd5b60005b81518110156105195761050684848484815181106104f9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151611892565b808061051190612fea565b9150506104b2565b508273ffffffffffffffffffffffffffffffffffffffff167f8a6500bec72a690a7fab81bf2e5d84103a03044d0296beaccc9b9e692d8d2e468383604051610562929190612a8b565b60405180910390a2505050565b600061057a33611b3e565b6105b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b090612b7a565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16636352211e866040518263ffffffff1660e01b81526004016106099190612cfa565b60206040518083038186803b15801561062157600080fd5b505afa158015610635573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065991906123c0565b73ffffffffffffffffffffffffffffffffffffffff16146106af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a690612bfa565b60405180910390fd5b60006106b9611c0f565b33866040516020016106cd93929190612987565b60405160208183030381529060405280519060200120905083836040516106f592919061296e565b6040518091039020811461073e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073590612c3a565b60405180910390fd5b6001600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff02191690831515021790555063150b7a0260e01b91505095945050505050565b60006107d8826107ca856108a6565b611c1c90919063ffffffff16565b905092915050565b6107e861188a565b73ffffffffffffffffffffffffffffffffffffffff16610806610b77565b73ffffffffffffffffffffffffffffffffffffffff161461085c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085390612c1a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156108a2573d6000803e3d6000fd5b5050565b60006108b182611b3e565b6108f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e790612b7a565b60405180910390fd5b61099a606461098c600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154611c1c90919063ffffffff16565b611c3290919063ffffffff16565b9050919050565b60008060149054906101000a900460ff16905090565b6109bf61188a565b73ffffffffffffffffffffffffffffffffffffffff166109dd610b77565b73ffffffffffffffffffffffffffffffffffffffff1614610a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2a90612c1a565b60405180910390fd5b610a3d6000611c48565b565b610a476109a1565b15610a87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7e90612bba565b60405180910390fd5b610a90826108a6565b341015610ad2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac990612c9a565b60405180910390fd5b610adc8282611d0c565b3073ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015610b22573d6000803e3d6000fd5b508173ffffffffffffffffffffffffffffffffffffffff167f237187d2bb327fb301618788d930fa914547799ca8b7de043ed1b147fc64fdbe3383604051610b6b929190612abb565b60405180910390a25050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610ba861188a565b73ffffffffffffffffffffffffffffffffffffffff16610bc6610b77565b73ffffffffffffffffffffffffffffffffffffffff1614610c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1390612c1a565b60405180910390fd5b610c2582611b3e565b15610c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5c90612b9a565b60405180910390fd5b6002829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101559050508173ffffffffffffffffffffffffffffffffffffffff167fba95e5a8fd18aca9a5b92d15b4c30328e6eda8be3b37e91def097f8444ebbb4f60405160405180910390a28173ffffffffffffffffffffffffffffffffffffffff167fc14a5d12ab07a2acb35052d83388f0a09b1b31bb7e386fef1c72c5aa9981bd8b82600001518360200151604051610db2929190612d15565b60405180910390a25050565b610dc661188a565b73ffffffffffffffffffffffffffffffffffffffff16610de4610b77565b73ffffffffffffffffffffffffffffffffffffffff1614610e3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3190612c1a565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166323b872dd3033846040518463ffffffff1660e01b8152600401610e7793929190612a08565b600060405180830381600087803b158015610e9157600080fd5b505af1158015610ea5573d6000803e3d6000fd5b505050505050565b610eb561188a565b73ffffffffffffffffffffffffffffffffffffffff16610ed3610b77565b73ffffffffffffffffffffffffffffffffffffffff1614610f29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2090612c1a565b60405180910390fd5b610f316109a1565b15610f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6890612bba565b60405180910390fd5b610f7c838383611892565b8273ffffffffffffffffffffffffffffffffffffffff167f355d25f84f77446c5dc68aedd67be6fb6c15ff6ce450dae6b8b0742d72d3da1d8383604051610fc4929190612abb565b60405180910390a2505050565b610fd961188a565b73ffffffffffffffffffffffffffffffffffffffff16610ff7610b77565b73ffffffffffffffffffffffffffffffffffffffff161461104d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104490612c1a565b60405180910390fd5b61105681611b3e565b611095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108c90612b7a565b60405180910390fd5b6000805b6002805490508160ff16101561115b578273ffffffffffffffffffffffffffffffffffffffff1660028260ff16815481106110fd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611148578091505b808061115390613033565b915050611099565b50600060016002805490506111709190612ec2565b67ffffffffffffffff8111156111af577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156111dd5781602001602082028036833780820191505090505b50905060005b81518160ff1610156113de578260ff168160ff1610156112e05760028160ff168154811061123a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828260ff16815181106112a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506113cb565b60026001826112ef9190612e00565b60ff1681548110611329577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828260ff1681518110611390577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b80806113d690613033565b9150506111e3565b5080600290805190602001906113f5929190612170565b508273ffffffffffffffffffffffffffffffffffffffff167ea37785dd472d6621420c61e410a1df457dbb6d329c468e40983815643f303b60405160405180910390a2505050565b6114456109a1565b15611485576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147c90612bba565b60405180910390fd5b6114908282516107bb565b3410156114d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c990612c9a565b60405180910390fd5b6000815111611516576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150d90612b1a565b60405180910390fd5b60005b815181101561157f5761156c8383838151811061155f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151611d0c565b808061157790612fea565b915050611519565b503073ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156115c6573d6000803e3d6000fd5b508173ffffffffffffffffffffffffffffffffffffffff167fa52303d63b093352b3248202031b524f590fb47499a6be83ce4f3b430075c548338360405161160f929190612a8b565b60405180910390a25050565b61162361188a565b73ffffffffffffffffffffffffffffffffffffffff16611641610b77565b73ffffffffffffffffffffffffffffffffffffffff1614611697576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168e90612c1a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fe90612b5a565b60405180910390fd5b61171081611c48565b50565b61171b61188a565b73ffffffffffffffffffffffffffffffffffffffff16611739610b77565b73ffffffffffffffffffffffffffffffffffffffff161461178f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178690612c1a565b60405180910390fd5b61179882611b3e565b6117d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ce90612b7a565b60405180910390fd5b80600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101559050508173ffffffffffffffffffffffffffffffffffffffff167fc14a5d12ab07a2acb35052d83388f0a09b1b31bb7e386fef1c72c5aa9981bd8b8260000151836020015160405161187e929190612d15565b60405180910390a25050565b600033905090565b600260015414156118d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cf90612cda565b60405180910390fd5b60026001819055506118e983611b3e565b611928576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191f90612cba565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff16636352211e826040518263ffffffff1660e01b81526004016119619190612cfa565b60206040518083038186803b15801561197957600080fd5b505afa9250505080156119aa57506040513d601f19601f820116820180604052508101906119a791906123c0565b60015b611a53573d80600081146119da576040519150601f19603f3d011682016040523d82523d6000602084013e6119df565b606091505b508373ffffffffffffffffffffffffffffffffffffffff166340c10f1984846040518363ffffffff1660e01b8152600401611a1b929190612abb565b600060405180830381600087803b158015611a3557600080fd5b505af1158015611a49573d6000803e3d6000fd5b5050505050611b32565b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611ac1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab890612bda565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff166342842e0e3085856040518463ffffffff1660e01b8152600401611afe93929190612a08565b600060405180830381600087803b158015611b1857600080fd5b505af1158015611b2c573d6000803e3d6000fd5b50505050505b60018081905550505050565b600080600090505b6002805490508160ff161015611c09578273ffffffffffffffffffffffffffffffffffffffff1660028260ff1681548110611baa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611bf657600191505b8080611c0190613033565b915050611b46565b50919050565b6000804690508091505090565b60008183611c2a9190612e68565b905092915050565b60008183611c409190612e37565b905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60026001541415611d52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4990612cda565b60405180910390fd5b6002600181905550611d6382611b3e565b611da2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9990612cba565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b8152600401611ddd9291906129df565b60206040518083038186803b158015611df557600080fd5b505afa158015611e09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2d91906125eb565b80611eeb57503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1663081812fc836040518263ffffffff1660e01b8152600401611e839190612cfa565b60206040518083038186803b158015611e9b57600080fd5b505afa158015611eaf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ed391906123c0565b73ffffffffffffffffffffffffffffffffffffffff16145b611f2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2190612c5a565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401611f7a9190612cfa565b60206040518083038186803b158015611f9257600080fd5b505afa158015611fa6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fca91906123c0565b73ffffffffffffffffffffffffffffffffffffffff1614612020576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201790612b3a565b60405180910390fd5b600061202a611c0f565b838360405160200161203e93929190612987565b60405160208183030381529060405290508273ffffffffffffffffffffffffffffffffffffffff1663b88d4fde333085856040518563ffffffff1660e01b815260040161208e9493929190612a3f565b600060405180830381600087803b1580156120a857600080fd5b505af11580156120bc573d6000803e3d6000fd5b50505050600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008280519060200120815260200190815260200160002060009054906101000a900460ff16612164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215b90612c7a565b60405180910390fd5b50600180819055505050565b8280548282559060005260206000209081019282156121e9579160200282015b828111156121e85782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190612190565b5b5090506121f691906121fa565b5090565b5b808211156122135760008160009055506001016121fb565b5090565b600061222a61222584612d63565b612d3e565b9050808382526020820190508285602086028201111561224957600080fd5b60005b85811015612279578161225f8882612382565b84526020840193506020830192505060018101905061224c565b5050509392505050565b600081359050612292816133c3565b92915050565b6000815190506122a7816133c3565b92915050565b600082601f8301126122be57600080fd5b81356122ce848260208601612217565b91505092915050565b6000815190506122e6816133da565b92915050565b60008083601f8401126122fe57600080fd5b8235905067ffffffffffffffff81111561231757600080fd5b60208301915083600182028301111561232f57600080fd5b9250929050565b60006040828403121561234857600080fd5b6123526040612d3e565b9050600061236284828501612382565b600083015250602061237684828501612382565b60208301525092915050565b600081359050612391816133f1565b92915050565b6000602082840312156123a957600080fd5b60006123b784828501612283565b91505092915050565b6000602082840312156123d257600080fd5b60006123e084828501612298565b91505092915050565b6000806000606084860312156123fe57600080fd5b600061240c86828701612283565b935050602061241d86828701612283565b925050604084013567ffffffffffffffff81111561243a57600080fd5b612446868287016122ad565b9150509250925092565b60008060006060848603121561246557600080fd5b600061247386828701612283565b935050602061248486828701612283565b925050604061249586828701612382565b9150509250925092565b6000806000806000608086880312156124b757600080fd5b60006124c588828901612283565b95505060206124d688828901612283565b94505060406124e788828901612382565b935050606086013567ffffffffffffffff81111561250457600080fd5b612510888289016122ec565b92509250509295509295909350565b6000806040838503121561253257600080fd5b600061254085828601612283565b925050602083013567ffffffffffffffff81111561255d57600080fd5b612569858286016122ad565b9150509250929050565b6000806060838503121561258657600080fd5b600061259485828601612283565b92505060206125a585828601612336565b9150509250929050565b600080604083850312156125c257600080fd5b60006125d085828601612283565b92505060206125e185828601612382565b9150509250929050565b6000602082840312156125fd57600080fd5b600061260b848285016122d7565b91505092915050565b60006126208383612939565b60208301905092915050565b61263581612ef6565b82525050565b61264c61264782612ef6565b61305d565b82525050565b600061265d82612d9f565b6126678185612dc2565b935061267283612d8f565b8060005b838110156126a357815161268a8882612614565b975061269583612db5565b925050600181019050612676565b5085935050505092915050565b6126b981612f08565b82525050565b6126c881612f14565b82525050565b60006126da8385612de4565b93506126e7838584612f77565b82840190509392505050565b60006126fe82612daa565b6127088185612dd3565b9350612718818560208601612f86565b61272181613118565b840191505092915050565b6000612739601783612def565b915061274482613136565b602082019050919050565b600061275c601b83612def565b91506127678261315f565b602082019050919050565b600061277f602683612def565b915061278a82613188565b604082019050919050565b60006127a2601483612def565b91506127ad826131d7565b602082019050919050565b60006127c5601083612def565b91506127d082613200565b602082019050919050565b60006127e8601083612def565b91506127f382613229565b602082019050919050565b600061280b601a83612def565b915061281682613252565b602082019050919050565b600061282e601283612def565b91506128398261327b565b602082019050919050565b6000612851602083612def565b915061285c826132a4565b602082019050919050565b6000612874601c83612def565b915061287f826132cd565b602082019050919050565b6000612897601483612def565b91506128a2826132f6565b602082019050919050565b60006128ba601b83612def565b91506128c58261331f565b602082019050919050565b60006128dd600e83612def565b91506128e882613348565b602082019050919050565b6000612900601d83612def565b915061290b82613371565b602082019050919050565b6000612923601f83612def565b915061292e8261339a565b602082019050919050565b61294281612f60565b82525050565b61295181612f60565b82525050565b61296861296382612f60565b613081565b82525050565b600061297b8284866126ce565b91508190509392505050565b60006129938286612957565b6020820191506129a3828561263b565b6014820191506129b38284612957565b602082019150819050949350505050565b60006020820190506129d9600083018461262c565b92915050565b60006040820190506129f4600083018561262c565b612a01602083018461262c565b9392505050565b6000606082019050612a1d600083018661262c565b612a2a602083018561262c565b612a376040830184612948565b949350505050565b6000608082019050612a54600083018761262c565b612a61602083018661262c565b612a6e6040830185612948565b8181036060830152612a8081846126f3565b905095945050505050565b6000604082019050612aa0600083018561262c565b8181036020830152612ab28184612652565b90509392505050565b6000604082019050612ad0600083018561262c565b612add6020830184612948565b9392505050565b6000602082019050612af960008301846126b0565b92915050565b6000602082019050612b1460008301846126bf565b92915050565b60006020820190508181036000830152612b338161272c565b9050919050565b60006020820190508181036000830152612b538161274f565b9050919050565b60006020820190508181036000830152612b7381612772565b9050919050565b60006020820190508181036000830152612b9381612795565b9050919050565b60006020820190508181036000830152612bb3816127b8565b9050919050565b60006020820190508181036000830152612bd3816127db565b9050919050565b60006020820190508181036000830152612bf3816127fe565b9050919050565b60006020820190508181036000830152612c1381612821565b9050919050565b60006020820190508181036000830152612c3381612844565b9050919050565b60006020820190508181036000830152612c5381612867565b9050919050565b60006020820190508181036000830152612c738161288a565b9050919050565b60006020820190508181036000830152612c93816128ad565b9050919050565b60006020820190508181036000830152612cb3816128d0565b9050919050565b60006020820190508181036000830152612cd3816128f3565b9050919050565b60006020820190508181036000830152612cf381612916565b9050919050565b6000602082019050612d0f6000830184612948565b92915050565b6000604082019050612d2a6000830185612948565b612d376020830184612948565b9392505050565b6000612d48612d59565b9050612d548282612fb9565b919050565b6000604051905090565b600067ffffffffffffffff821115612d7e57612d7d6130e9565b5b602082029050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000612e0b82612f6a565b9150612e1683612f6a565b92508260ff03821115612e2c57612e2b61308b565b5b828201905092915050565b6000612e4282612f60565b9150612e4d83612f60565b925082612e5d57612e5c6130ba565b5b828204905092915050565b6000612e7382612f60565b9150612e7e83612f60565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612eb757612eb661308b565b5b828202905092915050565b6000612ecd82612f60565b9150612ed883612f60565b925082821015612eeb57612eea61308b565b5b828203905092915050565b6000612f0182612f40565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015612fa4578082015181840152602081019050612f89565b83811115612fb3576000848401525b50505050565b612fc282613118565b810181811067ffffffffffffffff82111715612fe157612fe06130e9565b5b80604052505050565b6000612ff582612f60565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156130285761302761308b565b5b600182019050919050565b600061303e82612f6a565b915060ff8214156130525761305161308b565b5b600182019050919050565b60006130688261306f565b9050919050565b600061307a82613129565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f73686f756c642070726f7669646520746f6b656e496473000000000000000000600082015250565b7f73656e6465722073686f756c64206f776e2074686520746f6b656e0000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f746f6b656e206e6f742072656769737465726564000000000000000000000000600082015250565b7f746f6b656e207265676973746572656400000000000000000000000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f7661756c742073686f756c64206f776e2074686520746f6b656e000000000000600082015250565b7f746f6b656e206e6f742072656365697665640000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f746f6b656e207369672073686f756c64206265207468652073616d6500000000600082015250565b7f73686f756c6420617070726f7665206669727374000000000000000000000000600082015250565b7f6e66742061747461636820696e207661756c74206661696c7572650000000000600082015250565b7f6e6f7420656e6f75676820666565000000000000000000000000000000000000600082015250565b7f746f6b656e20636f6e7472616374206e6f742072656769737465726564000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6133cc81612ef6565b81146133d757600080fd5b50565b6133e381612f08565b81146133ee57600080fd5b50565b6133fa81612f60565b811461340557600080fd5b5056fea26469706673582212200bb9758fe34e077b002928acdabe94f607598f4e576682ae1deebb98c52cc9a964736f6c63430008040033
Deployed Bytecode
0x6080604052600436106100f75760003560e01c80638da5cb5b1161008a5780639ac6a71c116100595780639ac6a71c14610310578063b6b0ccbe14610339578063f2fde38b14610355578063f54867bb1461037e576100fe565b80638da5cb5b1461026a5780638f467cf714610295578063922b8079146102be578063990e4320146102e7576100fe565b806357463d35116100c657806357463d35146101cf5780635c975abb1461020c578063715018a6146102375780638d08161b1461024e576100fe565b80631099cc3f14610103578063150b7a021461012c57806317e33f15146101695780631ac3ddeb146101a6576100fe565b366100fe57005b600080fd5b34801561010f57600080fd5b5061012a600480360381019061012591906123e9565b6103a7565b005b34801561013857600080fd5b50610153600480360381019061014e919061249f565b61056f565b6040516101609190612aff565b60405180910390f35b34801561017557600080fd5b50610190600480360381019061018b91906125af565b6107bb565b60405161019d9190612cfa565b60405180910390f35b3480156101b257600080fd5b506101cd60048036038101906101c89190612397565b6107e0565b005b3480156101db57600080fd5b506101f660048036038101906101f19190612397565b6108a6565b6040516102039190612cfa565b60405180910390f35b34801561021857600080fd5b506102216109a1565b60405161022e9190612ae4565b60405180910390f35b34801561024357600080fd5b5061024c6109b7565b005b610268600480360381019061026391906125af565b610a3f565b005b34801561027657600080fd5b5061027f610b77565b60405161028c91906129c4565b60405180910390f35b3480156102a157600080fd5b506102bc60048036038101906102b79190612573565b610ba0565b005b3480156102ca57600080fd5b506102e560048036038101906102e091906125af565b610dbe565b005b3480156102f357600080fd5b5061030e60048036038101906103099190612450565b610ead565b005b34801561031c57600080fd5b5061033760048036038101906103329190612397565b610fd1565b005b610353600480360381019061034e919061251f565b61143d565b005b34801561036157600080fd5b5061037c60048036038101906103779190612397565b61161b565b005b34801561038a57600080fd5b506103a560048036038101906103a09190612573565b611713565b005b6103af61188a565b73ffffffffffffffffffffffffffffffffffffffff166103cd610b77565b73ffffffffffffffffffffffffffffffffffffffff1614610423576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161041a90612c1a565b60405180910390fd5b61042b6109a1565b1561046b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046290612bba565b60405180910390fd5b60008151116104af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104a690612b1a565b60405180910390fd5b60005b81518110156105195761050684848484815181106104f9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151611892565b808061051190612fea565b9150506104b2565b508273ffffffffffffffffffffffffffffffffffffffff167f8a6500bec72a690a7fab81bf2e5d84103a03044d0296beaccc9b9e692d8d2e468383604051610562929190612a8b565b60405180910390a2505050565b600061057a33611b3e565b6105b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b090612b7a565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16636352211e866040518263ffffffff1660e01b81526004016106099190612cfa565b60206040518083038186803b15801561062157600080fd5b505afa158015610635573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065991906123c0565b73ffffffffffffffffffffffffffffffffffffffff16146106af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a690612bfa565b60405180910390fd5b60006106b9611c0f565b33866040516020016106cd93929190612987565b60405160208183030381529060405280519060200120905083836040516106f592919061296e565b6040518091039020811461073e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073590612c3a565b60405180910390fd5b6001600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff02191690831515021790555063150b7a0260e01b91505095945050505050565b60006107d8826107ca856108a6565b611c1c90919063ffffffff16565b905092915050565b6107e861188a565b73ffffffffffffffffffffffffffffffffffffffff16610806610b77565b73ffffffffffffffffffffffffffffffffffffffff161461085c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085390612c1a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156108a2573d6000803e3d6000fd5b5050565b60006108b182611b3e565b6108f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e790612b7a565b60405180910390fd5b61099a606461098c600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154611c1c90919063ffffffff16565b611c3290919063ffffffff16565b9050919050565b60008060149054906101000a900460ff16905090565b6109bf61188a565b73ffffffffffffffffffffffffffffffffffffffff166109dd610b77565b73ffffffffffffffffffffffffffffffffffffffff1614610a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2a90612c1a565b60405180910390fd5b610a3d6000611c48565b565b610a476109a1565b15610a87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7e90612bba565b60405180910390fd5b610a90826108a6565b341015610ad2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac990612c9a565b60405180910390fd5b610adc8282611d0c565b3073ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015610b22573d6000803e3d6000fd5b508173ffffffffffffffffffffffffffffffffffffffff167f237187d2bb327fb301618788d930fa914547799ca8b7de043ed1b147fc64fdbe3383604051610b6b929190612abb565b60405180910390a25050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610ba861188a565b73ffffffffffffffffffffffffffffffffffffffff16610bc6610b77565b73ffffffffffffffffffffffffffffffffffffffff1614610c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1390612c1a565b60405180910390fd5b610c2582611b3e565b15610c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5c90612b9a565b60405180910390fd5b6002829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101559050508173ffffffffffffffffffffffffffffffffffffffff167fba95e5a8fd18aca9a5b92d15b4c30328e6eda8be3b37e91def097f8444ebbb4f60405160405180910390a28173ffffffffffffffffffffffffffffffffffffffff167fc14a5d12ab07a2acb35052d83388f0a09b1b31bb7e386fef1c72c5aa9981bd8b82600001518360200151604051610db2929190612d15565b60405180910390a25050565b610dc661188a565b73ffffffffffffffffffffffffffffffffffffffff16610de4610b77565b73ffffffffffffffffffffffffffffffffffffffff1614610e3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3190612c1a565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166323b872dd3033846040518463ffffffff1660e01b8152600401610e7793929190612a08565b600060405180830381600087803b158015610e9157600080fd5b505af1158015610ea5573d6000803e3d6000fd5b505050505050565b610eb561188a565b73ffffffffffffffffffffffffffffffffffffffff16610ed3610b77565b73ffffffffffffffffffffffffffffffffffffffff1614610f29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2090612c1a565b60405180910390fd5b610f316109a1565b15610f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6890612bba565b60405180910390fd5b610f7c838383611892565b8273ffffffffffffffffffffffffffffffffffffffff167f355d25f84f77446c5dc68aedd67be6fb6c15ff6ce450dae6b8b0742d72d3da1d8383604051610fc4929190612abb565b60405180910390a2505050565b610fd961188a565b73ffffffffffffffffffffffffffffffffffffffff16610ff7610b77565b73ffffffffffffffffffffffffffffffffffffffff161461104d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104490612c1a565b60405180910390fd5b61105681611b3e565b611095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108c90612b7a565b60405180910390fd5b6000805b6002805490508160ff16101561115b578273ffffffffffffffffffffffffffffffffffffffff1660028260ff16815481106110fd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611148578091505b808061115390613033565b915050611099565b50600060016002805490506111709190612ec2565b67ffffffffffffffff8111156111af577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156111dd5781602001602082028036833780820191505090505b50905060005b81518160ff1610156113de578260ff168160ff1610156112e05760028160ff168154811061123a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828260ff16815181106112a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506113cb565b60026001826112ef9190612e00565b60ff1681548110611329577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828260ff1681518110611390577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b80806113d690613033565b9150506111e3565b5080600290805190602001906113f5929190612170565b508273ffffffffffffffffffffffffffffffffffffffff167ea37785dd472d6621420c61e410a1df457dbb6d329c468e40983815643f303b60405160405180910390a2505050565b6114456109a1565b15611485576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147c90612bba565b60405180910390fd5b6114908282516107bb565b3410156114d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c990612c9a565b60405180910390fd5b6000815111611516576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150d90612b1a565b60405180910390fd5b60005b815181101561157f5761156c8383838151811061155f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151611d0c565b808061157790612fea565b915050611519565b503073ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156115c6573d6000803e3d6000fd5b508173ffffffffffffffffffffffffffffffffffffffff167fa52303d63b093352b3248202031b524f590fb47499a6be83ce4f3b430075c548338360405161160f929190612a8b565b60405180910390a25050565b61162361188a565b73ffffffffffffffffffffffffffffffffffffffff16611641610b77565b73ffffffffffffffffffffffffffffffffffffffff1614611697576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168e90612c1a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fe90612b5a565b60405180910390fd5b61171081611c48565b50565b61171b61188a565b73ffffffffffffffffffffffffffffffffffffffff16611739610b77565b73ffffffffffffffffffffffffffffffffffffffff161461178f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178690612c1a565b60405180910390fd5b61179882611b3e565b6117d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ce90612b7a565b60405180910390fd5b80600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101559050508173ffffffffffffffffffffffffffffffffffffffff167fc14a5d12ab07a2acb35052d83388f0a09b1b31bb7e386fef1c72c5aa9981bd8b8260000151836020015160405161187e929190612d15565b60405180910390a25050565b600033905090565b600260015414156118d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cf90612cda565b60405180910390fd5b60026001819055506118e983611b3e565b611928576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191f90612cba565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff16636352211e826040518263ffffffff1660e01b81526004016119619190612cfa565b60206040518083038186803b15801561197957600080fd5b505afa9250505080156119aa57506040513d601f19601f820116820180604052508101906119a791906123c0565b60015b611a53573d80600081146119da576040519150601f19603f3d011682016040523d82523d6000602084013e6119df565b606091505b508373ffffffffffffffffffffffffffffffffffffffff166340c10f1984846040518363ffffffff1660e01b8152600401611a1b929190612abb565b600060405180830381600087803b158015611a3557600080fd5b505af1158015611a49573d6000803e3d6000fd5b5050505050611b32565b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611ac1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab890612bda565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff166342842e0e3085856040518463ffffffff1660e01b8152600401611afe93929190612a08565b600060405180830381600087803b158015611b1857600080fd5b505af1158015611b2c573d6000803e3d6000fd5b50505050505b60018081905550505050565b600080600090505b6002805490508160ff161015611c09578273ffffffffffffffffffffffffffffffffffffffff1660028260ff1681548110611baa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611bf657600191505b8080611c0190613033565b915050611b46565b50919050565b6000804690508091505090565b60008183611c2a9190612e68565b905092915050565b60008183611c409190612e37565b905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60026001541415611d52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4990612cda565b60405180910390fd5b6002600181905550611d6382611b3e565b611da2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9990612cba565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b8152600401611ddd9291906129df565b60206040518083038186803b158015611df557600080fd5b505afa158015611e09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2d91906125eb565b80611eeb57503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1663081812fc836040518263ffffffff1660e01b8152600401611e839190612cfa565b60206040518083038186803b158015611e9b57600080fd5b505afa158015611eaf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ed391906123c0565b73ffffffffffffffffffffffffffffffffffffffff16145b611f2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2190612c5a565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401611f7a9190612cfa565b60206040518083038186803b158015611f9257600080fd5b505afa158015611fa6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fca91906123c0565b73ffffffffffffffffffffffffffffffffffffffff1614612020576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201790612b3a565b60405180910390fd5b600061202a611c0f565b838360405160200161203e93929190612987565b60405160208183030381529060405290508273ffffffffffffffffffffffffffffffffffffffff1663b88d4fde333085856040518563ffffffff1660e01b815260040161208e9493929190612a3f565b600060405180830381600087803b1580156120a857600080fd5b505af11580156120bc573d6000803e3d6000fd5b50505050600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008280519060200120815260200190815260200160002060009054906101000a900460ff16612164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215b90612c7a565b60405180910390fd5b50600180819055505050565b8280548282559060005260206000209081019282156121e9579160200282015b828111156121e85782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190612190565b5b5090506121f691906121fa565b5090565b5b808211156122135760008160009055506001016121fb565b5090565b600061222a61222584612d63565b612d3e565b9050808382526020820190508285602086028201111561224957600080fd5b60005b85811015612279578161225f8882612382565b84526020840193506020830192505060018101905061224c565b5050509392505050565b600081359050612292816133c3565b92915050565b6000815190506122a7816133c3565b92915050565b600082601f8301126122be57600080fd5b81356122ce848260208601612217565b91505092915050565b6000815190506122e6816133da565b92915050565b60008083601f8401126122fe57600080fd5b8235905067ffffffffffffffff81111561231757600080fd5b60208301915083600182028301111561232f57600080fd5b9250929050565b60006040828403121561234857600080fd5b6123526040612d3e565b9050600061236284828501612382565b600083015250602061237684828501612382565b60208301525092915050565b600081359050612391816133f1565b92915050565b6000602082840312156123a957600080fd5b60006123b784828501612283565b91505092915050565b6000602082840312156123d257600080fd5b60006123e084828501612298565b91505092915050565b6000806000606084860312156123fe57600080fd5b600061240c86828701612283565b935050602061241d86828701612283565b925050604084013567ffffffffffffffff81111561243a57600080fd5b612446868287016122ad565b9150509250925092565b60008060006060848603121561246557600080fd5b600061247386828701612283565b935050602061248486828701612283565b925050604061249586828701612382565b9150509250925092565b6000806000806000608086880312156124b757600080fd5b60006124c588828901612283565b95505060206124d688828901612283565b94505060406124e788828901612382565b935050606086013567ffffffffffffffff81111561250457600080fd5b612510888289016122ec565b92509250509295509295909350565b6000806040838503121561253257600080fd5b600061254085828601612283565b925050602083013567ffffffffffffffff81111561255d57600080fd5b612569858286016122ad565b9150509250929050565b6000806060838503121561258657600080fd5b600061259485828601612283565b92505060206125a585828601612336565b9150509250929050565b600080604083850312156125c257600080fd5b60006125d085828601612283565b92505060206125e185828601612382565b9150509250929050565b6000602082840312156125fd57600080fd5b600061260b848285016122d7565b91505092915050565b60006126208383612939565b60208301905092915050565b61263581612ef6565b82525050565b61264c61264782612ef6565b61305d565b82525050565b600061265d82612d9f565b6126678185612dc2565b935061267283612d8f565b8060005b838110156126a357815161268a8882612614565b975061269583612db5565b925050600181019050612676565b5085935050505092915050565b6126b981612f08565b82525050565b6126c881612f14565b82525050565b60006126da8385612de4565b93506126e7838584612f77565b82840190509392505050565b60006126fe82612daa565b6127088185612dd3565b9350612718818560208601612f86565b61272181613118565b840191505092915050565b6000612739601783612def565b915061274482613136565b602082019050919050565b600061275c601b83612def565b91506127678261315f565b602082019050919050565b600061277f602683612def565b915061278a82613188565b604082019050919050565b60006127a2601483612def565b91506127ad826131d7565b602082019050919050565b60006127c5601083612def565b91506127d082613200565b602082019050919050565b60006127e8601083612def565b91506127f382613229565b602082019050919050565b600061280b601a83612def565b915061281682613252565b602082019050919050565b600061282e601283612def565b91506128398261327b565b602082019050919050565b6000612851602083612def565b915061285c826132a4565b602082019050919050565b6000612874601c83612def565b915061287f826132cd565b602082019050919050565b6000612897601483612def565b91506128a2826132f6565b602082019050919050565b60006128ba601b83612def565b91506128c58261331f565b602082019050919050565b60006128dd600e83612def565b91506128e882613348565b602082019050919050565b6000612900601d83612def565b915061290b82613371565b602082019050919050565b6000612923601f83612def565b915061292e8261339a565b602082019050919050565b61294281612f60565b82525050565b61295181612f60565b82525050565b61296861296382612f60565b613081565b82525050565b600061297b8284866126ce565b91508190509392505050565b60006129938286612957565b6020820191506129a3828561263b565b6014820191506129b38284612957565b602082019150819050949350505050565b60006020820190506129d9600083018461262c565b92915050565b60006040820190506129f4600083018561262c565b612a01602083018461262c565b9392505050565b6000606082019050612a1d600083018661262c565b612a2a602083018561262c565b612a376040830184612948565b949350505050565b6000608082019050612a54600083018761262c565b612a61602083018661262c565b612a6e6040830185612948565b8181036060830152612a8081846126f3565b905095945050505050565b6000604082019050612aa0600083018561262c565b8181036020830152612ab28184612652565b90509392505050565b6000604082019050612ad0600083018561262c565b612add6020830184612948565b9392505050565b6000602082019050612af960008301846126b0565b92915050565b6000602082019050612b1460008301846126bf565b92915050565b60006020820190508181036000830152612b338161272c565b9050919050565b60006020820190508181036000830152612b538161274f565b9050919050565b60006020820190508181036000830152612b7381612772565b9050919050565b60006020820190508181036000830152612b9381612795565b9050919050565b60006020820190508181036000830152612bb3816127b8565b9050919050565b60006020820190508181036000830152612bd3816127db565b9050919050565b60006020820190508181036000830152612bf3816127fe565b9050919050565b60006020820190508181036000830152612c1381612821565b9050919050565b60006020820190508181036000830152612c3381612844565b9050919050565b60006020820190508181036000830152612c5381612867565b9050919050565b60006020820190508181036000830152612c738161288a565b9050919050565b60006020820190508181036000830152612c93816128ad565b9050919050565b60006020820190508181036000830152612cb3816128d0565b9050919050565b60006020820190508181036000830152612cd3816128f3565b9050919050565b60006020820190508181036000830152612cf381612916565b9050919050565b6000602082019050612d0f6000830184612948565b92915050565b6000604082019050612d2a6000830185612948565b612d376020830184612948565b9392505050565b6000612d48612d59565b9050612d548282612fb9565b919050565b6000604051905090565b600067ffffffffffffffff821115612d7e57612d7d6130e9565b5b602082029050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000612e0b82612f6a565b9150612e1683612f6a565b92508260ff03821115612e2c57612e2b61308b565b5b828201905092915050565b6000612e4282612f60565b9150612e4d83612f60565b925082612e5d57612e5c6130ba565b5b828204905092915050565b6000612e7382612f60565b9150612e7e83612f60565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612eb757612eb661308b565b5b828202905092915050565b6000612ecd82612f60565b9150612ed883612f60565b925082821015612eeb57612eea61308b565b5b828203905092915050565b6000612f0182612f40565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015612fa4578082015181840152602081019050612f89565b83811115612fb3576000848401525b50505050565b612fc282613118565b810181811067ffffffffffffffff82111715612fe157612fe06130e9565b5b80604052505050565b6000612ff582612f60565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156130285761302761308b565b5b600182019050919050565b600061303e82612f6a565b915060ff8214156130525761305161308b565b5b600182019050919050565b60006130688261306f565b9050919050565b600061307a82613129565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f73686f756c642070726f7669646520746f6b656e496473000000000000000000600082015250565b7f73656e6465722073686f756c64206f776e2074686520746f6b656e0000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f746f6b656e206e6f742072656769737465726564000000000000000000000000600082015250565b7f746f6b656e207265676973746572656400000000000000000000000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f7661756c742073686f756c64206f776e2074686520746f6b656e000000000000600082015250565b7f746f6b656e206e6f742072656365697665640000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f746f6b656e207369672073686f756c64206265207468652073616d6500000000600082015250565b7f73686f756c6420617070726f7665206669727374000000000000000000000000600082015250565b7f6e66742061747461636820696e207661756c74206661696c7572650000000000600082015250565b7f6e6f7420656e6f75676820666565000000000000000000000000000000000000600082015250565b7f746f6b656e20636f6e7472616374206e6f742072656769737465726564000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6133cc81612ef6565b81146133d757600080fd5b50565b6133e381612f08565b81146133ee57600080fd5b50565b6133fa81612f60565b811461340557600080fd5b5056fea26469706673582212200bb9758fe34e077b002928acdabe94f607598f4e576682ae1deebb98c52cc9a964736f6c63430008040033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $2,490.52 | 0.00027 | $0.672439 |
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.