More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 80 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Remove Stakes | 17270439 | 472 days ago | IN | 0 ETH | 0.01013808 | ||||
Add Stakes | 16894724 | 525 days ago | IN | 0 ETH | 0.00310718 | ||||
Remove Stakes | 16558983 | 573 days ago | IN | 0 ETH | 0.00346964 | ||||
Remove Stakes | 16545708 | 574 days ago | IN | 0 ETH | 0.00347417 | ||||
Remove Stakes | 16462086 | 586 days ago | IN | 0 ETH | 0.00048643 | ||||
Remove Stakes | 16376193 | 598 days ago | IN | 0 ETH | 0.00278342 | ||||
Add Stakes | 16372605 | 599 days ago | IN | 0 ETH | 0.0110542 | ||||
Add Stakes | 16155812 | 629 days ago | IN | 0 ETH | 0.00775189 | ||||
Add Stakes | 15988164 | 652 days ago | IN | 0 ETH | 0.00270276 | ||||
Remove Stakes | 15985880 | 653 days ago | IN | 0 ETH | 0.0049695 | ||||
Add Stakes | 15878394 | 668 days ago | IN | 0 ETH | 0.00240264 | ||||
Add Stakes | 15852780 | 671 days ago | IN | 0 ETH | 0.00371202 | ||||
Add Stakes | 15809018 | 677 days ago | IN | 0 ETH | 0.00413792 | ||||
Add Stakes | 15806545 | 678 days ago | IN | 0 ETH | 0.00234438 | ||||
Add Stakes | 15802219 | 678 days ago | IN | 0 ETH | 0.00639616 | ||||
Add Stakes | 15761479 | 684 days ago | IN | 0 ETH | 0.00253473 | ||||
Add Stakes | 15761231 | 684 days ago | IN | 0 ETH | 0.00270217 | ||||
Add Stakes | 15731099 | 688 days ago | IN | 0 ETH | 0.00433381 | ||||
Add Stakes | 15702775 | 692 days ago | IN | 0 ETH | 0.00154749 | ||||
Add Stakes | 15665309 | 697 days ago | IN | 0 ETH | 0.00122012 | ||||
Add Stakes | 15652745 | 699 days ago | IN | 0 ETH | 0.00135908 | ||||
Remove Stakes | 15643949 | 700 days ago | IN | 0 ETH | 0.00286956 | ||||
Add Stakes | 15638557 | 701 days ago | IN | 0 ETH | 0.00160063 | ||||
Add Stakes | 15636582 | 701 days ago | IN | 0 ETH | 0.00656876 | ||||
Remove Stakes | 15628934 | 703 days ago | IN | 0 ETH | 0.00295916 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Grill2
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/Counters.sol"; import "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol"; error CallerBlacklisted(); error CallerNotTokenOwner(); error CallerNotTokenStaker(); error StakingNotActive(); error ZeroEmissionRate(); /** * Interfaces astrobull contract */ interface ISUPER1155 { function balanceOf(address _owner, uint256 _id) external view returns (uint256); function groupBalances(uint256 groupId, address from) external view returns (uint256); function safeTransferFrom( address _from, address _to, uint256 _id, uint256 _amount, bytes calldata _data ) external; function safeBatchTransferFrom( address _from, address _to, uint256[] memory _ids, uint256[] memory _amounts, bytes memory _data ) external; } /** * Interfaces old grill contract */ interface IGRILL { struct Stake { bool status; address staker; uint256 timestamp; } function getStake(uint256 _tokenId) external view returns (Stake memory _stake); function getIdsOfAddr(address _operator) external view returns (uint256[] memory _addrStakes); } /** * @title Grill2.0 * @author Matt Carter, degendeveloper.eth * 6 June, 2022 * * The purpose of this contract is to optimize gas consumption when adding new stakes and * removing previous stakes from the initial grill contract @ 0xE11AF478aF241FAb926f4c111d50139Ae003F7fd. * * Users will use this new grill contract when adding and removing stakes. This new contract * is also responsible for counting emission tokens and setting new emission rates. * * This contract is whitelisted to move the first grill's tokens via proxy registry in the super1155 contract. * * This contract should be set as the `proxyRegistryAddress` in the parent contract. This * allows the new grill to move tokens on behalf of the old grill. */ contract Grill2 is Ownable, ERC1155Holder { using Counters for Counters.Counter; uint256 internal constant MAX_INT = 2**256 - 1; /// contract instances /// ISUPER1155 public constant Parent = ISUPER1155(0x71B11Ac923C967CD5998F23F6dae0d779A6ac8Af); IGRILL public immutable OldGrill; /// the number of times the emission rate changes /// Counters.Counter internal emChanges; /// is adding stakes allowed /// bool public isStaking = true; /// the number of stakes added & removed by each account (this contract) /// mapping(address => Counters.Counter) internal stakesAddedPerAccount; mapping(address => Counters.Counter) internal stakesRemovedPerAccount; /// each Stake by tokenId (this contract) /// mapping(uint256 => Stake) public stakeStorage; /// each tokenId by index for an account (this contract) /// mapping(address => mapping(uint256 => uint256)) public accountStakes; /// each Emission by index (this contract) /// mapping(uint256 => Emission) public emissionStorage; /// the number of emission tokens earned be each account from removed stakes /// mapping(address => uint256) public unstakedClaims; /// accounts that can not add new stakes /// mapping(address => bool) public blacklist; /// list of new proxies for Parent tokens /// mapping(address => address) public proxies; /** * Stores information for an emission change * @param rate The number of seconds to earn 1 emission token * @param timestamp The block.timestamp this emission rate is set */ struct Emission { uint256 rate; uint256 timestamp; } /** * Stores information for a stake * @param staker The address who creates this stake * @param timestamp The block.timestamp this stake is created * @param accountSlot The index for this stake in `accountStakes` */ struct Stake { address staker; uint256 timestamp; uint256 accountSlot; } /// ============ CONSTRUCTOR ============ /// /** * Initializes contract instances and sets the initial emission rate * @param _grillAddr The address for the first grill contract * @notice `1652054400` is Mon, 09 May 2022 00:00:00 GMT * @notice '3600 * 24 * 45' is the number of seconds in 45 days */ constructor(address _grillAddr) { OldGrill = IGRILL(_grillAddr); emissionStorage[emChanges.current()] = Emission(3600 * 24 * 45, 1652054400); } /// ============ OWNER ============ /// /** * Sets a proxy transferer for `account`s tokens * @param account The address whose tokens to move * @param operator The address being proxied as an approved operator for `account` * @notice The team will use this contract as a proxy for old grill tokens */ function setProxyForAccount(address account, address operator) public onlyOwner { proxies[account] = operator; } /** * Removes a proxy transferer for `account`s tokens * @param account The address losing its proxy transferer */ function removeProxyForAccount(address account) public onlyOwner { delete proxies[account]; } /** * Allows/unallows the addition of new stakes */ function toggleStaking() public onlyOwner { isStaking = !isStaking; } /** * Allows/unallows an account to add new stakes * @param account The address to set status for * @param status The status being set * @notice A staker is always able to remove their stakes regardless of blacklist status */ function blacklistAccount(address account, bool status) public onlyOwner { blacklist[account] = status; } /** * Stops emission token counting by setting an emission rate of the max-int number of seconds * @notice No tokens can be earned with an emission rate this long * @notice To continue emissions counting, the owner must set a new emission rate */ function pauseEmissions() public onlyOwner { _setEmissionRate(MAX_INT); } /** * Sets a new rate for earning emission tokens * @param _seconds The number of seconds a token must be staked for to earn 1 emission token */ function setEmissionRate(uint256 _seconds) public onlyOwner { _setEmissionRate(_seconds); } /// ============ PUBLIC ============ /// /** * Stakes an array of tokenIds with this contract to earn emission tokens * @param tokenIds An array of tokenIds to stake * @param amounts An array of amounts of each tokenId to stake * @notice Caller must `setApprovalForAll()` to true in the parent contract using this contract's address * before it can move their tokens */ function addStakes(uint256[] memory tokenIds, uint256[] memory amounts) public { if (!isStaking) { revert StakingNotActive(); } if (blacklist[msg.sender]) { revert CallerBlacklisted(); } /// @dev verifies caller owns each token /// for (uint256 i = 0; i < tokenIds.length; ++i) { uint256 _tokenId = tokenIds[i]; if (Parent.balanceOf(msg.sender, _tokenId) == 0) { revert CallerNotTokenOwner(); } /// @dev sets contract state /// _addStake(msg.sender, _tokenId); } /// @dev transfers tokens from caller to this contract /// Parent.safeBatchTransferFrom( msg.sender, address(this), tokenIds, amounts, "0x00" ); } /** * Removes an array of tokenIds staked in this contract and/or the old one * @param oldTokenIds The tokenIds being unstaked from the old contract * @param oldAmounts The number of each token being unstaked * @param newTokenIds The tokenIds being unstaked from this contract * @param newAmounts The number of each token being unstaked */ function removeStakes( uint256[] memory oldTokenIds, uint256[] memory oldAmounts, uint256[] memory newTokenIds, uint256[] memory newAmounts ) public { if (oldTokenIds.length > 0) { /// @dev verifies caller staked each token /// for (uint256 i = 0; i < oldTokenIds.length; ++i) { uint256 _tokenId = oldTokenIds[i]; IGRILL.Stake memory _thisStake = OldGrill.getStake(_tokenId); if (_thisStake.staker != msg.sender) { revert CallerNotTokenStaker(); } /// @dev increments emissions earned for caller /// unstakedClaims[msg.sender] += countEmissions(_thisStake.timestamp); } /// @dev transfers tokens from old contract to caller /// Parent.safeBatchTransferFrom( address(OldGrill), msg.sender, oldTokenIds, oldAmounts, "0x00" ); } if (newTokenIds.length > 0) { /// @dev verifies caller staked each token /// for (uint256 i = 0; i < newTokenIds.length; ++i) { uint256 _tokenId = newTokenIds[i]; if (stakeStorage[_tokenId].staker != msg.sender) { revert CallerNotTokenStaker(); } /// @dev sets contract state /// _removeStake(_tokenId); } /// @dev transfers tokens from this contract to caller /// Parent.safeBatchTransferFrom( address(this), msg.sender, newTokenIds, newAmounts, "0x00" ); } } /** * Counts the number of emission tokens a timestamp has earned * @param _timestamp The timestamp a token was staked * @return _c The number of emission tokens a stake has earned since `_timestamp` */ function countEmissions(uint256 _timestamp) public view returns (uint256 _c) { /// @dev if timestamp is before contract creation or later than now return 0 /// if ( _timestamp < emissionStorage[0].timestamp || _timestamp > block.timestamp ) { _c = 0; } else { /** * @dev finds the most recent emission rate _timestamp comes after * Example: * emChanges: *0...........1............2.....................3...........* * timeline: *(deploy)....x............x.....(timestamp).....x......(now)* */ uint256 minT; for (uint256 i = 1; i <= emChanges.current(); ++i) { if (emissionStorage[i].timestamp < _timestamp) { minT += 1; } } /// @dev counts all emissions earned starting from minT -> now /// for (uint256 i = minT; i <= emChanges.current(); ++i) { uint256 tSmall = emissionStorage[i].timestamp; uint256 tBig = emissionStorage[i + 1].timestamp; // 0 if not set yet if (i == minT) { tSmall = _timestamp; } if (i == emChanges.current()) { tBig = block.timestamp; } _c += (tBig - tSmall) / emissionStorage[i].rate; } } } /// ============ INTERNAL ============ /// /** * Helper function that sets contract state when adding a stake to this contract * @param staker The address to make the stake for * @param tokenId The tokenId being staked */ function _addStake(address staker, uint256 tokenId) internal { /// @dev increments slots filled by staker /// stakesAddedPerAccount[staker].increment(); /// @dev fills new slot (account => index => tokenId) /// accountStakes[staker][stakesAddedPerAccount[staker].current()] = tokenId; /// @dev add new stake to storage /// stakeStorage[tokenId] = Stake( staker, block.timestamp, stakesAddedPerAccount[staker].current() ); } /** * Helper function that sets contract state when removing a stake from this contract * @param tokenId The tokenId being un-staked * @notice This function is not called when removing stakes from the old contract */ function _removeStake(uint256 tokenId) internal { /// @dev copies the stake being removed /// Stake memory _thisStake = stakeStorage[tokenId]; /// @dev increments slots emptied by staker /// stakesRemovedPerAccount[_thisStake.staker].increment(); /// @dev increments emissions earned for removing this stake /// unstakedClaims[_thisStake.staker] += countEmissions(_thisStake.timestamp); /// @dev empty staker's slot (account => index => 0) /// delete accountStakes[_thisStake.staker][_thisStake.accountSlot]; /// @dev removes stake from storage /// delete stakeStorage[tokenId]; } /** * Helper function that sets contract state when emission changes occur * @param _seconds The number of seconds a token must be staked for to earn 1 emission token * @notice The emission rate cannot be 0 seconds */ function _setEmissionRate(uint256 _seconds) private { if (_seconds == 0) { revert ZeroEmissionRate(); } emChanges.increment(); emissionStorage[emChanges.current()] = Emission(_seconds, block.timestamp); } /** * Helper function that gets the number of stakes an account has active with this contract * @param account The address to lookup * @return _active The number stakes */ function _activeStakesCountPerAccount(address account) internal view returns (uint256 _active) { _active = stakesAddedPerAccount[account].current() - stakesRemovedPerAccount[account].current(); } /** * Helper function that gets the number of stakes an account has active with the old contract * @param account The address to lookup * @return _active The number of stakes not yet removed from the old contract */ function _activeStakesCountPerAccountOld(address account) internal view returns (uint256 _active) { uint256[] memory oldStakes = OldGrill.getIdsOfAddr(account); for (uint256 i = 0; i < oldStakes.length; ++i) { if (Parent.balanceOf(address(OldGrill), oldStakes[i]) == 1) { _active += 1; } } } /// ============ READ-ONLY ============ /// /** * Gets tokenIds for `account`s active stakes in this contract * @param account The address to lookup * @return _ids Array of tokenIds */ function stakedIdsPerAccount(address account) public view returns (uint256[] memory _ids) { _ids = new uint256[](_activeStakesCountPerAccount(account)); /// @dev finds all slots still filled /// uint256 found; for (uint256 i = 1; i <= stakesAddedPerAccount[account].current(); ++i) { if (accountStakes[account][i] != 0) { _ids[found++] = accountStakes[account][i]; } } } /** * Gets tokenIds for `account`s active stakes in the old contract * @param account The address to lookup * @return _ids Array of tokenIds */ function stakedIdsPerAccountOld(address account) public view returns (uint256[] memory _ids) { /// @dev gets all tokenIds account had staked /// uint256[] memory oldStakes = OldGrill.getIdsOfAddr(account); /// @dev finds all tokenIds still active in old contract /// _ids = new uint256[](_activeStakesCountPerAccountOld(account)); uint256 found; for (uint256 i = 0; i < oldStakes.length; ++i) { if (Parent.balanceOf(address(OldGrill), oldStakes[i]) == 1) { _ids[found++] = oldStakes[i]; } } } /** * Gets the total number of emission changes to date * @return _changes The current number of changes to emission rates */ function emissionChanges() external view returns (uint256 _changes) { _changes = emChanges.current(); } /** * Gets the number of emission tokens `account` has earned from their active stakes * @param account The address to lookup * @return _earned The number of claims * @notice Uses stakes from new and old contract */ function stakedClaims(address account) public view returns (uint256 _earned) { /// @dev counts emissions for each active stake in this contract /// uint256[] memory ownedIds = stakedIdsPerAccount(account); for (uint256 i; i < ownedIds.length; ++i) { _earned += countEmissions(stakeStorage[ownedIds[i]].timestamp); } /// @dev counts emissions for each active stake in old contract /// uint256[] memory ownedIdsOld = stakedIdsPerAccountOld(account); for (uint256 i; i < ownedIdsOld.length; ++i) { _earned += countEmissions(OldGrill.getStake(ownedIdsOld[i]).timestamp); } } /** * Gets the number of emission tokens `account` has earned from their active and removed stakes * @param account The address to lookup * @return _earned The number of emissions _operator has earned from all past and current stakes * @notice Uses stakes from new and old contract */ function totalClaims(address account) external view returns (uint256 _earned) { _earned = unstakedClaims[account] + stakedClaims(account); } /** * Gets the Stake object from this grill contract * @param tokenId The tokenId to get stake for * @return _s The Stake object */ function stakeStorageGetter(uint256 tokenId) public view returns (Stake memory _s) { _s = stakeStorage[tokenId]; } /** * Gets the Stake object from the old grill contract * @param tokenId The tokenId to get stake for * @return _og The old Stake object */ function stakeStorageOld(uint256 tokenId) public view returns (IGRILL.Stake memory _og) { _og = OldGrill.getStake(tokenId); } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/Counters.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "./Grill2.sol"; error BurningNotActive(); error ClaimingNotActive(); error CallerIsNotABurner(); error InsufficientClaimsRemaining(); /** * @title Burgers * @author Matt Carter * June 6, 2022 * * This contract is for accounts to claim emission tokens (burgers) from their grill stakes. * Burgers have a `tokenId` of 1 and are burnable by owner-set `burner` addresses. */ contract Burger is ERC1155, Ownable { using Strings for uint256; /// contract instances /// Grill2 public immutable TheGrill; Grill2 public SpecialGrill; /// is claiming/burning/special grill active /// bool public isClaiming = false; bool public isBurning = false; bool public isSpecial = false; /// the number of burgers minted/burned /// uint256 public totalMints; uint256 public totalBurns; /// addresses allowed to burn burgers /// mapping(address => bool) public burners; /// the number of claims used by each account /// mapping(address => uint256) public claimsUsed; /// the number of burgers burned by each account /// mapping(address => uint256) public accountBurns; /// the number of burgers burned by each burner /// mapping(address => uint256) public burnerBurns; /// ============ CONSTRUCTOR ============ /// /** * Sets the initial base URI and address for the grill * @param _URI The baseURI for each token * @param aGrill The address of the astro grill contract */ constructor(string memory _URI, address aGrill) ERC1155(_URI) { TheGrill = Grill2(aGrill); } /// ============ INTERNAL ============ /// /** * Gets the total number of burgers `account` has earned from the grill(s) * @param account The address to lookup * @return quantity The number of claims */ function _totalClaimsEarned(address account) internal view returns (uint256 quantity) { quantity += TheGrill.totalClaims(account); /// @dev additionally counts special grill stakes /// if (isSpecial) { quantity += SpecialGrill.totalClaims(account); } } /// ============ OWNER ============ /// /** * Sets the new base URI for tokens * @param _URI The new base URI * @notice Uses the format: baselink.com/{}.json */ function setURI(string memory _URI) public onlyOwner { _setURI(_URI); } /** * Toggles if claiming tokens is allowed */ function toggleClaiming() public onlyOwner { isClaiming = !isClaiming; } /** * Toggles if burning tokens is allowed */ function toggleBurning() public onlyOwner { isBurning = !isBurning; } /** * Approve an address to burn burgers * @param account The burner address * @param status The status of the approval * @notice A burner should be a contract address that correctly handles the burning of an operators tokens */ function setBurner(address account, bool status) public onlyOwner { burners[account] = status; } /** * Mints `quantity` burgers to `account` without restrictions * @param quantity The number of tokens to mint * @param account The address to mint the tokens to */ function ownerMint(uint256 quantity, address account) public onlyOwner { _mint(account, 1, quantity, "0x00"); totalMints += quantity; } /** * Toggles if the special grill is running */ function toggleSpecial() public onlyOwner { isSpecial = !isSpecial; } /** * Sets the special grill interface * @param aGrill The address of the special grill */ function setSpecial(address aGrill) public onlyOwner { SpecialGrill = Grill2(aGrill); } /// ============ PUBLIC ============ /// /** * Mints `quantity` burgers to caller * @param quantity The number of burgers caller is trying to mint */ function claimBurgers(uint256 quantity) public { if (!isClaiming) { revert ClaimingNotActive(); } if (claimsUsed[msg.sender] + quantity > _totalClaimsEarned(msg.sender)) { revert InsufficientClaimsRemaining(); } /// @dev mints `quantity` tokens with `tokenId` 1 to caller /// _mint(msg.sender, 1, quantity, "0x00"); /// @dev sets contract state /// claimsUsed[msg.sender] += quantity; totalMints += quantity; } /** * Burns burgers on behalf of `account` * @param account The address having it's burgers burned * @param quantity The number of burgers to burn * @notice Only burners may call this function */ function burnBurger(address account, uint256 quantity) public { if (!isBurning) { revert BurningNotActive(); } if (!burners[msg.sender]) { revert CallerIsNotABurner(); } /// @dev burns `quantity` tokens of `tokenId` 1 for `account` /// _burn(account, 1, quantity); /// @dev sets contract state /// totalBurns += quantity; accountBurns[account] += quantity; burnerBurns[msg.sender] += quantity; } /// ============ READ-ONLY ============ /// /** * Gets the balance of burgers for `account` * @param account The address to lookup * @return _balance The number of burgers * @notice burgers have a `tokenId` of 1 */ function balanceOf(address account) public view returns (uint256 _balance) { _balance = balanceOf(account, 1); } /** * Gets the total number of burgers in circulation * @return _totalSupply The number of burgers */ function totalSupply() public view returns (uint256 _totalSupply) { _totalSupply = totalMints - totalBurns; } /** * Gets the number of claims `account` has remaining * @param account The address to lookup * @return _remaining The number of claims */ function tokenClaimsLeft(address account) public view returns (uint256 _remaining) { _remaining = _totalClaimsEarned(account) - claimsUsed[account]; } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import "erc721a/contracts/ERC721A.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/Counters.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "./Burger.sol"; error MintingNotActive(); error AstrobullAlreadyClaimed(); /** * @title Metabulls * @author Matt Carter * June 6, 2022 * * This contract is an implementation of chiru lab's erc721a contract and is used for minting * 3d metaverse bulls. To mint a metabull, an account will input tokenIds of astrobulls * they are using to claim; meaning the account must own each astrobull or be the staker of it, * and each astrobull can only be used once. The contract will store which astrobull traits to * give each metabull. Users will burn burgers for each metabull they mint. */ contract MetaBull is ERC721A, Ownable { using Strings for uint256; /// contract instances /// Burger public immutable BurgerContract; Grill2 public immutable GrillContract; ISUPER1155 public constant Astro = ISUPER1155(0x71B11Ac923C967CD5998F23F6dae0d779A6ac8Af); address public constant OldGrill = 0xE11AF478aF241FAb926f4c111d50139Ae003F7fd; /// if minting is active /// bool public isMinting; /// if tokens are revealed /// bool public isRevealed; /// the number of burgers to burn each mint /// uint256 public burnScalar = 2; /// the number of burgers burned by this contract /// uint256 public totalBurns; /// the base uri for all tokens /// string public URI; /// if an astrobull has been claimed for yet /// mapping(uint256 => bool) public portedIds; /// which astrobull traits to give each metabull /// mapping(uint256 => uint256) public portingMeta; /// the number of burgers each account has burned /// mapping(address => uint256) public accountBurns; /// ============ CONSTRUCTOR ============ /// /** * Sets the initial base uri and address for the burger contract * @param _URI The baseURI for each token * @param burgerAddr The address of the burger contract * @param grillAddr The address of the grill contract */ constructor( string memory _URI, address burgerAddr, address grillAddr ) ERC721A("METABULLS", "MBULL") { URI = _URI; BurgerContract = Burger(burgerAddr); GrillContract = Grill2(grillAddr); } /// ============ INTERNAL ============ /// /** * Overrides tokens to start at index 1 instead of 0 * @return _id The tokenId of the first token */ function _startTokenId() internal pure override returns (uint256 _id) { _id = 1; } /// ============ OWNER ============ /// /** * Sets a new base URI for tokens * @param _URI The new baseURI for each token */ function setURI(string memory _URI) public onlyOwner { URI = _URI; } /** * Toggles if minting is allowed. */ function toggleMinting() public onlyOwner { isMinting = !isMinting; } /** * Toggles if tokens are revealed. */ function toggleReveal() public onlyOwner { isRevealed = !isRevealed; } /** * Sets the quantity of burgers an account must burn to mint each metabull * @param _burnScalar The number of burgers to burn */ function setBurnScalar(uint256 _burnScalar) public onlyOwner { burnScalar = _burnScalar; } /** * Mints `quantity` tokens to `account` * @param quantity The number of tokens to mint * @param account The address to mint the tokens to * @notice Each token an owner mints will point to a 0 in the portingMeta mapping * since it does not share traits with a minted astrobull */ function ownerMint(uint256 quantity, address account) public onlyOwner { _safeMint(account, quantity); } /// ============ PUBLIC ============ /// /** * Mints a metabull for each astrobull input * @param astrobullIds An array of astrobull IDs caller is claiming metabulls for * @notice The caller must own each astrobull ID they are claiming for; meaning it must * be removed from the grill before use */ function claimBull(uint256[] memory astrobullIds) public { if (!isMinting) { revert MintingNotActive(); } /// @dev gets the first tokenId being minted /// uint256 currentIndex = _currentIndex; for (uint256 i = 0; i < astrobullIds.length; ++i) { if (!_checkOwnerShip(msg.sender, astrobullIds[i])) { revert CallerNotTokenOwner(); } if (portedIds[astrobullIds[i]]) { revert AstrobullAlreadyClaimed(); } /// @dev sets the astrobull traits to give each metabull being minted /// portingMeta[currentIndex] = astrobullIds[i]; /// @dev sets contract state /// portedIds[astrobullIds[i]] = true; /// @dev sets the next tokenId being minted /// currentIndex += 1; } /// burn caller's burgers /// uint256 toBurn = burnScalar * astrobullIds.length; BurgerContract.burnBurger(msg.sender, toBurn); /// sets contract state /// totalBurns += toBurn; accountBurns[msg.sender] += toBurn; /// mint metabulls to caller /// _safeMint(msg.sender, astrobullIds.length); } /// ============ INTERNAL ============ /// /** * Checks if `account` is the owner or staker of `tokenId` * @param account The address to check ownership for * @param tokenId The tokenId to check ownership of * @return _b If `account` is the owner or staker of `tokenId` */ function _checkOwnerShip(address account, uint256 tokenId) internal view returns (bool _b) { _b = false; /// @dev first checks if account owns token /// if (Astro.balanceOf(account, tokenId) == 1) { _b = true; } /// @dev next, checks if token is staked in the old grill and caller is staker /// else if (Astro.balanceOf(address(OldGrill), tokenId) == 1) { if (GrillContract.stakeStorageOld(tokenId).staker == account) { _b = true; } } /// @dev last, checks if token is staked in current grill and caller is staker /// else if (GrillContract.stakeStorageGetter(tokenId).staker == account) { _b = true; } } /// ============ READ-ONLY ============ /// /** * Gets a token's URI * @param _tokenId The tokenId to lookup * @return _URI The token's uri */ function tokenURI(uint256 _tokenId) public view override returns (string memory _URI) { if (isRevealed) { _URI = string(abi.encodePacked(URI, _tokenId.toString(), ".json")); } else { _URI = URI; } } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "./Burger.sol"; error ExceedsMaxClaims(); error InvalidTokenAmount(); error CallerIsNotTokenOwner(); error CallerNotInCommunity(); /** * @title Physical Bulls * @author Matt Carter * June 6, 2022 * * This contract handles the payment and verification for pre-ordering physical bulls. Users * will pre-order physical bulls by exchanging erc20 tokens and burning burgers. */ contract PhysicalBull is Ownable { using Strings for uint256; using SafeERC20 for IERC20; /// contract instances /// IERC20 public erc20; Burger public immutable BurgerContract; Grill2 public immutable GrillContract; ISUPER1155 public constant Astro = ISUPER1155(0x71B11Ac923C967CD5998F23F6dae0d779A6ac8Af); /// if claiming is active /// bool public isClaiming = false; /// the current erc20 payment receiver /// address public vault; /// the number of physical bulls claimed /// uint256 public totalClaims; /// the max number of claims an account can make /// uint256 public maxClaims = 3; /// the number of burgers burned by this contract /// uint256 public totalBurns; /// the number of burgers to burn for 1 physical bull /// uint256 public burnScalar = 1; /// the amount of erc20 tokens to claim 1 physical bull /// uint256 public erc20Cost = 100000000; // 100.000000 $USDC /// the number of burgers each account has burned /// mapping(address => uint256) public accountBurns; /// the number of physcal bulls each account has claimed /// mapping(address => uint256) public accountClaims; /** * @param _vault The address to receive erc20 tokens * @param _erc20 The contract address of the erc20 contract to use for payments * @param _burger The address of the burger contract * @param _grill The address of the new grill contract */ constructor( address _vault, address _erc20, address _burger, address _grill ) { vault = _vault; erc20 = IERC20(_erc20); BurgerContract = Burger(_burger); GrillContract = Grill2(_grill); } /// ============ OWNER ============ /// /** * Toggles if claiming is active */ function toggleClaiming() public onlyOwner { isClaiming = !isClaiming; } /** * Sets the cost for each bull claim * @param _erc20Cost The number of erc20 tokens to transfer */ function setERC20Cost(uint256 _erc20Cost) public onlyOwner { erc20Cost = _erc20Cost; } /** * Sets the erc20 contract address to use for payments * @param _erc20 The erc20 contract address */ function setERC20Address(address _erc20) public onlyOwner { erc20 = IERC20(_erc20); } /** * Sets the number of burgers to burn for each bull claim * @param _burnScalar The number of burgers to burn */ function setBurnScalar(uint256 _burnScalar) public onlyOwner { burnScalar = _burnScalar; } /** * Sets the limit for the max number of claims per account * @param _maxClaims The max number of claims per account */ function setMaxClaims(uint256 _maxClaims) public onlyOwner { maxClaims = _maxClaims; } /** * Sets the address for receiving erc20 payments * @param _vault The address to receive payments */ function setVault(address _vault) public onlyOwner { vault = _vault; } /// ============ INTERNAL ============ /// /** * Checks if `account` owns any astrobulls or has any active stakes * @param account The address to lookup * @return _b If `account` owns or is the staker of > 0 astrobulls * @notice Checks both old and new grill contracts for active stakes */ function _checkCommunityStatus(address account) internal view returns (bool _b) { _b = false; /// @dev first check if caller owns > 0 astrobulls /// if (Astro.groupBalances(1, account) > 0) { _b = true; } /// @dev next, check if caller has any active stakes in the old grill /// else if (GrillContract.stakedIdsPerAccountOld(account).length > 0) { _b = true; } /// @dev lastly, check if caller has any active stakes in the new grill /// else if (GrillContract.stakedIdsPerAccount(account).length > 0) { _b = true; } } /// ============ PUBLIC ============ /// /** * Claims `quantity` number of physical bulls if caller owns > 0 astrobulls * @param quantity The number of bulls to claim * @notice Caller will send `erc20Cost` * `quantity` tokens to `vault` * @notice Caller must give this contract a sufficient allowance to send their erc20 tokens */ function claimBulls(uint256 quantity) public { if (!isClaiming) { revert ClaimingNotActive(); } if (!_checkCommunityStatus(msg.sender)) { revert CallerNotInCommunity(); } if (accountClaims[msg.sender] + quantity > maxClaims) { revert ExceedsMaxClaims(); } if (quantity == 0) { revert InvalidTokenAmount(); } /// @dev sends erc20 tokens from caller to vault /// erc20.safeTransferFrom(msg.sender, vault, quantity * erc20Cost); /// @dev burns caller's burgers /// uint256 toBurn = burnScalar * quantity; BurgerContract.burnBurger(msg.sender, burnScalar * quantity); /// @dev sets contract state /// totalBurns += toBurn; accountBurns[msg.sender] += toBurn; totalClaims += quantity; accountClaims[msg.sender] += quantity; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; import "./IERC1155.sol"; import "./IERC1155Receiver.sol"; import "./extensions/IERC1155MetadataURI.sol"; import "../../utils/Address.sol"; import "../../utils/Context.sol"; import "../../utils/introspection/ERC165.sol"; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: balance query for the zero address"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not owner nor approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: transfer caller is not owner nor approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, to, ids, amounts, data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn( address from, uint256 id, uint256 amount ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155Receiver.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; import "../IERC1155.sol"; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return 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); } } } }
// 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/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts 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 (last updated v4.5.0) (token/ERC1155/utils/ERC1155Holder.sol) pragma solidity ^0.8.0; import "./ERC1155Receiver.sol"; /** * Simple implementation of `ERC1155Receiver` that will allow a contract to hold ERC1155 tokens. * * IMPORTANT: When inheriting this contract, you must include a way to use the received tokens, otherwise they will be * stuck. * * @dev _Available since v3.1._ */ contract ERC1155Holder is ERC1155Receiver { function onERC1155Received( address, address, uint256, uint256, bytes memory ) public virtual override returns (bytes4) { return this.onERC1155Received.selector; } function onERC1155BatchReceived( address, address, uint256[] memory, uint256[] memory, bytes memory ) public virtual override returns (bytes4) { return this.onERC1155BatchReceived.selector; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/utils/ERC1155Receiver.sol) pragma solidity ^0.8.0; import "../IERC1155Receiver.sol"; import "../../../utils/introspection/ERC165.sol"; /** * @dev _Available since v3.1._ */ abstract contract ERC1155Receiver is ERC165, IERC1155Receiver { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (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 (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 // ERC721A Contracts v3.3.0 // Creator: Chiru Labs pragma solidity ^0.8.4; import './IERC721A.sol'; import '@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol'; import '@openzeppelin/contracts/utils/Address.sol'; import '@openzeppelin/contracts/utils/Context.sol'; import '@openzeppelin/contracts/utils/Strings.sol'; import '@openzeppelin/contracts/utils/introspection/ERC165.sol'; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721A { using Address for address; using Strings for uint256; // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner) if(!isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.isContract()) if(!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex < end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { AddressData storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} }
// SPDX-License-Identifier: MIT // ERC721A Contracts v3.3.0 // Creator: Chiru Labs pragma solidity ^0.8.4; import '@openzeppelin/contracts/token/ERC721/IERC721.sol'; import '@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol'; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A is IERC721, IERC721Metadata { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.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 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 Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_grillAddr","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"CallerBlacklisted","type":"error"},{"inputs":[],"name":"CallerNotTokenOwner","type":"error"},{"inputs":[],"name":"CallerNotTokenStaker","type":"error"},{"inputs":[],"name":"StakingNotActive","type":"error"},{"inputs":[],"name":"ZeroEmissionRate","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"OldGrill","outputs":[{"internalType":"contract IGRILL","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Parent","outputs":[{"internalType":"contract ISUPER1155","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"accountStakes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"addStakes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"blacklistAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"countEmissions","outputs":[{"internalType":"uint256","name":"_c","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emissionChanges","outputs":[{"internalType":"uint256","name":"_changes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"emissionStorage","outputs":[{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isStaking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseEmissions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"proxies","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeProxyForAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"oldTokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"oldAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"newTokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"newAmounts","type":"uint256[]"}],"name":"removeStakes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_seconds","type":"uint256"}],"name":"setEmissionRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"setProxyForAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakeStorage","outputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"accountSlot","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"stakeStorageGetter","outputs":[{"components":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"accountSlot","type":"uint256"}],"internalType":"struct Grill2.Stake","name":"_s","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"stakeStorageOld","outputs":[{"components":[{"internalType":"bool","name":"status","type":"bool"},{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"internalType":"struct IGRILL.Stake","name":"_og","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"stakedClaims","outputs":[{"internalType":"uint256","name":"_earned","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"stakedIdsPerAccount","outputs":[{"internalType":"uint256[]","name":"_ids","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"stakedIdsPerAccountOld","outputs":[{"internalType":"uint256[]","name":"_ids","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"totalClaims","outputs":[{"internalType":"uint256","name":"_earned","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"unstakedClaims","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a06040526002805460ff191660011790553480156200001e57600080fd5b506040516200210938038062002109833981016040819052620000419162000116565b6200004c33620000c2565b806001600160a01b03166080816001600160a01b0316815250506040518060400160405280623b538081526020016362785980815250600760006200009d60016200011260201b620014921760201c565b8152602080820192909252604001600020825181559101516001909101555062000148565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5490565b6000602082840312156200012957600080fd5b81516001600160a01b03811681146200014157600080fd5b9392505050565b608051611f6d6200019c600039600081816104ed0152818161083f015281816109c401528181610b2401528181610c66015281816110110152818161110f0152818161168401526117340152611f6d6000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c8063b171b9c11161010f578063dec72344116100a2578063f2fde38b11610071578063f2fde38b1461052e578063f3bcbf6314610541578063f92b33211461054e578063f9f92be41461058a57600080fd5b8063dec72344146104c2578063e1c7d174146104d5578063edaab4f5146104e8578063f23a6e611461050f57600080fd5b8063c4ede050116100de578063c4ede0501461046e578063cc0d62ec14610481578063cfa8430e14610494578063d3c8dd69146104a757600080fd5b8063b171b9c1146103cf578063baa708e4146103fa578063bc197c811461040d578063c45527911461044557600080fd5b80634054ed9011610187578063715018a611610156578063715018a61461033157806372427494146103395780638da5cb5b14610397578063a1bdb15e146103bc57600080fd5b80634054ed90146102ce57806345e4a118146102e15780636188bae3146103215780636c33bced1461032957600080fd5b80632d5a5d34116101c35780632d5a5d3414610260578063313dd4b01461027557806337cb4ba9146102b35780633b8105b3146102c657600080fd5b806301ffc9a7146101ea5780630b076c64146102125780632438203414610232575b600080fd5b6101fd6101f8366004611814565b6105ad565b60405190151581526020015b60405180910390f35b61022561022036600461185a565b6105e4565b60405161020991906118b2565b61025261024036600461185a565b60086020526000908152604090205481565b604051908152602001610209565b61027361026e3660046118d3565b6106e5565b005b61028861028336600461190c565b610743565b6040805182516001600160a01b03168152602080840151908201529181015190820152606001610209565b6102526102c136600461185a565b6107b2565b610273610921565b6102526102dc36600461185a565b61095f565b6102f46102ef36600461190c565b61098d565b604080518251151581526020808401516001600160a01b0316908201529181015190820152606001610209565b610252610a3e565b610273610a4e565b610273610a85565b61037261034736600461190c565b6005602052600090815260409020805460018201546002909201546001600160a01b03909116919083565b604080516001600160a01b039094168452602084019290925290820152606001610209565b6000546001600160a01b03165b6040516001600160a01b039091168152602001610209565b6102736103ca36600461190c565b610ab9565b6102526103dd366004611925565b600660209081526000928352604080842090915290825290205481565b610273610408366004611a27565b610aef565b61042c61041b366004611b44565b63bc197c8160e01b95945050505050565b6040516001600160e01b03199091168152602001610209565b6103a461045336600461185a565b600a602052600090815260409020546001600160a01b031681565b61027361047c366004611bf2565b610dc6565b61022561048f36600461185a565b610fec565b6102526104a236600461190c565b611226565b6103a47371b11ac923c967cd5998f23f6dae0d779a6ac8af81565b6102736104d036600461185a565b611351565b6102736104e3366004611c56565b6113a2565b6103a47f000000000000000000000000000000000000000000000000000000000000000081565b61042c61051d366004611c84565b63f23a6e6160e01b95945050505050565b61027361053c36600461185a565b6113fa565b6002546101fd9060ff1681565b61057561055c36600461190c565b6007602052600090815260409020805460019091015482565b60408051928352602083019190915201610209565b6101fd61059836600461185a565b60096020526000908152604090205460ff1681565b60006001600160e01b03198216630271189760e51b14806105de57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606105ef82611496565b67ffffffffffffffff81111561060757610607611951565b604051908082528060200260200182016040528015610630578160200160208202803683370190505b509050600060015b6001600160a01b03841660009081526003602052604090205481116106de576001600160a01b0384166000908152600660209081526040808320848452909152902054156106ce576001600160a01b038416600090815260066020908152604080832084845290915290205483836106af81611d03565b9450815181106106c1576106c1611d1e565b6020026020010181815250505b6106d781611d03565b9050610638565b5050919050565b6000546001600160a01b031633146107185760405162461bcd60e51b815260040161070f90611d34565b60405180910390fd5b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b610770604051806060016040528060006001600160a01b0316815260200160008152602001600081525090565b50600090815260056020908152604091829020825160608101845281546001600160a01b03168152600182015492810192909252600201549181019190915290565b6000806107be836105e4565b905060005b815181101561082057610804600560008484815181106107e5576107e5611d1e565b6020026020010151815260200190815260200160002060010154611226565b61080e9084611d69565b925061081981611d03565b90506107c3565b50600061082c84610fec565b905060005b8151811015610919576108fd7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ce325bf884848151811061087e5761087e611d1e565b60200260200101516040518263ffffffff1660e01b81526004016108a491815260200190565b60606040518083038186803b1580156108bc57600080fd5b505afa1580156108d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f49190611d81565b60400151611226565b6109079085611d69565b935061091281611d03565b9050610831565b505050919050565b6000546001600160a01b0316331461094b5760405162461bcd60e51b815260040161070f90611d34565b6002805460ff19811660ff90911615179055565b600061096a826107b2565b6001600160a01b0383166000908152600860205260409020546105de9190611d69565b604080516060810182526000808252602082018190528183015290516319c64b7f60e31b8152600481018390526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063ce325bf89060240160606040518083038186803b158015610a0657600080fd5b505afa158015610a1a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105de9190611d81565b6000610a4960015490565b905090565b6000546001600160a01b03163314610a785760405162461bcd60e51b815260040161070f90611d34565b610a836000196114c4565b565b6000546001600160a01b03163314610aaf5760405162461bcd60e51b815260040161070f90611d34565b610a836000611533565b6000546001600160a01b03163314610ae35760405162461bcd60e51b815260040161070f90611d34565b610aec816114c4565b50565b835115610cc75760005b8451811015610c36576000858281518110610b1657610b16611d1e565b6020026020010151905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ce325bf8836040518263ffffffff1660e01b8152600401610b7091815260200190565b60606040518083038186803b158015610b8857600080fd5b505afa158015610b9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc09190611d81565b60208101519091506001600160a01b03163314610bf057604051633bf36cdd60e11b815260040160405180910390fd5b610bfd8160400151611226565b3360009081526008602052604081208054909190610c1c908490611d69565b92505081905550505080610c2f90611d03565b9050610af9565b50604051631759616b60e11b81527371b11ac923c967cd5998f23f6dae0d779a6ac8af90632eb2c2d690610c94907f000000000000000000000000000000000000000000000000000000000000000090339089908990600401611dec565b600060405180830381600087803b158015610cae57600080fd5b505af1158015610cc2573d6000803e3d6000fd5b505050505b815115610dc05760005b8251811015610d4f576000838281518110610cee57610cee611d1e565b602090810291909101810151600081815260059092526040909120549091506001600160a01b03163314610d3557604051633bf36cdd60e11b815260040160405180910390fd5b610d3e81611583565b50610d4881611d03565b9050610cd1565b50604051631759616b60e11b81527371b11ac923c967cd5998f23f6dae0d779a6ac8af90632eb2c2d690610d8d903090339087908790600401611dec565b600060405180830381600087803b158015610da757600080fd5b505af1158015610dbb573d6000803e3d6000fd5b505050505b50505050565b60025460ff16610de957604051631a4a6f3b60e21b815260040160405180910390fd5b3360009081526009602052604090205460ff1615610e1a5760405163930bd21960e01b815260040160405180910390fd5b60005b8251811015610f78576000838281518110610e3a57610e3a611d1e565b6020908102919091010151604051627eeac760e11b8152336004820152602481018290529091507371b11ac923c967cd5998f23f6dae0d779a6ac8af9062fdd58e9060440160206040518083038186803b158015610e9757600080fd5b505afa158015610eab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ecf9190611e54565b610eec5760405163b23b68b760e01b815260040160405180910390fd5b33600081815260036020908152604080832080546001908101808355600685528386209086528452828520879055825160608101845295865242868501908152915486840190815296855260059093529220925183546001600160a01b0319166001600160a01b039091161783559051908201559051600290910155610f7181611d03565b9050610e1d565b50604051631759616b60e11b81527371b11ac923c967cd5998f23f6dae0d779a6ac8af90632eb2c2d690610fb6903390309087908790600401611dec565b600060405180830381600087803b158015610fd057600080fd5b505af1158015610fe4573d6000803e3d6000fd5b505050505050565b604051632ddfcec960e21b81526001600160a01b0382811660048301526060916000917f0000000000000000000000000000000000000000000000000000000000000000169063b77f3b249060240160006040518083038186803b15801561105357600080fd5b505afa158015611067573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261108f9190810190611e6d565b905061109a83611660565b67ffffffffffffffff8111156110b2576110b2611951565b6040519080825280602002602001820160405280156110db578160200160208202803683370190505b5091506000805b8251811015610919577371b11ac923c967cd5998f23f6dae0d779a6ac8af6001600160a01b031662fdd58e7f000000000000000000000000000000000000000000000000000000000000000085848151811061114057611140611d1e565b60200260200101516040518363ffffffff1660e01b81526004016111799291906001600160a01b03929092168252602082015260400190565b60206040518083038186803b15801561119157600080fd5b505afa1580156111a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c99190611e54565b60011415611216578281815181106111e3576111e3611d1e565b60200260200101518483806111f790611d03565b94508151811061120957611209611d1e565b6020026020010181815250505b61121f81611d03565b90506110e2565b600080805260076020527f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6e05482108061125e57504282115b1561126b57506000919050565b600060015b60015481116112b0576000818152600760205260409020600101548411156112a05761129d600183611d69565b91505b6112a981611d03565b9050611270565b50805b60015481116106de576000818152600760208190526040822060019081015492919082906112e2908690611d69565b815260200190815260200160002060010154905083831415611302578591505b60015483141561130f5750425b6000838152600760205260409020546113288383611efe565b6113329190611f15565b61133c9086611d69565b945050508061134a90611d03565b90506112b3565b6000546001600160a01b0316331461137b5760405162461bcd60e51b815260040161070f90611d34565b6001600160a01b03166000908152600a6020526040902080546001600160a01b0319169055565b6000546001600160a01b031633146113cc5760405162461bcd60e51b815260040161070f90611d34565b6001600160a01b039182166000908152600a6020526040902080546001600160a01b03191691909216179055565b6000546001600160a01b031633146114245760405162461bcd60e51b815260040161070f90611d34565b6001600160a01b0381166114895760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161070f565b610aec81611533565b5490565b6001600160a01b03811660009081526004602090815260408083205460039092528220546105de9190611efe565b806114e2576040516332ab910d60e21b815260040160405180910390fd5b6114f0600180546001019055565b6040518060400160405280828152602001428152506007600061151260015490565b81526020808201929092526040016000208251815591015160019091015550565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000818152600560209081526040808320815160608101835281546001600160a01b03168082526001830154828601526002909201548184015290845260049092529091206115d59080546001019055565b6115e28160200151611226565b81516001600160a01b03166000908152600860205260408120805490919061160b908490611d69565b909155505080516001600160a01b031660009081526006602090815260408083209381015183529281528282208290559281526005909252812080546001600160a01b03191681556001810182905560020155565b604051632ddfcec960e21b81526001600160a01b03828116600483015260009182917f0000000000000000000000000000000000000000000000000000000000000000169063b77f3b249060240160006040518083038186803b1580156116c657600080fd5b505afa1580156116da573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117029190810190611e6d565b905060005b81518110156106de577371b11ac923c967cd5998f23f6dae0d779a6ac8af6001600160a01b031662fdd58e7f000000000000000000000000000000000000000000000000000000000000000084848151811061176557611765611d1e565b60200260200101516040518363ffffffff1660e01b815260040161179e9291906001600160a01b03929092168252602082015260400190565b60206040518083038186803b1580156117b657600080fd5b505afa1580156117ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ee9190611e54565b6001141561180457611801600184611d69565b92505b61180d81611d03565b9050611707565b60006020828403121561182657600080fd5b81356001600160e01b03198116811461183e57600080fd5b9392505050565b6001600160a01b0381168114610aec57600080fd5b60006020828403121561186c57600080fd5b813561183e81611845565b600081518084526020808501945080840160005b838110156118a75781518752958201959082019060010161188b565b509495945050505050565b60208152600061183e6020830184611877565b8015158114610aec57600080fd5b600080604083850312156118e657600080fd5b82356118f181611845565b91506020830135611901816118c5565b809150509250929050565b60006020828403121561191e57600080fd5b5035919050565b6000806040838503121561193857600080fd5b823561194381611845565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561199057611990611951565b604052919050565b600067ffffffffffffffff8211156119b2576119b2611951565b5060051b60200190565b600082601f8301126119cd57600080fd5b813560206119e26119dd83611998565b611967565b82815260059290921b84018101918181019086841115611a0157600080fd5b8286015b84811015611a1c5780358352918301918301611a05565b509695505050505050565b60008060008060808587031215611a3d57600080fd5b843567ffffffffffffffff80821115611a5557600080fd5b611a61888389016119bc565b95506020870135915080821115611a7757600080fd5b611a83888389016119bc565b94506040870135915080821115611a9957600080fd5b611aa5888389016119bc565b93506060870135915080821115611abb57600080fd5b50611ac8878288016119bc565b91505092959194509250565b600082601f830112611ae557600080fd5b813567ffffffffffffffff811115611aff57611aff611951565b611b12601f8201601f1916602001611967565b818152846020838601011115611b2757600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215611b5c57600080fd5b8535611b6781611845565b94506020860135611b7781611845565b9350604086013567ffffffffffffffff80821115611b9457600080fd5b611ba089838a016119bc565b94506060880135915080821115611bb657600080fd5b611bc289838a016119bc565b93506080880135915080821115611bd857600080fd5b50611be588828901611ad4565b9150509295509295909350565b60008060408385031215611c0557600080fd5b823567ffffffffffffffff80821115611c1d57600080fd5b611c29868387016119bc565b93506020850135915080821115611c3f57600080fd5b50611c4c858286016119bc565b9150509250929050565b60008060408385031215611c6957600080fd5b8235611c7481611845565b9150602083013561190181611845565b600080600080600060a08688031215611c9c57600080fd5b8535611ca781611845565b94506020860135611cb781611845565b93506040860135925060608601359150608086013567ffffffffffffffff811115611ce157600080fd5b611be588828901611ad4565b634e487b7160e01b600052601160045260246000fd5b6000600019821415611d1757611d17611ced565b5060010190565b634e487b7160e01b600052603260045260246000fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115611d7c57611d7c611ced565b500190565b600060608284031215611d9357600080fd5b6040516060810181811067ffffffffffffffff82111715611db657611db6611951565b6040528251611dc4816118c5565b81526020830151611dd481611845565b60208201526040928301519281019290925250919050565b6001600160a01b0385811682528416602082015260a060408201819052600090611e1890830185611877565b8281036060840152611e2a8185611877565b838103608090940193909352505060048152630307830360e41b6020820152604001949350505050565b600060208284031215611e6657600080fd5b5051919050565b60006020808385031215611e8057600080fd5b825167ffffffffffffffff811115611e9757600080fd5b8301601f81018513611ea857600080fd5b8051611eb66119dd82611998565b81815260059190911b82018301908381019087831115611ed557600080fd5b928401925b82841015611ef357835182529284019290840190611eda565b979650505050505050565b600082821015611f1057611f10611ced565b500390565b600082611f3257634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220e6a5659d603c78c65ca039968ac929b129df6ce8c9ffeebe041abf0db1e3a3b264736f6c63430008090033000000000000000000000000e11af478af241fab926f4c111d50139ae003f7fd
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101e55760003560e01c8063b171b9c11161010f578063dec72344116100a2578063f2fde38b11610071578063f2fde38b1461052e578063f3bcbf6314610541578063f92b33211461054e578063f9f92be41461058a57600080fd5b8063dec72344146104c2578063e1c7d174146104d5578063edaab4f5146104e8578063f23a6e611461050f57600080fd5b8063c4ede050116100de578063c4ede0501461046e578063cc0d62ec14610481578063cfa8430e14610494578063d3c8dd69146104a757600080fd5b8063b171b9c1146103cf578063baa708e4146103fa578063bc197c811461040d578063c45527911461044557600080fd5b80634054ed9011610187578063715018a611610156578063715018a61461033157806372427494146103395780638da5cb5b14610397578063a1bdb15e146103bc57600080fd5b80634054ed90146102ce57806345e4a118146102e15780636188bae3146103215780636c33bced1461032957600080fd5b80632d5a5d34116101c35780632d5a5d3414610260578063313dd4b01461027557806337cb4ba9146102b35780633b8105b3146102c657600080fd5b806301ffc9a7146101ea5780630b076c64146102125780632438203414610232575b600080fd5b6101fd6101f8366004611814565b6105ad565b60405190151581526020015b60405180910390f35b61022561022036600461185a565b6105e4565b60405161020991906118b2565b61025261024036600461185a565b60086020526000908152604090205481565b604051908152602001610209565b61027361026e3660046118d3565b6106e5565b005b61028861028336600461190c565b610743565b6040805182516001600160a01b03168152602080840151908201529181015190820152606001610209565b6102526102c136600461185a565b6107b2565b610273610921565b6102526102dc36600461185a565b61095f565b6102f46102ef36600461190c565b61098d565b604080518251151581526020808401516001600160a01b0316908201529181015190820152606001610209565b610252610a3e565b610273610a4e565b610273610a85565b61037261034736600461190c565b6005602052600090815260409020805460018201546002909201546001600160a01b03909116919083565b604080516001600160a01b039094168452602084019290925290820152606001610209565b6000546001600160a01b03165b6040516001600160a01b039091168152602001610209565b6102736103ca36600461190c565b610ab9565b6102526103dd366004611925565b600660209081526000928352604080842090915290825290205481565b610273610408366004611a27565b610aef565b61042c61041b366004611b44565b63bc197c8160e01b95945050505050565b6040516001600160e01b03199091168152602001610209565b6103a461045336600461185a565b600a602052600090815260409020546001600160a01b031681565b61027361047c366004611bf2565b610dc6565b61022561048f36600461185a565b610fec565b6102526104a236600461190c565b611226565b6103a47371b11ac923c967cd5998f23f6dae0d779a6ac8af81565b6102736104d036600461185a565b611351565b6102736104e3366004611c56565b6113a2565b6103a47f000000000000000000000000e11af478af241fab926f4c111d50139ae003f7fd81565b61042c61051d366004611c84565b63f23a6e6160e01b95945050505050565b61027361053c36600461185a565b6113fa565b6002546101fd9060ff1681565b61057561055c36600461190c565b6007602052600090815260409020805460019091015482565b60408051928352602083019190915201610209565b6101fd61059836600461185a565b60096020526000908152604090205460ff1681565b60006001600160e01b03198216630271189760e51b14806105de57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606105ef82611496565b67ffffffffffffffff81111561060757610607611951565b604051908082528060200260200182016040528015610630578160200160208202803683370190505b509050600060015b6001600160a01b03841660009081526003602052604090205481116106de576001600160a01b0384166000908152600660209081526040808320848452909152902054156106ce576001600160a01b038416600090815260066020908152604080832084845290915290205483836106af81611d03565b9450815181106106c1576106c1611d1e565b6020026020010181815250505b6106d781611d03565b9050610638565b5050919050565b6000546001600160a01b031633146107185760405162461bcd60e51b815260040161070f90611d34565b60405180910390fd5b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b610770604051806060016040528060006001600160a01b0316815260200160008152602001600081525090565b50600090815260056020908152604091829020825160608101845281546001600160a01b03168152600182015492810192909252600201549181019190915290565b6000806107be836105e4565b905060005b815181101561082057610804600560008484815181106107e5576107e5611d1e565b6020026020010151815260200190815260200160002060010154611226565b61080e9084611d69565b925061081981611d03565b90506107c3565b50600061082c84610fec565b905060005b8151811015610919576108fd7f000000000000000000000000e11af478af241fab926f4c111d50139ae003f7fd6001600160a01b031663ce325bf884848151811061087e5761087e611d1e565b60200260200101516040518263ffffffff1660e01b81526004016108a491815260200190565b60606040518083038186803b1580156108bc57600080fd5b505afa1580156108d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f49190611d81565b60400151611226565b6109079085611d69565b935061091281611d03565b9050610831565b505050919050565b6000546001600160a01b0316331461094b5760405162461bcd60e51b815260040161070f90611d34565b6002805460ff19811660ff90911615179055565b600061096a826107b2565b6001600160a01b0383166000908152600860205260409020546105de9190611d69565b604080516060810182526000808252602082018190528183015290516319c64b7f60e31b8152600481018390526001600160a01b037f000000000000000000000000e11af478af241fab926f4c111d50139ae003f7fd169063ce325bf89060240160606040518083038186803b158015610a0657600080fd5b505afa158015610a1a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105de9190611d81565b6000610a4960015490565b905090565b6000546001600160a01b03163314610a785760405162461bcd60e51b815260040161070f90611d34565b610a836000196114c4565b565b6000546001600160a01b03163314610aaf5760405162461bcd60e51b815260040161070f90611d34565b610a836000611533565b6000546001600160a01b03163314610ae35760405162461bcd60e51b815260040161070f90611d34565b610aec816114c4565b50565b835115610cc75760005b8451811015610c36576000858281518110610b1657610b16611d1e565b6020026020010151905060007f000000000000000000000000e11af478af241fab926f4c111d50139ae003f7fd6001600160a01b031663ce325bf8836040518263ffffffff1660e01b8152600401610b7091815260200190565b60606040518083038186803b158015610b8857600080fd5b505afa158015610b9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc09190611d81565b60208101519091506001600160a01b03163314610bf057604051633bf36cdd60e11b815260040160405180910390fd5b610bfd8160400151611226565b3360009081526008602052604081208054909190610c1c908490611d69565b92505081905550505080610c2f90611d03565b9050610af9565b50604051631759616b60e11b81527371b11ac923c967cd5998f23f6dae0d779a6ac8af90632eb2c2d690610c94907f000000000000000000000000e11af478af241fab926f4c111d50139ae003f7fd90339089908990600401611dec565b600060405180830381600087803b158015610cae57600080fd5b505af1158015610cc2573d6000803e3d6000fd5b505050505b815115610dc05760005b8251811015610d4f576000838281518110610cee57610cee611d1e565b602090810291909101810151600081815260059092526040909120549091506001600160a01b03163314610d3557604051633bf36cdd60e11b815260040160405180910390fd5b610d3e81611583565b50610d4881611d03565b9050610cd1565b50604051631759616b60e11b81527371b11ac923c967cd5998f23f6dae0d779a6ac8af90632eb2c2d690610d8d903090339087908790600401611dec565b600060405180830381600087803b158015610da757600080fd5b505af1158015610dbb573d6000803e3d6000fd5b505050505b50505050565b60025460ff16610de957604051631a4a6f3b60e21b815260040160405180910390fd5b3360009081526009602052604090205460ff1615610e1a5760405163930bd21960e01b815260040160405180910390fd5b60005b8251811015610f78576000838281518110610e3a57610e3a611d1e565b6020908102919091010151604051627eeac760e11b8152336004820152602481018290529091507371b11ac923c967cd5998f23f6dae0d779a6ac8af9062fdd58e9060440160206040518083038186803b158015610e9757600080fd5b505afa158015610eab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ecf9190611e54565b610eec5760405163b23b68b760e01b815260040160405180910390fd5b33600081815260036020908152604080832080546001908101808355600685528386209086528452828520879055825160608101845295865242868501908152915486840190815296855260059093529220925183546001600160a01b0319166001600160a01b039091161783559051908201559051600290910155610f7181611d03565b9050610e1d565b50604051631759616b60e11b81527371b11ac923c967cd5998f23f6dae0d779a6ac8af90632eb2c2d690610fb6903390309087908790600401611dec565b600060405180830381600087803b158015610fd057600080fd5b505af1158015610fe4573d6000803e3d6000fd5b505050505050565b604051632ddfcec960e21b81526001600160a01b0382811660048301526060916000917f000000000000000000000000e11af478af241fab926f4c111d50139ae003f7fd169063b77f3b249060240160006040518083038186803b15801561105357600080fd5b505afa158015611067573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261108f9190810190611e6d565b905061109a83611660565b67ffffffffffffffff8111156110b2576110b2611951565b6040519080825280602002602001820160405280156110db578160200160208202803683370190505b5091506000805b8251811015610919577371b11ac923c967cd5998f23f6dae0d779a6ac8af6001600160a01b031662fdd58e7f000000000000000000000000e11af478af241fab926f4c111d50139ae003f7fd85848151811061114057611140611d1e565b60200260200101516040518363ffffffff1660e01b81526004016111799291906001600160a01b03929092168252602082015260400190565b60206040518083038186803b15801561119157600080fd5b505afa1580156111a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c99190611e54565b60011415611216578281815181106111e3576111e3611d1e565b60200260200101518483806111f790611d03565b94508151811061120957611209611d1e565b6020026020010181815250505b61121f81611d03565b90506110e2565b600080805260076020527f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6e05482108061125e57504282115b1561126b57506000919050565b600060015b60015481116112b0576000818152600760205260409020600101548411156112a05761129d600183611d69565b91505b6112a981611d03565b9050611270565b50805b60015481116106de576000818152600760208190526040822060019081015492919082906112e2908690611d69565b815260200190815260200160002060010154905083831415611302578591505b60015483141561130f5750425b6000838152600760205260409020546113288383611efe565b6113329190611f15565b61133c9086611d69565b945050508061134a90611d03565b90506112b3565b6000546001600160a01b0316331461137b5760405162461bcd60e51b815260040161070f90611d34565b6001600160a01b03166000908152600a6020526040902080546001600160a01b0319169055565b6000546001600160a01b031633146113cc5760405162461bcd60e51b815260040161070f90611d34565b6001600160a01b039182166000908152600a6020526040902080546001600160a01b03191691909216179055565b6000546001600160a01b031633146114245760405162461bcd60e51b815260040161070f90611d34565b6001600160a01b0381166114895760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161070f565b610aec81611533565b5490565b6001600160a01b03811660009081526004602090815260408083205460039092528220546105de9190611efe565b806114e2576040516332ab910d60e21b815260040160405180910390fd5b6114f0600180546001019055565b6040518060400160405280828152602001428152506007600061151260015490565b81526020808201929092526040016000208251815591015160019091015550565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000818152600560209081526040808320815160608101835281546001600160a01b03168082526001830154828601526002909201548184015290845260049092529091206115d59080546001019055565b6115e28160200151611226565b81516001600160a01b03166000908152600860205260408120805490919061160b908490611d69565b909155505080516001600160a01b031660009081526006602090815260408083209381015183529281528282208290559281526005909252812080546001600160a01b03191681556001810182905560020155565b604051632ddfcec960e21b81526001600160a01b03828116600483015260009182917f000000000000000000000000e11af478af241fab926f4c111d50139ae003f7fd169063b77f3b249060240160006040518083038186803b1580156116c657600080fd5b505afa1580156116da573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117029190810190611e6d565b905060005b81518110156106de577371b11ac923c967cd5998f23f6dae0d779a6ac8af6001600160a01b031662fdd58e7f000000000000000000000000e11af478af241fab926f4c111d50139ae003f7fd84848151811061176557611765611d1e565b60200260200101516040518363ffffffff1660e01b815260040161179e9291906001600160a01b03929092168252602082015260400190565b60206040518083038186803b1580156117b657600080fd5b505afa1580156117ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ee9190611e54565b6001141561180457611801600184611d69565b92505b61180d81611d03565b9050611707565b60006020828403121561182657600080fd5b81356001600160e01b03198116811461183e57600080fd5b9392505050565b6001600160a01b0381168114610aec57600080fd5b60006020828403121561186c57600080fd5b813561183e81611845565b600081518084526020808501945080840160005b838110156118a75781518752958201959082019060010161188b565b509495945050505050565b60208152600061183e6020830184611877565b8015158114610aec57600080fd5b600080604083850312156118e657600080fd5b82356118f181611845565b91506020830135611901816118c5565b809150509250929050565b60006020828403121561191e57600080fd5b5035919050565b6000806040838503121561193857600080fd5b823561194381611845565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561199057611990611951565b604052919050565b600067ffffffffffffffff8211156119b2576119b2611951565b5060051b60200190565b600082601f8301126119cd57600080fd5b813560206119e26119dd83611998565b611967565b82815260059290921b84018101918181019086841115611a0157600080fd5b8286015b84811015611a1c5780358352918301918301611a05565b509695505050505050565b60008060008060808587031215611a3d57600080fd5b843567ffffffffffffffff80821115611a5557600080fd5b611a61888389016119bc565b95506020870135915080821115611a7757600080fd5b611a83888389016119bc565b94506040870135915080821115611a9957600080fd5b611aa5888389016119bc565b93506060870135915080821115611abb57600080fd5b50611ac8878288016119bc565b91505092959194509250565b600082601f830112611ae557600080fd5b813567ffffffffffffffff811115611aff57611aff611951565b611b12601f8201601f1916602001611967565b818152846020838601011115611b2757600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215611b5c57600080fd5b8535611b6781611845565b94506020860135611b7781611845565b9350604086013567ffffffffffffffff80821115611b9457600080fd5b611ba089838a016119bc565b94506060880135915080821115611bb657600080fd5b611bc289838a016119bc565b93506080880135915080821115611bd857600080fd5b50611be588828901611ad4565b9150509295509295909350565b60008060408385031215611c0557600080fd5b823567ffffffffffffffff80821115611c1d57600080fd5b611c29868387016119bc565b93506020850135915080821115611c3f57600080fd5b50611c4c858286016119bc565b9150509250929050565b60008060408385031215611c6957600080fd5b8235611c7481611845565b9150602083013561190181611845565b600080600080600060a08688031215611c9c57600080fd5b8535611ca781611845565b94506020860135611cb781611845565b93506040860135925060608601359150608086013567ffffffffffffffff811115611ce157600080fd5b611be588828901611ad4565b634e487b7160e01b600052601160045260246000fd5b6000600019821415611d1757611d17611ced565b5060010190565b634e487b7160e01b600052603260045260246000fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115611d7c57611d7c611ced565b500190565b600060608284031215611d9357600080fd5b6040516060810181811067ffffffffffffffff82111715611db657611db6611951565b6040528251611dc4816118c5565b81526020830151611dd481611845565b60208201526040928301519281019290925250919050565b6001600160a01b0385811682528416602082015260a060408201819052600090611e1890830185611877565b8281036060840152611e2a8185611877565b838103608090940193909352505060048152630307830360e41b6020820152604001949350505050565b600060208284031215611e6657600080fd5b5051919050565b60006020808385031215611e8057600080fd5b825167ffffffffffffffff811115611e9757600080fd5b8301601f81018513611ea857600080fd5b8051611eb66119dd82611998565b81815260059190911b82018301908381019087831115611ed557600080fd5b928401925b82841015611ef357835182529284019290840190611eda565b979650505050505050565b600082821015611f1057611f10611ced565b500390565b600082611f3257634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220e6a5659d603c78c65ca039968ac929b129df6ce8c9ffeebe041abf0db1e3a3b264736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000e11af478af241fab926f4c111d50139ae003f7fd
-----Decoded View---------------
Arg [0] : _grillAddr (address): 0xE11AF478aF241FAb926f4c111d50139Ae003F7fd
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000e11af478af241fab926f4c111d50139ae003f7fd
Deployed Bytecode Sourcemap
2036:15143:19:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;387:221:6;;;;;;:::i;:::-;;:::i;:::-;;;470:14:24;;463:22;445:41;;433:2;418:18;387:221:6;;;;;;;;13877:426:19;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3138:49::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;1737:25:24;;;1725:2;1710:18;3138:49:19;1591:177:24;5501:111:19;;;;;;:::i;:::-;;:::i;:::-;;16740:134;;;;;;:::i;:::-;;:::i;:::-;;;;2682:13:24;;-1:-1:-1;;;;;2678:39:24;2660:58;;2774:4;2762:17;;;2756:24;2734:20;;;2727:54;2825:17;;;2819:24;2797:20;;;2790:54;2648:2;2633:18;16740:134:19;2468:382:24;15508:616:19;;;;;;:::i;:::-;;:::i;5179:75::-;;;:::i;16430:160::-;;;;;;:::i;:::-;;:::i;17032:145::-;;;;;;:::i;:::-;;:::i;:::-;;;;3079:13:24;;3072:21;3065:29;3047:48;;3155:4;3143:17;;;3137:24;-1:-1:-1;;;;;3133:50:24;3111:20;;;3104:80;3228:17;;;3222:24;3200:20;;;3193:54;3035:2;3020:18;17032:145:19;2855:398:24;15162:109:19;;;:::i;5877:79::-;;;:::i;1668:101:0:-;;;:::i;2767:45:19:-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2767:45:19;;;;;;;;;;;-1:-1:-1;;;;;3478:32:24;;;3460:51;;3542:2;3527:18;;3520:34;;;;3570:18;;;3563:34;3448:2;3433:18;2767:45:19;3258:345:24;1036:85:0;1082:7;1108:6;-1:-1:-1;;;;;1108:6:0;1036:85;;;-1:-1:-1;;;;;3772:32:24;;;3754:51;;3742:2;3727:18;1036:85:0;3608:203:24;6116:97:19;;;;;;:::i;:::-;;:::i;2879:68::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;7711:1482;;;;;;:::i;:::-;;:::i;724:247:5:-;;;;;;:::i;:::-;-1:-1:-1;;;724:247:5;;;;;;;;;;;-1:-1:-1;;;;;;8229:33:24;;;8211:52;;8199:2;8184:18;724:247:5;8067:202:24;3331:42:19;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;3331:42:19;;;6610:737;;;;;;:::i;:::-;;:::i;14465:556::-;;;;;;:::i;:::-;;:::i;9414:1232::-;;;;;;:::i;:::-;;:::i;2200:94::-;;2251:42;2200:94;;5016:99;;;;;;:::i;:::-;;:::i;4758:128::-;;;;;;:::i;:::-;;:::i;2298:32::-;;;;;499:219:5;;;;;;:::i;:::-;-1:-1:-1;;;499:219:5;;;;;;;;1918:198:0;;;;;;:::i;:::-;;:::i;2464:28:19:-;;;;;;;;;3000:51;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;10630:25:24;;;10686:2;10671:18;;10664:34;;;;10603:18;3000:51:19;10456:248:24;3238:41:19;;;;;;:::i;:::-;;;;;;;;;;;;;;;;387:221:6;489:4;-1:-1:-1;;;;;;512:49:6;;-1:-1:-1;;;512:49:6;;:89;;-1:-1:-1;;;;;;;;;;937:40:16;;;565:36:6;505:96;387:221;-1:-1:-1;;387:221:6:o;13877:426:19:-;13956:21;14008:37;14037:7;14008:28;:37::i;:::-;13994:52;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13994:52:19;-1:-1:-1;13987:59:19;-1:-1:-1;14098:13:19;14134:1;14117:182;-1:-1:-1;;;;;14142:30:19;;;;;;:21;:30;;;;;918:14:14;14137:1:19;:45;14117:182;;-1:-1:-1;;;;;14201:22:19;;;;;;:13;:22;;;;;;;;:25;;;;;;;;;:30;14197:96;;-1:-1:-1;;;;;14259:22:19;;;;;;:13;:22;;;;;;;;:25;;;;;;;;;14243:4;14248:7;;;;:::i;:::-;;;14243:13;;;;;;;;:::i;:::-;;;;;;:41;;;;;14197:96;14184:3;;;:::i;:::-;;;14117:182;;;;13981:322;13877:426;;;:::o;5501:111::-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:13;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;5580:18:19;;;::::1;;::::0;;;:9:::1;:18;::::0;;;;:27;;-1:-1:-1;;5580:27:19::1;::::0;::::1;;::::0;;;::::1;::::0;;5501:111::o;16740:134::-;16818:15;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16818:15:19;-1:-1:-1;16848:21:19;;;;:12;:21;;;;;;;;;16843:26;;;;;;;;;-1:-1:-1;;;;;16843:26:19;;;;;;;;;;;;;;;;;;;;;;;;;16740:134::o;15508:616::-;15568:15;15664:25;15692:28;15712:7;15692:19;:28::i;:::-;15664:56;;15731:9;15726:119;15746:8;:15;15742:1;:19;15726:119;;;15787:51;15802:12;:25;15815:8;15824:1;15815:11;;;;;;;;:::i;:::-;;;;;;;15802:25;;;;;;;;;;;:35;;;15787:14;:51::i;:::-;15776:62;;;;:::i;:::-;;-1:-1:-1;15763:3:19;;;:::i;:::-;;;15726:119;;;;15922:28;15953:31;15976:7;15953:22;:31::i;:::-;15922:62;;15995:9;15990:130;16010:11;:18;16006:1;:22;15990:130;;;16054:59;16069:8;-1:-1:-1;;;;;16069:17:19;;16087:11;16099:1;16087:14;;;;;;;;:::i;:::-;;;;;;;16069:33;;;;;;;;;;;;;1737:25:24;;1725:2;1710:18;;1591:177;16069:33:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;;;16054:14;:59::i;:::-;16043:70;;;;:::i;:::-;;-1:-1:-1;16030:3:19;;;:::i;:::-;;;15990:130;;;;15585:539;;15508:616;;;:::o;5179:75::-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:13;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;5240:9:19::1;::::0;;-1:-1:-1;;5227:22:19;::::1;5240:9;::::0;;::::1;5239:10;5227:22;::::0;;5179:75::o;16430:160::-;16503:15;16564:21;16577:7;16564:12;:21::i;:::-;-1:-1:-1;;;;;16538:23:19;;;;;;:14;:23;;;;;;:47;;;;:::i;17032:145::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;17146:26:19;;-1:-1:-1;;;17146:26:19;;;;;1737:25:24;;;-1:-1:-1;;;;;17146:8:19;:17;;;;1710:18:24;;17146:26:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;15162:109::-;15212:16;15247:19;:9;918:14:14;;827:112;15247:19:19;15236:30;;15162:109;:::o;5877:79::-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:13;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;5926:25:19::1;-1:-1:-1::0;;5926:16:19::1;:25::i;:::-;5877:79::o:0;1668:101:0:-;1082:7;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:13;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;1732:30:::1;1759:1;1732:18;:30::i;6116:97:19:-:0;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:13;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;6182:26:19::1;6199:8;6182:16;:26::i;:::-;6116:97:::0;:::o;7711:1482::-;7888:18;;:22;7884:712;;7978:9;7973:405;7997:11;:18;7993:1;:22;7973:405;;;8032:16;8051:11;8063:1;8051:14;;;;;;;;:::i;:::-;;;;;;;8032:33;;8075:30;8108:8;-1:-1:-1;;;;;8108:17:19;;8126:8;8108:27;;;;;;;;;;;;;1737:25:24;;1725:2;1710:18;;1591:177;8108:27:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8149:17;;;;8075:60;;-1:-1:-1;;;;;;8149:31:19;8170:10;8149:31;8145:89;;8201:22;;-1:-1:-1;;;8201:22:19;;;;;;;;;;;8145:89;8333:36;8348:10;:20;;;8333:14;:36::i;:::-;8318:10;8303:26;;;;:14;:26;;;;;:66;;:26;;;:66;;;;;:::i;:::-;;;;;;;;8022:356;;8017:3;;;;:::i;:::-;;;7973:405;;;-1:-1:-1;8449:140:19;;-1:-1:-1;;;8449:140:19;;2251:42;;8449:28;;:140;;8495:8;;8514:10;;8534:11;;8555:10;;8449:140;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7884:712;8605:18;;:22;8601:588;;8695:9;8690:284;8714:11;:18;8710:1;:22;8690:284;;;8749:16;8768:11;8780:1;8768:14;;;;;;;;:::i;:::-;;;;;;;;;;;;8796:22;;;;:12;:22;;;;;;;:29;8768:14;;-1:-1:-1;;;;;;8796:29:19;8829:10;8796:43;8792:101;;8860:22;;-1:-1:-1;;;8860:22:19;;;;;;;;;;;8792:101;8943:22;8956:8;8943:12;:22::i;:::-;-1:-1:-1;8734:3:19;;;:::i;:::-;;;8690:284;;;-1:-1:-1;9046:136:19;;-1:-1:-1;;;9046:136:19;;2251:42;;9046:28;;:136;;9092:4;;9107:10;;9127:11;;9148:10;;9046:136;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8601:588;7711:1482;;;;:::o;6610:737::-;6706:9;;;;6701:56;;6732:18;;-1:-1:-1;;;6732:18:19;;;;;;;;;;;6701:56;6776:10;6766:21;;;;:9;:21;;;;;;;;6762:68;;;6804:19;;-1:-1:-1;;;6804:19:19;;;;;;;;;;;6762:68;6889:9;6884:272;6908:8;:15;6904:1;:19;6884:272;;;6938:16;6957:8;6966:1;6957:11;;;;;;;;:::i;:::-;;;;;;;;;;;6980:38;;-1:-1:-1;;;6980:38:19;;6997:10;6980:38;;;13415:51:24;13482:18;;;13475:34;;;6957:11:19;;-1:-1:-1;2251:42:19;;6980:16;;13388:18:24;;6980:38:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6976:96;;7042:21;;-1:-1:-1;;;7042:21:19;;;;;;;;;;;6976:96;7128:10;11007:29;;;;:21;:29;;;;;;;;1032:19:14;;1050:1;1032:19;;;;;;11116:13:19;:21;;;;;:62;;;;;;;;:72;;;11260:95;;;;;;;;;;11287:15;11260:95;;;;;;918:14:14;;11260:95:19;;;;;;11236:21;;;:12;:21;;;;;:119;;;;-1:-1:-1;;;;;;11236:119:19;-1:-1:-1;;;;;11236:119:19;;;;;;;;;;;;;;;;;;;6925:3;;;:::i;:::-;;;6884:272;;;-1:-1:-1;7224:118:19;;-1:-1:-1;;;7224:118:19;;2251:42;;7224:28;;:118;;7260:10;;7286:4;;7299:8;;7315:7;;7224:118;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6610:737;;:::o;14465:556::-;14661:30;;-1:-1:-1;;;14661:30:19;;-1:-1:-1;;;;;3772:32:24;;;14661:30:19;;;3754:51:24;14547:21:19;;14632:26;;14661:8;:21;;;;3727:18:24;;14661:30:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;14661:30:19;;;;;;;;;;;;:::i;:::-;14632:59;;14783:40;14815:7;14783:31;:40::i;:::-;14769:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14769:55:19;-1:-1:-1;14762:62:19;-1:-1:-1;14830:13:19;;14849:168;14873:9;:16;14869:1;:20;14849:168;;;2251:42;-1:-1:-1;;;;;14908:16:19;;14933:8;14944:9;14954:1;14944:12;;;;;;;;:::i;:::-;;;;;;;14908:49;;;;;;;;;;;;;;;-1:-1:-1;;;;;13433:32:24;;;;13415:51;;13497:2;13482:18;;13475:34;13403:2;13388:18;;13241:274;14908:49:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14961:1;14908:54;14904:107;;;14990:9;15000:1;14990:12;;;;;;;;:::i;:::-;;;;;;;14974:4;14979:7;;;;;:::i;:::-;;;14974:13;;;;;;;;:::i;:::-;;;;;;:28;;;;;14904:107;14891:3;;;:::i;:::-;;;14849:168;;9414:1232;9479:10;9606:18;;;:15;:18;;:28;;9593:41;;;:73;;;9651:15;9638:10;:28;9593:73;9582:1060;;;-1:-1:-1;9686:1:19;9414:1232;;;:::o;9582:1060::-;9985:12;10022:1;10005:148;10030:9;918:14:14;10025:1:19;:24;10005:148;;10070:18;;;;:15;:18;;;;;:28;;;:41;-1:-1:-1;10066:79:19;;;10125:9;10133:1;10125:9;;:::i;:::-;;;10066:79;10051:3;;;:::i;:::-;;;10005:148;;;-1:-1:-1;10251:4:19;10234:402;10262:9;918:14:14;10257:1:19;:24;10234:402;;10298:14;10315:18;;;:15;:18;;;;;;;:28;;;;;;10298:14;10315:15;10298:14;;10384:5;;10331:1;;10384:5;:::i;:::-;10368:22;;;;;;;;;;;:32;;;10353:47;;10439:4;10434:1;:9;10430:57;;;10466:10;10457:19;;10430:57;10505:9;918:14:14;10500:1:19;:24;10496:75;;;-1:-1:-1;10545:15:19;10496:75;10604:18;;;;:15;:18;;;;;:23;10587:13;10594:6;10587:4;:13;:::i;:::-;10586:41;;;;:::i;:::-;10580:47;;;;:::i;:::-;;;10288:348;;10283:3;;;;:::i;:::-;;;10234:402;;5016:99;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:13;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5094:16:19::1;;::::0;;;:7:::1;:16;::::0;;;;5087:23;;-1:-1:-1;;;;;;5087:23:19::1;::::0;;5016:99::o;4758:128::-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:13;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4854:16:19;;::::1;;::::0;;;:7:::1;:16;::::0;;;;:27;;-1:-1:-1;;;;;;4854:27:19::1;::::0;;;::::1;;::::0;;4758:128::o;1918:198:0:-;1082:7;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:13;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2006:22:0;::::1;1998:73;;;::::0;-1:-1:-1;;;1998:73:0;;15149:2:24;1998:73:0::1;::::0;::::1;15131:21:24::0;15188:2;15168:18;;;15161:30;15227:34;15207:18;;;15200:62;-1:-1:-1;;;15278:18:24;;;15271:36;15324:19;;1998:73:0::1;14947:402:24::0;1998:73:0::1;2081:28;2100:8;2081:18;:28::i;827:112:14:-:0;918:14;;827:112::o;12871:227:19:-;-1:-1:-1;;;;;13051:32:19;;12961:15;13051:32;;;:23;:32;;;;;;;;918:14:14;13002:21:19;:30;;;;;918:14:14;13002:91:19;;918:14:14;13002:91:19;:::i;12453:228::-;12515:13;12511:59;;12545:18;;-1:-1:-1;;;12545:18:19;;;;;;;;;;;12511:59;12575:21;:9;1032:19:14;;1050:1;1032:19;;;945:123;12575:21:19;12641:35;;;;;;;;12650:8;12641:35;;;;12660:15;12641:35;;;12602:15;:36;12618:19;:9;918:14:14;;827:112;12618:19:19;12602:36;;;;;;;;;;;;-1:-1:-1;12602:36:19;:74;;;;;;;;;;;;-1:-1:-1;12453:228:19:o;2270:187:0:-;2343:16;2362:6;;-1:-1:-1;;;;;2378:17:0;;;-1:-1:-1;;;;;;2378:17:0;;;;;;2410:40;;2362:6;;;;;;;2410:40;;2343:16;2410:40;2333:124;2270:187;:::o;11595:622:19:-;11697:23;11723:21;;;:12;:21;;;;;;;;11697:47;;;;;;;;;-1:-1:-1;;;;;11697:47:19;;;;;;;;;;;;;;;;;;;;;11802:42;;;:23;:42;;;;;;:54;;1032:19:14;;1050:1;1032:19;;;945:123;11802:54:19;11968:36;11983:10;:20;;;11968:14;:36::i;:::-;11946:17;;-1:-1:-1;;;;;11931:33:19;;;;;:14;:33;;;;;:73;;:33;;;:73;;;;;:::i;:::-;;;;-1:-1:-1;;12092:17:19;;-1:-1:-1;;;;;12078:32:19;;;;;:13;:32;;;;;;;;12111:22;;;;12078:56;;;;;;;;12071:63;;;12191:21;;;:12;:21;;;;;12184:28;;-1:-1:-1;;;;;;12184:28:19;;;;;;;;;;;;11595:622::o;13332:339::-;13479:30;;-1:-1:-1;;;13479:30:19;;-1:-1:-1;;;;;3772:32:24;;;13479:30:19;;;3754:51:24;13425:15:19;;;;13479:8;:21;;;;3727:18:24;;13479:30:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13479:30:19;;;;;;;;;;;;:::i;:::-;13450:59;;13520:9;13515:152;13539:9;:16;13535:1;:20;13515:152;;;2251:42;-1:-1:-1;;;;;13574:16:19;;13599:8;13610:9;13620:1;13610:12;;;;;;;;:::i;:::-;;;;;;;13574:49;;;;;;;;;;;;;;;-1:-1:-1;;;;;13433:32:24;;;;13415:51;;13497:2;13482:18;;13475:34;13403:2;13388:18;;13241:274;13574:49:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13627:1;13574:54;13570:91;;;13640:12;13651:1;13640:12;;:::i;:::-;;;13570:91;13557:3;;;:::i;:::-;;;13515:152;;14:286:24;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:24;;209:43;;199:71;;266:1;263;256:12;199:71;289:5;14:286;-1:-1:-1;;;14:286:24:o;497:131::-;-1:-1:-1;;;;;572:31:24;;562:42;;552:70;;618:1;615;608:12;633:247;692:6;745:2;733:9;724:7;720:23;716:32;713:52;;;761:1;758;751:12;713:52;800:9;787:23;819:31;844:5;819:31;:::i;885:435::-;938:3;976:5;970:12;1003:6;998:3;991:19;1029:4;1058:2;1053:3;1049:12;1042:19;;1095:2;1088:5;1084:14;1116:1;1126:169;1140:6;1137:1;1134:13;1126:169;;;1201:13;;1189:26;;1235:12;;;;1270:15;;;;1162:1;1155:9;1126:169;;;-1:-1:-1;1311:3:24;;885:435;-1:-1:-1;;;;;885:435:24:o;1325:261::-;1504:2;1493:9;1486:21;1467:4;1524:56;1576:2;1565:9;1561:18;1553:6;1524:56;:::i;1773:118::-;1859:5;1852:13;1845:21;1838:5;1835:32;1825:60;;1881:1;1878;1871:12;1896:382;1961:6;1969;2022:2;2010:9;2001:7;1997:23;1993:32;1990:52;;;2038:1;2035;2028:12;1990:52;2077:9;2064:23;2096:31;2121:5;2096:31;:::i;:::-;2146:5;-1:-1:-1;2203:2:24;2188:18;;2175:32;2216:30;2175:32;2216:30;:::i;:::-;2265:7;2255:17;;;1896:382;;;;;:::o;2283:180::-;2342:6;2395:2;2383:9;2374:7;2370:23;2366:32;2363:52;;;2411:1;2408;2401:12;2363:52;-1:-1:-1;2434:23:24;;2283:180;-1:-1:-1;2283:180:24:o;3816:315::-;3884:6;3892;3945:2;3933:9;3924:7;3920:23;3916:32;3913:52;;;3961:1;3958;3951:12;3913:52;4000:9;3987:23;4019:31;4044:5;4019:31;:::i;:::-;4069:5;4121:2;4106:18;;;;4093:32;;-1:-1:-1;;;3816:315:24:o;4136:127::-;4197:10;4192:3;4188:20;4185:1;4178:31;4228:4;4225:1;4218:15;4252:4;4249:1;4242:15;4268:275;4339:2;4333:9;4404:2;4385:13;;-1:-1:-1;;4381:27:24;4369:40;;4439:18;4424:34;;4460:22;;;4421:62;4418:88;;;4486:18;;:::i;:::-;4522:2;4515:22;4268:275;;-1:-1:-1;4268:275:24:o;4548:183::-;4608:4;4641:18;4633:6;4630:30;4627:56;;;4663:18;;:::i;:::-;-1:-1:-1;4708:1:24;4704:14;4720:4;4700:25;;4548:183::o;4736:662::-;4790:5;4843:3;4836:4;4828:6;4824:17;4820:27;4810:55;;4861:1;4858;4851:12;4810:55;4897:6;4884:20;4923:4;4947:60;4963:43;5003:2;4963:43;:::i;:::-;4947:60;:::i;:::-;5041:15;;;5127:1;5123:10;;;;5111:23;;5107:32;;;5072:12;;;;5151:15;;;5148:35;;;5179:1;5176;5169:12;5148:35;5215:2;5207:6;5203:15;5227:142;5243:6;5238:3;5235:15;5227:142;;;5309:17;;5297:30;;5347:12;;;;5260;;5227:142;;;-1:-1:-1;5387:5:24;4736:662;-1:-1:-1;;;;;;4736:662:24:o;5403:1048::-;5589:6;5597;5605;5613;5666:3;5654:9;5645:7;5641:23;5637:33;5634:53;;;5683:1;5680;5673:12;5634:53;5723:9;5710:23;5752:18;5793:2;5785:6;5782:14;5779:34;;;5809:1;5806;5799:12;5779:34;5832:61;5885:7;5876:6;5865:9;5861:22;5832:61;:::i;:::-;5822:71;;5946:2;5935:9;5931:18;5918:32;5902:48;;5975:2;5965:8;5962:16;5959:36;;;5991:1;5988;5981:12;5959:36;6014:63;6069:7;6058:8;6047:9;6043:24;6014:63;:::i;:::-;6004:73;;6130:2;6119:9;6115:18;6102:32;6086:48;;6159:2;6149:8;6146:16;6143:36;;;6175:1;6172;6165:12;6143:36;6198:63;6253:7;6242:8;6231:9;6227:24;6198:63;:::i;:::-;6188:73;;6314:2;6303:9;6299:18;6286:32;6270:48;;6343:2;6333:8;6330:16;6327:36;;;6359:1;6356;6349:12;6327:36;;6382:63;6437:7;6426:8;6415:9;6411:24;6382:63;:::i;:::-;6372:73;;;5403:1048;;;;;;;:::o;6456:530::-;6498:5;6551:3;6544:4;6536:6;6532:17;6528:27;6518:55;;6569:1;6566;6559:12;6518:55;6605:6;6592:20;6631:18;6627:2;6624:26;6621:52;;;6653:18;;:::i;:::-;6697:55;6740:2;6721:13;;-1:-1:-1;;6717:27:24;6746:4;6713:38;6697:55;:::i;:::-;6777:2;6768:7;6761:19;6823:3;6816:4;6811:2;6803:6;6799:15;6795:26;6792:35;6789:55;;;6840:1;6837;6830:12;6789:55;6905:2;6898:4;6890:6;6886:17;6879:4;6870:7;6866:18;6853:55;6953:1;6928:16;;;6946:4;6924:27;6917:38;;;;6932:7;6456:530;-1:-1:-1;;;6456:530:24:o;6991:1071::-;7145:6;7153;7161;7169;7177;7230:3;7218:9;7209:7;7205:23;7201:33;7198:53;;;7247:1;7244;7237:12;7198:53;7286:9;7273:23;7305:31;7330:5;7305:31;:::i;:::-;7355:5;-1:-1:-1;7412:2:24;7397:18;;7384:32;7425:33;7384:32;7425:33;:::i;:::-;7477:7;-1:-1:-1;7535:2:24;7520:18;;7507:32;7558:18;7588:14;;;7585:34;;;7615:1;7612;7605:12;7585:34;7638:61;7691:7;7682:6;7671:9;7667:22;7638:61;:::i;:::-;7628:71;;7752:2;7741:9;7737:18;7724:32;7708:48;;7781:2;7771:8;7768:16;7765:36;;;7797:1;7794;7787:12;7765:36;7820:63;7875:7;7864:8;7853:9;7849:24;7820:63;:::i;:::-;7810:73;;7936:3;7925:9;7921:19;7908:33;7892:49;;7966:2;7956:8;7953:16;7950:36;;;7982:1;7979;7972:12;7950:36;;8005:51;8048:7;8037:8;8026:9;8022:24;8005:51;:::i;:::-;7995:61;;;6991:1071;;;;;;;;:::o;8274:595::-;8392:6;8400;8453:2;8441:9;8432:7;8428:23;8424:32;8421:52;;;8469:1;8466;8459:12;8421:52;8509:9;8496:23;8538:18;8579:2;8571:6;8568:14;8565:34;;;8595:1;8592;8585:12;8565:34;8618:61;8671:7;8662:6;8651:9;8647:22;8618:61;:::i;:::-;8608:71;;8732:2;8721:9;8717:18;8704:32;8688:48;;8761:2;8751:8;8748:16;8745:36;;;8777:1;8774;8767:12;8745:36;;8800:63;8855:7;8844:8;8833:9;8829:24;8800:63;:::i;:::-;8790:73;;;8274:595;;;;;:::o;9101:388::-;9169:6;9177;9230:2;9218:9;9209:7;9205:23;9201:32;9198:52;;;9246:1;9243;9236:12;9198:52;9285:9;9272:23;9304:31;9329:5;9304:31;:::i;:::-;9354:5;-1:-1:-1;9411:2:24;9396:18;;9383:32;9424:33;9383:32;9424:33;:::i;9717:734::-;9821:6;9829;9837;9845;9853;9906:3;9894:9;9885:7;9881:23;9877:33;9874:53;;;9923:1;9920;9913:12;9874:53;9962:9;9949:23;9981:31;10006:5;9981:31;:::i;:::-;10031:5;-1:-1:-1;10088:2:24;10073:18;;10060:32;10101:33;10060:32;10101:33;:::i;:::-;10153:7;-1:-1:-1;10207:2:24;10192:18;;10179:32;;-1:-1:-1;10258:2:24;10243:18;;10230:32;;-1:-1:-1;10313:3:24;10298:19;;10285:33;10341:18;10330:30;;10327:50;;;10373:1;10370;10363:12;10327:50;10396:49;10437:7;10428:6;10417:9;10413:22;10396:49;:::i;10709:127::-;10770:10;10765:3;10761:20;10758:1;10751:31;10801:4;10798:1;10791:15;10825:4;10822:1;10815:15;10841:135;10880:3;-1:-1:-1;;10901:17:24;;10898:43;;;10921:18;;:::i;:::-;-1:-1:-1;10968:1:24;10957:13;;10841:135::o;10981:127::-;11042:10;11037:3;11033:20;11030:1;11023:31;11073:4;11070:1;11063:15;11097:4;11094:1;11087:15;11113:356;11315:2;11297:21;;;11334:18;;;11327:30;11393:34;11388:2;11373:18;;11366:62;11460:2;11445:18;;11113:356::o;11474:128::-;11514:3;11545:1;11541:6;11538:1;11535:13;11532:39;;;11551:18;;:::i;:::-;-1:-1:-1;11587:9:24;;11474:128::o;11607:695::-;11700:6;11753:2;11741:9;11732:7;11728:23;11724:32;11721:52;;;11769:1;11766;11759:12;11721:52;11802:2;11796:9;11844:2;11836:6;11832:15;11913:6;11901:10;11898:22;11877:18;11865:10;11862:34;11859:62;11856:88;;;11924:18;;:::i;:::-;11960:2;11953:22;11997:16;;12022:28;11997:16;12022:28;:::i;:::-;12059:21;;12125:2;12110:18;;12104:25;12138:33;12104:25;12138:33;:::i;:::-;12199:2;12187:15;;12180:32;12266:2;12251:18;;;12245:25;12228:15;;;12221:50;;;;-1:-1:-1;12191:6:24;11607:695;-1:-1:-1;11607:695:24:o;12307:929::-;-1:-1:-1;;;;;12758:15:24;;;12740:34;;12810:15;;12805:2;12790:18;;12783:43;12720:3;12857:2;12842:18;;12835:31;;;12683:4;;12889:57;;12926:19;;12918:6;12889:57;:::i;:::-;12994:9;12986:6;12982:22;12977:2;12966:9;12962:18;12955:50;13028:44;13065:6;13057;13028:44;:::i;:::-;13109:22;;;13103:3;13088:19;;;13081:51;;;;-1:-1:-1;;13156:1:24;13141:17;;-1:-1:-1;;;13186:2:24;13174:15;;13167:31;13227:2;13215:15;;12307:929;-1:-1:-1;;;;12307:929:24:o;13520:184::-;13590:6;13643:2;13631:9;13622:7;13618:23;13614:32;13611:52;;;13659:1;13656;13649:12;13611:52;-1:-1:-1;13682:16:24;;13520:184;-1:-1:-1;13520:184:24:o;13709:881::-;13804:6;13835:2;13878;13866:9;13857:7;13853:23;13849:32;13846:52;;;13894:1;13891;13884:12;13846:52;13927:9;13921:16;13960:18;13952:6;13949:30;13946:50;;;13992:1;13989;13982:12;13946:50;14015:22;;14068:4;14060:13;;14056:27;-1:-1:-1;14046:55:24;;14097:1;14094;14087:12;14046:55;14126:2;14120:9;14149:60;14165:43;14205:2;14165:43;:::i;14149:60::-;14243:15;;;14325:1;14321:10;;;;14313:19;;14309:28;;;14274:12;;;;14349:19;;;14346:39;;;14381:1;14378;14371:12;14346:39;14405:11;;;;14425:135;14441:6;14436:3;14433:15;14425:135;;;14507:10;;14495:23;;14458:12;;;;14538;;;;14425:135;;;14579:5;13709:881;-1:-1:-1;;;;;;;13709:881:24:o;14595:125::-;14635:4;14663:1;14660;14657:8;14654:34;;;14668:18;;:::i;:::-;-1:-1:-1;14705:9:24;;14595:125::o;14725:217::-;14765:1;14791;14781:132;;14835:10;14830:3;14826:20;14823:1;14816:31;14870:4;14867:1;14860:15;14898:4;14895:1;14888:15;14781:132;-1:-1:-1;14927:9:24;;14725:217::o
Swarm Source
ipfs://e6a5659d603c78c65ca039968ac929b129df6ce8c9ffeebe041abf0db1e3a3b2
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.