Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 150 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Set Approval For... | 22069663 | 375 days ago | IN | 0 ETH | 0.00001977 | ||||
| Safe Transfer Fr... | 21143172 | 505 days ago | IN | 0 ETH | 0.00108772 | ||||
| Set Approval For... | 21111145 | 509 days ago | IN | 0 ETH | 0.00014063 | ||||
| Set Approval For... | 20941584 | 533 days ago | IN | 0 ETH | 0.00065828 | ||||
| Claim | 20776767 | 556 days ago | IN | 0 ETH | 0.0010362 | ||||
| Claim | 20776710 | 556 days ago | IN | 0 ETH | 0.00134443 | ||||
| Set Approval For... | 20647658 | 574 days ago | IN | 0 ETH | 0.00005511 | ||||
| Safe Transfer Fr... | 20580625 | 583 days ago | IN | 0 ETH | 0.00005637 | ||||
| Claim | 20580601 | 583 days ago | IN | 0 ETH | 0.00034112 | ||||
| Claim | 20109535 | 649 days ago | IN | 0 ETH | 0.00052376 | ||||
| Claim | 19823302 | 689 days ago | IN | 0 ETH | 0.00039989 | ||||
| Claim | 19814866 | 690 days ago | IN | 0 ETH | 0.00034885 | ||||
| Claim | 19667433 | 711 days ago | IN | 0 ETH | 0.00147031 | ||||
| Set Approval For... | 19511312 | 733 days ago | IN | 0 ETH | 0.00084301 | ||||
| Claim | 19189179 | 778 days ago | IN | 0 ETH | 0.00451822 | ||||
| Set Approval For... | 18962144 | 810 days ago | IN | 0 ETH | 0.00069827 | ||||
| Claim | 18601252 | 860 days ago | IN | 0 ETH | 0.00194383 | ||||
| Claim | 18601245 | 860 days ago | IN | 0 ETH | 0.00207838 | ||||
| Claim | 18589292 | 862 days ago | IN | 0 ETH | 0.00202363 | ||||
| Claim | 18514102 | 872 days ago | IN | 0 ETH | 0.00415488 | ||||
| Claim | 18440520 | 883 days ago | IN | 0 ETH | 0.00176937 | ||||
| Claim | 18356552 | 895 days ago | IN | 0 ETH | 0.00106845 | ||||
| Claim | 18351642 | 895 days ago | IN | 0 ETH | 0.00077544 | ||||
| Claim | 18239634 | 911 days ago | IN | 0 ETH | 0.00084083 | ||||
| Claim | 18071210 | 935 days ago | IN | 0 ETH | 0.00283346 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
LPFStore
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
/*
_ ______ _______ ______
(_) (_____ (_______) _____)
_ _____) )____ ( (____
| | | ____/ ___) \____ \
| |_____| | | | _____) )
|_______)_| |_| (______/
LPF Store. All Rights Reserved 2022
Developed by ATOMICON.PRO ([email protected])
*/
import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";
import "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
contract LPFStore is ERC1155, Ownable, ERC1155Supply {
using ECDSA for bytes32;
struct Order {
bytes32 hash;
bytes signature;
address buyer;
uint256 tokenId;
uint64 quantity;
bytes16 orderIdHash;
uint64 validityLimit;
}
struct TokenData {
string uri;
uint64 maxSupply;
}
event OrderComplete(address buyer, uint256 tokenId, uint64 quantity, bytes16 orderIdHash);
/// @dev Data of each token ID
mapping(uint256 => TokenData) private _tokenData;
bytes8 constant private _hashSalt = 0x00000000e2b07ad3;
address constant private _signerAddress = 0xC783A70A08922Df8EB023061d4a034552F906273;
// Used nonces for minting signatures
mapping(bytes16 => bool) private _usedOrderIds;
constructor() ERC1155("") {}
/// @notice Mint a bought token.
function claim(Order memory order)
external
{
require(bytes(uri(order.tokenId)).length != 0, "A token with this ID does not exist.");
require(totalSupply(order.tokenId) + order.quantity <= _tokenData[order.tokenId].maxSupply, "Reached max supply.");
require(_operationHash(order) == order.hash, "Hash comparison failed.");
require(_isTrustedSigner(order.hash, order.signature), "Untrusted signature provided.");
require(order.validityLimit > block.timestamp, "Order has already expired.");
require(!_usedOrderIds[order.orderIdHash], "The order ID has already been used.");
_usedOrderIds[order.orderIdHash] = true;
_mint(order.buyer, order.tokenId, order.quantity, "");
emit OrderComplete(msg.sender, order.tokenId, order.quantity, order.orderIdHash);
}
/// @dev Generate hash of current mint operation
function _operationHash(Order memory order) internal view returns (bytes32) {
return keccak256(abi.encodePacked(
_hashSalt,
order.buyer,
uint64(block.chainid),
order.tokenId,
order.quantity,
order.orderIdHash,
order.validityLimit
));
}
/// @dev Test whether a message was signed by a trusted address
function _isTrustedSigner(bytes32 hash, bytes memory signature) internal pure returns(bool) {
return _signerAddress == ECDSA.recover(hash, signature);
}
/// @notice Set data of a specific token ID
function setTokenData(uint256 tokenId, TokenData memory newTokenData)
external
onlyOwner
{
require(totalSupply(tokenId) <= newTokenData.maxSupply, "Can not reduce max supply below total supply");
_tokenData[tokenId] = newTokenData;
emit URI(newTokenData.uri, tokenId);
}
/// @notice URI with metadata of each token with a given id
function uri(uint256 tokenId) public view virtual override returns (string memory) {
return _tokenData[tokenId].uri;
}
/// @notice Max supply of each token with a given id
function maxSupply(uint256 tokenId) public view returns (uint64) {
return _tokenData[tokenId].maxSupply;
}
/// @notice URI with contract metadata for opensea
function contractURI() public pure returns (string memory) {
return "ipfs://QmdXT25azWAhEXqU12rNEczNpednTKhqom6bD8Z4XNBEd6";
}
function _beforeTokenTransfer(address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data)
internal
override(ERC1155, ERC1155Supply)
{
super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)
pragma solidity ^0.8.0;
import "../Strings.sol";
/**
* @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 {
enum RecoverError {
NoError,
InvalidSignature,
InvalidSignatureLength,
InvalidSignatureS,
InvalidSignatureV
}
function _throwError(RecoverError error) private pure {
if (error == RecoverError.NoError) {
return; // no error: do nothing
} else if (error == RecoverError.InvalidSignature) {
revert("ECDSA: invalid signature");
} else if (error == RecoverError.InvalidSignatureLength) {
revert("ECDSA: invalid signature length");
} else if (error == RecoverError.InvalidSignatureS) {
revert("ECDSA: invalid signature 's' value");
} else if (error == RecoverError.InvalidSignatureV) {
revert("ECDSA: invalid signature 'v' value");
}
}
/**
* @dev Returns the address that signed a hashed message (`hash`) with
* `signature` or error string. 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.
*
* Documentation for signature generation:
* - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
* - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
*
* _Available since v4.3._
*/
function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
if (signature.length == 65) {
bytes32 r;
bytes32 s;
uint8 v;
// ecrecover takes the signature parameters, and the only way to get them
// currently is to use assembly.
/// @solidity memory-safe-assembly
assembly {
r := mload(add(signature, 0x20))
s := mload(add(signature, 0x40))
v := byte(0, mload(add(signature, 0x60)))
}
return tryRecover(hash, v, r, s);
} else {
return (address(0), RecoverError.InvalidSignatureLength);
}
}
/**
* @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) {
(address recovered, RecoverError error) = tryRecover(hash, signature);
_throwError(error);
return recovered;
}
/**
* @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
*
* See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
*
* _Available since v4.3._
*/
function tryRecover(
bytes32 hash,
bytes32 r,
bytes32 vs
) internal pure returns (address, RecoverError) {
bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
uint8 v = uint8((uint256(vs) >> 255) + 27);
return tryRecover(hash, v, r, s);
}
/**
* @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
*
* _Available since v4.2._
*/
function recover(
bytes32 hash,
bytes32 r,
bytes32 vs
) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, r, vs);
_throwError(error);
return recovered;
}
/**
* @dev Overload of {ECDSA-tryRecover} that receives the `v`,
* `r` and `s` signature fields separately.
*
* _Available since v4.3._
*/
function tryRecover(
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address, RecoverError) {
// 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 (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): 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.
if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
return (address(0), RecoverError.InvalidSignatureS);
}
if (v != 27 && v != 28) {
return (address(0), RecoverError.InvalidSignatureV);
}
// If the signature is valid (and not malleable), return the signer address
address signer = ecrecover(hash, v, r, s);
if (signer == address(0)) {
return (address(0), RecoverError.InvalidSignature);
}
return (signer, RecoverError.NoError);
}
/**
* @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) {
(address recovered, RecoverError error) = tryRecover(hash, v, r, s);
_throwError(error);
return recovered;
}
/**
* @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 Message, created from `s`. 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(bytes memory s) internal pure returns (bytes32) {
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
}
/**
* @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
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155Supply.sol)
pragma solidity ^0.8.0;
import "../ERC1155.sol";
/**
* @dev Extension of ERC1155 that adds tracking of total supply per id.
*
* Useful for scenarios where Fungible and Non-fungible tokens have to be
* clearly identified. Note: While a totalSupply of 1 might mean the
* corresponding is an NFT, there is no guarantees that no other token with the
* same id are not going to be minted.
*/
abstract contract ERC1155Supply is ERC1155 {
mapping(uint256 => uint256) private _totalSupply;
/**
* @dev Total amount of tokens in with a given id.
*/
function totalSupply(uint256 id) public view virtual returns (uint256) {
return _totalSupply[id];
}
/**
* @dev Indicates whether any token exist with a given id, or not.
*/
function exists(uint256 id) public view virtual returns (bool) {
return ERC1155Supply.totalSupply(id) > 0;
}
/**
* @dev See {ERC1155-_beforeTokenTransfer}.
*/
function _beforeTokenTransfer(
address operator,
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal virtual override {
super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
if (from == address(0)) {
for (uint256 i = 0; i < ids.length; ++i) {
_totalSupply[ids[i]] += amounts[i];
}
}
if (to == address(0)) {
for (uint256 i = 0; i < ids.length; ++i) {
uint256 id = ids[i];
uint256 amount = amounts[i];
uint256 supply = _totalSupply[id];
require(supply >= amount, "ERC1155: burn amount exceeds totalSupply");
unchecked {
_totalSupply[id] = supply - amount;
}
}
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/ERC1155.sol)
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: address zero is not a valid owner");
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 {
_setApprovalForAll(_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(
from == _msgSender() || isApprovedForAll(from, _msgSender()),
"ERC1155: caller is not token owner nor approved"
);
_safeTransferFrom(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(
from == _msgSender() || isApprovedForAll(from, _msgSender()),
"ERC1155: caller is not token owner nor approved"
);
_safeBatchTransferFrom(from, to, ids, amounts, data);
}
/**
* @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `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 memory data
) internal virtual {
require(to != address(0), "ERC1155: transfer to the zero address");
address operator = _msgSender();
uint256[] memory ids = _asSingletonArray(id);
uint256[] memory amounts = _asSingletonArray(amount);
_beforeTokenTransfer(operator, from, to, ids, amounts, data);
uint256 fromBalance = _balances[id][from];
require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
unchecked {
_balances[id][from] = fromBalance - amount;
}
_balances[id][to] += amount;
emit TransferSingle(operator, from, to, id, amount);
_afterTokenTransfer(operator, from, to, ids, amounts, data);
_doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
}
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
*
* Emits a {TransferBatch} event.
*
* Requirements:
*
* - 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[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal virtual {
require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
require(to != address(0), "ERC1155: transfer to the zero address");
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");
unchecked {
_balances[id][from] = fromBalance - amount;
}
_balances[id][to] += amount;
}
emit TransferBatch(operator, from, to, ids, amounts);
_afterTokenTransfer(operator, from, to, ids, amounts, data);
_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 `to`.
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
* acceptance magic value.
*/
function _mint(
address to,
uint256 id,
uint256 amount,
bytes memory data
) internal virtual {
require(to != address(0), "ERC1155: mint to the zero address");
address operator = _msgSender();
uint256[] memory ids = _asSingletonArray(id);
uint256[] memory amounts = _asSingletonArray(amount);
_beforeTokenTransfer(operator, address(0), to, ids, amounts, data);
_balances[id][to] += amount;
emit TransferSingle(operator, address(0), to, id, amount);
_afterTokenTransfer(operator, address(0), to, ids, amounts, data);
_doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
}
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
*
* 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 _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 (uint256 i = 0; i < ids.length; i++) {
_balances[ids[i]][to] += amounts[i];
}
emit TransferBatch(operator, address(0), to, ids, amounts);
_afterTokenTransfer(operator, address(0), to, ids, amounts, data);
_doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
}
/**
* @dev Destroys `amount` tokens of token type `id` from `from`
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `from` must have at least `amount` tokens of token type `id`.
*/
function _burn(
address from,
uint256 id,
uint256 amount
) internal virtual {
require(from != address(0), "ERC1155: burn from the zero address");
address operator = _msgSender();
uint256[] memory ids = _asSingletonArray(id);
uint256[] memory amounts = _asSingletonArray(amount);
_beforeTokenTransfer(operator, from, address(0), ids, amounts, "");
uint256 fromBalance = _balances[id][from];
require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
unchecked {
_balances[id][from] = fromBalance - amount;
}
emit TransferSingle(operator, from, address(0), id, amount);
_afterTokenTransfer(operator, from, address(0), ids, amounts, "");
}
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
*
* Emits a {TransferBatch} event.
*
* Requirements:
*
* - `ids` and `amounts` must have the same length.
*/
function _burnBatch(
address from,
uint256[] memory ids,
uint256[] memory amounts
) internal virtual {
require(from != address(0), "ERC1155: burn from the zero address");
require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
address operator = _msgSender();
_beforeTokenTransfer(operator, from, address(0), ids, amounts, "");
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: burn amount exceeds balance");
unchecked {
_balances[id][from] = fromBalance - amount;
}
}
emit TransferBatch(operator, from, address(0), ids, amounts);
_afterTokenTransfer(operator, from, address(0), ids, amounts, "");
}
/**
* @dev Approve `operator` to operate on all of `owner` tokens
*
* Emits an {ApprovalForAll} event.
*/
function _setApprovalForAll(
address owner,
address operator,
bool approved
) internal virtual {
require(owner != operator, "ERC1155: setting approval status for self");
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}
/**
* @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 `ids` and `amounts` 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 {}
/**
* @dev Hook that is called after 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 _afterTokenTransfer(
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.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.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
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// 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] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
/**
* @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
*/
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
import "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)
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
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)
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.
*
* NOTE: To accept the transfer, this must return
* `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
* (i.e. 0xf23a6e61, or its own function selector).
*
* @param operator The address which initiated the transfer (i.e. msg.sender)
* @param from The address which previously owned the token
* @param id The ID of the token being transferred
* @param value The amount of tokens being transferred
* @param data Additional data with no specified format
* @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
*/
function onERC1155Received(
address operator,
address from,
uint256 id,
uint256 value,
bytes calldata data
) external returns (bytes4);
/**
* @dev Handles the receipt of a multiple ERC1155 token types. This function
* is called at the end of a `safeBatchTransferFrom` after the balances have
* been updated.
*
* NOTE: To accept the transfer(s), this must return
* `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
* (i.e. 0xbc197c81, or its own function selector).
*
* @param operator The address which initiated the batch transfer (i.e. msg.sender)
* @param from The address which previously owned the token
* @param ids An array containing ids of each token being transferred (order and length must match values array)
* @param values An array containing amounts of each token being transferred (order and length must match ids array)
* @param data Additional data with no specified format
* @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
*/
function onERC1155BatchReceived(
address operator,
address from,
uint256[] calldata ids,
uint256[] calldata values,
bytes calldata data
) external returns (bytes4);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)
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 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
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}{
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"quantity","type":"uint64"},{"indexed":false,"internalType":"bytes16","name":"orderIdHash","type":"bytes16"}],"name":"OrderComplete","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint64","name":"quantity","type":"uint64"},{"internalType":"bytes16","name":"orderIdHash","type":"bytes16"},{"internalType":"uint64","name":"validityLimit","type":"uint64"}],"internalType":"struct LPFStore.Order","name":"order","type":"tuple"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"maxSupply","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"components":[{"internalType":"string","name":"uri","type":"string"},{"internalType":"uint64","name":"maxSupply","type":"uint64"}],"internalType":"struct LPFStore.TokenData","name":"newTokenData","type":"tuple"}],"name":"setTokenData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b506040518060200160405280600081525062000033816200005a60201b60201c565b5062000054620000486200006f60201b60201c565b6200007760201b60201c565b6200049e565b80600290816200006b9190620003b7565b5050565b600033905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620001bf57607f821691505b602082108103620001d557620001d462000177565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200023f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000200565b6200024b868362000200565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000298620002926200028c8462000263565b6200026d565b62000263565b9050919050565b6000819050919050565b620002b48362000277565b620002cc620002c3826200029f565b8484546200020d565b825550505050565b600090565b620002e3620002d4565b620002f0818484620002a9565b505050565b5b8181101562000318576200030c600082620002d9565b600181019050620002f6565b5050565b601f82111562000367576200033181620001db565b6200033c84620001f0565b810160208510156200034c578190505b620003646200035b85620001f0565b830182620002f5565b50505b505050565b600082821c905092915050565b60006200038c600019846008026200036c565b1980831691505092915050565b6000620003a7838362000379565b9150826002028217905092915050565b620003c2826200013d565b67ffffffffffffffff811115620003de57620003dd62000148565b5b620003ea8254620001a6565b620003f78282856200031c565b600060209050601f8311600181146200042f57600084156200041a578287015190505b62000426858262000399565b86555062000496565b601f1984166200043f86620001db565b60005b82811015620004695784890151825560018201915060208501945060208101905062000442565b8683101562000489578489015162000485601f89168262000379565b8355505b6001600288020188555050505b505050505050565b61459380620004ae6000396000f3fe608060405234801561001057600080fd5b506004361061010a5760003560e01c8063715018a6116100a2578063bd85b03911610071578063bd85b039146102c7578063e8a3d485146102f7578063e985e9c514610315578063f242432a14610345578063f2fde38b146103615761010a565b8063715018a614610253578063869f75941461025d5780638da5cb5b1461028d578063a22cb465146102ab5761010a565b80632eb2c2d6116100de5780632eb2c2d6146101bb57806342fd167b146101d75780634e1273f4146101f35780634f558e79146102235761010a565b8062fdd58e1461010f57806301ffc9a71461013f5780630e89341c1461016f5780632801d2171461019f575b600080fd5b610129600480360381019061012491906123c8565b61037d565b6040516101369190612417565b60405180910390f35b6101596004803603810190610154919061248a565b610445565b60405161016691906124d2565b60405180910390f35b610189600480360381019061018491906124ed565b610527565b60405161019691906125aa565b60405180910390f35b6101b960048036038101906101b491906128a9565b6105cf565b005b6101d560048036038101906101d091906129ba565b61090c565b005b6101f160048036038101906101ec9190612b96565b6109ad565b005b61020d60048036038101906102089190612cb5565b610aaa565b60405161021a9190612deb565b60405180910390f35b61023d600480360381019061023891906124ed565b610bc3565b60405161024a91906124d2565b60405180910390f35b61025b610bd7565b005b610277600480360381019061027291906124ed565b610beb565b6040516102849190612e1c565b60405180910390f35b610295610c1f565b6040516102a29190612e46565b60405180910390f35b6102c560048036038101906102c09190612e8d565b610c49565b005b6102e160048036038101906102dc91906124ed565b610c5f565b6040516102ee9190612417565b60405180910390f35b6102ff610c7c565b60405161030c91906125aa565b60405180910390f35b61032f600480360381019061032a9190612ecd565b610c9c565b60405161033c91906124d2565b60405180910390f35b61035f600480360381019061035a9190612f0d565b610d30565b005b61037b60048036038101906103769190612fa4565b610dd1565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036103ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103e490613043565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061051057507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610520575061051f82610e54565b5b9050919050565b606060056000838152602001908152602001600020600001805461054a90613092565b80601f016020809104026020016040519081016040528092919081815260200182805461057690613092565b80156105c35780601f10610598576101008083540402835291602001916105c3565b820191906000526020600020905b8154815290600101906020018083116105a657829003601f168201915b50505050509050919050565b60006105de8260600151610527565b510361061f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061690613135565b60405180910390fd5b600560008260600151815260200190815260200160002060010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16816080015167ffffffffffffffff166106748360600151610c5f565b61067e9190613184565b11156106bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b690613204565b60405180910390fd5b80600001516106cd82610ebe565b1461070d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070490613270565b60405180910390fd5b61071f81600001518260200151610f15565b61075e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610755906132dc565b60405180910390fd5b428160c0015167ffffffffffffffff16116107ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a590613348565b60405180910390fd5b600660008260a001516fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff1615610839576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610830906133da565b60405180910390fd5b6001600660008360a001516fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff0219169083151502179055506108c081604001518260600151836080015167ffffffffffffffff1660405180602001604052806000815250610f6b565b7fd1905271efb5202336c3f099b62e19f3e8764f4059abd6165b648969509b262133826060015183608001518460a001516040516109019493929190613409565b60405180910390a150565b61091461111b565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061095a57506109598561095461111b565b610c9c565b5b610999576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610990906134c0565b60405180910390fd5b6109a68585858585611123565b5050505050565b6109b5611444565b806020015167ffffffffffffffff166109cd83610c5f565b1115610a0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0590613552565b60405180910390fd5b80600560008481526020019081526020016000206000820151816000019081610a37919061371e565b5060208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b8260000151604051610a9e91906125aa565b60405180910390a25050565b60608151835114610af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae790613862565b60405180910390fd5b6000835167ffffffffffffffff811115610b0d57610b0c6125d1565b5b604051908082528060200260200182016040528015610b3b5781602001602082028036833780820191505090505b50905060005b8451811015610bb857610b88858281518110610b6057610b5f613882565b5b6020026020010151858381518110610b7b57610b7a613882565b5b602002602001015161037d565b828281518110610b9b57610b9a613882565b5b60200260200101818152505080610bb1906138b1565b9050610b41565b508091505092915050565b600080610bcf83610c5f565b119050919050565b610bdf611444565b610be960006114c2565b565b60006005600083815260200190815260200160002060010160009054906101000a900467ffffffffffffffff169050919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610c5b610c5461111b565b8383611588565b5050565b600060046000838152602001908152602001600020549050919050565b606060405180606001604052806035815260200161452960359139905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610d3861111b565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610d7e5750610d7d85610d7861111b565b610c9c565b5b610dbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db4906134c0565b60405180910390fd5b610dca85858585856116f4565b5050505050565b610dd9611444565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3f9061396b565b60405180910390fd5b610e51816114c2565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600063e2b07ad360c01b826040015146846060015185608001518660a001518760c00151604051602001610ef89796959493929190613a98565b604051602081830303815290604052805190602001209050919050565b6000610f21838361198f565b73ffffffffffffffffffffffffffffffffffffffff1673c783a70a08922df8eb023061d4a034552f90627373ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd190613b8b565b60405180910390fd5b6000610fe461111b565b90506000610ff1856119b6565b90506000610ffe856119b6565b905061100f83600089858589611a30565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461106e9190613184565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516110ec929190613bab565b60405180910390a461110383600089858589611a46565b61111283600089898989611a4e565b50505050505050565b600033905090565b8151835114611167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115e90613c46565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036111d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cd90613cd8565b60405180910390fd5b60006111e061111b565b90506111f0818787878787611a30565b60005b84518110156113a157600085828151811061121157611210613882565b5b6020026020010151905060008583815181106112305761122f613882565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156112d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c890613d6a565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113869190613184565b925050819055505050508061139a906138b1565b90506111f3565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611418929190613d8a565b60405180910390a461142e818787878787611a46565b61143c818787878787611c25565b505050505050565b61144c61111b565b73ffffffffffffffffffffffffffffffffffffffff1661146a610c1f565b73ffffffffffffffffffffffffffffffffffffffff16146114c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b790613e0d565b60405180910390fd5b565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036115f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ed90613e9f565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116e791906124d2565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611763576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175a90613cd8565b60405180910390fd5b600061176d61111b565b9050600061177a856119b6565b90506000611787856119b6565b9050611797838989858589611a30565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508581101561182e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182590613d6a565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118e39190613184565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051611960929190613bab565b60405180910390a4611976848a8a86868a611a46565b611984848a8a8a8a8a611a4e565b505050505050505050565b600080600061199e8585611dfc565b915091506119ab81611e4d565b819250505092915050565b60606000600167ffffffffffffffff8111156119d5576119d46125d1565b5b604051908082528060200260200182016040528015611a035781602001602082028036833780820191505090505b5090508281600081518110611a1b57611a1a613882565b5b60200260200101818152505080915050919050565b611a3e868686868686612019565b505050505050565b505050505050565b611a6d8473ffffffffffffffffffffffffffffffffffffffff166121e9565b15611c1d578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401611ab3959493929190613f14565b6020604051808303816000875af1925050508015611aef57506040513d601f19601f82011682018060405250810190611aec9190613f83565b60015b611b9457611afb613fbd565b806308c379a003611b575750611b0f613fdf565b80611b1a5750611b59565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4e91906125aa565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8b906140e1565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1290614173565b60405180910390fd5b505b505050505050565b611c448473ffffffffffffffffffffffffffffffffffffffff166121e9565b15611df4578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401611c8a959493929190614193565b6020604051808303816000875af1925050508015611cc657506040513d601f19601f82011682018060405250810190611cc39190613f83565b60015b611d6b57611cd2613fbd565b806308c379a003611d2e5750611ce6613fdf565b80611cf15750611d30565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2591906125aa565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d62906140e1565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de990614173565b60405180910390fd5b505b505050505050565b6000806041835103611e3d5760008060006020860151925060408601519150606086015160001a9050611e318782858561220c565b94509450505050611e46565b60006002915091505b9250929050565b60006004811115611e6157611e606141fb565b5b816004811115611e7457611e736141fb565b5b03156120165760016004811115611e8e57611e8d6141fb565b5b816004811115611ea157611ea06141fb565b5b03611ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed890614276565b60405180910390fd5b60026004811115611ef557611ef46141fb565b5b816004811115611f0857611f076141fb565b5b03611f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3f906142e2565b60405180910390fd5b60036004811115611f5c57611f5b6141fb565b5b816004811115611f6f57611f6e6141fb565b5b03611faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa690614374565b60405180910390fd5b600480811115611fc257611fc16141fb565b5b816004811115611fd557611fd46141fb565b5b03612015576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200c90614406565b60405180910390fd5b5b50565b612027868686868686612318565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036120d85760005b83518110156120d65782818151811061207a57612079613882565b5b60200260200101516004600086848151811061209957612098613882565b5b6020026020010151815260200190815260200160002060008282546120be9190613184565b92505081905550806120cf906138b1565b905061205e565b505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036121e15760005b83518110156121df57600084828151811061212d5761212c613882565b5b60200260200101519050600084838151811061214c5761214b613882565b5b60200260200101519050600060046000848152602001908152602001600020549050818110156121b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a890614498565b60405180910390fd5b8181036004600085815260200190815260200160002081905550505050806121d8906138b1565b905061210f565b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561224757600060039150915061230f565b601b8560ff161415801561225f5750601c8560ff1614155b1561227157600060049150915061230f565b60006001878787876040516000815260200160405260405161229694939291906144e3565b6020604051602081039080840390855afa1580156122b8573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036123065760006001925092505061230f565b80600092509250505b94509492505050565b505050505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061235f82612334565b9050919050565b61236f81612354565b811461237a57600080fd5b50565b60008135905061238c81612366565b92915050565b6000819050919050565b6123a581612392565b81146123b057600080fd5b50565b6000813590506123c28161239c565b92915050565b600080604083850312156123df576123de61232a565b5b60006123ed8582860161237d565b92505060206123fe858286016123b3565b9150509250929050565b61241181612392565b82525050565b600060208201905061242c6000830184612408565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61246781612432565b811461247257600080fd5b50565b6000813590506124848161245e565b92915050565b6000602082840312156124a05761249f61232a565b5b60006124ae84828501612475565b91505092915050565b60008115159050919050565b6124cc816124b7565b82525050565b60006020820190506124e760008301846124c3565b92915050565b6000602082840312156125035761250261232a565b5b6000612511848285016123b3565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612554578082015181840152602081019050612539565b60008484015250505050565b6000601f19601f8301169050919050565b600061257c8261251a565b6125868185612525565b9350612596818560208601612536565b61259f81612560565b840191505092915050565b600060208201905081810360008301526125c48184612571565b905092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61260982612560565b810181811067ffffffffffffffff82111715612628576126276125d1565b5b80604052505050565b600061263b612320565b90506126478282612600565b919050565b600080fd5b6000819050919050565b61266481612651565b811461266f57600080fd5b50565b6000813590506126818161265b565b92915050565b600080fd5b600080fd5b600067ffffffffffffffff8211156126ac576126ab6125d1565b5b6126b582612560565b9050602081019050919050565b82818337600083830152505050565b60006126e46126df84612691565b612631565b905082815260208101848484011115612700576126ff61268c565b5b61270b8482856126c2565b509392505050565b600082601f83011261272857612727612687565b5b81356127388482602086016126d1565b91505092915050565b600067ffffffffffffffff82169050919050565b61275e81612741565b811461276957600080fd5b50565b60008135905061277b81612755565b92915050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b6127b681612781565b81146127c157600080fd5b50565b6000813590506127d3816127ad565b92915050565b600060e082840312156127ef576127ee6125cc565b5b6127f960e0612631565b9050600061280984828501612672565b600083015250602082013567ffffffffffffffff81111561282d5761282c61264c565b5b61283984828501612713565b602083015250604061284d8482850161237d565b6040830152506060612861848285016123b3565b60608301525060806128758482850161276c565b60808301525060a0612889848285016127c4565b60a08301525060c061289d8482850161276c565b60c08301525092915050565b6000602082840312156128bf576128be61232a565b5b600082013567ffffffffffffffff8111156128dd576128dc61232f565b5b6128e9848285016127d9565b91505092915050565b600067ffffffffffffffff82111561290d5761290c6125d1565b5b602082029050602081019050919050565b600080fd5b6000612936612931846128f2565b612631565b905080838252602082019050602084028301858111156129595761295861291e565b5b835b81811015612982578061296e88826123b3565b84526020840193505060208101905061295b565b5050509392505050565b600082601f8301126129a1576129a0612687565b5b81356129b1848260208601612923565b91505092915050565b600080600080600060a086880312156129d6576129d561232a565b5b60006129e48882890161237d565b95505060206129f58882890161237d565b945050604086013567ffffffffffffffff811115612a1657612a1561232f565b5b612a228882890161298c565b935050606086013567ffffffffffffffff811115612a4357612a4261232f565b5b612a4f8882890161298c565b925050608086013567ffffffffffffffff811115612a7057612a6f61232f565b5b612a7c88828901612713565b9150509295509295909350565b600067ffffffffffffffff821115612aa457612aa36125d1565b5b612aad82612560565b9050602081019050919050565b6000612acd612ac884612a89565b612631565b905082815260208101848484011115612ae957612ae861268c565b5b612af48482856126c2565b509392505050565b600082601f830112612b1157612b10612687565b5b8135612b21848260208601612aba565b91505092915050565b600060408284031215612b4057612b3f6125cc565b5b612b4a6040612631565b9050600082013567ffffffffffffffff811115612b6a57612b6961264c565b5b612b7684828501612afc565b6000830152506020612b8a8482850161276c565b60208301525092915050565b60008060408385031215612bad57612bac61232a565b5b6000612bbb858286016123b3565b925050602083013567ffffffffffffffff811115612bdc57612bdb61232f565b5b612be885828601612b2a565b9150509250929050565b600067ffffffffffffffff821115612c0d57612c0c6125d1565b5b602082029050602081019050919050565b6000612c31612c2c84612bf2565b612631565b90508083825260208201905060208402830185811115612c5457612c5361291e565b5b835b81811015612c7d5780612c69888261237d565b845260208401935050602081019050612c56565b5050509392505050565b600082601f830112612c9c57612c9b612687565b5b8135612cac848260208601612c1e565b91505092915050565b60008060408385031215612ccc57612ccb61232a565b5b600083013567ffffffffffffffff811115612cea57612ce961232f565b5b612cf685828601612c87565b925050602083013567ffffffffffffffff811115612d1757612d1661232f565b5b612d238582860161298c565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612d6281612392565b82525050565b6000612d748383612d59565b60208301905092915050565b6000602082019050919050565b6000612d9882612d2d565b612da28185612d38565b9350612dad83612d49565b8060005b83811015612dde578151612dc58882612d68565b9750612dd083612d80565b925050600181019050612db1565b5085935050505092915050565b60006020820190508181036000830152612e058184612d8d565b905092915050565b612e1681612741565b82525050565b6000602082019050612e316000830184612e0d565b92915050565b612e4081612354565b82525050565b6000602082019050612e5b6000830184612e37565b92915050565b612e6a816124b7565b8114612e7557600080fd5b50565b600081359050612e8781612e61565b92915050565b60008060408385031215612ea457612ea361232a565b5b6000612eb28582860161237d565b9250506020612ec385828601612e78565b9150509250929050565b60008060408385031215612ee457612ee361232a565b5b6000612ef28582860161237d565b9250506020612f038582860161237d565b9150509250929050565b600080600080600060a08688031215612f2957612f2861232a565b5b6000612f378882890161237d565b9550506020612f488882890161237d565b9450506040612f59888289016123b3565b9350506060612f6a888289016123b3565b925050608086013567ffffffffffffffff811115612f8b57612f8a61232f565b5b612f9788828901612713565b9150509295509295909350565b600060208284031215612fba57612fb961232a565b5b6000612fc88482850161237d565b91505092915050565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b600061302d602a83612525565b915061303882612fd1565b604082019050919050565b6000602082019050818103600083015261305c81613020565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806130aa57607f821691505b6020821081036130bd576130bc613063565b5b50919050565b7f4120746f6b656e2077697468207468697320494420646f6573206e6f7420657860008201527f6973742e00000000000000000000000000000000000000000000000000000000602082015250565b600061311f602483612525565b915061312a826130c3565b604082019050919050565b6000602082019050818103600083015261314e81613112565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061318f82612392565b915061319a83612392565b92508282019050808211156131b2576131b1613155565b5b92915050565b7f52656163686564206d617820737570706c792e00000000000000000000000000600082015250565b60006131ee601383612525565b91506131f9826131b8565b602082019050919050565b6000602082019050818103600083015261321d816131e1565b9050919050565b7f4861736820636f6d70617269736f6e206661696c65642e000000000000000000600082015250565b600061325a601783612525565b915061326582613224565b602082019050919050565b600060208201905081810360008301526132898161324d565b9050919050565b7f556e74727573746564207369676e61747572652070726f76696465642e000000600082015250565b60006132c6601d83612525565b91506132d182613290565b602082019050919050565b600060208201905081810360008301526132f5816132b9565b9050919050565b7f4f726465722068617320616c726561647920657870697265642e000000000000600082015250565b6000613332601a83612525565b915061333d826132fc565b602082019050919050565b6000602082019050818103600083015261336181613325565b9050919050565b7f546865206f726465722049442068617320616c7265616479206265656e20757360008201527f65642e0000000000000000000000000000000000000000000000000000000000602082015250565b60006133c4602383612525565b91506133cf82613368565b604082019050919050565b600060208201905081810360008301526133f3816133b7565b9050919050565b61340381612781565b82525050565b600060808201905061341e6000830187612e37565b61342b6020830186612408565b6134386040830185612e0d565b61344560608301846133fa565b95945050505050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206e6f7220617070726f7665640000000000000000000000000000000000602082015250565b60006134aa602f83612525565b91506134b58261344e565b604082019050919050565b600060208201905081810360008301526134d98161349d565b9050919050565b7f43616e206e6f7420726564756365206d617820737570706c792062656c6f772060008201527f746f74616c20737570706c790000000000000000000000000000000000000000602082015250565b600061353c602c83612525565b9150613547826134e0565b604082019050919050565b6000602082019050818103600083015261356b8161352f565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026135d47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613597565b6135de8683613597565b95508019841693508086168417925050509392505050565b6000819050919050565b600061361b61361661361184612392565b6135f6565b612392565b9050919050565b6000819050919050565b61363583613600565b61364961364182613622565b8484546135a4565b825550505050565b600090565b61365e613651565b61366981848461362c565b505050565b5b8181101561368d57613682600082613656565b60018101905061366f565b5050565b601f8211156136d2576136a381613572565b6136ac84613587565b810160208510156136bb578190505b6136cf6136c785613587565b83018261366e565b50505b505050565b600082821c905092915050565b60006136f5600019846008026136d7565b1980831691505092915050565b600061370e83836136e4565b9150826002028217905092915050565b6137278261251a565b67ffffffffffffffff8111156137405761373f6125d1565b5b61374a8254613092565b613755828285613691565b600060209050601f8311600181146137885760008415613776578287015190505b6137808582613702565b8655506137e8565b601f19841661379686613572565b60005b828110156137be57848901518255600182019150602085019450602081019050613799565b868310156137db57848901516137d7601f8916826136e4565b8355505b6001600288020188555050505b505050505050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b600061384c602983612525565b9150613857826137f0565b604082019050919050565b6000602082019050818103600083015261387b8161383f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006138bc82612392565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036138ee576138ed613155565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613955602683612525565b9150613960826138f9565b604082019050919050565b6000602082019050818103600083015261398481613948565b9050919050565b60007fffffffffffffffff00000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b6139d26139cd8261398b565b6139b7565b82525050565b60008160601b9050919050565b60006139f0826139d8565b9050919050565b6000613a02826139e5565b9050919050565b613a1a613a1582612354565b6139f7565b82525050565b60008160c01b9050919050565b6000613a3882613a20565b9050919050565b613a50613a4b82612741565b613a2d565b82525050565b6000819050919050565b613a71613a6c82612392565b613a56565b82525050565b6000819050919050565b613a92613a8d82612781565b613a77565b82525050565b6000613aa4828a6139c1565b600882019150613ab48289613a09565b601482019150613ac48288613a3f565b600882019150613ad48287613a60565b602082019150613ae48286613a3f565b600882019150613af48285613a81565b601082019150613b048284613a3f565b60088201915081905098975050505050505050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613b75602183612525565b9150613b8082613b19565b604082019050919050565b60006020820190508181036000830152613ba481613b68565b9050919050565b6000604082019050613bc06000830185612408565b613bcd6020830184612408565b9392505050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000613c30602883612525565b9150613c3b82613bd4565b604082019050919050565b60006020820190508181036000830152613c5f81613c23565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613cc2602583612525565b9150613ccd82613c66565b604082019050919050565b60006020820190508181036000830152613cf181613cb5565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000613d54602a83612525565b9150613d5f82613cf8565b604082019050919050565b60006020820190508181036000830152613d8381613d47565b9050919050565b60006040820190508181036000830152613da48185612d8d565b90508181036020830152613db88184612d8d565b90509392505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613df7602083612525565b9150613e0282613dc1565b602082019050919050565b60006020820190508181036000830152613e2681613dea565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b6000613e89602983612525565b9150613e9482613e2d565b604082019050919050565b60006020820190508181036000830152613eb881613e7c565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613ee682613ebf565b613ef08185613eca565b9350613f00818560208601612536565b613f0981612560565b840191505092915050565b600060a082019050613f296000830188612e37565b613f366020830187612e37565b613f436040830186612408565b613f506060830185612408565b8181036080830152613f628184613edb565b90509695505050505050565b600081519050613f7d8161245e565b92915050565b600060208284031215613f9957613f9861232a565b5b6000613fa784828501613f6e565b91505092915050565b60008160e01c9050919050565b600060033d1115613fdc5760046000803e613fd9600051613fb0565b90505b90565b600060443d1061406c57613ff1612320565b60043d036004823e80513d602482011167ffffffffffffffff8211171561401957505061406c565b808201805167ffffffffffffffff811115614037575050505061406c565b80602083010160043d03850181111561405457505050505061406c565b61406382602001850186612600565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b60006140cb603483612525565b91506140d68261406f565b604082019050919050565b600060208201905081810360008301526140fa816140be565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b600061415d602883612525565b915061416882614101565b604082019050919050565b6000602082019050818103600083015261418c81614150565b9050919050565b600060a0820190506141a86000830188612e37565b6141b56020830187612e37565b81810360408301526141c78186612d8d565b905081810360608301526141db8185612d8d565b905081810360808301526141ef8184613edb565b90509695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000614260601883612525565b915061426b8261422a565b602082019050919050565b6000602082019050818103600083015261428f81614253565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b60006142cc601f83612525565b91506142d782614296565b602082019050919050565b600060208201905081810360008301526142fb816142bf565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b600061435e602283612525565b915061436982614302565b604082019050919050565b6000602082019050818103600083015261438d81614351565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006143f0602283612525565b91506143fb82614394565b604082019050919050565b6000602082019050818103600083015261441f816143e3565b9050919050565b7f455243313135353a206275726e20616d6f756e74206578636565647320746f7460008201527f616c537570706c79000000000000000000000000000000000000000000000000602082015250565b6000614482602883612525565b915061448d82614426565b604082019050919050565b600060208201905081810360008301526144b181614475565b9050919050565b6144c181612651565b82525050565b600060ff82169050919050565b6144dd816144c7565b82525050565b60006080820190506144f860008301876144b8565b61450560208301866144d4565b61451260408301856144b8565b61451f60608301846144b8565b9594505050505056fe697066733a2f2f516d6458543235617a574168455871553132724e45637a4e7065646e544b68716f6d366244385a34584e42456436a264697066735822122083858fae2dd39e301908699b0bb4781e498ff2c838c270ff7d1df2ec4d87466964736f6c63430008110033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061010a5760003560e01c8063715018a6116100a2578063bd85b03911610071578063bd85b039146102c7578063e8a3d485146102f7578063e985e9c514610315578063f242432a14610345578063f2fde38b146103615761010a565b8063715018a614610253578063869f75941461025d5780638da5cb5b1461028d578063a22cb465146102ab5761010a565b80632eb2c2d6116100de5780632eb2c2d6146101bb57806342fd167b146101d75780634e1273f4146101f35780634f558e79146102235761010a565b8062fdd58e1461010f57806301ffc9a71461013f5780630e89341c1461016f5780632801d2171461019f575b600080fd5b610129600480360381019061012491906123c8565b61037d565b6040516101369190612417565b60405180910390f35b6101596004803603810190610154919061248a565b610445565b60405161016691906124d2565b60405180910390f35b610189600480360381019061018491906124ed565b610527565b60405161019691906125aa565b60405180910390f35b6101b960048036038101906101b491906128a9565b6105cf565b005b6101d560048036038101906101d091906129ba565b61090c565b005b6101f160048036038101906101ec9190612b96565b6109ad565b005b61020d60048036038101906102089190612cb5565b610aaa565b60405161021a9190612deb565b60405180910390f35b61023d600480360381019061023891906124ed565b610bc3565b60405161024a91906124d2565b60405180910390f35b61025b610bd7565b005b610277600480360381019061027291906124ed565b610beb565b6040516102849190612e1c565b60405180910390f35b610295610c1f565b6040516102a29190612e46565b60405180910390f35b6102c560048036038101906102c09190612e8d565b610c49565b005b6102e160048036038101906102dc91906124ed565b610c5f565b6040516102ee9190612417565b60405180910390f35b6102ff610c7c565b60405161030c91906125aa565b60405180910390f35b61032f600480360381019061032a9190612ecd565b610c9c565b60405161033c91906124d2565b60405180910390f35b61035f600480360381019061035a9190612f0d565b610d30565b005b61037b60048036038101906103769190612fa4565b610dd1565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036103ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103e490613043565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061051057507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610520575061051f82610e54565b5b9050919050565b606060056000838152602001908152602001600020600001805461054a90613092565b80601f016020809104026020016040519081016040528092919081815260200182805461057690613092565b80156105c35780601f10610598576101008083540402835291602001916105c3565b820191906000526020600020905b8154815290600101906020018083116105a657829003601f168201915b50505050509050919050565b60006105de8260600151610527565b510361061f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061690613135565b60405180910390fd5b600560008260600151815260200190815260200160002060010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16816080015167ffffffffffffffff166106748360600151610c5f565b61067e9190613184565b11156106bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b690613204565b60405180910390fd5b80600001516106cd82610ebe565b1461070d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070490613270565b60405180910390fd5b61071f81600001518260200151610f15565b61075e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610755906132dc565b60405180910390fd5b428160c0015167ffffffffffffffff16116107ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a590613348565b60405180910390fd5b600660008260a001516fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff1615610839576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610830906133da565b60405180910390fd5b6001600660008360a001516fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff0219169083151502179055506108c081604001518260600151836080015167ffffffffffffffff1660405180602001604052806000815250610f6b565b7fd1905271efb5202336c3f099b62e19f3e8764f4059abd6165b648969509b262133826060015183608001518460a001516040516109019493929190613409565b60405180910390a150565b61091461111b565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061095a57506109598561095461111b565b610c9c565b5b610999576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610990906134c0565b60405180910390fd5b6109a68585858585611123565b5050505050565b6109b5611444565b806020015167ffffffffffffffff166109cd83610c5f565b1115610a0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0590613552565b60405180910390fd5b80600560008481526020019081526020016000206000820151816000019081610a37919061371e565b5060208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b8260000151604051610a9e91906125aa565b60405180910390a25050565b60608151835114610af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae790613862565b60405180910390fd5b6000835167ffffffffffffffff811115610b0d57610b0c6125d1565b5b604051908082528060200260200182016040528015610b3b5781602001602082028036833780820191505090505b50905060005b8451811015610bb857610b88858281518110610b6057610b5f613882565b5b6020026020010151858381518110610b7b57610b7a613882565b5b602002602001015161037d565b828281518110610b9b57610b9a613882565b5b60200260200101818152505080610bb1906138b1565b9050610b41565b508091505092915050565b600080610bcf83610c5f565b119050919050565b610bdf611444565b610be960006114c2565b565b60006005600083815260200190815260200160002060010160009054906101000a900467ffffffffffffffff169050919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610c5b610c5461111b565b8383611588565b5050565b600060046000838152602001908152602001600020549050919050565b606060405180606001604052806035815260200161452960359139905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610d3861111b565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610d7e5750610d7d85610d7861111b565b610c9c565b5b610dbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db4906134c0565b60405180910390fd5b610dca85858585856116f4565b5050505050565b610dd9611444565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3f9061396b565b60405180910390fd5b610e51816114c2565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600063e2b07ad360c01b826040015146846060015185608001518660a001518760c00151604051602001610ef89796959493929190613a98565b604051602081830303815290604052805190602001209050919050565b6000610f21838361198f565b73ffffffffffffffffffffffffffffffffffffffff1673c783a70a08922df8eb023061d4a034552f90627373ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd190613b8b565b60405180910390fd5b6000610fe461111b565b90506000610ff1856119b6565b90506000610ffe856119b6565b905061100f83600089858589611a30565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461106e9190613184565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516110ec929190613bab565b60405180910390a461110383600089858589611a46565b61111283600089898989611a4e565b50505050505050565b600033905090565b8151835114611167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115e90613c46565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036111d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cd90613cd8565b60405180910390fd5b60006111e061111b565b90506111f0818787878787611a30565b60005b84518110156113a157600085828151811061121157611210613882565b5b6020026020010151905060008583815181106112305761122f613882565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156112d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c890613d6a565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113869190613184565b925050819055505050508061139a906138b1565b90506111f3565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611418929190613d8a565b60405180910390a461142e818787878787611a46565b61143c818787878787611c25565b505050505050565b61144c61111b565b73ffffffffffffffffffffffffffffffffffffffff1661146a610c1f565b73ffffffffffffffffffffffffffffffffffffffff16146114c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b790613e0d565b60405180910390fd5b565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036115f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ed90613e9f565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116e791906124d2565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611763576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175a90613cd8565b60405180910390fd5b600061176d61111b565b9050600061177a856119b6565b90506000611787856119b6565b9050611797838989858589611a30565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508581101561182e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182590613d6a565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118e39190613184565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051611960929190613bab565b60405180910390a4611976848a8a86868a611a46565b611984848a8a8a8a8a611a4e565b505050505050505050565b600080600061199e8585611dfc565b915091506119ab81611e4d565b819250505092915050565b60606000600167ffffffffffffffff8111156119d5576119d46125d1565b5b604051908082528060200260200182016040528015611a035781602001602082028036833780820191505090505b5090508281600081518110611a1b57611a1a613882565b5b60200260200101818152505080915050919050565b611a3e868686868686612019565b505050505050565b505050505050565b611a6d8473ffffffffffffffffffffffffffffffffffffffff166121e9565b15611c1d578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401611ab3959493929190613f14565b6020604051808303816000875af1925050508015611aef57506040513d601f19601f82011682018060405250810190611aec9190613f83565b60015b611b9457611afb613fbd565b806308c379a003611b575750611b0f613fdf565b80611b1a5750611b59565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4e91906125aa565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8b906140e1565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1290614173565b60405180910390fd5b505b505050505050565b611c448473ffffffffffffffffffffffffffffffffffffffff166121e9565b15611df4578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401611c8a959493929190614193565b6020604051808303816000875af1925050508015611cc657506040513d601f19601f82011682018060405250810190611cc39190613f83565b60015b611d6b57611cd2613fbd565b806308c379a003611d2e5750611ce6613fdf565b80611cf15750611d30565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2591906125aa565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d62906140e1565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de990614173565b60405180910390fd5b505b505050505050565b6000806041835103611e3d5760008060006020860151925060408601519150606086015160001a9050611e318782858561220c565b94509450505050611e46565b60006002915091505b9250929050565b60006004811115611e6157611e606141fb565b5b816004811115611e7457611e736141fb565b5b03156120165760016004811115611e8e57611e8d6141fb565b5b816004811115611ea157611ea06141fb565b5b03611ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed890614276565b60405180910390fd5b60026004811115611ef557611ef46141fb565b5b816004811115611f0857611f076141fb565b5b03611f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3f906142e2565b60405180910390fd5b60036004811115611f5c57611f5b6141fb565b5b816004811115611f6f57611f6e6141fb565b5b03611faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa690614374565b60405180910390fd5b600480811115611fc257611fc16141fb565b5b816004811115611fd557611fd46141fb565b5b03612015576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200c90614406565b60405180910390fd5b5b50565b612027868686868686612318565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036120d85760005b83518110156120d65782818151811061207a57612079613882565b5b60200260200101516004600086848151811061209957612098613882565b5b6020026020010151815260200190815260200160002060008282546120be9190613184565b92505081905550806120cf906138b1565b905061205e565b505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036121e15760005b83518110156121df57600084828151811061212d5761212c613882565b5b60200260200101519050600084838151811061214c5761214b613882565b5b60200260200101519050600060046000848152602001908152602001600020549050818110156121b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a890614498565b60405180910390fd5b8181036004600085815260200190815260200160002081905550505050806121d8906138b1565b905061210f565b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561224757600060039150915061230f565b601b8560ff161415801561225f5750601c8560ff1614155b1561227157600060049150915061230f565b60006001878787876040516000815260200160405260405161229694939291906144e3565b6020604051602081039080840390855afa1580156122b8573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036123065760006001925092505061230f565b80600092509250505b94509492505050565b505050505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061235f82612334565b9050919050565b61236f81612354565b811461237a57600080fd5b50565b60008135905061238c81612366565b92915050565b6000819050919050565b6123a581612392565b81146123b057600080fd5b50565b6000813590506123c28161239c565b92915050565b600080604083850312156123df576123de61232a565b5b60006123ed8582860161237d565b92505060206123fe858286016123b3565b9150509250929050565b61241181612392565b82525050565b600060208201905061242c6000830184612408565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61246781612432565b811461247257600080fd5b50565b6000813590506124848161245e565b92915050565b6000602082840312156124a05761249f61232a565b5b60006124ae84828501612475565b91505092915050565b60008115159050919050565b6124cc816124b7565b82525050565b60006020820190506124e760008301846124c3565b92915050565b6000602082840312156125035761250261232a565b5b6000612511848285016123b3565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612554578082015181840152602081019050612539565b60008484015250505050565b6000601f19601f8301169050919050565b600061257c8261251a565b6125868185612525565b9350612596818560208601612536565b61259f81612560565b840191505092915050565b600060208201905081810360008301526125c48184612571565b905092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61260982612560565b810181811067ffffffffffffffff82111715612628576126276125d1565b5b80604052505050565b600061263b612320565b90506126478282612600565b919050565b600080fd5b6000819050919050565b61266481612651565b811461266f57600080fd5b50565b6000813590506126818161265b565b92915050565b600080fd5b600080fd5b600067ffffffffffffffff8211156126ac576126ab6125d1565b5b6126b582612560565b9050602081019050919050565b82818337600083830152505050565b60006126e46126df84612691565b612631565b905082815260208101848484011115612700576126ff61268c565b5b61270b8482856126c2565b509392505050565b600082601f83011261272857612727612687565b5b81356127388482602086016126d1565b91505092915050565b600067ffffffffffffffff82169050919050565b61275e81612741565b811461276957600080fd5b50565b60008135905061277b81612755565b92915050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b6127b681612781565b81146127c157600080fd5b50565b6000813590506127d3816127ad565b92915050565b600060e082840312156127ef576127ee6125cc565b5b6127f960e0612631565b9050600061280984828501612672565b600083015250602082013567ffffffffffffffff81111561282d5761282c61264c565b5b61283984828501612713565b602083015250604061284d8482850161237d565b6040830152506060612861848285016123b3565b60608301525060806128758482850161276c565b60808301525060a0612889848285016127c4565b60a08301525060c061289d8482850161276c565b60c08301525092915050565b6000602082840312156128bf576128be61232a565b5b600082013567ffffffffffffffff8111156128dd576128dc61232f565b5b6128e9848285016127d9565b91505092915050565b600067ffffffffffffffff82111561290d5761290c6125d1565b5b602082029050602081019050919050565b600080fd5b6000612936612931846128f2565b612631565b905080838252602082019050602084028301858111156129595761295861291e565b5b835b81811015612982578061296e88826123b3565b84526020840193505060208101905061295b565b5050509392505050565b600082601f8301126129a1576129a0612687565b5b81356129b1848260208601612923565b91505092915050565b600080600080600060a086880312156129d6576129d561232a565b5b60006129e48882890161237d565b95505060206129f58882890161237d565b945050604086013567ffffffffffffffff811115612a1657612a1561232f565b5b612a228882890161298c565b935050606086013567ffffffffffffffff811115612a4357612a4261232f565b5b612a4f8882890161298c565b925050608086013567ffffffffffffffff811115612a7057612a6f61232f565b5b612a7c88828901612713565b9150509295509295909350565b600067ffffffffffffffff821115612aa457612aa36125d1565b5b612aad82612560565b9050602081019050919050565b6000612acd612ac884612a89565b612631565b905082815260208101848484011115612ae957612ae861268c565b5b612af48482856126c2565b509392505050565b600082601f830112612b1157612b10612687565b5b8135612b21848260208601612aba565b91505092915050565b600060408284031215612b4057612b3f6125cc565b5b612b4a6040612631565b9050600082013567ffffffffffffffff811115612b6a57612b6961264c565b5b612b7684828501612afc565b6000830152506020612b8a8482850161276c565b60208301525092915050565b60008060408385031215612bad57612bac61232a565b5b6000612bbb858286016123b3565b925050602083013567ffffffffffffffff811115612bdc57612bdb61232f565b5b612be885828601612b2a565b9150509250929050565b600067ffffffffffffffff821115612c0d57612c0c6125d1565b5b602082029050602081019050919050565b6000612c31612c2c84612bf2565b612631565b90508083825260208201905060208402830185811115612c5457612c5361291e565b5b835b81811015612c7d5780612c69888261237d565b845260208401935050602081019050612c56565b5050509392505050565b600082601f830112612c9c57612c9b612687565b5b8135612cac848260208601612c1e565b91505092915050565b60008060408385031215612ccc57612ccb61232a565b5b600083013567ffffffffffffffff811115612cea57612ce961232f565b5b612cf685828601612c87565b925050602083013567ffffffffffffffff811115612d1757612d1661232f565b5b612d238582860161298c565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612d6281612392565b82525050565b6000612d748383612d59565b60208301905092915050565b6000602082019050919050565b6000612d9882612d2d565b612da28185612d38565b9350612dad83612d49565b8060005b83811015612dde578151612dc58882612d68565b9750612dd083612d80565b925050600181019050612db1565b5085935050505092915050565b60006020820190508181036000830152612e058184612d8d565b905092915050565b612e1681612741565b82525050565b6000602082019050612e316000830184612e0d565b92915050565b612e4081612354565b82525050565b6000602082019050612e5b6000830184612e37565b92915050565b612e6a816124b7565b8114612e7557600080fd5b50565b600081359050612e8781612e61565b92915050565b60008060408385031215612ea457612ea361232a565b5b6000612eb28582860161237d565b9250506020612ec385828601612e78565b9150509250929050565b60008060408385031215612ee457612ee361232a565b5b6000612ef28582860161237d565b9250506020612f038582860161237d565b9150509250929050565b600080600080600060a08688031215612f2957612f2861232a565b5b6000612f378882890161237d565b9550506020612f488882890161237d565b9450506040612f59888289016123b3565b9350506060612f6a888289016123b3565b925050608086013567ffffffffffffffff811115612f8b57612f8a61232f565b5b612f9788828901612713565b9150509295509295909350565b600060208284031215612fba57612fb961232a565b5b6000612fc88482850161237d565b91505092915050565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b600061302d602a83612525565b915061303882612fd1565b604082019050919050565b6000602082019050818103600083015261305c81613020565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806130aa57607f821691505b6020821081036130bd576130bc613063565b5b50919050565b7f4120746f6b656e2077697468207468697320494420646f6573206e6f7420657860008201527f6973742e00000000000000000000000000000000000000000000000000000000602082015250565b600061311f602483612525565b915061312a826130c3565b604082019050919050565b6000602082019050818103600083015261314e81613112565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061318f82612392565b915061319a83612392565b92508282019050808211156131b2576131b1613155565b5b92915050565b7f52656163686564206d617820737570706c792e00000000000000000000000000600082015250565b60006131ee601383612525565b91506131f9826131b8565b602082019050919050565b6000602082019050818103600083015261321d816131e1565b9050919050565b7f4861736820636f6d70617269736f6e206661696c65642e000000000000000000600082015250565b600061325a601783612525565b915061326582613224565b602082019050919050565b600060208201905081810360008301526132898161324d565b9050919050565b7f556e74727573746564207369676e61747572652070726f76696465642e000000600082015250565b60006132c6601d83612525565b91506132d182613290565b602082019050919050565b600060208201905081810360008301526132f5816132b9565b9050919050565b7f4f726465722068617320616c726561647920657870697265642e000000000000600082015250565b6000613332601a83612525565b915061333d826132fc565b602082019050919050565b6000602082019050818103600083015261336181613325565b9050919050565b7f546865206f726465722049442068617320616c7265616479206265656e20757360008201527f65642e0000000000000000000000000000000000000000000000000000000000602082015250565b60006133c4602383612525565b91506133cf82613368565b604082019050919050565b600060208201905081810360008301526133f3816133b7565b9050919050565b61340381612781565b82525050565b600060808201905061341e6000830187612e37565b61342b6020830186612408565b6134386040830185612e0d565b61344560608301846133fa565b95945050505050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206e6f7220617070726f7665640000000000000000000000000000000000602082015250565b60006134aa602f83612525565b91506134b58261344e565b604082019050919050565b600060208201905081810360008301526134d98161349d565b9050919050565b7f43616e206e6f7420726564756365206d617820737570706c792062656c6f772060008201527f746f74616c20737570706c790000000000000000000000000000000000000000602082015250565b600061353c602c83612525565b9150613547826134e0565b604082019050919050565b6000602082019050818103600083015261356b8161352f565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026135d47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613597565b6135de8683613597565b95508019841693508086168417925050509392505050565b6000819050919050565b600061361b61361661361184612392565b6135f6565b612392565b9050919050565b6000819050919050565b61363583613600565b61364961364182613622565b8484546135a4565b825550505050565b600090565b61365e613651565b61366981848461362c565b505050565b5b8181101561368d57613682600082613656565b60018101905061366f565b5050565b601f8211156136d2576136a381613572565b6136ac84613587565b810160208510156136bb578190505b6136cf6136c785613587565b83018261366e565b50505b505050565b600082821c905092915050565b60006136f5600019846008026136d7565b1980831691505092915050565b600061370e83836136e4565b9150826002028217905092915050565b6137278261251a565b67ffffffffffffffff8111156137405761373f6125d1565b5b61374a8254613092565b613755828285613691565b600060209050601f8311600181146137885760008415613776578287015190505b6137808582613702565b8655506137e8565b601f19841661379686613572565b60005b828110156137be57848901518255600182019150602085019450602081019050613799565b868310156137db57848901516137d7601f8916826136e4565b8355505b6001600288020188555050505b505050505050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b600061384c602983612525565b9150613857826137f0565b604082019050919050565b6000602082019050818103600083015261387b8161383f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006138bc82612392565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036138ee576138ed613155565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613955602683612525565b9150613960826138f9565b604082019050919050565b6000602082019050818103600083015261398481613948565b9050919050565b60007fffffffffffffffff00000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b6139d26139cd8261398b565b6139b7565b82525050565b60008160601b9050919050565b60006139f0826139d8565b9050919050565b6000613a02826139e5565b9050919050565b613a1a613a1582612354565b6139f7565b82525050565b60008160c01b9050919050565b6000613a3882613a20565b9050919050565b613a50613a4b82612741565b613a2d565b82525050565b6000819050919050565b613a71613a6c82612392565b613a56565b82525050565b6000819050919050565b613a92613a8d82612781565b613a77565b82525050565b6000613aa4828a6139c1565b600882019150613ab48289613a09565b601482019150613ac48288613a3f565b600882019150613ad48287613a60565b602082019150613ae48286613a3f565b600882019150613af48285613a81565b601082019150613b048284613a3f565b60088201915081905098975050505050505050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613b75602183612525565b9150613b8082613b19565b604082019050919050565b60006020820190508181036000830152613ba481613b68565b9050919050565b6000604082019050613bc06000830185612408565b613bcd6020830184612408565b9392505050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000613c30602883612525565b9150613c3b82613bd4565b604082019050919050565b60006020820190508181036000830152613c5f81613c23565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613cc2602583612525565b9150613ccd82613c66565b604082019050919050565b60006020820190508181036000830152613cf181613cb5565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000613d54602a83612525565b9150613d5f82613cf8565b604082019050919050565b60006020820190508181036000830152613d8381613d47565b9050919050565b60006040820190508181036000830152613da48185612d8d565b90508181036020830152613db88184612d8d565b90509392505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613df7602083612525565b9150613e0282613dc1565b602082019050919050565b60006020820190508181036000830152613e2681613dea565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b6000613e89602983612525565b9150613e9482613e2d565b604082019050919050565b60006020820190508181036000830152613eb881613e7c565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613ee682613ebf565b613ef08185613eca565b9350613f00818560208601612536565b613f0981612560565b840191505092915050565b600060a082019050613f296000830188612e37565b613f366020830187612e37565b613f436040830186612408565b613f506060830185612408565b8181036080830152613f628184613edb565b90509695505050505050565b600081519050613f7d8161245e565b92915050565b600060208284031215613f9957613f9861232a565b5b6000613fa784828501613f6e565b91505092915050565b60008160e01c9050919050565b600060033d1115613fdc5760046000803e613fd9600051613fb0565b90505b90565b600060443d1061406c57613ff1612320565b60043d036004823e80513d602482011167ffffffffffffffff8211171561401957505061406c565b808201805167ffffffffffffffff811115614037575050505061406c565b80602083010160043d03850181111561405457505050505061406c565b61406382602001850186612600565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b60006140cb603483612525565b91506140d68261406f565b604082019050919050565b600060208201905081810360008301526140fa816140be565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b600061415d602883612525565b915061416882614101565b604082019050919050565b6000602082019050818103600083015261418c81614150565b9050919050565b600060a0820190506141a86000830188612e37565b6141b56020830187612e37565b81810360408301526141c78186612d8d565b905081810360608301526141db8185612d8d565b905081810360808301526141ef8184613edb565b90509695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000614260601883612525565b915061426b8261422a565b602082019050919050565b6000602082019050818103600083015261428f81614253565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b60006142cc601f83612525565b91506142d782614296565b602082019050919050565b600060208201905081810360008301526142fb816142bf565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b600061435e602283612525565b915061436982614302565b604082019050919050565b6000602082019050818103600083015261438d81614351565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006143f0602283612525565b91506143fb82614394565b604082019050919050565b6000602082019050818103600083015261441f816143e3565b9050919050565b7f455243313135353a206275726e20616d6f756e74206578636565647320746f7460008201527f616c537570706c79000000000000000000000000000000000000000000000000602082015250565b6000614482602883612525565b915061448d82614426565b604082019050919050565b600060208201905081810360008301526144b181614475565b9050919050565b6144c181612651565b82525050565b600060ff82169050919050565b6144dd816144c7565b82525050565b60006080820190506144f860008301876144b8565b61450560208301866144d4565b61451260408301856144b8565b61451f60608301846144b8565b9594505050505056fe697066733a2f2f516d6458543235617a574168455871553132724e45637a4e7065646e544b68716f6d366244385a34584e42456436a264697066735822122083858fae2dd39e301908699b0bb4781e498ff2c838c270ff7d1df2ec4d87466964736f6c63430008110033
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.