Contract is not verified. However, we found a verified contract with the same bytecode in Blockscout DB 0x669428d0606a060fa53c9824567ad4ba1b932fd7.
All metadata displayed below is from that contract. In order to verify current contract, click Verify & Publish button
Verify & Publish
All metadata displayed below is from that contract. In order to verify current contract, click Verify & Publish button
- Contract name:
- TransferProxy
- Optimization enabled
- true
- Compiler version
- v0.8.17+commit.8df45f5f
- Optimization runs
- 200
- Verified at
- 2024-10-19T13:01:27.600969Z
contracts/TransferProxy.sol
// SPDX-License-Identifier: UNLICENSEDpragma solidity 0.8.17;import "@openzeppelin/contracts/access/AccessControl.sol";import "./interface/ITransferProxy.sol";contract TransferProxy is AccessControl, ITransferProxy {using SafeERC20 for IERC20;event operatorChanged(address indexed from, address indexed to);event OwnershipTransferred(address indexed previousOwner,address indexed newOwner);address public owner;address public operator;constructor() {owner = msg.sender;_setupRole("ADMIN_ROLE", msg.sender);_setupRole("OPERATOR_ROLE", operator);}function changeOperator(address _operator)externalonlyRole("ADMIN_ROLE")returns (bool){require(_operator != address(0),"Operator: new operator is the zero address");_revokeRole("OPERATOR_ROLE", operator);emit operatorChanged(operator, _operator);operator = _operator;_setupRole("OPERATOR_ROLE", operator);return true;}/** change the Ownership from current owner to newOwner address@param newOwner : newOwner address */
@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol)pragma solidity ^0.8.0;import "../IERC20.sol";import "../extensions/IERC20Permit.sol";import "../../../utils/Address.sol";/*** @title SafeERC20* @dev Wrappers around ERC20 operations that throw on failure (when the token* contract returns false). Tokens that return no value (and instead revert or* throw on failure) are also supported, non-reverting calls are assumed to be* successful.* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.*/library SafeERC20 {using Address for address;/*** @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,* non-reverting calls are assumed to be successful.*/function safeTransfer(IERC20 token, address to, uint256 value) internal {_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));}/*** @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the* calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.*/function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));}/*** @dev Deprecated. This function has issues similar to the ones found in* {IERC20-approve}, and its usage is discouraged.*
contracts/interface/ILazyMint.sol
// SPDX-License-Identifier:UNLICENSEDpragma solidity 0.8.17;import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";import "@openzeppelin/contracts/interfaces/IERC20.sol";import "@openzeppelin/contracts/interfaces/IERC721.sol";interface ILazyMint {function mintAndTransfer(address from,address to,uint96 _royaltyFee) external returns(uint256 _tokenId);}
contracts/interface/ITransferProxy.sol
// SPDX-License-Identifier: UNLICENSEDpragma solidity 0.8.17;import "./ILazyMint.sol";interface ITransferProxy {function erc721safeTransferFrom(IERC721 token,address from,address to,uint256 tokenId) external;function mintAndSafe721Transfer(ILazyMint nftAddress,address from,address to,uint96 _royaltyFee) external;function erc20safeTransferFrom(IERC20 token,address from,address to,uint256 value) external;}
@openzeppelin/contracts/access/AccessControl.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (access/AccessControl.sol)pragma solidity ^0.8.0;import "./IAccessControl.sol";import "../utils/Context.sol";import "../utils/Strings.sol";import "../utils/introspection/ERC165.sol";/*** @dev Contract module that allows children to implement role-based access* control mechanisms. This is a lightweight version that doesn't allow enumerating role* members except through off-chain means by accessing the contract event logs. Some* applications may benefit from on-chain enumerability, for those cases see* {AccessControlEnumerable}.** Roles are referred to by their `bytes32` identifier. These should be exposed* in the external API and be unique. The best way to achieve this is by* using `public constant` hash digests:** ```solidity* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");* ```** Roles can be used to represent a set of permissions. To restrict access to a* function call, use {hasRole}:** ```solidity* function foo() public {* require(hasRole(MY_ROLE, msg.sender));* ...* }* ```** Roles can be granted and revoked dynamically via the {grantRole} and* {revokeRole} functions. Each role has an associated admin role, and only* accounts that have a role's admin role can call {grantRole} and {revokeRole}.** By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means* that only accounts with this role will be able to grant or revoke other
@openzeppelin/contracts/access/IAccessControl.sol
// 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);
@openzeppelin/contracts/interfaces/IERC20.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol)pragma solidity ^0.8.0;import "../token/ERC20/IERC20.sol";
@openzeppelin/contracts/interfaces/IERC721.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (interfaces/IERC721.sol)pragma solidity ^0.8.0;import "../token/ERC721/IERC721.sol";
@openzeppelin/contracts/token/ERC20/IERC20.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.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);
@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol)pragma solidity ^0.8.0;/*** @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].** Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by* presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't* need to send a transaction, and thus is not required to hold Ether at all.*/interface IERC20Permit {/*** @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,* given ``owner``'s signed approval.** IMPORTANT: The same issues {IERC20-approve} has related to transaction* ordering also apply here.** Emits an {Approval} event.** Requirements:** - `spender` cannot be the zero address.* - `deadline` must be a timestamp in the future.* - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`* over the EIP712-formatted function arguments.* - the signature must use ``owner``'s current nonce (see {nonces}).** For more information on the signature format, see the* https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP* section].*/function permit(address owner,address spender,uint256 value,uint256 deadline,uint8 v,
@openzeppelin/contracts/token/ERC721/IERC721.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.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);/**
@openzeppelin/contracts/utils/Address.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)pragma solidity ^0.8.1;/*** @dev Collection of functions related to the address type*/library Address {/*** @dev Returns true if `account` is a contract.** [IMPORTANT]* ====* It is unsafe to assume that an address for which this function returns* false is an externally-owned account (EOA) and not a contract.** Among others, `isContract` will return false for the following* types of addresses:** - an externally-owned account* - a contract in construction* - an address where a contract will be created* - an address where a contract lived, but was destroyed** Furthermore, `isContract` will also return true if the target contract within* the same transaction is already scheduled for destruction by `SELFDESTRUCT`,* which only has an effect at the end of a transaction.* ====** [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
@openzeppelin/contracts/utils/Context.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;}}
@openzeppelin/contracts/utils/Strings.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)pragma solidity ^0.8.0;import "./math/Math.sol";import "./math/SignedMath.sol";/*** @dev String operations.*/library Strings {bytes16 private constant _SYMBOLS = "0123456789abcdef";uint8 private constant _ADDRESS_LENGTH = 20;/*** @dev Converts a `uint256` to its ASCII `string` decimal representation.*/function toString(uint256 value) internal pure returns (string memory) {unchecked {uint256 length = Math.log10(value) + 1;string memory buffer = new string(length);uint256 ptr;/// @solidity memory-safe-assemblyassembly {ptr := add(buffer, add(32, length))}while (true) {ptr--;/// @solidity memory-safe-assemblyassembly {mstore8(ptr, byte(mod(value, 10), _SYMBOLS))}value /= 10;if (value == 0) break;}return buffer;}}/**
@openzeppelin/contracts/utils/introspection/ERC165.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)pragma solidity ^0.8.0;import "./IERC165.sol";/*** @dev Implementation of the {IERC165} interface.** Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check* for the additional interface id that will be supported. For example:** ```solidity* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);* }* ```** Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.*/abstract contract ERC165 is IERC165 {/*** @dev See {IERC165-supportsInterface}.*/function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {return interfaceId == type(IERC165).interfaceId;}}
@openzeppelin/contracts/utils/introspection/IERC165.sol
// 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);}
@openzeppelin/contracts/utils/math/Math.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)pragma solidity ^0.8.0;/*** @dev Standard math utilities missing in the Solidity language.*/library Math {enum Rounding {Down, // Toward negative infinityUp, // Toward infinityZero // Toward zero}/*** @dev Returns the largest of two numbers.*/function max(uint256 a, uint256 b) internal pure returns (uint256) {return a > b ? a : b;}/*** @dev Returns the smallest of two numbers.*/function min(uint256 a, uint256 b) internal pure returns (uint256) {return a < b ? a : b;}/*** @dev Returns the average of two numbers. The result is rounded towards* zero.*/function average(uint256 a, uint256 b) internal pure returns (uint256) {// (a + b) / 2 can overflow.return (a & b) + (a ^ b) / 2;}/*** @dev Returns the ceiling of the division of two numbers.*
@openzeppelin/contracts/utils/math/SignedMath.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)pragma solidity ^0.8.0;/*** @dev Standard signed math utilities missing in the Solidity language.*/library SignedMath {/*** @dev Returns the largest of two signed numbers.*/function max(int256 a, int256 b) internal pure returns (int256) {return a > b ? a : b;}/*** @dev Returns the smallest of two signed numbers.*/function min(int256 a, int256 b) internal pure returns (int256) {return a < b ? a : b;}/*** @dev Returns the average of two signed numbers without overflow.* The result is rounded towards zero.*/function average(int256 a, int256 b) internal pure returns (int256) {// Formula from the book "Hacker's Delight"int256 x = (a & b) + ((a ^ b) >> 1);return x + (int256(uint256(x) >> 255) & (a ^ b));}/*** @dev Returns the absolute unsigned value of a signed value.*/function abs(int256 n) internal pure returns (uint256) {unchecked {// must be unchecked in order to support `n = type(int256).min`return uint256(n >= 0 ? n : -n);}
Compiler Settings
{"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"],"":["ast"]}},"optimizer":{"runs":200,"enabled":true},"libraries":{}}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"RoleAdminChanged","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32","indexed":true},{"type":"bytes32","name":"previousAdminRole","internalType":"bytes32","indexed":true},{"type":"bytes32","name":"newAdminRole","internalType":"bytes32","indexed":true}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32","indexed":true},{"type":"address","name":"account","internalType":"address","indexed":true},{"type":"address","name":"sender","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32","indexed":true},{"type":"address","name":"account","internalType":"address","indexed":true},{"type":"address","name":"sender","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"operatorChanged","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"DEFAULT_ADMIN_ROLE","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"changeOperator","inputs":[{"type":"address","name":"_operator","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"erc20safeTransferFrom","inputs":[{"type":"address","name":"token","internalType":"contract IERC20"},{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"erc721safeTransferFrom","inputs":[{"type":"address","name":"token","internalType":"contract IERC721"},{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"getRoleAdmin","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"grantRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"hasRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"mintAndSafe721Transfer","inputs":[{"type":"address","name":"token","internalType":"contract ILazyMint"},{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint96","name":"_royaltyFee","internalType":"uint96"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"operator","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"revokeRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"supportsInterface","inputs":[{"type":"bytes4","name":"interfaceId","internalType":"bytes4"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]}]
Contract Creation Code
0x608060405234801561001057600080fd5b50600180546001600160a01b0319163390811790915561003e906941444d494e5f524f4c4560b01b9061006a565b600254610065906c4f50455241544f525f524f4c4560981b906001600160a01b031661006a565b610116565b6100748282610078565b5050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16610074576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556100d23390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b611019806101256000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c80638da5cb5b1161008c578063d547741f11610066578063d547741f146101ef578063f2fde38b14610202578063f709b90614610215578063fa1705f41461022857600080fd5b80638da5cb5b146101c157806391d14854146101d4578063a217fddf146101e757600080fd5b80632f2ff15d116100c85780632f2ff15d1461015b57806336568abe14610170578063570ca73514610183578063776062c3146101ae57600080fd5b806301ffc9a7146100ef57806306394c9b14610117578063248a9ca31461012a575b600080fd5b6101026100fd366004610cda565b61023b565b60405190151581526020015b60405180910390f35b610102610125366004610d19565b610272565b61014d610138366004610d36565b60009081526020819052604090206001015490565b60405190815260200161010e565b61016e610169366004610d4f565b61039c565b005b61016e61017e366004610d4f565b6103c6565b600254610196906001600160a01b031681565b6040516001600160a01b03909116815260200161010e565b61016e6101bc366004610d7f565b610444565b600154610196906001600160a01b031681565b6101026101e2366004610d4f565b61047a565b61014d600081565b61016e6101fd366004610d4f565b6104a3565b610102610210366004610d19565b6104c8565b61016e610223366004610d7f565b6105d6565b61016e610236366004610dd0565b610661565b60006001600160e01b03198216637965db0b60e01b148061026c57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60006941444d494e5f524f4c4560b01b61028b8161070b565b6001600160a01b0383166102f95760405162461bcd60e51b815260206004820152602a60248201527f4f70657261746f723a206e6577206f70657261746f7220697320746865207a65604482015269726f206164647265737360b01b60648201526084015b60405180910390fd5b600254610320906c4f50455241544f525f524f4c4560981b906001600160a01b0316610718565b6002546040516001600160a01b038086169216907f1a377613c0f1788c756a416e15f930cf9e84c3a5e808fa2f00b5a18a91a7b86490600090a3600280546001600160a01b0319166001600160a01b038516908117909155610393906c4f50455241544f525f524f4c4560981b9061077d565b50600192915050565b6000828152602081905260409020600101546103b78161070b565b6103c18383610783565b505050565b6001600160a01b03811633146104365760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016102f0565b6104408282610718565b5050565b6c4f50455241544f525f524f4c4560981b61045e8161070b565b6104736001600160a01b038616858585610807565b5050505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6000828152602081905260409020600101546104be8161070b565b6103c18383610718565b60006941444d494e5f524f4c4560b01b6104e18161070b565b6001600160a01b0383166105465760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016102f0565b60015461056a906941444d494e5f524f4c4560b01b906001600160a01b0316610718565b6001546040516001600160a01b038086169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0385161790556103936941444d494e5f524f4c4560b01b8461077d565b6c4f50455241544f525f524f4c4560981b6105f08161070b565b604051632142170760e11b81526001600160a01b0385811660048301528481166024830152604482018490528616906342842e0e90606401600060405180830381600087803b15801561064257600080fd5b505af1158015610656573d6000803e3d6000fd5b505050505050505050565b6c4f50455241544f525f524f4c4560981b61067b8161070b565b604051636977213760e01b81526001600160a01b03858116600483015284811660248301526bffffffffffffffffffffffff841660448301528616906369772137906064016020604051808303816000875af11580156106df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107039190610e3d565b505050505050565b6107158133610867565b50565b610722828261047a565b15610440576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b61044082825b61078d828261047a565b610440576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556107c33390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526108619085906108c0565b50505050565b610871828261047a565b6104405761087e81610995565b6108898360206109a7565b60405160200161089a929190610e7a565b60408051601f198184030181529082905262461bcd60e51b82526102f091600401610eef565b6000610915826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610b4a9092919063ffffffff16565b90508051600014806109365750808060200190518101906109369190610f22565b6103c15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016102f0565b606061026c6001600160a01b03831660145b606060006109b6836002610f5a565b6109c1906002610f71565b67ffffffffffffffff8111156109d9576109d9610f84565b6040519080825280601f01601f191660200182016040528015610a03576020820181803683370190505b509050600360fc1b81600081518110610a1e57610a1e610f9a565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610a4d57610a4d610f9a565b60200101906001600160f81b031916908160001a9053506000610a71846002610f5a565b610a7c906001610f71565b90505b6001811115610af4576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610ab057610ab0610f9a565b1a60f81b828281518110610ac657610ac6610f9a565b60200101906001600160f81b031916908160001a90535060049490941c93610aed81610fb0565b9050610a7f565b508315610b435760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016102f0565b9392505050565b6060610b598484600085610b61565b949350505050565b606082471015610bc25760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016102f0565b600080866001600160a01b03168587604051610bde9190610fc7565b60006040518083038185875af1925050503d8060008114610c1b576040519150601f19603f3d011682016040523d82523d6000602084013e610c20565b606091505b5091509150610c3187838387610c3c565b979650505050505050565b60608315610cab578251600003610ca4576001600160a01b0385163b610ca45760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016102f0565b5081610b59565b610b598383815115610cc05781518083602001fd5b8060405162461bcd60e51b81526004016102f09190610eef565b600060208284031215610cec57600080fd5b81356001600160e01b031981168114610b4357600080fd5b6001600160a01b038116811461071557600080fd5b600060208284031215610d2b57600080fd5b8135610b4381610d04565b600060208284031215610d4857600080fd5b5035919050565b60008060408385031215610d6257600080fd5b823591506020830135610d7481610d04565b809150509250929050565b60008060008060808587031215610d9557600080fd5b8435610da081610d04565b93506020850135610db081610d04565b92506040850135610dc081610d04565b9396929550929360600135925050565b60008060008060808587031215610de657600080fd5b8435610df181610d04565b93506020850135610e0181610d04565b92506040850135610e1181610d04565b915060608501356bffffffffffffffffffffffff81168114610e3257600080fd5b939692955090935050565b600060208284031215610e4f57600080fd5b5051919050565b60005b83811015610e71578181015183820152602001610e59565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351610eb2816017850160208801610e56565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351610ee3816028840160208801610e56565b01602801949350505050565b6020815260008251806020840152610f0e816040850160208701610e56565b601f01601f19169190910160400192915050565b600060208284031215610f3457600080fd5b81518015158114610b4357600080fd5b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761026c5761026c610f44565b8082018082111561026c5761026c610f44565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600081610fbf57610fbf610f44565b506000190190565b60008251610fd9818460208701610e56565b919091019291505056fea2646970667358221220ccabd68e71e5e7e6e074d416faf5f5b45b34052acee2e65887ad2e2d86b02cf164736f6c63430008110033
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106100ea5760003560e01c80638da5cb5b1161008c578063d547741f11610066578063d547741f146101ef578063f2fde38b14610202578063f709b90614610215578063fa1705f41461022857600080fd5b80638da5cb5b146101c157806391d14854146101d4578063a217fddf146101e757600080fd5b80632f2ff15d116100c85780632f2ff15d1461015b57806336568abe14610170578063570ca73514610183578063776062c3146101ae57600080fd5b806301ffc9a7146100ef57806306394c9b14610117578063248a9ca31461012a575b600080fd5b6101026100fd366004610cda565b61023b565b60405190151581526020015b60405180910390f35b610102610125366004610d19565b610272565b61014d610138366004610d36565b60009081526020819052604090206001015490565b60405190815260200161010e565b61016e610169366004610d4f565b61039c565b005b61016e61017e366004610d4f565b6103c6565b600254610196906001600160a01b031681565b6040516001600160a01b03909116815260200161010e565b61016e6101bc366004610d7f565b610444565b600154610196906001600160a01b031681565b6101026101e2366004610d4f565b61047a565b61014d600081565b61016e6101fd366004610d4f565b6104a3565b610102610210366004610d19565b6104c8565b61016e610223366004610d7f565b6105d6565b61016e610236366004610dd0565b610661565b60006001600160e01b03198216637965db0b60e01b148061026c57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60006941444d494e5f524f4c4560b01b61028b8161070b565b6001600160a01b0383166102f95760405162461bcd60e51b815260206004820152602a60248201527f4f70657261746f723a206e6577206f70657261746f7220697320746865207a65604482015269726f206164647265737360b01b60648201526084015b60405180910390fd5b600254610320906c4f50455241544f525f524f4c4560981b906001600160a01b0316610718565b6002546040516001600160a01b038086169216907f1a377613c0f1788c756a416e15f930cf9e84c3a5e808fa2f00b5a18a91a7b86490600090a3600280546001600160a01b0319166001600160a01b038516908117909155610393906c4f50455241544f525f524f4c4560981b9061077d565b50600192915050565b6000828152602081905260409020600101546103b78161070b565b6103c18383610783565b505050565b6001600160a01b03811633146104365760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016102f0565b6104408282610718565b5050565b6c4f50455241544f525f524f4c4560981b61045e8161070b565b6104736001600160a01b038616858585610807565b5050505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6000828152602081905260409020600101546104be8161070b565b6103c18383610718565b60006941444d494e5f524f4c4560b01b6104e18161070b565b6001600160a01b0383166105465760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016102f0565b60015461056a906941444d494e5f524f4c4560b01b906001600160a01b0316610718565b6001546040516001600160a01b038086169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0385161790556103936941444d494e5f524f4c4560b01b8461077d565b6c4f50455241544f525f524f4c4560981b6105f08161070b565b604051632142170760e11b81526001600160a01b0385811660048301528481166024830152604482018490528616906342842e0e90606401600060405180830381600087803b15801561064257600080fd5b505af1158015610656573d6000803e3d6000fd5b505050505050505050565b6c4f50455241544f525f524f4c4560981b61067b8161070b565b604051636977213760e01b81526001600160a01b03858116600483015284811660248301526bffffffffffffffffffffffff841660448301528616906369772137906064016020604051808303816000875af11580156106df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107039190610e3d565b505050505050565b6107158133610867565b50565b610722828261047a565b15610440576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b61044082825b61078d828261047a565b610440576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556107c33390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526108619085906108c0565b50505050565b610871828261047a565b6104405761087e81610995565b6108898360206109a7565b60405160200161089a929190610e7a565b60408051601f198184030181529082905262461bcd60e51b82526102f091600401610eef565b6000610915826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610b4a9092919063ffffffff16565b90508051600014806109365750808060200190518101906109369190610f22565b6103c15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016102f0565b606061026c6001600160a01b03831660145b606060006109b6836002610f5a565b6109c1906002610f71565b67ffffffffffffffff8111156109d9576109d9610f84565b6040519080825280601f01601f191660200182016040528015610a03576020820181803683370190505b509050600360fc1b81600081518110610a1e57610a1e610f9a565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610a4d57610a4d610f9a565b60200101906001600160f81b031916908160001a9053506000610a71846002610f5a565b610a7c906001610f71565b90505b6001811115610af4576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610ab057610ab0610f9a565b1a60f81b828281518110610ac657610ac6610f9a565b60200101906001600160f81b031916908160001a90535060049490941c93610aed81610fb0565b9050610a7f565b508315610b435760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016102f0565b9392505050565b6060610b598484600085610b61565b949350505050565b606082471015610bc25760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016102f0565b600080866001600160a01b03168587604051610bde9190610fc7565b60006040518083038185875af1925050503d8060008114610c1b576040519150601f19603f3d011682016040523d82523d6000602084013e610c20565b606091505b5091509150610c3187838387610c3c565b979650505050505050565b60608315610cab578251600003610ca4576001600160a01b0385163b610ca45760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016102f0565b5081610b59565b610b598383815115610cc05781518083602001fd5b8060405162461bcd60e51b81526004016102f09190610eef565b600060208284031215610cec57600080fd5b81356001600160e01b031981168114610b4357600080fd5b6001600160a01b038116811461071557600080fd5b600060208284031215610d2b57600080fd5b8135610b4381610d04565b600060208284031215610d4857600080fd5b5035919050565b60008060408385031215610d6257600080fd5b823591506020830135610d7481610d04565b809150509250929050565b60008060008060808587031215610d9557600080fd5b8435610da081610d04565b93506020850135610db081610d04565b92506040850135610dc081610d04565b9396929550929360600135925050565b60008060008060808587031215610de657600080fd5b8435610df181610d04565b93506020850135610e0181610d04565b92506040850135610e1181610d04565b915060608501356bffffffffffffffffffffffff81168114610e3257600080fd5b939692955090935050565b600060208284031215610e4f57600080fd5b5051919050565b60005b83811015610e71578181015183820152602001610e59565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351610eb2816017850160208801610e56565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351610ee3816028840160208801610e56565b01602801949350505050565b6020815260008251806020840152610f0e816040850160208701610e56565b601f01601f19169190910160400192915050565b600060208284031215610f3457600080fd5b81518015158114610b4357600080fd5b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761026c5761026c610f44565b8082018082111561026c5761026c610f44565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600081610fbf57610fbf610f44565b506000190190565b60008251610fd9818460208701610e56565b919091019291505056fea2646970667358221220ccabd68e71e5e7e6e074d416faf5f5b45b34052acee2e65887ad2e2d86b02cf164736f6c63430008110033