Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 170 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Purchase Token B... | 16766843 | 536 days ago | IN | 0.01 ETH | 0.00665226 | ||||
Purchase Token B... | 16380574 | 590 days ago | IN | 0.2 ETH | 0.00366652 | ||||
Purchase Token B... | 16351177 | 594 days ago | IN | 0 ETH | 0.00144694 | ||||
Purchase Token B... | 16351148 | 594 days ago | IN | 0 ETH | 0.00198057 | ||||
Purchase Token B... | 16351119 | 594 days ago | IN | 0 ETH | 0.00157299 | ||||
Purchase Token B... | 16310848 | 599 days ago | IN | 0 ETH | 0.00133525 | ||||
Purchase Token B... | 16303343 | 601 days ago | IN | 0.04 ETH | 0.00272723 | ||||
Purchase Token B... | 16300654 | 601 days ago | IN | 0 ETH | 0.00407811 | ||||
Purchase Token B... | 16067761 | 633 days ago | IN | 0.2222 ETH | 0.00237207 | ||||
Purchase Token B... | 16060765 | 634 days ago | IN | 0.2 ETH | 0.00213094 | ||||
Purchase Token B... | 15923825 | 654 days ago | IN | 0.02 ETH | 0.00268815 | ||||
Purchase Token B... | 15817006 | 668 days ago | IN | 0.03 ETH | 0.00205658 | ||||
Airdroptoken | 15640020 | 693 days ago | IN | 0.001 ETH | 0.00210731 | ||||
Purchase Token B... | 15585214 | 701 days ago | IN | 0.2 ETH | 0.00261272 | ||||
Purchase Token B... | 15565525 | 704 days ago | IN | 0.2 ETH | 0.00097847 | ||||
Purchase Token B... | 15555722 | 705 days ago | IN | 0.2 ETH | 0.00239847 | ||||
Purchase Token B... | 15543366 | 707 days ago | IN | 0.05 ETH | 0.00150563 | ||||
Delete Whitelist... | 15539240 | 707 days ago | IN | 0 ETH | 0.00025108 | ||||
Purchase Token B... | 15539113 | 707 days ago | IN | 0 ETH | 0.00089197 | ||||
Purchase Token B... | 15538725 | 707 days ago | IN | 0.004 ETH | 0.00129006 | ||||
Purchase Token B... | 15538679 | 707 days ago | IN | 0.004 ETH | 0.00151885 | ||||
Purchase Token B... | 15538619 | 707 days ago | IN | 0.001 ETH | 0.00172735 | ||||
Purchase Token B... | 15538605 | 707 days ago | IN | 0.001 ETH | 0.00165284 | ||||
Set Whitelistinv... | 15538588 | 707 days ago | IN | 0 ETH | 0.00048755 | ||||
Purchase Token B... | 15538394 | 707 days ago | IN | 0.001 ETH | 0.00068755 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
16766843 | 536 days ago | 0.009 ETH | ||||
16766843 | 536 days ago | 0.001 ETH | ||||
16380574 | 590 days ago | 0.018 ETH | ||||
16380574 | 590 days ago | 0.135 ETH | ||||
16380574 | 590 days ago | 0.027 ETH | ||||
16380574 | 590 days ago | 0.02 ETH | ||||
16303343 | 601 days ago | 0.036 ETH | ||||
16303343 | 601 days ago | 0.004 ETH | ||||
16067761 | 633 days ago | 0.19998 ETH | ||||
16067761 | 633 days ago | 0.02222 ETH | ||||
16060765 | 634 days ago | 0.09 ETH | ||||
16060765 | 634 days ago | 0.09 ETH | ||||
16060765 | 634 days ago | 0.02 ETH | ||||
15923825 | 654 days ago | 0.018 ETH | ||||
15923825 | 654 days ago | 0.002 ETH | ||||
15817006 | 668 days ago | 0.027 ETH | ||||
15817006 | 668 days ago | 0.003 ETH | ||||
15640020 | 693 days ago | 0.0005 ETH | ||||
15640020 | 693 days ago | 0.0005 ETH | ||||
15585214 | 701 days ago | 0.18 ETH | ||||
15585214 | 701 days ago | 0.02 ETH | ||||
15565525 | 704 days ago | 0.18 ETH | ||||
15565525 | 704 days ago | 0.02 ETH | ||||
15555722 | 705 days ago | 0.18 ETH | ||||
15555722 | 705 days ago | 0.02 ETH |
Loading...
Loading
Contract Name:
NFTMarket
Compiler Version
v0.5.16+commit.9c3226ce
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-09-19 */ // File: @openzeppelin/contracts/GSN/Context.sol pragma solidity ^0.5.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 GSN 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. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/introspection/IERC165.sol pragma solidity ^0.5.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); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity ^0.5.0; /** * @dev Required interface of an ERC721 compliant contract. */ contract IERC721 is IERC165 { event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of NFTs in `owner`'s account. */ function balanceOf(address owner) public view returns (uint256 balance); /** * @dev Returns the owner of the NFT specified by `tokenId`. */ function ownerOf(uint256 tokenId) public view returns (address owner); /** * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to * another (`to`). * * * * Requirements: * - `from`, `to` cannot be zero. * - `tokenId` must be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this * NFT by either {approve} or {setApprovalForAll}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public; /** * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to * another (`to`). * * Requirements: * - If the caller is not `from`, it must be approved to move this NFT by * either {approve} or {setApprovalForAll}. */ function transferFrom(address from, address to, uint256 tokenId) public; function approve(address to, uint256 tokenId) public; function getApproved(uint256 tokenId) public view returns (address operator); function setApprovalForAll(address operator, bool _approved) public; function isApprovedForAll(address owner, address operator) public view returns (bool); function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public; } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.5.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ contract IERC721Receiver { /** * @notice Handle the receipt of an NFT * @dev The ERC721 smart contract calls this function on the recipient * after a {IERC721-safeTransferFrom}. This function MUST return the function selector, * otherwise the caller will revert the transaction. The selector to be * returned can be obtained as `this.onERC721Received.selector`. This * function MAY throw to revert and reject the transfer. * Note: the ERC721 contract address is always the message sender. * @param operator The address which called `safeTransferFrom` function * @param from The address which previously owned the token * @param tokenId The NFT identifier which is being transferred * @param data Additional data with no specified format * @return bytes4 `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` */ function onERC721Received(address operator, address from, uint256 tokenId, bytes memory data) public returns (bytes4); } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity ^0.5.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.5.5; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Converts an `address` into `address payable`. Note that this is * simply a type cast: the actual underlying value is not changed. * * _Available since v2.4.0._ */ function toPayable(address account) internal pure returns (address payable) { return address(uint160(account)); } /** * @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]. * * _Available since v2.4.0._ */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-call-value (bool success, ) = recipient.call.value(amount)(""); require(success, "Address: unable to send value, recipient may have reverted"); } } // File: @openzeppelin/contracts/drafts/Counters.sol pragma solidity ^0.5.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath} * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never * directly accessed. */ library Counters { using SafeMath for uint256; struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { // The {SafeMath} overflow check can be skipped here, see the comment at the top counter._value += 1; } function decrement(Counter storage counter) internal { counter._value = counter._value.sub(1); } } // File: @openzeppelin/contracts/introspection/ERC165.sol pragma solidity ^0.5.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts may inherit from this and call {_registerInterface} to declare * their support of an interface. */ contract ERC165 is IERC165 { /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; constructor () internal { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev See {IERC165-supportsInterface}. * * Time complexity O(1), guaranteed to always use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See {IERC165-supportsInterface}. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity ^0.5.0; /** * @title ERC721 Non-Fungible Token Standard basic implementation * @dev see https://eips.ethereum.org/EIPS/eip-721 */ contract ERC721 is Context, ERC165, IERC721 { using SafeMath for uint256; using Address for address; using Counters for Counters.Counter; // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector` bytes4 private constant _ERC721_RECEIVED = 0x150b7a02; // Mapping from token ID to owner mapping (uint256 => address) private _tokenOwner; // Mapping from token ID to approved address mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to number of owned token mapping (address => Counters.Counter) private _ownedTokensCount; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; /* * bytes4(keccak256('balanceOf(address)')) == 0x70a08231 * bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e * bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3 * bytes4(keccak256('getApproved(uint256)')) == 0x081812fc * bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465 * bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5 * bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde * * => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^ * 0xa22cb465 ^ 0xe985e9c ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd */ bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd; constructor () public { // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC721); } /** * @dev Gets the balance of the specified address. * @param owner address to query the balance of * @return uint256 representing the amount owned by the passed address */ function balanceOf(address owner) public view returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _ownedTokensCount[owner].current(); } /** * @dev Gets the owner of the specified token ID. * @param tokenId uint256 ID of the token to query the owner of * @return address currently marked as the owner of the given token ID */ function ownerOf(uint256 tokenId) public view returns (address) { address owner = _tokenOwner[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev Approves another address to transfer the given token ID * The zero address indicates there is no approved address. * There can only be one approved address per token at a given time. * Can only be called by the token owner or an approved operator. * @param to address to be approved for the given token ID * @param tokenId uint256 ID of the token to be approved */ function approve(address to, uint256 tokenId) public { address owner = ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Gets the approved address for a token ID, or zero if no address set * Reverts if the token ID does not exist. * @param tokenId uint256 ID of the token to query the approval of * @return address currently approved for the given token ID */ function getApproved(uint256 tokenId) public view returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev Sets or unsets the approval of a given operator * An operator is allowed to transfer all tokens of the sender on their behalf. * @param to operator address to set the approval * @param approved representing the status of the approval to be set */ function setApprovalForAll(address to, bool approved) public { require(to != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][to] = approved; emit ApprovalForAll(_msgSender(), to, approved); } /** * @dev Tells whether an operator is approved by a given owner. * @param owner owner address which you want to query the approval of * @param operator operator address which you want to query the approval of * @return bool whether the given operator is approved by the given owner */ function isApprovedForAll(address owner, address operator) public view returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Transfers the ownership of a given token ID to another address. * Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * Requires the msg.sender to be the owner, approved, or operator. * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function transferFrom(address from, address to, uint256 tokenId) public { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transferFrom(from, to, tokenId); } /** * @dev Safely transfers the ownership of a given token ID to another address * If the target address is a contract, it must implement {IERC721Receiver-onERC721Received}, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * Requires the msg.sender to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function safeTransferFrom(address from, address to, uint256 tokenId) public { safeTransferFrom(from, to, tokenId, ""); } /** * @dev Safely transfers the ownership of a given token ID to another address * If the target address is a contract, it must implement {IERC721Receiver-onERC721Received}, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * Requires the _msgSender() to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred * @param _data bytes data to send along with a safe transfer check */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransferFrom(from, to, tokenId, _data); } /** * @dev Safely transfers the ownership of a given token ID to another address * If the target address is a contract, it must implement `onERC721Received`, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * Requires the msg.sender to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred * @param _data bytes data to send along with a safe transfer check */ function _safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) internal { _transferFrom(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether the specified token exists. * @param tokenId uint256 ID of the token to query the existence of * @return bool whether the token exists */ function _exists(uint256 tokenId) internal view returns (bool) { address owner = _tokenOwner[tokenId]; return owner != address(0); } /** * @dev Returns whether the given spender can transfer a given token ID. * @param spender address of the spender to query * @param tokenId uint256 ID of the token to be transferred * @return bool whether the msg.sender is approved for the given token ID, * is an operator of the owner, or is the owner of the token */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Internal function to safely mint a new token. * Reverts if the given token ID already exists. * If the target address is a contract, it must implement `onERC721Received`, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * @param to The address that will own the minted token * @param tokenId uint256 ID of the token to be minted */ function _safeMint(address to, uint256 tokenId) internal { _safeMint(to, tokenId, ""); } /** * @dev Internal function to safely mint a new token. * Reverts if the given token ID already exists. * If the target address is a contract, it must implement `onERC721Received`, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * @param to The address that will own the minted token * @param tokenId uint256 ID of the token to be minted * @param _data bytes data to send along with a safe transfer check */ function _safeMint(address to, uint256 tokenId, bytes memory _data) internal { _mint(to, tokenId); require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Internal function to mint a new token. * Reverts if the given token ID already exists. * @param to The address that will own the minted token * @param tokenId uint256 ID of the token to be minted */ function _mint(address to, uint256 tokenId) internal { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _tokenOwner[tokenId] = to; _ownedTokensCount[to].increment(); emit Transfer(address(0), to, tokenId); } /** * @dev Internal function to burn a specific token. * Reverts if the token does not exist. * Deprecated, use {_burn} instead. * @param owner owner of the token to burn * @param tokenId uint256 ID of the token being burned */ function _burn(address owner, uint256 tokenId) internal { require(ownerOf(tokenId) == owner, "ERC721: burn of token that is not own"); _clearApproval(tokenId); _ownedTokensCount[owner].decrement(); _tokenOwner[tokenId] = address(0); emit Transfer(owner, address(0), tokenId); } /** * @dev Internal function to burn a specific token. * Reverts if the token does not exist. * @param tokenId uint256 ID of the token being burned */ function _burn(uint256 tokenId) internal { _burn(ownerOf(tokenId), tokenId); } /** * @dev Internal function to transfer ownership of a given token ID to another address. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function _transferFrom(address from, address to, uint256 tokenId) internal { require(ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _clearApproval(tokenId); _ownedTokensCount[from].decrement(); _ownedTokensCount[to].increment(); _tokenOwner[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * This is an internal detail of the `ERC721` contract and its use is deprecated. * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) internal returns (bool) { if (!to.isContract()) { return true; } // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = to.call(abi.encodeWithSelector( IERC721Receiver(to).onERC721Received.selector, _msgSender(), from, tokenId, _data )); if (!success) { if (returndata.length > 0) { // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert("ERC721: transfer to non ERC721Receiver implementer"); } } else { bytes4 retval = abi.decode(returndata, (bytes4)); return (retval == _ERC721_RECEIVED); } } /** * @dev Private function to clear current approval of a given token ID. * @param tokenId uint256 ID of the token to be transferred */ function _clearApproval(uint256 tokenId) private { if (_tokenApprovals[tokenId] != address(0)) { _tokenApprovals[tokenId] = address(0); } } } // File: @openzeppelin/contracts/ownership/Ownable.sol pragma solidity ^0.5.0; /** * @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. * * 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. */ 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 () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return _msgSender() == _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 onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = 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 onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity ^0.5.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol pragma solidity ^0.5.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20Mintable}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20 { using SafeMath for uint256; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for `sender`'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal { require(account != address(0), "ERC20: mint to the zero address"); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal { require(account != address(0), "ERC20: burn from the zero address"); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * This is internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Destroys `amount` tokens from `account`.`amount` is then deducted * from the caller's allowance. * * See {_burn} and {_approve}. */ function _burnFrom(address account, uint256 amount) internal { _burn(account, amount); _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance")); } } // File: @openzeppelin/contracts/cryptography/ECDSA.sol pragma solidity ^0.5.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * NOTE: This call _does not revert_ if the signature is invalid, or * if the signer is otherwise unable to be retrieved. In those scenarios, * the zero address is returned. * * 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) { // Check the signature length if (signature.length != 65) { return (address(0)); } // Divide the signature in r, s and v variables bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // solhint-disable-next-line no-inline-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return address(0); } if (v != 27 && v != 28) { return address(0); } // If the signature is valid (and not malleable), return the signer address return ecrecover(hash, v, r, s); } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * replicates the behavior of the * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`] * JSON-RPC method. * * 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)); } } // File: contracts/NFTMarket.sol // SPDX-License-Identifier: MIT pragma solidity >=0.4.21 <0.8.0; contract NFTMarket is Ownable { using SafeMath for uint; using ECDSA for bytes32; string private signatureSalt; uint private allowableSecond; bool private aclstatus; //Whitelistのmapping配列 mapping(address => bool) public whitelists; constructor () public { allowableSecond = 86400; aclstatus = true; } function getSignatureSalt() public view onlyOwner returns(string memory) { return signatureSalt; } function setSignatureSalt(string calldata _signatureSalt) external onlyOwner { signatureSalt = _signatureSalt; } function getAllowableSecond() public view onlyOwner returns(uint) { return allowableSecond; } function setAllowableSecond(uint _allowableSecond) external onlyOwner { allowableSecond = _allowableSecond; } function validateSignatureMessageToken(bytes memory _signatureMessage, uint _timestamp, address _erc721Address,address _erc20Address,uint _tokenId, address _from, uint _value, bytes32 _royaltyhash) private view returns(bool){ require(block.timestamp - _timestamp < allowableSecond || _timestamp - block.timestamp < allowableSecond, string(abi.encodePacked("Invalid timestamp ", uintToStr(block.timestamp), ":", uintToStr(_timestamp), " (", uintToStr(allowableSecond ),")")) ); bytes32 message = keccak256(abi.encodePacked(_erc721Address, _erc20Address, _tokenId, _from, _value, _royaltyhash, signatureSalt, _timestamp)); address verifyaddress = message.toEthSignedMessageHash().recover(_signatureMessage); if(owner() == verifyaddress){ return true; } else { return getWhitelistinvoker(verifyaddress); } } function transferValue(address _erc20address, address payable to, address payable payer, uint value, address payable[] memory _receiveAddresses, uint[] memory _receiveFees) private { require(value > 0, 'The value is not enough.'); if(_erc20address != address(0x0)){ ERC20 ftcontract = ERC20(_erc20address); for (uint i = 0; i < _receiveAddresses.length; i++) { uint fee = _receiveFees[i]; value = value.sub(fee); ftcontract.transferFrom(payer, _receiveAddresses[i], fee); } ftcontract.transferFrom(payer, to, value); } else { for (uint i = 0; i < _receiveAddresses.length; i++) { uint fee = _receiveFees[i]; value = value.sub(fee); _receiveAddresses[i].transfer(fee); } to.transfer(value); } } function transferTokenAndValue(address _erc721Address, address _erc20address, address payable contractowner,uint _value, uint _tokenId, address payable _from, address payable _to, address payable[] memory _receiveAddresses, uint[] memory _receiveFees) private { ERC721 nftContract = ERC721(_erc721Address); address ownerAddress = nftContract.ownerOf(_tokenId); require(ownerAddress == _from, 'Owner information is incorrect.'); require(ownerAddress != _to, 'Transfer is incorrect.'); if (_value > 0) { if(contractowner != address(0x0)){ transferValue(_erc20address, _from, contractowner, _value, _receiveAddresses, _receiveFees); } else { transferValue(_erc20address, _from, _to, _value, _receiveAddresses, _receiveFees); } } nftContract.safeTransferFrom(_from, _to, _tokenId); } function purchaseTokenByETH(bytes calldata _signatureMessage,uint timestamp, address _erc721Address, uint _tokenId, address payable _from, address payable[] calldata _receiveAddresses, uint[] calldata _receiveFees) external payable { uint value = msg.value; address payable to = msg.sender; require(aclstatus,"Restricts the execution of contracts"); require(value > 0, 'The value is not enough.'); require(validateSignatureMessageToken(_signatureMessage, timestamp, _erc721Address, address(0x0),_tokenId, _from, value, keccak256(abi.encodePacked(_receiveAddresses, _receiveFees))), 'Signature message is invalid.'); transferTokenAndValue(_erc721Address, address(0x0), address(0x0),value, _tokenId, _from, to, _receiveAddresses, _receiveFees); } function purchaseTokenByERC20(bytes calldata _signatureMessage,uint timestamp, address _erc721Address,address _erc20address, uint _tokenId, uint _value,address payable _from, address payable[] calldata _receiveAddresses, uint[] calldata _receiveFees) external payable { uint value = _value; address payable to = msg.sender; require(aclstatus,"Restricts the execution of contracts"); require(value > 0, 'The value is not enough.'); require(validateSignatureMessageToken(_signatureMessage, timestamp, _erc721Address, _erc20address,_tokenId, _from, value, keccak256(abi.encodePacked(_receiveAddresses, _receiveFees))), 'Signature message is invalid.'); transferTokenAndValue(_erc721Address, _erc20address, address(0x0),value, _tokenId, _from, to, _receiveAddresses, _receiveFees); } function purchaseTokenByFiat(address _erc721Address,address _erc20Address,uint _tokenId, uint _value,address payable _from, address payable _to, address payable[] calldata _receiveAddresses, uint[] calldata _receiveFees) external payable { require(msg.sender == owner() || getWhitelistinvoker(msg.sender),'Not have call permission'); uint value; if(_erc20Address != address(0x0)){ value = _value; } else { value = msg.value; } transferTokenAndValue(_erc721Address, _erc20Address, msg.sender, value, _tokenId, _from, _to, _receiveAddresses, _receiveFees); } function RoiyaltysplitERC20(address _erc20address ,address payable[] calldata _splitAddresses ,uint[] calldata _splitFees) external payable { require(msg.sender == owner() || getWhitelistinvoker(msg.sender),'Not have call permission'); require(_splitAddresses.length > 0 && _splitFees.length > 0 ,'No split destination address or No split Fee'); require(_splitAddresses.length == _splitFees.length,'Defference element num splitaddress and splitfees array'); if(_erc20address != address(0x0)){ ERC20 ftcontract = ERC20(_erc20address); for(uint i = 0; i < _splitAddresses.length ; i++){ ftcontract.transferFrom(msg.sender, _splitAddresses[i], _splitFees[i]); } } else { uint value = msg.value; for(uint i = 0; i < _splitAddresses.length ; i++){ value = value.sub(_splitFees[i]); _splitAddresses[i].transfer(_splitFees[i]); } msg.sender.transfer(value); } } //PUBLIC関数のACL制御関数 /** * acl status に関して * aclstatus = false : コントラクト実行制限 * aclstatus = true : コントラクト実行可能 */ function Aclcontroll (bool _acl) public { require(msg.sender == owner() || getWhitelistinvoker(msg.sender),'Not have call permission'); aclstatus = _acl; } function airdroptoken(uint _distributeAmount ,address payable[] calldata _airdropAddresses) external payable { require(msg.sender == owner() || getWhitelistinvoker(msg.sender),'Not have call permission'); require(msg.value > 0,'There is no distribution amount'); require(_airdropAddresses.length > 0,'No AirDrop destination address'); require(_airdropAddresses.length.mul(_distributeAmount) == msg.value,' Total amount of distribution is incorrect'); for(uint i = 0; i < _airdropAddresses.length ; i++){ _airdropAddresses[i].transfer(_distributeAmount); } } function setWhitelistinvoker(address[] memory _whitelists) public onlyOwner{ require(_whitelists.length > 0,'Not found regist target of whitelist address'); for(uint i=0;i < _whitelists.length;i++){ whitelists[_whitelists[i]] = true; } } function deleteWhitelistinvoker(address deletetargetaddress) public onlyOwner{ delete whitelists[deletetargetaddress]; } function getWhitelistinvoker(address contractInvoker) public view returns (bool){ return whitelists[contractInvoker]; } function uintToStr(uint _i) internal pure returns (string memory _uintAsString) { uint number = _i; if (number == 0) { return "0"; } uint j = number; uint len; while (j != 0) { len++; j /= 10; } bytes memory bstr = new bytes(len); uint k = len - 1; while (number != 0) { bstr[k--] = byte(uint8(48 + number % 10)); number /= 10; } return string(bstr); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"constant":false,"inputs":[{"internalType":"bool","name":"_acl","type":"bool"}],"name":"Aclcontroll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_erc20address","type":"address"},{"internalType":"address payable[]","name":"_splitAddresses","type":"address[]"},{"internalType":"uint256[]","name":"_splitFees","type":"uint256[]"}],"name":"RoiyaltysplitERC20","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_distributeAmount","type":"uint256"},{"internalType":"address payable[]","name":"_airdropAddresses","type":"address[]"}],"name":"airdroptoken","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"deletetargetaddress","type":"address"}],"name":"deleteWhitelistinvoker","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getAllowableSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getSignatureSalt","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"contractInvoker","type":"address"}],"name":"getWhitelistinvoker","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes","name":"_signatureMessage","type":"bytes"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"address","name":"_erc721Address","type":"address"},{"internalType":"address","name":"_erc20address","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"address payable","name":"_from","type":"address"},{"internalType":"address payable[]","name":"_receiveAddresses","type":"address[]"},{"internalType":"uint256[]","name":"_receiveFees","type":"uint256[]"}],"name":"purchaseTokenByERC20","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes","name":"_signatureMessage","type":"bytes"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"address","name":"_erc721Address","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address payable","name":"_from","type":"address"},{"internalType":"address payable[]","name":"_receiveAddresses","type":"address[]"},{"internalType":"uint256[]","name":"_receiveFees","type":"uint256[]"}],"name":"purchaseTokenByETH","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_erc721Address","type":"address"},{"internalType":"address","name":"_erc20Address","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"address payable","name":"_from","type":"address"},{"internalType":"address payable","name":"_to","type":"address"},{"internalType":"address payable[]","name":"_receiveAddresses","type":"address[]"},{"internalType":"uint256[]","name":"_receiveFees","type":"uint256[]"}],"name":"purchaseTokenByFiat","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_allowableSecond","type":"uint256"}],"name":"setAllowableSecond","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"_signatureSalt","type":"string"}],"name":"setSignatureSalt","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"_whitelists","type":"address[]"}],"name":"setWhitelistinvoker","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b5060006100216100e960201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620151806002819055506001600360006101000a81548160ff0219169083151502179055506100f1565b600033905090565b61345380620001016000396000f3fe6080604052600436106101095760003560e01c80638dad9e4c11610095578063953142e611610064578063953142e6146107b9578063f2a7c8f81461095b578063f2fde38b14610a49578063fa18790414610a9a578063fdc46e3b14610b5f57610109565b80638dad9e4c1461068f5780638ec55e0d146106ca5780638f32d59b1461074d57806392cdd2af1461077c57610109565b8063529ad0ac116100dc578063529ad0ac14610394578063715018a614610424578063726eb10f1461043b57806377e17094146105b25780638da5cb5b1461063857610109565b80631e7be2101461010e5780632ab5a28e14610177578063349a09d9146101c85780633fa618a714610231575b600080fd5b34801561011a57600080fd5b5061015d6004803603602081101561013157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b8a565b604051808215151515815260200191505060405180910390f35b34801561018357600080fd5b506101c66004803603602081101561019a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610baa565b005b3480156101d457600080fd5b50610217600480360360208110156101eb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c76565b604051808215151515815260200191505060405180910390f35b610392600480360361010081101561024857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156102f957600080fd5b82018360208201111561030b57600080fd5b8035906020019184602083028401116401000000008311171561032d57600080fd5b90919293919293908035906020019064010000000081111561034e57600080fd5b82018360208201111561036057600080fd5b8035906020019184602083028401116401000000008311171561038257600080fd5b9091929391929390505050610ccc565b005b3480156103a057600080fd5b506103a9610e65565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103e95780820151818401526020810190506103ce565b50505050905090810190601f1680156104165780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561043057600080fd5b50610439610f81565b005b6105b0600480360360e081101561045157600080fd5b810190808035906020019064010000000081111561046e57600080fd5b82018360208201111561048057600080fd5b803590602001918460018302840111640100000000831117156104a257600080fd5b909192939192939080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561051757600080fd5b82018360208201111561052957600080fd5b8035906020019184602083028401116401000000008311171561054b57600080fd5b90919293919293908035906020019064010000000081111561056c57600080fd5b82018360208201111561057e57600080fd5b803590602001918460208302840111640100000000831117156105a057600080fd5b90919293919293905050506110ba565b005b3480156105be57600080fd5b50610636600480360360208110156105d557600080fd5b81019080803590602001906401000000008111156105f257600080fd5b82018360208201111561060457600080fd5b8035906020019184600183028401116401000000008311171561062657600080fd5b909192939192939050505061134e565b005b34801561064457600080fd5b5061064d6113de565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561069b57600080fd5b506106c8600480360360208110156106b257600080fd5b8101908080359060200190929190505050611407565b005b61074b600480360360408110156106e057600080fd5b81019080803590602001909291908035906020019064010000000081111561070757600080fd5b82018360208201111561071957600080fd5b8035906020019184602083028401116401000000008311171561073b57600080fd5b909192939192939050505061148b565b005b34801561075957600080fd5b50610762611732565b604051808215151515815260200191505060405180910390f35b34801561078857600080fd5b506107b76004803603602081101561079f57600080fd5b81019080803515159060200190929190505050611790565b005b61095960048036036101208110156107d057600080fd5b81019080803590602001906401000000008111156107ed57600080fd5b8201836020820111156107ff57600080fd5b8035906020019184600183028401116401000000008311171561082157600080fd5b909192939192939080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156108c057600080fd5b8201836020820111156108d257600080fd5b803590602001918460208302840111640100000000831117156108f457600080fd5b90919293919293908035906020019064010000000081111561091557600080fd5b82018360208201111561092757600080fd5b8035906020019184602083028401116401000000008311171561094957600080fd5b9091929391929390505050611865565b005b610a476004803603606081101561097157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156109ae57600080fd5b8201836020820111156109c057600080fd5b803590602001918460208302840111640100000000831117156109e257600080fd5b909192939192939080359060200190640100000000811115610a0357600080fd5b820183602082011115610a1557600080fd5b80359060200191846020830284011164010000000083111715610a3757600080fd5b9091929391929390505050611afa565b005b348015610a5557600080fd5b50610a9860048036036020811015610a6c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611f26565b005b348015610aa657600080fd5b50610b5d60048036036020811015610abd57600080fd5b8101908080359060200190640100000000811115610ada57600080fd5b820183602082011115610aec57600080fd5b80359060200191846020830284011164010000000083111715610b0e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050611fac565b005b348015610b6b57600080fd5b50610b7461210b565b6040518082815260200191505060405180910390f35b60046020528060005260406000206000915054906101000a900460ff1681565b610bb2611732565b610c24576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff021916905550565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610cd46113de565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610d125750610d1133610c76565b5b610d84576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4e6f7420686176652063616c6c207065726d697373696f6e000000000000000081525060200191505060405180910390fd5b60008073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff1614610dc157879050610dc5565b3490505b610e588b8b33848d8c8c8c8c80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508b8b80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505061218f565b5050505050505050505050565b6060610e6f611732565b610ee1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f775780601f10610f4c57610100808354040283529160200191610f77565b820191906000526020600020905b815481529060010190602001808311610f5a57829003601f168201915b5050505050905090565b610f89611732565b610ffb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60003490506000339050600360009054906101000a900460ff16611129576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806133ae6024913960400191505060405180910390fd5b6000821161119f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f5468652076616c7565206973206e6f7420656e6f7567682e000000000000000081525060200191505060405180910390fd5b61123a8c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508b8b60008c8c888d8d8d8d604051602001808585602002808284378083019250505083836020028082843780830192505050945050505050604051602081830303815290604052805190602001206124a7565b6112ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f5369676e6174757265206d65737361676520697320696e76616c69642e00000081525060200191505060405180910390fd5b61134089600080858c8c878d8d80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508c8c80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505061218f565b505050505050505050505050565b611356611732565b6113c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8181600191906113d9929190613255565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61140f611732565b611481576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8060028190555050565b6114936113de565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806114d157506114d033610c76565b5b611543576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4e6f7420686176652063616c6c207065726d697373696f6e000000000000000081525060200191505060405180910390fd5b600034116115b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5468657265206973206e6f20646973747269627574696f6e20616d6f756e740081525060200191505060405180910390fd5b60008282905011611632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4e6f2041697244726f702064657374696e6174696f6e2061646472657373000081525060200191505060405180910390fd5b3461164984848490506128f390919063ffffffff16565b1461169f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613384602a913960400191505060405180910390fd5b60008090505b8282905081101561172c578282828181106116bc57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc859081150290604051600060405180830381858888f1935050505015801561171e573d6000803e3d6000fd5b5080806001019150506116a5565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611774612979565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b6117986113de565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806117d657506117d533610c76565b5b611848576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4e6f7420686176652063616c6c207065726d697373696f6e000000000000000081525060200191505060405180910390fd5b80600360006101000a81548160ff02191690831515021790555050565b60008690506000339050600360009054906101000a900460ff166118d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806133ae6024913960400191505060405180910390fd5b6000821161194a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f5468652076616c7565206973206e6f7420656e6f7567682e000000000000000081525060200191505060405180910390fd5b6119e48e8e8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508d8d8d8d8c888d8d8d8d604051602001808585602002808284378083019250505083836020028082843780830192505050945050505050604051602081830303815290604052805190602001206124a7565b611a56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f5369676e6174757265206d65737361676520697320696e76616c69642e00000081525060200191505060405180910390fd5b611aea8b8b6000858d8c878d8d80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508c8c80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505061218f565b5050505050505050505050505050565b611b026113de565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611b405750611b3f33610c76565b5b611bb2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4e6f7420686176652063616c6c207065726d697373696f6e000000000000000081525060200191505060405180910390fd5b600084849050118015611bc85750600082829050115b611c1d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806132fb602c913960400191505060405180910390fd5b818190508484905014611c7b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603781526020018061334d6037913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614611e0a57600085905060008090505b85859050811015611e03578173ffffffffffffffffffffffffffffffffffffffff166323b872dd33888885818110611cee57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16878786818110611d1757fe5b905060200201356040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015611dba57600080fd5b505af1158015611dce573d6000803e3d6000fd5b505050506040513d6020811015611de457600080fd5b8101908080519060200190929190505050508080600101915050611cba565b5050611f1f565b600034905060008090505b85859050811015611ed557611e45848483818110611e2f57fe5b905060200201358361298190919063ffffffff16565b9150858582818110611e5357fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc858584818110611e9557fe5b905060200201359081150290604051600060405180830381858888f19350505050158015611ec7573d6000803e3d6000fd5b508080600101915050611e15565b503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611f1c573d6000803e3d6000fd5b50505b5050505050565b611f2e611732565b611fa0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b611fa9816129cb565b50565b611fb4611732565b612026576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000815111612080576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806133f3602c913960400191505060405180910390fd5b60008090505b8151811015612107576001600460008484815181106120a157fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080600101915050612086565b5050565b6000612115611732565b612187576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600254905090565b600089905060008173ffffffffffffffffffffffffffffffffffffffff16636352211e886040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156121e757600080fd5b505afa1580156121fb573d6000803e3d6000fd5b505050506040513d602081101561221157600080fd5b810190808051906020019092919050505090508573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146122c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4f776e657220696e666f726d6174696f6e20697320696e636f72726563742e0081525060200191505060405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612367576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f5472616e7366657220697320696e636f72726563742e0000000000000000000081525060200191505060405180910390fd5b60008811156123c757600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16146123b7576123b28a878b8b8888612b0f565b6123c6565b6123c58a87878b8888612b0f565b5b5b8173ffffffffffffffffffffffffffffffffffffffff166342842e0e87878a6040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b15801561248257600080fd5b505af1158015612496573d6000803e3d6000fd5b505050505050505050505050505050565b600060025488420310806124be5750600254428903105b6124c742612f05565b6124d08a612f05565b6124db600254612f05565b60405160200180807f496e76616c69642074696d657374616d7020000000000000000000000000000081525060120184805190602001908083835b602083106125395780518252602082019150602081019050602083039250612516565b6001836020036101000a038019825116818451168082178552505050505050905001807f3a0000000000000000000000000000000000000000000000000000000000000081525060010183805190602001908083835b602083106125b2578051825260208201915060208101905060208303925061258f565b6001836020036101000a038019825116818451168082178552505050505050905001807f202800000000000000000000000000000000000000000000000000000000000081525060020182805190602001908083835b6020831061262b5780518252602082019150602081019050602083039250612608565b6001836020036101000a038019825116818451168082178552505050505050905001807f290000000000000000000000000000000000000000000000000000000000000081525060010193505050506040516020818303038152906040529061272f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156126f45780820151818401526020810190506126d9565b50505050905090810190601f1680156127215780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600087878787878760018f604051602001808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018781526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018581526020018481526020018380546001816001161561010002031660029004801561284a5780601f1061282857610100808354040283529182019161284a565b820191906000526020600020905b815481529060010190602001808311612836575b50508281526020019850505050505050505060405160208183030381529060405280519060200120905060006128918b61288384613039565b61309190919063ffffffff16565b90508073ffffffffffffffffffffffffffffffffffffffff166128b26113de565b73ffffffffffffffffffffffffffffffffffffffff1614156128d9576001925050506128e7565b6128e281610c76565b925050505b98975050505050505050565b6000808314156129065760009050612973565b600082840290508284828161291757fe5b041461296e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806133d26021913960400191505060405180910390fd5b809150505b92915050565b600033905090565b60006129c383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613195565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612a51576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806133276026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008311612b85576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f5468652076616c7565206973206e6f7420656e6f7567682e000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614612e1057600086905060008090505b8351811015612d12576000838281518110612bdb57fe5b60200260200101519050612bf8818761298190919063ffffffff16565b95508273ffffffffffffffffffffffffffffffffffffffff166323b872dd88878581518110612c2357fe5b6020026020010151846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015612cc857600080fd5b505af1158015612cdc573d6000803e3d6000fd5b505050506040513d6020811015612cf257600080fd5b810190808051906020019092919050505050508080600101915050612bc4565b508073ffffffffffffffffffffffffffffffffffffffff166323b872dd8688876040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015612dce57600080fd5b505af1158015612de2573d6000803e3d6000fd5b505050506040513d6020811015612df857600080fd5b81019080805190602001909291905050505050612efd565b60008090505b8251811015612eb4576000828281518110612e2d57fe5b60200260200101519050612e4a818661298190919063ffffffff16565b9450838281518110612e5857fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612ea5573d6000803e3d6000fd5b50508080600101915050612e16565b508473ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015612efb573d6000803e3d6000fd5b505b505050505050565b606060008290506000811415612f53576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250915050613034565b600081905060005b60008214612f7d578080600101915050600a8281612f7557fe5b049150612f5b565b6060816040519080825280601f01601f191660200182016040528015612fb25781602001600182028038833980820191505090505b50905060006001830390505b6000851461302b57600a8581612fd057fe5b0660300160f81b82828060019003935081518110612fea57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a858161302357fe5b049450612fbe565b81955050505050505b919050565b60008160405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c01828152602001915050604051602081830303815290604052805190602001209050919050565b600060418251146130a5576000905061318f565b60008060006020850151925060408501519150606085015160001a90507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08260001c11156130f9576000935050505061318f565b601b8160ff16141580156131115750601c8160ff1614155b15613122576000935050505061318f565b60018682858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561317f573d6000803e3d6000fd5b5050506020604051035193505050505b92915050565b6000838311158290613242576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156132075780820151818401526020810190506131ec565b50505050905090810190601f1680156132345780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061329657803560ff19168380011785556132c4565b828001600101855582156132c4579182015b828111156132c35782358255916020019190600101906132a8565b5b5090506132d191906132d5565b5090565b6132f791905b808211156132f35760008160009055506001016132db565b5090565b9056fe4e6f2073706c69742064657374696e6174696f6e2061646472657373206f72204e6f2073706c6974204665654f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373446566666572656e636520656c656d656e74206e756d2073706c69746164647265737320616e642073706c69746665657320617272617920546f74616c20616d6f756e74206f6620646973747269627574696f6e20697320696e636f72726563745265737472696374732074686520657865637574696f6e206f6620636f6e747261637473536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774e6f7420666f756e642072656769737420746172676574206f662077686974656c6973742061646472657373a265627a7a72315820381c83b844746843fbe66959ce88e68c5070d0505724ec8d785f46fe3a5f77f964736f6c63430005100032
Deployed Bytecode
0x6080604052600436106101095760003560e01c80638dad9e4c11610095578063953142e611610064578063953142e6146107b9578063f2a7c8f81461095b578063f2fde38b14610a49578063fa18790414610a9a578063fdc46e3b14610b5f57610109565b80638dad9e4c1461068f5780638ec55e0d146106ca5780638f32d59b1461074d57806392cdd2af1461077c57610109565b8063529ad0ac116100dc578063529ad0ac14610394578063715018a614610424578063726eb10f1461043b57806377e17094146105b25780638da5cb5b1461063857610109565b80631e7be2101461010e5780632ab5a28e14610177578063349a09d9146101c85780633fa618a714610231575b600080fd5b34801561011a57600080fd5b5061015d6004803603602081101561013157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b8a565b604051808215151515815260200191505060405180910390f35b34801561018357600080fd5b506101c66004803603602081101561019a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610baa565b005b3480156101d457600080fd5b50610217600480360360208110156101eb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c76565b604051808215151515815260200191505060405180910390f35b610392600480360361010081101561024857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156102f957600080fd5b82018360208201111561030b57600080fd5b8035906020019184602083028401116401000000008311171561032d57600080fd5b90919293919293908035906020019064010000000081111561034e57600080fd5b82018360208201111561036057600080fd5b8035906020019184602083028401116401000000008311171561038257600080fd5b9091929391929390505050610ccc565b005b3480156103a057600080fd5b506103a9610e65565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103e95780820151818401526020810190506103ce565b50505050905090810190601f1680156104165780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561043057600080fd5b50610439610f81565b005b6105b0600480360360e081101561045157600080fd5b810190808035906020019064010000000081111561046e57600080fd5b82018360208201111561048057600080fd5b803590602001918460018302840111640100000000831117156104a257600080fd5b909192939192939080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561051757600080fd5b82018360208201111561052957600080fd5b8035906020019184602083028401116401000000008311171561054b57600080fd5b90919293919293908035906020019064010000000081111561056c57600080fd5b82018360208201111561057e57600080fd5b803590602001918460208302840111640100000000831117156105a057600080fd5b90919293919293905050506110ba565b005b3480156105be57600080fd5b50610636600480360360208110156105d557600080fd5b81019080803590602001906401000000008111156105f257600080fd5b82018360208201111561060457600080fd5b8035906020019184600183028401116401000000008311171561062657600080fd5b909192939192939050505061134e565b005b34801561064457600080fd5b5061064d6113de565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561069b57600080fd5b506106c8600480360360208110156106b257600080fd5b8101908080359060200190929190505050611407565b005b61074b600480360360408110156106e057600080fd5b81019080803590602001909291908035906020019064010000000081111561070757600080fd5b82018360208201111561071957600080fd5b8035906020019184602083028401116401000000008311171561073b57600080fd5b909192939192939050505061148b565b005b34801561075957600080fd5b50610762611732565b604051808215151515815260200191505060405180910390f35b34801561078857600080fd5b506107b76004803603602081101561079f57600080fd5b81019080803515159060200190929190505050611790565b005b61095960048036036101208110156107d057600080fd5b81019080803590602001906401000000008111156107ed57600080fd5b8201836020820111156107ff57600080fd5b8035906020019184600183028401116401000000008311171561082157600080fd5b909192939192939080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156108c057600080fd5b8201836020820111156108d257600080fd5b803590602001918460208302840111640100000000831117156108f457600080fd5b90919293919293908035906020019064010000000081111561091557600080fd5b82018360208201111561092757600080fd5b8035906020019184602083028401116401000000008311171561094957600080fd5b9091929391929390505050611865565b005b610a476004803603606081101561097157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156109ae57600080fd5b8201836020820111156109c057600080fd5b803590602001918460208302840111640100000000831117156109e257600080fd5b909192939192939080359060200190640100000000811115610a0357600080fd5b820183602082011115610a1557600080fd5b80359060200191846020830284011164010000000083111715610a3757600080fd5b9091929391929390505050611afa565b005b348015610a5557600080fd5b50610a9860048036036020811015610a6c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611f26565b005b348015610aa657600080fd5b50610b5d60048036036020811015610abd57600080fd5b8101908080359060200190640100000000811115610ada57600080fd5b820183602082011115610aec57600080fd5b80359060200191846020830284011164010000000083111715610b0e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050611fac565b005b348015610b6b57600080fd5b50610b7461210b565b6040518082815260200191505060405180910390f35b60046020528060005260406000206000915054906101000a900460ff1681565b610bb2611732565b610c24576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff021916905550565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610cd46113de565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610d125750610d1133610c76565b5b610d84576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4e6f7420686176652063616c6c207065726d697373696f6e000000000000000081525060200191505060405180910390fd5b60008073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff1614610dc157879050610dc5565b3490505b610e588b8b33848d8c8c8c8c80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508b8b80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505061218f565b5050505050505050505050565b6060610e6f611732565b610ee1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f775780601f10610f4c57610100808354040283529160200191610f77565b820191906000526020600020905b815481529060010190602001808311610f5a57829003601f168201915b5050505050905090565b610f89611732565b610ffb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60003490506000339050600360009054906101000a900460ff16611129576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806133ae6024913960400191505060405180910390fd5b6000821161119f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f5468652076616c7565206973206e6f7420656e6f7567682e000000000000000081525060200191505060405180910390fd5b61123a8c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508b8b60008c8c888d8d8d8d604051602001808585602002808284378083019250505083836020028082843780830192505050945050505050604051602081830303815290604052805190602001206124a7565b6112ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f5369676e6174757265206d65737361676520697320696e76616c69642e00000081525060200191505060405180910390fd5b61134089600080858c8c878d8d80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508c8c80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505061218f565b505050505050505050505050565b611356611732565b6113c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8181600191906113d9929190613255565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61140f611732565b611481576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8060028190555050565b6114936113de565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806114d157506114d033610c76565b5b611543576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4e6f7420686176652063616c6c207065726d697373696f6e000000000000000081525060200191505060405180910390fd5b600034116115b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5468657265206973206e6f20646973747269627574696f6e20616d6f756e740081525060200191505060405180910390fd5b60008282905011611632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4e6f2041697244726f702064657374696e6174696f6e2061646472657373000081525060200191505060405180910390fd5b3461164984848490506128f390919063ffffffff16565b1461169f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613384602a913960400191505060405180910390fd5b60008090505b8282905081101561172c578282828181106116bc57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc859081150290604051600060405180830381858888f1935050505015801561171e573d6000803e3d6000fd5b5080806001019150506116a5565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611774612979565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b6117986113de565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806117d657506117d533610c76565b5b611848576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4e6f7420686176652063616c6c207065726d697373696f6e000000000000000081525060200191505060405180910390fd5b80600360006101000a81548160ff02191690831515021790555050565b60008690506000339050600360009054906101000a900460ff166118d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806133ae6024913960400191505060405180910390fd5b6000821161194a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f5468652076616c7565206973206e6f7420656e6f7567682e000000000000000081525060200191505060405180910390fd5b6119e48e8e8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508d8d8d8d8c888d8d8d8d604051602001808585602002808284378083019250505083836020028082843780830192505050945050505050604051602081830303815290604052805190602001206124a7565b611a56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f5369676e6174757265206d65737361676520697320696e76616c69642e00000081525060200191505060405180910390fd5b611aea8b8b6000858d8c878d8d80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508c8c80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505061218f565b5050505050505050505050505050565b611b026113de565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611b405750611b3f33610c76565b5b611bb2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4e6f7420686176652063616c6c207065726d697373696f6e000000000000000081525060200191505060405180910390fd5b600084849050118015611bc85750600082829050115b611c1d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806132fb602c913960400191505060405180910390fd5b818190508484905014611c7b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603781526020018061334d6037913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614611e0a57600085905060008090505b85859050811015611e03578173ffffffffffffffffffffffffffffffffffffffff166323b872dd33888885818110611cee57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16878786818110611d1757fe5b905060200201356040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015611dba57600080fd5b505af1158015611dce573d6000803e3d6000fd5b505050506040513d6020811015611de457600080fd5b8101908080519060200190929190505050508080600101915050611cba565b5050611f1f565b600034905060008090505b85859050811015611ed557611e45848483818110611e2f57fe5b905060200201358361298190919063ffffffff16565b9150858582818110611e5357fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc858584818110611e9557fe5b905060200201359081150290604051600060405180830381858888f19350505050158015611ec7573d6000803e3d6000fd5b508080600101915050611e15565b503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611f1c573d6000803e3d6000fd5b50505b5050505050565b611f2e611732565b611fa0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b611fa9816129cb565b50565b611fb4611732565b612026576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000815111612080576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806133f3602c913960400191505060405180910390fd5b60008090505b8151811015612107576001600460008484815181106120a157fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080600101915050612086565b5050565b6000612115611732565b612187576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600254905090565b600089905060008173ffffffffffffffffffffffffffffffffffffffff16636352211e886040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156121e757600080fd5b505afa1580156121fb573d6000803e3d6000fd5b505050506040513d602081101561221157600080fd5b810190808051906020019092919050505090508573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146122c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4f776e657220696e666f726d6174696f6e20697320696e636f72726563742e0081525060200191505060405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612367576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f5472616e7366657220697320696e636f72726563742e0000000000000000000081525060200191505060405180910390fd5b60008811156123c757600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16146123b7576123b28a878b8b8888612b0f565b6123c6565b6123c58a87878b8888612b0f565b5b5b8173ffffffffffffffffffffffffffffffffffffffff166342842e0e87878a6040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b15801561248257600080fd5b505af1158015612496573d6000803e3d6000fd5b505050505050505050505050505050565b600060025488420310806124be5750600254428903105b6124c742612f05565b6124d08a612f05565b6124db600254612f05565b60405160200180807f496e76616c69642074696d657374616d7020000000000000000000000000000081525060120184805190602001908083835b602083106125395780518252602082019150602081019050602083039250612516565b6001836020036101000a038019825116818451168082178552505050505050905001807f3a0000000000000000000000000000000000000000000000000000000000000081525060010183805190602001908083835b602083106125b2578051825260208201915060208101905060208303925061258f565b6001836020036101000a038019825116818451168082178552505050505050905001807f202800000000000000000000000000000000000000000000000000000000000081525060020182805190602001908083835b6020831061262b5780518252602082019150602081019050602083039250612608565b6001836020036101000a038019825116818451168082178552505050505050905001807f290000000000000000000000000000000000000000000000000000000000000081525060010193505050506040516020818303038152906040529061272f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156126f45780820151818401526020810190506126d9565b50505050905090810190601f1680156127215780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600087878787878760018f604051602001808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018781526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018581526020018481526020018380546001816001161561010002031660029004801561284a5780601f1061282857610100808354040283529182019161284a565b820191906000526020600020905b815481529060010190602001808311612836575b50508281526020019850505050505050505060405160208183030381529060405280519060200120905060006128918b61288384613039565b61309190919063ffffffff16565b90508073ffffffffffffffffffffffffffffffffffffffff166128b26113de565b73ffffffffffffffffffffffffffffffffffffffff1614156128d9576001925050506128e7565b6128e281610c76565b925050505b98975050505050505050565b6000808314156129065760009050612973565b600082840290508284828161291757fe5b041461296e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806133d26021913960400191505060405180910390fd5b809150505b92915050565b600033905090565b60006129c383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613195565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612a51576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806133276026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008311612b85576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f5468652076616c7565206973206e6f7420656e6f7567682e000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614612e1057600086905060008090505b8351811015612d12576000838281518110612bdb57fe5b60200260200101519050612bf8818761298190919063ffffffff16565b95508273ffffffffffffffffffffffffffffffffffffffff166323b872dd88878581518110612c2357fe5b6020026020010151846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015612cc857600080fd5b505af1158015612cdc573d6000803e3d6000fd5b505050506040513d6020811015612cf257600080fd5b810190808051906020019092919050505050508080600101915050612bc4565b508073ffffffffffffffffffffffffffffffffffffffff166323b872dd8688876040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015612dce57600080fd5b505af1158015612de2573d6000803e3d6000fd5b505050506040513d6020811015612df857600080fd5b81019080805190602001909291905050505050612efd565b60008090505b8251811015612eb4576000828281518110612e2d57fe5b60200260200101519050612e4a818661298190919063ffffffff16565b9450838281518110612e5857fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612ea5573d6000803e3d6000fd5b50508080600101915050612e16565b508473ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015612efb573d6000803e3d6000fd5b505b505050505050565b606060008290506000811415612f53576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250915050613034565b600081905060005b60008214612f7d578080600101915050600a8281612f7557fe5b049150612f5b565b6060816040519080825280601f01601f191660200182016040528015612fb25781602001600182028038833980820191505090505b50905060006001830390505b6000851461302b57600a8581612fd057fe5b0660300160f81b82828060019003935081518110612fea57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a858161302357fe5b049450612fbe565b81955050505050505b919050565b60008160405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c01828152602001915050604051602081830303815290604052805190602001209050919050565b600060418251146130a5576000905061318f565b60008060006020850151925060408501519150606085015160001a90507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08260001c11156130f9576000935050505061318f565b601b8160ff16141580156131115750601c8160ff1614155b15613122576000935050505061318f565b60018682858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561317f573d6000803e3d6000fd5b5050506020604051035193505050505b92915050565b6000838311158290613242576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156132075780820151818401526020810190506131ec565b50505050905090810190601f1680156132345780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061329657803560ff19168380011785556132c4565b828001600101855582156132c4579182015b828111156132c35782358255916020019190600101906132a8565b5b5090506132d191906132d5565b5090565b6132f791905b808211156132f35760008160009055506001016132db565b5090565b9056fe4e6f2073706c69742064657374696e6174696f6e2061646472657373206f72204e6f2073706c6974204665654f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373446566666572656e636520656c656d656e74206e756d2073706c69746164647265737320616e642073706c69746665657320617272617920546f74616c20616d6f756e74206f6620646973747269627574696f6e20697320696e636f72726563745265737472696374732074686520657865637574696f6e206f6620636f6e747261637473536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774e6f7420666f756e642072656769737420746172676574206f662077686974656c6973742061646472657373a265627a7a72315820381c83b844746843fbe66959ce88e68c5070d0505724ec8d785f46fe3a5f77f964736f6c63430005100032
Deployed Bytecode Sourcemap
50778:8532:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50999:42;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50999:42:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;50999:42:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;58582:130;;8:9:-1;5:2;;;30:1;27;20:12;5:2;58582:130:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;58582:130:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;58720:129;;8:9:-1;5:2;;;30:1;27;20:12;5:2;58720:129:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;58720:129:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;55743:603;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;55743:603:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;55743:603:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;55743:603:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;55743:603:0;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;55743:603:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;55743:603:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;55743:603:0;;;;;;;;;;;;:::i;:::-;;51135:103;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51135:103:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;51135:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34951:140;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34951:140:0;;;:::i;:::-;;54142:777;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;54142:777:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;54142:777:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;54142:777:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;54142:777:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;54142:777:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;54142:777:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;54142:777:0;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;54142:777:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;54142:777:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;54142:777:0;;;;;;;;;;;;:::i;:::-;;51243:117;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51243:117:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;51243:117:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;51243:117:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;51243:117:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;51243:117:0;;;;;;;;;;;;:::i;:::-;;34140:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34140:79:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;51469:114;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51469:114:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;51469:114:0;;;;;;;;;;;;;;;;;:::i;:::-;;57697:597;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;57697:597:0;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;57697:597:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;57697:597:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;57697:597:0;;;;;;;;;;;;:::i;:::-;;34506:94;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34506:94:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;57519:168;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57519:168:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;57519:168:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;54925:812;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;54925:812:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;54925:812:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;54925:812:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;54925:812:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;54925:812:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;54925:812:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;54925:812:0;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;54925:812:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;54925:812:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;54925:812:0;;;;;;;;;;;;:::i;:::-;;56356:963;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;56356:963:0;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;56356:963:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;56356:963:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;56356:963:0;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;56356:963:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;56356:963:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;56356:963:0;;;;;;;;;;;;:::i;:::-;;35246:109;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35246:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35246:109:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;58302:272;;8:9:-1;5:2;;;30:1;27;20:12;5:2;58302:272:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;58302:272:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;58302:272:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;58302:272:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;58302:272:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;58302:272:0;;;;;;;;;;;;;;;:::i;:::-;;51366:98;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51366:98:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;50999:42;;;;;;;;;;;;;;;;;;;;;;:::o;58582:130::-;34352:9;:7;:9::i;:::-;34344:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58675:10;:31;58686:19;58675:31;;;;;;;;;;;;;;;;58668:38;;;;;;;;;;;58582:130;:::o;58720:129::-;58795:4;58816:10;:27;58827:15;58816:27;;;;;;;;;;;;;;;;;;;;;;;;;58809:34;;58720:129;;;:::o;55743:603::-;56010:7;:5;:7::i;:::-;55996:21;;:10;:21;;;:56;;;;56021:31;56041:10;56021:19;:31::i;:::-;55996:56;55988:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56087:10;56132:3;56107:29;;:13;:29;;;56104:104;;56154:6;56146:14;;56104:104;;;56191:9;56183:17;;56104:104;56214:126;56236:14;56252:13;56267:10;56279:5;56286:8;56296:5;56303:3;56308:17;;56214:126;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;56214:126:0;;;;;;56327:12;;56214:126;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;56214:126:0;;;;;;:21;:126::i;:::-;55743:603;;;;;;;;;;;:::o;51135:103::-;51193:13;34352:9;:7;:9::i;:::-;34344:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51220:13;51213:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51135:103;:::o;34951:140::-;34352:9;:7;:9::i;:::-;34344:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35050:1;35013:40;;35034:6;;;;;;;;;;;35013:40;;;;;;;;;;;;35081:1;35064:6;;:19;;;;;;;;;;;;;;;;;;34951:140::o;54142:777::-;54381:10;54394:9;54381:22;;54410:18;54431:10;54410:31;;54456:9;;;;;;;;;;;54448:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54528:1;54520:5;:9;54512:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54573:174;54603:17;;54573:174;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;54573:174:0;;;;;;54622:9;54633:14;54657:3;54662:8;54672:5;54679;54713:17;;54732:12;;54696:49;;;;;;;;;30:3:-1;22:6;14;1:33;57:3;49:6;45:16;35:26;;54696:49:0;;;;;;30:3:-1;22:6;14;1:33;57:3;49:6;45:16;35:26;;54696:49:0;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;54696::0;;;54686:60;;;;;;54573:29;:174::i;:::-;54565:216;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54788:125;54810:14;54834:3;54848;54853:5;54860:8;54870:5;54877:2;54881:17;;54788:125;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;54788:125:0;;;;;;54900:12;;54788:125;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;54788:125:0;;;;;;:21;:125::i;:::-;54142:777;;;;;;;;;;;;:::o;51243:117::-;34352:9;:7;:9::i;:::-;34344:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51341:14;;51325:13;:30;;;;;;;:::i;:::-;;51243:117;;:::o;34140:79::-;34178:7;34205:6;;;;;;;;;;;34198:13;;34140:79;:::o;51469:114::-;34352:9;:7;:9::i;:::-;34344:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51562:16;51544:15;:34;;;;51469:114;:::o;57697:597::-;57835:7;:5;:7::i;:::-;57821:21;;:10;:21;;;:56;;;;57846:31;57866:10;57846:19;:31::i;:::-;57821:56;57813:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57932:1;57920:9;:13;57912:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58010:1;57983:17;;:24;;:28;57975:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58111:9;58060:47;58089:17;58060;;:24;;:28;;:47;;;;:::i;:::-;:60;58052:114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58177:6;58186:1;58177:10;;58173:116;58193:17;;:24;;58189:1;:28;58173:116;;;58233:17;;58251:1;58233:20;;;;;;;;;;;;;;;:29;;:48;58263:17;58233:48;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;58233:48:0;58220:3;;;;;;;58173:116;;;;57697:597;;;:::o;34506:94::-;34546:4;34586:6;;;;;;;;;;;34570:22;;:12;:10;:12::i;:::-;:22;;;34563:29;;34506:94;:::o;57519:168::-;57588:7;:5;:7::i;:::-;57574:21;;:10;:21;;;:56;;;;57599:31;57619:10;57599:19;:31::i;:::-;57574:56;57566:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57677:4;57665:9;;:16;;;;;;;;;;;;;;;;;;57519:168;:::o;54925:812::-;55200:10;55213:6;55200:19;;55226:18;55247:10;55226:31;;55272:9;;;;;;;;;;;55264:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55344:1;55336:5;:9;55328:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55389:175;55419:17;;55389:175;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;55389:175:0;;;;;;55438:9;55449:14;55465:13;55479:8;55489:5;55496;55530:17;;55549:12;;55513:49;;;;;;;;;30:3:-1;22:6;14;1:33;57:3;49:6;45:16;35:26;;55513:49:0;;;;;;30:3:-1;22:6;14;1:33;57:3;49:6;45:16;35:26;;55513:49:0;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;55513::0;;;55503:60;;;;;;55389:29;:175::i;:::-;55381:217;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55605:126;55627:14;55643:13;55666:3;55671:5;55678:8;55688:5;55695:2;55699:17;;55605:126;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;55605:126:0;;;;;;55718:12;;55605:126;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;55605:126:0;;;;;;:21;:126::i;:::-;54925:812;;;;;;;;;;;;;;:::o;56356:963::-;56525:7;:5;:7::i;:::-;56511:21;;:10;:21;;;:56;;;;56536:31;56556:10;56536:19;:31::i;:::-;56511:56;56503:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56635:1;56610:15;;:22;;:26;:51;;;;;56660:1;56640:10;;:17;;:21;56610:51;56602:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56751:10;;:17;;56725:15;;:22;;:43;56717:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56862:3;56837:29;;:13;:29;;;56834:480;;56876:16;56901:13;56876:39;;56928:6;56937:1;56928:10;;56924:140;56944:15;;:22;;56940:1;:26;56924:140;;;56984:10;:23;;;57008:10;57020:15;;57036:1;57020:18;;;;;;;;;;;;;;;57040:10;;57051:1;57040:13;;;;;;;;;;;;;56984:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56984:70:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56984:70:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;56984:70:0;;;;;;;;;;;;;;;;;56969:3;;;;;;;56924:140;;;;56834:480;;;;57086:10;57099:9;57086:22;;57121:6;57130:1;57121:10;;57117:155;57137:15;;:22;;57133:1;:26;57117:155;;;57185:24;57195:10;;57206:1;57195:13;;;;;;;;;;;;;57185:5;:9;;:24;;;;:::i;:::-;57177:32;;57220:15;;57236:1;57220:18;;;;;;;;;;;;;;;:27;;:42;57248:10;;57259:1;57248:13;;;;;;;;;;;;;57220:42;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57220:42:0;57162:3;;;;;;;57117:155;;;;57280:10;:19;;:26;57300:5;57280:26;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57280:26:0;56834:480;;56356:963;;;;;:::o;35246:109::-;34352:9;:7;:9::i;:::-;34344:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35319:28;35338:8;35319:18;:28::i;:::-;35246:109;:::o;58302:272::-;34352:9;:7;:9::i;:::-;34344:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58415:1;58394:11;:18;:22;58386:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58477:6;58484:1;58477:8;;58473:96;58490:11;:18;58486:1;:22;58473:96;;;58555:4;58526:10;:26;58537:11;58549:1;58537:14;;;;;;;;;;;;;;58526:26;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;58509:3;;;;;;;58473:96;;;;58302:272;:::o;51366:98::-;51426:4;34352:9;:7;:9::i;:::-;34344:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51444:15;;51437:22;;51366:98;:::o;53278:858::-;53545:18;53573:14;53545:43;;53595:20;53618:11;:19;;;53638:8;53618:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53618:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53618:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;53618:29:0;;;;;;;;;;;;;;;;53595:52;;53678:5;53662:21;;:12;:21;;;53654:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53750:3;53734:19;;:12;:19;;;;53726:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53800:1;53791:6;:10;53787:287;;;53840:3;53815:29;;:13;:29;;;53812:255;;53856:92;53870:13;53886:5;53893:13;53908:6;53916:17;53935:12;53856:13;:92::i;:::-;53812:255;;;53975:82;53989:13;54005:5;54012:3;54017:6;54025:17;54044:12;53975:13;:82::i;:::-;53812:255;53787:287;54080:11;:28;;;54109:5;54116:3;54121:8;54080:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54080:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54080:50:0;;;;53278:858;;;;;;;;;;;:::o;51593:852::-;51812:4;51863:15;;51850:10;51832:15;:28;:46;:96;;;;51913:15;;51895;51882:10;:28;:46;51832:96;51976:26;51986:15;51976:9;:26::i;:::-;52009:21;52019:10;52009:9;:21::i;:::-;52039:27;52049:15;;52039:9;:27::i;:::-;51937:134;;;;;;;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;51937:134:0;;;;;;;;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;51937:134:0;;;;;;;;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;51937:134:0;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;51937:134:0;;;51824:250;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;51824:250:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52081:15;52126:14;52142:13;52157:8;52167:5;52174:6;52182:12;52196:13;52211:10;52109:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;52109:113:0;;;52099:124;;;;;;52081:142;;52230:21;52254:59;52295:17;52254:32;:7;:30;:32::i;:::-;:40;;:59;;;;:::i;:::-;52230:83;;52334:13;52323:24;;:7;:5;:7::i;:::-;:24;;;52320:120;;;52364:4;52357:11;;;;;;52320:120;52398:34;52418:13;52398:19;:34::i;:::-;52391:41;;;;51593:852;;;;;;;;;;;:::o;7657:471::-;7715:7;7965:1;7960;:6;7956:47;;;7990:1;7983:8;;;;7956:47;8015:9;8031:1;8027;:5;8015:17;;8060:1;8055;8051;:5;;;;;;:10;8043:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8119:1;8112:8;;;7657:471;;;;;:::o;858:98::-;903:15;938:10;931:17;;858:98;:::o;6741:136::-;6799:7;6826:43;6830:1;6833;6826:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;6819:50;;6741:136;;;;:::o;35461:229::-;35555:1;35535:22;;:8;:22;;;;35527:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35645:8;35616:38;;35637:6;;;;;;;;;;;35616:38;;;;;;;;;;;;35674:8;35665:6;;:17;;;;;;;;;;;;;;;;;;35461:229;:::o;52451:819::-;52655:1;52647:5;:9;52639:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52720:3;52695:29;;:13;:29;;;52692:573;;52734:16;52759:13;52734:39;;52787:6;52796:1;52787:10;;52782:200;52803:17;:24;52799:1;:28;52782:200;;;52845:8;52856:12;52869:1;52856:15;;;;;;;;;;;;;;52845:26;;52890:14;52900:3;52890:5;:9;;:14;;;;:::i;:::-;52882:22;;52915:10;:23;;;52939:5;52946:17;52964:1;52946:20;;;;;;;;;;;;;;52968:3;52915:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52915:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52915:57:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;52915:57:0;;;;;;;;;;;;;;;;;52782:200;52829:3;;;;;;;52782:200;;;;52990:10;:23;;;53014:5;53021:2;53025:5;52990:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52990:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52990:41:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;52990:41:0;;;;;;;;;;;;;;;;;52692:573;;;;53059:6;53068:1;53059:10;;53054:177;53075:17;:24;53071:1;:28;53054:177;;;53117:8;53128:12;53141:1;53128:15;;;;;;;;;;;;;;53117:26;;53162:14;53172:3;53162:5;:9;;:14;;;;:::i;:::-;53154:22;;53187:17;53205:1;53187:20;;;;;;;;;;;;;;:29;;:34;53217:3;53187:34;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53187:34:0;53054:177;53101:3;;;;;;;53054:177;;;;53239:2;:11;;:18;53251:5;53239:18;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53239:18:0;52692:573;52451:819;;;;;;:::o;58855:450::-;58906:27;58942:11;58956:2;58942:16;;58979:1;58969:6;:11;58965:44;;;58991:10;;;;;;;;;;;;;;;;;;;;;;58965:44;59015:6;59024;59015:15;;59037:8;59052:53;59064:1;59059;:6;59052:53;;59076:5;;;;;;;59095:2;59090:7;;;;;;;;;59052:53;;;59111:17;59141:3;59131:14;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;116:4;104:10;96:6;87:34;147:4;139:6;135:17;125:27;;0:156;59131:14:0;;;;59111:34;;59152:6;59167:1;59161:3;:7;59152:16;;59175:99;59192:1;59182:6;:11;59175:99;;59241:2;59232:6;:11;;;;;;59227:2;:16;59216:29;;59204:4;59209:3;;;;;;;59204:9;;;;;;;;;;;:41;;;;;;;;;;;59264:2;59254:12;;;;;;;;;59175:99;;;59294:4;59280:19;;;;;;;58855:450;;;;:::o;50387:269::-;50456:7;50642:4;50589:58;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;50589:58:0;;;50579:69;;;;;;50572:76;;50387:269;;;:::o;48183:1930::-;48261:7;48344:2;48324:9;:16;:22;48320:74;;48379:1;48363:19;;;;48320:74;48463:9;48483;48503:7;48755:4;48744:9;48740:20;48734:27;48729:32;;48801:4;48790:9;48786:20;48780:27;48775:32;;48855:4;48844:9;48840:20;48834:27;48831:1;48826:36;48821:41;;49785:66;49780:1;49772:10;;:79;49768:129;;;49883:1;49868:17;;;;;;;49768:129;49918:2;49913:1;:7;;;;:18;;;;;49929:2;49924:1;:7;;;;49913:18;49909:68;;;49963:1;49948:17;;;;;;;49909:68;50081:24;50091:4;50097:1;50100;50103;50081:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50081:24:0;;;;;;;;50074:31;;;;;48183:1930;;;;;:::o;7214:192::-;7300:7;7333:1;7328;:6;;7336:12;7320:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;7320:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7360:9;7376:1;7372;:5;7360:17;;7397:1;7390:8;;;7214:192;;;;;:::o;50778:8532::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://381c83b844746843fbe66959ce88e68c5070d0505724ec8d785f46fe3a5f77f9
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
MATIC | 100.00% | $0.535384 | 9.41 | $5.04 |
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.