Overview
ETH Balance
11.695 ETH
Eth Value
$28,701.15 (@ $2,454.14/ETH)Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 989 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Public Mint By A... | 20928351 | 4 days ago | IN | 0.03 ETH | 0.00427436 | ||||
Public Mint | 20820570 | 19 days ago | IN | 0.03 ETH | 0.00577785 | ||||
Public Mint | 20799824 | 22 days ago | IN | 0.03 ETH | 0.0047853 | ||||
Public Mint By A... | 20731658 | 31 days ago | IN | 0.03 ETH | 0.00035869 | ||||
Public Mint By A... | 20724311 | 32 days ago | IN | 0.03 ETH | 0.00064716 | ||||
Public Mint | 20624189 | 46 days ago | IN | 0.03 ETH | 0.00022177 | ||||
Public Mint | 20605060 | 49 days ago | IN | 0.03 ETH | 0.00019048 | ||||
Public Mint By A... | 20475695 | 67 days ago | IN | 0.03 ETH | 0.00066814 | ||||
Public Mint | 20363027 | 83 days ago | IN | 0.03 ETH | 0.00191147 | ||||
Public Mint | 20344631 | 85 days ago | IN | 0.03 ETH | 0.00047062 | ||||
Public Mint | 20209093 | 104 days ago | IN | 0.03 ETH | 0.00063665 | ||||
Public Mint | 20132809 | 115 days ago | IN | 0.03 ETH | 0.00261299 | ||||
Public Mint | 20124708 | 116 days ago | IN | 0.03 ETH | 0.00092965 | ||||
Public Mint By A... | 20051891 | 126 days ago | IN | 0.03 ETH | 0.00082118 | ||||
Public Mint By A... | 20014754 | 131 days ago | IN | 0.03 ETH | 0.00139717 | ||||
Public Mint | 19965780 | 138 days ago | IN | 0.03 ETH | 0.0036617 | ||||
Public Mint | 19858030 | 153 days ago | IN | 0.03 ETH | 0.00071241 | ||||
Public Mint | 19819001 | 159 days ago | IN | 0.03 ETH | 0.00391702 | ||||
Public Mint | 19773428 | 165 days ago | IN | 0.03 ETH | 0.00100539 | ||||
Public Mint | 19696041 | 176 days ago | IN | 0.03 ETH | 0.00142701 | ||||
Public Mint | 19678879 | 178 days ago | IN | 0.03 ETH | 0.00218935 | ||||
Public Mint | 19676393 | 179 days ago | IN | 0.03 ETH | 0.00500866 | ||||
Public Mint | 19621090 | 186 days ago | IN | 0.03 ETH | 0.00330474 | ||||
Public Mint | 19603834 | 189 days ago | IN | 0.03 ETH | 0.00302345 | ||||
Public Mint | 19574284 | 193 days ago | IN | 0.03 ETH | 0.00505326 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
20928351 | 4 days ago | 0.03 ETH | ||||
20820570 | 19 days ago | 0.03 ETH | ||||
20799824 | 22 days ago | 0.03 ETH | ||||
20731658 | 31 days ago | 0.03 ETH | ||||
20724311 | 32 days ago | 0.03 ETH | ||||
20624189 | 46 days ago | 0.03 ETH | ||||
20605060 | 49 days ago | 0.03 ETH | ||||
20475695 | 67 days ago | 0.03 ETH | ||||
20363027 | 83 days ago | 0.03 ETH | ||||
20344631 | 85 days ago | 0.03 ETH | ||||
20209093 | 104 days ago | 0.03 ETH | ||||
20132809 | 115 days ago | 0.03 ETH | ||||
20124708 | 116 days ago | 0.03 ETH | ||||
20051891 | 126 days ago | 0.03 ETH | ||||
20014754 | 131 days ago | 0.03 ETH | ||||
19965780 | 138 days ago | 0.03 ETH | ||||
19858030 | 153 days ago | 0.03 ETH | ||||
19819001 | 159 days ago | 0.03 ETH | ||||
19773428 | 165 days ago | 0.03 ETH | ||||
19696041 | 176 days ago | 0.03 ETH | ||||
19678879 | 178 days ago | 0.03 ETH | ||||
19676393 | 179 days ago | 0.03 ETH | ||||
19621090 | 186 days ago | 0.03 ETH | ||||
19603834 | 189 days ago | 0.03 ETH | ||||
19574284 | 193 days ago | 0.03 ETH |
Loading...
Loading
Contract Name:
Minter
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; import "@openzeppelin/contracts/utils/Address.sol"; import "./interfaces/INishikigoi.sol"; contract Minter is Ownable, IERC721Receiver, ReentrancyGuard { INishikigoi public nishikigoiNFTContract; address public cushionAddress; address private agentAddress; uint256 public constant PUBLIC_PRICE = 0.03 ether; uint256 public constant ALLOWLIST_PRICE = 0.025 ether; uint256 public constant HOLDER_PRICE = 0.01 ether; uint256 public constant PRICE = 0.03 ether; bool public isPublicSaleActive; bool public isAllowlistSaleActive; bool public isHolderSaleActive; bytes32 public allowlistMerkleRoot; bytes32 public holderMerkleRoot; /// @dev Holder Address => Minted token amount mapping (address => uint256) public holderMinted; /// @dev TokenId => Seed mapping (uint256 => bytes32) private tokenIdToSeed; enum Artist { Okazz, Raf, Ykxotkx } event Minted(uint256 indexed _tokenId, Artist indexed _artist, bytes32 indexed _seed); constructor( address _cushionAddress, address _targetAddress ) { nishikigoiNFTContract = INishikigoi(_targetAddress); cushionAddress = _cushionAddress; } function publicMint( uint256[] memory _tokenIdList ) external payable nonReentrant { require(isPublicSaleActive, "Minter: Public sale is not active"); require(_isValidTokenIdList(_tokenIdList), "Minter: Invalid token id list"); require(msg.value == PUBLIC_PRICE * _tokenIdList.length, "Minter: Incorrect payment amount"); _mintNFT(msg.sender, _tokenIdList); } function publicMintByAgent( uint256[] memory _tokenIdList, address _recipient ) external payable onlyAgent nonReentrant { require(isPublicSaleActive, "Minter: Public sale is not active"); require(_isValidTokenIdList(_tokenIdList), "Minter: Invalid token id list"); require(msg.value == PUBLIC_PRICE * _tokenIdList.length, "Minter: Incorrect payment amount"); _mintNFT(_recipient, _tokenIdList); } function allowlistMint( bytes32[] calldata _merkleProof, uint256[] memory _tokenIdList ) external payable nonReentrant { require(isAllowlistSaleActive, "Minter: Allowlist sale is not active"); require(_isValidTokenIdList(_tokenIdList), "Minter: Invalid token id list"); require(MerkleProof.verify(_merkleProof, allowlistMerkleRoot, keccak256(abi.encodePacked(msg.sender))), "Minter: Invalid Merkle Proof"); require(msg.value == ALLOWLIST_PRICE * _tokenIdList.length, "Minter: Incorrect payment amount"); _mintNFT(msg.sender, _tokenIdList); } function allowlistMintByAgent( bytes32[] calldata _merkleProof, uint256[] memory _tokenIdList, address _recipient ) external payable onlyAgent nonReentrant { require(isAllowlistSaleActive, "Minter: Allowlist sale is not active"); require(_isValidTokenIdList(_tokenIdList), "Minter: Invalid token id list"); require(MerkleProof.verify(_merkleProof, allowlistMerkleRoot, keccak256(abi.encodePacked(_recipient))), "Minter: Invalid Merkle Proof"); require(msg.value == ALLOWLIST_PRICE * _tokenIdList.length, "Minter: Incorrect payment amount"); _mintNFT(_recipient, _tokenIdList); } function holderMint( bytes32[] calldata _merkleProof, uint256 _quantity, uint256[] memory _tokenIdList ) external payable nonReentrant { require(isHolderSaleActive, "Minter: Holder sale is not active"); require(holderMinted[msg.sender] + _tokenIdList.length <= _quantity, "Minter: Exceeds the number of mints allowed"); require(_isValidTokenIdList(_tokenIdList), "Minter: Invalid token id list"); require(MerkleProof.verify(_merkleProof, holderMerkleRoot, keccak256(abi.encodePacked(msg.sender, _quantity))), "Minter: Invalid Merkle Proof"); require(msg.value == HOLDER_PRICE * _tokenIdList.length, "Minter: Incorrect payment amount"); _mintNFT(msg.sender, _tokenIdList); holderMinted[msg.sender] += _tokenIdList.length; } function holderMintByAgent( bytes32[] calldata _merkleProof, uint256 _quantity, uint256[] memory _tokenIdList, address _recipient ) external payable onlyAgent nonReentrant { require(isHolderSaleActive, "Minter: Holder sale is not active"); require(holderMinted[_recipient] + _tokenIdList.length <= _quantity, "Minter: Exceeds the number of mints allowed"); require(_isValidTokenIdList(_tokenIdList), "Minter: Invalid token id list"); require(MerkleProof.verify(_merkleProof, holderMerkleRoot, keccak256(abi.encodePacked(_recipient, _quantity))), "Minter: Invalid Merkle Proof"); require(msg.value == HOLDER_PRICE * _tokenIdList.length, "Minter: Incorrect payment amount"); _mintNFT(_recipient, _tokenIdList); holderMinted[_recipient] += _tokenIdList.length; } function ownerMintByMintForPromotion(address _to, uint256 _quantity) external onlyOwner { nishikigoiNFTContract.mintForPromotion(_to, _quantity); } function ownerMint(address _to, uint256[] memory _tokenIdList) external onlyOwner { _overrideBuyBundle(_to, _tokenIdList); } modifier onlyAgent() { require(msg.sender == agentAddress, "Minter: Invalid agent address"); _; } function _changeSaleState(bool _state) internal { nishikigoiNFTContract.updateSaleStatus(_state); } function _overrideBuyBundle(address _to, uint256[] memory _tokenIdList) internal { _changeSaleState(true); nishikigoiNFTContract.buyBundle{value: PRICE * _tokenIdList.length}(_tokenIdList); _changeSaleState(false); for (uint256 i = 0; i < _tokenIdList.length; i++) { _transfer(_to, _tokenIdList[i]); emit Minted(_tokenIdList[i], getArtistFor3rdSale(_tokenIdList[i]), tokenIdToSeed[_tokenIdList[i]]); } } function _transfer(address _to, uint256 tokenId) internal { nishikigoiNFTContract.safeTransferFrom(address(this), cushionAddress, tokenId); nishikigoiNFTContract.safeTransferFrom(cushionAddress, _to, tokenId); } function _generateSeed(address _addr, uint256[] memory _tokenIdList) internal { for (uint256 i = 0; i < _tokenIdList.length; i++) { tokenIdToSeed[_tokenIdList[i]] = keccak256(abi.encodePacked(_tokenIdList[i], block.number, blockhash(block.number - 1), _addr)); } } function _mintNFT(address _addr, uint256[] memory _tokenIdList) internal { _generateSeed(_addr, _tokenIdList); _overrideBuyBundle(_addr, _tokenIdList); } function _isValidTokenIdList( uint256[] memory _tokenIdList ) internal pure returns (bool) { for (uint256 i = 0; i < _tokenIdList.length; i++) { if (_tokenIdList[i] >= 8666) { return false; } } return true; } function overrideTransferOwnership(address _to) public onlyOwner { require(!Address.isContract(_to), "Minter: Cannot transfer ownership to a contract"); bool anySaleActive = isHolderSaleActive || isAllowlistSaleActive || isPublicSaleActive; require(!anySaleActive, "Minter: Sale is active"); nishikigoiNFTContract.transferOwnership(_to); } function setIsHolderSaleActive(bool _state) external onlyOwner { isHolderSaleActive = _state; } function setIsAllowlistSaleActive(bool _state) external onlyOwner { isAllowlistSaleActive = _state; } function setIsPublicSaleActive(bool _state) external onlyOwner { isPublicSaleActive = _state; } function setMerkleRoot( bytes32 _holderMerkleRoot, bytes32 _allowlistMerkleRoot ) external onlyOwner { holderMerkleRoot = _holderMerkleRoot; allowlistMerkleRoot = _allowlistMerkleRoot; } function setBaseURI(string memory _newBaseURI) external onlyOwner { nishikigoiNFTContract.updateBaseURI(_newBaseURI); } function setAgentAddress(address _agentAddress) external onlyOwner { agentAddress = _agentAddress; } function setCushionAddress(address _cushionAddress) external onlyOwner { cushionAddress = _cushionAddress; } function getSeed(uint256 tokenId) external view returns (bytes32) { return tokenIdToSeed[tokenId]; } function getArtistFor3rdSale(uint256 tokenId) public pure returns (Artist) { if (tokenId <= 1937) { /// @dev 0 return Artist.Okazz; } else if (tokenId <= 3854) { /// @dev 1 return Artist.Raf; } else { /// @dev 2 return Artist.Ykxotkx; } } function withdraw(address payable _receiptAddress) external onlyOwner { require(_receiptAddress != address(0), "Minter: Invalid receipt address"); _receiptAddress.transfer(address(this).balance); nishikigoiNFTContract.withdrawETH(); } function withdrawOfNishikigoi() external onlyOwner { nishikigoiNFTContract.withdrawETH(); } function onERC721Received(address, address, uint256, bytes calldata) external pure override returns (bytes4) { return this.onERC721Received.selector; } receive() external payable {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. * OpenZeppelin's JavaScript library generates merkle trees that are safe * against this attack out of the box. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; interface INishikigoi { // functions of target contract function mintedSalesTokenIdList( uint256 offset, uint256 limit ) external view returns (uint256[] memory); function buy(uint256 tokenId) external payable; function buyBundle(uint256[] memory tokenIdList) external payable; function updateSaleStatus(bool _isOnSale) external; function updateBaseURI(string calldata newBaseURI) external; function mintForPromotion(address to, uint256 amount) external; function withdrawETH() external; function transferOwnership(address newOwner) external; // functions for ERC721 /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_cushionAddress","type":"address"},{"internalType":"address","name":"_targetAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":true,"internalType":"enum Minter.Artist","name":"_artist","type":"uint8"},{"indexed":true,"internalType":"bytes32","name":"_seed","type":"bytes32"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HOLDER_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowlistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256[]","name":"_tokenIdList","type":"uint256[]"}],"name":"allowlistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256[]","name":"_tokenIdList","type":"uint256[]"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"allowlistMintByAgent","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"cushionAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getArtistFor3rdSale","outputs":[{"internalType":"enum Minter.Artist","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSeed","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"holderMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"uint256[]","name":"_tokenIdList","type":"uint256[]"}],"name":"holderMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"uint256[]","name":"_tokenIdList","type":"uint256[]"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"holderMintByAgent","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"holderMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isAllowlistSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isHolderSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nishikigoiNFTContract","outputs":[{"internalType":"contract INishikigoi","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"overrideTransferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_tokenIdList","type":"uint256[]"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"ownerMintByMintForPromotion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIdList","type":"uint256[]"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIdList","type":"uint256[]"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"publicMintByAgent","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_agentAddress","type":"address"}],"name":"setAgentAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_cushionAddress","type":"address"}],"name":"setCushionAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setIsAllowlistSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setIsHolderSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setIsPublicSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_holderMerkleRoot","type":"bytes32"},{"internalType":"bytes32","name":"_allowlistMerkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_receiptAddress","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawOfNishikigoi","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162003c5638038062003c5683398181016040528101906200003791906200021e565b620000576200004b620000e860201b60201c565b620000f060201b60201c565b6001808190555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505062000265565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620001e682620001b9565b9050919050565b620001f881620001d9565b81146200020457600080fd5b50565b6000815190506200021881620001ed565b92915050565b60008060408385031215620002385762000237620001b4565b5b6000620002488582860162000207565b92505060206200025b8582860162000207565b9150509250929050565b6139e180620002756000396000f3fe6080604052600436106102125760003560e01c806374ea80d811610118578063b14ddef8116100a0578063db2d79601161006f578063db2d796014610707578063e0d4ea371461071e578063ea58722b1461075b578063ecabe15f14610784578063f2fde38b146107af57610219565b8063b14ddef81461066e578063b7a70ee91461068a578063d298bbda146106b3578063d99ac855146106dc57610219565b80638d859f3e116100e75780638d859f3e146105895780638da5cb5b146105b4578063a0800087146105df578063a3488b001461061c578063a9c6b8e41461064557610219565b806374ea80d8146104e357806375edcbe01461050e5780637b6cba5c14610537578063895ce1851461056057610219565b80632cac0f8a1161019b578063451680a61161016a578063451680a61461042457806351cff8d91461044f57806355f804b314610478578063611f3f10146104a1578063715018a6146104cc57610219565b80632cac0f8a146103935780633506d13b146103af578063389c88a1146103ec578063407137111461040857610219565b8063143efd1c116101e2578063143efd1c146102ac578063150b7a02146102d75780631e84c4131461031457806328cad13d1461033f578063293108e01461036857610219565b806210f81e1461021e5780630b3ac7991461024957806310d059e014610265578063131f1a711461029057610219565b3661021957005b600080fd5b34801561022a57600080fd5b506102336107d8565b6040516102409190612347565b60405180910390f35b610263600480360381019061025e9190612560565b6107eb565b005b34801561027157600080fd5b5061027a6109a9565b604051610287919061265b565b60405180910390f35b6102aa60048036038101906102a591906126b4565b6109cf565b005b3480156102b857600080fd5b506102c1610c1e565b6040516102ce919061275d565b60405180910390f35b3480156102e357600080fd5b506102fe60048036038101906102f991906127ce565b610c24565b60405161030b9190612891565b60405180910390f35b34801561032057600080fd5b50610329610c39565b6040516103369190612347565b60405180910390f35b34801561034b57600080fd5b50610366600480360381019061036191906128d8565b610c4c565b005b34801561037457600080fd5b5061037d610c71565b60405161038a919061275d565b60405180910390f35b6103ad60048036038101906103a89190612905565b610c77565b005b3480156103bb57600080fd5b506103d660048036038101906103d191906129a9565b610fae565b6040516103e391906129e5565b60405180910390f35b61040660048036038101906104019190612a00565b610fc6565b005b610422600480360381019061041d9190612a49565b6110cf565b005b34801561043057600080fd5b50610439611269565b60405161044691906129e5565b60405180910390f35b34801561045b57600080fd5b5061047660048036038101906104719190612ae3565b611274565b005b34801561048457600080fd5b5061049f600480360381019061049a9190612bc5565b6113b7565b005b3480156104ad57600080fd5b506104b661144f565b6040516104c391906129e5565b60405180910390f35b3480156104d857600080fd5b506104e161145a565b005b3480156104ef57600080fd5b506104f861146e565b60405161050591906129e5565b60405180910390f35b34801561051a57600080fd5b5061053560048036038101906105309190612c3a565b611479565b005b34801561054357600080fd5b5061055e600480360381019061055991906128d8565b611493565b005b34801561056c57600080fd5b50610587600480360381019061058291906129a9565b6114b8565b005b34801561059557600080fd5b5061059e611504565b6040516105ab91906129e5565b60405180910390f35b3480156105c057600080fd5b506105c961150f565b6040516105d69190612c89565b60405180910390f35b3480156105eb57600080fd5b5061060660048036038101906106019190612ca4565b611538565b6040516106139190612d48565b60405180910390f35b34801561062857600080fd5b50610643600480360381019061063e9190612d63565b611568565b005b34801561065157600080fd5b5061066c600480360381019061066791906128d8565b61157e565b005b61068860048036038101906106839190612dbf565b6115a3565b005b34801561069657600080fd5b506106b160048036038101906106ac91906129a9565b611849565b005b3480156106bf57600080fd5b506106da60048036038101906106d591906129a9565b611895565b005b3480156106e857600080fd5b506106f16119fa565b6040516106fe9190612c89565b60405180910390f35b34801561071357600080fd5b5061071c611a20565b005b34801561072a57600080fd5b5061074560048036038101906107409190612ca4565b611aac565b604051610752919061275d565b60405180910390f35b34801561076757600080fd5b50610782600480360381019061077d9190612e4f565b611ac9565b005b34801561079057600080fd5b50610799611b64565b6040516107a69190612347565b60405180910390f35b3480156107bb57600080fd5b506107d660048036038101906107d191906129a9565b611b77565b005b600460159054906101000a900460ff1681565b6107f3611bfa565b600460159054906101000a900460ff16610842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083990612f12565b60405180910390fd5b61084b81611c49565b61088a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088190612f7e565b60405180910390fd5b6108fe838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600554336040516020016108e39190612fe6565b60405160208183030381529060405280519060200120611ca5565b61093d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109349061304d565b60405180910390fd5b80516658d15e17628000610951919061309c565b3414610992576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109899061312a565b60405180910390fd5b61099c3382611cbc565b6109a4611cd4565b505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5690613196565b60405180910390fd5b610a67611bfa565b600460159054906101000a900460ff16610ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aad90612f12565b60405180910390fd5b610abf82611c49565b610afe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af590612f7e565b60405180910390fd5b610b72848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060055483604051602001610b579190612fe6565b60405160208183030381529060405280519060200120611ca5565b610bb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba89061304d565b60405180910390fd5b81516658d15e17628000610bc5919061309c565b3414610c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfd9061312a565b60405180910390fd5b610c108183611cbc565b610c18611cd4565b50505050565b60065481565b600063150b7a0260e01b905095945050505050565b600460149054906101000a900460ff1681565b610c54611cdd565b80600460146101000a81548160ff02191690831515021790555050565b60055481565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfe90613196565b60405180910390fd5b610d0f611bfa565b600460169054906101000a900460ff16610d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5590613228565b60405180910390fd5b828251600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610dab9190613248565b1115610dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de3906132ee565b60405180910390fd5b610df582611c49565b610e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2b90612f7e565b60405180910390fd5b610eaa858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506006548386604051602001610e8f92919061332f565b60405160208183030381529060405280519060200120611ca5565b610ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee09061304d565b60405180910390fd5b8151662386f26fc10000610efd919061309c565b3414610f3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f359061312a565b60405180910390fd5b610f488183611cbc565b8151600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f989190613248565b92505081905550610fa7611cd4565b5050505050565b60076020528060005260406000206000915090505481565b610fce611bfa565b600460149054906101000a900460ff1661101d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611014906133cd565b60405180910390fd5b61102681611c49565b611065576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105c90612f7e565b60405180910390fd5b8051666a94d74f430000611079919061309c565b34146110ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b19061312a565b60405180910390fd5b6110c43382611cbc565b6110cc611cd4565b50565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461115f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115690613196565b60405180910390fd5b611167611bfa565b600460149054906101000a900460ff166111b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ad906133cd565b60405180910390fd5b6111bf82611c49565b6111fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f590612f7e565b60405180910390fd5b8151666a94d74f430000611212919061309c565b3414611253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124a9061312a565b60405180910390fd5b61125d8183611cbc565b611265611cd4565b5050565b6658d15e1762800081565b61127c611cdd565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036112eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e290613439565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611331573d6000803e3d6000fd5b50600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e086e5ec6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561139c57600080fd5b505af11580156113b0573d6000803e3d6000fd5b5050505050565b6113bf611cdd565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663931688cb826040518263ffffffff1660e01b815260040161141a91906134c7565b600060405180830381600087803b15801561143457600080fd5b505af1158015611448573d6000803e3d6000fd5b5050505050565b666a94d74f43000081565b611462611cdd565b61146c6000611d5b565b565b662386f26fc1000081565b611481611cdd565b81600681905550806005819055505050565b61149b611cdd565b80600460156101000a81548160ff02191690831515021790555050565b6114c0611cdd565b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b666a94d74f43000081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000610791821161154c5760009050611563565b610f0e821161155e5760019050611563565b600290505b919050565b611570611cdd565b61157a8282611e1f565b5050565b611586611cdd565b80600460166101000a81548160ff02191690831515021790555050565b6115ab611bfa565b600460169054906101000a900460ff166115fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f190613228565b60405180910390fd5b818151600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116479190613248565b1115611688576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167f906132ee565b60405180910390fd5b61169181611c49565b6116d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c790612f7e565b60405180910390fd5b611746848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600654338560405160200161172b92919061332f565b60405160208183030381529060405280519060200120611ca5565b611785576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177c9061304d565b60405180910390fd5b8051662386f26fc10000611799919061309c565b34146117da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d19061312a565b60405180910390fd5b6117e43382611cbc565b8051600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118349190613248565b92505081905550611843611cd4565b50505050565b611851611cdd565b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61189d611cdd565b6118a681611fc6565b156118e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118dd9061355b565b60405180910390fd5b6000600460169054906101000a900460ff168061190f5750600460159054906101000a900460ff165b806119265750600460149054906101000a900460ff165b90508015611969576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611960906135c7565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f2fde38b836040518263ffffffff1660e01b81526004016119c49190612c89565b600060405180830381600087803b1580156119de57600080fd5b505af11580156119f2573d6000803e3d6000fd5b505050505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611a28611cdd565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e086e5ec6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611a9257600080fd5b505af1158015611aa6573d6000803e3d6000fd5b50505050565b600060086000838152602001908152602001600020549050919050565b611ad1611cdd565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636fa51e9683836040518363ffffffff1660e01b8152600401611b2e9291906135e7565b600060405180830381600087803b158015611b4857600080fd5b505af1158015611b5c573d6000803e3d6000fd5b505050505050565b600460169054906101000a900460ff1681565b611b7f611cdd565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611bee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be590613682565b60405180910390fd5b611bf781611d5b565b50565b600260015403611c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c36906136ee565b60405180910390fd5b6002600181905550565b600080600090505b8251811015611c9a576121da838281518110611c7057611c6f61370e565b5b602002602001015110611c87576000915050611ca0565b8080611c929061373d565b915050611c51565b50600190505b919050565b600082611cb28584611fe9565b1490509392505050565b611cc6828261203f565b611cd08282611e1f565b5050565b60018081905550565b611ce56120e8565b73ffffffffffffffffffffffffffffffffffffffff16611d0361150f565b73ffffffffffffffffffffffffffffffffffffffff1614611d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d50906137d1565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611e2960016120f0565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f51ecdc68251666a94d74f430000611e7b919061309c565b836040518363ffffffff1660e01b8152600401611e9891906138af565b6000604051808303818588803b158015611eb157600080fd5b505af1158015611ec5573d6000803e3d6000fd5b5050505050611ed460006120f0565b60005b8151811015611fc157611f0483838381518110611ef757611ef661370e565b5b6020026020010151612180565b60086000838381518110611f1b57611f1a61370e565b5b6020026020010151815260200190815260200160002054611f55838381518110611f4857611f4761370e565b5b6020026020010151611538565b6002811115611f6757611f66612cd1565b5b838381518110611f7a57611f7961370e565b5b60200260200101517faa4e7e49bf6cd11061ae8af50e7ebb0fc81d13c924708c11f9e3fa8121824a0760405160405180910390a48080611fb99061373d565b915050611ed7565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008082905060005b84518110156120345761201f828683815181106120125761201161370e565b5b60200260200101516122ea565b9150808061202c9061373d565b915050611ff2565b508091505092915050565b60005b81518110156120e35781818151811061205e5761205d61370e565b5b60200260200101514360014361207491906138d1565b40856040516020016120899493929190613926565b60405160208183030381529060405280519060200120600860008484815181106120b6576120b561370e565b5b602002602001015181526020019081526020016000208190555080806120db9061373d565b915050612042565b505050565b600033905090565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630a088949826040518263ffffffff1660e01b815260040161214b9190612347565b600060405180830381600087803b15801561216557600080fd5b505af1158015612179573d6000803e3d6000fd5b5050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e30600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518463ffffffff1660e01b815260040161220193929190613974565b600060405180830381600087803b15801561221b57600080fd5b505af115801561222f573d6000803e3d6000fd5b50505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684846040518463ffffffff1660e01b81526004016122b493929190613974565b600060405180830381600087803b1580156122ce57600080fd5b505af11580156122e2573d6000803e3d6000fd5b505050505050565b6000818310612302576122fd8284612315565b61230d565b61230c8383612315565b5b905092915050565b600082600052816020526040600020905092915050565b60008115159050919050565b6123418161232c565b82525050565b600060208201905061235c6000830184612338565b92915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f84011261239b5761239a612376565b5b8235905067ffffffffffffffff8111156123b8576123b761237b565b5b6020830191508360208202830111156123d4576123d3612380565b5b9250929050565b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612424826123db565b810181811067ffffffffffffffff82111715612443576124426123ec565b5b80604052505050565b6000612456612362565b9050612462828261241b565b919050565b600067ffffffffffffffff821115612482576124816123ec565b5b602082029050602081019050919050565b6000819050919050565b6124a681612493565b81146124b157600080fd5b50565b6000813590506124c38161249d565b92915050565b60006124dc6124d784612467565b61244c565b905080838252602082019050602084028301858111156124ff576124fe612380565b5b835b81811015612528578061251488826124b4565b845260208401935050602081019050612501565b5050509392505050565b600082601f83011261254757612546612376565b5b81356125578482602086016124c9565b91505092915050565b6000806000604084860312156125795761257861236c565b5b600084013567ffffffffffffffff81111561259757612596612371565b5b6125a386828701612385565b9350935050602084013567ffffffffffffffff8111156125c6576125c5612371565b5b6125d286828701612532565b9150509250925092565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061262161261c612617846125dc565b6125fc565b6125dc565b9050919050565b600061263382612606565b9050919050565b600061264582612628565b9050919050565b6126558161263a565b82525050565b6000602082019050612670600083018461264c565b92915050565b6000612681826125dc565b9050919050565b61269181612676565b811461269c57600080fd5b50565b6000813590506126ae81612688565b92915050565b600080600080606085870312156126ce576126cd61236c565b5b600085013567ffffffffffffffff8111156126ec576126eb612371565b5b6126f887828801612385565b9450945050602085013567ffffffffffffffff81111561271b5761271a612371565b5b61272787828801612532565b92505060406127388782880161269f565b91505092959194509250565b6000819050919050565b61275781612744565b82525050565b6000602082019050612772600083018461274e565b92915050565b60008083601f84011261278e5761278d612376565b5b8235905067ffffffffffffffff8111156127ab576127aa61237b565b5b6020830191508360018202830111156127c7576127c6612380565b5b9250929050565b6000806000806000608086880312156127ea576127e961236c565b5b60006127f88882890161269f565b95505060206128098882890161269f565b945050604061281a888289016124b4565b935050606086013567ffffffffffffffff81111561283b5761283a612371565b5b61284788828901612778565b92509250509295509295909350565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61288b81612856565b82525050565b60006020820190506128a66000830184612882565b92915050565b6128b58161232c565b81146128c057600080fd5b50565b6000813590506128d2816128ac565b92915050565b6000602082840312156128ee576128ed61236c565b5b60006128fc848285016128c3565b91505092915050565b6000806000806000608086880312156129215761292061236c565b5b600086013567ffffffffffffffff81111561293f5761293e612371565b5b61294b88828901612385565b9550955050602061295e888289016124b4565b935050604086013567ffffffffffffffff81111561297f5761297e612371565b5b61298b88828901612532565b925050606061299c8882890161269f565b9150509295509295909350565b6000602082840312156129bf576129be61236c565b5b60006129cd8482850161269f565b91505092915050565b6129df81612493565b82525050565b60006020820190506129fa60008301846129d6565b92915050565b600060208284031215612a1657612a1561236c565b5b600082013567ffffffffffffffff811115612a3457612a33612371565b5b612a4084828501612532565b91505092915050565b60008060408385031215612a6057612a5f61236c565b5b600083013567ffffffffffffffff811115612a7e57612a7d612371565b5b612a8a85828601612532565b9250506020612a9b8582860161269f565b9150509250929050565b6000612ab0826125dc565b9050919050565b612ac081612aa5565b8114612acb57600080fd5b50565b600081359050612add81612ab7565b92915050565b600060208284031215612af957612af861236c565b5b6000612b0784828501612ace565b91505092915050565b600080fd5b600067ffffffffffffffff821115612b3057612b2f6123ec565b5b612b39826123db565b9050602081019050919050565b82818337600083830152505050565b6000612b68612b6384612b15565b61244c565b905082815260208101848484011115612b8457612b83612b10565b5b612b8f848285612b46565b509392505050565b600082601f830112612bac57612bab612376565b5b8135612bbc848260208601612b55565b91505092915050565b600060208284031215612bdb57612bda61236c565b5b600082013567ffffffffffffffff811115612bf957612bf8612371565b5b612c0584828501612b97565b91505092915050565b612c1781612744565b8114612c2257600080fd5b50565b600081359050612c3481612c0e565b92915050565b60008060408385031215612c5157612c5061236c565b5b6000612c5f85828601612c25565b9250506020612c7085828601612c25565b9150509250929050565b612c8381612676565b82525050565b6000602082019050612c9e6000830184612c7a565b92915050565b600060208284031215612cba57612cb961236c565b5b6000612cc8848285016124b4565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110612d1157612d10612cd1565b5b50565b6000819050612d2282612d00565b919050565b6000612d3282612d14565b9050919050565b612d4281612d27565b82525050565b6000602082019050612d5d6000830184612d39565b92915050565b60008060408385031215612d7a57612d7961236c565b5b6000612d888582860161269f565b925050602083013567ffffffffffffffff811115612da957612da8612371565b5b612db585828601612532565b9150509250929050565b60008060008060608587031215612dd957612dd861236c565b5b600085013567ffffffffffffffff811115612df757612df6612371565b5b612e0387828801612385565b94509450506020612e16878288016124b4565b925050604085013567ffffffffffffffff811115612e3757612e36612371565b5b612e4387828801612532565b91505092959194509250565b60008060408385031215612e6657612e6561236c565b5b6000612e748582860161269f565b9250506020612e85858286016124b4565b9150509250929050565b600082825260208201905092915050565b7f4d696e7465723a20416c6c6f776c6973742073616c65206973206e6f7420616360008201527f7469766500000000000000000000000000000000000000000000000000000000602082015250565b6000612efc602483612e8f565b9150612f0782612ea0565b604082019050919050565b60006020820190508181036000830152612f2b81612eef565b9050919050565b7f4d696e7465723a20496e76616c696420746f6b656e206964206c697374000000600082015250565b6000612f68601d83612e8f565b9150612f7382612f32565b602082019050919050565b60006020820190508181036000830152612f9781612f5b565b9050919050565b60008160601b9050919050565b6000612fb682612f9e565b9050919050565b6000612fc882612fab565b9050919050565b612fe0612fdb82612676565b612fbd565b82525050565b6000612ff28284612fcf565b60148201915081905092915050565b7f4d696e7465723a20496e76616c6964204d65726b6c652050726f6f6600000000600082015250565b6000613037601c83612e8f565b915061304282613001565b602082019050919050565b600060208201905081810360008301526130668161302a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006130a782612493565b91506130b283612493565b92508282026130c081612493565b915082820484148315176130d7576130d661306d565b5b5092915050565b7f4d696e7465723a20496e636f7272656374207061796d656e7420616d6f756e74600082015250565b6000613114602083612e8f565b915061311f826130de565b602082019050919050565b6000602082019050818103600083015261314381613107565b9050919050565b7f4d696e7465723a20496e76616c6964206167656e742061646472657373000000600082015250565b6000613180601d83612e8f565b915061318b8261314a565b602082019050919050565b600060208201905081810360008301526131af81613173565b9050919050565b7f4d696e7465723a20486f6c6465722073616c65206973206e6f7420616374697660008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b6000613212602183612e8f565b915061321d826131b6565b604082019050919050565b6000602082019050818103600083015261324181613205565b9050919050565b600061325382612493565b915061325e83612493565b92508282019050808211156132765761327561306d565b5b92915050565b7f4d696e7465723a204578636565647320746865206e756d626572206f66206d6960008201527f6e747320616c6c6f776564000000000000000000000000000000000000000000602082015250565b60006132d8602b83612e8f565b91506132e38261327c565b604082019050919050565b60006020820190508181036000830152613307816132cb565b9050919050565b6000819050919050565b61332961332482612493565b61330e565b82525050565b600061333b8285612fcf565b60148201915061334b8284613318565b6020820191508190509392505050565b7f4d696e7465723a205075626c69632073616c65206973206e6f7420616374697660008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b60006133b7602183612e8f565b91506133c28261335b565b604082019050919050565b600060208201905081810360008301526133e6816133aa565b9050919050565b7f4d696e7465723a20496e76616c69642072656365697074206164647265737300600082015250565b6000613423601f83612e8f565b915061342e826133ed565b602082019050919050565b6000602082019050818103600083015261345281613416565b9050919050565b600081519050919050565b60005b83811015613482578082015181840152602081019050613467565b60008484015250505050565b600061349982613459565b6134a38185612e8f565b93506134b3818560208601613464565b6134bc816123db565b840191505092915050565b600060208201905081810360008301526134e1818461348e565b905092915050565b7f4d696e7465723a2043616e6e6f74207472616e73666572206f776e657273686960008201527f7020746f206120636f6e74726163740000000000000000000000000000000000602082015250565b6000613545602f83612e8f565b9150613550826134e9565b604082019050919050565b6000602082019050818103600083015261357481613538565b9050919050565b7f4d696e7465723a2053616c652069732061637469766500000000000000000000600082015250565b60006135b1601683612e8f565b91506135bc8261357b565b602082019050919050565b600060208201905081810360008301526135e0816135a4565b9050919050565b60006040820190506135fc6000830185612c7a565b61360960208301846129d6565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061366c602683612e8f565b915061367782613610565b604082019050919050565b6000602082019050818103600083015261369b8161365f565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006136d8601f83612e8f565b91506136e3826136a2565b602082019050919050565b60006020820190508181036000830152613707816136cb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061374882612493565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361377a5761377961306d565b5b600182019050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006137bb602083612e8f565b91506137c682613785565b602082019050919050565b600060208201905081810360008301526137ea816137ae565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61382681612493565b82525050565b6000613838838361381d565b60208301905092915050565b6000602082019050919050565b600061385c826137f1565b61386681856137fc565b93506138718361380d565b8060005b838110156138a2578151613889888261382c565b975061389483613844565b925050600181019050613875565b5085935050505092915050565b600060208201905081810360008301526138c98184613851565b905092915050565b60006138dc82612493565b91506138e783612493565b92508282039050818111156138ff576138fe61306d565b5b92915050565b6000819050919050565b61392061391b82612744565b613905565b82525050565b60006139328287613318565b6020820191506139428286613318565b602082019150613952828561390f565b6020820191506139628284612fcf565b60148201915081905095945050505050565b60006060820190506139896000830186612c7a565b6139966020830185612c7a565b6139a360408301846129d6565b94935050505056fea26469706673582212209a0a627ff9bfec0fa8abdbac65017f8053c3eef19361fca2dbb7cda3dfb52d3b64736f6c63430008110033000000000000000000000000cb8bd8239072f118e09daa7d3b7b12372fbde02c000000000000000000000000f16a5b64f5a774c24218a83f6fb2c7700fb6469a
Deployed Bytecode
0x6080604052600436106102125760003560e01c806374ea80d811610118578063b14ddef8116100a0578063db2d79601161006f578063db2d796014610707578063e0d4ea371461071e578063ea58722b1461075b578063ecabe15f14610784578063f2fde38b146107af57610219565b8063b14ddef81461066e578063b7a70ee91461068a578063d298bbda146106b3578063d99ac855146106dc57610219565b80638d859f3e116100e75780638d859f3e146105895780638da5cb5b146105b4578063a0800087146105df578063a3488b001461061c578063a9c6b8e41461064557610219565b806374ea80d8146104e357806375edcbe01461050e5780637b6cba5c14610537578063895ce1851461056057610219565b80632cac0f8a1161019b578063451680a61161016a578063451680a61461042457806351cff8d91461044f57806355f804b314610478578063611f3f10146104a1578063715018a6146104cc57610219565b80632cac0f8a146103935780633506d13b146103af578063389c88a1146103ec578063407137111461040857610219565b8063143efd1c116101e2578063143efd1c146102ac578063150b7a02146102d75780631e84c4131461031457806328cad13d1461033f578063293108e01461036857610219565b806210f81e1461021e5780630b3ac7991461024957806310d059e014610265578063131f1a711461029057610219565b3661021957005b600080fd5b34801561022a57600080fd5b506102336107d8565b6040516102409190612347565b60405180910390f35b610263600480360381019061025e9190612560565b6107eb565b005b34801561027157600080fd5b5061027a6109a9565b604051610287919061265b565b60405180910390f35b6102aa60048036038101906102a591906126b4565b6109cf565b005b3480156102b857600080fd5b506102c1610c1e565b6040516102ce919061275d565b60405180910390f35b3480156102e357600080fd5b506102fe60048036038101906102f991906127ce565b610c24565b60405161030b9190612891565b60405180910390f35b34801561032057600080fd5b50610329610c39565b6040516103369190612347565b60405180910390f35b34801561034b57600080fd5b50610366600480360381019061036191906128d8565b610c4c565b005b34801561037457600080fd5b5061037d610c71565b60405161038a919061275d565b60405180910390f35b6103ad60048036038101906103a89190612905565b610c77565b005b3480156103bb57600080fd5b506103d660048036038101906103d191906129a9565b610fae565b6040516103e391906129e5565b60405180910390f35b61040660048036038101906104019190612a00565b610fc6565b005b610422600480360381019061041d9190612a49565b6110cf565b005b34801561043057600080fd5b50610439611269565b60405161044691906129e5565b60405180910390f35b34801561045b57600080fd5b5061047660048036038101906104719190612ae3565b611274565b005b34801561048457600080fd5b5061049f600480360381019061049a9190612bc5565b6113b7565b005b3480156104ad57600080fd5b506104b661144f565b6040516104c391906129e5565b60405180910390f35b3480156104d857600080fd5b506104e161145a565b005b3480156104ef57600080fd5b506104f861146e565b60405161050591906129e5565b60405180910390f35b34801561051a57600080fd5b5061053560048036038101906105309190612c3a565b611479565b005b34801561054357600080fd5b5061055e600480360381019061055991906128d8565b611493565b005b34801561056c57600080fd5b50610587600480360381019061058291906129a9565b6114b8565b005b34801561059557600080fd5b5061059e611504565b6040516105ab91906129e5565b60405180910390f35b3480156105c057600080fd5b506105c961150f565b6040516105d69190612c89565b60405180910390f35b3480156105eb57600080fd5b5061060660048036038101906106019190612ca4565b611538565b6040516106139190612d48565b60405180910390f35b34801561062857600080fd5b50610643600480360381019061063e9190612d63565b611568565b005b34801561065157600080fd5b5061066c600480360381019061066791906128d8565b61157e565b005b61068860048036038101906106839190612dbf565b6115a3565b005b34801561069657600080fd5b506106b160048036038101906106ac91906129a9565b611849565b005b3480156106bf57600080fd5b506106da60048036038101906106d591906129a9565b611895565b005b3480156106e857600080fd5b506106f16119fa565b6040516106fe9190612c89565b60405180910390f35b34801561071357600080fd5b5061071c611a20565b005b34801561072a57600080fd5b5061074560048036038101906107409190612ca4565b611aac565b604051610752919061275d565b60405180910390f35b34801561076757600080fd5b50610782600480360381019061077d9190612e4f565b611ac9565b005b34801561079057600080fd5b50610799611b64565b6040516107a69190612347565b60405180910390f35b3480156107bb57600080fd5b506107d660048036038101906107d191906129a9565b611b77565b005b600460159054906101000a900460ff1681565b6107f3611bfa565b600460159054906101000a900460ff16610842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083990612f12565b60405180910390fd5b61084b81611c49565b61088a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088190612f7e565b60405180910390fd5b6108fe838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600554336040516020016108e39190612fe6565b60405160208183030381529060405280519060200120611ca5565b61093d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109349061304d565b60405180910390fd5b80516658d15e17628000610951919061309c565b3414610992576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109899061312a565b60405180910390fd5b61099c3382611cbc565b6109a4611cd4565b505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5690613196565b60405180910390fd5b610a67611bfa565b600460159054906101000a900460ff16610ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aad90612f12565b60405180910390fd5b610abf82611c49565b610afe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af590612f7e565b60405180910390fd5b610b72848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060055483604051602001610b579190612fe6565b60405160208183030381529060405280519060200120611ca5565b610bb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba89061304d565b60405180910390fd5b81516658d15e17628000610bc5919061309c565b3414610c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfd9061312a565b60405180910390fd5b610c108183611cbc565b610c18611cd4565b50505050565b60065481565b600063150b7a0260e01b905095945050505050565b600460149054906101000a900460ff1681565b610c54611cdd565b80600460146101000a81548160ff02191690831515021790555050565b60055481565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfe90613196565b60405180910390fd5b610d0f611bfa565b600460169054906101000a900460ff16610d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5590613228565b60405180910390fd5b828251600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610dab9190613248565b1115610dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de3906132ee565b60405180910390fd5b610df582611c49565b610e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2b90612f7e565b60405180910390fd5b610eaa858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506006548386604051602001610e8f92919061332f565b60405160208183030381529060405280519060200120611ca5565b610ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee09061304d565b60405180910390fd5b8151662386f26fc10000610efd919061309c565b3414610f3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f359061312a565b60405180910390fd5b610f488183611cbc565b8151600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f989190613248565b92505081905550610fa7611cd4565b5050505050565b60076020528060005260406000206000915090505481565b610fce611bfa565b600460149054906101000a900460ff1661101d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611014906133cd565b60405180910390fd5b61102681611c49565b611065576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105c90612f7e565b60405180910390fd5b8051666a94d74f430000611079919061309c565b34146110ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b19061312a565b60405180910390fd5b6110c43382611cbc565b6110cc611cd4565b50565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461115f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115690613196565b60405180910390fd5b611167611bfa565b600460149054906101000a900460ff166111b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ad906133cd565b60405180910390fd5b6111bf82611c49565b6111fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f590612f7e565b60405180910390fd5b8151666a94d74f430000611212919061309c565b3414611253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124a9061312a565b60405180910390fd5b61125d8183611cbc565b611265611cd4565b5050565b6658d15e1762800081565b61127c611cdd565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036112eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e290613439565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611331573d6000803e3d6000fd5b50600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e086e5ec6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561139c57600080fd5b505af11580156113b0573d6000803e3d6000fd5b5050505050565b6113bf611cdd565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663931688cb826040518263ffffffff1660e01b815260040161141a91906134c7565b600060405180830381600087803b15801561143457600080fd5b505af1158015611448573d6000803e3d6000fd5b5050505050565b666a94d74f43000081565b611462611cdd565b61146c6000611d5b565b565b662386f26fc1000081565b611481611cdd565b81600681905550806005819055505050565b61149b611cdd565b80600460156101000a81548160ff02191690831515021790555050565b6114c0611cdd565b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b666a94d74f43000081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000610791821161154c5760009050611563565b610f0e821161155e5760019050611563565b600290505b919050565b611570611cdd565b61157a8282611e1f565b5050565b611586611cdd565b80600460166101000a81548160ff02191690831515021790555050565b6115ab611bfa565b600460169054906101000a900460ff166115fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f190613228565b60405180910390fd5b818151600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116479190613248565b1115611688576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167f906132ee565b60405180910390fd5b61169181611c49565b6116d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c790612f7e565b60405180910390fd5b611746848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600654338560405160200161172b92919061332f565b60405160208183030381529060405280519060200120611ca5565b611785576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177c9061304d565b60405180910390fd5b8051662386f26fc10000611799919061309c565b34146117da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d19061312a565b60405180910390fd5b6117e43382611cbc565b8051600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118349190613248565b92505081905550611843611cd4565b50505050565b611851611cdd565b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61189d611cdd565b6118a681611fc6565b156118e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118dd9061355b565b60405180910390fd5b6000600460169054906101000a900460ff168061190f5750600460159054906101000a900460ff165b806119265750600460149054906101000a900460ff165b90508015611969576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611960906135c7565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f2fde38b836040518263ffffffff1660e01b81526004016119c49190612c89565b600060405180830381600087803b1580156119de57600080fd5b505af11580156119f2573d6000803e3d6000fd5b505050505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611a28611cdd565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e086e5ec6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611a9257600080fd5b505af1158015611aa6573d6000803e3d6000fd5b50505050565b600060086000838152602001908152602001600020549050919050565b611ad1611cdd565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636fa51e9683836040518363ffffffff1660e01b8152600401611b2e9291906135e7565b600060405180830381600087803b158015611b4857600080fd5b505af1158015611b5c573d6000803e3d6000fd5b505050505050565b600460169054906101000a900460ff1681565b611b7f611cdd565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611bee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be590613682565b60405180910390fd5b611bf781611d5b565b50565b600260015403611c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c36906136ee565b60405180910390fd5b6002600181905550565b600080600090505b8251811015611c9a576121da838281518110611c7057611c6f61370e565b5b602002602001015110611c87576000915050611ca0565b8080611c929061373d565b915050611c51565b50600190505b919050565b600082611cb28584611fe9565b1490509392505050565b611cc6828261203f565b611cd08282611e1f565b5050565b60018081905550565b611ce56120e8565b73ffffffffffffffffffffffffffffffffffffffff16611d0361150f565b73ffffffffffffffffffffffffffffffffffffffff1614611d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d50906137d1565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611e2960016120f0565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f51ecdc68251666a94d74f430000611e7b919061309c565b836040518363ffffffff1660e01b8152600401611e9891906138af565b6000604051808303818588803b158015611eb157600080fd5b505af1158015611ec5573d6000803e3d6000fd5b5050505050611ed460006120f0565b60005b8151811015611fc157611f0483838381518110611ef757611ef661370e565b5b6020026020010151612180565b60086000838381518110611f1b57611f1a61370e565b5b6020026020010151815260200190815260200160002054611f55838381518110611f4857611f4761370e565b5b6020026020010151611538565b6002811115611f6757611f66612cd1565b5b838381518110611f7a57611f7961370e565b5b60200260200101517faa4e7e49bf6cd11061ae8af50e7ebb0fc81d13c924708c11f9e3fa8121824a0760405160405180910390a48080611fb99061373d565b915050611ed7565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008082905060005b84518110156120345761201f828683815181106120125761201161370e565b5b60200260200101516122ea565b9150808061202c9061373d565b915050611ff2565b508091505092915050565b60005b81518110156120e35781818151811061205e5761205d61370e565b5b60200260200101514360014361207491906138d1565b40856040516020016120899493929190613926565b60405160208183030381529060405280519060200120600860008484815181106120b6576120b561370e565b5b602002602001015181526020019081526020016000208190555080806120db9061373d565b915050612042565b505050565b600033905090565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630a088949826040518263ffffffff1660e01b815260040161214b9190612347565b600060405180830381600087803b15801561216557600080fd5b505af1158015612179573d6000803e3d6000fd5b5050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e30600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518463ffffffff1660e01b815260040161220193929190613974565b600060405180830381600087803b15801561221b57600080fd5b505af115801561222f573d6000803e3d6000fd5b50505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684846040518463ffffffff1660e01b81526004016122b493929190613974565b600060405180830381600087803b1580156122ce57600080fd5b505af11580156122e2573d6000803e3d6000fd5b505050505050565b6000818310612302576122fd8284612315565b61230d565b61230c8383612315565b5b905092915050565b600082600052816020526040600020905092915050565b60008115159050919050565b6123418161232c565b82525050565b600060208201905061235c6000830184612338565b92915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f84011261239b5761239a612376565b5b8235905067ffffffffffffffff8111156123b8576123b761237b565b5b6020830191508360208202830111156123d4576123d3612380565b5b9250929050565b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612424826123db565b810181811067ffffffffffffffff82111715612443576124426123ec565b5b80604052505050565b6000612456612362565b9050612462828261241b565b919050565b600067ffffffffffffffff821115612482576124816123ec565b5b602082029050602081019050919050565b6000819050919050565b6124a681612493565b81146124b157600080fd5b50565b6000813590506124c38161249d565b92915050565b60006124dc6124d784612467565b61244c565b905080838252602082019050602084028301858111156124ff576124fe612380565b5b835b81811015612528578061251488826124b4565b845260208401935050602081019050612501565b5050509392505050565b600082601f83011261254757612546612376565b5b81356125578482602086016124c9565b91505092915050565b6000806000604084860312156125795761257861236c565b5b600084013567ffffffffffffffff81111561259757612596612371565b5b6125a386828701612385565b9350935050602084013567ffffffffffffffff8111156125c6576125c5612371565b5b6125d286828701612532565b9150509250925092565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061262161261c612617846125dc565b6125fc565b6125dc565b9050919050565b600061263382612606565b9050919050565b600061264582612628565b9050919050565b6126558161263a565b82525050565b6000602082019050612670600083018461264c565b92915050565b6000612681826125dc565b9050919050565b61269181612676565b811461269c57600080fd5b50565b6000813590506126ae81612688565b92915050565b600080600080606085870312156126ce576126cd61236c565b5b600085013567ffffffffffffffff8111156126ec576126eb612371565b5b6126f887828801612385565b9450945050602085013567ffffffffffffffff81111561271b5761271a612371565b5b61272787828801612532565b92505060406127388782880161269f565b91505092959194509250565b6000819050919050565b61275781612744565b82525050565b6000602082019050612772600083018461274e565b92915050565b60008083601f84011261278e5761278d612376565b5b8235905067ffffffffffffffff8111156127ab576127aa61237b565b5b6020830191508360018202830111156127c7576127c6612380565b5b9250929050565b6000806000806000608086880312156127ea576127e961236c565b5b60006127f88882890161269f565b95505060206128098882890161269f565b945050604061281a888289016124b4565b935050606086013567ffffffffffffffff81111561283b5761283a612371565b5b61284788828901612778565b92509250509295509295909350565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61288b81612856565b82525050565b60006020820190506128a66000830184612882565b92915050565b6128b58161232c565b81146128c057600080fd5b50565b6000813590506128d2816128ac565b92915050565b6000602082840312156128ee576128ed61236c565b5b60006128fc848285016128c3565b91505092915050565b6000806000806000608086880312156129215761292061236c565b5b600086013567ffffffffffffffff81111561293f5761293e612371565b5b61294b88828901612385565b9550955050602061295e888289016124b4565b935050604086013567ffffffffffffffff81111561297f5761297e612371565b5b61298b88828901612532565b925050606061299c8882890161269f565b9150509295509295909350565b6000602082840312156129bf576129be61236c565b5b60006129cd8482850161269f565b91505092915050565b6129df81612493565b82525050565b60006020820190506129fa60008301846129d6565b92915050565b600060208284031215612a1657612a1561236c565b5b600082013567ffffffffffffffff811115612a3457612a33612371565b5b612a4084828501612532565b91505092915050565b60008060408385031215612a6057612a5f61236c565b5b600083013567ffffffffffffffff811115612a7e57612a7d612371565b5b612a8a85828601612532565b9250506020612a9b8582860161269f565b9150509250929050565b6000612ab0826125dc565b9050919050565b612ac081612aa5565b8114612acb57600080fd5b50565b600081359050612add81612ab7565b92915050565b600060208284031215612af957612af861236c565b5b6000612b0784828501612ace565b91505092915050565b600080fd5b600067ffffffffffffffff821115612b3057612b2f6123ec565b5b612b39826123db565b9050602081019050919050565b82818337600083830152505050565b6000612b68612b6384612b15565b61244c565b905082815260208101848484011115612b8457612b83612b10565b5b612b8f848285612b46565b509392505050565b600082601f830112612bac57612bab612376565b5b8135612bbc848260208601612b55565b91505092915050565b600060208284031215612bdb57612bda61236c565b5b600082013567ffffffffffffffff811115612bf957612bf8612371565b5b612c0584828501612b97565b91505092915050565b612c1781612744565b8114612c2257600080fd5b50565b600081359050612c3481612c0e565b92915050565b60008060408385031215612c5157612c5061236c565b5b6000612c5f85828601612c25565b9250506020612c7085828601612c25565b9150509250929050565b612c8381612676565b82525050565b6000602082019050612c9e6000830184612c7a565b92915050565b600060208284031215612cba57612cb961236c565b5b6000612cc8848285016124b4565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110612d1157612d10612cd1565b5b50565b6000819050612d2282612d00565b919050565b6000612d3282612d14565b9050919050565b612d4281612d27565b82525050565b6000602082019050612d5d6000830184612d39565b92915050565b60008060408385031215612d7a57612d7961236c565b5b6000612d888582860161269f565b925050602083013567ffffffffffffffff811115612da957612da8612371565b5b612db585828601612532565b9150509250929050565b60008060008060608587031215612dd957612dd861236c565b5b600085013567ffffffffffffffff811115612df757612df6612371565b5b612e0387828801612385565b94509450506020612e16878288016124b4565b925050604085013567ffffffffffffffff811115612e3757612e36612371565b5b612e4387828801612532565b91505092959194509250565b60008060408385031215612e6657612e6561236c565b5b6000612e748582860161269f565b9250506020612e85858286016124b4565b9150509250929050565b600082825260208201905092915050565b7f4d696e7465723a20416c6c6f776c6973742073616c65206973206e6f7420616360008201527f7469766500000000000000000000000000000000000000000000000000000000602082015250565b6000612efc602483612e8f565b9150612f0782612ea0565b604082019050919050565b60006020820190508181036000830152612f2b81612eef565b9050919050565b7f4d696e7465723a20496e76616c696420746f6b656e206964206c697374000000600082015250565b6000612f68601d83612e8f565b9150612f7382612f32565b602082019050919050565b60006020820190508181036000830152612f9781612f5b565b9050919050565b60008160601b9050919050565b6000612fb682612f9e565b9050919050565b6000612fc882612fab565b9050919050565b612fe0612fdb82612676565b612fbd565b82525050565b6000612ff28284612fcf565b60148201915081905092915050565b7f4d696e7465723a20496e76616c6964204d65726b6c652050726f6f6600000000600082015250565b6000613037601c83612e8f565b915061304282613001565b602082019050919050565b600060208201905081810360008301526130668161302a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006130a782612493565b91506130b283612493565b92508282026130c081612493565b915082820484148315176130d7576130d661306d565b5b5092915050565b7f4d696e7465723a20496e636f7272656374207061796d656e7420616d6f756e74600082015250565b6000613114602083612e8f565b915061311f826130de565b602082019050919050565b6000602082019050818103600083015261314381613107565b9050919050565b7f4d696e7465723a20496e76616c6964206167656e742061646472657373000000600082015250565b6000613180601d83612e8f565b915061318b8261314a565b602082019050919050565b600060208201905081810360008301526131af81613173565b9050919050565b7f4d696e7465723a20486f6c6465722073616c65206973206e6f7420616374697660008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b6000613212602183612e8f565b915061321d826131b6565b604082019050919050565b6000602082019050818103600083015261324181613205565b9050919050565b600061325382612493565b915061325e83612493565b92508282019050808211156132765761327561306d565b5b92915050565b7f4d696e7465723a204578636565647320746865206e756d626572206f66206d6960008201527f6e747320616c6c6f776564000000000000000000000000000000000000000000602082015250565b60006132d8602b83612e8f565b91506132e38261327c565b604082019050919050565b60006020820190508181036000830152613307816132cb565b9050919050565b6000819050919050565b61332961332482612493565b61330e565b82525050565b600061333b8285612fcf565b60148201915061334b8284613318565b6020820191508190509392505050565b7f4d696e7465723a205075626c69632073616c65206973206e6f7420616374697660008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b60006133b7602183612e8f565b91506133c28261335b565b604082019050919050565b600060208201905081810360008301526133e6816133aa565b9050919050565b7f4d696e7465723a20496e76616c69642072656365697074206164647265737300600082015250565b6000613423601f83612e8f565b915061342e826133ed565b602082019050919050565b6000602082019050818103600083015261345281613416565b9050919050565b600081519050919050565b60005b83811015613482578082015181840152602081019050613467565b60008484015250505050565b600061349982613459565b6134a38185612e8f565b93506134b3818560208601613464565b6134bc816123db565b840191505092915050565b600060208201905081810360008301526134e1818461348e565b905092915050565b7f4d696e7465723a2043616e6e6f74207472616e73666572206f776e657273686960008201527f7020746f206120636f6e74726163740000000000000000000000000000000000602082015250565b6000613545602f83612e8f565b9150613550826134e9565b604082019050919050565b6000602082019050818103600083015261357481613538565b9050919050565b7f4d696e7465723a2053616c652069732061637469766500000000000000000000600082015250565b60006135b1601683612e8f565b91506135bc8261357b565b602082019050919050565b600060208201905081810360008301526135e0816135a4565b9050919050565b60006040820190506135fc6000830185612c7a565b61360960208301846129d6565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061366c602683612e8f565b915061367782613610565b604082019050919050565b6000602082019050818103600083015261369b8161365f565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006136d8601f83612e8f565b91506136e3826136a2565b602082019050919050565b60006020820190508181036000830152613707816136cb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061374882612493565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361377a5761377961306d565b5b600182019050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006137bb602083612e8f565b91506137c682613785565b602082019050919050565b600060208201905081810360008301526137ea816137ae565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61382681612493565b82525050565b6000613838838361381d565b60208301905092915050565b6000602082019050919050565b600061385c826137f1565b61386681856137fc565b93506138718361380d565b8060005b838110156138a2578151613889888261382c565b975061389483613844565b925050600181019050613875565b5085935050505092915050565b600060208201905081810360008301526138c98184613851565b905092915050565b60006138dc82612493565b91506138e783612493565b92508282039050818111156138ff576138fe61306d565b5b92915050565b6000819050919050565b61392061391b82612744565b613905565b82525050565b60006139328287613318565b6020820191506139428286613318565b602082019150613952828561390f565b6020820191506139628284612fcf565b60148201915081905095945050505050565b60006060820190506139896000830186612c7a565b6139966020830185612c7a565b6139a360408301846129d6565b94935050505056fea26469706673582212209a0a627ff9bfec0fa8abdbac65017f8053c3eef19361fca2dbb7cda3dfb52d3b64736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000cb8bd8239072f118e09daa7d3b7b12372fbde02c000000000000000000000000f16a5b64f5a774c24218a83f6fb2c7700fb6469a
-----Decoded View---------------
Arg [0] : _cushionAddress (address): 0xCB8bD8239072f118E09daa7d3B7B12372FbDE02C
Arg [1] : _targetAddress (address): 0xF16a5B64F5a774C24218a83f6FB2C7700FB6469a
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000cb8bd8239072f118e09daa7d3b7b12372fbde02c
Arg [1] : 000000000000000000000000f16a5b64f5a774c24218a83f6fb2c7700fb6469a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $2,454.62 | 11.695 | $28,706.78 |
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.