More Info
Private Name Tags
ContractCreator
Multichain Info
Latest 25 from a total of 139 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Commit Tokens | 18894525 | 364 days ago | IN | 0 ETH | 0.00773666 | ||||
Commit Tokens | 16308168 | 727 days ago | IN | 0 ETH | 0.00384334 | ||||
Transfer | 15687714 | 813 days ago | IN | 0.01892 ETH | 0.00012627 | ||||
Claim | 15344307 | 865 days ago | IN | 0 ETH | 0.00080163 | ||||
Claim | 15070202 | 908 days ago | IN | 0 ETH | 0.00377192 | ||||
Commit Tokens | 14961465 | 927 days ago | IN | 0 ETH | 0.00630146 | ||||
Commit Tokens | 14712444 | 968 days ago | IN | 0 ETH | 0.0077713 | ||||
Commit Tokens | 14701028 | 970 days ago | IN | 0 ETH | 0.01893231 | ||||
Commit Tokens | 14659749 | 976 days ago | IN | 0 ETH | 0.00379291 | ||||
Commit Tokens | 14650094 | 978 days ago | IN | 0 ETH | 0.00698589 | ||||
Claim | 14597890 | 986 days ago | IN | 0 ETH | 0.00437532 | ||||
Commit Tokens | 14589209 | 987 days ago | IN | 0 ETH | 0.00517514 | ||||
Claim | 14567843 | 991 days ago | IN | 0 ETH | 0.00874925 | ||||
Commit Tokens | 14557728 | 992 days ago | IN | 0 ETH | 0.0046638 | ||||
Claim | 14556454 | 992 days ago | IN | 0 ETH | 0.00265963 | ||||
Claim | 14556134 | 992 days ago | IN | 0 ETH | 0.0030696 | ||||
Commit Tokens | 14528666 | 997 days ago | IN | 0 ETH | 0.01571489 | ||||
Commit Tokens | 14528661 | 997 days ago | IN | 0 ETH | 0.01581295 | ||||
Commit Tokens | 14526963 | 997 days ago | IN | 0 ETH | 0.02335572 | ||||
Commit Tokens | 14526948 | 997 days ago | IN | 0 ETH | 0.01057077 | ||||
Commit Tokens | 14526911 | 997 days ago | IN | 0 ETH | 0.01765326 | ||||
Commit Tokens | 14496475 | 1002 days ago | IN | 0 ETH | 0.01522798 | ||||
Claim | 14495806 | 1002 days ago | IN | 0 ETH | 0.01022006 | ||||
Commit Tokens | 14483235 | 1004 days ago | IN | 0 ETH | 0.0090026 | ||||
Claim | 14462778 | 1007 days ago | IN | 0 ETH | 0.00441753 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Graveyard
Compiler Version
v0.8.9+commit.e5eed63a
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.9; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; import "./Ownable.sol"; /// @title Graveyard NFT Project's URN Token Interface /// @author @0xyamyam interface IUrn { function mint(address to, uint256 amount) external; } /// @title Graveyard NFT Project's Rewardable Token Interface /// @author @0xyamyam interface IRewardable { function getCommittalReward(address to) external view returns (uint256); function getRewardRate(address to) external view returns (uint256); } /// @title Graveyard NFT Project's CRYPT Token /// @author @0xyamyam /// CRYPT's are the centerpiece of the Graveyard NFT project. contract Graveyard is IERC721Receiver, ReentrancyGuard, Ownable(5, true, false) { using SafeMath for uint256; /// 0 = inactive, 1 = accepting tokens for whitelist, 2 = whitelist mint, 3 = public uint256 public _releaseStage; uint256 public _startRewarding; /// URN address address public _urnAddress; /// Contracts able to generate rewards address[] public _rewardingContracts; /// URN rewards per address mapping(address => uint256) private _claimable; mapping(address => uint256) private _claimUpdated; /// Whitelisted addresses mapping(address => uint256) public _whitelist; /// Event for use in the crypt event Committed(address indexed from, address indexed contractAddress, uint256 indexed tokenId, bytes data); /// Event for release stage changing event ReleaseStage(uint256); /// Rewarding contracts are allowed to update rewards for addresses modifier onlyRewarding { bool authorised = false; address sender = _msgSender(); for (uint256 i = 0;i < _rewardingContracts.length;i++) { if (_rewardingContracts[i] == sender) { authorised = true; break; } } require(authorised, "Unauthorized"); _; } /// Determine the release stage function releaseStage() external view returns (uint256) { return _releaseStage; } /// Determine if the address is whitelisted /// @param from The address to check /// @param qty The qty to check for function isWhitelisted(address from, uint256 qty) external view returns (bool) { return _whitelist[from] >= qty; } /// The pending URN claim for address /// @param from The address to check for rewards /// @notice Rewards only claimable after reward claiming starts function claimable(address from) public view returns (uint256) { return _claimable[from] + _getPendingClaim(from); } /// Claim rewards from the graveyard function claim() external nonReentrant { require(_startRewarding != 0 && _urnAddress != address(0), "Rewards unavailable"); address sender = _msgSender(); uint256 amount = claimable(sender); require(amount > 0, "Nothing to claim"); _claimable[sender] = 0; _claimUpdated[sender] = block.timestamp; IUrn(_urnAddress).mint(sender, amount); } /// Provide a batch transfer option for users with many tokens to commit. /// @param contracts Array of ERC721 contracts to batch transfer /// @param tokenIds Array of arrays of tokenIds matched to the contracts array /// @param data Array of arrays of bytes messages for each committed token matched to the contracts array /// @notice Sender MUST setApprovalForAll for this contract address on the contracts being supplied, /// this means to be efficient you will need to transfer 3 or more tokens from the contract to be worth it. function commitTokens( address[] calldata contracts, uint256[][] calldata tokenIds, bytes[][] calldata data ) external nonReentrant { require(contracts.length == tokenIds.length && tokenIds.length == data.length, "Invalid args"); address sender = _msgSender(); for (uint256 i = 0;i < contracts.length;i++) { IERC721 token = IERC721(contracts[i]); for (uint256 j = 0;j < tokenIds[i].length;j++) { token.safeTransferFrom(sender, address(this), tokenIds[i][j], data[i][j]); } } } /// Sets contract properties which control stages of the release. /// @param stage The stage of release /// @param contracts The rewarding contracts function setState(uint256 stage, address[] calldata contracts) external onlyOwner { _releaseStage = stage; _rewardingContracts = contracts; emit ReleaseStage(stage); } /// Set URN contract and and implicitly start rewards /// @param urnAddress URN contract function startRewards(address urnAddress) external onlyOwner { _urnAddress = urnAddress; _startRewarding = block.timestamp; } /// Update the whitelist amount for an address to prevent multiple mints in future /// @param from The whitelist address /// @param qty How many to remove from total function updateWhitelist(address from, uint256 qty) external onlyRewarding nonReentrant { _whitelist[from] -= qty; } /// Update the rewards for an address, this includes any pending rewards and updates the timestamp /// @param from The address for rewards /// @param qty The total to add to rewards function updateClaimable(address from, uint256 qty) external onlyRewarding nonReentrant { if (_startRewarding == 0) { _claimable[from] += qty; } else { _claimable[from] += qty + _getPendingClaim(from); _claimUpdated[from] = block.timestamp; } } /// Instead of storing data on-chain for who sent what NFT's we emit events which can be queried later on. /// This is more efficient as event storage is significantly cheaper. /// If the sender owns a URN rewarding token (CRYPT) rewards are calculated. /// @inheritdoc IERC721Receiver function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4) { uint256 stage = _releaseStage; require(stage == 1 || stage > 2, "Cannot accept"); emit Committed(from, _msgSender(), tokenId, data); if (stage == 1) { _whitelist[from] = 3; } else { uint256 amount = 0; for (uint256 i = 0;i < _rewardingContracts.length;i++) { amount += IRewardable(_rewardingContracts[i]).getCommittalReward(from); } _claimable[from] += amount; } return this.onERC721Received.selector; } /// Calculates the pending reward from rewarding contracts. /// URN rewards are calculated daily off the rate defined by rewarding contracts. /// @param from The address to calculate rewards for function _getPendingClaim(address from) internal view returns (uint256) { if (_startRewarding == 0) return 0; uint256 rate = 0; for (uint256 i = 0;i < _rewardingContracts.length;i++) { rate += IRewardable(_rewardingContracts[i]).getRewardRate(from); } uint256 startFrom = _claimUpdated[from] == 0 ? _startRewarding : _claimUpdated[from]; return rate * (block.timestamp - startFrom) / 1 days; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// 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 (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 v4.4.1 (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 `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import "@openzeppelin/contracts/utils/Context.sol"; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; /// @title ENS main interface to fetch the resolver for a name interface IENS { function resolver(bytes32 node) external view returns (IResolver); } /// @title ENS resolver to address interface interface IResolver { function addr(bytes32 node) external view returns (address); } /// @title Graveyard NFT Project's ENSOwnable implementation /// @author [email protected] /// Contract ownership is tied to an ens token, once set the resolved address of the ens name is the contract owner. abstract contract Ownable is Context { using SafeERC20 for IERC20; using SafeMath for uint256; /// Apply a fee to release funds sent to the contract /// A very small price to pay for being able to regain tokens incorrectly sent here uint256 private _releaseFee; /// Configure if this contract allows release bool private _releasesERC20; bool private _releasesERC721; /// Ownership is set to the contract creator until a nameHash is set address private _owner; /// The ENS namehash who controls the contracts bytes32 public _nameHash; /// @dev Initializes the contract setting the deployer as the initial owner constructor(uint256 releaseFee, bool releasesERC20, bool releasesERC721) { _owner = _msgSender(); _releaseFee = releaseFee; _releasesERC20 = releasesERC20; _releasesERC721 = releasesERC721; } /// @dev Returns the address of the current owner function owner() public view virtual returns (address) { if (_nameHash == "") return _owner; bytes32 node = _nameHash; IENS ens = IENS(0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e); IResolver resolver = ens.resolver(node); return resolver.addr(node); } /// @dev Throws if called by any account other than the owner modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /// Set the ENS name as owner /// @param nameHash The bytes32 hash of the ens name function setNameHash(bytes32 nameHash) external onlyOwner { _nameHash = nameHash; } /// Return ERC20 tokens sent to the contract, an optional fee is automatically applied. /// @notice If your reading this you are very lucky, most tokens sent to contracts can never be recovered. /// @param token The ERC20 token address /// @param to The address to send funds to /// @param amount The amount of tokens to send (minus any fee) function releaseERC20(IERC20 token, address to, uint256 amount) external onlyOwner { require(_releasesERC20, "Not allowed"); require(token.balanceOf(address(this)) >= amount, "Insufficient balance"); uint share = 100; if (_releaseFee > 0) token.safeTransfer(_msgSender(), amount.mul(_releaseFee).div(100)); token.safeTransfer(to, amount.mul(share.sub(_releaseFee)).div(100)); } /// Return ERC721 tokens sent to the contract, a fee may be required. /// @notice If your reading this you are very lucky, most tokens sent to contracts can never be recovered. /// @param tokenAddress The ERC721 token address /// @param to The address to the send the token to /// @param tokenId The ERC721 tokenId to send function releaseERC721(IERC721 tokenAddress, address to, uint256 tokenId) external onlyOwner { require(_releasesERC721, "Not allowed"); require(tokenAddress.ownerOf(tokenId) == address(this), "Invalid tokenId"); tokenAddress.safeTransferFrom(address(this), to, tokenId); } /// Withdraw eth from contract. /// @dev many contracts are guarded by default against this, but should a contract have receive/fallback methods /// a bug could be introduced that make this a great help. function withdraw() external virtual onlyOwner { payable(_msgSender()).call{value: address(this).balance}(""); } }
// 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/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 `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
{ "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
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Committed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"ReleaseStage","type":"event"},{"inputs":[],"name":"_nameHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_releaseStage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_rewardingContracts","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_startRewarding","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_urnAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_whitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"}],"name":"claimable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"contracts","type":"address[]"},{"internalType":"uint256[][]","name":"tokenIds","type":"uint256[][]"},{"internalType":"bytes[][]","name":"data","type":"bytes[][]"}],"name":"commitTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","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":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"releaseERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC721","name":"tokenAddress","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"releaseERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"releaseStage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"nameHash","type":"bytes32"}],"name":"setNameHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"stage","type":"uint256"},{"internalType":"address[]","name":"contracts","type":"address[]"}],"name":"setState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"urnAddress","type":"address"}],"name":"startRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"updateClaimable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"updateWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50600560016000600160008190555061002d6100af60201b60201c565b6002806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508260018190555081600260006101000a81548160ff02191690831515021790555080600260016101000a81548160ff0219169083151502179055505050506100b7565b600033905090565b6132d380620000c76000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c806373a682c8116100b8578063b503db131161007c578063b503db1314610314578063b8805d3e14610330578063cfdb63ac1461034e578063d82658461461037e578063f023d4421461039a578063f80cde3b146103b857610137565b806373a682c81461025c578063830639ac1461027a5780638da5cb5b146102aa578063942a3cee146102c8578063980cdc59146102e457610137565b8063402914f5116100ff578063402914f5146101cc5780634e71d92d146101fc5780634f62593a1461020657806367c08ef1146102225780636cd533d81461024057610137565b8063150b7a021461013c5780631a73293d1461016c5780633813b53f146101885780633afbdcf4146101a65780633ccfd60b146101c2575b600080fd5b61015660048036038101906101519190612030565b6103d4565b60405161016391906120f3565b60405180910390f35b6101866004803603810190610181919061210e565b610651565b005b6101906107ef565b60405161019d919061215d565b60405180910390f35b6101c060048036038101906101bb91906121ae565b6107f5565b005b6101ca61087b565b005b6101e660048036038101906101e191906121db565b610969565b6040516101f3919061215d565b60405180910390f35b6102046109c5565b005b610220600480360381019061021b919061225e565b610c34565b005b61022a610d05565b60405161023791906122cd565b60405180910390f35b61025a60048036038101906102559190612326565b610d0b565b005b610264610f76565b604051610271919061215d565b60405180910390f35b610294600480360381019061028f919061210e565b610f80565b6040516102a19190612394565b60405180910390f35b6102b2610fcd565b6040516102bf91906123be565b60405180910390f35b6102e260048036038101906102dd91906121db565b61113b565b005b6102fe60048036038101906102f991906123d9565b611202565b60405161030b91906123be565b60405180910390f35b61032e600480360381019061032991906124b2565b611241565b005b61033861148e565b60405161034591906123be565b60405180910390f35b610368600480360381019061036391906121db565b6114b4565b604051610375919061215d565b60405180910390f35b610398600480360381019061039391906125a4565b6114cc565b005b6103a2611701565b6040516103af919061215d565b60405180910390f35b6103d260048036038101906103cd919061210e565b611707565b005b600080600454905060018114806103eb5750600281115b61042a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161042190612654565b60405180910390fd5b84610433611963565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fd23cd79900d6b1b2f8a512604101feb718c85aab1f400fc7121c46f1c284109887876040516104919291906126d2565b60405180910390a460018114156104ec576003600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061063d565b6000805b6007805490508110156105e45760078181548110610511576105106126f6565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b23e9616896040518263ffffffff1660e01b815260040161057491906123be565b60206040518083038186803b15801561058c57600080fd5b505afa1580156105a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c4919061273a565b826105cf9190612796565b915080806105dc906127ec565b9150506104f0565b5080600860008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546106349190612796565b92505081905550505b63150b7a0260e01b91505095945050505050565b60008061065c611963565b905060005b6007805490508110156106fc578173ffffffffffffffffffffffffffffffffffffffff1660078281548110610699576106986126f6565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156106e957600192506106fc565b80806106f4906127ec565b915050610661565b508161073d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073490612881565b60405180910390fd5b60026000541415610783576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077a906128ed565b60405180910390fd5b600260008190555082600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546107da919061290d565b92505081905550600160008190555050505050565b60045481565b6107fd611963565b73ffffffffffffffffffffffffffffffffffffffff1661081b610fcd565b73ffffffffffffffffffffffffffffffffffffffff1614610871576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108689061298d565b60405180910390fd5b8060038190555050565b610883611963565b73ffffffffffffffffffffffffffffffffffffffff166108a1610fcd565b73ffffffffffffffffffffffffffffffffffffffff16146108f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ee9061298d565b60405180910390fd5b6108ff611963565b73ffffffffffffffffffffffffffffffffffffffff1647604051610922906129de565b60006040518083038185875af1925050503d806000811461095f576040519150601f19603f3d011682016040523d82523d6000602084013e610964565b606091505b505050565b60006109748261196b565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546109be9190612796565b9050919050565b60026000541415610a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a02906128ed565b60405180910390fd5b6002600081905550600060055414158015610a755750600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b610ab4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aab90612a3f565b60405180910390fd5b6000610abe611963565b90506000610acb82610969565b905060008111610b10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0790612aab565b60405180910390fd5b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555042600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1983836040518363ffffffff1660e01b8152600401610bf6929190612acb565b600060405180830381600087803b158015610c1057600080fd5b505af1158015610c24573d6000803e3d6000fd5b5050505050506001600081905550565b610c3c611963565b73ffffffffffffffffffffffffffffffffffffffff16610c5a610fcd565b73ffffffffffffffffffffffffffffffffffffffff1614610cb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca79061298d565b60405180910390fd5b82600481905550818160079190610cc8929190611e70565b507f483ffa7b8ef292f149433d73c0dd88aeab3b85190c7d3606c364425e2206373283604051610cf8919061215d565b60405180910390a1505050565b60035481565b610d13611963565b73ffffffffffffffffffffffffffffffffffffffff16610d31610fcd565b73ffffffffffffffffffffffffffffffffffffffff1614610d87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7e9061298d565b60405180910390fd5b600260009054906101000a900460ff16610dd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcd90612b40565b60405180910390fd5b808373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e1091906123be565b60206040518083038186803b158015610e2857600080fd5b505afa158015610e3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e60919061273a565b1015610ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9890612bac565b60405180910390fd5b60006064905060006001541115610f0c57610f0b610ebd611963565b610ee56064610ed760015487611b3b90919063ffffffff16565b611b5190919063ffffffff16565b8673ffffffffffffffffffffffffffffffffffffffff16611b679092919063ffffffff16565b5b610f7083610f4a6064610f3c610f2d60015487611bed90919063ffffffff16565b87611b3b90919063ffffffff16565b611b5190919063ffffffff16565b8673ffffffffffffffffffffffffffffffffffffffff16611b679092919063ffffffff16565b50505050565b6000600454905090565b600081600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015905092915050565b60008060035414156110015760028054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050611138565b6000600354905060006e0c2e074ec69a0dfb2997ba6c7d2e1e905060008173ffffffffffffffffffffffffffffffffffffffff16630178b8bf846040518263ffffffff1660e01b815260040161105791906122cd565b60206040518083038186803b15801561106f57600080fd5b505afa158015611083573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a79190612c0a565b90508073ffffffffffffffffffffffffffffffffffffffff16633b3b57de846040518263ffffffff1660e01b81526004016110e291906122cd565b60206040518083038186803b1580156110fa57600080fd5b505afa15801561110e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111329190612c4c565b93505050505b90565b611143611963565b73ffffffffffffffffffffffffffffffffffffffff16611161610fcd565b73ffffffffffffffffffffffffffffffffffffffff16146111b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ae9061298d565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055504260058190555050565b6007818154811061121257600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60026000541415611287576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127e906128ed565b60405180910390fd5b600260008190555083839050868690501480156112a957508181905084849050145b6112e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112df90612cc5565b60405180910390fd5b60006112f2611963565b905060005b8787905081101561147c576000888883818110611317576113166126f6565b5b905060200201602081019061132c91906121db565b905060005b878784818110611344576113436126f6565b5b90506020028101906113569190612cf4565b9050811015611467578173ffffffffffffffffffffffffffffffffffffffff1663b88d4fde85308b8b888181106113905761138f6126f6565b5b90506020028101906113a29190612cf4565b868181106113b3576113b26126f6565b5b905060200201358a8a898181106113cd576113cc6126f6565b5b90506020028101906113df9190612d57565b878181106113f0576113ef6126f6565b5b90506020028101906114029190612dba565b6040518663ffffffff1660e01b8152600401611422959493929190612e1d565b600060405180830381600087803b15801561143c57600080fd5b505af1158015611450573d6000803e3d6000fd5b50505050808061145f906127ec565b915050611331565b50508080611474906127ec565b9150506112f7565b50506001600081905550505050505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a6020528060005260406000206000915090505481565b6114d4611963565b73ffffffffffffffffffffffffffffffffffffffff166114f2610fcd565b73ffffffffffffffffffffffffffffffffffffffff1614611548576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153f9061298d565b60405180910390fd5b600260019054906101000a900460ff16611597576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158e90612b40565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016115e7919061215d565b60206040518083038186803b1580156115ff57600080fd5b505afa158015611613573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116379190612c4c565b73ffffffffffffffffffffffffffffffffffffffff161461168d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168490612eb7565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff166342842e0e3084846040518463ffffffff1660e01b81526004016116ca93929190612ed7565b600060405180830381600087803b1580156116e457600080fd5b505af11580156116f8573d6000803e3d6000fd5b50505050505050565b60055481565b600080611712611963565b905060005b6007805490508110156117b2578173ffffffffffffffffffffffffffffffffffffffff166007828154811061174f5761174e6126f6565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561179f57600192506117b2565b80806117aa906127ec565b915050611717565b50816117f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ea90612881565b60405180910390fd5b60026000541415611839576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611830906128ed565b60405180910390fd5b6002600081905550600060055414156118a75782600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461189b9190612796565b92505081905550611955565b6118b08461196b565b836118bb9190612796565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119099190612796565b9250508190555042600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600160008190555050505050565b600033905090565b60008060055414156119805760009050611b36565b6000805b600780549050811015611a7857600781815481106119a5576119a46126f6565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ea7cbff1856040518263ffffffff1660e01b8152600401611a0891906123be565b60206040518083038186803b158015611a2057600080fd5b505afa158015611a34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a58919061273a565b82611a639190612796565b91508080611a70906127ec565b915050611984565b50600080600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611b0657600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b0a565b6005545b9050620151808142611b1c919061290d565b83611b279190612f0e565b611b319190612f97565b925050505b919050565b60008183611b499190612f0e565b905092915050565b60008183611b5f9190612f97565b905092915050565b611be88363a9059cbb60e01b8484604051602401611b86929190612acb565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611c03565b505050565b60008183611bfb919061290d565b905092915050565b6000611c65826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611cca9092919063ffffffff16565b9050600081511115611cc55780806020019051810190611c859190612ff4565b611cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbb90613093565b60405180910390fd5b5b505050565b6060611cd98484600085611ce2565b90509392505050565b606082471015611d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1e90613125565b60405180910390fd5b611d3085611df6565b611d6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6690613191565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611d989190613220565b60006040518083038185875af1925050503d8060008114611dd5576040519150601f19603f3d011682016040523d82523d6000602084013e611dda565b606091505b5091509150611dea828286611e09565b92505050949350505050565b600080823b905060008111915050919050565b60608315611e1957829050611e69565b600083511115611e2c5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e60919061327b565b60405180910390fd5b9392505050565b828054828255906000526020600020908101928215611eff579160200282015b82811115611efe57823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190611e90565b5b509050611f0c9190611f10565b5090565b5b80821115611f29576000816000905550600101611f11565b5090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611f6282611f37565b9050919050565b611f7281611f57565b8114611f7d57600080fd5b50565b600081359050611f8f81611f69565b92915050565b6000819050919050565b611fa881611f95565b8114611fb357600080fd5b50565b600081359050611fc581611f9f565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611ff057611fef611fcb565b5b8235905067ffffffffffffffff81111561200d5761200c611fd0565b5b60208301915083600182028301111561202957612028611fd5565b5b9250929050565b60008060008060006080868803121561204c5761204b611f2d565b5b600061205a88828901611f80565b955050602061206b88828901611f80565b945050604061207c88828901611fb6565b935050606086013567ffffffffffffffff81111561209d5761209c611f32565b5b6120a988828901611fda565b92509250509295509295909350565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6120ed816120b8565b82525050565b600060208201905061210860008301846120e4565b92915050565b6000806040838503121561212557612124611f2d565b5b600061213385828601611f80565b925050602061214485828601611fb6565b9150509250929050565b61215781611f95565b82525050565b6000602082019050612172600083018461214e565b92915050565b6000819050919050565b61218b81612178565b811461219657600080fd5b50565b6000813590506121a881612182565b92915050565b6000602082840312156121c4576121c3611f2d565b5b60006121d284828501612199565b91505092915050565b6000602082840312156121f1576121f0611f2d565b5b60006121ff84828501611f80565b91505092915050565b60008083601f84011261221e5761221d611fcb565b5b8235905067ffffffffffffffff81111561223b5761223a611fd0565b5b60208301915083602082028301111561225757612256611fd5565b5b9250929050565b60008060006040848603121561227757612276611f2d565b5b600061228586828701611fb6565b935050602084013567ffffffffffffffff8111156122a6576122a5611f32565b5b6122b286828701612208565b92509250509250925092565b6122c781612178565b82525050565b60006020820190506122e260008301846122be565b92915050565b60006122f382611f57565b9050919050565b612303816122e8565b811461230e57600080fd5b50565b600081359050612320816122fa565b92915050565b60008060006060848603121561233f5761233e611f2d565b5b600061234d86828701612311565b935050602061235e86828701611f80565b925050604061236f86828701611fb6565b9150509250925092565b60008115159050919050565b61238e81612379565b82525050565b60006020820190506123a96000830184612385565b92915050565b6123b881611f57565b82525050565b60006020820190506123d360008301846123af565b92915050565b6000602082840312156123ef576123ee611f2d565b5b60006123fd84828501611fb6565b91505092915050565b60008083601f84011261241c5761241b611fcb565b5b8235905067ffffffffffffffff81111561243957612438611fd0565b5b60208301915083602082028301111561245557612454611fd5565b5b9250929050565b60008083601f84011261247257612471611fcb565b5b8235905067ffffffffffffffff81111561248f5761248e611fd0565b5b6020830191508360208202830111156124ab576124aa611fd5565b5b9250929050565b600080600080600080606087890312156124cf576124ce611f2d565b5b600087013567ffffffffffffffff8111156124ed576124ec611f32565b5b6124f989828a01612208565b9650965050602087013567ffffffffffffffff81111561251c5761251b611f32565b5b61252889828a01612406565b9450945050604087013567ffffffffffffffff81111561254b5761254a611f32565b5b61255789828a0161245c565b92509250509295509295509295565b600061257182611f57565b9050919050565b61258181612566565b811461258c57600080fd5b50565b60008135905061259e81612578565b92915050565b6000806000606084860312156125bd576125bc611f2d565b5b60006125cb8682870161258f565b93505060206125dc86828701611f80565b92505060406125ed86828701611fb6565b9150509250925092565b600082825260208201905092915050565b7f43616e6e6f742061636365707400000000000000000000000000000000000000600082015250565b600061263e600d836125f7565b915061264982612608565b602082019050919050565b6000602082019050818103600083015261266d81612631565b9050919050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b60006126b18385612674565b93506126be838584612685565b6126c783612694565b840190509392505050565b600060208201905081810360008301526126ed8184866126a5565b90509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008151905061273481611f9f565b92915050565b6000602082840312156127505761274f611f2d565b5b600061275e84828501612725565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006127a182611f95565b91506127ac83611f95565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156127e1576127e0612767565b5b828201905092915050565b60006127f782611f95565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561282a57612829612767565b5b600182019050919050565b7f556e617574686f72697a65640000000000000000000000000000000000000000600082015250565b600061286b600c836125f7565b915061287682612835565b602082019050919050565b6000602082019050818103600083015261289a8161285e565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006128d7601f836125f7565b91506128e2826128a1565b602082019050919050565b60006020820190508181036000830152612906816128ca565b9050919050565b600061291882611f95565b915061292383611f95565b92508282101561293657612935612767565b5b828203905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006129776020836125f7565b915061298282612941565b602082019050919050565b600060208201905081810360008301526129a68161296a565b9050919050565b600081905092915050565b50565b60006129c86000836129ad565b91506129d3826129b8565b600082019050919050565b60006129e9826129bb565b9150819050919050565b7f5265776172647320756e617661696c61626c6500000000000000000000000000600082015250565b6000612a296013836125f7565b9150612a34826129f3565b602082019050919050565b60006020820190508181036000830152612a5881612a1c565b9050919050565b7f4e6f7468696e6720746f20636c61696d00000000000000000000000000000000600082015250565b6000612a956010836125f7565b9150612aa082612a5f565b602082019050919050565b60006020820190508181036000830152612ac481612a88565b9050919050565b6000604082019050612ae060008301856123af565b612aed602083018461214e565b9392505050565b7f4e6f7420616c6c6f776564000000000000000000000000000000000000000000600082015250565b6000612b2a600b836125f7565b9150612b3582612af4565b602082019050919050565b60006020820190508181036000830152612b5981612b1d565b9050919050565b7f496e73756666696369656e742062616c616e6365000000000000000000000000600082015250565b6000612b966014836125f7565b9150612ba182612b60565b602082019050919050565b60006020820190508181036000830152612bc581612b89565b9050919050565b6000612bd782611f57565b9050919050565b612be781612bcc565b8114612bf257600080fd5b50565b600081519050612c0481612bde565b92915050565b600060208284031215612c2057612c1f611f2d565b5b6000612c2e84828501612bf5565b91505092915050565b600081519050612c4681611f69565b92915050565b600060208284031215612c6257612c61611f2d565b5b6000612c7084828501612c37565b91505092915050565b7f496e76616c696420617267730000000000000000000000000000000000000000600082015250565b6000612caf600c836125f7565b9150612cba82612c79565b602082019050919050565b60006020820190508181036000830152612cde81612ca2565b9050919050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612d1157612d10612ce5565b5b80840192508235915067ffffffffffffffff821115612d3357612d32612cea565b5b602083019250602082023603831315612d4f57612d4e612cef565b5b509250929050565b60008083356001602003843603038112612d7457612d73612ce5565b5b80840192508235915067ffffffffffffffff821115612d9657612d95612cea565b5b602083019250602082023603831315612db257612db1612cef565b5b509250929050565b60008083356001602003843603038112612dd757612dd6612ce5565b5b80840192508235915067ffffffffffffffff821115612df957612df8612cea565b5b602083019250600182023603831315612e1557612e14612cef565b5b509250929050565b6000608082019050612e3260008301886123af565b612e3f60208301876123af565b612e4c604083018661214e565b8181036060830152612e5f8184866126a5565b90509695505050505050565b7f496e76616c696420746f6b656e49640000000000000000000000000000000000600082015250565b6000612ea1600f836125f7565b9150612eac82612e6b565b602082019050919050565b60006020820190508181036000830152612ed081612e94565b9050919050565b6000606082019050612eec60008301866123af565b612ef960208301856123af565b612f06604083018461214e565b949350505050565b6000612f1982611f95565b9150612f2483611f95565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612f5d57612f5c612767565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612fa282611f95565b9150612fad83611f95565b925082612fbd57612fbc612f68565b5b828204905092915050565b612fd181612379565b8114612fdc57600080fd5b50565b600081519050612fee81612fc8565b92915050565b60006020828403121561300a57613009611f2d565b5b600061301884828501612fdf565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b600061307d602a836125f7565b915061308882613021565b604082019050919050565b600060208201905081810360008301526130ac81613070565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b600061310f6026836125f7565b915061311a826130b3565b604082019050919050565b6000602082019050818103600083015261313e81613102565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b600061317b601d836125f7565b915061318682613145565b602082019050919050565b600060208201905081810360008301526131aa8161316e565b9050919050565b600081519050919050565b60005b838110156131da5780820151818401526020810190506131bf565b838111156131e9576000848401525b50505050565b60006131fa826131b1565b61320481856129ad565b93506132148185602086016131bc565b80840191505092915050565b600061322c82846131ef565b915081905092915050565b600081519050919050565b600061324d82613237565b61325781856125f7565b93506132678185602086016131bc565b61327081612694565b840191505092915050565b600060208201905081810360008301526132958184613242565b90509291505056fea26469706673582212209241a0c0c0c668148f1c18d274f8a4e94469fcba3fbbc8949696420e9149140864736f6c63430008090033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101375760003560e01c806373a682c8116100b8578063b503db131161007c578063b503db1314610314578063b8805d3e14610330578063cfdb63ac1461034e578063d82658461461037e578063f023d4421461039a578063f80cde3b146103b857610137565b806373a682c81461025c578063830639ac1461027a5780638da5cb5b146102aa578063942a3cee146102c8578063980cdc59146102e457610137565b8063402914f5116100ff578063402914f5146101cc5780634e71d92d146101fc5780634f62593a1461020657806367c08ef1146102225780636cd533d81461024057610137565b8063150b7a021461013c5780631a73293d1461016c5780633813b53f146101885780633afbdcf4146101a65780633ccfd60b146101c2575b600080fd5b61015660048036038101906101519190612030565b6103d4565b60405161016391906120f3565b60405180910390f35b6101866004803603810190610181919061210e565b610651565b005b6101906107ef565b60405161019d919061215d565b60405180910390f35b6101c060048036038101906101bb91906121ae565b6107f5565b005b6101ca61087b565b005b6101e660048036038101906101e191906121db565b610969565b6040516101f3919061215d565b60405180910390f35b6102046109c5565b005b610220600480360381019061021b919061225e565b610c34565b005b61022a610d05565b60405161023791906122cd565b60405180910390f35b61025a60048036038101906102559190612326565b610d0b565b005b610264610f76565b604051610271919061215d565b60405180910390f35b610294600480360381019061028f919061210e565b610f80565b6040516102a19190612394565b60405180910390f35b6102b2610fcd565b6040516102bf91906123be565b60405180910390f35b6102e260048036038101906102dd91906121db565b61113b565b005b6102fe60048036038101906102f991906123d9565b611202565b60405161030b91906123be565b60405180910390f35b61032e600480360381019061032991906124b2565b611241565b005b61033861148e565b60405161034591906123be565b60405180910390f35b610368600480360381019061036391906121db565b6114b4565b604051610375919061215d565b60405180910390f35b610398600480360381019061039391906125a4565b6114cc565b005b6103a2611701565b6040516103af919061215d565b60405180910390f35b6103d260048036038101906103cd919061210e565b611707565b005b600080600454905060018114806103eb5750600281115b61042a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161042190612654565b60405180910390fd5b84610433611963565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fd23cd79900d6b1b2f8a512604101feb718c85aab1f400fc7121c46f1c284109887876040516104919291906126d2565b60405180910390a460018114156104ec576003600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061063d565b6000805b6007805490508110156105e45760078181548110610511576105106126f6565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b23e9616896040518263ffffffff1660e01b815260040161057491906123be565b60206040518083038186803b15801561058c57600080fd5b505afa1580156105a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c4919061273a565b826105cf9190612796565b915080806105dc906127ec565b9150506104f0565b5080600860008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546106349190612796565b92505081905550505b63150b7a0260e01b91505095945050505050565b60008061065c611963565b905060005b6007805490508110156106fc578173ffffffffffffffffffffffffffffffffffffffff1660078281548110610699576106986126f6565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156106e957600192506106fc565b80806106f4906127ec565b915050610661565b508161073d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073490612881565b60405180910390fd5b60026000541415610783576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077a906128ed565b60405180910390fd5b600260008190555082600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546107da919061290d565b92505081905550600160008190555050505050565b60045481565b6107fd611963565b73ffffffffffffffffffffffffffffffffffffffff1661081b610fcd565b73ffffffffffffffffffffffffffffffffffffffff1614610871576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108689061298d565b60405180910390fd5b8060038190555050565b610883611963565b73ffffffffffffffffffffffffffffffffffffffff166108a1610fcd565b73ffffffffffffffffffffffffffffffffffffffff16146108f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ee9061298d565b60405180910390fd5b6108ff611963565b73ffffffffffffffffffffffffffffffffffffffff1647604051610922906129de565b60006040518083038185875af1925050503d806000811461095f576040519150601f19603f3d011682016040523d82523d6000602084013e610964565b606091505b505050565b60006109748261196b565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546109be9190612796565b9050919050565b60026000541415610a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a02906128ed565b60405180910390fd5b6002600081905550600060055414158015610a755750600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b610ab4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aab90612a3f565b60405180910390fd5b6000610abe611963565b90506000610acb82610969565b905060008111610b10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0790612aab565b60405180910390fd5b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555042600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1983836040518363ffffffff1660e01b8152600401610bf6929190612acb565b600060405180830381600087803b158015610c1057600080fd5b505af1158015610c24573d6000803e3d6000fd5b5050505050506001600081905550565b610c3c611963565b73ffffffffffffffffffffffffffffffffffffffff16610c5a610fcd565b73ffffffffffffffffffffffffffffffffffffffff1614610cb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca79061298d565b60405180910390fd5b82600481905550818160079190610cc8929190611e70565b507f483ffa7b8ef292f149433d73c0dd88aeab3b85190c7d3606c364425e2206373283604051610cf8919061215d565b60405180910390a1505050565b60035481565b610d13611963565b73ffffffffffffffffffffffffffffffffffffffff16610d31610fcd565b73ffffffffffffffffffffffffffffffffffffffff1614610d87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7e9061298d565b60405180910390fd5b600260009054906101000a900460ff16610dd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcd90612b40565b60405180910390fd5b808373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e1091906123be565b60206040518083038186803b158015610e2857600080fd5b505afa158015610e3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e60919061273a565b1015610ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9890612bac565b60405180910390fd5b60006064905060006001541115610f0c57610f0b610ebd611963565b610ee56064610ed760015487611b3b90919063ffffffff16565b611b5190919063ffffffff16565b8673ffffffffffffffffffffffffffffffffffffffff16611b679092919063ffffffff16565b5b610f7083610f4a6064610f3c610f2d60015487611bed90919063ffffffff16565b87611b3b90919063ffffffff16565b611b5190919063ffffffff16565b8673ffffffffffffffffffffffffffffffffffffffff16611b679092919063ffffffff16565b50505050565b6000600454905090565b600081600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015905092915050565b60008060035414156110015760028054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050611138565b6000600354905060006e0c2e074ec69a0dfb2997ba6c7d2e1e905060008173ffffffffffffffffffffffffffffffffffffffff16630178b8bf846040518263ffffffff1660e01b815260040161105791906122cd565b60206040518083038186803b15801561106f57600080fd5b505afa158015611083573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a79190612c0a565b90508073ffffffffffffffffffffffffffffffffffffffff16633b3b57de846040518263ffffffff1660e01b81526004016110e291906122cd565b60206040518083038186803b1580156110fa57600080fd5b505afa15801561110e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111329190612c4c565b93505050505b90565b611143611963565b73ffffffffffffffffffffffffffffffffffffffff16611161610fcd565b73ffffffffffffffffffffffffffffffffffffffff16146111b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ae9061298d565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055504260058190555050565b6007818154811061121257600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60026000541415611287576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127e906128ed565b60405180910390fd5b600260008190555083839050868690501480156112a957508181905084849050145b6112e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112df90612cc5565b60405180910390fd5b60006112f2611963565b905060005b8787905081101561147c576000888883818110611317576113166126f6565b5b905060200201602081019061132c91906121db565b905060005b878784818110611344576113436126f6565b5b90506020028101906113569190612cf4565b9050811015611467578173ffffffffffffffffffffffffffffffffffffffff1663b88d4fde85308b8b888181106113905761138f6126f6565b5b90506020028101906113a29190612cf4565b868181106113b3576113b26126f6565b5b905060200201358a8a898181106113cd576113cc6126f6565b5b90506020028101906113df9190612d57565b878181106113f0576113ef6126f6565b5b90506020028101906114029190612dba565b6040518663ffffffff1660e01b8152600401611422959493929190612e1d565b600060405180830381600087803b15801561143c57600080fd5b505af1158015611450573d6000803e3d6000fd5b50505050808061145f906127ec565b915050611331565b50508080611474906127ec565b9150506112f7565b50506001600081905550505050505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a6020528060005260406000206000915090505481565b6114d4611963565b73ffffffffffffffffffffffffffffffffffffffff166114f2610fcd565b73ffffffffffffffffffffffffffffffffffffffff1614611548576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153f9061298d565b60405180910390fd5b600260019054906101000a900460ff16611597576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158e90612b40565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016115e7919061215d565b60206040518083038186803b1580156115ff57600080fd5b505afa158015611613573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116379190612c4c565b73ffffffffffffffffffffffffffffffffffffffff161461168d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168490612eb7565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff166342842e0e3084846040518463ffffffff1660e01b81526004016116ca93929190612ed7565b600060405180830381600087803b1580156116e457600080fd5b505af11580156116f8573d6000803e3d6000fd5b50505050505050565b60055481565b600080611712611963565b905060005b6007805490508110156117b2578173ffffffffffffffffffffffffffffffffffffffff166007828154811061174f5761174e6126f6565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561179f57600192506117b2565b80806117aa906127ec565b915050611717565b50816117f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ea90612881565b60405180910390fd5b60026000541415611839576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611830906128ed565b60405180910390fd5b6002600081905550600060055414156118a75782600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461189b9190612796565b92505081905550611955565b6118b08461196b565b836118bb9190612796565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119099190612796565b9250508190555042600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600160008190555050505050565b600033905090565b60008060055414156119805760009050611b36565b6000805b600780549050811015611a7857600781815481106119a5576119a46126f6565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ea7cbff1856040518263ffffffff1660e01b8152600401611a0891906123be565b60206040518083038186803b158015611a2057600080fd5b505afa158015611a34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a58919061273a565b82611a639190612796565b91508080611a70906127ec565b915050611984565b50600080600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611b0657600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b0a565b6005545b9050620151808142611b1c919061290d565b83611b279190612f0e565b611b319190612f97565b925050505b919050565b60008183611b499190612f0e565b905092915050565b60008183611b5f9190612f97565b905092915050565b611be88363a9059cbb60e01b8484604051602401611b86929190612acb565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611c03565b505050565b60008183611bfb919061290d565b905092915050565b6000611c65826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611cca9092919063ffffffff16565b9050600081511115611cc55780806020019051810190611c859190612ff4565b611cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbb90613093565b60405180910390fd5b5b505050565b6060611cd98484600085611ce2565b90509392505050565b606082471015611d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1e90613125565b60405180910390fd5b611d3085611df6565b611d6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6690613191565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611d989190613220565b60006040518083038185875af1925050503d8060008114611dd5576040519150601f19603f3d011682016040523d82523d6000602084013e611dda565b606091505b5091509150611dea828286611e09565b92505050949350505050565b600080823b905060008111915050919050565b60608315611e1957829050611e69565b600083511115611e2c5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e60919061327b565b60405180910390fd5b9392505050565b828054828255906000526020600020908101928215611eff579160200282015b82811115611efe57823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190611e90565b5b509050611f0c9190611f10565b5090565b5b80821115611f29576000816000905550600101611f11565b5090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611f6282611f37565b9050919050565b611f7281611f57565b8114611f7d57600080fd5b50565b600081359050611f8f81611f69565b92915050565b6000819050919050565b611fa881611f95565b8114611fb357600080fd5b50565b600081359050611fc581611f9f565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611ff057611fef611fcb565b5b8235905067ffffffffffffffff81111561200d5761200c611fd0565b5b60208301915083600182028301111561202957612028611fd5565b5b9250929050565b60008060008060006080868803121561204c5761204b611f2d565b5b600061205a88828901611f80565b955050602061206b88828901611f80565b945050604061207c88828901611fb6565b935050606086013567ffffffffffffffff81111561209d5761209c611f32565b5b6120a988828901611fda565b92509250509295509295909350565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6120ed816120b8565b82525050565b600060208201905061210860008301846120e4565b92915050565b6000806040838503121561212557612124611f2d565b5b600061213385828601611f80565b925050602061214485828601611fb6565b9150509250929050565b61215781611f95565b82525050565b6000602082019050612172600083018461214e565b92915050565b6000819050919050565b61218b81612178565b811461219657600080fd5b50565b6000813590506121a881612182565b92915050565b6000602082840312156121c4576121c3611f2d565b5b60006121d284828501612199565b91505092915050565b6000602082840312156121f1576121f0611f2d565b5b60006121ff84828501611f80565b91505092915050565b60008083601f84011261221e5761221d611fcb565b5b8235905067ffffffffffffffff81111561223b5761223a611fd0565b5b60208301915083602082028301111561225757612256611fd5565b5b9250929050565b60008060006040848603121561227757612276611f2d565b5b600061228586828701611fb6565b935050602084013567ffffffffffffffff8111156122a6576122a5611f32565b5b6122b286828701612208565b92509250509250925092565b6122c781612178565b82525050565b60006020820190506122e260008301846122be565b92915050565b60006122f382611f57565b9050919050565b612303816122e8565b811461230e57600080fd5b50565b600081359050612320816122fa565b92915050565b60008060006060848603121561233f5761233e611f2d565b5b600061234d86828701612311565b935050602061235e86828701611f80565b925050604061236f86828701611fb6565b9150509250925092565b60008115159050919050565b61238e81612379565b82525050565b60006020820190506123a96000830184612385565b92915050565b6123b881611f57565b82525050565b60006020820190506123d360008301846123af565b92915050565b6000602082840312156123ef576123ee611f2d565b5b60006123fd84828501611fb6565b91505092915050565b60008083601f84011261241c5761241b611fcb565b5b8235905067ffffffffffffffff81111561243957612438611fd0565b5b60208301915083602082028301111561245557612454611fd5565b5b9250929050565b60008083601f84011261247257612471611fcb565b5b8235905067ffffffffffffffff81111561248f5761248e611fd0565b5b6020830191508360208202830111156124ab576124aa611fd5565b5b9250929050565b600080600080600080606087890312156124cf576124ce611f2d565b5b600087013567ffffffffffffffff8111156124ed576124ec611f32565b5b6124f989828a01612208565b9650965050602087013567ffffffffffffffff81111561251c5761251b611f32565b5b61252889828a01612406565b9450945050604087013567ffffffffffffffff81111561254b5761254a611f32565b5b61255789828a0161245c565b92509250509295509295509295565b600061257182611f57565b9050919050565b61258181612566565b811461258c57600080fd5b50565b60008135905061259e81612578565b92915050565b6000806000606084860312156125bd576125bc611f2d565b5b60006125cb8682870161258f565b93505060206125dc86828701611f80565b92505060406125ed86828701611fb6565b9150509250925092565b600082825260208201905092915050565b7f43616e6e6f742061636365707400000000000000000000000000000000000000600082015250565b600061263e600d836125f7565b915061264982612608565b602082019050919050565b6000602082019050818103600083015261266d81612631565b9050919050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b60006126b18385612674565b93506126be838584612685565b6126c783612694565b840190509392505050565b600060208201905081810360008301526126ed8184866126a5565b90509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008151905061273481611f9f565b92915050565b6000602082840312156127505761274f611f2d565b5b600061275e84828501612725565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006127a182611f95565b91506127ac83611f95565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156127e1576127e0612767565b5b828201905092915050565b60006127f782611f95565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561282a57612829612767565b5b600182019050919050565b7f556e617574686f72697a65640000000000000000000000000000000000000000600082015250565b600061286b600c836125f7565b915061287682612835565b602082019050919050565b6000602082019050818103600083015261289a8161285e565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006128d7601f836125f7565b91506128e2826128a1565b602082019050919050565b60006020820190508181036000830152612906816128ca565b9050919050565b600061291882611f95565b915061292383611f95565b92508282101561293657612935612767565b5b828203905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006129776020836125f7565b915061298282612941565b602082019050919050565b600060208201905081810360008301526129a68161296a565b9050919050565b600081905092915050565b50565b60006129c86000836129ad565b91506129d3826129b8565b600082019050919050565b60006129e9826129bb565b9150819050919050565b7f5265776172647320756e617661696c61626c6500000000000000000000000000600082015250565b6000612a296013836125f7565b9150612a34826129f3565b602082019050919050565b60006020820190508181036000830152612a5881612a1c565b9050919050565b7f4e6f7468696e6720746f20636c61696d00000000000000000000000000000000600082015250565b6000612a956010836125f7565b9150612aa082612a5f565b602082019050919050565b60006020820190508181036000830152612ac481612a88565b9050919050565b6000604082019050612ae060008301856123af565b612aed602083018461214e565b9392505050565b7f4e6f7420616c6c6f776564000000000000000000000000000000000000000000600082015250565b6000612b2a600b836125f7565b9150612b3582612af4565b602082019050919050565b60006020820190508181036000830152612b5981612b1d565b9050919050565b7f496e73756666696369656e742062616c616e6365000000000000000000000000600082015250565b6000612b966014836125f7565b9150612ba182612b60565b602082019050919050565b60006020820190508181036000830152612bc581612b89565b9050919050565b6000612bd782611f57565b9050919050565b612be781612bcc565b8114612bf257600080fd5b50565b600081519050612c0481612bde565b92915050565b600060208284031215612c2057612c1f611f2d565b5b6000612c2e84828501612bf5565b91505092915050565b600081519050612c4681611f69565b92915050565b600060208284031215612c6257612c61611f2d565b5b6000612c7084828501612c37565b91505092915050565b7f496e76616c696420617267730000000000000000000000000000000000000000600082015250565b6000612caf600c836125f7565b9150612cba82612c79565b602082019050919050565b60006020820190508181036000830152612cde81612ca2565b9050919050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612d1157612d10612ce5565b5b80840192508235915067ffffffffffffffff821115612d3357612d32612cea565b5b602083019250602082023603831315612d4f57612d4e612cef565b5b509250929050565b60008083356001602003843603038112612d7457612d73612ce5565b5b80840192508235915067ffffffffffffffff821115612d9657612d95612cea565b5b602083019250602082023603831315612db257612db1612cef565b5b509250929050565b60008083356001602003843603038112612dd757612dd6612ce5565b5b80840192508235915067ffffffffffffffff821115612df957612df8612cea565b5b602083019250600182023603831315612e1557612e14612cef565b5b509250929050565b6000608082019050612e3260008301886123af565b612e3f60208301876123af565b612e4c604083018661214e565b8181036060830152612e5f8184866126a5565b90509695505050505050565b7f496e76616c696420746f6b656e49640000000000000000000000000000000000600082015250565b6000612ea1600f836125f7565b9150612eac82612e6b565b602082019050919050565b60006020820190508181036000830152612ed081612e94565b9050919050565b6000606082019050612eec60008301866123af565b612ef960208301856123af565b612f06604083018461214e565b949350505050565b6000612f1982611f95565b9150612f2483611f95565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612f5d57612f5c612767565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612fa282611f95565b9150612fad83611f95565b925082612fbd57612fbc612f68565b5b828204905092915050565b612fd181612379565b8114612fdc57600080fd5b50565b600081519050612fee81612fc8565b92915050565b60006020828403121561300a57613009611f2d565b5b600061301884828501612fdf565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b600061307d602a836125f7565b915061308882613021565b604082019050919050565b600060208201905081810360008301526130ac81613070565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b600061310f6026836125f7565b915061311a826130b3565b604082019050919050565b6000602082019050818103600083015261313e81613102565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b600061317b601d836125f7565b915061318682613145565b602082019050919050565b600060208201905081810360008301526131aa8161316e565b9050919050565b600081519050919050565b60005b838110156131da5780820151818401526020810190506131bf565b838111156131e9576000848401525b50505050565b60006131fa826131b1565b61320481856129ad565b93506132148185602086016131bc565b80840191505092915050565b600061322c82846131ef565b915081905092915050565b600081519050919050565b600061324d82613237565b61325781856125f7565b93506132678185602086016131bc565b61327081612694565b840191505092915050565b600060208201905081810360008301526132958184613242565b90509291505056fea26469706673582212209241a0c0c0c668148f1c18d274f8a4e94469fcba3fbbc8949696420e9149140864736f6c63430008090033
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.