More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 2,991 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 21088429 | 22 days ago | IN | 0 ETH | 0.00279785 | ||||
Claim All | 21078339 | 24 days ago | IN | 0 ETH | 0.00090652 | ||||
Claim All | 20670019 | 81 days ago | IN | 0 ETH | 0.00031937 | ||||
Withdraw All | 20345525 | 126 days ago | IN | 0 ETH | 0.0004041 | ||||
Withdraw All | 20028436 | 170 days ago | IN | 0 ETH | 0.00404737 | ||||
Claim All | 20028433 | 170 days ago | IN | 0 ETH | 0.00258274 | ||||
Withdraw All | 19959858 | 180 days ago | IN | 0 ETH | 0.00087607 | ||||
Claim All | 19954491 | 181 days ago | IN | 0 ETH | 0.00066336 | ||||
Claim All | 19709045 | 215 days ago | IN | 0 ETH | 0.00085328 | ||||
Withdraw All | 19544587 | 238 days ago | IN | 0 ETH | 0.00263163 | ||||
Claim All | 19448356 | 252 days ago | IN | 0 ETH | 0.00309452 | ||||
Withdraw All | 19126160 | 297 days ago | IN | 0 ETH | 0.00279505 | ||||
Deposit | 18702651 | 356 days ago | IN | 0 ETH | 0.00150672 | ||||
Deposit | 18702651 | 356 days ago | IN | 0 ETH | 0.00150672 | ||||
Deposit | 18702651 | 356 days ago | IN | 0 ETH | 0.00150672 | ||||
Deposit | 18702651 | 356 days ago | IN | 0 ETH | 0.00150672 | ||||
Deposit | 18702651 | 356 days ago | IN | 0 ETH | 0.00143399 | ||||
Deposit | 18699810 | 357 days ago | IN | 0 ETH | 0.00171239 | ||||
Deposit | 18699810 | 357 days ago | IN | 0 ETH | 0.00171239 | ||||
Deposit | 18699810 | 357 days ago | IN | 0 ETH | 0.00166123 | ||||
Deposit | 18699806 | 357 days ago | IN | 0 ETH | 0.00655342 | ||||
Claim All | 18639593 | 365 days ago | IN | 0 ETH | 0.00165022 | ||||
Withdraw All | 18412883 | 397 days ago | IN | 0 ETH | 0.00144275 | ||||
Claim All | 17902390 | 468 days ago | IN | 0 ETH | 0.00112658 | ||||
Withdraw | 17582064 | 513 days ago | IN | 0 ETH | 0.00293456 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
JPEGCStaking
Compiler Version
v0.8.7+commit.e28d00a7
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; /// @title JPEG Cards staking contract /// @notice Users can stake their JPEG Cards and get JPEG rewards. contract JPEGCStaking is Ownable, ReentrancyGuard { using EnumerableSet for EnumerableSet.UintSet; event Deposit(address indexed user, uint256 indexed nft); event Withdraw(address indexed user, uint256 indexed nft); event Claim(address indexed user, uint256 indexed nft, uint256 amount); struct PoolState { /// @dev last block where rewards were emitted uint256 lastRewardBlock; /// @dev number of JPEG distributed per block uint256 rewardsPerBlock; /// @dev number of rewards distributed per NFT uint256 accRewardPerNft; /// @dev last reward-emitting block uint256 endBlock; } /// @notice JPEG Cards contract address IERC721 public immutable jpegc; /// @notice JPEG contract address IERC20 public immutable jpeg; uint256 public totalNftsStaked; /// @dev The current reward pool's state PoolState internal poolState; /// @dev Staked NFTs per address mapping(address => EnumerableSet.UintSet) internal stakedNfts; /// @dev last `accRewardPerNft` the NFT at index claimed rewards mapping(uint256 => uint256) internal lastAccRewardPerNFT; constructor(IERC721 _jpegc, IERC20 _jpeg) { jpegc = _jpegc; jpeg = _jpeg; } /// @notice Allows the owner to allocate jpeg rewards to this contract. /// @param startBlock The first reward-emitting block /// @param rewardsPerBlock Number of JPEG emitted per block /// @param endBlock The last reward-emitting block function allocateRewards(uint256 startBlock, uint256 rewardsPerBlock, uint256 endBlock) external onlyOwner { require(poolState.lastRewardBlock == 0, "ALREADY_ALLOCATED"); require(startBlock > block.number, "INVALID_START_BLOCK"); require(rewardsPerBlock > 0, "INVALID_REWARDS_PER_BLOCK"); require(endBlock > startBlock, "INVALID_END_BLOCK"); poolState.lastRewardBlock = startBlock; poolState.rewardsPerBlock = rewardsPerBlock; poolState.endBlock = endBlock; jpeg.transferFrom(msg.sender, address(this), (endBlock - startBlock) * rewardsPerBlock); } /// @notice Allows users to stake multiple NFTs at once /// @param nfts The NFTs to stake function deposit(uint256[] memory nfts) external nonReentrant { require(nfts.length > 0, "INVALID_NFTS"); require(poolState.lastRewardBlock > 0, "NOT_STARTED"); _update(); totalNftsStaked += nfts.length; uint256 accRewardPerNFT = poolState.accRewardPerNft; for (uint256 i = 0; i < nfts.length; i++) { stakedNfts[msg.sender].add(nfts[i]); lastAccRewardPerNFT[nfts[i]] = accRewardPerNFT; jpegc.transferFrom(msg.sender, address(this), nfts[i]); emit Deposit(msg.sender, nfts[i]); } } /// @notice Allows users to withdraw multiple NFTs at once. Claims rewards automatically from the withdrawn NFTs /// @param nfts The NFTs to withdraw function withdraw(uint256[] memory nfts) public nonReentrant { require(nfts.length > 0, "INVALID_NFTS"); _update(); totalNftsStaked -= nfts.length; uint256 accRewardPerNft = poolState.accRewardPerNft; uint256 toClaim; for (uint256 i = 0; i < nfts.length; i++) { require(stakedNfts[msg.sender].contains(nfts[i]), "NOT_AUTHORIZED"); toClaim += (accRewardPerNft - lastAccRewardPerNFT[nfts[i]]) / 1e36; stakedNfts[msg.sender].remove(nfts[i]); jpegc.safeTransferFrom(address(this), msg.sender, nfts[i]); emit Withdraw(msg.sender, nfts[i]); } if(toClaim > 0) jpeg.transfer(msg.sender, toClaim); } /// @notice Allows users to claim JPEG rewards from multiple staked NFTs /// @param nfts The NFTs to claim JPEG rewards from function claim(uint256[] memory nfts) public nonReentrant { require(nfts.length > 0, "INVALID_NFTS"); _update(); uint256 accRewardPerNft = poolState.accRewardPerNft; uint256 claimable; for (uint256 i = 0; i < nfts.length; i++) { require(stakedNfts[msg.sender].contains(nfts[i]), "NOT_AUTHORIZED"); uint256 toClaim = (accRewardPerNft - lastAccRewardPerNFT[nfts[i]]) / 1e36; lastAccRewardPerNFT[nfts[i]] = accRewardPerNft; claimable += toClaim; emit Claim(msg.sender, nfts[i], toClaim); } require(claimable > 0, "NO_REWARDS"); jpeg.transfer(msg.sender, claimable); } /// @notice Allows users to claim JPEG rewards from all their staked NFTs function claimAll() external { claim(stakedNfts[msg.sender].values()); } /// @notice Allows users to withdraw all their staked NFTs. Also claims rewards. function withdrawAll() external { withdraw(stakedNfts[msg.sender].values()); } /// @notice Returns the indexes of all `account`'s staked NFTs /// @param account The user's address function userStakedNfts(address account) external view returns (uint256[] memory) { return stakedNfts[account].values(); } /// @notice Returns the amount of JPEG claimable from an NFT /// @param nft The NFT to check function pendingReward(uint256 nft) public view returns (uint256) { uint256 accRewardPerNft = poolState.accRewardPerNft; uint256 blockNumber = block.number; if (blockNumber > poolState.endBlock) blockNumber = poolState.endBlock; if (blockNumber > poolState.lastRewardBlock && totalNftsStaked > 0) { uint256 reward = ((blockNumber - poolState.lastRewardBlock)) * poolState.rewardsPerBlock * 1e36; accRewardPerNft += reward / totalNftsStaked; } return (accRewardPerNft - lastAccRewardPerNFT[nft]) / 1e36; } /// @notice Returns the amount of JPEG an user can claim from all their NFTs /// @param account The user's address function pendingUserReward(address account) external view returns (uint256 totalReward) { for (uint256 i = 0; i < stakedNfts[account].length(); i++) { totalReward += pendingReward(stakedNfts[account].at(i)); } } /// @dev Updates the pool's state function _update() internal { PoolState memory pool = poolState; uint256 blockNumber = block.number; if (blockNumber > pool.endBlock) blockNumber = pool.endBlock; if (blockNumber <= pool.lastRewardBlock) return; if (totalNftsStaked == 0) { poolState.lastRewardBlock = blockNumber; return; } uint256 reward = ((blockNumber - pool.lastRewardBlock)) * pool.rewardsPerBlock * 1e36; poolState.accRewardPerNft = pool.accRewardPerNft + reward / totalNftsStaked; poolState.lastRewardBlock = blockNumber; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (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`, 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 be 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: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * 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 Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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 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); /** * @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; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `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); /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/structs/EnumerableSet.sol) pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; assembly { result := store } return result; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { 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 v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts 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; } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC721","name":"_jpegc","type":"address"},{"internalType":"contract IERC20","name":"_jpeg","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"nft","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"nft","type":"uint256"}],"name":"Deposit","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":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"nft","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"rewardsPerBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"}],"name":"allocateRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"nfts","type":"uint256[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"nfts","type":"uint256[]"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"jpeg","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"jpegc","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nft","type":"uint256"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"pendingUserReward","outputs":[{"internalType":"uint256","name":"totalReward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalNftsStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"userStakedNfts","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"nfts","type":"uint256[]"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c06040523480156200001157600080fd5b5060405162002878380380620028788339818101604052810190620000379190620001ce565b620000576200004b620000d460201b60201c565b620000dc60201b60201c565b600180819055508173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b815250508073ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b815250505050620002aa565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050620001b18162000276565b92915050565b600081519050620001c88162000290565b92915050565b60008060408385031215620001e857620001e762000271565b5b6000620001f885828601620001b7565b92505060206200020b85828601620001a0565b9150509250929050565b6000620002228262000251565b9050919050565b6000620002368262000215565b9050919050565b60006200024a8262000215565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600080fd5b620002818162000229565b81146200028d57600080fd5b50565b6200029b816200023d565b8114620002a757600080fd5b50565b60805160601c60a05160601c61257f620002f96000396000818161099201528181610bf40152818161112a015261130b0152600081816103db015281816105b50152611006015261257f6000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c8063715018a611610097578063b3a4f50611610066578063b3a4f50614610238578063d1058e5914610268578063eb88d91a14610272578063f2fde38b14610290576100f5565b8063715018a6146101ea578063853828b6146101f45780638da5cb5b146101fe578063983d95ce1461021c576100f5565b806356261cac116100d357806356261cac14610178578063598b8e71146101965780636ba4c138146101b25780636cbbb2d8146101ce576100f5565b806312f7086c146100fa5780634800c08f1461012a5780634c6b87ef1461015a575b600080fd5b610114600480360381019061010f9190611a41565b6102ac565b6040516101219190611f36565b60405180910390f35b610144600480360381019061013f919061199e565b610389565b6040516101519190611d7e565b60405180910390f35b6101626103d9565b60405161016f9190611dbb565b60405180910390f35b6101806103fd565b60405161018d9190611f36565b60405180910390f35b6101b060048036038101906101ab91906119cb565b610403565b005b6101cc60048036038101906101c791906119cb565b6106d9565b005b6101e860048036038101906101e39190611a6e565b610a4a565b005b6101f2610cbd565b005b6101fc610d45565b005b610206610d96565b6040516102139190611d03565b60405180910390f35b610236600480360381019061023191906119cb565b610dbf565b005b610252600480360381019061024d919061199e565b6111e3565b60405161025f9190611f36565b60405180910390f35b6102706112b8565b005b61027a611309565b6040516102879190611da0565b60405180910390f35b6102aa60048036038101906102a5919061199e565b61132d565b005b6000806003600201549050600043905060038001548111156102d057600380015490505b600360000154811180156102e657506000600254115b156103475760006ec097ce7bc90715b34b9f10000000006003600101546003600001548461031491906120cd565b61031e9190612073565b6103289190612073565b9050600254816103389190612042565b836103439190611fec565b9250505b6ec097ce7bc90715b34b9f100000000060086000868152602001908152602001600020548361037691906120cd565b6103809190612042565b92505050919050565b60606103d2600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611425565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60025481565b60026001541415610449576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044090611ed6565b60405180910390fd5b60026001819055506000815111610495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161048c90611f16565b60405180910390fd5b6000600360000154116104dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d490611e96565b60405180910390fd5b6104e5611446565b8051600260008282546104f89190611fec565b925050819055506000600360020154905060005b82518110156106cd5761058083828151811061052b5761052a612298565b5b6020026020010151600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061153990919063ffffffff16565b50816008600085848151811061059957610598612298565b5b60200260200101518152602001908152602001600020819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd333086858151811061060457610603612298565b5b60200260200101516040518463ffffffff1660e01b815260040161062a93929190611d1e565b600060405180830381600087803b15801561064457600080fd5b505af1158015610658573d6000803e3d6000fd5b5050505082818151811061066f5761066e612298565b5b60200260200101513373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c60405160405180910390a380806106c5906121c2565b91505061050c565b50506001808190555050565b6002600154141561071f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071690611ed6565b60405180910390fd5b6002600181905550600081511161076b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076290611f16565b60405180910390fd5b610773611446565b60006003600201549050600080600090505b835181101561094c576107f98482815181106107a4576107a3612298565b5b6020026020010151600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061155390919063ffffffff16565b610838576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082f90611eb6565b60405180910390fd5b60006ec097ce7bc90715b34b9f10000000006008600087858151811061086157610860612298565b5b60200260200101518152602001908152602001600020548561088391906120cd565b61088d9190612042565b905083600860008785815181106108a7576108a6612298565b5b602002602001015181526020019081526020016000208190555080836108cd9190611fec565b92508482815181106108e2576108e1612298565b5b60200260200101513373ffffffffffffffffffffffffffffffffffffffff167f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf7836040516109309190611f36565b60405180910390a3508080610944906121c2565b915050610785565b5060008111610990576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098790611e36565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016109eb929190611d55565b602060405180830381600087803b158015610a0557600080fd5b505af1158015610a19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3d9190611a14565b5050506001808190555050565b610a5261156d565b73ffffffffffffffffffffffffffffffffffffffff16610a70610d96565b73ffffffffffffffffffffffffffffffffffffffff1614610ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abd90611e16565b60405180910390fd5b600060036000015414610b0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0590611e56565b60405180910390fd5b438311610b50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4790611ef6565b60405180910390fd5b60008211610b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8a90611e76565b60405180910390fd5b828111610bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcc90611dd6565b60405180910390fd5b82600360000181905550816003600101819055508060038001819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330858786610c3d91906120cd565b610c479190612073565b6040518463ffffffff1660e01b8152600401610c6593929190611d1e565b602060405180830381600087803b158015610c7f57600080fd5b505af1158015610c93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb79190611a14565b50505050565b610cc561156d565b73ffffffffffffffffffffffffffffffffffffffff16610ce3610d96565b73ffffffffffffffffffffffffffffffffffffffff1614610d39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3090611e16565b60405180910390fd5b610d436000611575565b565b610d94610d8f600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611425565b610dbf565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60026001541415610e05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfc90611ed6565b60405180910390fd5b60026001819055506000815111610e51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4890611f16565b60405180910390fd5b610e59611446565b805160026000828254610e6c91906120cd565b9250508190555060006003600201549050600080600090505b835181101561111e57610ef9848281518110610ea457610ea3612298565b5b6020026020010151600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061155390919063ffffffff16565b610f38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2f90611eb6565b60405180910390fd5b6ec097ce7bc90715b34b9f100000000060086000868481518110610f5f57610f5e612298565b5b602002602001015181526020019081526020016000205484610f8191906120cd565b610f8b9190612042565b82610f969190611fec565b9150611003848281518110610fae57610fad612298565b5b6020026020010151600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061163990919063ffffffff16565b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166342842e0e303387858151811061105557611054612298565b5b60200260200101516040518463ffffffff1660e01b815260040161107b93929190611d1e565b600060405180830381600087803b15801561109557600080fd5b505af11580156110a9573d6000803e3d6000fd5b505050508381815181106110c0576110bf612298565b5b60200260200101513373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436460405160405180910390a38080611116906121c2565b915050610e85565b5060008111156111d7577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611183929190611d55565b602060405180830381600087803b15801561119d57600080fd5b505af11580156111b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111d59190611a14565b505b50506001808190555050565b600080600090505b611232600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611653565b8110156112b25761129261128d82600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061166890919063ffffffff16565b6102ac565b8261129d9190611fec565b915080806112aa906121c2565b9150506111eb565b50919050565b611307611302600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611425565b6106d9565b565b7f000000000000000000000000000000000000000000000000000000000000000081565b61133561156d565b73ffffffffffffffffffffffffffffffffffffffff16611353610d96565b73ffffffffffffffffffffffffffffffffffffffff16146113a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a090611e16565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611419576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141090611df6565b60405180910390fd5b61142281611575565b50565b6060600061143583600001611682565b905060608190508092505050919050565b6000600360405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505090506000439050816060015181111561149857816060015190505b816000015181116114aa575050611537565b600060025414156114c657806003600001819055505050611537565b60006ec097ce7bc90715b34b9f100000000083602001518460000151846114ed91906120cd565b6114f79190612073565b6115019190612073565b9050600254816115119190612042565b83604001516115209190611fec565b600360020181905550816003600001819055505050505b565b600061154b836000018360001b6116de565b905092915050565b6000611565836000018360001b61174e565b905092915050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061164b836000018360001b611771565b905092915050565b600061166182600001611885565b9050919050565b60006116778360000183611896565b60001c905092915050565b6060816000018054806020026020016040519081016040528092919081815260200182805480156116d257602002820191906000526020600020905b8154815260200190600101908083116116be575b50505050509050919050565b60006116ea838361174e565b611743578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611748565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020549050600081146118795760006001826117a391906120cd565b90506000600186600001805490506117bb91906120cd565b905081811461182a5760008660000182815481106117dc576117db612298565b5b9060005260206000200154905080876000018481548110611800576117ff612298565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061183e5761183d612269565b5b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061187f565b60009150505b92915050565b600081600001805490509050919050565b60008260000182815481106118ae576118ad612298565b5b9060005260206000200154905092915050565b60006118d46118cf84611f76565b611f51565b905080838252602082019050828560208602820111156118f7576118f66122fb565b5b60005b85811015611927578161190d8882611989565b8452602084019350602083019250506001810190506118fa565b5050509392505050565b60008135905061194081612504565b92915050565b600082601f83011261195b5761195a6122f6565b5b813561196b8482602086016118c1565b91505092915050565b6000815190506119838161251b565b92915050565b60008135905061199881612532565b92915050565b6000602082840312156119b4576119b3612305565b5b60006119c284828501611931565b91505092915050565b6000602082840312156119e1576119e0612305565b5b600082013567ffffffffffffffff8111156119ff576119fe612300565b5b611a0b84828501611946565b91505092915050565b600060208284031215611a2a57611a29612305565b5b6000611a3884828501611974565b91505092915050565b600060208284031215611a5757611a56612305565b5b6000611a6584828501611989565b91505092915050565b600080600060608486031215611a8757611a86612305565b5b6000611a9586828701611989565b9350506020611aa686828701611989565b9250506040611ab786828701611989565b9150509250925092565b6000611acd8383611ce5565b60208301905092915050565b611ae281612101565b82525050565b6000611af382611fb2565b611afd8185611fca565b9350611b0883611fa2565b8060005b83811015611b39578151611b208882611ac1565b9750611b2b83611fbd565b925050600181019050611b0c565b5085935050505092915050565b611b4f81612149565b82525050565b611b5e8161215b565b82525050565b6000611b71601183611fdb565b9150611b7c8261231b565b602082019050919050565b6000611b94602683611fdb565b9150611b9f82612344565b604082019050919050565b6000611bb7602083611fdb565b9150611bc282612393565b602082019050919050565b6000611bda600a83611fdb565b9150611be5826123bc565b602082019050919050565b6000611bfd601183611fdb565b9150611c08826123e5565b602082019050919050565b6000611c20601983611fdb565b9150611c2b8261240e565b602082019050919050565b6000611c43600b83611fdb565b9150611c4e82612437565b602082019050919050565b6000611c66600e83611fdb565b9150611c7182612460565b602082019050919050565b6000611c89601f83611fdb565b9150611c9482612489565b602082019050919050565b6000611cac601383611fdb565b9150611cb7826124b2565b602082019050919050565b6000611ccf600c83611fdb565b9150611cda826124db565b602082019050919050565b611cee8161213f565b82525050565b611cfd8161213f565b82525050565b6000602082019050611d186000830184611ad9565b92915050565b6000606082019050611d336000830186611ad9565b611d406020830185611ad9565b611d4d6040830184611cf4565b949350505050565b6000604082019050611d6a6000830185611ad9565b611d776020830184611cf4565b9392505050565b60006020820190508181036000830152611d988184611ae8565b905092915050565b6000602082019050611db56000830184611b46565b92915050565b6000602082019050611dd06000830184611b55565b92915050565b60006020820190508181036000830152611def81611b64565b9050919050565b60006020820190508181036000830152611e0f81611b87565b9050919050565b60006020820190508181036000830152611e2f81611baa565b9050919050565b60006020820190508181036000830152611e4f81611bcd565b9050919050565b60006020820190508181036000830152611e6f81611bf0565b9050919050565b60006020820190508181036000830152611e8f81611c13565b9050919050565b60006020820190508181036000830152611eaf81611c36565b9050919050565b60006020820190508181036000830152611ecf81611c59565b9050919050565b60006020820190508181036000830152611eef81611c7c565b9050919050565b60006020820190508181036000830152611f0f81611c9f565b9050919050565b60006020820190508181036000830152611f2f81611cc2565b9050919050565b6000602082019050611f4b6000830184611cf4565b92915050565b6000611f5b611f6c565b9050611f678282612191565b919050565b6000604051905090565b600067ffffffffffffffff821115611f9157611f906122c7565b5b602082029050602081019050919050565b6000819050602082019050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000611ff78261213f565b91506120028361213f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156120375761203661220b565b5b828201905092915050565b600061204d8261213f565b91506120588361213f565b9250826120685761206761223a565b5b828204905092915050565b600061207e8261213f565b91506120898361213f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156120c2576120c161220b565b5b828202905092915050565b60006120d88261213f565b91506120e38361213f565b9250828210156120f6576120f561220b565b5b828203905092915050565b600061210c8261211f565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006121548261216d565b9050919050565b60006121668261216d565b9050919050565b60006121788261217f565b9050919050565b600061218a8261211f565b9050919050565b61219a8261230a565b810181811067ffffffffffffffff821117156121b9576121b86122c7565b5b80604052505050565b60006121cd8261213f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612200576121ff61220b565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f494e56414c49445f454e445f424c4f434b000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e4f5f5245574152445300000000000000000000000000000000000000000000600082015250565b7f414c52454144595f414c4c4f4341544544000000000000000000000000000000600082015250565b7f494e56414c49445f524557415244535f5045525f424c4f434b00000000000000600082015250565b7f4e4f545f53544152544544000000000000000000000000000000000000000000600082015250565b7f4e4f545f415554484f52495a4544000000000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f494e56414c49445f53544152545f424c4f434b00000000000000000000000000600082015250565b7f494e56414c49445f4e4654530000000000000000000000000000000000000000600082015250565b61250d81612101565b811461251857600080fd5b50565b61252481612113565b811461252f57600080fd5b50565b61253b8161213f565b811461254657600080fd5b5056fea2646970667358221220059564207b87016e0e72976712f248206aac1e8ae976cdb51fdfec76c39531d764736f6c6343000807003300000000000000000000000083979584ec8c6d94d93f838a524049173deba6f4000000000000000000000000e80c0cd204d654cebe8dd64a4857cab6be8345a3
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100f55760003560e01c8063715018a611610097578063b3a4f50611610066578063b3a4f50614610238578063d1058e5914610268578063eb88d91a14610272578063f2fde38b14610290576100f5565b8063715018a6146101ea578063853828b6146101f45780638da5cb5b146101fe578063983d95ce1461021c576100f5565b806356261cac116100d357806356261cac14610178578063598b8e71146101965780636ba4c138146101b25780636cbbb2d8146101ce576100f5565b806312f7086c146100fa5780634800c08f1461012a5780634c6b87ef1461015a575b600080fd5b610114600480360381019061010f9190611a41565b6102ac565b6040516101219190611f36565b60405180910390f35b610144600480360381019061013f919061199e565b610389565b6040516101519190611d7e565b60405180910390f35b6101626103d9565b60405161016f9190611dbb565b60405180910390f35b6101806103fd565b60405161018d9190611f36565b60405180910390f35b6101b060048036038101906101ab91906119cb565b610403565b005b6101cc60048036038101906101c791906119cb565b6106d9565b005b6101e860048036038101906101e39190611a6e565b610a4a565b005b6101f2610cbd565b005b6101fc610d45565b005b610206610d96565b6040516102139190611d03565b60405180910390f35b610236600480360381019061023191906119cb565b610dbf565b005b610252600480360381019061024d919061199e565b6111e3565b60405161025f9190611f36565b60405180910390f35b6102706112b8565b005b61027a611309565b6040516102879190611da0565b60405180910390f35b6102aa60048036038101906102a5919061199e565b61132d565b005b6000806003600201549050600043905060038001548111156102d057600380015490505b600360000154811180156102e657506000600254115b156103475760006ec097ce7bc90715b34b9f10000000006003600101546003600001548461031491906120cd565b61031e9190612073565b6103289190612073565b9050600254816103389190612042565b836103439190611fec565b9250505b6ec097ce7bc90715b34b9f100000000060086000868152602001908152602001600020548361037691906120cd565b6103809190612042565b92505050919050565b60606103d2600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611425565b9050919050565b7f00000000000000000000000083979584ec8c6d94d93f838a524049173deba6f481565b60025481565b60026001541415610449576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044090611ed6565b60405180910390fd5b60026001819055506000815111610495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161048c90611f16565b60405180910390fd5b6000600360000154116104dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d490611e96565b60405180910390fd5b6104e5611446565b8051600260008282546104f89190611fec565b925050819055506000600360020154905060005b82518110156106cd5761058083828151811061052b5761052a612298565b5b6020026020010151600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061153990919063ffffffff16565b50816008600085848151811061059957610598612298565b5b60200260200101518152602001908152602001600020819055507f00000000000000000000000083979584ec8c6d94d93f838a524049173deba6f473ffffffffffffffffffffffffffffffffffffffff166323b872dd333086858151811061060457610603612298565b5b60200260200101516040518463ffffffff1660e01b815260040161062a93929190611d1e565b600060405180830381600087803b15801561064457600080fd5b505af1158015610658573d6000803e3d6000fd5b5050505082818151811061066f5761066e612298565b5b60200260200101513373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c60405160405180910390a380806106c5906121c2565b91505061050c565b50506001808190555050565b6002600154141561071f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071690611ed6565b60405180910390fd5b6002600181905550600081511161076b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076290611f16565b60405180910390fd5b610773611446565b60006003600201549050600080600090505b835181101561094c576107f98482815181106107a4576107a3612298565b5b6020026020010151600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061155390919063ffffffff16565b610838576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082f90611eb6565b60405180910390fd5b60006ec097ce7bc90715b34b9f10000000006008600087858151811061086157610860612298565b5b60200260200101518152602001908152602001600020548561088391906120cd565b61088d9190612042565b905083600860008785815181106108a7576108a6612298565b5b602002602001015181526020019081526020016000208190555080836108cd9190611fec565b92508482815181106108e2576108e1612298565b5b60200260200101513373ffffffffffffffffffffffffffffffffffffffff167f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf7836040516109309190611f36565b60405180910390a3508080610944906121c2565b915050610785565b5060008111610990576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098790611e36565b60405180910390fd5b7f000000000000000000000000e80c0cd204d654cebe8dd64a4857cab6be8345a373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016109eb929190611d55565b602060405180830381600087803b158015610a0557600080fd5b505af1158015610a19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3d9190611a14565b5050506001808190555050565b610a5261156d565b73ffffffffffffffffffffffffffffffffffffffff16610a70610d96565b73ffffffffffffffffffffffffffffffffffffffff1614610ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abd90611e16565b60405180910390fd5b600060036000015414610b0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0590611e56565b60405180910390fd5b438311610b50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4790611ef6565b60405180910390fd5b60008211610b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8a90611e76565b60405180910390fd5b828111610bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcc90611dd6565b60405180910390fd5b82600360000181905550816003600101819055508060038001819055507f000000000000000000000000e80c0cd204d654cebe8dd64a4857cab6be8345a373ffffffffffffffffffffffffffffffffffffffff166323b872dd3330858786610c3d91906120cd565b610c479190612073565b6040518463ffffffff1660e01b8152600401610c6593929190611d1e565b602060405180830381600087803b158015610c7f57600080fd5b505af1158015610c93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb79190611a14565b50505050565b610cc561156d565b73ffffffffffffffffffffffffffffffffffffffff16610ce3610d96565b73ffffffffffffffffffffffffffffffffffffffff1614610d39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3090611e16565b60405180910390fd5b610d436000611575565b565b610d94610d8f600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611425565b610dbf565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60026001541415610e05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfc90611ed6565b60405180910390fd5b60026001819055506000815111610e51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4890611f16565b60405180910390fd5b610e59611446565b805160026000828254610e6c91906120cd565b9250508190555060006003600201549050600080600090505b835181101561111e57610ef9848281518110610ea457610ea3612298565b5b6020026020010151600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061155390919063ffffffff16565b610f38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2f90611eb6565b60405180910390fd5b6ec097ce7bc90715b34b9f100000000060086000868481518110610f5f57610f5e612298565b5b602002602001015181526020019081526020016000205484610f8191906120cd565b610f8b9190612042565b82610f969190611fec565b9150611003848281518110610fae57610fad612298565b5b6020026020010151600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061163990919063ffffffff16565b507f00000000000000000000000083979584ec8c6d94d93f838a524049173deba6f473ffffffffffffffffffffffffffffffffffffffff166342842e0e303387858151811061105557611054612298565b5b60200260200101516040518463ffffffff1660e01b815260040161107b93929190611d1e565b600060405180830381600087803b15801561109557600080fd5b505af11580156110a9573d6000803e3d6000fd5b505050508381815181106110c0576110bf612298565b5b60200260200101513373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436460405160405180910390a38080611116906121c2565b915050610e85565b5060008111156111d7577f000000000000000000000000e80c0cd204d654cebe8dd64a4857cab6be8345a373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611183929190611d55565b602060405180830381600087803b15801561119d57600080fd5b505af11580156111b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111d59190611a14565b505b50506001808190555050565b600080600090505b611232600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611653565b8110156112b25761129261128d82600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061166890919063ffffffff16565b6102ac565b8261129d9190611fec565b915080806112aa906121c2565b9150506111eb565b50919050565b611307611302600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611425565b6106d9565b565b7f000000000000000000000000e80c0cd204d654cebe8dd64a4857cab6be8345a381565b61133561156d565b73ffffffffffffffffffffffffffffffffffffffff16611353610d96565b73ffffffffffffffffffffffffffffffffffffffff16146113a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a090611e16565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611419576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141090611df6565b60405180910390fd5b61142281611575565b50565b6060600061143583600001611682565b905060608190508092505050919050565b6000600360405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505090506000439050816060015181111561149857816060015190505b816000015181116114aa575050611537565b600060025414156114c657806003600001819055505050611537565b60006ec097ce7bc90715b34b9f100000000083602001518460000151846114ed91906120cd565b6114f79190612073565b6115019190612073565b9050600254816115119190612042565b83604001516115209190611fec565b600360020181905550816003600001819055505050505b565b600061154b836000018360001b6116de565b905092915050565b6000611565836000018360001b61174e565b905092915050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061164b836000018360001b611771565b905092915050565b600061166182600001611885565b9050919050565b60006116778360000183611896565b60001c905092915050565b6060816000018054806020026020016040519081016040528092919081815260200182805480156116d257602002820191906000526020600020905b8154815260200190600101908083116116be575b50505050509050919050565b60006116ea838361174e565b611743578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611748565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020549050600081146118795760006001826117a391906120cd565b90506000600186600001805490506117bb91906120cd565b905081811461182a5760008660000182815481106117dc576117db612298565b5b9060005260206000200154905080876000018481548110611800576117ff612298565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061183e5761183d612269565b5b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061187f565b60009150505b92915050565b600081600001805490509050919050565b60008260000182815481106118ae576118ad612298565b5b9060005260206000200154905092915050565b60006118d46118cf84611f76565b611f51565b905080838252602082019050828560208602820111156118f7576118f66122fb565b5b60005b85811015611927578161190d8882611989565b8452602084019350602083019250506001810190506118fa565b5050509392505050565b60008135905061194081612504565b92915050565b600082601f83011261195b5761195a6122f6565b5b813561196b8482602086016118c1565b91505092915050565b6000815190506119838161251b565b92915050565b60008135905061199881612532565b92915050565b6000602082840312156119b4576119b3612305565b5b60006119c284828501611931565b91505092915050565b6000602082840312156119e1576119e0612305565b5b600082013567ffffffffffffffff8111156119ff576119fe612300565b5b611a0b84828501611946565b91505092915050565b600060208284031215611a2a57611a29612305565b5b6000611a3884828501611974565b91505092915050565b600060208284031215611a5757611a56612305565b5b6000611a6584828501611989565b91505092915050565b600080600060608486031215611a8757611a86612305565b5b6000611a9586828701611989565b9350506020611aa686828701611989565b9250506040611ab786828701611989565b9150509250925092565b6000611acd8383611ce5565b60208301905092915050565b611ae281612101565b82525050565b6000611af382611fb2565b611afd8185611fca565b9350611b0883611fa2565b8060005b83811015611b39578151611b208882611ac1565b9750611b2b83611fbd565b925050600181019050611b0c565b5085935050505092915050565b611b4f81612149565b82525050565b611b5e8161215b565b82525050565b6000611b71601183611fdb565b9150611b7c8261231b565b602082019050919050565b6000611b94602683611fdb565b9150611b9f82612344565b604082019050919050565b6000611bb7602083611fdb565b9150611bc282612393565b602082019050919050565b6000611bda600a83611fdb565b9150611be5826123bc565b602082019050919050565b6000611bfd601183611fdb565b9150611c08826123e5565b602082019050919050565b6000611c20601983611fdb565b9150611c2b8261240e565b602082019050919050565b6000611c43600b83611fdb565b9150611c4e82612437565b602082019050919050565b6000611c66600e83611fdb565b9150611c7182612460565b602082019050919050565b6000611c89601f83611fdb565b9150611c9482612489565b602082019050919050565b6000611cac601383611fdb565b9150611cb7826124b2565b602082019050919050565b6000611ccf600c83611fdb565b9150611cda826124db565b602082019050919050565b611cee8161213f565b82525050565b611cfd8161213f565b82525050565b6000602082019050611d186000830184611ad9565b92915050565b6000606082019050611d336000830186611ad9565b611d406020830185611ad9565b611d4d6040830184611cf4565b949350505050565b6000604082019050611d6a6000830185611ad9565b611d776020830184611cf4565b9392505050565b60006020820190508181036000830152611d988184611ae8565b905092915050565b6000602082019050611db56000830184611b46565b92915050565b6000602082019050611dd06000830184611b55565b92915050565b60006020820190508181036000830152611def81611b64565b9050919050565b60006020820190508181036000830152611e0f81611b87565b9050919050565b60006020820190508181036000830152611e2f81611baa565b9050919050565b60006020820190508181036000830152611e4f81611bcd565b9050919050565b60006020820190508181036000830152611e6f81611bf0565b9050919050565b60006020820190508181036000830152611e8f81611c13565b9050919050565b60006020820190508181036000830152611eaf81611c36565b9050919050565b60006020820190508181036000830152611ecf81611c59565b9050919050565b60006020820190508181036000830152611eef81611c7c565b9050919050565b60006020820190508181036000830152611f0f81611c9f565b9050919050565b60006020820190508181036000830152611f2f81611cc2565b9050919050565b6000602082019050611f4b6000830184611cf4565b92915050565b6000611f5b611f6c565b9050611f678282612191565b919050565b6000604051905090565b600067ffffffffffffffff821115611f9157611f906122c7565b5b602082029050602081019050919050565b6000819050602082019050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000611ff78261213f565b91506120028361213f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156120375761203661220b565b5b828201905092915050565b600061204d8261213f565b91506120588361213f565b9250826120685761206761223a565b5b828204905092915050565b600061207e8261213f565b91506120898361213f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156120c2576120c161220b565b5b828202905092915050565b60006120d88261213f565b91506120e38361213f565b9250828210156120f6576120f561220b565b5b828203905092915050565b600061210c8261211f565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006121548261216d565b9050919050565b60006121668261216d565b9050919050565b60006121788261217f565b9050919050565b600061218a8261211f565b9050919050565b61219a8261230a565b810181811067ffffffffffffffff821117156121b9576121b86122c7565b5b80604052505050565b60006121cd8261213f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612200576121ff61220b565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f494e56414c49445f454e445f424c4f434b000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e4f5f5245574152445300000000000000000000000000000000000000000000600082015250565b7f414c52454144595f414c4c4f4341544544000000000000000000000000000000600082015250565b7f494e56414c49445f524557415244535f5045525f424c4f434b00000000000000600082015250565b7f4e4f545f53544152544544000000000000000000000000000000000000000000600082015250565b7f4e4f545f415554484f52495a4544000000000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f494e56414c49445f53544152545f424c4f434b00000000000000000000000000600082015250565b7f494e56414c49445f4e4654530000000000000000000000000000000000000000600082015250565b61250d81612101565b811461251857600080fd5b50565b61252481612113565b811461252f57600080fd5b50565b61253b8161213f565b811461254657600080fd5b5056fea2646970667358221220059564207b87016e0e72976712f248206aac1e8ae976cdb51fdfec76c39531d764736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000083979584ec8c6d94d93f838a524049173deba6f4000000000000000000000000e80c0cd204d654cebe8dd64a4857cab6be8345a3
-----Decoded View---------------
Arg [0] : _jpegc (address): 0x83979584eC8c6D94D93f838A524049173DebA6F4
Arg [1] : _jpeg (address): 0xE80C0cd204D654CEbe8dd64A4857cAb6Be8345a3
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000083979584ec8c6d94d93f838a524049173deba6f4
Arg [1] : 000000000000000000000000e80c0cd204d654cebe8dd64a4857cab6be8345a3
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.000133 | 17,376,815.3043 | $2,305.86 |
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.