More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,285 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Stake | 20937580 | 47 days ago | IN | 0 ETH | 0.00035749 | ||||
Claim | 20937554 | 47 days ago | IN | 0 ETH | 0.00084072 | ||||
Claim | 20709000 | 79 days ago | IN | 0 ETH | 0.00006619 | ||||
Stake | 20401208 | 122 days ago | IN | 0 ETH | 0.00007467 | ||||
Claim | 20401173 | 122 days ago | IN | 0 ETH | 0.00200084 | ||||
Claim | 20401132 | 122 days ago | IN | 0 ETH | 0.00025447 | ||||
Claim | 20250460 | 143 days ago | IN | 0 ETH | 0.00017252 | ||||
Claim | 19821866 | 203 days ago | IN | 0 ETH | 0.00013774 | ||||
Claim | 19699703 | 220 days ago | IN | 0 ETH | 0.00042952 | ||||
Claim | 19621491 | 231 days ago | IN | 0 ETH | 0.00123011 | ||||
Claim | 19234776 | 285 days ago | IN | 0 ETH | 0.00365947 | ||||
Unstake | 19098579 | 304 days ago | IN | 0 ETH | 0.00040255 | ||||
Unstake | 19098565 | 304 days ago | IN | 0 ETH | 0.00042192 | ||||
Unstake | 19098539 | 304 days ago | IN | 0 ETH | 0.00044626 | ||||
Stake | 19077013 | 307 days ago | IN | 0 ETH | 0.00052415 | ||||
Claim | 19051428 | 311 days ago | IN | 0 ETH | 0.00076272 | ||||
Claim | 19008297 | 317 days ago | IN | 0 ETH | 0.0007295 | ||||
Stake | 19008293 | 317 days ago | IN | 0 ETH | 0.00064557 | ||||
Stake | 19008259 | 317 days ago | IN | 0 ETH | 0.00068033 | ||||
Claim | 19008104 | 317 days ago | IN | 0 ETH | 0.0189551 | ||||
Claim | 19005257 | 317 days ago | IN | 0 ETH | 0.00378137 | ||||
Stake | 19001536 | 318 days ago | IN | 0 ETH | 0.00052836 | ||||
Claim | 18967913 | 322 days ago | IN | 0 ETH | 0.00128645 | ||||
Claim | 18935167 | 327 days ago | IN | 0 ETH | 0.00106781 | ||||
Claim | 18933206 | 327 days ago | IN | 0 ETH | 0.00123564 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
15718986 | 778 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
ChillpillStaking
Compiler Version
v0.8.15+commit.e14f2714
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT LICENSE pragma solidity ^0.8.15; /* /$$$$$$ /$$ /$$/$$$$$$/$$ /$$ /$$$$$$$ /$$$$$$/$$ /$$ /$$__ $| $$ | $|_ $$_| $$ | $$ | $$__ $|_ $$_| $$ | $$ | $$ \__| $$ | $$ | $$ | $$ | $$ | $$ \ $$ | $$ | $$ | $$ | $$ | $$$$$$$$ | $$ | $$ | $$ | $$$$$$$/ | $$ | $$ | $$ | $$ | $$__ $$ | $$ | $$ | $$ | $$____/ | $$ | $$ | $$ | $$ $| $$ | $$ | $$ | $$ | $$ | $$ | $$ | $$ | $$ | $$$$$$| $$ | $$/$$$$$| $$$$$$$| $$$$$$$| $$ /$$$$$| $$$$$$$| $$$$$$$$ \______/|__/ |__|______|________|________|__/ |______|________|________/ */ /// ============ Imports ============ import "./ChillToken.sol"; import "./PartyPillStaking.sol"; import "openzeppelin-contracts/token/ERC721/IERC721.sol"; import "openzeppelin-contracts/token/ERC721/IERC721Receiver.sol"; import "openzeppelin-contracts/security/ReentrancyGuard.sol"; contract ChillpillStaking is PartyPillStaking, ReentrancyGuard, IERC721Receiver { /// @notice total count of staked chillpill nfts uint256 public totalStaked; /// @notice $CHILL Token ChillToken public immutable chillToken; /// @notice max supply of $CHILL token uint256 public immutable maxSupply = 8080000000000000000000000; /// @notice returns amount of $CHILL earned by staking 1 pill for 1 day uint256 public dailyStakeRate; /// @notice number of $CHILL halvenings executed uint8 public halveningCount; // struct to store a stake's token, owner, and earning values struct Stake { uint24 tokenId; uint48 timestamp; address owner; } /// @notice event fired when NFT is staked event NFTStaked(address owner, uint256 tokenId, uint256 value); /// @notice event fired when NFT is unstaked event NFTUnstaked(address owner, uint256 tokenId, uint256 value); /// @notice event fired when $CHILL is claimed event Claimed(address owner, uint256 amount); /// @notice address of ChillRx ERC721 contract address public nftAddress; /// @notice amount of $CHILL claimed uint256 public totalClaimed; /// @notice total amount of ChillRx + PartyPills uint256 public totalNftSupply; // maps tokenId to stake mapping(uint256 => Stake) public vault; constructor(address _nft, uint256 _totalNftSupply) { chillToken = new ChillToken(address(this)); nftAddress = _nft; totalNftSupply = _totalNftSupply; dailyStakeRate = 8080000000000000000; } /// @notice transfer pill to staking contract function _stakeTransfer(IERC721 _nft, uint256 _tokenId) private { require(_nft.ownerOf(_tokenId) == msg.sender, "not your token"); require( _nft.isApprovedForAll(msg.sender, address(this)) || _nft.getApproved(_tokenId) == address(this), "not approved for transfer" ); _nft.safeTransferFrom(msg.sender, address(this), _tokenId); } /// @notice transfer pill from staking contract to owner function _unstakeTransfer(uint256 _tokenId, address _account) private { if (_tokenId > partyPillStartIndex) { IERC721(partyPillAddress).safeTransferFrom( address(this), _account, _tokenId - partyPillStartIndex ); } else { IERC721(nftAddress).safeTransferFrom( address(this), _account, _tokenId ); } } /// @notice stake you pills function stake(uint256[] calldata tokenIds) external nonReentrant { uint256 tokenId; totalStaked += tokenIds.length; IERC721 _nft = IERC721(nftAddress); IERC721 _partyPill = IERC721(partyPillAddress); for (uint256 i; i != tokenIds.length; i++) { tokenId = tokenIds[i]; require(vault[tokenId].owner == address(0), "already staked"); if (tokenIds[i] > partyPillStartIndex) { uint256 _tokenId = tokenId - partyPillStartIndex; _stakeTransfer(_partyPill, _tokenId); } else { _stakeTransfer(_nft, tokenIds[i]); } emit NFTStaked(msg.sender, tokenId, block.timestamp); vault[tokenId] = Stake({ owner: msg.sender, tokenId: uint24(tokenId), timestamp: uint48(block.timestamp) }); } } /// @notice cut distribution of $CHILL in half function halvening() internal { if (halveningCount < 3) { dailyStakeRate = dailyStakeRate / 2; ++halveningCount; } } /// @notice unstake pills function _unstakeMany(address account, uint256[] calldata tokenIds) internal { uint256 tokenId; totalStaked -= tokenIds.length; for (uint256 i; i != tokenIds.length; i++) { tokenId = tokenIds[i]; Stake memory staked = vault[tokenId]; require(staked.owner == msg.sender, "not an owner"); delete vault[tokenId]; emit NFTUnstaked(account, tokenId, block.timestamp); _unstakeTransfer(tokenId, account); } } /// @notice claim $CHILL for self function claim(uint256[] calldata tokenIds) external nonReentrant { _claim(msg.sender, tokenIds, false); } /// @notice claim $CHILL for target address function claimForAddress(address account, uint256[] calldata tokenIds) external nonReentrant { _claim(account, tokenIds, false); } /// @notice claim $CHILL and unstake Pill function unstake(uint256[] calldata tokenIds) external nonReentrant { _claim(msg.sender, tokenIds, true); } /// @notice claim $CHILL and unstake Pill (optional) function _claim( address account, uint256[] calldata tokenIds, bool _unstake ) internal { uint256 tokenId; uint256 earned = 0; for (uint256 i; i != tokenIds.length; i++) { tokenId = tokenIds[i]; Stake memory staked = vault[tokenId]; require(staked.owner == account, "not an owner"); uint256 stakedAt = staked.timestamp; uint256 currentTime = block.timestamp; if (tokenId > partyPillStartIndex) { earned += calculateEarn(stakedAt) * partyPillMultiplier; } else { earned += calculateEarn(stakedAt); } vault[tokenId] = Stake({ owner: account, tokenId: uint24(tokenId), timestamp: uint48(currentTime) }); } if (earned > 0) { if (earned + chillToken.totalSupply() > maxSupply) { earned = maxSupply - chillToken.totalSupply(); } chillToken.mint(account, earned); totalClaimed += earned; } if (chillToken.totalSupply() > maxSupply / (2 * (halveningCount + 1))) { halvening(); } if (_unstake) { _unstakeMany(account, tokenIds); } emit Claimed(account, earned); } /// @notice returns amount of $CHILL earned by staking 1 pill for 1 second function secondStakeRate() public view returns (uint256) { return dailyStakeRate / 1 days + (dailyStakeRate % 1 days); } /// @notice calculate amount of unclaimed $CHILL function calculateEarn(uint256 stakedAt) internal view returns (uint256) { uint256 stakeDuration = block.timestamp - stakedAt; uint256 payout = stakeDuration * secondStakeRate(); return payout; } /// @notice amount of unclaimed $CHILL function earningInfo(address account, uint256[] calldata tokenIds) external view returns (uint256) { uint256 tokenId; uint256 earned = 0; for (uint256 i; i != tokenIds.length; i++) { tokenId = tokenIds[i]; Stake memory staked = vault[tokenId]; require(staked.owner == account, "not an owner"); uint256 stakedAt = staked.timestamp; if (tokenId > partyPillStartIndex) { earned += calculateEarn(stakedAt) * partyPillMultiplier; } else { earned += calculateEarn(stakedAt); } } return earned; } /// @notice get number of tokens staked in account /// @dev DecentSDK compatible function balanceOf(address account) external view returns (uint256) { uint256 balance = 0; for (uint256 i = 0; i <= totalNftSupply + 1; i++) { if (vault[i].owner == account) { balance++; } } return balance; } /// @notice return nft tokens staked of owner function tokensOfOwner(address account) external view returns (uint256[] memory ownerTokens) { uint256[] memory tmp = new uint256[](totalNftSupply); uint256 index = 0; for (uint256 tokenId = 0; tokenId <= totalNftSupply + 1; tokenId++) { if (vault[tokenId].owner == account) { tmp[index] = vault[tokenId].tokenId; index++; } } uint256[] memory tokens = new uint256[](index); for (uint256 i; i != index; i++) { tokens[i] = tmp[i]; } return tokens; } /// @notice handles reciept of ERC721 tokens function onERC721Received( address, address, // address from, uint256, bytes calldata ) external pure override returns (bytes4) { // require(from == address(0x0), "Cannot send nfts to Vault directly"); return IERC721Receiver.onERC721Received.selector; } /// @notice erc20Address for $CHILL token /// @dev DecentSDK compatibility function erc20Address() public view returns (address) { return address(chillToken); } /// @notice updates party pill information function updatePartyPill( address _partyPillAddress, uint8 _stakeMultiplier, uint256 _count ) public onlyOwner { totalNftSupply = totalNftSupply - partyPillCount + _count; _updatePartyPill(_partyPillAddress, _stakeMultiplier, _count); } // fallback fallback() external payable {} // receive eth receive() external payable {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts 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() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; import "./IERC20.sol"; import "./extensions/IERC20Metadata.sol"; import "../../utils/Context.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/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 (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 LICENSE pragma solidity ^0.8.15; /* /$$$$$$ /$$ /$$/$$$$$$/$$ /$$ /$$$$$$$ /$$$$$$/$$ /$$ /$$__ $| $$ | $|_ $$_| $$ | $$ | $$__ $|_ $$_| $$ | $$ | $$ \__| $$ | $$ | $$ | $$ | $$ | $$ \ $$ | $$ | $$ | $$ | $$ | $$$$$$$$ | $$ | $$ | $$ | $$$$$$$/ | $$ | $$ | $$ | $$ | $$__ $$ | $$ | $$ | $$ | $$____/ | $$ | $$ | $$ | $$ $| $$ | $$ | $$ | $$ | $$ | $$ | $$ | $$ | $$ | $$$$$$| $$ | $$/$$$$$| $$$$$$$| $$$$$$$| $$ /$$$$$| $$$$$$$| $$$$$$$$ \______/|__/ |__|______|________|________|__/ |______|________|________/ */ /// ============ Imports ============ import "openzeppelin-contracts/token/ERC20/ERC20.sol"; contract ChillToken is ERC20 { /// @notice address permissioned to mint new $CHILL tokens address public immutable minter; constructor(address _minter) ERC20("CHILL", "CHILL") { minter = _minter; } /// @notice only minter modifier modifier onlyMinter() { require( msg.sender == minter, "not authorized to mint new $CHILL tokens" ); _; } /// @notice mints new $CHILL token function mint(address account, uint256 amount) external onlyMinter { _mint(account, amount); } }
// SPDX-License-Identifier: MIT LICENSE pragma solidity ^0.8.15; /* /$$$$$$ /$$ /$$/$$$$$$/$$ /$$ /$$$$$$$ /$$$$$$/$$ /$$ /$$__ $| $$ | $|_ $$_| $$ | $$ | $$__ $|_ $$_| $$ | $$ | $$ \__| $$ | $$ | $$ | $$ | $$ | $$ \ $$ | $$ | $$ | $$ | $$ | $$$$$$$$ | $$ | $$ | $$ | $$$$$$$/ | $$ | $$ | $$ | $$ | $$__ $$ | $$ | $$ | $$ | $$____/ | $$ | $$ | $$ | $$ $| $$ | $$ | $$ | $$ | $$ | $$ | $$ | $$ | $$ | $$$$$$| $$ | $$/$$$$$| $$$$$$$| $$$$$$$| $$ /$$$$$| $$$$$$$| $$$$$$$$ \______/|__/ |__|______|________|________|__/ |______|________|________/ */ /// ============ Imports ============ import "openzeppelin-contracts/access/Ownable.sol"; contract PartyPillStaking is Ownable { /// @notice party pill contract address address public partyPillAddress; /// @notice party pill staking multiplier uint8 public partyPillMultiplier; /// @notice number of party pills uint256 public partyPillCount; /// @notice token Id for start of Party Pills uint256 public immutable partyPillStartIndex = 10000; constructor() Ownable() {} /// @notice updates party pill information function _updatePartyPill( address _partyPillAddress, uint8 _stakeMultiplier, uint256 _count ) internal { partyPillAddress = _partyPillAddress; partyPillMultiplier = _stakeMultiplier; partyPillCount = _count; } }
{ "optimizer": { "enabled": true, "runs": 200 }, "evmVersion": "london", "remappings": [ ":ds-test/=lib/forge-std/lib/ds-test/src/", ":forge-std/=lib/forge-std/src/", ":openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/", ":script/=script/", ":src/=src/", ":test/=test/" ], "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_nft","type":"address"},{"internalType":"uint256","name":"_totalNftSupply","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"NFTStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"NFTUnstaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chillToken","outputs":[{"internalType":"contract ChillToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"claimForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dailyStakeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"earningInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"erc20Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"halveningCount","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"partyPillAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"partyPillCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"partyPillMultiplier","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"partyPillStartIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"secondStakeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"ownerTokens","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalNftSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_partyPillAddress","type":"address"},{"internalType":"uint8","name":"_stakeMultiplier","type":"uint8"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"updatePartyPill","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"vault","outputs":[{"internalType":"uint24","name":"tokenId","type":"uint24"},{"internalType":"uint48","name":"timestamp","type":"uint48"},{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60e06040526127106080526a06af01ad7cb5429a00000060c0523480156200002657600080fd5b5060405162002ad638038062002ad6833981016040819052620000499162000136565b6200005433620000d8565b60016003556040513090620000699062000128565b6001600160a01b039091168152602001604051809103906000f08015801562000096573d6000803e3d6000fd5b506001600160a01b0390811660a05260068054610100600160a81b031916610100949092169390930217909155600855677021ed30b928000060055562000172565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610c868062001e5083390190565b600080604083850312156200014a57600080fd5b82516001600160a01b03811681146200016257600080fd5b6020939093015192949293505050565b60805160a05160c051611c4c620002046000396000818161051b01528181611172015281816112ab015261139101526000818161020d015281816102570152818161119301528181611225015281816112f801526113b701526000818161047b01528181610694015281816106d90152818161097b015281816110220152818161170301526117410152611c4c6000f3fe60806040526004361061018b5760003560e01c80638a925009116100e0578063d54ad2a111610084578063e449f34111610061578063e449f34114610553578063e8af570314610573578063ef9e676214610593578063f2fde38b146105a957005b8063d54ad2a1146104f3578063d5abeb0114610509578063e2d3a7f81461053d57005b8063badb0a04116100bd578063badb0a0414610469578063c2f40a4e1461049d578063c36be357146104be578063cddfcb50146104de57005b80638a925009146104155780638da5cb5b1461042b578063a79254b81461044957005b80636ba4c138116101475780637e75dd60116101245780637e75dd601461032d578063817b1cd21461034d57806381a36fb6146103635780638462151c146103e857005b80636ba4c138146102ca57806370a08231146102ea578063715018a61461031857005b80630fbf0a9314610194578063150b7a02146101b4578063276184ae146101fe57806335f6f8e1146102455780634980d7af146102795780635bf8633a146102a557005b3661019257005b005b3480156101a057600080fd5b506101926101af366004611831565b6105c9565b3480156101c057600080fd5b506101e06101cf366004611888565b630a85bd0160e11b95945050505050565b6040516001600160e01b031990911681526020015b60405180910390f35b34801561020a57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000005b6040516001600160a01b0390911681526020016101f5565b34801561025157600080fd5b5061022d7f000000000000000000000000000000000000000000000000000000000000000081565b34801561028557600080fd5b506006546102939060ff1681565b60405160ff90911681526020016101f5565b3480156102b157600080fd5b5060065461022d9061010090046001600160a01b031681565b3480156102d657600080fd5b506101926102e5366004611831565b610832565b3480156102f657600080fd5b5061030a610305366004611927565b610851565b6040519081526020016101f5565b34801561032457600080fd5b506101926108b9565b34801561033957600080fd5b5061030a61034836600461194b565b6108cd565b34801561035957600080fd5b5061030a60045481565b34801561036f57600080fd5b506103b761037e3660046119a0565b60096020526000908152604090205462ffffff8116906301000000810465ffffffffffff1690600160481b90046001600160a01b031683565b6040805162ffffff909416845265ffffffffffff90921660208401526001600160a01b0316908201526060016101f5565b3480156103f457600080fd5b50610408610403366004611927565b610a07565b6040516101f591906119b9565b34801561042157600080fd5b5061030a60055481565b34801561043757600080fd5b506000546001600160a01b031661022d565b34801561045557600080fd5b506101926104643660046119fd565b610b8c565b34801561047557600080fd5b5061030a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156104a957600080fd5b5060015461029390600160a01b900460ff1681565b3480156104ca57600080fd5b506101926104d936600461194b565b610be9565b3480156104ea57600080fd5b5061030a610c08565b3480156104ff57600080fd5b5061030a60075481565b34801561051557600080fd5b5061030a7f000000000000000000000000000000000000000000000000000000000000000081565b34801561054957600080fd5b5061030a60025481565b34801561055f57600080fd5b5061019261056e366004611831565b610c3b565b34801561057f57600080fd5b5060015461022d906001600160a01b031681565b34801561059f57600080fd5b5061030a60085481565b3480156105b557600080fd5b506101926105c4366004611927565b610c50565b6105d1610cc9565b600082829050600460008282546105e89190611a5a565b90915550506006546001546001600160a01b036101009092048216911660005b8085146108205785858281811061062157610621611a72565b602090810292909201356000818152600990935260409092205491955050600160481b90046001600160a01b0316156106925760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481cdd185ad95960921b60448201526064015b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008686838181106106c5576106c5611a72565b9050602002013511156107105760006106fe7f000000000000000000000000000000000000000000000000000000000000000086611a88565b905061070a8382610d22565b50610732565b6107328387878481811061072657610726611a72565b90506020020135610d22565b6040805133815260208101869052428183015290517f36b3725f1783bad4ff05b7f4c077c3aa68eeb23a4d054ba189db4d01ac278d399181900360600190a16040805160608101825262ffffff808716825265ffffffffffff42811660208085019182523385870190815260008b8152600990925295902093518454915195516001600160a01b0316600160481b027fffffff0000000000000000000000000000000000000000ffffffffffffffffff9690931663010000000268ffffffffffffffffff1990921693169290921791909117929092169190911790558061081881611a9f565b915050610608565b5050505061082e6001600355565b5050565b61083a610cc9565b6108473383836000610f75565b61082e6001600355565b600080805b600854610864906001611a5a565b81116108b2576000818152600960205260409020546001600160a01b03808616600160481b90920416036108a0578161089c81611a9f565b9250505b806108aa81611a9f565b915050610856565b5092915050565b6108c16114a0565b6108cb60006114fa565b565b6000806000805b8085146109fd578585828181106108ed576108ed611a72565b602090810292909201356000818152600984526040908190208151606081018352905462ffffff8116825265ffffffffffff6301000000820416958201959095526001600160a01b03600160481b909504851691810182905291965090928a1614905061096c5760405162461bcd60e51b815260040161068990611ab8565b602081015165ffffffffffff167f00000000000000000000000000000000000000000000000000000000000000008511156109d257600154600160a01b900460ff166109b78261154a565b6109c19190611ade565b6109cb9085611a5a565b93506109e8565b6109db8161154a565b6109e59085611a5a565b93505b505080806109f590611a9f565b9150506108d4565b5095945050505050565b6060600060085467ffffffffffffffff811115610a2657610a26611afd565b604051908082528060200260200182016040528015610a4f578160200160208202803683370190505b5090506000805b600854610a64906001611a5a565b8111610ae8576000818152600960205260409020546001600160a01b03808716600160481b9092041603610ad657600081815260096020526040902054835162ffffff90911690849084908110610abd57610abd611a72565b602090810291909101015281610ad281611a9f565b9250505b80610ae081611a9f565b915050610a56565b5060008167ffffffffffffffff811115610b0457610b04611afd565b604051908082528060200260200182016040528015610b2d578160200160208202803683370190505b50905060005b828114610b8357838181518110610b4c57610b4c611a72565b6020026020010151828281518110610b6657610b66611a72565b602090810291909101015280610b7b81611a9f565b915050610b33565b50949350505050565b610b946114a0565b80600254600854610ba59190611a88565b610baf9190611a5a565b600855600180546001600160a01b0385166001600160a81b031990911617600160a01b60ff8516021790556002819055505050565b505050565b610bf1610cc9565b610bfe8383836000610f75565b610be46001600355565b600062015180600554610c1b9190611b29565b62015180600554610c2c9190611b3d565b610c369190611a5a565b905090565b610c43610cc9565b6108473383836001610f75565b610c586114a0565b6001600160a01b038116610cbd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610689565b610cc6816114fa565b50565b600260035403610d1b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610689565b6002600355565b6040516331a9108f60e11b81526004810182905233906001600160a01b03841690636352211e90602401602060405180830381865afa158015610d69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8d9190611b51565b6001600160a01b031614610dd45760405162461bcd60e51b815260206004820152600e60248201526d3737ba103cb7bab9103a37b5b2b760911b6044820152606401610689565b60405163e985e9c560e01b81523360048201523060248201526001600160a01b0383169063e985e9c590604401602060405180830381865afa158015610e1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e429190611b6e565b80610ebe575060405163020604bf60e21b81526004810182905230906001600160a01b0384169063081812fc90602401602060405180830381865afa158015610e8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb39190611b51565b6001600160a01b0316145b610f0a5760405162461bcd60e51b815260206004820152601960248201527f6e6f7420617070726f76656420666f72207472616e73666572000000000000006044820152606401610689565b604051632142170760e11b8152336004820152306024820152604481018290526001600160a01b038316906342842e0e906064015b600060405180830381600087803b158015610f5957600080fd5b505af1158015610f6d573d6000803e3d6000fd5b505050505050565b600080805b80851461116957858582818110610f9357610f93611a72565b602090810292909201356000818152600984526040908190208151606081018352905462ffffff8116825265ffffffffffff6301000000820416958201959095526001600160a01b03600160481b909504851691810182905291965090928a161490506110125760405162461bcd60e51b815260040161068990611ab8565b602081015165ffffffffffff16427f000000000000000000000000000000000000000000000000000000000000000086111561107957600154600160a01b900460ff1661105e8361154a565b6110689190611ade565b6110729086611a5a565b945061108f565b6110828261154a565b61108c9086611a5a565b94505b60405180606001604052808762ffffff1681526020018265ffffffffffff1681526020018b6001600160a01b03168152506009600088815260200190815260200160002060008201518160000160006101000a81548162ffffff021916908362ffffff16021790555060208201518160000160036101000a81548165ffffffffffff021916908365ffffffffffff16021790555060408201518160000160096101000a8154816001600160a01b0302191690836001600160a01b03160217905550905050505050808061116190611a9f565b915050610f7a565b50801561136c577f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112139190611b90565b61121d9083611a5a565b11156112d2577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190611b90565b6112cf907f0000000000000000000000000000000000000000000000000000000000000000611a88565b90505b6040516340c10f1960e01b81526001600160a01b038781166004830152602482018390527f000000000000000000000000000000000000000000000000000000000000000016906340c10f1990604401600060405180830381600087803b15801561133c57600080fd5b505af1158015611350573d6000803e3d6000fd5b5050505080600760008282546113669190611a5a565b90915550505b60065461137d9060ff166001611ba9565b611388906002611bce565b6113b59060ff167f0000000000000000000000000000000000000000000000000000000000000000611b3d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611413573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114379190611b90565b111561144557611445611575565b8215611456576114568686866115c4565b604080516001600160a01b0388168152602081018390527fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a910160405180910390a1505050505050565b6000546001600160a01b031633146108cb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610689565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000806115578342611a88565b90506000611563610c08565b61156d9083611ade565b949350505050565b600654600360ff90911610156108cb5760026005546115949190611b3d565b600555600680546000906115aa9060ff16611bf7565b91906101000a81548160ff021916908360ff160217905550565b600082829050600460008282546115db9190611a88565b90915550600090505b8083146116fa578383828181106115fd576115fd611a72565b602090810292909201356000818152600984526040908190208151606081018352905462ffffff811682526301000000810465ffffffffffff1695820195909552600160481b9094046001600160a01b0316908401819052909450331490506116785760405162461bcd60e51b815260040161068990611ab8565b60008381526009602090815260409182902080546001600160e81b031916905581516001600160a01b0389168152908101859052428183015290517fc486b9458a8637650d84d262414833a5a457bc91ae86b7da110386c8c3fa255b9181900360600190a16116e78387611701565b50806116f281611a9f565b9150506115e4565b5050505050565b7f00000000000000000000000000000000000000000000000000000000000000008211156117a0576001546001600160a01b03166342842e0e30836117667f000000000000000000000000000000000000000000000000000000000000000087611a88565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401610f3f565b600654604051632142170760e11b81523060048201526001600160a01b03838116602483015260448201859052610100909204909116906342842e0e90606401610f3f565b60008083601f8401126117f757600080fd5b50813567ffffffffffffffff81111561180f57600080fd5b6020830191508360208260051b850101111561182a57600080fd5b9250929050565b6000806020838503121561184457600080fd5b823567ffffffffffffffff81111561185b57600080fd5b611867858286016117e5565b90969095509350505050565b6001600160a01b0381168114610cc657600080fd5b6000806000806000608086880312156118a057600080fd5b85356118ab81611873565b945060208601356118bb81611873565b935060408601359250606086013567ffffffffffffffff808211156118df57600080fd5b818801915088601f8301126118f357600080fd5b81358181111561190257600080fd5b89602082850101111561191457600080fd5b9699959850939650602001949392505050565b60006020828403121561193957600080fd5b813561194481611873565b9392505050565b60008060006040848603121561196057600080fd5b833561196b81611873565b9250602084013567ffffffffffffffff81111561198757600080fd5b611993868287016117e5565b9497909650939450505050565b6000602082840312156119b257600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b818110156119f1578351835292840192918401916001016119d5565b50909695505050505050565b600080600060608486031215611a1257600080fd5b8335611a1d81611873565b9250602084013560ff81168114611a3357600080fd5b929592945050506040919091013590565b634e487b7160e01b600052601160045260246000fd5b60008219821115611a6d57611a6d611a44565b500190565b634e487b7160e01b600052603260045260246000fd5b600082821015611a9a57611a9a611a44565b500390565b600060018201611ab157611ab1611a44565b5060010190565b6020808252600c908201526b3737ba1030b71037bbb732b960a11b604082015260600190565b6000816000190483118215151615611af857611af8611a44565b500290565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b600082611b3857611b38611b13565b500690565b600082611b4c57611b4c611b13565b500490565b600060208284031215611b6357600080fd5b815161194481611873565b600060208284031215611b8057600080fd5b8151801515811461194457600080fd5b600060208284031215611ba257600080fd5b5051919050565b600060ff821660ff84168060ff03821115611bc657611bc6611a44565b019392505050565b600060ff821660ff84168160ff0481118215151615611bef57611bef611a44565b029392505050565b600060ff821660ff8103611c0d57611c0d611a44565b6001019291505056fea26469706673582212201a511f0b697389a7296c152520099f45de69cb92055c0fc10bedca3c1fc417bc64736f6c634300080f003360a06040523480156200001157600080fd5b5060405162000c8638038062000c86833981016040819052620000349162000095565b60408051808201825260058082526410d212531360da1b60208084018290528451808601909552918452908301529060036200007183826200016c565b5060046200008082826200016c565b5050506001600160a01b031660805262000238565b600060208284031215620000a857600080fd5b81516001600160a01b0381168114620000c057600080fd5b9392505050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620000f257607f821691505b6020821081036200011357634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200016757600081815260208120601f850160051c81016020861015620001425750805b601f850160051c820191505b8181101562000163578281556001016200014e565b5050505b505050565b81516001600160401b03811115620001885762000188620000c7565b620001a081620001998454620000dd565b8462000119565b602080601f831160018114620001d85760008415620001bf5750858301515b600019600386901b1c1916600185901b17855562000163565b600085815260208120601f198616915b828110156200020957888601518255948401946001909101908401620001e8565b5085821015620002285787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b608051610a2c6200025a6000396000818160f701526103150152610a2c6000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063395093511161008c57806395d89b411161006657806395d89b41146101d9578063a457c2d7146101e1578063a9059cbb146101f4578063dd62ed3e1461020757600080fd5b8063395093511461018857806340c10f191461019b57806370a08231146101b057600080fd5b806306fdde03146100d457806307546172146100f2578063095ea7b31461013157806318160ddd1461015457806323b872dd14610166578063313ce56714610179575b600080fd5b6100dc61021a565b6040516100e9919061086a565b60405180910390f35b6101197f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100e9565b61014461013f3660046108db565b6102ac565b60405190151581526020016100e9565b6002545b6040519081526020016100e9565b610144610174366004610905565b6102c4565b604051601281526020016100e9565b6101446101963660046108db565b6102e8565b6101ae6101a93660046108db565b61030a565b005b6101586101be366004610941565b6001600160a01b031660009081526020819052604090205490565b6100dc6103a6565b6101446101ef3660046108db565b6103b5565b6101446102023660046108db565b610430565b610158610215366004610963565b61043e565b60606003805461022990610996565b80601f016020809104026020016040519081016040528092919081815260200182805461025590610996565b80156102a25780601f10610277576101008083540402835291602001916102a2565b820191906000526020600020905b81548152906001019060200180831161028557829003601f168201915b5050505050905090565b6000336102ba818585610469565b5060019392505050565b6000336102d285828561058d565b6102dd858585610607565b506001949350505050565b6000336102ba8185856102fb838361043e565b61030591906109d0565b610469565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146103985760405162461bcd60e51b815260206004820152602860248201527f6e6f7420617574686f72697a656420746f206d696e74206e657720244348494c6044820152674c20746f6b656e7360c01b60648201526084015b60405180910390fd5b6103a282826107ab565b5050565b60606004805461022990610996565b600033816103c3828661043e565b9050838110156104235760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161038f565b6102dd8286868403610469565b6000336102ba818585610607565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166104cb5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161038f565b6001600160a01b03821661052c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161038f565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000610599848461043e565b9050600019811461060157818110156105f45760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161038f565b6106018484848403610469565b50505050565b6001600160a01b03831661066b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161038f565b6001600160a01b0382166106cd5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161038f565b6001600160a01b038316600090815260208190526040902054818110156107455760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161038f565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610601565b6001600160a01b0382166108015760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161038f565b806002600082825461081391906109d0565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b600060208083528351808285015260005b818110156108975785810183015185820160400152820161087b565b818111156108a9576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b03811681146108d657600080fd5b919050565b600080604083850312156108ee57600080fd5b6108f7836108bf565b946020939093013593505050565b60008060006060848603121561091a57600080fd5b610923846108bf565b9250610931602085016108bf565b9150604084013590509250925092565b60006020828403121561095357600080fd5b61095c826108bf565b9392505050565b6000806040838503121561097657600080fd5b61097f836108bf565b915061098d602084016108bf565b90509250929050565b600181811c908216806109aa57607f821691505b6020821081036109ca57634e487b7160e01b600052602260045260246000fd5b50919050565b600082198211156109f157634e487b7160e01b600052601160045260246000fd5b50019056fea2646970667358221220b95211c1129b1c9f77bc99cc36e1591adc3676d517ff9e78edf38fa80ac4ca7364736f6c634300080f0033000000000000000000000000e7e07f9dff6b48eba32641c53816f25368297d22000000000000000000000000000000000000000000000000000000000000270f
Deployed Bytecode
0x60806040526004361061018b5760003560e01c80638a925009116100e0578063d54ad2a111610084578063e449f34111610061578063e449f34114610553578063e8af570314610573578063ef9e676214610593578063f2fde38b146105a957005b8063d54ad2a1146104f3578063d5abeb0114610509578063e2d3a7f81461053d57005b8063badb0a04116100bd578063badb0a0414610469578063c2f40a4e1461049d578063c36be357146104be578063cddfcb50146104de57005b80638a925009146104155780638da5cb5b1461042b578063a79254b81461044957005b80636ba4c138116101475780637e75dd60116101245780637e75dd601461032d578063817b1cd21461034d57806381a36fb6146103635780638462151c146103e857005b80636ba4c138146102ca57806370a08231146102ea578063715018a61461031857005b80630fbf0a9314610194578063150b7a02146101b4578063276184ae146101fe57806335f6f8e1146102455780634980d7af146102795780635bf8633a146102a557005b3661019257005b005b3480156101a057600080fd5b506101926101af366004611831565b6105c9565b3480156101c057600080fd5b506101e06101cf366004611888565b630a85bd0160e11b95945050505050565b6040516001600160e01b031990911681526020015b60405180910390f35b34801561020a57600080fd5b507f00000000000000000000000067bd6541eb488059c8b84f859b0ad0244f9f01025b6040516001600160a01b0390911681526020016101f5565b34801561025157600080fd5b5061022d7f00000000000000000000000067bd6541eb488059c8b84f859b0ad0244f9f010281565b34801561028557600080fd5b506006546102939060ff1681565b60405160ff90911681526020016101f5565b3480156102b157600080fd5b5060065461022d9061010090046001600160a01b031681565b3480156102d657600080fd5b506101926102e5366004611831565b610832565b3480156102f657600080fd5b5061030a610305366004611927565b610851565b6040519081526020016101f5565b34801561032457600080fd5b506101926108b9565b34801561033957600080fd5b5061030a61034836600461194b565b6108cd565b34801561035957600080fd5b5061030a60045481565b34801561036f57600080fd5b506103b761037e3660046119a0565b60096020526000908152604090205462ffffff8116906301000000810465ffffffffffff1690600160481b90046001600160a01b031683565b6040805162ffffff909416845265ffffffffffff90921660208401526001600160a01b0316908201526060016101f5565b3480156103f457600080fd5b50610408610403366004611927565b610a07565b6040516101f591906119b9565b34801561042157600080fd5b5061030a60055481565b34801561043757600080fd5b506000546001600160a01b031661022d565b34801561045557600080fd5b506101926104643660046119fd565b610b8c565b34801561047557600080fd5b5061030a7f000000000000000000000000000000000000000000000000000000000000271081565b3480156104a957600080fd5b5060015461029390600160a01b900460ff1681565b3480156104ca57600080fd5b506101926104d936600461194b565b610be9565b3480156104ea57600080fd5b5061030a610c08565b3480156104ff57600080fd5b5061030a60075481565b34801561051557600080fd5b5061030a7f00000000000000000000000000000000000000000006af01ad7cb5429a00000081565b34801561054957600080fd5b5061030a60025481565b34801561055f57600080fd5b5061019261056e366004611831565b610c3b565b34801561057f57600080fd5b5060015461022d906001600160a01b031681565b34801561059f57600080fd5b5061030a60085481565b3480156105b557600080fd5b506101926105c4366004611927565b610c50565b6105d1610cc9565b600082829050600460008282546105e89190611a5a565b90915550506006546001546001600160a01b036101009092048216911660005b8085146108205785858281811061062157610621611a72565b602090810292909201356000818152600990935260409092205491955050600160481b90046001600160a01b0316156106925760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481cdd185ad95960921b60448201526064015b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000027108686838181106106c5576106c5611a72565b9050602002013511156107105760006106fe7f000000000000000000000000000000000000000000000000000000000000271086611a88565b905061070a8382610d22565b50610732565b6107328387878481811061072657610726611a72565b90506020020135610d22565b6040805133815260208101869052428183015290517f36b3725f1783bad4ff05b7f4c077c3aa68eeb23a4d054ba189db4d01ac278d399181900360600190a16040805160608101825262ffffff808716825265ffffffffffff42811660208085019182523385870190815260008b8152600990925295902093518454915195516001600160a01b0316600160481b027fffffff0000000000000000000000000000000000000000ffffffffffffffffff9690931663010000000268ffffffffffffffffff1990921693169290921791909117929092169190911790558061081881611a9f565b915050610608565b5050505061082e6001600355565b5050565b61083a610cc9565b6108473383836000610f75565b61082e6001600355565b600080805b600854610864906001611a5a565b81116108b2576000818152600960205260409020546001600160a01b03808616600160481b90920416036108a0578161089c81611a9f565b9250505b806108aa81611a9f565b915050610856565b5092915050565b6108c16114a0565b6108cb60006114fa565b565b6000806000805b8085146109fd578585828181106108ed576108ed611a72565b602090810292909201356000818152600984526040908190208151606081018352905462ffffff8116825265ffffffffffff6301000000820416958201959095526001600160a01b03600160481b909504851691810182905291965090928a1614905061096c5760405162461bcd60e51b815260040161068990611ab8565b602081015165ffffffffffff167f00000000000000000000000000000000000000000000000000000000000027108511156109d257600154600160a01b900460ff166109b78261154a565b6109c19190611ade565b6109cb9085611a5a565b93506109e8565b6109db8161154a565b6109e59085611a5a565b93505b505080806109f590611a9f565b9150506108d4565b5095945050505050565b6060600060085467ffffffffffffffff811115610a2657610a26611afd565b604051908082528060200260200182016040528015610a4f578160200160208202803683370190505b5090506000805b600854610a64906001611a5a565b8111610ae8576000818152600960205260409020546001600160a01b03808716600160481b9092041603610ad657600081815260096020526040902054835162ffffff90911690849084908110610abd57610abd611a72565b602090810291909101015281610ad281611a9f565b9250505b80610ae081611a9f565b915050610a56565b5060008167ffffffffffffffff811115610b0457610b04611afd565b604051908082528060200260200182016040528015610b2d578160200160208202803683370190505b50905060005b828114610b8357838181518110610b4c57610b4c611a72565b6020026020010151828281518110610b6657610b66611a72565b602090810291909101015280610b7b81611a9f565b915050610b33565b50949350505050565b610b946114a0565b80600254600854610ba59190611a88565b610baf9190611a5a565b600855600180546001600160a01b0385166001600160a81b031990911617600160a01b60ff8516021790556002819055505050565b505050565b610bf1610cc9565b610bfe8383836000610f75565b610be46001600355565b600062015180600554610c1b9190611b29565b62015180600554610c2c9190611b3d565b610c369190611a5a565b905090565b610c43610cc9565b6108473383836001610f75565b610c586114a0565b6001600160a01b038116610cbd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610689565b610cc6816114fa565b50565b600260035403610d1b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610689565b6002600355565b6040516331a9108f60e11b81526004810182905233906001600160a01b03841690636352211e90602401602060405180830381865afa158015610d69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8d9190611b51565b6001600160a01b031614610dd45760405162461bcd60e51b815260206004820152600e60248201526d3737ba103cb7bab9103a37b5b2b760911b6044820152606401610689565b60405163e985e9c560e01b81523360048201523060248201526001600160a01b0383169063e985e9c590604401602060405180830381865afa158015610e1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e429190611b6e565b80610ebe575060405163020604bf60e21b81526004810182905230906001600160a01b0384169063081812fc90602401602060405180830381865afa158015610e8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb39190611b51565b6001600160a01b0316145b610f0a5760405162461bcd60e51b815260206004820152601960248201527f6e6f7420617070726f76656420666f72207472616e73666572000000000000006044820152606401610689565b604051632142170760e11b8152336004820152306024820152604481018290526001600160a01b038316906342842e0e906064015b600060405180830381600087803b158015610f5957600080fd5b505af1158015610f6d573d6000803e3d6000fd5b505050505050565b600080805b80851461116957858582818110610f9357610f93611a72565b602090810292909201356000818152600984526040908190208151606081018352905462ffffff8116825265ffffffffffff6301000000820416958201959095526001600160a01b03600160481b909504851691810182905291965090928a161490506110125760405162461bcd60e51b815260040161068990611ab8565b602081015165ffffffffffff16427f000000000000000000000000000000000000000000000000000000000000271086111561107957600154600160a01b900460ff1661105e8361154a565b6110689190611ade565b6110729086611a5a565b945061108f565b6110828261154a565b61108c9086611a5a565b94505b60405180606001604052808762ffffff1681526020018265ffffffffffff1681526020018b6001600160a01b03168152506009600088815260200190815260200160002060008201518160000160006101000a81548162ffffff021916908362ffffff16021790555060208201518160000160036101000a81548165ffffffffffff021916908365ffffffffffff16021790555060408201518160000160096101000a8154816001600160a01b0302191690836001600160a01b03160217905550905050505050808061116190611a9f565b915050610f7a565b50801561136c577f00000000000000000000000000000000000000000006af01ad7cb5429a0000007f00000000000000000000000067bd6541eb488059c8b84f859b0ad0244f9f01026001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112139190611b90565b61121d9083611a5a565b11156112d2577f00000000000000000000000067bd6541eb488059c8b84f859b0ad0244f9f01026001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190611b90565b6112cf907f00000000000000000000000000000000000000000006af01ad7cb5429a000000611a88565b90505b6040516340c10f1960e01b81526001600160a01b038781166004830152602482018390527f00000000000000000000000067bd6541eb488059c8b84f859b0ad0244f9f010216906340c10f1990604401600060405180830381600087803b15801561133c57600080fd5b505af1158015611350573d6000803e3d6000fd5b5050505080600760008282546113669190611a5a565b90915550505b60065461137d9060ff166001611ba9565b611388906002611bce565b6113b59060ff167f00000000000000000000000000000000000000000006af01ad7cb5429a000000611b3d565b7f00000000000000000000000067bd6541eb488059c8b84f859b0ad0244f9f01026001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611413573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114379190611b90565b111561144557611445611575565b8215611456576114568686866115c4565b604080516001600160a01b0388168152602081018390527fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a910160405180910390a1505050505050565b6000546001600160a01b031633146108cb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610689565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000806115578342611a88565b90506000611563610c08565b61156d9083611ade565b949350505050565b600654600360ff90911610156108cb5760026005546115949190611b3d565b600555600680546000906115aa9060ff16611bf7565b91906101000a81548160ff021916908360ff160217905550565b600082829050600460008282546115db9190611a88565b90915550600090505b8083146116fa578383828181106115fd576115fd611a72565b602090810292909201356000818152600984526040908190208151606081018352905462ffffff811682526301000000810465ffffffffffff1695820195909552600160481b9094046001600160a01b0316908401819052909450331490506116785760405162461bcd60e51b815260040161068990611ab8565b60008381526009602090815260409182902080546001600160e81b031916905581516001600160a01b0389168152908101859052428183015290517fc486b9458a8637650d84d262414833a5a457bc91ae86b7da110386c8c3fa255b9181900360600190a16116e78387611701565b50806116f281611a9f565b9150506115e4565b5050505050565b7f00000000000000000000000000000000000000000000000000000000000027108211156117a0576001546001600160a01b03166342842e0e30836117667f000000000000000000000000000000000000000000000000000000000000271087611a88565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401610f3f565b600654604051632142170760e11b81523060048201526001600160a01b03838116602483015260448201859052610100909204909116906342842e0e90606401610f3f565b60008083601f8401126117f757600080fd5b50813567ffffffffffffffff81111561180f57600080fd5b6020830191508360208260051b850101111561182a57600080fd5b9250929050565b6000806020838503121561184457600080fd5b823567ffffffffffffffff81111561185b57600080fd5b611867858286016117e5565b90969095509350505050565b6001600160a01b0381168114610cc657600080fd5b6000806000806000608086880312156118a057600080fd5b85356118ab81611873565b945060208601356118bb81611873565b935060408601359250606086013567ffffffffffffffff808211156118df57600080fd5b818801915088601f8301126118f357600080fd5b81358181111561190257600080fd5b89602082850101111561191457600080fd5b9699959850939650602001949392505050565b60006020828403121561193957600080fd5b813561194481611873565b9392505050565b60008060006040848603121561196057600080fd5b833561196b81611873565b9250602084013567ffffffffffffffff81111561198757600080fd5b611993868287016117e5565b9497909650939450505050565b6000602082840312156119b257600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b818110156119f1578351835292840192918401916001016119d5565b50909695505050505050565b600080600060608486031215611a1257600080fd5b8335611a1d81611873565b9250602084013560ff81168114611a3357600080fd5b929592945050506040919091013590565b634e487b7160e01b600052601160045260246000fd5b60008219821115611a6d57611a6d611a44565b500190565b634e487b7160e01b600052603260045260246000fd5b600082821015611a9a57611a9a611a44565b500390565b600060018201611ab157611ab1611a44565b5060010190565b6020808252600c908201526b3737ba1030b71037bbb732b960a11b604082015260600190565b6000816000190483118215151615611af857611af8611a44565b500290565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b600082611b3857611b38611b13565b500690565b600082611b4c57611b4c611b13565b500490565b600060208284031215611b6357600080fd5b815161194481611873565b600060208284031215611b8057600080fd5b8151801515811461194457600080fd5b600060208284031215611ba257600080fd5b5051919050565b600060ff821660ff84168060ff03821115611bc657611bc6611a44565b019392505050565b600060ff821660ff84168160ff0481118215151615611bef57611bef611a44565b029392505050565b600060ff821660ff8103611c0d57611c0d611a44565b6001019291505056fea26469706673582212201a511f0b697389a7296c152520099f45de69cb92055c0fc10bedca3c1fc417bc64736f6c634300080f0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000e7e07f9dff6b48eba32641c53816f25368297d22000000000000000000000000000000000000000000000000000000000000270f
-----Decoded View---------------
Arg [0] : _nft (address): 0xE7e07F9Dff6b48EBA32641c53816f25368297D22
Arg [1] : _totalNftSupply (uint256): 9999
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000e7e07f9dff6b48eba32641c53816f25368297d22
Arg [1] : 000000000000000000000000000000000000000000000000000000000000270f
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.