More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 172 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Unstake | 17657841 | 549 days ago | IN | 0 ETH | 0.00185242 | ||||
Unstake | 17657836 | 549 days ago | IN | 0 ETH | 0.00178562 | ||||
Unstake | 17015840 | 639 days ago | IN | 0 ETH | 0.00311022 | ||||
Unstake | 17015835 | 639 days ago | IN | 0 ETH | 0.00140292 | ||||
Unstake | 17015832 | 639 days ago | IN | 0 ETH | 0.00190771 | ||||
Unstake | 16895940 | 656 days ago | IN | 0 ETH | 0.00182072 | ||||
Unstake | 16895934 | 656 days ago | IN | 0 ETH | 0.00256175 | ||||
Unstake | 16895902 | 656 days ago | IN | 0 ETH | 0.00201891 | ||||
Transfer | 16844795 | 663 days ago | IN | 0 ETH | 0.00060721 | ||||
Transfer | 16844785 | 663 days ago | IN | 0 ETH | 0.00057549 | ||||
Unstake | 16844762 | 663 days ago | IN | 0 ETH | 0.0004602 | ||||
Unstake | 16844753 | 663 days ago | IN | 0 ETH | 0.00047739 | ||||
Unstake | 16844744 | 663 days ago | IN | 0 ETH | 0.00053416 | ||||
Unstake | 16844738 | 663 days ago | IN | 0 ETH | 0.00173243 | ||||
Unstake | 16844734 | 663 days ago | IN | 0 ETH | 0.00265773 | ||||
Unstake | 16844708 | 663 days ago | IN | 0 ETH | 0.0005885 | ||||
Unstake | 16844699 | 663 days ago | IN | 0 ETH | 0.00053503 | ||||
Unstake | 16844694 | 663 days ago | IN | 0 ETH | 0.00233314 | ||||
Unstake | 16844691 | 663 days ago | IN | 0 ETH | 0.00237106 | ||||
Unstake | 16844636 | 663 days ago | IN | 0 ETH | 0.0080099 | ||||
Unstake | 16844617 | 663 days ago | IN | 0 ETH | 0.00070309 | ||||
Unstake | 16843904 | 663 days ago | IN | 0 ETH | 0.00265102 | ||||
Unstake | 16817116 | 667 days ago | IN | 0 ETH | 0.00145358 | ||||
Unstake | 16817115 | 667 days ago | IN | 0 ETH | 0.00144501 | ||||
Unstake | 16817105 | 667 days ago | IN | 0 ETH | 0.00174683 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
SPLOOTSTAKING
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.7; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol"; import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol"; /* ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,(@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*,,,,,,,, ,,,,,,,,,(,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,(*,,,,,,,, ,,,,,,,,,(,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,(*,,,,,,,, ,,,,,,,,,(,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,(*,,,,,,,, ,,,,,,,,,(,,,,,,,,,@@@@@@@@@@@,,,,,@@@@@@@@@@&,,,,,,,,,(*,,,,,,,, ,,,,,,,,,(,,,,,,,,,@@@@(,,,@@@@,,,,@@@@,,,@@@@@,,,,,,,,(*,,,,,,,, ,,,,,,,,,(,,,,,,,,,@@@@(,,,@@@@,,,,@@@@,,,@@@@@,,,,,,,,(*,,,,,,,, ,,,,,,,,,(,,,,,,,,,@@@@@@@@@@@@,,,,@@@@@@@@@@@/,,,,,,,,(*,,,,,,,, ,,,,,,,,,(,,,,,,,,,@@@@(,,,,(@@@@,,@@@@,,,,(@@@@,,,,,,,(*,,,,,,,, ,,,,,,,,,(,,,,,,,,,@@@@@@@@@@@@@,,,@@@@@@@@@@@@&,,,,,,,(*,,,,,,,, ,,,,,,,,,(,,,,,,,,,@@@@@@@@@@,,,,,,@@@@@@@@@@,,,,,,,,,,(*,,,,,,,, ,,,,,,,,,(,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,(*,,,,,,,, ,,,,,,,,,(,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,(*,,,,,,,, ,,,,,,,,,(@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, Staking Contract By Beeble Blocks */ contract SPLOOTSTAKING is ERC20, ERC721Holder, ERC1155Holder, Ownable{ address public projectLeader; // Project Leader Address address[] public admins; // List of approved Admins IERC721 public parentNFT_A; //main 721 NFT contract IERC721 public parentNFT_B; //main 721 NFT contract #2 IERC721 public parentNFT_C; //main 721 NFT contract #3 mapping(uint256 => address) public tokenOwnerOf_A; mapping(uint256 => uint256) public tokenStakedAt_A; mapping(uint256 => address) public tokenOwnerOf_B; mapping(uint256 => uint256) public tokenStakedAt_B; mapping(uint256 => address) public tokenOwnerOf_C; mapping(uint256 => uint256) public tokenStakedAt_C; bool public pausedStake_A = false; bool public pausedStake_B = false; bool public pausedStake_C = false; uint256 public limitPerSession = 10; uint256 public EMISSION_RATE = (1 * 10 ** decimals()) / 1 days; //rate of max 1 tokens per day(86400 seconds) //math for emission rate: EMISSION_RATE * 86400 = token(s) per day constructor(address _parentNFT_A, address _parentNFT_B, address _parentNFT_C) ERC20("$BEEBLE", "$BEEB") { parentNFT_A = IERC721(_parentNFT_A); // on deploy this is the main NFT contract (parentNFT_A) parentNFT_B = IERC721(_parentNFT_B); // on deploy this is the main NFT contract (parentNFT_B) parentNFT_C = IERC721(_parentNFT_C); // on deploy this is the main NFT contract (parentNFT_C) } /** * @dev Set the limit of tokenIDs per session. */ function setLimitPerSession(uint256 _limit) external onlyAdmins { limitPerSession = _limit; } /** * @dev Set the EMISSION_RATE. */ function setEmissionRate(uint256 _RatePerDay) external onlyAdmins { EMISSION_RATE = (_RatePerDay * 10 ** decimals()) / 1 days; } /** * @dev Admin can set the PAUSE state for contract A, B or C * true = no staking allowed * false = staking allowed */ function pauseStaking(uint256 _contract_num, bool _state) public onlyAdmins { if(_contract_num == 0) { pausedStake_A = _state; } else if(_contract_num == 1){ pausedStake_B = _state; } else if(_contract_num == 2){ pausedStake_C = _state; } } /** * @dev User can stake NFTs they own to earn rewards over time. * Note: User must set this contract as approval for all on the parentNFT contracts in order to stake NFTs. */ function stake(uint[] memory _tokenIDs, uint256 _contract_num) public { require(_tokenIDs.length != 0, "No IDs"); require(_tokenIDs.length <= limitPerSession, "Too Many IDs"); if(_tokenIDs.length == 1){ stakeOne(_tokenIDs[0], _contract_num); } else{ stakeMultiple(_tokenIDs, _contract_num); } } function stakeOne(uint256 _tokenID, uint256 _contract_num) private { if(_contract_num == 0){ require(pausedStake_A != true, "Contract A Staking Paused"); require(tokenOwnerOf_A[_tokenID] == 0x0000000000000000000000000000000000000000, "NFT ALREADY STAKED"); parentNFT_A.safeTransferFrom(msg.sender, address(this), _tokenID); tokenOwnerOf_A[_tokenID] = msg.sender; tokenStakedAt_A[_tokenID] = block.timestamp; } else if(_contract_num == 1){ require(pausedStake_B != true, "Contract B Staking Paused"); require(tokenOwnerOf_B[_tokenID] == 0x0000000000000000000000000000000000000000, "NFT ALREADY STAKED"); parentNFT_B.safeTransferFrom(msg.sender, address(this), _tokenID); tokenOwnerOf_B[_tokenID] = msg.sender; tokenStakedAt_B[_tokenID] = block.timestamp; } else if(_contract_num == 2){ require(pausedStake_C != true, "Contract B Staking Paused"); require(tokenOwnerOf_C[_tokenID] == 0x0000000000000000000000000000000000000000, "NFT ALREADY STAKED"); parentNFT_C.safeTransferFrom(msg.sender, address(this), _tokenID); tokenOwnerOf_C[_tokenID] = msg.sender; tokenStakedAt_C[_tokenID] = block.timestamp; } } function stakeMultiple(uint[] memory _tokenIDs, uint256 _contract_num) private { for (uint256 i = 0; i < _tokenIDs.length; i++) { uint256 _tokenID = _tokenIDs[i]; stakeOne(_tokenID, _contract_num); } } /** * @dev User can check estimated rewards gained so far from an address that staked an NFT. * Note: The staker address must have an NFT currently staked. */ function estimateRewards(uint[] memory _tokenIDs, uint256 _contract_num) public view returns (uint256) { uint256 timeElapsed; for (uint256 i = 0; i < _tokenIDs.length; i++) { uint256 _tokenID = _tokenIDs[i]; if(_contract_num == 0){ require(tokenOwnerOf_A[_tokenID] != 0x0000000000000000000000000000000000000000, "NFT NOT STAKED"); //rewards can be set within this function based on the amount and time NFTs are staked timeElapsed += (block.timestamp - tokenStakedAt_A[_tokenID]); } else if(_contract_num == 1){ require(tokenOwnerOf_B[_tokenID] != 0x0000000000000000000000000000000000000000, "NFT NOT STAKED"); //rewards can be set within this function based on the amount and time NFTs are staked timeElapsed += (block.timestamp - tokenStakedAt_B[_tokenID]); } else if(_contract_num == 2){ require(tokenOwnerOf_C[_tokenID] != 0x0000000000000000000000000000000000000000, "NFT NOT STAKED"); //rewards can be set within this function based on the amount and time NFTs are staked timeElapsed += (block.timestamp - tokenStakedAt_C[_tokenID]); } } return timeElapsed * EMISSION_RATE; } /** * @dev User can unstake NFTs to earn the rewards gained over time. * Note: User must have a NFT already staked in order to unstake and gain rewards. * This function only unstakes NFT IDs that they currently have staked. * Rewards are calculated based on the Emission_Rate. */ function unstake(uint[] memory _tokenIDs, uint256 _contract_num) public { require(_tokenIDs.length != 0, "No IDs"); require(_tokenIDs.length <= limitPerSession, "Too Many IDs"); require(isOwnerOfAllStaked(msg.sender, _contract_num, _tokenIDs), "CANNOT UNSTAKE"); uint256 reward = estimateRewards(_tokenIDs, _contract_num); for (uint256 i = 0; i < _tokenIDs.length; i++) { uint256 _tokenID = _tokenIDs[i]; if(_contract_num == 0){ parentNFT_A.safeTransferFrom(address(this), msg.sender, _tokenID); delete tokenOwnerOf_A[_tokenID]; delete tokenStakedAt_A[_tokenID]; } else if(_contract_num == 1){ parentNFT_B.safeTransferFrom(address(this), msg.sender, _tokenID); delete tokenOwnerOf_B[_tokenID]; delete tokenStakedAt_B[_tokenID]; } else if(_contract_num == 2){ parentNFT_C.safeTransferFrom(address(this), msg.sender, _tokenID); delete tokenOwnerOf_C[_tokenID]; delete tokenStakedAt_C[_tokenID]; } } _mint(msg.sender, reward); // Minting the reward tokens gained for staking } /** * @dev Allows Owner or Project Leader to set the parentNFT contracts to a specified address. * WARNING: Double check all users NFTs are unstaked before setting a new address */ function setStakingContract(uint256 _contract_num, address _contractAddress) external { require(msg.sender == owner() || msg.sender == projectLeader, "Owner or Project Leader Only: caller is not Owner or Project Leader"); if(_contract_num == 0){ parentNFT_A = IERC721(_contractAddress); // set the main NFT contract (parentNFT_A) } else if(_contract_num == 1){ parentNFT_B = IERC721(_contractAddress); // set the main NFT contract (parentNFT_B) } else if(_contract_num == 2) { parentNFT_C = IERC721(_contractAddress); // set the main NFT contract (parentNFT_C) } } /** * @dev Returns the owner address of a specific token staked * Note: If address returned is 0x0000000000000000000000000000000000000000 token is not staked. */ function getTokenOwnerOf(uint256 _contract_num, uint256 _tokenID) public view returns(address){ if(_contract_num == 0){ return tokenOwnerOf_A[_tokenID]; } else if(_contract_num == 1){ return tokenOwnerOf_B[_tokenID]; } else if(_contract_num == 2){ return tokenOwnerOf_C[_tokenID]; } } function isOwnerOfAllStaked(address _holder, uint256 _contract_num, uint[] memory _tokenIDs) public view returns(bool){ for (uint256 i = 0; i < _tokenIDs.length; i++) { uint256 _tokenID = _tokenIDs[i]; if(getTokenOwnerOf(_contract_num, _tokenID) == _holder){ //HOLDER IS TRUE } else{ return false; } } return true; } /** * @dev Returns the unix date the token was staked */ function getStakedAt(uint256 _contract_num, uint256 _tokenID) public view returns(uint256){ if(_contract_num == 0){ return tokenStakedAt_A[_tokenID]; } else if(_contract_num == 1){ return tokenStakedAt_B[_tokenID]; } else if(_contract_num == 2){ return tokenStakedAt_C[_tokenID]; } } /** * @dev Allows Admins to mint an amount of tokens to a specified address. * Note: _amount must be in WEI use https://etherscan.io/unitconverter for conversions. */ function mintTokens(address _to, uint256 _amount) external onlyAdmins { _mint(_to, _amount); // Minting Tokens } /** * @dev Throws if called by any account other than the owner or admin. */ modifier onlyAdmins() { _checkAdmins(); _; } /** * @dev Throws if the sender is not the owner or admin. */ function _checkAdmins() internal view virtual { require(checkIfAdmin(), "Admin Only: caller is not an admin"); } function checkIfAdmin() public view returns(bool) { if (msg.sender == owner() || msg.sender == projectLeader){ return true; } if(admins.length > 0){ for (uint256 i = 0; i < admins.length; i++) { if(msg.sender == admins[i]){ return true; } } } // Not an Admin return false; } /** * @dev Owner and Project Leader can set the addresses as approved Admins. * Example: ["0xADDRESS1", "0xADDRESS2", "0xADDRESS3"] */ function setAdmins(address[] calldata _users) external { require(msg.sender == owner() || msg.sender == projectLeader, "Owner or Project Leader Only: caller is not Owner or Project Leader"); delete admins; admins = _users; } /** * @dev Owner or Project Leader can set the address as new Project Leader. */ function setProjectLeader(address _user) external { require(msg.sender == owner() || msg.sender == projectLeader, "Owner or Project Leader Only: caller is not Owner or Project Leader"); projectLeader = _user; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/utils/ERC1155Holder.sol) pragma solidity ^0.8.0; import "./ERC1155Receiver.sol"; /** * Simple implementation of `ERC1155Receiver` that will allow a contract to hold ERC1155 tokens. * * IMPORTANT: When inheriting this contract, you must include a way to use the received tokens, otherwise they will be * stuck. * * @dev _Available since v3.1._ */ contract ERC1155Holder is ERC1155Receiver { function onERC1155Received( address, address, uint256, uint256, bytes memory ) public virtual override returns (bytes4) { return this.onERC1155Received.selector; } function onERC1155BatchReceived( address, address, uint256[] memory, uint256[] memory, bytes memory ) public virtual override returns (bytes4) { return this.onERC1155BatchReceived.selector; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * 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 be approved 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, bytes calldata data ) external; /** * @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; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/utils/ERC721Holder.sol) pragma solidity ^0.8.0; import "../IERC721Receiver.sol"; /** * @dev Implementation of the {IERC721Receiver} interface. * * Accepts all token transfers. * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}. */ contract ERC721Holder is IERC721Receiver { /** * @dev See {IERC721Receiver-onERC721Received}. * * Always returns `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address, address, uint256, bytes memory ) public virtual override returns (bytes4) { return this.onERC721Received.selector; } }
// 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) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; import "./IERC20.sol"; import "./extensions/IERC20Metadata.sol"; import "../../utils/Context.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} }
// 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 v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// 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 v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/utils/ERC1155Receiver.sol) pragma solidity ^0.8.0; import "../IERC1155Receiver.sol"; import "../../../utils/introspection/ERC165.sol"; /** * @dev _Available since v3.1._ */ abstract contract ERC1155Receiver is ERC165, IERC1155Receiver { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_parentNFT_A","type":"address"},{"internalType":"address","name":"_parentNFT_B","type":"address"},{"internalType":"address","name":"_parentNFT_C","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"EMISSION_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"admins","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkIfAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIDs","type":"uint256[]"},{"internalType":"uint256","name":"_contract_num","type":"uint256"}],"name":"estimateRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_contract_num","type":"uint256"},{"internalType":"uint256","name":"_tokenID","type":"uint256"}],"name":"getStakedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_contract_num","type":"uint256"},{"internalType":"uint256","name":"_tokenID","type":"uint256"}],"name":"getTokenOwnerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"},{"internalType":"uint256","name":"_contract_num","type":"uint256"},{"internalType":"uint256[]","name":"_tokenIDs","type":"uint256[]"}],"name":"isOwnerOfAllStaked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitPerSession","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","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":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"parentNFT_A","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"parentNFT_B","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"parentNFT_C","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_contract_num","type":"uint256"},{"internalType":"bool","name":"_state","type":"bool"}],"name":"pauseStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pausedStake_A","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pausedStake_B","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pausedStake_C","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"projectLeader","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"setAdmins","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_RatePerDay","type":"uint256"}],"name":"setEmissionRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setLimitPerSession","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"setProjectLeader","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_contract_num","type":"uint256"},{"internalType":"address","name":"_contractAddress","type":"address"}],"name":"setStakingContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIDs","type":"uint256[]"},{"internalType":"uint256","name":"_contract_num","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenOwnerOf_A","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenOwnerOf_B","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenOwnerOf_C","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenStakedAt_A","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenStakedAt_B","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenStakedAt_C","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIDs","type":"uint256[]"},{"internalType":"uint256","name":"_contract_num","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000601160006101000a81548160ff0219169083151502179055506000601160016101000a81548160ff0219169083151502179055506000601160026101000a81548160ff021916908315150217905550600a601255620151806200006e6200024a60201b60201c565b600a6200007c9190620004bb565b60016200008a91906200050c565b62000096919062000586565b601355348015620000a657600080fd5b5060405162005130380380620051308339818101604052810190620000cc919062000628565b6040518060400160405280600781526020017f24424545424c45000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f24424545420000000000000000000000000000000000000000000000000000008152508160039081620001499190620008f4565b5080600490816200015b9190620008f4565b5050506200017e620001726200025360201b60201c565b6200025b60201b60201c565b82600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050620009db565b60006012905090565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b6001851115620003af5780860481111562000387576200038662000321565b5b6001851615620003975780820291505b8081029050620003a78562000350565b945062000367565b94509492505050565b600082620003ca57600190506200049d565b81620003da57600090506200049d565b8160018114620003f35760028114620003fe5762000434565b60019150506200049d565b60ff84111562000413576200041262000321565b5b8360020a9150848211156200042d576200042c62000321565b5b506200049d565b5060208310610133831016604e8410600b84101617156200046e5782820a90508381111562000468576200046762000321565b5b6200049d565b6200047d84848460016200035d565b9250905081840481111562000497576200049662000321565b5b81810290505b9392505050565b6000819050919050565b600060ff82169050919050565b6000620004c882620004a4565b9150620004d583620004ae565b9250620005047fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484620003b8565b905092915050565b60006200051982620004a4565b91506200052683620004a4565b92508282026200053681620004a4565b9150828204841483151762000550576200054f62000321565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006200059382620004a4565b9150620005a083620004a4565b925082620005b357620005b262000557565b5b828204905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620005f082620005c3565b9050919050565b6200060281620005e3565b81146200060e57600080fd5b50565b6000815190506200062281620005f7565b92915050565b600080600060608486031215620006445762000643620005be565b5b6000620006548682870162000611565b9350506020620006678682870162000611565b92505060406200067a8682870162000611565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200070657607f821691505b6020821081036200071c576200071b620006be565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620007867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000747565b62000792868362000747565b95508019841693508086168417925050509392505050565b6000819050919050565b6000620007d5620007cf620007c984620004a4565b620007aa565b620004a4565b9050919050565b6000819050919050565b620007f183620007b4565b620008096200080082620007dc565b84845462000754565b825550505050565b600090565b6200082062000811565b6200082d818484620007e6565b505050565b5b8181101562000855576200084960008262000816565b60018101905062000833565b5050565b601f821115620008a4576200086e8162000722565b620008798462000737565b8101602085101562000889578190505b620008a1620008988562000737565b83018262000832565b50505b505050565b600082821c905092915050565b6000620008c960001984600802620008a9565b1980831691505092915050565b6000620008e48383620008b6565b9150826002028217905092915050565b620008ff8262000684565b67ffffffffffffffff8111156200091b576200091a6200068f565b5b620009278254620006ed565b6200093482828562000859565b600060209050601f8311600181146200096c576000841562000957578287015190505b620009638582620008d6565b865550620009d3565b601f1984166200097c8662000722565b60005b82811015620009a6578489015182556001820191506020850194506020810190506200097f565b86831015620009c65784890151620009c2601f891682620008b6565b8355505b6001600288020188555050505b505050505050565b61474580620009eb6000396000f3fe608060405234801561001057600080fd5b50600436106102a05760003560e01c806391f4be9411610167578063b5bbb243116100ce578063ed00e65311610087578063ed00e653146108e9578063eea590f414610907578063f0dda65c14610925578063f23a6e6114610941578063f2fde38b14610971578063faf8e47e1461098d576102a0565b8063b5bbb243146107db578063ba844c301461080b578063bb61a9001461083b578063bc197c8114610859578063dbdfd12014610889578063dd62ed3e146108b9576102a0565b8063a5cc56ff11610120578063a5cc56ff146106f3578063a684c47114610723578063a9059cbb14610741578063accc1d5e14610771578063ade93f431461078d578063b1d493e5146107ab576102a0565b806391f4be941461063157806395d89b411461064f5780639797dc351461066d578063a1bdb15e1461068b578063a457c2d7146106a7578063a4c2f651146106d7576102a0565b806323b872dd1161020b57806354bf225c116101c457806354bf225c146105715780636a32a427146105a157806370a08231146105bd578063715018a6146105ed578063857b767b146105f75780638da5cb5b14610613576102a0565b806323b872dd1461048957806326dc3672146104b95780632b6f3615146104e9578063313ce5671461050757806339509351146105255780634b77d28514610555576102a0565b806314bfd6d01161025d57806314bfd6d01461038f578063150b7a02146103bf578063167ac252146103ef57806318160ddd1461040b5780631d5490dc146104295780631ff1d40a14610459576102a0565b806301b8199a146102a557806301ffc9a7146102c357806305c42f5d146102f357806306fdde03146103235780630775b1c314610341578063095ea7b31461035f575b600080fd5b6102ad6109a9565b6040516102ba9190612f2d565b60405180910390f35b6102dd60048036038101906102d89190612fb4565b6109af565b6040516102ea9190612ffc565b60405180910390f35b61030d60048036038101906103089190613043565b610a29565b60405161031a9190612f2d565b60405180910390f35b61032b610a41565b6040516103389190613100565b60405180910390f35b610349610ad3565b60405161035691906131a1565b60405180910390f35b610379600480360381019061037491906131fa565b610af9565b6040516103869190612ffc565b60405180910390f35b6103a960048036038101906103a49190613043565b610b1c565b6040516103b69190613249565b60405180910390f35b6103d960048036038101906103d49190613399565b610b5b565b6040516103e6919061342b565b60405180910390f35b61040960048036038101906104049190613043565b610b6f565b005b610413610b81565b6040516104209190612f2d565b60405180910390f35b610443600480360381019061043e919061350e565b610b8b565b6040516104509190612f2d565b60405180910390f35b610473600480360381019061046e9190613043565b610e74565b6040516104809190613249565b60405180910390f35b6104a3600480360381019061049e919061356a565b610ea7565b6040516104b09190612ffc565b60405180910390f35b6104d360048036038101906104ce9190613043565b610ed6565b6040516104e09190613249565b60405180910390f35b6104f1610f09565b6040516104fe91906131a1565b60405180910390f35b61050f610f2f565b60405161051c91906135d9565b60405180910390f35b61053f600480360381019061053a91906131fa565b610f38565b60405161054c9190612ffc565b60405180910390f35b61056f600480360381019061056a91906135f4565b610f6f565b005b61058b60048036038101906105869190613043565b611128565b6040516105989190613249565b60405180910390f35b6105bb60048036038101906105b69190613660565b61115b565b005b6105d760048036038101906105d291906136a0565b6111da565b6040516105e49190612f2d565b60405180910390f35b6105f5611222565b005b610611600480360381019061060c919061350e565b611236565b005b61061b611302565b6040516106289190613249565b60405180910390f35b61063961132c565b60405161064691906131a1565b60405180910390f35b610657611352565b6040516106649190613100565b60405180910390f35b6106756113e4565b6040516106829190612f2d565b60405180910390f35b6106a560048036038101906106a09190613043565b6113ea565b005b6106c160048036038101906106bc91906131fa565b611428565b6040516106ce9190612ffc565b60405180910390f35b6106f160048036038101906106ec91906136a0565b61149f565b005b61070d600480360381019061070891906136cd565b6115b0565b60405161071a9190612f2d565b60405180910390f35b61072b611621565b6040516107389190613249565b60405180910390f35b61075b600480360381019061075691906131fa565b611647565b6040516107689190612ffc565b60405180910390f35b61078b60048036038101906107869190613768565b61166a565b005b61079561175b565b6040516107a29190612ffc565b60405180910390f35b6107c560048036038101906107c09190613043565b61176e565b6040516107d29190612f2d565b60405180910390f35b6107f560048036038101906107f091906137b5565b611786565b6040516108029190612ffc565b60405180910390f35b610825600480360381019061082091906136cd565b61181f565b6040516108329190613249565b60405180910390f35b6108436118f0565b6040516108509190612ffc565b60405180910390f35b610873600480360381019061086e9190613824565b611903565b604051610880919061342b565b60405180910390f35b6108a3600480360381019061089e9190613043565b611918565b6040516108b09190612f2d565b60405180910390f35b6108d360048036038101906108ce91906138f3565b611930565b6040516108e09190612f2d565b60405180910390f35b6108f16119b7565b6040516108fe9190612ffc565b60405180910390f35b61090f611b0b565b60405161091c9190612ffc565b60405180910390f35b61093f600480360381019061093a91906131fa565b611b1e565b005b61095b60048036038101906109569190613933565b611b34565b604051610968919061342b565b60405180910390f35b61098b600480360381019061098691906136a0565b611b49565b005b6109a760048036038101906109a2919061350e565b611bcc565b005b60135481565b60007f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a225750610a2182611fbc565b5b9050919050565b600e6020528060005260406000206000915090505481565b606060038054610a50906139f9565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7c906139f9565b8015610ac95780601f10610a9e57610100808354040283529160200191610ac9565b820191906000526020600020905b815481529060010190602001808311610aac57829003601f168201915b5050505050905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080610b04612026565b9050610b1181858561202e565b600191505092915050565b60078181548110610b2c57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600063150b7a0260e01b9050949350505050565b610b776121f7565b8060128190555050565b6000600254905090565b60008060005b8451811015610e5c576000858281518110610baf57610bae613a2a565b5b6020026020010151905060008503610c9457600073ffffffffffffffffffffffffffffffffffffffff16600b600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610c63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5a90613aa5565b60405180910390fd5b600c60008281526020019081526020016000205442610c829190613af4565b83610c8d9190613b28565b9250610e48565b60018503610d6f57600073ffffffffffffffffffffffffffffffffffffffff16600d600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610d3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3590613aa5565b60405180910390fd5b600e60008281526020019081526020016000205442610d5d9190613af4565b83610d689190613b28565b9250610e47565b60028503610e4657600073ffffffffffffffffffffffffffffffffffffffff16600f600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610e19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1090613aa5565b60405180910390fd5b601060008281526020019081526020016000205442610e389190613af4565b83610e439190613b28565b92505b5b5b508080610e5490613b5c565b915050610b91565b5060135481610e6b9190613ba4565b91505092915050565b600f6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080610eb2612026565b9050610ebf858285612240565b610eca8585856122cc565b60019150509392505050565b600b6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006012905090565b600080610f43612026565b9050610f64818585610f558589611930565b610f5f9190613b28565b61202e565b600191505092915050565b610f77611302565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610ffd5750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61103c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103390613c7e565b60405180910390fd5b6000820361108a5780600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611124565b600182036110d85780600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611123565b600282036111225780600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b5b5050565b600d6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6111636121f7565b6000820361118a5780601160006101000a81548160ff0219169083151502179055506111d6565b600182036111b15780601160016101000a81548160ff0219169083151502179055506111d5565b600282036111d45780601160026101000a81548160ff0219169083151502179055505b5b5b5050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61122a612542565b61123460006125c0565b565b600082510361127a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127190613cea565b60405180910390fd5b601254825111156112c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b790613d56565b60405180910390fd5b60018251036112f3576112ee826000815181106112e0576112df613a2a565b5b602002602001015182612686565b6112fe565b6112fd8282612c88565b5b5050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060048054611361906139f9565b80601f016020809104026020016040519081016040528092919081815260200182805461138d906139f9565b80156113da5780601f106113af576101008083540402835291602001916113da565b820191906000526020600020905b8154815290600101906020018083116113bd57829003601f168201915b5050505050905090565b60125481565b6113f26121f7565b620151806113fe610f2f565b600a61140a9190613ea9565b826114159190613ba4565b61141f9190613f23565b60138190555050565b600080611433612026565b905060006114418286611930565b905083811015611486576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147d90613fc6565b60405180910390fd5b611493828686840361202e565b60019250505092915050565b6114a7611302565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061152d5750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61156c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156390613c7e565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008083036115d457600c600083815260200190815260200160002054905061161b565b600183036115f757600e600083815260200190815260200160002054905061161b565b6002830361161a576010600083815260200190815260200160002054905061161b565b5b92915050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080611652612026565b905061165f8185856122cc565b600191505092915050565b611672611302565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806116f85750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172e90613c7e565b60405180910390fd5b600760006117459190612e36565b818160079190611756929190612e57565b505050565b601160009054906101000a900460ff1681565b60106020528060005260406000206000915090505481565b600080600090505b82518110156118125760008382815181106117ac576117ab613a2a565b5b602002602001015190508573ffffffffffffffffffffffffffffffffffffffff166117d7868361181f565b73ffffffffffffffffffffffffffffffffffffffff1603156117fe57600092505050611818565b50808061180a90613b5c565b91505061178e565b50600190505b9392505050565b600080830361186357600b600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506118ea565b600183036118a657600d600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506118ea565b600283036118e957600f600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506118ea565b5b92915050565b601160029054906101000a900460ff1681565b600063bc197c8160e01b905095945050505050565b600c6020528060005260406000206000915090505481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60006119c1611302565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611a475750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15611a555760019050611b08565b60006007805490501115611b035760005b600780549050811015611b015760078181548110611a8757611a86613a2a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1603611aee576001915050611b08565b8080611af990613b5c565b915050611a66565b505b600090505b90565b601160019054906101000a900460ff1681565b611b266121f7565b611b308282612cd6565b5050565b600063f23a6e6160e01b905095945050505050565b611b51612542565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb790614058565b60405180910390fd5b611bc9816125c0565b50565b6000825103611c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0790613cea565b60405180910390fd5b60125482511115611c56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4d90613d56565b60405180910390fd5b611c61338284611786565b611ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c97906140c4565b60405180910390fd5b6000611cac8383610b8b565b905060005b8351811015611fac576000848281518110611ccf57611cce613a2a565b5b6020026020010151905060008403611dc457600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3033846040518463ffffffff1660e01b8152600401611d40939291906140e4565b600060405180830381600087803b158015611d5a57600080fd5b505af1158015611d6e573d6000803e3d6000fd5b50505050600b600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600c600082815260200190815260200160002060009055611f98565b60018403611eaf57600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3033846040518463ffffffff1660e01b8152600401611e2b939291906140e4565b600060405180830381600087803b158015611e4557600080fd5b505af1158015611e59573d6000803e3d6000fd5b50505050600d600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600e600082815260200190815260200160002060009055611f97565b60028403611f9657600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3033846040518463ffffffff1660e01b8152600401611f16939291906140e4565b600060405180830381600087803b158015611f3057600080fd5b505af1158015611f44573d6000803e3d6000fd5b50505050600f600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560106000828152602001908152602001600020600090555b5b5b508080611fa490613b5c565b915050611cb1565b50611fb73382612cd6565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361209d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120949061418d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361210c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121039061421f565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516121ea9190612f2d565b60405180910390a3505050565b6121ff6119b7565b61223e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612235906142b1565b60405180910390fd5b565b600061224c8484611930565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146122c657818110156122b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122af9061431d565b60405180910390fd5b6122c5848484840361202e565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361233b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612332906143af565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036123aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a190614441565b60405180910390fd5b6123b5838383612e2c565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561243b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612432906144d3565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516125299190612f2d565b60405180910390a361253c848484612e31565b50505050565b61254a612026565b73ffffffffffffffffffffffffffffffffffffffff16612568611302565b73ffffffffffffffffffffffffffffffffffffffff16146125be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b59061453f565b60405180910390fd5b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081036128865760011515601160009054906101000a900460ff161515036126e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126db906145ab565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612786576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277d90614617565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3330856040518463ffffffff1660e01b81526004016127e5939291906140e4565b600060405180830381600087803b1580156127ff57600080fd5b505af1158015612813573d6000803e3d6000fd5b5050505033600b600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555042600c600084815260200190815260200160002081905550612c84565b60018103612a865760011515601160019054906101000a900460ff161515036128e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128db90614683565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297d90614617565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3330856040518463ffffffff1660e01b81526004016129e5939291906140e4565b600060405180830381600087803b1580156129ff57600080fd5b505af1158015612a13573d6000803e3d6000fd5b5050505033600d600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555042600e600084815260200190815260200160002081905550612c83565b60028103612c825760011515601160029054906101000a900460ff16151503612ae4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612adb90614683565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600f600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612b86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7d90614617565b60405180910390fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3330856040518463ffffffff1660e01b8152600401612be5939291906140e4565b600060405180830381600087803b158015612bff57600080fd5b505af1158015612c13573d6000803e3d6000fd5b5050505033600f600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055504260106000848152602001908152602001600020819055505b5b5b5050565b60005b8251811015612cd1576000838281518110612ca957612ca8613a2a565b5b60200260200101519050612cbd8184612686565b508080612cc990613b5c565b915050612c8b565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612d45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3c906146ef565b60405180910390fd5b612d5160008383612e2c565b8060026000828254612d639190613b28565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612e149190612f2d565b60405180910390a3612e2860008383612e31565b5050565b505050565b505050565b5080546000825590600052602060002090810190612e549190612ef7565b50565b828054828255906000526020600020908101928215612ee6579160200282015b82811115612ee557823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190612e77565b5b509050612ef39190612ef7565b5090565b5b80821115612f10576000816000905550600101612ef8565b5090565b6000819050919050565b612f2781612f14565b82525050565b6000602082019050612f426000830184612f1e565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612f9181612f5c565b8114612f9c57600080fd5b50565b600081359050612fae81612f88565b92915050565b600060208284031215612fca57612fc9612f52565b5b6000612fd884828501612f9f565b91505092915050565b60008115159050919050565b612ff681612fe1565b82525050565b60006020820190506130116000830184612fed565b92915050565b61302081612f14565b811461302b57600080fd5b50565b60008135905061303d81613017565b92915050565b60006020828403121561305957613058612f52565b5b60006130678482850161302e565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156130aa57808201518184015260208101905061308f565b60008484015250505050565b6000601f19601f8301169050919050565b60006130d282613070565b6130dc818561307b565b93506130ec81856020860161308c565b6130f5816130b6565b840191505092915050565b6000602082019050818103600083015261311a81846130c7565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061316761316261315d84613122565b613142565b613122565b9050919050565b60006131798261314c565b9050919050565b600061318b8261316e565b9050919050565b61319b81613180565b82525050565b60006020820190506131b66000830184613192565b92915050565b60006131c782613122565b9050919050565b6131d7816131bc565b81146131e257600080fd5b50565b6000813590506131f4816131ce565b92915050565b6000806040838503121561321157613210612f52565b5b600061321f858286016131e5565b92505060206132308582860161302e565b9150509250929050565b613243816131bc565b82525050565b600060208201905061325e600083018461323a565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6132a6826130b6565b810181811067ffffffffffffffff821117156132c5576132c461326e565b5b80604052505050565b60006132d8612f48565b90506132e4828261329d565b919050565b600067ffffffffffffffff8211156133045761330361326e565b5b61330d826130b6565b9050602081019050919050565b82818337600083830152505050565b600061333c613337846132e9565b6132ce565b90508281526020810184848401111561335857613357613269565b5b61336384828561331a565b509392505050565b600082601f8301126133805761337f613264565b5b8135613390848260208601613329565b91505092915050565b600080600080608085870312156133b3576133b2612f52565b5b60006133c1878288016131e5565b94505060206133d2878288016131e5565b93505060406133e38782880161302e565b925050606085013567ffffffffffffffff81111561340457613403612f57565b5b6134108782880161336b565b91505092959194509250565b61342581612f5c565b82525050565b6000602082019050613440600083018461341c565b92915050565b600067ffffffffffffffff8211156134615761346061326e565b5b602082029050602081019050919050565b600080fd5b600061348a61348584613446565b6132ce565b905080838252602082019050602084028301858111156134ad576134ac613472565b5b835b818110156134d657806134c2888261302e565b8452602084019350506020810190506134af565b5050509392505050565b600082601f8301126134f5576134f4613264565b5b8135613505848260208601613477565b91505092915050565b6000806040838503121561352557613524612f52565b5b600083013567ffffffffffffffff81111561354357613542612f57565b5b61354f858286016134e0565b92505060206135608582860161302e565b9150509250929050565b60008060006060848603121561358357613582612f52565b5b6000613591868287016131e5565b93505060206135a2868287016131e5565b92505060406135b38682870161302e565b9150509250925092565b600060ff82169050919050565b6135d3816135bd565b82525050565b60006020820190506135ee60008301846135ca565b92915050565b6000806040838503121561360b5761360a612f52565b5b60006136198582860161302e565b925050602061362a858286016131e5565b9150509250929050565b61363d81612fe1565b811461364857600080fd5b50565b60008135905061365a81613634565b92915050565b6000806040838503121561367757613676612f52565b5b60006136858582860161302e565b92505060206136968582860161364b565b9150509250929050565b6000602082840312156136b6576136b5612f52565b5b60006136c4848285016131e5565b91505092915050565b600080604083850312156136e4576136e3612f52565b5b60006136f28582860161302e565b92505060206137038582860161302e565b9150509250929050565b600080fd5b60008083601f84011261372857613727613264565b5b8235905067ffffffffffffffff8111156137455761374461370d565b5b60208301915083602082028301111561376157613760613472565b5b9250929050565b6000806020838503121561377f5761377e612f52565b5b600083013567ffffffffffffffff81111561379d5761379c612f57565b5b6137a985828601613712565b92509250509250929050565b6000806000606084860312156137ce576137cd612f52565b5b60006137dc868287016131e5565b93505060206137ed8682870161302e565b925050604084013567ffffffffffffffff81111561380e5761380d612f57565b5b61381a868287016134e0565b9150509250925092565b600080600080600060a086880312156138405761383f612f52565b5b600061384e888289016131e5565b955050602061385f888289016131e5565b945050604086013567ffffffffffffffff8111156138805761387f612f57565b5b61388c888289016134e0565b935050606086013567ffffffffffffffff8111156138ad576138ac612f57565b5b6138b9888289016134e0565b925050608086013567ffffffffffffffff8111156138da576138d9612f57565b5b6138e68882890161336b565b9150509295509295909350565b6000806040838503121561390a57613909612f52565b5b6000613918858286016131e5565b9250506020613929858286016131e5565b9150509250929050565b600080600080600060a0868803121561394f5761394e612f52565b5b600061395d888289016131e5565b955050602061396e888289016131e5565b945050604061397f8882890161302e565b93505060606139908882890161302e565b925050608086013567ffffffffffffffff8111156139b1576139b0612f57565b5b6139bd8882890161336b565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613a1157607f821691505b602082108103613a2457613a236139ca565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e4654204e4f54205354414b4544000000000000000000000000000000000000600082015250565b6000613a8f600e8361307b565b9150613a9a82613a59565b602082019050919050565b60006020820190508181036000830152613abe81613a82565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613aff82612f14565b9150613b0a83612f14565b9250828203905081811115613b2257613b21613ac5565b5b92915050565b6000613b3382612f14565b9150613b3e83612f14565b9250828201905080821115613b5657613b55613ac5565b5b92915050565b6000613b6782612f14565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b9957613b98613ac5565b5b600182019050919050565b6000613baf82612f14565b9150613bba83612f14565b9250828202613bc881612f14565b91508282048414831517613bdf57613bde613ac5565b5b5092915050565b7f4f776e6572206f722050726f6a656374204c6561646572204f6e6c793a20636160008201527f6c6c6572206973206e6f74204f776e6572206f722050726f6a656374204c656160208201527f6465720000000000000000000000000000000000000000000000000000000000604082015250565b6000613c6860438361307b565b9150613c7382613be6565b606082019050919050565b60006020820190508181036000830152613c9781613c5b565b9050919050565b7f4e6f204944730000000000000000000000000000000000000000000000000000600082015250565b6000613cd460068361307b565b9150613cdf82613c9e565b602082019050919050565b60006020820190508181036000830152613d0381613cc7565b9050919050565b7f546f6f204d616e79204944730000000000000000000000000000000000000000600082015250565b6000613d40600c8361307b565b9150613d4b82613d0a565b602082019050919050565b60006020820190508181036000830152613d6f81613d33565b9050919050565b60008160011c9050919050565b6000808291508390505b6001851115613dcd57808604811115613da957613da8613ac5565b5b6001851615613db85780820291505b8081029050613dc685613d76565b9450613d8d565b94509492505050565b600082613de65760019050613ea2565b81613df45760009050613ea2565b8160018114613e0a5760028114613e1457613e43565b6001915050613ea2565b60ff841115613e2657613e25613ac5565b5b8360020a915084821115613e3d57613e3c613ac5565b5b50613ea2565b5060208310610133831016604e8410600b8410161715613e785782820a905083811115613e7357613e72613ac5565b5b613ea2565b613e858484846001613d83565b92509050818404811115613e9c57613e9b613ac5565b5b81810290505b9392505050565b6000613eb482612f14565b9150613ebf836135bd565b9250613eec7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613dd6565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613f2e82612f14565b9150613f3983612f14565b925082613f4957613f48613ef4565b5b828204905092915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613fb060258361307b565b9150613fbb82613f54565b604082019050919050565b60006020820190508181036000830152613fdf81613fa3565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061404260268361307b565b915061404d82613fe6565b604082019050919050565b6000602082019050818103600083015261407181614035565b9050919050565b7f43414e4e4f5420554e5354414b45000000000000000000000000000000000000600082015250565b60006140ae600e8361307b565b91506140b982614078565b602082019050919050565b600060208201905081810360008301526140dd816140a1565b9050919050565b60006060820190506140f9600083018661323a565b614106602083018561323a565b6141136040830184612f1e565b949350505050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061417760248361307b565b91506141828261411b565b604082019050919050565b600060208201905081810360008301526141a68161416a565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061420960228361307b565b9150614214826141ad565b604082019050919050565b60006020820190508181036000830152614238816141fc565b9050919050565b7f41646d696e204f6e6c793a2063616c6c6572206973206e6f7420616e2061646d60008201527f696e000000000000000000000000000000000000000000000000000000000000602082015250565b600061429b60228361307b565b91506142a68261423f565b604082019050919050565b600060208201905081810360008301526142ca8161428e565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000614307601d8361307b565b9150614312826142d1565b602082019050919050565b60006020820190508181036000830152614336816142fa565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061439960258361307b565b91506143a48261433d565b604082019050919050565b600060208201905081810360008301526143c88161438c565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061442b60238361307b565b9150614436826143cf565b604082019050919050565b6000602082019050818103600083015261445a8161441e565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006144bd60268361307b565b91506144c882614461565b604082019050919050565b600060208201905081810360008301526144ec816144b0565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061452960208361307b565b9150614534826144f3565b602082019050919050565b600060208201905081810360008301526145588161451c565b9050919050565b7f436f6e74726163742041205374616b696e672050617573656400000000000000600082015250565b600061459560198361307b565b91506145a08261455f565b602082019050919050565b600060208201905081810360008301526145c481614588565b9050919050565b7f4e465420414c5245414459205354414b45440000000000000000000000000000600082015250565b600061460160128361307b565b915061460c826145cb565b602082019050919050565b60006020820190508181036000830152614630816145f4565b9050919050565b7f436f6e74726163742042205374616b696e672050617573656400000000000000600082015250565b600061466d60198361307b565b915061467882614637565b602082019050919050565b6000602082019050818103600083015261469c81614660565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006146d9601f8361307b565b91506146e4826146a3565b602082019050919050565b60006020820190508181036000830152614708816146cc565b905091905056fea2646970667358221220fbd8a80b462a2e5dfdea4838b2e57cc735b7107d9a1d1fb8fff13d0c4c89ebbe64736f6c6343000811003300000000000000000000000028f139197e8e916ca79b42935e6caceaa75dee56000000000000000000000000e5b52eb1250a6c860a0088a2ba275c5fed8457b90000000000000000000000006fefb647395e680339badc84dc774e3ca8bca7b9
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102a05760003560e01c806391f4be9411610167578063b5bbb243116100ce578063ed00e65311610087578063ed00e653146108e9578063eea590f414610907578063f0dda65c14610925578063f23a6e6114610941578063f2fde38b14610971578063faf8e47e1461098d576102a0565b8063b5bbb243146107db578063ba844c301461080b578063bb61a9001461083b578063bc197c8114610859578063dbdfd12014610889578063dd62ed3e146108b9576102a0565b8063a5cc56ff11610120578063a5cc56ff146106f3578063a684c47114610723578063a9059cbb14610741578063accc1d5e14610771578063ade93f431461078d578063b1d493e5146107ab576102a0565b806391f4be941461063157806395d89b411461064f5780639797dc351461066d578063a1bdb15e1461068b578063a457c2d7146106a7578063a4c2f651146106d7576102a0565b806323b872dd1161020b57806354bf225c116101c457806354bf225c146105715780636a32a427146105a157806370a08231146105bd578063715018a6146105ed578063857b767b146105f75780638da5cb5b14610613576102a0565b806323b872dd1461048957806326dc3672146104b95780632b6f3615146104e9578063313ce5671461050757806339509351146105255780634b77d28514610555576102a0565b806314bfd6d01161025d57806314bfd6d01461038f578063150b7a02146103bf578063167ac252146103ef57806318160ddd1461040b5780631d5490dc146104295780631ff1d40a14610459576102a0565b806301b8199a146102a557806301ffc9a7146102c357806305c42f5d146102f357806306fdde03146103235780630775b1c314610341578063095ea7b31461035f575b600080fd5b6102ad6109a9565b6040516102ba9190612f2d565b60405180910390f35b6102dd60048036038101906102d89190612fb4565b6109af565b6040516102ea9190612ffc565b60405180910390f35b61030d60048036038101906103089190613043565b610a29565b60405161031a9190612f2d565b60405180910390f35b61032b610a41565b6040516103389190613100565b60405180910390f35b610349610ad3565b60405161035691906131a1565b60405180910390f35b610379600480360381019061037491906131fa565b610af9565b6040516103869190612ffc565b60405180910390f35b6103a960048036038101906103a49190613043565b610b1c565b6040516103b69190613249565b60405180910390f35b6103d960048036038101906103d49190613399565b610b5b565b6040516103e6919061342b565b60405180910390f35b61040960048036038101906104049190613043565b610b6f565b005b610413610b81565b6040516104209190612f2d565b60405180910390f35b610443600480360381019061043e919061350e565b610b8b565b6040516104509190612f2d565b60405180910390f35b610473600480360381019061046e9190613043565b610e74565b6040516104809190613249565b60405180910390f35b6104a3600480360381019061049e919061356a565b610ea7565b6040516104b09190612ffc565b60405180910390f35b6104d360048036038101906104ce9190613043565b610ed6565b6040516104e09190613249565b60405180910390f35b6104f1610f09565b6040516104fe91906131a1565b60405180910390f35b61050f610f2f565b60405161051c91906135d9565b60405180910390f35b61053f600480360381019061053a91906131fa565b610f38565b60405161054c9190612ffc565b60405180910390f35b61056f600480360381019061056a91906135f4565b610f6f565b005b61058b60048036038101906105869190613043565b611128565b6040516105989190613249565b60405180910390f35b6105bb60048036038101906105b69190613660565b61115b565b005b6105d760048036038101906105d291906136a0565b6111da565b6040516105e49190612f2d565b60405180910390f35b6105f5611222565b005b610611600480360381019061060c919061350e565b611236565b005b61061b611302565b6040516106289190613249565b60405180910390f35b61063961132c565b60405161064691906131a1565b60405180910390f35b610657611352565b6040516106649190613100565b60405180910390f35b6106756113e4565b6040516106829190612f2d565b60405180910390f35b6106a560048036038101906106a09190613043565b6113ea565b005b6106c160048036038101906106bc91906131fa565b611428565b6040516106ce9190612ffc565b60405180910390f35b6106f160048036038101906106ec91906136a0565b61149f565b005b61070d600480360381019061070891906136cd565b6115b0565b60405161071a9190612f2d565b60405180910390f35b61072b611621565b6040516107389190613249565b60405180910390f35b61075b600480360381019061075691906131fa565b611647565b6040516107689190612ffc565b60405180910390f35b61078b60048036038101906107869190613768565b61166a565b005b61079561175b565b6040516107a29190612ffc565b60405180910390f35b6107c560048036038101906107c09190613043565b61176e565b6040516107d29190612f2d565b60405180910390f35b6107f560048036038101906107f091906137b5565b611786565b6040516108029190612ffc565b60405180910390f35b610825600480360381019061082091906136cd565b61181f565b6040516108329190613249565b60405180910390f35b6108436118f0565b6040516108509190612ffc565b60405180910390f35b610873600480360381019061086e9190613824565b611903565b604051610880919061342b565b60405180910390f35b6108a3600480360381019061089e9190613043565b611918565b6040516108b09190612f2d565b60405180910390f35b6108d360048036038101906108ce91906138f3565b611930565b6040516108e09190612f2d565b60405180910390f35b6108f16119b7565b6040516108fe9190612ffc565b60405180910390f35b61090f611b0b565b60405161091c9190612ffc565b60405180910390f35b61093f600480360381019061093a91906131fa565b611b1e565b005b61095b60048036038101906109569190613933565b611b34565b604051610968919061342b565b60405180910390f35b61098b600480360381019061098691906136a0565b611b49565b005b6109a760048036038101906109a2919061350e565b611bcc565b005b60135481565b60007f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a225750610a2182611fbc565b5b9050919050565b600e6020528060005260406000206000915090505481565b606060038054610a50906139f9565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7c906139f9565b8015610ac95780601f10610a9e57610100808354040283529160200191610ac9565b820191906000526020600020905b815481529060010190602001808311610aac57829003601f168201915b5050505050905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080610b04612026565b9050610b1181858561202e565b600191505092915050565b60078181548110610b2c57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600063150b7a0260e01b9050949350505050565b610b776121f7565b8060128190555050565b6000600254905090565b60008060005b8451811015610e5c576000858281518110610baf57610bae613a2a565b5b6020026020010151905060008503610c9457600073ffffffffffffffffffffffffffffffffffffffff16600b600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610c63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5a90613aa5565b60405180910390fd5b600c60008281526020019081526020016000205442610c829190613af4565b83610c8d9190613b28565b9250610e48565b60018503610d6f57600073ffffffffffffffffffffffffffffffffffffffff16600d600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610d3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3590613aa5565b60405180910390fd5b600e60008281526020019081526020016000205442610d5d9190613af4565b83610d689190613b28565b9250610e47565b60028503610e4657600073ffffffffffffffffffffffffffffffffffffffff16600f600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610e19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1090613aa5565b60405180910390fd5b601060008281526020019081526020016000205442610e389190613af4565b83610e439190613b28565b92505b5b5b508080610e5490613b5c565b915050610b91565b5060135481610e6b9190613ba4565b91505092915050565b600f6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080610eb2612026565b9050610ebf858285612240565b610eca8585856122cc565b60019150509392505050565b600b6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006012905090565b600080610f43612026565b9050610f64818585610f558589611930565b610f5f9190613b28565b61202e565b600191505092915050565b610f77611302565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610ffd5750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61103c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103390613c7e565b60405180910390fd5b6000820361108a5780600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611124565b600182036110d85780600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611123565b600282036111225780600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b5b5050565b600d6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6111636121f7565b6000820361118a5780601160006101000a81548160ff0219169083151502179055506111d6565b600182036111b15780601160016101000a81548160ff0219169083151502179055506111d5565b600282036111d45780601160026101000a81548160ff0219169083151502179055505b5b5b5050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61122a612542565b61123460006125c0565b565b600082510361127a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127190613cea565b60405180910390fd5b601254825111156112c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b790613d56565b60405180910390fd5b60018251036112f3576112ee826000815181106112e0576112df613a2a565b5b602002602001015182612686565b6112fe565b6112fd8282612c88565b5b5050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060048054611361906139f9565b80601f016020809104026020016040519081016040528092919081815260200182805461138d906139f9565b80156113da5780601f106113af576101008083540402835291602001916113da565b820191906000526020600020905b8154815290600101906020018083116113bd57829003601f168201915b5050505050905090565b60125481565b6113f26121f7565b620151806113fe610f2f565b600a61140a9190613ea9565b826114159190613ba4565b61141f9190613f23565b60138190555050565b600080611433612026565b905060006114418286611930565b905083811015611486576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147d90613fc6565b60405180910390fd5b611493828686840361202e565b60019250505092915050565b6114a7611302565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061152d5750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61156c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156390613c7e565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008083036115d457600c600083815260200190815260200160002054905061161b565b600183036115f757600e600083815260200190815260200160002054905061161b565b6002830361161a576010600083815260200190815260200160002054905061161b565b5b92915050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080611652612026565b905061165f8185856122cc565b600191505092915050565b611672611302565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806116f85750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172e90613c7e565b60405180910390fd5b600760006117459190612e36565b818160079190611756929190612e57565b505050565b601160009054906101000a900460ff1681565b60106020528060005260406000206000915090505481565b600080600090505b82518110156118125760008382815181106117ac576117ab613a2a565b5b602002602001015190508573ffffffffffffffffffffffffffffffffffffffff166117d7868361181f565b73ffffffffffffffffffffffffffffffffffffffff1603156117fe57600092505050611818565b50808061180a90613b5c565b91505061178e565b50600190505b9392505050565b600080830361186357600b600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506118ea565b600183036118a657600d600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506118ea565b600283036118e957600f600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506118ea565b5b92915050565b601160029054906101000a900460ff1681565b600063bc197c8160e01b905095945050505050565b600c6020528060005260406000206000915090505481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60006119c1611302565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611a475750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15611a555760019050611b08565b60006007805490501115611b035760005b600780549050811015611b015760078181548110611a8757611a86613a2a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1603611aee576001915050611b08565b8080611af990613b5c565b915050611a66565b505b600090505b90565b601160019054906101000a900460ff1681565b611b266121f7565b611b308282612cd6565b5050565b600063f23a6e6160e01b905095945050505050565b611b51612542565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb790614058565b60405180910390fd5b611bc9816125c0565b50565b6000825103611c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0790613cea565b60405180910390fd5b60125482511115611c56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4d90613d56565b60405180910390fd5b611c61338284611786565b611ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c97906140c4565b60405180910390fd5b6000611cac8383610b8b565b905060005b8351811015611fac576000848281518110611ccf57611cce613a2a565b5b6020026020010151905060008403611dc457600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3033846040518463ffffffff1660e01b8152600401611d40939291906140e4565b600060405180830381600087803b158015611d5a57600080fd5b505af1158015611d6e573d6000803e3d6000fd5b50505050600b600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600c600082815260200190815260200160002060009055611f98565b60018403611eaf57600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3033846040518463ffffffff1660e01b8152600401611e2b939291906140e4565b600060405180830381600087803b158015611e4557600080fd5b505af1158015611e59573d6000803e3d6000fd5b50505050600d600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600e600082815260200190815260200160002060009055611f97565b60028403611f9657600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3033846040518463ffffffff1660e01b8152600401611f16939291906140e4565b600060405180830381600087803b158015611f3057600080fd5b505af1158015611f44573d6000803e3d6000fd5b50505050600f600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560106000828152602001908152602001600020600090555b5b5b508080611fa490613b5c565b915050611cb1565b50611fb73382612cd6565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361209d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120949061418d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361210c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121039061421f565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516121ea9190612f2d565b60405180910390a3505050565b6121ff6119b7565b61223e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612235906142b1565b60405180910390fd5b565b600061224c8484611930565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146122c657818110156122b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122af9061431d565b60405180910390fd5b6122c5848484840361202e565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361233b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612332906143af565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036123aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a190614441565b60405180910390fd5b6123b5838383612e2c565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561243b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612432906144d3565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516125299190612f2d565b60405180910390a361253c848484612e31565b50505050565b61254a612026565b73ffffffffffffffffffffffffffffffffffffffff16612568611302565b73ffffffffffffffffffffffffffffffffffffffff16146125be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b59061453f565b60405180910390fd5b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081036128865760011515601160009054906101000a900460ff161515036126e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126db906145ab565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612786576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277d90614617565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3330856040518463ffffffff1660e01b81526004016127e5939291906140e4565b600060405180830381600087803b1580156127ff57600080fd5b505af1158015612813573d6000803e3d6000fd5b5050505033600b600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555042600c600084815260200190815260200160002081905550612c84565b60018103612a865760011515601160019054906101000a900460ff161515036128e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128db90614683565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297d90614617565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3330856040518463ffffffff1660e01b81526004016129e5939291906140e4565b600060405180830381600087803b1580156129ff57600080fd5b505af1158015612a13573d6000803e3d6000fd5b5050505033600d600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555042600e600084815260200190815260200160002081905550612c83565b60028103612c825760011515601160029054906101000a900460ff16151503612ae4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612adb90614683565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600f600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612b86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7d90614617565b60405180910390fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3330856040518463ffffffff1660e01b8152600401612be5939291906140e4565b600060405180830381600087803b158015612bff57600080fd5b505af1158015612c13573d6000803e3d6000fd5b5050505033600f600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055504260106000848152602001908152602001600020819055505b5b5b5050565b60005b8251811015612cd1576000838281518110612ca957612ca8613a2a565b5b60200260200101519050612cbd8184612686565b508080612cc990613b5c565b915050612c8b565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612d45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3c906146ef565b60405180910390fd5b612d5160008383612e2c565b8060026000828254612d639190613b28565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612e149190612f2d565b60405180910390a3612e2860008383612e31565b5050565b505050565b505050565b5080546000825590600052602060002090810190612e549190612ef7565b50565b828054828255906000526020600020908101928215612ee6579160200282015b82811115612ee557823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190612e77565b5b509050612ef39190612ef7565b5090565b5b80821115612f10576000816000905550600101612ef8565b5090565b6000819050919050565b612f2781612f14565b82525050565b6000602082019050612f426000830184612f1e565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612f9181612f5c565b8114612f9c57600080fd5b50565b600081359050612fae81612f88565b92915050565b600060208284031215612fca57612fc9612f52565b5b6000612fd884828501612f9f565b91505092915050565b60008115159050919050565b612ff681612fe1565b82525050565b60006020820190506130116000830184612fed565b92915050565b61302081612f14565b811461302b57600080fd5b50565b60008135905061303d81613017565b92915050565b60006020828403121561305957613058612f52565b5b60006130678482850161302e565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156130aa57808201518184015260208101905061308f565b60008484015250505050565b6000601f19601f8301169050919050565b60006130d282613070565b6130dc818561307b565b93506130ec81856020860161308c565b6130f5816130b6565b840191505092915050565b6000602082019050818103600083015261311a81846130c7565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061316761316261315d84613122565b613142565b613122565b9050919050565b60006131798261314c565b9050919050565b600061318b8261316e565b9050919050565b61319b81613180565b82525050565b60006020820190506131b66000830184613192565b92915050565b60006131c782613122565b9050919050565b6131d7816131bc565b81146131e257600080fd5b50565b6000813590506131f4816131ce565b92915050565b6000806040838503121561321157613210612f52565b5b600061321f858286016131e5565b92505060206132308582860161302e565b9150509250929050565b613243816131bc565b82525050565b600060208201905061325e600083018461323a565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6132a6826130b6565b810181811067ffffffffffffffff821117156132c5576132c461326e565b5b80604052505050565b60006132d8612f48565b90506132e4828261329d565b919050565b600067ffffffffffffffff8211156133045761330361326e565b5b61330d826130b6565b9050602081019050919050565b82818337600083830152505050565b600061333c613337846132e9565b6132ce565b90508281526020810184848401111561335857613357613269565b5b61336384828561331a565b509392505050565b600082601f8301126133805761337f613264565b5b8135613390848260208601613329565b91505092915050565b600080600080608085870312156133b3576133b2612f52565b5b60006133c1878288016131e5565b94505060206133d2878288016131e5565b93505060406133e38782880161302e565b925050606085013567ffffffffffffffff81111561340457613403612f57565b5b6134108782880161336b565b91505092959194509250565b61342581612f5c565b82525050565b6000602082019050613440600083018461341c565b92915050565b600067ffffffffffffffff8211156134615761346061326e565b5b602082029050602081019050919050565b600080fd5b600061348a61348584613446565b6132ce565b905080838252602082019050602084028301858111156134ad576134ac613472565b5b835b818110156134d657806134c2888261302e565b8452602084019350506020810190506134af565b5050509392505050565b600082601f8301126134f5576134f4613264565b5b8135613505848260208601613477565b91505092915050565b6000806040838503121561352557613524612f52565b5b600083013567ffffffffffffffff81111561354357613542612f57565b5b61354f858286016134e0565b92505060206135608582860161302e565b9150509250929050565b60008060006060848603121561358357613582612f52565b5b6000613591868287016131e5565b93505060206135a2868287016131e5565b92505060406135b38682870161302e565b9150509250925092565b600060ff82169050919050565b6135d3816135bd565b82525050565b60006020820190506135ee60008301846135ca565b92915050565b6000806040838503121561360b5761360a612f52565b5b60006136198582860161302e565b925050602061362a858286016131e5565b9150509250929050565b61363d81612fe1565b811461364857600080fd5b50565b60008135905061365a81613634565b92915050565b6000806040838503121561367757613676612f52565b5b60006136858582860161302e565b92505060206136968582860161364b565b9150509250929050565b6000602082840312156136b6576136b5612f52565b5b60006136c4848285016131e5565b91505092915050565b600080604083850312156136e4576136e3612f52565b5b60006136f28582860161302e565b92505060206137038582860161302e565b9150509250929050565b600080fd5b60008083601f84011261372857613727613264565b5b8235905067ffffffffffffffff8111156137455761374461370d565b5b60208301915083602082028301111561376157613760613472565b5b9250929050565b6000806020838503121561377f5761377e612f52565b5b600083013567ffffffffffffffff81111561379d5761379c612f57565b5b6137a985828601613712565b92509250509250929050565b6000806000606084860312156137ce576137cd612f52565b5b60006137dc868287016131e5565b93505060206137ed8682870161302e565b925050604084013567ffffffffffffffff81111561380e5761380d612f57565b5b61381a868287016134e0565b9150509250925092565b600080600080600060a086880312156138405761383f612f52565b5b600061384e888289016131e5565b955050602061385f888289016131e5565b945050604086013567ffffffffffffffff8111156138805761387f612f57565b5b61388c888289016134e0565b935050606086013567ffffffffffffffff8111156138ad576138ac612f57565b5b6138b9888289016134e0565b925050608086013567ffffffffffffffff8111156138da576138d9612f57565b5b6138e68882890161336b565b9150509295509295909350565b6000806040838503121561390a57613909612f52565b5b6000613918858286016131e5565b9250506020613929858286016131e5565b9150509250929050565b600080600080600060a0868803121561394f5761394e612f52565b5b600061395d888289016131e5565b955050602061396e888289016131e5565b945050604061397f8882890161302e565b93505060606139908882890161302e565b925050608086013567ffffffffffffffff8111156139b1576139b0612f57565b5b6139bd8882890161336b565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613a1157607f821691505b602082108103613a2457613a236139ca565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e4654204e4f54205354414b4544000000000000000000000000000000000000600082015250565b6000613a8f600e8361307b565b9150613a9a82613a59565b602082019050919050565b60006020820190508181036000830152613abe81613a82565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613aff82612f14565b9150613b0a83612f14565b9250828203905081811115613b2257613b21613ac5565b5b92915050565b6000613b3382612f14565b9150613b3e83612f14565b9250828201905080821115613b5657613b55613ac5565b5b92915050565b6000613b6782612f14565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b9957613b98613ac5565b5b600182019050919050565b6000613baf82612f14565b9150613bba83612f14565b9250828202613bc881612f14565b91508282048414831517613bdf57613bde613ac5565b5b5092915050565b7f4f776e6572206f722050726f6a656374204c6561646572204f6e6c793a20636160008201527f6c6c6572206973206e6f74204f776e6572206f722050726f6a656374204c656160208201527f6465720000000000000000000000000000000000000000000000000000000000604082015250565b6000613c6860438361307b565b9150613c7382613be6565b606082019050919050565b60006020820190508181036000830152613c9781613c5b565b9050919050565b7f4e6f204944730000000000000000000000000000000000000000000000000000600082015250565b6000613cd460068361307b565b9150613cdf82613c9e565b602082019050919050565b60006020820190508181036000830152613d0381613cc7565b9050919050565b7f546f6f204d616e79204944730000000000000000000000000000000000000000600082015250565b6000613d40600c8361307b565b9150613d4b82613d0a565b602082019050919050565b60006020820190508181036000830152613d6f81613d33565b9050919050565b60008160011c9050919050565b6000808291508390505b6001851115613dcd57808604811115613da957613da8613ac5565b5b6001851615613db85780820291505b8081029050613dc685613d76565b9450613d8d565b94509492505050565b600082613de65760019050613ea2565b81613df45760009050613ea2565b8160018114613e0a5760028114613e1457613e43565b6001915050613ea2565b60ff841115613e2657613e25613ac5565b5b8360020a915084821115613e3d57613e3c613ac5565b5b50613ea2565b5060208310610133831016604e8410600b8410161715613e785782820a905083811115613e7357613e72613ac5565b5b613ea2565b613e858484846001613d83565b92509050818404811115613e9c57613e9b613ac5565b5b81810290505b9392505050565b6000613eb482612f14565b9150613ebf836135bd565b9250613eec7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613dd6565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613f2e82612f14565b9150613f3983612f14565b925082613f4957613f48613ef4565b5b828204905092915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613fb060258361307b565b9150613fbb82613f54565b604082019050919050565b60006020820190508181036000830152613fdf81613fa3565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061404260268361307b565b915061404d82613fe6565b604082019050919050565b6000602082019050818103600083015261407181614035565b9050919050565b7f43414e4e4f5420554e5354414b45000000000000000000000000000000000000600082015250565b60006140ae600e8361307b565b91506140b982614078565b602082019050919050565b600060208201905081810360008301526140dd816140a1565b9050919050565b60006060820190506140f9600083018661323a565b614106602083018561323a565b6141136040830184612f1e565b949350505050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061417760248361307b565b91506141828261411b565b604082019050919050565b600060208201905081810360008301526141a68161416a565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061420960228361307b565b9150614214826141ad565b604082019050919050565b60006020820190508181036000830152614238816141fc565b9050919050565b7f41646d696e204f6e6c793a2063616c6c6572206973206e6f7420616e2061646d60008201527f696e000000000000000000000000000000000000000000000000000000000000602082015250565b600061429b60228361307b565b91506142a68261423f565b604082019050919050565b600060208201905081810360008301526142ca8161428e565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000614307601d8361307b565b9150614312826142d1565b602082019050919050565b60006020820190508181036000830152614336816142fa565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061439960258361307b565b91506143a48261433d565b604082019050919050565b600060208201905081810360008301526143c88161438c565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061442b60238361307b565b9150614436826143cf565b604082019050919050565b6000602082019050818103600083015261445a8161441e565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006144bd60268361307b565b91506144c882614461565b604082019050919050565b600060208201905081810360008301526144ec816144b0565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061452960208361307b565b9150614534826144f3565b602082019050919050565b600060208201905081810360008301526145588161451c565b9050919050565b7f436f6e74726163742041205374616b696e672050617573656400000000000000600082015250565b600061459560198361307b565b91506145a08261455f565b602082019050919050565b600060208201905081810360008301526145c481614588565b9050919050565b7f4e465420414c5245414459205354414b45440000000000000000000000000000600082015250565b600061460160128361307b565b915061460c826145cb565b602082019050919050565b60006020820190508181036000830152614630816145f4565b9050919050565b7f436f6e74726163742042205374616b696e672050617573656400000000000000600082015250565b600061466d60198361307b565b915061467882614637565b602082019050919050565b6000602082019050818103600083015261469c81614660565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006146d9601f8361307b565b91506146e4826146a3565b602082019050919050565b60006020820190508181036000830152614708816146cc565b905091905056fea2646970667358221220fbd8a80b462a2e5dfdea4838b2e57cc735b7107d9a1d1fb8fff13d0c4c89ebbe64736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000028f139197e8e916ca79b42935e6caceaa75dee56000000000000000000000000e5b52eb1250a6c860a0088a2ba275c5fed8457b90000000000000000000000006fefb647395e680339badc84dc774e3ca8bca7b9
-----Decoded View---------------
Arg [0] : _parentNFT_A (address): 0x28f139197E8E916cA79B42935e6CAcEaA75dEe56
Arg [1] : _parentNFT_B (address): 0xe5b52EB1250A6C860a0088a2Ba275C5FeD8457B9
Arg [2] : _parentNFT_C (address): 0x6FEFb647395e680339bADC84dC774E3CA8bCA7B9
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000028f139197e8e916ca79b42935e6caceaa75dee56
Arg [1] : 000000000000000000000000e5b52eb1250a6c860a0088a2ba275c5fed8457b9
Arg [2] : 0000000000000000000000006fefb647395e680339badc84dc774e3ca8bca7b9
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.