Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 5 from a total of 5 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Make ERC1155 | 12917185 | 1087 days ago | IN | 0 ETH | 0.08202876 | ||||
Make ERC1155 | 12803126 | 1105 days ago | IN | 0 ETH | 0.02734292 | ||||
Make ERC1155 | 12606930 | 1135 days ago | IN | 0 ETH | 0.03417865 | ||||
Grant Role | 12600050 | 1136 days ago | IN | 0 ETH | 0.00076891 | ||||
0x60806040 | 12600049 | 1136 days ago | IN | Create: FactoryErc1155 | 0 ETH | 0.07377516 |
Latest 3 internal transactions
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
12917185 | 1087 days ago | Contract Creation | 0 ETH | |||
12803126 | 1105 days ago | Contract Creation | 0 ETH | |||
12606930 | 1135 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
FactoryErc1155
Compiler Version
v0.8.3+commit.8d00100c
Optimization Enabled:
Yes with 999999 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "openzeppelin-solidity/contracts/access/AccessControl.sol"; import "openzeppelin-solidity/contracts/utils/cryptography/ECDSA.sol"; import "./ERC1155Main.sol"; import "./exchange-provider/ExchangeProvider.sol"; contract FactoryErc1155 is AccessControl, ExchangeProvider { bytes32 public SIGNER_ROLE = keccak256("SIGNER_ROLE"); event ERC1155Made(address newToken, address indexed signer); constructor(address _exchange) { _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setupRole(SIGNER_ROLE, _msgSender()); exchange = _exchange; } function makeERC1155( string memory uri, address signer, bytes calldata signature ) external { _verifySigner(signer, signature); ERC1155Main newAddress = new ERC1155Main(uri, signer); emit ERC1155Made(address(newAddress), signer); } function _verifySigner(address signer, bytes calldata signature) private view { address messageSigner = ECDSA.recover(keccak256(abi.encodePacked(signer)), signature); require( hasRole(SIGNER_ROLE, messageSigner), "FactoryErc1155: Signer should sign transaction" ); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "openzeppelin-solidity/contracts/token/ERC1155/extensions/ERC1155Burnable.sol"; import "openzeppelin-solidity/contracts/access/AccessControl.sol"; import "openzeppelin-solidity/contracts/utils/cryptography/ECDSA.sol"; import "./exchange-provider/IExchangeProvider.sol"; import "./ERC1155URIStorage.sol"; contract ERC1155Main is ERC1155Burnable, ERC1155URIStorage, AccessControl { bytes32 public SIGNER_ROLE = keccak256("SIGNER_ROLE"); address public factory; uint256 private _lastMintedId; mapping(string => bool) hasTokenWithURI; constructor(string memory _baseUri, address signer) ERC1155("") { factory = _msgSender(); _setBaseUri(_baseUri); _setupRole(DEFAULT_ADMIN_ROLE, signer); _setupRole(SIGNER_ROLE, signer); } function mint( uint256 amount, string calldata _tokenURI, bytes calldata signature ) external { _verifySigner(_tokenURI, amount, signature); require(!hasTokenWithURI[_tokenURI], "ERC1155Main: URI already exists"); uint256 id = _lastMintedId++; _mint(_msgSender(), id, amount, ""); setApprovalForAll(IExchangeProvider(factory).exchange(), true); _markTokenId(id); hasTokenWithURI[_tokenURI] = true; _setTokenURI(id, _tokenURI); } function mint( uint256 amount, string calldata _tokenURI, bytes memory data, bytes calldata signature ) external { _verifySigner(_tokenURI, amount, signature); require(!hasTokenWithURI[_tokenURI], "ERC1155Main: URI already exists"); uint256 id = _lastMintedId++; _mint(_msgSender(), id, amount, data); setApprovalForAll(IExchangeProvider(factory).exchange(), true); _markTokenId(id); hasTokenWithURI[_tokenURI] = true; _setTokenURI(id,_tokenURI); } function supportsInterface(bytes4 interfaceId) public view virtual override(AccessControl, ERC1155) returns (bool) { return ERC1155.supportsInterface(interfaceId) || AccessControl.supportsInterface(interfaceId); } function tokenURI(uint256 tokenId) public view virtual override(ERC1155URIStorage) returns (string memory) { return ERC1155URIStorage.tokenURI(tokenId); } function _verifySigner( string calldata _tokenURI, uint256 amount, bytes calldata signature ) private view { address signer = ECDSA.recover( keccak256(abi.encodePacked(this, _tokenURI, amount)), signature ); require( hasRole(SIGNER_ROLE, signer), "ERC1155Main: Signer should sign transaction" ); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "openzeppelin-solidity/contracts/token/ERC1155/ERC1155.sol"; import "openzeppelin-solidity/contracts/utils/Strings.sol"; abstract contract ERC1155URIStorage is ERC1155 { using Strings for uint256; string private baseUri; // Optional mapping for token URIs mapping (uint256 => string) private _tokenURIs; mapping (uint256 => bool) private _tokenIds; function tokenURI(uint256 tokenId) public view virtual returns (string memory) { require(_tokenIds[tokenId], "ERC1155URIStorage: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.uri(tokenId); } function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_tokenIds[tokenId], "ERC1155URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } function _setBaseUri(string memory _uri) internal virtual { //require(_uri != "", ""); baseUri = _uri; } function _baseURI() internal view virtual returns (string memory) { return baseUri; } function _markTokenId(uint256 id) internal virtual { _tokenIds[id] = true; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "openzeppelin-solidity/contracts/access/AccessControl.sol"; import "openzeppelin-solidity/contracts/utils/cryptography/ECDSA.sol"; import "./IExchangeProvider.sol"; contract ExchangeProvider is IExchangeProvider, AccessControl { address public override exchange; function setExchange(address _exchange) external { require( hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "Factory: Only admin allowed" ); exchange = _exchange; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IExchangeProvider { function exchange() external view returns(address); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../utils/Context.sol"; import "../utils/Strings.sol"; import "../utils/introspection/ERC165.sol"; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { function hasRole(bytes32 role, address account) external view returns (bool); function getRoleAdmin(bytes32 role) external view returns (bytes32); function grantRole(bytes32 role, address account) external; function revokeRole(bytes32 role, address account) external; function renounceRole(bytes32 role, address account) external; } /** * @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: * * ``` * 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}: * * ``` * 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 * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping (address => bool) members; bytes32 adminRole; } mapping (bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @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 {_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 Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/ */ function _checkRole(bytes32 role, address account) internal view { if(!hasRole(role, account)) { revert(string(abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ))); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view override returns (bytes32) { return _roles[role].adminRole; } /** * @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) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @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) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @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) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { emit RoleAdminChanged(role, getRoleAdmin(role), adminRole); _roles[role].adminRole = adminRole; } function _grantRole(bytes32 role, address account) private { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC1155.sol"; import "./IERC1155Receiver.sol"; import "./extensions/IERC1155MetadataURI.sol"; import "../../utils/Address.sol"; import "../../utils/Context.sol"; import "../../utils/introspection/ERC165.sol"; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping (uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping (address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor (string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: balance query for the zero address"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch( address[] memory accounts, uint256[] memory ids ) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(_msgSender() != operator, "ERC1155: setting approval status for self"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require(to != address(0), "ERC1155: transfer to the zero address"); require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not owner nor approved" ); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); _balances[id][from] = fromBalance - amount; _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: transfer caller is not owner nor approved" ); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); _balances[id][from] = fromBalance - amount; _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `account`. * * Emits a {TransferSingle} event. * * Requirements: * * - `account` cannot be the zero address. * - If `account` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint(address account, uint256 id, uint256 amount, bytes memory data) internal virtual { require(account != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), account, _asSingletonArray(id), _asSingletonArray(amount), data); _balances[id][account] += amount; emit TransferSingle(operator, address(0), account, id, amount); _doSafeTransferAcceptanceCheck(operator, address(0), account, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `account` * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens of token type `id`. */ function _burn(address account, uint256 id, uint256 amount) internal virtual { require(account != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, account, address(0), _asSingletonArray(id), _asSingletonArray(amount), ""); uint256 accountBalance = _balances[id][account]; require(accountBalance >= amount, "ERC1155: burn amount exceeds balance"); _balances[id][account] = accountBalance - amount; emit TransferSingle(operator, account, address(0), id, amount); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch(address account, uint256[] memory ids, uint256[] memory amounts) internal virtual { require(account != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, account, address(0), ids, amounts, ""); for (uint i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 accountBalance = _balances[id][account]; require(accountBalance >= amount, "ERC1155: burn amount exceeds balance"); _balances[id][account] = accountBalance - amount; } emit TransferBatch(operator, account, address(0), ids, amounts); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { } function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver(to).onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (bytes4 response) { if (response != IERC1155Receiver(to).onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** @dev Handles the receipt of a single ERC1155 token type. This function is called at the end of a `safeTransferFrom` after the balance has been updated. To accept the transfer, this must return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` (i.e. 0xf23a6e61, or its own function selector). @param operator The address which initiated the transfer (i.e. msg.sender) @param from The address which previously owned the token @param id The ID of the token being transferred @param value The amount of tokens being transferred @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns(bytes4); /** @dev Handles the receipt of a multiple ERC1155 token types. This function is called at the end of a `safeBatchTransferFrom` after the balances have been updated. To accept the transfer(s), this must return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` (i.e. 0xbc197c81, or its own function selector). @param operator The address which initiated the batch transfer (i.e. msg.sender) @param from The address which previously owned the token @param ids An array containing ids of each token being transferred (order and length must match values array) @param values An array containing amounts of each token being transferred (order and length must match ids array) @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns(bytes4); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../ERC1155.sol"; /** * @dev Extension of {ERC1155} that allows token holders to destroy both their * own tokens and those that they have been approved to use. * * _Available since v3.1._ */ abstract contract ERC1155Burnable is ERC1155 { function burn(address account, uint256 id, uint256 value) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "ERC1155: caller is not owner nor approved" ); _burn(account, id, value); } function burnBatch(address account, uint256[] memory ids, uint256[] memory values) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "ERC1155: caller is not owner nor approved" ); _burnBatch(account, ids, values); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC1155.sol"; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT 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) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { // Divide the signature in r, s and v variables bytes32 r; bytes32 s; uint8 v; // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // solhint-disable-next-line no-inline-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } } else if (signature.length == 64) { // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // solhint-disable-next-line no-inline-assembly assembly { let vs := mload(add(signature, 0x40)) r := mload(add(signature, 0x20)) s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } } else { revert("ECDSA: invalid signature length"); } return recover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "ECDSA: invalid signature 's' value"); require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value"); // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); require(signer != address(0), "ECDSA: invalid signature"); return signer; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } }
// SPDX-License-Identifier: MIT 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; } }
// SPDX-License-Identifier: MIT 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); }
{ "remappings": [], "optimizer": { "enabled": true, "runs": 999999 }, "evmVersion": "istanbul", "libraries": {}, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_exchange","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newToken","type":"address"},{"indexed":true,"internalType":"address","name":"signer","type":"address"}],"name":"ERC1155Made","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SIGNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exchange","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"},{"internalType":"address","name":"signer","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"makeERC1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_exchange","type":"address"}],"name":"setExchange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040527fe2f4eaae4a9751e85a3e4a7b9587827a877f29914755229b07a7b2da98285f706002553480156200003557600080fd5b50604051620058823803806200588283398101604081905262000058916200014b565b620000666000335b6200009b565b60025462000075903362000060565b600180546001600160a01b0319166001600160a01b03929092169190911790556200017b565b620000a78282620000ab565b5050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16620000a7576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620001073390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000602082840312156200015d578081fd5b81516001600160a01b038116811462000174578182fd5b9392505050565b6156f7806200018b6000396000f3fe60806040523480156200001157600080fd5b5060043610620000dc5760003560e01c806391d14854116200008d578063ce9e4dc41162000063578063ce9e4dc414620001e3578063d2f7265a14620001fa578063d547741f146200024157620000dc565b806391d148541462000189578063a1ebf35d14620001d0578063a217fddf14620001da57620000dc565b80632f2ff15d11620000c35780632f2ff15d146200014257806336568abe146200015b57806367b1f5df146200017257620000dc565b806301ffc9a714620000e1578063248a9ca3146200010d575b600080fd5b620000f8620000f236600462001094565b62000258565b60405190151581526020015b60405180910390f35b620001336200011e3660046200104d565b60009081526020819052604090206001015490565b60405190815260200162000104565b620001596200015336600462001066565b620002f4565b005b620001596200016c36600462001066565b62000324565b620001596200018336600462001030565b620003df565b620000f86200019a36600462001066565b60009182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b6200013360025481565b62000133600081565b62000159620001f4366004620010d6565b6200049b565b6001546200021b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200162000104565b620001596200025236600462001066565b6200053d565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b000000000000000000000000000000000000000000000000000000001480620002ec57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b90505b919050565b6000828152602081905260409020600101546200031381335b62000567565b6200031f838362000640565b505050565b73ffffffffffffffffffffffffffffffffffffffff81163314620003cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b620003db828262000732565b5050565b620003ec6000336200019a565b62000454576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f466163746f72793a204f6e6c792061646d696e20616c6c6f77656400000000006044820152606401620003c6565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b620004a8838383620007ea565b60008484604051620004ba9062000fb3565b620004c7929190620012cc565b604051809103906000f080158015620004e4573d6000803e3d6000fd5b5060405173ffffffffffffffffffffffffffffffffffffffff8083168252919250908516907fe9a3e4d9ebecd74fe75a0328c3c63709d481aebfaa856b77348933ab9e623e719060200160405180910390a25050505050565b6000828152602081905260409020600101546200055b81336200030d565b6200031f838362000732565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16620003db57620005c08173ffffffffffffffffffffffffffffffffffffffff16601462000942565b620005cd83602062000942565b604051602001620005e092919062001232565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a0000000000000000000000000000000000000000000000000000000008252620003c691600401620012b7565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16620003db5760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055620006d43390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1615620003db5760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b16602082015260009062000877906034016040516020818303038152906040528051906020012084848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525062000c6392505050565b60025460009081526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205490915060ff166200093c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f466163746f7279457263313135353a205369676e65722073686f756c6420736960448201527f676e207472616e73616374696f6e0000000000000000000000000000000000006064820152608401620003c6565b50505050565b606060006200095383600262001321565b6200096090600262001306565b67ffffffffffffffff811115620009a0577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015620009cb576020820181803683370190505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811062000a2a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811062000ab5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600062000af384600262001321565b62000b0090600162001306565b90505b600181111562000bf1577f303132333435363738396162636465660000000000000000000000000000000085600f166010811062000b6a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b82828151811062000ba8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c9362000be98162001390565b905062000b03565b50831562000c5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401620003c6565b9392505050565b60008060008084516041141562000c8f5750505060208201516040830151606084015160001a62000d3b565b84516040141562000cd85750505060408201516020830151907f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81169060ff1c601b0162000d3b565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401620003c6565b62000d498682858562000d53565b9695505050505050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a082111562000e07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401620003c6565b8360ff16601b148062000e1d57508360ff16601c145b62000eab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401620003c6565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa15801562000f00573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811662000faa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401620003c6565b95945050505050565b61429b806200142783390190565b803573ffffffffffffffffffffffffffffffffffffffff81168114620002ef57600080fd5b60008083601f84011262000ff8578182fd5b50813567ffffffffffffffff81111562001010578182fd5b6020830191508360208285010111156200102957600080fd5b9250929050565b60006020828403121562001042578081fd5b62000c5c8262000fc1565b6000602082840312156200105f578081fd5b5035919050565b6000806040838503121562001079578081fd5b823591506200108b6020840162000fc1565b90509250929050565b600060208284031215620010a6578081fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811462000c5c578182fd5b60008060008060608587031215620010ec578182fd5b843567ffffffffffffffff8082111562001104578384fd5b818701915087601f83011262001118578384fd5b8135818111156200112d576200112d620013f7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715620011765762001176620013f7565b816040528281528a60208487010111156200118f578687fd5b826020860160208301378660208483010152809850505050620011b56020880162000fc1565b94506040870135915080821115620011cb578384fd5b50620011da8782880162000fe6565b95989497509550505050565b600081518084526200120081602086016020860162001361565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60007f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000825283516200126c81601785016020880162001361565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351620012ab81602884016020880162001361565b01602801949350505050565b60006020825262000c5c6020830184620011e6565b600060408252620012e16040830185620011e6565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b600082198211156200131c576200131c620013c8565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156200135c576200135c620013c8565b500290565b60005b838110156200137e57818101518382015260200162001364565b838111156200093c5750506000910152565b600081620013a257620013a2620013c8565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fdfe60806040527fe2f4eaae4a9751e85a3e4a7b9587827a877f29914755229b07a7b2da98285f706007553480156200003557600080fd5b506040516200429b3803806200429b833981016040819052620000589162000252565b6040805160208101909152600081526200007281620000b4565b50600880546001600160a01b031916331790556200009082620000cd565b6200009d600082620000e2565b600754620000ac9082620000e2565b505062000390565b8051620000c99060029060208401906200018f565b5050565b8051620000c99060039060208401906200018f565b60008281526006602090815260408083206001600160a01b0385168452909152902054620000c9908390839060ff16620000c95760008281526006602090815260408083206001600160a01b03851684529091529020805460ff191660011790556200014b3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b8280546200019d906200033d565b90600052602060002090601f016020900481019282620001c157600085556200020c565b82601f10620001dc57805160ff19168380011785556200020c565b828001600101855582156200020c579182015b828111156200020c578251825591602001919060010190620001ef565b506200021a9291506200021e565b5090565b5b808211156200021a57600081556001016200021f565b80516001600160a01b03811681146200024d57600080fd5b919050565b6000806040838503121562000265578182fd5b82516001600160401b03808211156200027c578384fd5b818501915085601f83011262000290578384fd5b815181811115620002a557620002a56200037a565b604051601f8201601f19908116603f01168101908382118183101715620002d057620002d06200037a565b81604052828152602093508884848701011115620002ec578687fd5b8691505b828210156200030f5784820184015181830185015290830190620002f0565b828211156200032057868484830101525b95506200033291505085820162000235565b925050509250929050565b600181811c908216806200035257607f821691505b602082108114156200037457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b613efb80620003a06000396000f3fe608060405234801561001057600080fd5b50600436106101765760003560e01c806391d14854116100d8578063c45a01551161008c578063e985e9c511610066578063e985e9c514610370578063f242432a146103b9578063f5298aca146103cc57610176565b8063c45a015514610305578063c87b56dd1461034a578063d547741f1461035d57610176565b8063a217fddf116100bd578063a217fddf146102d7578063a22cb465146102df578063beb76f5f146102f257610176565b806391d1485414610288578063a1ebf35d146102ce57610176565b80632f2ff15d1161012f5780634e1273f4116101145780634e1273f4146102425780636b20c45414610262578063785cc9971461027557610176565b80632f2ff15d1461021c57806336568abe1461022f57610176565b80630e89341c116101605780630e89341c146101c4578063248a9ca3146101e45780632eb2c2d61461020757610176565b8062fdd58e1461017b57806301ffc9a7146101a1575b600080fd5b61018e610189366004613642565b6103df565b6040519081526020015b60405180910390f35b6101b46101af3660046137aa565b6104bc565b6040519015158152602001610198565b6101d76101d236600461376e565b6104de565b6040516101989190613b6d565b61018e6101f236600461376e565b60009081526006602052604090206001015490565b61021a61021536600461348d565b610572565b005b61021a61022a366004613786565b610a4b565b61021a61023d366004613786565b610a7d565b6102556102503660046136a1565b610b4d565b6040516101989190613b35565b61021a61027036600461359e565b610d41565b61021a6102833660046137e2565b610e20565b6101b4610296366004613786565b600091825260066020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b61018e60075481565b61018e600081565b61021a6102ed366004613611565b611065565b61021a610300366004613859565b6111f9565b6008546103259073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610198565b6101d761035836600461376e565b6113f9565b61021a61036b366004613786565b611404565b6101b461037e366004613455565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b61021a6103c7366004613537565b61142c565b61021a6103da36600461366d565b61174c565b600073ffffffffffffffffffffffffffffffffffffffff8316610489576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201527f65726f206164647265737300000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526020818152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052205490565b60006104c78261182b565b806104d657506104d68261190e565b90505b919050565b6060600280546104ed90613c75565b80601f016020809104026020016040519081016040528092919081815260200182805461051990613c75565b80156105665780601f1061053b57610100808354040283529160200191610566565b820191906000526020600020905b81548152906001019060200180831161054957829003601f168201915b50505050509050919050565b8151835114610603576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d617463680000000000000000000000000000000000000000000000006064820152608401610480565b73ffffffffffffffffffffffffffffffffffffffff84166106a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610480565b6106ae611964565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806106ee57506106ee8561037e611964565b61077a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006064820152608401610480565b6000610784611964565b905060005b84518110156109b65760008582815181106107cd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000858381518110610812577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020908102919091018101516000848152808352604080822073ffffffffffffffffffffffffffffffffffffffff8e1683529093529190912054909150818110156108df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610480565b6108e98282613bf9565b60008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461099b9190613ba4565b92505081905550505050806109af90613d14565b9050610789565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610a2d929190613b48565b60405180910390a4610a43818787878787611969565b505050505050565b600082815260066020526040902060010154610a6e81610a69611964565b611c03565b610a788383611cd5565b505050565b610a85611964565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b3f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610480565b610b498282611dca565b5050565b60608151835114610be0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d6174636800000000000000000000000000000000000000000000006064820152608401610480565b6000835167ffffffffffffffff811115610c23577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610c4c578160200160208202803683370190505b50905060005b8451811015610d3957610ce5858281518110610c97577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151858381518110610cd8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516103df565b828281518110610d1e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020908102919091010152610d3281613d14565b9050610c52565b509392505050565b610d49611964565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610d895750610d898361037e611964565b610e15576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f76656400000000000000000000000000000000000000000000006064820152608401610480565b610a78838383611ebd565b610e2d848487858561223b565b600a8484604051610e3f9291906139ba565b9081526040519081900360200190205460ff1615610eb9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f455243313135354d61696e3a2055524920616c726561647920657869737473006044820152606401610480565b6009805460009182610eca83613d14565b919050559050610ef2610edb611964565b82886040518060200160405280600081525061236e565b600854604080517fd2f7265a0000000000000000000000000000000000000000000000000000000081529051610f9d9273ffffffffffffffffffffffffffffffffffffffff169163d2f7265a916004808301926020929190829003018186803b158015610f5e57600080fd5b505afa158015610f72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f969190613439565b6001611065565b610fda81600090815260056020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6001600a8686604051610fee9291906139ba565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001694151594909417909355601f87018290048202830182019052858252610a4391839188908890819084018382808284376000920191909152506124d792505050565b8173ffffffffffffffffffffffffffffffffffffffff16611084611964565b73ffffffffffffffffffffffffffffffffffffffff161415611128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c6600000000000000000000000000000000000000000000006064820152608401610480565b8060016000611135611964565b73ffffffffffffffffffffffffffffffffffffffff90811682526020808301939093526040918201600090812091871680825291909352912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016921515929092179091556111a4611964565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111ed911515815260200190565b60405180910390a35050565b611206858588858561223b565b600a85856040516112189291906139ba565b9081526040519081900360200190205460ff1615611292576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f455243313135354d61696e3a2055524920616c726561647920657869737473006044820152606401610480565b60098054600091826112a383613d14565b9190505590506112bc6112b4611964565b82898761236e565b600854604080517fd2f7265a00000000000000000000000000000000000000000000000000000000815290516113289273ffffffffffffffffffffffffffffffffffffffff169163d2f7265a916004808301926020929190829003018186803b158015610f5e57600080fd5b61136581600090815260056020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6001600a87876040516113799291906139ba565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001694151594909417909355601f880182900482028301820190528682526113f091839189908990819084018382808284376000920191909152506124d792505050565b50505050505050565b60606104d682612594565b60008281526006602052604090206001015461142281610a69611964565b610a788383611dca565b73ffffffffffffffffffffffffffffffffffffffff84166114cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610480565b6114d7611964565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061151757506115178561037e611964565b6115a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f76656400000000000000000000000000000000000000000000006064820152608401610480565b60006115ad611964565b90506115ce8187876115be8861272f565b6115c78861272f565b5050505050565b60008481526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8a1684529091529020548381101561168c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610480565b6116968482613bf9565b60008681526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8c811685529252808320939093558816815290812080548692906116df908490613ba4565b9091555050604080518681526020810186905273ffffffffffffffffffffffffffffffffffffffff808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46113f08288888888886127a1565b611754611964565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061179457506117948361037e611964565b611820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f76656400000000000000000000000000000000000000000000006064820152608401610480565b610a7883838361295d565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a260000000000000000000000000000000000000000000000000000000014806118be57507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b806104d657507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146104d6565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806104d657506104d68261182b565b335b90565b73ffffffffffffffffffffffffffffffffffffffff84163b15610a43576040517fbc197c8100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063bc197c81906119e09089908990889088908890600401613a7a565b602060405180830381600087803b1580156119fa57600080fd5b505af1925050508015611a48575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611a45918101906137c6565b60015b611b3257611a54613dab565b806308c379a01415611aa85750611a69613dc2565b80611a745750611aaa565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104809190613b6d565b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e7465720000000000000000000000006064820152608401610480565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c8100000000000000000000000000000000000000000000000000000000146113f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610480565b600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610b4957611c5b8173ffffffffffffffffffffffffffffffffffffffff166014612b78565b611c66836020612b78565b604051602001611c779291906139f9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a000000000000000000000000000000000000000000000000000000000825261048091600401613b6d565b600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610b4957600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055611d6c611964565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1615610b4957600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055611e5f611964565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b73ffffffffffffffffffffffffffffffffffffffff8316611f60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610480565b8051825114611ff1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d617463680000000000000000000000000000000000000000000000006064820152608401610480565b6000611ffb611964565b604080516020810190915260009052905060005b83518110156121b5576000848281518110612053577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000848381518110612098577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020908102919091018101516000848152808352604080822073ffffffffffffffffffffffffffffffffffffffff8c168352909352919091205490915081811015612164576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c60448201527f616e6365000000000000000000000000000000000000000000000000000000006064820152608401610480565b61216e8282613bf9565b60009384526020848152604080862073ffffffffffffffffffffffffffffffffffffffff8c16875290915290932092909255508190506121ad81613d14565b91505061200f565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868660405161222d929190613b48565b60405180910390a450505050565b60006122a9308787876040516020016122579493929190613977565b6040516020818303038152906040528051906020012084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612e8592505050565b600754600090815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205490915060ff16610a43576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f455243313135354d61696e3a205369676e65722073686f756c64207369676e2060448201527f7472616e73616374696f6e0000000000000000000000000000000000000000006064820152608401610480565b73ffffffffffffffffffffffffffffffffffffffff8416612411576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610480565b600061241b611964565b905061242d816000876115be8861272f565b60008481526020818152604080832073ffffffffffffffffffffffffffffffffffffffff891684529091528120805485929061246a908490613ba4565b9091555050604080518581526020810185905273ffffffffffffffffffffffffffffffffffffffff80881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46115c7816000878787876127a1565b60008281526005602052604090205460ff16612575576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4552433131353555524953746f726167653a2055524920736574206f66206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610480565b60008281526004602090815260409091208251610a7892840190613258565b60008181526005602052604090205460609060ff16612635576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433131353555524953746f726167653a2055524920717565727920666f7260448201527f206e6f6e6578697374656e7420746f6b656e00000000000000000000000000006064820152608401610480565b6000828152600460205260408120805461264e90613c75565b80601f016020809104026020016040519081016040528092919081815260200182805461267a90613c75565b80156126c75780601f1061269c576101008083540402835291602001916126c7565b820191906000526020600020905b8154815290600101906020018083116126aa57829003601f168201915b5050505050905060006126d8612f6e565b90508051600014156126ec575090506104d9565b81511561271e5780826040516020016127069291906139ca565b604051602081830303815290604052925050506104d9565b612727846104de565b949350505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110612790577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602090810291909101015292915050565b73ffffffffffffffffffffffffffffffffffffffff84163b15610a43576040517ff23a6e6100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063f23a6e61906128189089908990889088908890600401613ae5565b602060405180830381600087803b15801561283257600080fd5b505af1925050508015612880575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261287d918101906137c6565b60015b61288c57611a54613dab565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e6100000000000000000000000000000000000000000000000000000000146113f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610480565b73ffffffffffffffffffffffffffffffffffffffff8316612a00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610480565b6000612a0a611964565b9050612a3b81856000612a1c8761272f565b612a258761272f565b5050604080516020810190915260009052505050565b60008381526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8816845290915290205482811015612af8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c60448201527f616e6365000000000000000000000000000000000000000000000000000000006064820152608401610480565b612b028382613bf9565b60008581526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8a811680865291845282852095909555815189815292830188905292938616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b60606000612b87836002613bbc565b612b92906002613ba4565b67ffffffffffffffff811115612bd1577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612bfb576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612c59577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612ce3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000612d1f846002613bbc565b612d2a906001613ba4565b90505b6001811115612e15577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110612d92577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b828281518110612dcf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c93612e0e81613c40565b9050612d2d565b508315612e7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610480565b9392505050565b600080600080845160411415612eaf5750505060208201516040830151606084015160001a612f58565b845160401415612ef65750505060408201516020830151907f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81169060ff1c601b01612f58565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610480565b612f6486828585613000565b9695505050505050565b606060038054612f7d90613c75565b80601f0160208091040260200160405190810160405280929190818152602001828054612fa990613c75565b8015612ff65780601f10612fcb57610100808354040283529160200191612ff6565b820191906000526020600020905b815481529060010190602001808311612fd957829003601f168201915b5050505050905090565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156130b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610480565b8360ff16601b14806130c757508360ff16601c145b613153576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610480565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa1580156131a7573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811661324f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610480565b95945050505050565b82805461326490613c75565b90600052602060002090601f01602090048101928261328657600085556132cc565b82601f1061329f57805160ff19168380011785556132cc565b828001600101855582156132cc579182015b828111156132cc5782518255916020019190600101906132b1565b506132d89291506132dc565b5090565b5b808211156132d857600081556001016132dd565b600082601f830112613301578081fd5b8135602061330e82613b80565b60405161331b8282613cc9565b8381528281019150858301600585901b8701840188101561333a578586fd5b855b858110156133585781358452928401929084019060010161333c565b5090979650505050505050565b60008083601f840112613376578182fd5b50813567ffffffffffffffff81111561338d578182fd5b6020830191508360208285010111156133a557600080fd5b9250929050565b600082601f8301126133bc578081fd5b813567ffffffffffffffff8111156133d6576133d6613d7c565b60405161340b60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160182613cc9565b81815284602083860101111561341f578283fd5b816020850160208301379081016020019190915292915050565b60006020828403121561344a578081fd5b8151612e7e81613e72565b60008060408385031215613467578081fd5b823561347281613e72565b9150602083013561348281613e72565b809150509250929050565b600080600080600060a086880312156134a4578081fd5b85356134af81613e72565b945060208601356134bf81613e72565b9350604086013567ffffffffffffffff808211156134db578283fd5b6134e789838a016132f1565b945060608801359150808211156134fc578283fd5b61350889838a016132f1565b9350608088013591508082111561351d578283fd5b5061352a888289016133ac565b9150509295509295909350565b600080600080600060a0868803121561354e578081fd5b853561355981613e72565b9450602086013561356981613e72565b93506040860135925060608601359150608086013567ffffffffffffffff811115613592578182fd5b61352a888289016133ac565b6000806000606084860312156135b2578283fd5b83356135bd81613e72565b9250602084013567ffffffffffffffff808211156135d9578384fd5b6135e5878388016132f1565b935060408601359150808211156135fa578283fd5b50613607868287016132f1565b9150509250925092565b60008060408385031215613623578182fd5b823561362e81613e72565b915060208301358015158114613482578182fd5b60008060408385031215613654578182fd5b823561365f81613e72565b946020939093013593505050565b600080600060608486031215613681578081fd5b833561368c81613e72565b95602085013595506040909401359392505050565b600080604083850312156136b3578182fd5b823567ffffffffffffffff808211156136ca578384fd5b818501915085601f8301126136dd578384fd5b813560206136ea82613b80565b6040516136f78282613cc9565b8381528281019150858301600585901b870184018b1015613716578889fd5b8896505b8487101561374157803561372d81613e72565b83526001969096019591830191830161371a565b5096505086013592505080821115613757578283fd5b50613764858286016132f1565b9150509250929050565b60006020828403121561377f578081fd5b5035919050565b60008060408385031215613798578182fd5b82359150602083013561348281613e72565b6000602082840312156137bb578081fd5b8135612e7e81613e97565b6000602082840312156137d7578081fd5b8151612e7e81613e97565b6000806000806000606086880312156137f9578283fd5b85359450602086013567ffffffffffffffff80821115613817578485fd5b61382389838a01613365565b9096509450604088013591508082111561383b578283fd5b5061384888828901613365565b969995985093965092949392505050565b60008060008060008060808789031215613871578384fd5b86359550602087013567ffffffffffffffff8082111561388f578586fd5b61389b8a838b01613365565b909750955060408901359150808211156138b3578283fd5b6138bf8a838b016133ac565b945060608901359150808211156138d4578283fd5b506138e189828a01613365565b979a9699509497509295939492505050565b6000815180845260208085019450808401835b8381101561392257815187529582019590820190600101613906565b509495945050505050565b60008151808452613945816020860160208601613c10565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60007fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008660601b1682528385601484013750601492019182015260340192915050565b6000828483379101908152919050565b600083516139dc818460208801613c10565b8351908301906139f0818360208801613c10565b01949350505050565b60007f416363657373436f6e74726f6c3a206163636f756e742000000000000000000082528351613a31816017850160208801613c10565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351613a6e816028840160208801613c10565b01602801949350505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a06040830152613ab360a08301866138f3565b8281036060840152613ac581866138f3565b90508281036080840152613ad9818561392d565b98975050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015283606083015260a06080830152613b2a60a083018461392d565b979650505050505050565b600060208252612e7e60208301846138f3565b600060408252613b5b60408301856138f3565b828103602084015261324f81856138f3565b600060208252612e7e602083018461392d565b600067ffffffffffffffff821115613b9a57613b9a613d7c565b5060051b60200190565b60008219821115613bb757613bb7613d4d565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613bf457613bf4613d4d565b500290565b600082821015613c0b57613c0b613d4d565b500390565b60005b83811015613c2b578181015183820152602001613c13565b83811115613c3a576000848401525b50505050565b600081613c4f57613c4f613d4d565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600181811c90821680613c8957607f821691505b60208210811415613cc3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116810181811067ffffffffffffffff82111715613d0d57613d0d613d7c565b6040525050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d4657613d46613d4d565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d111561196657600481823e5160e01c90565b600060443d1015613dd257611966565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc803d016004833e81513d67ffffffffffffffff8160248401118184111715613e22575050505050611966565b8285019150815181811115613e3c57505050505050611966565b843d8701016020828501011115613e5857505050505050611966565b613e6760208286010187613cc9565b509094505050505090565b73ffffffffffffffffffffffffffffffffffffffff81168114613e9457600080fd5b50565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114613e9457600080fdfea2646970667358221220e5ccbc6de4296570de31e184ae4dc0062728749c4f10d4e865b8042950186aaa64736f6c63430008030033a2646970667358221220a3837d28d730d274d8a2b9e5e59d55e7ea5aa07d092b640fbafa16de55a2e78064736f6c6343000803003300000000000000000000000047fa238493bb300bf12930e1f2d41ab81982fcb1
Deployed Bytecode
0x60806040523480156200001157600080fd5b5060043610620000dc5760003560e01c806391d14854116200008d578063ce9e4dc41162000063578063ce9e4dc414620001e3578063d2f7265a14620001fa578063d547741f146200024157620000dc565b806391d148541462000189578063a1ebf35d14620001d0578063a217fddf14620001da57620000dc565b80632f2ff15d11620000c35780632f2ff15d146200014257806336568abe146200015b57806367b1f5df146200017257620000dc565b806301ffc9a714620000e1578063248a9ca3146200010d575b600080fd5b620000f8620000f236600462001094565b62000258565b60405190151581526020015b60405180910390f35b620001336200011e3660046200104d565b60009081526020819052604090206001015490565b60405190815260200162000104565b620001596200015336600462001066565b620002f4565b005b620001596200016c36600462001066565b62000324565b620001596200018336600462001030565b620003df565b620000f86200019a36600462001066565b60009182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b6200013360025481565b62000133600081565b62000159620001f4366004620010d6565b6200049b565b6001546200021b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200162000104565b620001596200025236600462001066565b6200053d565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b000000000000000000000000000000000000000000000000000000001480620002ec57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b90505b919050565b6000828152602081905260409020600101546200031381335b62000567565b6200031f838362000640565b505050565b73ffffffffffffffffffffffffffffffffffffffff81163314620003cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b620003db828262000732565b5050565b620003ec6000336200019a565b62000454576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f466163746f72793a204f6e6c792061646d696e20616c6c6f77656400000000006044820152606401620003c6565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b620004a8838383620007ea565b60008484604051620004ba9062000fb3565b620004c7929190620012cc565b604051809103906000f080158015620004e4573d6000803e3d6000fd5b5060405173ffffffffffffffffffffffffffffffffffffffff8083168252919250908516907fe9a3e4d9ebecd74fe75a0328c3c63709d481aebfaa856b77348933ab9e623e719060200160405180910390a25050505050565b6000828152602081905260409020600101546200055b81336200030d565b6200031f838362000732565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16620003db57620005c08173ffffffffffffffffffffffffffffffffffffffff16601462000942565b620005cd83602062000942565b604051602001620005e092919062001232565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a0000000000000000000000000000000000000000000000000000000008252620003c691600401620012b7565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16620003db5760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055620006d43390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1615620003db5760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b16602082015260009062000877906034016040516020818303038152906040528051906020012084848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525062000c6392505050565b60025460009081526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205490915060ff166200093c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f466163746f7279457263313135353a205369676e65722073686f756c6420736960448201527f676e207472616e73616374696f6e0000000000000000000000000000000000006064820152608401620003c6565b50505050565b606060006200095383600262001321565b6200096090600262001306565b67ffffffffffffffff811115620009a0577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015620009cb576020820181803683370190505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811062000a2a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811062000ab5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600062000af384600262001321565b62000b0090600162001306565b90505b600181111562000bf1577f303132333435363738396162636465660000000000000000000000000000000085600f166010811062000b6a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b82828151811062000ba8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c9362000be98162001390565b905062000b03565b50831562000c5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401620003c6565b9392505050565b60008060008084516041141562000c8f5750505060208201516040830151606084015160001a62000d3b565b84516040141562000cd85750505060408201516020830151907f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81169060ff1c601b0162000d3b565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401620003c6565b62000d498682858562000d53565b9695505050505050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a082111562000e07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401620003c6565b8360ff16601b148062000e1d57508360ff16601c145b62000eab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401620003c6565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa15801562000f00573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811662000faa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401620003c6565b95945050505050565b61429b806200142783390190565b803573ffffffffffffffffffffffffffffffffffffffff81168114620002ef57600080fd5b60008083601f84011262000ff8578182fd5b50813567ffffffffffffffff81111562001010578182fd5b6020830191508360208285010111156200102957600080fd5b9250929050565b60006020828403121562001042578081fd5b62000c5c8262000fc1565b6000602082840312156200105f578081fd5b5035919050565b6000806040838503121562001079578081fd5b823591506200108b6020840162000fc1565b90509250929050565b600060208284031215620010a6578081fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811462000c5c578182fd5b60008060008060608587031215620010ec578182fd5b843567ffffffffffffffff8082111562001104578384fd5b818701915087601f83011262001118578384fd5b8135818111156200112d576200112d620013f7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715620011765762001176620013f7565b816040528281528a60208487010111156200118f578687fd5b826020860160208301378660208483010152809850505050620011b56020880162000fc1565b94506040870135915080821115620011cb578384fd5b50620011da8782880162000fe6565b95989497509550505050565b600081518084526200120081602086016020860162001361565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60007f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000825283516200126c81601785016020880162001361565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351620012ab81602884016020880162001361565b01602801949350505050565b60006020825262000c5c6020830184620011e6565b600060408252620012e16040830185620011e6565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b600082198211156200131c576200131c620013c8565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156200135c576200135c620013c8565b500290565b60005b838110156200137e57818101518382015260200162001364565b838111156200093c5750506000910152565b600081620013a257620013a2620013c8565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fdfe60806040527fe2f4eaae4a9751e85a3e4a7b9587827a877f29914755229b07a7b2da98285f706007553480156200003557600080fd5b506040516200429b3803806200429b833981016040819052620000589162000252565b6040805160208101909152600081526200007281620000b4565b50600880546001600160a01b031916331790556200009082620000cd565b6200009d600082620000e2565b600754620000ac9082620000e2565b505062000390565b8051620000c99060029060208401906200018f565b5050565b8051620000c99060039060208401906200018f565b60008281526006602090815260408083206001600160a01b0385168452909152902054620000c9908390839060ff16620000c95760008281526006602090815260408083206001600160a01b03851684529091529020805460ff191660011790556200014b3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b8280546200019d906200033d565b90600052602060002090601f016020900481019282620001c157600085556200020c565b82601f10620001dc57805160ff19168380011785556200020c565b828001600101855582156200020c579182015b828111156200020c578251825591602001919060010190620001ef565b506200021a9291506200021e565b5090565b5b808211156200021a57600081556001016200021f565b80516001600160a01b03811681146200024d57600080fd5b919050565b6000806040838503121562000265578182fd5b82516001600160401b03808211156200027c578384fd5b818501915085601f83011262000290578384fd5b815181811115620002a557620002a56200037a565b604051601f8201601f19908116603f01168101908382118183101715620002d057620002d06200037a565b81604052828152602093508884848701011115620002ec578687fd5b8691505b828210156200030f5784820184015181830185015290830190620002f0565b828211156200032057868484830101525b95506200033291505085820162000235565b925050509250929050565b600181811c908216806200035257607f821691505b602082108114156200037457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b613efb80620003a06000396000f3fe608060405234801561001057600080fd5b50600436106101765760003560e01c806391d14854116100d8578063c45a01551161008c578063e985e9c511610066578063e985e9c514610370578063f242432a146103b9578063f5298aca146103cc57610176565b8063c45a015514610305578063c87b56dd1461034a578063d547741f1461035d57610176565b8063a217fddf116100bd578063a217fddf146102d7578063a22cb465146102df578063beb76f5f146102f257610176565b806391d1485414610288578063a1ebf35d146102ce57610176565b80632f2ff15d1161012f5780634e1273f4116101145780634e1273f4146102425780636b20c45414610262578063785cc9971461027557610176565b80632f2ff15d1461021c57806336568abe1461022f57610176565b80630e89341c116101605780630e89341c146101c4578063248a9ca3146101e45780632eb2c2d61461020757610176565b8062fdd58e1461017b57806301ffc9a7146101a1575b600080fd5b61018e610189366004613642565b6103df565b6040519081526020015b60405180910390f35b6101b46101af3660046137aa565b6104bc565b6040519015158152602001610198565b6101d76101d236600461376e565b6104de565b6040516101989190613b6d565b61018e6101f236600461376e565b60009081526006602052604090206001015490565b61021a61021536600461348d565b610572565b005b61021a61022a366004613786565b610a4b565b61021a61023d366004613786565b610a7d565b6102556102503660046136a1565b610b4d565b6040516101989190613b35565b61021a61027036600461359e565b610d41565b61021a6102833660046137e2565b610e20565b6101b4610296366004613786565b600091825260066020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b61018e60075481565b61018e600081565b61021a6102ed366004613611565b611065565b61021a610300366004613859565b6111f9565b6008546103259073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610198565b6101d761035836600461376e565b6113f9565b61021a61036b366004613786565b611404565b6101b461037e366004613455565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b61021a6103c7366004613537565b61142c565b61021a6103da36600461366d565b61174c565b600073ffffffffffffffffffffffffffffffffffffffff8316610489576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201527f65726f206164647265737300000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526020818152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052205490565b60006104c78261182b565b806104d657506104d68261190e565b90505b919050565b6060600280546104ed90613c75565b80601f016020809104026020016040519081016040528092919081815260200182805461051990613c75565b80156105665780601f1061053b57610100808354040283529160200191610566565b820191906000526020600020905b81548152906001019060200180831161054957829003601f168201915b50505050509050919050565b8151835114610603576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d617463680000000000000000000000000000000000000000000000006064820152608401610480565b73ffffffffffffffffffffffffffffffffffffffff84166106a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610480565b6106ae611964565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806106ee57506106ee8561037e611964565b61077a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006064820152608401610480565b6000610784611964565b905060005b84518110156109b65760008582815181106107cd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000858381518110610812577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020908102919091018101516000848152808352604080822073ffffffffffffffffffffffffffffffffffffffff8e1683529093529190912054909150818110156108df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610480565b6108e98282613bf9565b60008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461099b9190613ba4565b92505081905550505050806109af90613d14565b9050610789565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610a2d929190613b48565b60405180910390a4610a43818787878787611969565b505050505050565b600082815260066020526040902060010154610a6e81610a69611964565b611c03565b610a788383611cd5565b505050565b610a85611964565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b3f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610480565b610b498282611dca565b5050565b60608151835114610be0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d6174636800000000000000000000000000000000000000000000006064820152608401610480565b6000835167ffffffffffffffff811115610c23577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610c4c578160200160208202803683370190505b50905060005b8451811015610d3957610ce5858281518110610c97577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151858381518110610cd8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516103df565b828281518110610d1e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020908102919091010152610d3281613d14565b9050610c52565b509392505050565b610d49611964565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610d895750610d898361037e611964565b610e15576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f76656400000000000000000000000000000000000000000000006064820152608401610480565b610a78838383611ebd565b610e2d848487858561223b565b600a8484604051610e3f9291906139ba565b9081526040519081900360200190205460ff1615610eb9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f455243313135354d61696e3a2055524920616c726561647920657869737473006044820152606401610480565b6009805460009182610eca83613d14565b919050559050610ef2610edb611964565b82886040518060200160405280600081525061236e565b600854604080517fd2f7265a0000000000000000000000000000000000000000000000000000000081529051610f9d9273ffffffffffffffffffffffffffffffffffffffff169163d2f7265a916004808301926020929190829003018186803b158015610f5e57600080fd5b505afa158015610f72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f969190613439565b6001611065565b610fda81600090815260056020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6001600a8686604051610fee9291906139ba565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001694151594909417909355601f87018290048202830182019052858252610a4391839188908890819084018382808284376000920191909152506124d792505050565b8173ffffffffffffffffffffffffffffffffffffffff16611084611964565b73ffffffffffffffffffffffffffffffffffffffff161415611128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c6600000000000000000000000000000000000000000000006064820152608401610480565b8060016000611135611964565b73ffffffffffffffffffffffffffffffffffffffff90811682526020808301939093526040918201600090812091871680825291909352912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016921515929092179091556111a4611964565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111ed911515815260200190565b60405180910390a35050565b611206858588858561223b565b600a85856040516112189291906139ba565b9081526040519081900360200190205460ff1615611292576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f455243313135354d61696e3a2055524920616c726561647920657869737473006044820152606401610480565b60098054600091826112a383613d14565b9190505590506112bc6112b4611964565b82898761236e565b600854604080517fd2f7265a00000000000000000000000000000000000000000000000000000000815290516113289273ffffffffffffffffffffffffffffffffffffffff169163d2f7265a916004808301926020929190829003018186803b158015610f5e57600080fd5b61136581600090815260056020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6001600a87876040516113799291906139ba565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001694151594909417909355601f880182900482028301820190528682526113f091839189908990819084018382808284376000920191909152506124d792505050565b50505050505050565b60606104d682612594565b60008281526006602052604090206001015461142281610a69611964565b610a788383611dca565b73ffffffffffffffffffffffffffffffffffffffff84166114cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610480565b6114d7611964565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061151757506115178561037e611964565b6115a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f76656400000000000000000000000000000000000000000000006064820152608401610480565b60006115ad611964565b90506115ce8187876115be8861272f565b6115c78861272f565b5050505050565b60008481526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8a1684529091529020548381101561168c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610480565b6116968482613bf9565b60008681526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8c811685529252808320939093558816815290812080548692906116df908490613ba4565b9091555050604080518681526020810186905273ffffffffffffffffffffffffffffffffffffffff808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46113f08288888888886127a1565b611754611964565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061179457506117948361037e611964565b611820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f76656400000000000000000000000000000000000000000000006064820152608401610480565b610a7883838361295d565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a260000000000000000000000000000000000000000000000000000000014806118be57507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b806104d657507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146104d6565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806104d657506104d68261182b565b335b90565b73ffffffffffffffffffffffffffffffffffffffff84163b15610a43576040517fbc197c8100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063bc197c81906119e09089908990889088908890600401613a7a565b602060405180830381600087803b1580156119fa57600080fd5b505af1925050508015611a48575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611a45918101906137c6565b60015b611b3257611a54613dab565b806308c379a01415611aa85750611a69613dc2565b80611a745750611aaa565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104809190613b6d565b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e7465720000000000000000000000006064820152608401610480565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c8100000000000000000000000000000000000000000000000000000000146113f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610480565b600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610b4957611c5b8173ffffffffffffffffffffffffffffffffffffffff166014612b78565b611c66836020612b78565b604051602001611c779291906139f9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a000000000000000000000000000000000000000000000000000000000825261048091600401613b6d565b600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610b4957600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055611d6c611964565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1615610b4957600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055611e5f611964565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b73ffffffffffffffffffffffffffffffffffffffff8316611f60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610480565b8051825114611ff1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d617463680000000000000000000000000000000000000000000000006064820152608401610480565b6000611ffb611964565b604080516020810190915260009052905060005b83518110156121b5576000848281518110612053577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000848381518110612098577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020908102919091018101516000848152808352604080822073ffffffffffffffffffffffffffffffffffffffff8c168352909352919091205490915081811015612164576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c60448201527f616e6365000000000000000000000000000000000000000000000000000000006064820152608401610480565b61216e8282613bf9565b60009384526020848152604080862073ffffffffffffffffffffffffffffffffffffffff8c16875290915290932092909255508190506121ad81613d14565b91505061200f565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868660405161222d929190613b48565b60405180910390a450505050565b60006122a9308787876040516020016122579493929190613977565b6040516020818303038152906040528051906020012084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612e8592505050565b600754600090815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205490915060ff16610a43576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f455243313135354d61696e3a205369676e65722073686f756c64207369676e2060448201527f7472616e73616374696f6e0000000000000000000000000000000000000000006064820152608401610480565b73ffffffffffffffffffffffffffffffffffffffff8416612411576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610480565b600061241b611964565b905061242d816000876115be8861272f565b60008481526020818152604080832073ffffffffffffffffffffffffffffffffffffffff891684529091528120805485929061246a908490613ba4565b9091555050604080518581526020810185905273ffffffffffffffffffffffffffffffffffffffff80881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46115c7816000878787876127a1565b60008281526005602052604090205460ff16612575576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4552433131353555524953746f726167653a2055524920736574206f66206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610480565b60008281526004602090815260409091208251610a7892840190613258565b60008181526005602052604090205460609060ff16612635576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433131353555524953746f726167653a2055524920717565727920666f7260448201527f206e6f6e6578697374656e7420746f6b656e00000000000000000000000000006064820152608401610480565b6000828152600460205260408120805461264e90613c75565b80601f016020809104026020016040519081016040528092919081815260200182805461267a90613c75565b80156126c75780601f1061269c576101008083540402835291602001916126c7565b820191906000526020600020905b8154815290600101906020018083116126aa57829003601f168201915b5050505050905060006126d8612f6e565b90508051600014156126ec575090506104d9565b81511561271e5780826040516020016127069291906139ca565b604051602081830303815290604052925050506104d9565b612727846104de565b949350505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110612790577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602090810291909101015292915050565b73ffffffffffffffffffffffffffffffffffffffff84163b15610a43576040517ff23a6e6100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063f23a6e61906128189089908990889088908890600401613ae5565b602060405180830381600087803b15801561283257600080fd5b505af1925050508015612880575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261287d918101906137c6565b60015b61288c57611a54613dab565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e6100000000000000000000000000000000000000000000000000000000146113f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610480565b73ffffffffffffffffffffffffffffffffffffffff8316612a00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610480565b6000612a0a611964565b9050612a3b81856000612a1c8761272f565b612a258761272f565b5050604080516020810190915260009052505050565b60008381526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8816845290915290205482811015612af8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c60448201527f616e6365000000000000000000000000000000000000000000000000000000006064820152608401610480565b612b028382613bf9565b60008581526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8a811680865291845282852095909555815189815292830188905292938616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b60606000612b87836002613bbc565b612b92906002613ba4565b67ffffffffffffffff811115612bd1577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612bfb576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612c59577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612ce3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000612d1f846002613bbc565b612d2a906001613ba4565b90505b6001811115612e15577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110612d92577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b828281518110612dcf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c93612e0e81613c40565b9050612d2d565b508315612e7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610480565b9392505050565b600080600080845160411415612eaf5750505060208201516040830151606084015160001a612f58565b845160401415612ef65750505060408201516020830151907f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81169060ff1c601b01612f58565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610480565b612f6486828585613000565b9695505050505050565b606060038054612f7d90613c75565b80601f0160208091040260200160405190810160405280929190818152602001828054612fa990613c75565b8015612ff65780601f10612fcb57610100808354040283529160200191612ff6565b820191906000526020600020905b815481529060010190602001808311612fd957829003601f168201915b5050505050905090565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156130b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610480565b8360ff16601b14806130c757508360ff16601c145b613153576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610480565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa1580156131a7573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811661324f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610480565b95945050505050565b82805461326490613c75565b90600052602060002090601f01602090048101928261328657600085556132cc565b82601f1061329f57805160ff19168380011785556132cc565b828001600101855582156132cc579182015b828111156132cc5782518255916020019190600101906132b1565b506132d89291506132dc565b5090565b5b808211156132d857600081556001016132dd565b600082601f830112613301578081fd5b8135602061330e82613b80565b60405161331b8282613cc9565b8381528281019150858301600585901b8701840188101561333a578586fd5b855b858110156133585781358452928401929084019060010161333c565b5090979650505050505050565b60008083601f840112613376578182fd5b50813567ffffffffffffffff81111561338d578182fd5b6020830191508360208285010111156133a557600080fd5b9250929050565b600082601f8301126133bc578081fd5b813567ffffffffffffffff8111156133d6576133d6613d7c565b60405161340b60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160182613cc9565b81815284602083860101111561341f578283fd5b816020850160208301379081016020019190915292915050565b60006020828403121561344a578081fd5b8151612e7e81613e72565b60008060408385031215613467578081fd5b823561347281613e72565b9150602083013561348281613e72565b809150509250929050565b600080600080600060a086880312156134a4578081fd5b85356134af81613e72565b945060208601356134bf81613e72565b9350604086013567ffffffffffffffff808211156134db578283fd5b6134e789838a016132f1565b945060608801359150808211156134fc578283fd5b61350889838a016132f1565b9350608088013591508082111561351d578283fd5b5061352a888289016133ac565b9150509295509295909350565b600080600080600060a0868803121561354e578081fd5b853561355981613e72565b9450602086013561356981613e72565b93506040860135925060608601359150608086013567ffffffffffffffff811115613592578182fd5b61352a888289016133ac565b6000806000606084860312156135b2578283fd5b83356135bd81613e72565b9250602084013567ffffffffffffffff808211156135d9578384fd5b6135e5878388016132f1565b935060408601359150808211156135fa578283fd5b50613607868287016132f1565b9150509250925092565b60008060408385031215613623578182fd5b823561362e81613e72565b915060208301358015158114613482578182fd5b60008060408385031215613654578182fd5b823561365f81613e72565b946020939093013593505050565b600080600060608486031215613681578081fd5b833561368c81613e72565b95602085013595506040909401359392505050565b600080604083850312156136b3578182fd5b823567ffffffffffffffff808211156136ca578384fd5b818501915085601f8301126136dd578384fd5b813560206136ea82613b80565b6040516136f78282613cc9565b8381528281019150858301600585901b870184018b1015613716578889fd5b8896505b8487101561374157803561372d81613e72565b83526001969096019591830191830161371a565b5096505086013592505080821115613757578283fd5b50613764858286016132f1565b9150509250929050565b60006020828403121561377f578081fd5b5035919050565b60008060408385031215613798578182fd5b82359150602083013561348281613e72565b6000602082840312156137bb578081fd5b8135612e7e81613e97565b6000602082840312156137d7578081fd5b8151612e7e81613e97565b6000806000806000606086880312156137f9578283fd5b85359450602086013567ffffffffffffffff80821115613817578485fd5b61382389838a01613365565b9096509450604088013591508082111561383b578283fd5b5061384888828901613365565b969995985093965092949392505050565b60008060008060008060808789031215613871578384fd5b86359550602087013567ffffffffffffffff8082111561388f578586fd5b61389b8a838b01613365565b909750955060408901359150808211156138b3578283fd5b6138bf8a838b016133ac565b945060608901359150808211156138d4578283fd5b506138e189828a01613365565b979a9699509497509295939492505050565b6000815180845260208085019450808401835b8381101561392257815187529582019590820190600101613906565b509495945050505050565b60008151808452613945816020860160208601613c10565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60007fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008660601b1682528385601484013750601492019182015260340192915050565b6000828483379101908152919050565b600083516139dc818460208801613c10565b8351908301906139f0818360208801613c10565b01949350505050565b60007f416363657373436f6e74726f6c3a206163636f756e742000000000000000000082528351613a31816017850160208801613c10565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351613a6e816028840160208801613c10565b01602801949350505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a06040830152613ab360a08301866138f3565b8281036060840152613ac581866138f3565b90508281036080840152613ad9818561392d565b98975050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015283606083015260a06080830152613b2a60a083018461392d565b979650505050505050565b600060208252612e7e60208301846138f3565b600060408252613b5b60408301856138f3565b828103602084015261324f81856138f3565b600060208252612e7e602083018461392d565b600067ffffffffffffffff821115613b9a57613b9a613d7c565b5060051b60200190565b60008219821115613bb757613bb7613d4d565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613bf457613bf4613d4d565b500290565b600082821015613c0b57613c0b613d4d565b500390565b60005b83811015613c2b578181015183820152602001613c13565b83811115613c3a576000848401525b50505050565b600081613c4f57613c4f613d4d565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600181811c90821680613c8957607f821691505b60208210811415613cc3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116810181811067ffffffffffffffff82111715613d0d57613d0d613d7c565b6040525050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d4657613d46613d4d565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d111561196657600481823e5160e01c90565b600060443d1015613dd257611966565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc803d016004833e81513d67ffffffffffffffff8160248401118184111715613e22575050505050611966565b8285019150815181811115613e3c57505050505050611966565b843d8701016020828501011115613e5857505050505050611966565b613e6760208286010187613cc9565b509094505050505090565b73ffffffffffffffffffffffffffffffffffffffff81168114613e9457600080fd5b50565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114613e9457600080fdfea2646970667358221220e5ccbc6de4296570de31e184ae4dc0062728749c4f10d4e865b8042950186aaa64736f6c63430008030033a2646970667358221220a3837d28d730d274d8a2b9e5e59d55e7ea5aa07d092b640fbafa16de55a2e78064736f6c63430008030033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000047fa238493bb300bf12930e1f2d41ab81982fcb1
-----Decoded View---------------
Arg [0] : _exchange (address): 0x47fa238493bB300BF12930e1F2D41aB81982fcB1
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000047fa238493bb300bf12930e1f2d41ab81982fcb1
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.