Contract Overview
Balance:
7.18 AVAX
AVAX Value:
$139.65 (@ $19.45/AVAX)
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
Contract Source Code Verified (Exact Match)
Contract Name:
LoveMonsterNFT
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 100 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: Unlicense pragma solidity 0.8.17; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/access/AccessControl.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts/utils/Counters.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "../utils/RoyaltiesAddon.sol"; import "../utils/ERC2981.sol"; import "../utils/IWETH.sol"; import "./Monsters.sol"; import "./Migration.sol"; import "./Whitelist.sol"; import "hardhat/console.sol"; contract LoveMonsterNFT is ERC721, ERC721Enumerable, RoyaltiesAddon, ERC2981, AccessControl, MonsterContract, MigrationContract, WhitelistContract, ReentrancyGuard { using Counters for Counters.Counter; //GameCurrency IERC20 public LMTCurrency; uint256 public LMTCurrencyDecimals; //Marketplace IWETH public immutable wavax = IWETH(0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7); bool public MarketplaceOpen = false; bool public MarketplaceOnlyNative = true; Counters.Counter public TotalSales; uint256 public LMTSpend; uint256 public AVAXSpend; //ROLES bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); //TOKENURI string public tokenURIPrefix = "ipfs://QmSFXFCBUpWN2hpBFCYps3hDSBVYdCs64JZuMiNFEhANnt/"; string public tokenURISuffix = ".json"; //MINT Process uint256 public whitelistMintPrice = 6.5 ether; uint256 public mintPrice = 11 ether; uint256 public maxMintQuantity = 12; uint256 public basePrice = 150; uint256[] public remainingIds; Counters.Counter private _actualTokenSelectorCounter; bool public mintIsOpen = false; mapping(address => uint256) addressMintAmount; // address private USDPair = 0xf4003F4efBE8691B60249E6afbD307aBE7758adb; // IERC20 usdc = IERC20(0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E); // IERC20 wavaxErc20 = IERC20(0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7); modifier paymentRequire(uint256 quantity) { uint256 price = GetActualPrice() * quantity; require(msg.value >= price, "ERR-26"); _; } constructor( address royaltiesAddr, address zombieEditionAddress, address[] memory partnershipAddress ) ERC721("Love Monster", "LM") { _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); _grantRole(MINTER_ROLE, msg.sender); UpdateRoyalties(royaltiesAddr, 6); ZombieEdition = IERC721(zombieEditionAddress); for (uint i = 0; i < partnershipAddress.length; i++) { partnerships.push(IERC721(partnershipAddress[i])); } // chiknCollection = IERC721(partnershipAddress[0]); // roostrCollection = IERC721(partnershipAddress[1]); // farmlandCollection = IERC721(partnershipAddress[2]); // PlantATreeCollection = IERC721(partnershipAddress[3]); // MetallicInvadersCollection = IERC721(partnershipAddress[4]); // AiWhiskyBartendersCollection = IERC721(partnershipAddress[5]); // AiWhiskyCollection = IERC721(partnershipAddress[6]); // PumpskinCollection = IERC721(partnershipAddress[7]); // AIMutantsCollection = IERC721(partnershipAddress[8]); } // function getAvaxPrice() public view returns (uint256) { // uint256 usdcBalance = usdc.balanceOf(USDPair) / (10 ** 6); // uint256 wavaxBalance = wavaxErc20.balanceOf(USDPair) / (10 ** 18); // return usdcBalance / wavaxBalance; // } // function getCurrentPriceInAvax() public view returns (uint256) { // uint256 price = basePrice / getAvaxPrice(); // return price * (10 ** 18); // } // function mintNextAvailable() external onlyRole(MINTER_ROLE) nonReentrant { // require(totalSupply() < MAX_TOTAL_SUPPLY, "ERR-29"); // uint256 tokenId = getTokenAvailable(); // require(tokenId > 0, "ERR-28"); // _mint(msg.sender, tokenId); // RegisterMonster(tokenId); // _actualTokenSelectorCounter.increment(); // } function AdminMint( uint256 tokenId, address to ) external onlyRole(MINTER_ROLE) nonReentrant { require(totalSupply() < MAX_TOTAL_SUPPLY, "ERR-29"); require(tokenId > 0, "ERR-28"); _mint(msg.sender, tokenId); _registerMonster(tokenId); if (to != msg.sender) _transfer(msg.sender, to, tokenId); } function AdminBatchMint( uint256 quantity, address to ) external onlyRole(MINTER_ROLE) nonReentrant { require(totalSupply() + quantity <= MAX_TOTAL_SUPPLY, "ERR-29"); for (uint256 index = 0; index < quantity; index++) { uint256 tokenId = totalSupply() + 1; _mint(msg.sender, tokenId); _registerMonster(tokenId); if (to != msg.sender) _transfer(msg.sender, to, tokenId); } } function publicMultiMint( uint256 quantity ) external payable whitelistCheck nonReentrant paymentRequire(quantity) { uint256 maxQuantity = isMintWhitelistOnly ? maxMintOnWhitelist : maxMintQuantity; require(quantity > 0, "ERR-294"); require(mintIsOpen, "ERR-201"); require(quantity <= maxQuantity, "ERR-293"); if (isMintWhitelistOnly) { require( addressMintAmount[msg.sender] + quantity <= maxMintOnWhitelist, "ERR-292" ); } require(totalSupply() + quantity <= MAX_TOTAL_SUPPLY, "ERR-29"); uint256 actSelectedToken = _actualTokenSelectorCounter.current(); require(actSelectedToken + quantity <= remainingIds.length, "ERR-28"); for (uint256 index = 0; index < quantity; index++) { uint256 tokenId = getTokenAvailable(); require(tokenId > 0, "ERR-28"); _mint(msg.sender, tokenId); _registerMonster(tokenId); _actualTokenSelectorCounter.increment(); } addressMintAmount[msg.sender] += quantity; } function getTokenAvailable() public view returns (uint256) { uint256 actSelectedToken = _actualTokenSelectorCounter.current(); if (actSelectedToken >= remainingIds.length) return 0; uint256 actToken = remainingIds[actSelectedToken]; return actToken; } function _registerMonster(uint256 tokenId) internal { address ownerOfMonster = ownerOf(tokenId); require(ownerOfMonster == msg.sender, "ERR-11"); Market memory initMarket = Market(false, 0, 0, msg.sender, false, 0); Monster memory initMonster = Monster(tokenId, initMarket, true); uint256[] memory attrs = new uint256[](30); MonsterAttributes memory initMonsterAttributes = MonsterAttributes( attrs ); MonstersAttributes[tokenId] = initMonsterAttributes; Monsters[tokenId] = initMonster; } function RegisterMonster(uint256 tokenId) external nonReentrant { require(!Monsters[tokenId].initialized, "ERR-13"); _registerMonster(tokenId); } function GetActualTokenForMint() external view returns (uint256) { return _actualTokenSelectorCounter.current(); } function RegisterAllMyMonster() external nonReentrant { uint256[] memory allMyIds = GetAddressTokens(msg.sender); for (uint256 index = 0; index < allMyIds.length; index++) { uint256 tokenId = allMyIds[index]; if (Monsters[tokenId].initialized) { continue; } _registerMonster(tokenId); } } function _retrieveMonster(uint256 tokenId) internal { require(!MigrationMonsterRetrieved[tokenId], "ERR-42"); MigrationMonsterRetrieved[tokenId] = true; _mint(msg.sender, tokenId); _registerMonster(tokenId); emit MonsterRetrieved(tokenId); } function RetrieveMonster(uint256 tokenId) external nonReentrant { require(MigrationHolders[tokenId] == msg.sender, "ERR-41"); _retrieveMonster(tokenId); } function RetrieveMonstersMax() external nonReentrant { (uint256[] memory tokenIds, uint256 lastId) = GetMigrationHolderInfo( msg.sender ); uint256 length = lastId + maxRetrievesPerBatch > tokenIds.length ? tokenIds.length : lastId + maxRetrievesPerBatch; require(length > 0, "ERR-50"); for (uint256 index = lastId; index < length; index++) { uint256 tokenId = tokenIds[index]; _retrieveMonster(tokenId); MigrationHoldersAllNfts[msg.sender].lastId = index + 1; } } function BuyMonster( uint256 tokenId ) external payable MonsterInitialized(tokenId) nonReentrant { require(MarketplaceOpen, "ERR-20"); require(_exists(tokenId), "ERR-10"); address tokenOwner = ownerOf(tokenId); require(tokenOwner != msg.sender, "ERR-11"); Monster memory monster = Monsters[tokenId]; require(monster.marketInfo.selling, "ERR-21"); uint256 amount = monster.marketInfo.nativeCurrency ? monster.marketInfo.price : monster.marketInfo.price * (10 ** LMTCurrencyDecimals); (address _royaltyAddress, uint256 _royaltiesAmount) = royaltyInfo( tokenId, amount ); uint256 payOwnerAmount = amount - _royaltiesAmount; if (monster.marketInfo.nativeCurrency) { require(msg.value >= amount, "ERR-22"); payable(monster.marketInfo.currentOwner).transfer(payOwnerAmount); payable(_royaltyAddress).transfer(_royaltiesAmount); AVAXSpend += amount; } else { require(LMTCurrency.balanceOf(msg.sender) >= amount, "ERR-23"); require( LMTCurrency.allowance(address(this), msg.sender) >= amount, "ERR-24" ); require( LMTCurrency.transferFrom(msg.sender, address(this), amount), "ERR-22" ); LMTCurrency.transfer(msg.sender, payOwnerAmount); LMTCurrency.transfer(_royaltyAddress, _royaltiesAmount); LMTSpend += amount; } monster.marketInfo.latestPrice = monster.marketInfo.price; Monsters[tokenId] = monster; _transfer(tokenOwner, msg.sender, tokenId); TotalSales.increment(); emit MonsterBought( tokenId, monster.marketInfo.currentOwner, msg.sender, monster.marketInfo.price, monster.marketInfo.nativeCurrency ); } /// @notice Put a sell offer /// @param tokenId Token ID /// @param price price in tokens function SellMonster( uint256 tokenId, bool nativeCurrency, uint256 price ) external MonsterInitialized(tokenId) nonReentrant { require(MarketplaceOpen, "ERR-20"); require(_exists(tokenId), "ERR-10"); address ownerOfMonster = ownerOf(tokenId); require(ownerOfMonster == msg.sender, "ERR-11"); if (MarketplaceOnlyNative && !nativeCurrency) { revert("ERR-25"); } Monster memory monster = Monsters[tokenId]; monster.marketInfo.selling = true; monster.marketInfo.price = price; monster.marketInfo.nativeCurrency = nativeCurrency; Monsters[tokenId] = monster; MonsterOfferings.increment(); emit MonsterIsForSale(tokenId, msg.sender, price, nativeCurrency); } function UpdateMonsterPrice( uint256 tokenId, uint256 newPrice ) external MonsterInitialized(tokenId) nonReentrant { require(MarketplaceOpen, "ERR-20"); address ownerOfMonster = ownerOf(tokenId); require(ownerOfMonster == msg.sender, "ERR-11"); Monster memory monster = Monsters[tokenId]; require(monster.marketInfo.selling, "ERR-21"); monster.marketInfo.price = newPrice; Monsters[tokenId] = monster; emit MonsterSellPriceUpdate(tokenId, msg.sender, newPrice); } function GetAllMonsterForSale() public view returns (uint256[] memory) { uint256 _totalSupply = totalSupply(); uint256[] memory _tokenForSales = new uint256[](_totalSupply); uint256 counter = 0; for (uint256 i = 0; i <= _totalSupply; i++) { if (Monsters[i].marketInfo.selling == true) { _tokenForSales[counter] = Monsters[i].id; counter++; } } return _tokenForSales; } function CancelSelling( uint256 tokenId ) external MonsterInitialized(tokenId) { address ownerOfMonster = ownerOf(tokenId); require(ownerOfMonster == msg.sender); _cancelSelling(tokenId); emit MonsterSellingCanceled(tokenId); } function UpdateTokenURIInfo( string memory _newTokenURIPrefix, string memory _newTokenURISuffix ) external onlyRole(DEFAULT_ADMIN_ROLE) { tokenURIPrefix = _newTokenURIPrefix; tokenURISuffix = _newTokenURISuffix; } function UpdateMintOptions( bool _mintIsOpen, uint256 _mintPrice, bool _isMintWhitelistOnly, uint256 _maxMintQuantity, uint256 _maxMintOnWhitelist, uint256 _whitelistMintPrice ) external onlyRole(DEFAULT_ADMIN_ROLE) { mintIsOpen = _mintIsOpen; mintPrice = _mintPrice; maxMintQuantity = _maxMintQuantity; maxMintOnWhitelist = _maxMintOnWhitelist; isMintWhitelistOnly = _isMintWhitelistOnly; whitelistMintPrice = _whitelistMintPrice; } function GetActualPrice() public view returns (uint256) { return isMintWhitelistOnly ? whitelistMintPrice : mintPrice; } function AddRemainingTokens( uint256[] memory tokens ) external onlyRole(DEFAULT_ADMIN_ROLE) { for (uint256 index = 0; index < tokens.length; index++) { remainingIds.push(tokens[index]); } } function getRemainingTokens() external view returns (uint256[] memory) { return remainingIds; } function UpdateRemainingTokens( uint256 id, uint256 tokenId ) external onlyRole(DEFAULT_ADMIN_ROLE) { remainingIds[id] = tokenId; } function AdminEmergencyIncrementRemainingId() external onlyRole(DEFAULT_ADMIN_ROLE) { _actualTokenSelectorCounter.increment(); } //Royalties function royaltyInfo( uint256 tokenId, uint256 value ) public view override returns (address receiver, uint256 royaltyAmount) { return (royaltiesAddress, (value * royaltiesFees) / 100); } function UpdateRoyalties( address newAddress, uint256 newPercentage ) public onlyRole(DEFAULT_ADMIN_ROLE) { _setRoyaltiesAddress(newAddress); _setRoyaltiesFees(newPercentage); } function UpdateLMTCurrency( address newAddress, uint256 decimals ) external onlyRole(DEFAULT_ADMIN_ROLE) { LMTCurrency = IERC20(newAddress); LMTCurrencyDecimals = decimals; } function ChangeMarketplaceOptions( bool _MarketplaceOpen, bool _MarketplaceOnlyNative ) external onlyRole(DEFAULT_ADMIN_ROLE) { MarketplaceOpen = _MarketplaceOpen; MarketplaceOnlyNative = _MarketplaceOnlyNative; } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); _updateMarketInfo(tokenId, to); } function basicWithdraw( address to ) public payable onlyRole(DEFAULT_ADMIN_ROLE) { (bool os, ) = payable(to).call{value: address(this).balance}(""); require(os); } function withdrawAdmin( IERC20 currency, address to, uint256 amount ) external onlyRole(DEFAULT_ADMIN_ROLE) { require(amount > 0, "ERR-50"); require(to != address(0), "ERR-51"); if (_isNative(currency)) { wavax.withdraw(amount); payable(to).transfer(amount); } else { currency.transfer(to, amount); } } function _isNative(IERC20 currency) internal pure returns (bool) { return address(currency) == address(0); } function burn(uint256 tokenId) external { _burn(tokenId); } function _baseURI() internal view override returns (string memory) { return tokenURIPrefix; } function tokenURI( uint256 tokenId ) public view override(ERC721) returns (string memory) { string memory _tokenUri = string( abi.encodePacked( _baseURI(), Strings.toString(tokenId), tokenURISuffix ) ); return _tokenUri; } function GetAddressTokens( address addr ) public view returns (uint256[] memory) { uint256 addrBalanceOf = balanceOf(addr); uint256[] memory ids = new uint256[](addrBalanceOf); for (uint256 index = 0; index < addrBalanceOf; index++) { uint256 tokenId = tokenOfOwnerByIndex(addr, index); ids[index] = tokenId; } return ids; } bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a; function supportsInterface( bytes4 interfaceId ) public view override(ERC721, ERC721Enumerable, ERC2981, AccessControl) returns (bool) { return interfaceId == _INTERFACE_ID_ERC2981 || super.supportsInterface(interfaceId); } } //ERROR LIST //ERR-10 Monster doenst exists //ERR-11 Not the monster owner //ERR-12 Monster not Initialized //ERR-13 Monster already initialized //ERR-20 Marketplace is closed at the moment //ERR-201 Cant mint yet //ERR-21 Monster is not for sale //ERR-22 Payment failed on BuyMonster //ERR-23 Doenst have the balance to buy the monster //ERR-24 Not allowed to move the funds, approve more tokens to transfer //ERR-25 Marketplace is only in native currency mode //ERR-26 Value not correct //ERR-27 not on whitelist //ERR-28 no nfts left //ERR-29 Cant mint more than total supply //ERR-292 Cant mint more than 3 on whitelist //ERR-293 Cant mit more than the max quantity //ERR-30 Cannot set with diff lenghts //ERR-31 Cannot set more than the limit //ERR-41 Cannot retrieve this nft, not assigned to retrieve //ERR-42 Cannot retrieve again //ERR-43 the start number cannot be more or equal the end number //ERR-44 the start number cannot be more than the max total supply //ERR-50 Amount cannot be 0 //ERR-51 cannot transfer to address(0)
pragma solidity ^0.8.4; import "@openzeppelin/contracts/utils/Address.sol"; interface RoyaltiesInterface { function claimCommunity(uint256 tokenId) external; } abstract contract RoyaltiesAddon { address public royaltiesAddress; uint256 public royaltiesFees; /** * @dev internal set royalties address * @param _royaltiesAddress address of the Royalties.sol */ function _setRoyaltiesAddress( address _royaltiesAddress ) internal { royaltiesAddress = _royaltiesAddress; } function _setRoyaltiesFees(uint256 _royaltiesFees) internal { royaltiesFees = _royaltiesFees; } }
// SPDX-License-Identifier: Unlicense pragma solidity 0.8.17; // import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; // import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/access/AccessControl.sol"; import "@openzeppelin/contracts/utils/Counters.sol"; // import "@openzeppelin/contracts/utils/Strings.sol"; // import "@openzeppelin/contracts/utils/Counters.sol"; // import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; // import "../utils/RoyaltiesAddon.sol"; // import "../utils/ERC2981.sol"; // import "../utils/IWETH.sol"; abstract contract MonsterContract is AccessControl { using Counters for Counters.Counter; bytes32 public constant ATTRIBUTES_ROLE = keccak256("ATTRIBUTES_ROLE"); uint256 constant MAX_TOTAL_SUPPLY = 9999; event MonsterBought( uint256 indexed tokenId, address indexed seller, address indexed buyer, uint256 price, bool nativeCurrency ); event MonsterIsForSale( uint256 indexed tokenId, address indexed seller, uint256 price, bool nativeCurrency ); event MonsterSellPriceUpdate( uint256 indexed tokenId, address indexed seller, uint256 newPrice ); event MonsterSellingCanceled(uint256 indexed tokenId); event MonsterRetrieved(uint256 indexed tokenId); // Structs struct Monster { uint256 id; Market marketInfo; bool initialized; } struct Market { bool selling; uint256 price; uint256 latestPrice; address currentOwner; bool nativeCurrency; uint256 timesTransfer; } struct MonsterAttributes { uint256[] attributes; } mapping(uint256 => Monster) public Monsters; mapping(uint256 => MonsterAttributes) MonstersAttributes; Counters.Counter public MonsterOfferings; modifier MonsterInitialized(uint256 tokenId) { require(Monsters[tokenId].initialized, "ERR-12"); _; } function GetMonster( uint256 tokenId ) external view returns (Monster memory monster, MonsterAttributes memory) { return (Monsters[tokenId], MonstersAttributes[tokenId]); } function UpdateMonsterAttribute( uint256 tokenId, uint256 attrId, uint256 newValue ) external onlyRole(ATTRIBUTES_ROLE) { MonstersAttributes[tokenId].attributes[attrId] = newValue; } function GetAllMonsterForSalePerPage( uint256 start, uint256 end ) public view returns (uint256[] memory) { require(start < MAX_TOTAL_SUPPLY, "ERR-43"); require(start < end, "ERR-44"); uint256 counter = start; uint256 howMany = end > MAX_TOTAL_SUPPLY ? MAX_TOTAL_SUPPLY : end; uint256 quantity = howMany - start; uint256[] memory _tokenForSales = new uint256[](quantity); for (uint256 i = start; i <= howMany; i++) { if (Monsters[i].marketInfo.selling == true) { _tokenForSales[counter] = Monsters[i].id; counter++; } } return _tokenForSales; } function GetAllMonsterSelected( uint256[] memory monstersId ) public view returns (Monster[] memory) { require(monstersId.length < MAX_TOTAL_SUPPLY, "ERR-44"); Monster[] memory _monsters = new Monster[](monstersId.length); for (uint256 i = 0; i < monstersId.length; i++) { uint256 actualId = monstersId[i]; _monsters[i] = Monsters[actualId]; } return _monsters; } function _updateMarketInfo(uint256 tokenId, address newOwner) internal { Monsters[tokenId].marketInfo.currentOwner = newOwner; Monsters[tokenId].marketInfo.timesTransfer += 1; _cancelSelling(tokenId); } function _cancelSelling(uint256 tokenId) internal { if (Monsters[tokenId].marketInfo.selling) { Monsters[tokenId].marketInfo.selling = false; Monsters[tokenId].marketInfo.price = 0; MonsterOfferings.decrement(); } } }
// SPDX-License-Identifier: Unlicense pragma solidity 0.8.17; import "@openzeppelin/contracts/access/AccessControl.sol"; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; abstract contract WhitelistContract is AccessControl { bool public isMintWhitelistOnly = true; mapping(address => bool) WhitelistAddressess; uint256 public maxMintOnWhitelist = 3; uint256 public whitelistMintTimes = 0; IERC721 ZombieEdition; //Partnerships IERC721[] partnerships; modifier whitelistCheck() { if (isMintWhitelistOnly) { bool whitelisted = isWhitelisted(); require(whitelisted, "ERR-27"); } _; } function isWhitelisted() public view returns (bool whitelisted) { bool hasPartnership = false; for (uint i = 0; i < partnerships.length; i++) { if (partnerships[i].balanceOf(msg.sender) > 0) { hasPartnership = true; break; } } bool hasZombie = ZombieEdition.balanceOf(msg.sender) > 0; whitelisted = WhitelistAddressess[msg.sender] || hasZombie || hasPartnership; // return whitelisted; } function UpdateSingleWhitelistAddress( address addr, bool value ) external onlyRole(DEFAULT_ADMIN_ROLE) { WhitelistAddressess[addr] = value; } function AddMultipleWhitelistAddress( address[] memory addrs ) external onlyRole(DEFAULT_ADMIN_ROLE) { for (uint256 index = 0; index < addrs.length; index++) { WhitelistAddressess[addrs[index]] = true; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import '@openzeppelin/contracts/utils/introspection/ERC165.sol'; import './IERC2981.sol'; /// @dev This is a contract used to add ERC2981 support to ERC721 and 1155 abstract contract ERC2981 is ERC165, IERC2981 { bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a; /// @inheritdoc ERC165 function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == _INTERFACE_ID_ERC2981 || super.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.11; interface IWETH { function deposit() external payable; function withdraw(uint256 amount) external; function transfer(address to, uint256 value) external returns (bool); }
// SPDX-License-Identifier: Unlicense pragma solidity 0.8.17; import "@openzeppelin/contracts/access/AccessControl.sol"; abstract contract MigrationContract is AccessControl { struct MigrationHolder { uint256[] tokenIds; uint256 lastId; } uint256 public maxRetrievesPerBatch = 20; mapping(uint256 => address) public MigrationHolders; mapping(uint256 => bool) public MigrationMonsterRetrieved; mapping(address => MigrationHolder) MigrationHoldersAllNfts; function GetMigrationHolder( uint256 tokenId ) external view returns (address) { return MigrationHolders[tokenId]; } function GetMigrationHolders( uint256[] memory tokenIds ) external view returns (address[] memory) { address[] memory addrs = new address[](tokenIds.length); for (uint256 index = 0; index < tokenIds.length; index++) { uint256 tokenId = tokenIds[index]; addrs[index] = MigrationHolders[tokenId]; } return addrs; } function GetMigrationHolderInfo( address addr ) public view returns (uint256[] memory, uint256) { return ( MigrationHoldersAllNfts[addr].tokenIds, MigrationHoldersAllNfts[addr].lastId ); } // function GetMigrationHolderInfo function UpdateMaxRetrievesPerBatch( uint256 newValue ) external onlyRole(DEFAULT_ADMIN_ROLE) { maxRetrievesPerBatch = newValue; } function nftsLeftToCollect() external view returns (uint256) { return MigrationHoldersAllNfts[msg.sender].tokenIds.length - MigrationHoldersAllNfts[msg.sender].lastId; } function AdminSetRetriever( address addr, uint256[] memory tokensId ) external onlyRole(DEFAULT_ADMIN_ROLE) { bool initialized = MigrationHoldersAllNfts[addr].tokenIds.length != 0; if (!initialized) { MigrationHoldersAllNfts[addr] = MigrationHolder(tokensId, 0); } for (uint256 i = 0; i < tokensId.length; i++) { MigrationHolders[tokensId[i]] = addr; if (initialized) MigrationHoldersAllNfts[addr].tokenIds.push(tokensId[i]); } } function AdminAddRetriever( address addr, uint256[] memory tokensId ) external onlyRole(DEFAULT_ADMIN_ROLE) { for (uint256 i = 0; i < tokensId.length; i++) { MigrationHolders[tokensId[i]] = addr; MigrationHoldersAllNfts[addr].tokenIds.push(tokensId[i]); } } }
// SPDX-License-Identifier: MIT pragma solidity >= 0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); function _sendLogPayload(bytes memory payload) private view { uint256 payloadLength = payload.length; address consoleAddress = CONSOLE_ADDRESS; assembly { let payloadStart := add(payload, 32) let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) } } function log() internal view { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(int256)", p0)); } function logUint(uint256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function logString(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function log(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint256 p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1)); } function log(uint256 p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1)); } function log(uint256 p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1)); } function log(uint256 p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1)); } function log(string memory p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1)); } function log(string memory p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1)); } function log(bool p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1)); } function log(address p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint256 p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2)); } function log(uint256 p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2)); } function log(uint256 p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2)); } function log(uint256 p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2)); } function log(uint256 p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2)); } function log(uint256 p0, bool p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2)); } function log(uint256 p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2)); } function log(uint256 p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2)); } function log(uint256 p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2)); } function log(uint256 p0, address p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2)); } function log(uint256 p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2)); } function log(uint256 p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2)); } function log(uint256 p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2)); } function log(string memory p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2)); } function log(string memory p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2)); } function log(string memory p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2)); } function log(string memory p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2)); } function log(bool p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2)); } function log(bool p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2)); } function log(bool p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2)); } function log(address p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2)); } function log(address p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2)); } function log(address p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol) pragma solidity ^0.8.0; import "./IAccessControl.sol"; import "../utils/Context.sol"; import "../utils/Strings.sol"; import "../utils/introspection/ERC165.sol"; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @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); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/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 (last updated v4.7.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./extensions/IERC721Metadata.sol"; import "../../utils/Address.sol"; import "../../utils/Context.sol"; import "../../utils/Strings.sol"; import "../../utils/introspection/ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // 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; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @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 virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @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) { _requireMinted(tokenId); 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 overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_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 { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _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 { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _safeTransfer(from, to, tokenId, data); } /** * @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. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @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`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * 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 ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a 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 _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * 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, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; import "../ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * 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, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.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 /// @solidity memory-safe-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 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; }
// 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.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.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: 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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /// @title IERC2981 /// @dev Interface for the ERC2981 - Token Royalty standard interface IERC2981 { /// @notice Called with the sale price to determine how much royalty // is owed and to whom. /// @param _tokenId - the NFT asset queried for royalty information /// @param _value - the sale price of the NFT asset specified by _tokenId /// @return _receiver - address of who should be sent the royalty payment /// @return _royaltyAmount - the royalty payment amount for value sale price function royaltyInfo(uint256 _tokenId, uint256 _value) external view returns (address _receiver, uint256 _royaltyAmount); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
{ "optimizer": { "enabled": true, "runs": 100 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
[{"inputs":[{"internalType":"address","name":"royaltiesAddr","type":"address"},{"internalType":"address","name":"zombieEditionAddress","type":"address"},{"internalType":"address[]","name":"partnershipAddress","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"seller","type":"address"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"bool","name":"nativeCurrency","type":"bool"}],"name":"MonsterBought","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"bool","name":"nativeCurrency","type":"bool"}],"name":"MonsterIsForSale","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"MonsterRetrieved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"MonsterSellPriceUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"MonsterSellingCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ATTRIBUTES_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"AVAXSpend","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"}],"name":"AddMultipleWhitelistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokens","type":"uint256[]"}],"name":"AddRemainingTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256[]","name":"tokensId","type":"uint256[]"}],"name":"AdminAddRetriever","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"AdminBatchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"AdminEmergencyIncrementRemainingId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"AdminMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256[]","name":"tokensId","type":"uint256[]"}],"name":"AdminSetRetriever","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"BuyMonster","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"CancelSelling","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_MarketplaceOpen","type":"bool"},{"internalType":"bool","name":"_MarketplaceOnlyNative","type":"bool"}],"name":"ChangeMarketplaceOptions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GetActualPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GetActualTokenForMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"GetAddressTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GetAllMonsterForSale","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"GetAllMonsterForSalePerPage","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"monstersId","type":"uint256[]"}],"name":"GetAllMonsterSelected","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"components":[{"internalType":"bool","name":"selling","type":"bool"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"latestPrice","type":"uint256"},{"internalType":"address","name":"currentOwner","type":"address"},{"internalType":"bool","name":"nativeCurrency","type":"bool"},{"internalType":"uint256","name":"timesTransfer","type":"uint256"}],"internalType":"struct MonsterContract.Market","name":"marketInfo","type":"tuple"},{"internalType":"bool","name":"initialized","type":"bool"}],"internalType":"struct MonsterContract.Monster[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"GetMigrationHolder","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"GetMigrationHolderInfo","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"GetMigrationHolders","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"GetMonster","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"components":[{"internalType":"bool","name":"selling","type":"bool"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"latestPrice","type":"uint256"},{"internalType":"address","name":"currentOwner","type":"address"},{"internalType":"bool","name":"nativeCurrency","type":"bool"},{"internalType":"uint256","name":"timesTransfer","type":"uint256"}],"internalType":"struct MonsterContract.Market","name":"marketInfo","type":"tuple"},{"internalType":"bool","name":"initialized","type":"bool"}],"internalType":"struct MonsterContract.Monster","name":"monster","type":"tuple"},{"components":[{"internalType":"uint256[]","name":"attributes","type":"uint256[]"}],"internalType":"struct MonsterContract.MonsterAttributes","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LMTCurrency","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LMTCurrencyDecimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LMTSpend","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MarketplaceOnlyNative","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MarketplaceOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"MigrationHolders","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"MigrationMonsterRetrieved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MonsterOfferings","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"Monsters","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"components":[{"internalType":"bool","name":"selling","type":"bool"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"latestPrice","type":"uint256"},{"internalType":"address","name":"currentOwner","type":"address"},{"internalType":"bool","name":"nativeCurrency","type":"bool"},{"internalType":"uint256","name":"timesTransfer","type":"uint256"}],"internalType":"struct MonsterContract.Market","name":"marketInfo","type":"tuple"},{"internalType":"bool","name":"initialized","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RegisterAllMyMonster","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"RegisterMonster","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"RetrieveMonster","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"RetrieveMonstersMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"nativeCurrency","type":"bool"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"SellMonster","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TotalSales","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"},{"internalType":"uint256","name":"decimals","type":"uint256"}],"name":"UpdateLMTCurrency","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"UpdateMaxRetrievesPerBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_mintIsOpen","type":"bool"},{"internalType":"uint256","name":"_mintPrice","type":"uint256"},{"internalType":"bool","name":"_isMintWhitelistOnly","type":"bool"},{"internalType":"uint256","name":"_maxMintQuantity","type":"uint256"},{"internalType":"uint256","name":"_maxMintOnWhitelist","type":"uint256"},{"internalType":"uint256","name":"_whitelistMintPrice","type":"uint256"}],"name":"UpdateMintOptions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"attrId","type":"uint256"},{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"UpdateMonsterAttribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"UpdateMonsterPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"UpdateRemainingTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"},{"internalType":"uint256","name":"newPercentage","type":"uint256"}],"name":"UpdateRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"UpdateSingleWhitelistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newTokenURIPrefix","type":"string"},{"internalType":"string","name":"_newTokenURISuffix","type":"string"}],"name":"UpdateTokenURIInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"basePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"basicWithdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRemainingTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenAvailable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMintWhitelistOnly","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"whitelisted","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintOnWhitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintQuantity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxRetrievesPerBatch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintIsOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftsLeftToCollect","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"publicMultiMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"remainingIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royaltiesAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltiesFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenURIPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenURISuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wavax","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMintTimes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"currency","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60146010819055805460ff191660011790556003601655600060175573b31f66aa3c1e785363f0875a1b74e27b85fd66c7608052601d805461ffff1916610100908117909155604052603660a081815290620065c160c03960219062000066908262000624565b50604080518082019091526005815264173539b7b760d91b602082015260229062000092908262000624565b50675a34a38fc00a00006023556798a7d9b8314c0000602455600c60255560966026556029805460ff19169055348015620000cc57600080fd5b50604051620065f7380380620065f7833981016040819052620000ef916200070d565b6040518060400160405280600c81526020016b2637bb329026b7b739ba32b960a11b815250604051806040016040528060028152602001614c4d60f01b815250816000908162000140919062000624565b5060016200014f828262000624565b50506001601a55506200016460003362000236565b620001907f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a63362000236565b6200019d836006620002c1565b601880546001600160a01b0319166001600160a01b03841617905560005b81518110156200022c576019828281518110620001dc57620001dc62000807565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b0390921691909117905580620002238162000833565b915050620001bb565b505050506200096d565b620002428282620002f8565b620002bd576000828152600c602090815260408083206001600160a01b03851684529091529020805460ff191660011790556200027c3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000620002ce8162000325565b600a80546001600160a01b0319166001600160a01b038516179055620002f382600b55565b505050565b6000828152600c602090815260408083206001600160a01b038516845290915290205460ff165b92915050565b62000331813362000334565b50565b620003408282620002f8565b620002bd5762000366816001600160a01b03166014620003c060201b62003b671760201c565b6200037c83602062003b67620003c0821b17811c565b6040516020016200038f92919062000875565b60408051601f198184030181529082905262461bcd60e51b8252620003b791600401620008ee565b60405180910390fd5b60606000620003d183600262000923565b620003de9060026200093d565b6001600160401b03811115620003f857620003f862000580565b6040519080825280601f01601f19166020018201604052801562000423576020820181803683370190505b509050600360fc1b8160008151811062000441576200044162000807565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811062000473576200047362000807565b60200101906001600160f81b031916908160001a90535060006200049984600262000923565b620004a69060016200093d565b90505b600181111562000528576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110620004de57620004de62000807565b1a60f81b828281518110620004f757620004f762000807565b60200101906001600160f81b031916908160001a90535060049490941c93620005208162000953565b9050620004a9565b508315620005795760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401620003b7565b9392505050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620005ab57607f821691505b602082108103620005cc57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002f357600081815260208120601f850160051c81016020861015620005fb5750805b601f850160051c820191505b818110156200061c5782815560010162000607565b505050505050565b81516001600160401b0381111562000640576200064062000580565b620006588162000651845462000596565b84620005d2565b602080601f831160018114620006905760008415620006775750858301515b600019600386901b1c1916600185901b1785556200061c565b600085815260208120601f198616915b82811015620006c157888601518255948401946001909101908401620006a0565b5085821015620006e05787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80516001600160a01b03811681146200070857600080fd5b919050565b6000806000606084860312156200072357600080fd5b6200072e84620006f0565b925060206200073f818601620006f0565b60408601519093506001600160401b03808211156200075d57600080fd5b818701915087601f8301126200077257600080fd5b81518181111562000787576200078762000580565b8060051b604051601f19603f83011681018181108582111715620007af57620007af62000580565b60405291825284820192508381018501918a831115620007ce57600080fd5b938501935b82851015620007f757620007e785620006f0565b84529385019392850192620007d3565b8096505050505050509250925092565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016200084857620008486200081d565b5060010190565b60005b838110156200086c57818101518382015260200162000852565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351620008af8160178501602088016200084f565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351620008e28160288401602088016200084f565b01602801949350505050565b60208152600082518060208401526200090f8160408501602087016200084f565b601f01601f19169190910160400192915050565b80820281158282048414176200031f576200031f6200081d565b808201808211156200031f576200031f6200081d565b6000816200096557620009656200081d565b506000190190565b608051615c3162000990600039600081816106ce01526118e10152615c316000f3fe6080604052600436106105025760003560e01c8063611be80411610297578063aa1152ab11610165578063c836dcca116100cc578063dbbc853b11610085578063dbbc853b1461102b578063e0fca48414611040578063e528045b14611055578063e985e9c51461106a578063ee6d9d6d1461108a578063fc5e203f146110aa57600080fd5b8063c836dcca14610f5e578063c87b56dd14610f75578063ce74fb5714610f95578063d539139314610fc9578063d547741f14610feb578063d8dddf5a1461100b57600080fd5b8063b4dea8501161011e578063b4dea85014610e9d578063b88d4fde14610ed3578063be5f056514610ef3578063bee8a81314610f13578063c0ac998314610f33578063c7876ea414610f4857600080fd5b8063aa1152ab14610deb578063ac521edb14610e05578063ae9aea6d14610e25578063af2c466a14610e3b578063af35ae2714610e68578063af98fa4514610e7d57600080fd5b80638a70e71b116102095780639b6eae20116101c25780639b6eae2014610d365780639bdd48d314610d565780639ed900b314610d76578063a217fddf14610d89578063a22cb46514610d9e578063a6bc7cb314610dbe57600080fd5b80638a70e71b14610c7f5780638ad40ebe14610caf57806391d1485414610ccf5780639311d40b14610cef57806395d89b4114610d0e57806398a01e5614610d2357600080fd5b806370a082311161025b57806370a0823114610bc75780637a930da314610be757806380b530c114610bfd57806380c644f114610c135780638461c4a514610c29578063889f85e014610c5f57600080fd5b8063611be80414610b2f5780636352211e14610b4f5780636817c76c14610b6f5780636f6de69d14610b855780636fe41d9f14610bb257600080fd5b806328c9300d116103d4578063411375df116103465780634f6ccce7116102ff5780634f6ccce714610a8f57806355549ecd14610aaf5780635e6804f014610acf5780635fba8bf614610ae457806360b71e0914610afa578063611b409514610b1a57600080fd5b8063411375df146109cb57806342842e0e146109f957806342966c6814610a19578063460b4b8e14610a395780634beae64e14610a4f5780634db6fc4f14610a6f57600080fd5b806332882535116103985780633288253514610920578063357081891461094057806335c6aaf81461096057806336568abe146109765780633ec05ad614610996578063406560a4146109ab57600080fd5b806328c9300d146108725780632a55205a146108925780632f1b5db1146108c05780632f2ff15d146108e05780632f745c591461090057600080fd5b80630cef6b32116104785780631b0fd31f116104315780631b0fd31f1461071a5780631b7af3af146107c15780632072b594146107d4578063232f60e11461080257806323b872dd14610822578063248a9ca31461084257600080fd5b80630cef6b321461067a578063108b6d2214610690578063113bcf75146106a5578063117be4c2146106bc57806317a217b7146106f057806318160ddd1461070557600080fd5b8063081812fc116104ca578063081812fc146105b1578063088a22bb146105de578063095ea7b3146105f85780630a582ecc1461061a5780630b521a751461063a5780630c1252f51461065a57600080fd5b80630158921e1461050757806301a7d6a31461053057806301ffc9a7146105455780630343990b1461057557806306fdde031461058f575b600080fd5b34801561051357600080fd5b5061051d601c5481565b6040519081526020015b60405180910390f35b34801561053c57600080fd5b5061051d6110ca565b34801561055157600080fd5b50610565610560366004614cd2565b6110ef565b6040519015158152602001610527565b34801561058157600080fd5b506014546105659060ff1681565b34801561059b57600080fd5b506105a461111a565b6040516105279190614d3f565b3480156105bd57600080fd5b506105d16105cc366004614d52565b6111ac565b6040516105279190614d6b565b3480156105ea57600080fd5b50601d546105659060ff1681565b34801561060457600080fd5b50610618610613366004614d94565b6111d3565b005b34801561062657600080fd5b50610618610635366004614e89565b6112ed565b34801561064657600080fd5b50610618610655366004614ecb565b611349565b34801561066657600080fd5b50610618610675366004614d52565b6116af565b34801561068657600080fd5b5061051d601f5481565b34801561069c57600080fd5b5061051d611736565b3480156106b157600080fd5b50601e5461051d9081565b3480156106c857600080fd5b506105d17f000000000000000000000000000000000000000000000000000000000000000081565b3480156106fc57600080fd5b50610618611751565b34801561071157600080fd5b5060085461051d565b34801561072657600080fd5b506107b2610735366004614d52565b600d602090815260009182526040918290208054835160c081018552600183015460ff9081161515825260028401549482019490945260038301549481019490945260048201546001600160a01b0381166060860152600160a01b9004831615156080850152600582015460a08501526006909101549092911683565b60405161052793929190614f47565b6106186107cf366004614f6c565b61176d565b3480156107e057600080fd5b506107f46107ef366004614f6c565b6117d8565b604051610527929190614fc4565b34801561080e57600080fd5b5061061861081d366004614fe6565b611853565b34801561082e57600080fd5b5061061861083d366004614fe6565b6119fa565b34801561084e57600080fd5b5061051d61085d366004614d52565b6000908152600c602052604090206001015490565b34801561087e57600080fd5b5061061861088d366004614d94565b611a2b565b34801561089e57600080fd5b506108b26108ad366004615016565b611a5d565b604051610527929190615038565b3480156108cc57600080fd5b506106186108db366004614d52565b611a96565b3480156108ec57600080fd5b506106186108fb366004615051565b611b11565b34801561090c57600080fd5b5061051d61091b366004614d94565b611b36565b34801561092c57600080fd5b50600a546105d1906001600160a01b031681565b34801561094c57600080fd5b5061061861095b366004615081565b611bcc565b34801561096c57600080fd5b5061051d60235481565b34801561098257600080fd5b50610618610991366004615051565b611c03565b3480156109a257600080fd5b50610618611c81565b3480156109b757600080fd5b506106186109c6366004614d94565b611d73565b3480156109d757600080fd5b506109eb6109e6366004614d52565b611da2565b6040516105279291906150d5565b348015610a0557600080fd5b50610618610a14366004614fe6565b611ea9565b348015610a2557600080fd5b50610618610a34366004614d52565b611ec4565b348015610a4557600080fd5b5061051d60175481565b348015610a5b57600080fd5b50610618610a6a36600461510b565b611ecd565b348015610a7b57600080fd5b50601b546105d1906001600160a01b031681565b348015610a9b57600080fd5b5061051d610aaa366004614d52565b611efd565b348015610abb57600080fd5b50610618610aca366004615129565b611f90565b348015610adb57600080fd5b50610618612003565b348015610af057600080fd5b5061051d60105481565b348015610b0657600080fd5b50610618610b15366004614d52565b6120ad565b348015610b2657600080fd5b5061056561213b565b348015610b3b57600080fd5b50610618610b4a3660046151c2565b61229f565b348015610b5b57600080fd5b506105d1610b6a366004614d52565b6122fe565b348015610b7b57600080fd5b5061051d60245481565b348015610b9157600080fd5b50610ba5610ba0366004614f6c565b612333565b60405161052791906151ee565b348015610bbe57600080fd5b5061051d6123da565b348015610bd357600080fd5b5061051d610be2366004614f6c565b6123e5565b348015610bf357600080fd5b5061051d60165481565b348015610c0957600080fd5b5061051d60205481565b348015610c1f57600080fd5b5061051d600b5481565b348015610c3557600080fd5b506105d1610c44366004614d52565b6011602052600090815260409020546001600160a01b031681565b348015610c6b57600080fd5b50610618610c7a366004615201565b61246b565b348015610c8b57600080fd5b50610565610c9a366004614d52565b60126020526000908152604090205460ff1681565b348015610cbb57600080fd5b50610618610cca366004615201565b6125a4565b348015610cdb57600080fd5b50610565610cea366004615051565b61265c565b348015610cfb57600080fd5b50601d5461056590610100900460ff1681565b348015610d1a57600080fd5b506105a4612687565b610618610d31366004614d52565b612696565b348015610d4257600080fd5b50610618610d51366004615051565b612d57565b348015610d6257600080fd5b50610ba5610d71366004615016565b612e17565b610618610d84366004614d52565b612f5f565b348015610d9557600080fd5b5061051d600081565b348015610daa57600080fd5b50610618610db9366004615081565b61325c565b348015610dca57600080fd5b50610dde610dd9366004614e89565b613267565b6040516105279190615250565b348015610df757600080fd5b506029546105659060ff1681565b348015610e1157600080fd5b50610618610e2036600461529f565b6133d6565b348015610e3157600080fd5b5061051d60255481565b348015610e4757600080fd5b50610e5b610e56366004614e89565b613415565b60405161052791906152fb565b348015610e7457600080fd5b50610ba56134ec565b348015610e8957600080fd5b50610618610e98366004615016565b613543565b348015610ea957600080fd5b506105d1610eb8366004614d52565b6000908152601160205260409020546001600160a01b031690565b348015610edf57600080fd5b50610618610eee366004615393565b613573565b348015610eff57600080fd5b50610618610f0e366004615432565b6135a5565b348015610f1f57600080fd5b50610618610f2e366004615016565b6135c9565b348015610f3f57600080fd5b506105a4613811565b348015610f5457600080fd5b5061051d60265481565b348015610f6a57600080fd5b50600f5461051d9081565b348015610f8157600080fd5b506105a4610f90366004614d52565b61389f565b348015610fa157600080fd5b5061051d7ffa906453d8dc5649fa040e52091d62568d37fa875e4cabbcc74015f18d0aa18581565b348015610fd557600080fd5b5061051d600080516020615bbc83398151915281565b348015610ff757600080fd5b50610618611006366004615051565b6138df565b34801561101757600080fd5b50610618611026366004615051565b613904565b34801561103757600080fd5b506105a46139dc565b34801561104c57600080fd5b5061051d6139e9565b34801561106157600080fd5b50610ba5613a31565b34801561107657600080fd5b5061056561108536600461548b565b613b07565b34801561109657600080fd5b5061051d6110a5366004614d52565b613b35565b3480156110b657600080fd5b506106186110c5366004614d52565b613b56565b336000908152601360205260408120600181015490546110ea91906154cf565b905090565b60006001600160e01b0319821663152a902d60e11b1480611114575061111482613d09565b92915050565b606060008054611129906154e2565b80601f0160208091040260200160405190810160405280929190818152602001828054611155906154e2565b80156111a25780601f10611177576101008083540402835291602001916111a2565b820191906000526020600020905b81548152906001019060200180831161118557829003601f168201915b5050505050905090565b60006111b782613d2e565b506000908152600460205260409020546001600160a01b031690565b60006111de826122fe565b9050806001600160a01b0316836001600160a01b0316036112505760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b038216148061126c575061126c8133613b07565b6112de5760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401611247565b6112e88383613d53565b505050565b60006112f881613dc1565b60005b82518110156112e85760278382815181106113185761131861551c565b602090810291909101810151825460018101845560009384529190922001558061134181615532565b9150506112fb565b6000838152600d6020526040902060060154839060ff1661137c5760405162461bcd60e51b81526004016112479061554b565b6002601a540361139e5760405162461bcd60e51b81526004016112479061556b565b6002601a55601d5460ff166113c55760405162461bcd60e51b8152600401611247906155a2565b6113ce84613dcb565b6113ea5760405162461bcd60e51b8152600401611247906155c2565b60006113f5856122fe565b90506001600160a01b038116331461141f5760405162461bcd60e51b8152600401611247906155e2565b601d54610100900460ff168015611434575083155b1561146a5760405162461bcd60e51b81526020600482015260066024820152654552522d323560d01b6044820152606401611247565b6000600d600087815260200190815260200160002060405180606001604052908160008201548152602001600182016040518060c00160405290816000820160009054906101000a900460ff1615151515815260200160018201548152602001600282015481526020016003820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016003820160149054906101000a900460ff1615151515815260200160048201548152505081526020016006820160009054906101000a900460ff16151515158152505090506001816020015160000190151590811515815250508381602001516020018181525050848160200151608001901515908115158152505080600d60008881526020019081526020016000206000820151816000015560208201518160010160008201518160000160006101000a81548160ff021916908315150217905550602082015181600101556040820151816002015560608201518160030160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060808201518160030160146101000a81548160ff02191690831515021790555060a08201518160040155505060408201518160060160006101000a81548160ff021916908315150217905550905050611664600f80546001019055565b604080518581528615156020820152339188917f8061389be9e26d8277583c3323e175d469e5d9fc615b85def7fe0c637ed1ad91910160405180910390a350506001601a5550505050565b6002601a54036116d15760405162461bcd60e51b81526004016112479061556b565b6002601a556000818152601160205260409020546001600160a01b031633146117255760405162461bcd60e51b81526020600482015260066024820152654552522d343160d01b6044820152606401611247565b61172e81613de8565b506001601a55565b60145460009060ff1661174a575060245490565b5060235490565b600061175c81613dc1565b61176a602880546001019055565b50565b600061177881613dc1565b6000826001600160a01b03164760405160006040518083038185875af1925050503d80600081146117c5576040519150601f19603f3d011682016040523d82523d6000602084013e6117ca565b606091505b50509050806112e857600080fd5b6001600160a01b038116600090815260136020908152604080832060018101548154835181860281018601909452808452606095949293919284919083018282801561184357602002820191906000526020600020905b81548152602001906001019080831161182f575b5050505050915091509150915091565b600061185e81613dc1565b6000821161187e5760405162461bcd60e51b815260040161124790615602565b6001600160a01b0383166118bd5760405162461bcd60e51b81526020600482015260066024820152654552522d353160d01b6044820152606401611247565b6001600160a01b03841661198157604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561192d57600080fd5b505af1158015611941573d6000803e3d6000fd5b50506040516001600160a01b038616925084156108fc02915084906000818181858888f1935050505015801561197b573d6000803e3d6000fd5b506119f4565b60405163a9059cbb60e01b81526001600160a01b0385169063a9059cbb906119af9086908690600401615038565b6020604051808303816000875af11580156119ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f29190615622565b505b50505050565b611a043382613e8a565b611a205760405162461bcd60e51b81526004016112479061563f565b6112e8838383613ee9565b6000611a3681613dc1565b50601b80546001600160a01b0319166001600160a01b039390931692909217909155601c55565b600a54600b5460009182916001600160a01b0390911690606490611a81908661568d565b611a8b91906156ba565b915091509250929050565b6002601a5403611ab85760405162461bcd60e51b81526004016112479061556b565b6002601a556000818152600d602052604090206006015460ff1615611b085760405162461bcd60e51b81526020600482015260066024820152654552522d313360d01b6044820152606401611247565b61172e8161407e565b6000828152600c6020526040902060010154611b2c81613dc1565b6112e883836141f9565b6000611b41836123e5565b8210611ba35760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401611247565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6000611bd781613dc1565b506001600160a01b03919091166000908152601560205260409020805460ff1916911515919091179055565b6001600160a01b0381163314611c735760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401611247565b611c7d828261427f565b5050565b6002601a5403611ca35760405162461bcd60e51b81526004016112479061556b565b6002601a55600080611cb4336117d8565b915091506000825160105483611cca91906156ce565b11611ce157601054611cdc90836156ce565b611ce4565b82515b905060008111611d065760405162461bcd60e51b815260040161124790615602565b815b81811015611d68576000848281518110611d2457611d2461551c565b60200260200101519050611d3781613de8565b611d428260016156ce565b336000908152601360205260409020600101555080611d6081615532565b915050611d08565b50506001601a555050565b6000611d7e81613dc1565b600a80546001600160a01b0319166001600160a01b0385161790556112e882600b55565b611daa614bf7565b604080516020808201835260608083526000868152600d8352848120600e8452908590208551808401875282548152865160c081018852600184015460ff908116151582526002850154828801526003850154828a015260048501546001600160a01b03811696830196909652600160a01b909504851615156080820152600584015460a082015281860152600690920154909216151581860152845182548085028201870187529381018481529495919492939092849284928491840182828015611e9557602002820191906000526020600020905b815481526020019060010190808311611e81575b505050505081525050905091509150915091565b6112e883838360405180602001604052806000815250613573565b61176a816142e6565b6000611ed881613dc1565b50601d805461ffff191692151561ff0019169290921761010091151591909102179055565b6000611f0860085490565b8210611f6b5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401611247565b60088281548110611f7e57611f7e61551c565b90600052602060002001549050919050565b6000611f9b81613dc1565b60005b82518110156112e857600160156000858481518110611fbf57611fbf61551c565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611ffb81615532565b915050611f9e565b6002601a54036120255760405162461bcd60e51b81526004016112479061556b565b6002601a55600061203533612333565b905060005b81518110156120a45760008282815181106120575761205761551c565b6020908102919091018101516000818152600d90925260409091206006015490915060ff16156120875750612092565b6120908161407e565b505b8061209c81615532565b91505061203a565b50506001601a55565b6000818152600d6020526040902060060154819060ff166120e05760405162461bcd60e51b81526004016112479061554b565b60006120eb836122fe565b90506001600160a01b038116331461210257600080fd5b61210b8361437b565b60405183907f132dfa87b35a5511c6e5a246c1aea497e06d538a73e2357a3f54dde4b5b0e7de90600090a2505050565b600080805b6019548110156121fa5760006019828154811061215f5761215f61551c565b6000918252602090912001546040516370a0823160e01b81526001600160a01b03909116906370a0823190612198903390600401614d6b565b602060405180830381865afa1580156121b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121d991906156e1565b11156121e857600191506121fa565b806121f281615532565b915050612140565b506018546040516370a0823160e01b815260009182916001600160a01b03909116906370a0823190612230903390600401614d6b565b602060405180830381865afa15801561224d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061227191906156e1565b336000908152601560205260409020549110915060ff16806122905750805b806122985750815b9250505090565b7ffa906453d8dc5649fa040e52091d62568d37fa875e4cabbcc74015f18d0aa1856122c981613dc1565b6000848152600e602052604090208054839190859081106122ec576122ec61551c565b60009182526020909120015550505050565b6000818152600260205260408120546001600160a01b0316806111145760405162461bcd60e51b8152600401611247906156fa565b60606000612340836123e5565b90506000816001600160401b0381111561235c5761235c614dc0565b604051908082528060200260200182016040528015612385578160200160208202803683370190505b50905060005b828110156123d257600061239f8683611b36565b9050808383815181106123b4576123b461551c565b602090810291909101015250806123ca81615532565b91505061238b565b509392505050565b60006110ea60285490565b60006001600160a01b03821661244f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401611247565b506001600160a01b031660009081526003602052604090205490565b600061247681613dc1565b6001600160a01b0383166000908152601360205260409020541515806124e357604080518082018252848152600060208083018290526001600160a01b03881682526013815292902081518051929391926124d49284920190614c5c565b50602082015181600101559050505b60005b83518110156119f25784601160008684815181106125065761250661551c565b6020026020010151815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055508115612592576001600160a01b038516600090815260136020526040902084518590839081106125725761257261551c565b602090810291909101810151825460018101845560009384529190922001555b8061259c81615532565b9150506124e6565b60006125af81613dc1565b60005b82518110156119f45783601160008584815181106125d2576125d261551c565b6020908102919091018101518252818101929092526040908101600090812080546001600160a01b0319166001600160a01b03958616179055928716835260139091529020835184908390811061262b5761262b61551c565b602090810291909101810151825460018101845560009384529190922001558061265481615532565b9150506125b2565b6000918252600c602090815260408084206001600160a01b0393909316845291905290205460ff1690565b606060018054611129906154e2565b6000818152600d6020526040902060060154819060ff166126c95760405162461bcd60e51b81526004016112479061554b565b6002601a54036126eb5760405162461bcd60e51b81526004016112479061556b565b6002601a55601d5460ff166127125760405162461bcd60e51b8152600401611247906155a2565b61271b82613dcb565b6127375760405162461bcd60e51b8152600401611247906155c2565b6000612742836122fe565b9050336001600160a01b0382160361276c5760405162461bcd60e51b8152600401611247906155e2565b6000838152600d602090815260409182902082516060808201855282548252845160c081018652600184015460ff9081161515825260028501548287015260038501548288015260048501546001600160a01b03811693830193909352600160a01b909204821615156080820152600584015460a0820152938201849052600690920154909116151592810192909252516128195760405162461bcd60e51b81526004016112479061572c565b600081602001516080015161284e57601c5461283690600a615830565b826020015160200151612849919061568d565b612858565b8160200151602001515b90506000806128678784611a5d565b9092509050600061287882856154cf565b90508460200151608001511561293e57833410156128a85760405162461bcd60e51b81526004016112479061583c565b8460200151606001516001600160a01b03166108fc829081150290604051600060405180830381858888f193505050501580156128e9573d6000803e3d6000fd5b506040516001600160a01b0384169083156108fc029084906000818181858888f19350505050158015612920573d6000803e3d6000fd5b50836020600082825461293391906156ce565b90915550612c2a9050565b601b546040516370a0823160e01b815285916001600160a01b0316906370a082319061296e903390600401614d6b565b602060405180830381865afa15801561298b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129af91906156e1565b10156129e65760405162461bcd60e51b81526020600482015260066024820152654552522d323360d01b6044820152606401611247565b601b54604051636eb1769f60e11b815230600482015233602482015285916001600160a01b03169063dd62ed3e90604401602060405180830381865afa158015612a34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a5891906156e1565b1015612a8f5760405162461bcd60e51b81526020600482015260066024820152651154948b4c8d60d21b6044820152606401611247565b601b546040516323b872dd60e01b8152336004820152306024820152604481018690526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015612ae6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b0a9190615622565b612b265760405162461bcd60e51b81526004016112479061583c565b601b5460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90612b589033908590600401615038565b6020604051808303816000875af1158015612b77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b9b9190615622565b50601b5460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90612bce9086908690600401615038565b6020604051808303816000875af1158015612bed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c119190615622565b5083601f6000828254612c2491906156ce565b90915550505b602080860180518083015160409182015260008b8152600d8452819020885181559151805160018401805491151560ff19928316179055938101516002840155808201516003840155606081015160048401805460808401511515600160a01b026001600160a81b03199091166001600160a01b039093169290921791909117905560a0015160058301558701516006909101805491151591909216179055612cd486338a613ee9565b612ce2601e80546001019055565b60208086015160608101519181015160809091015160405133936001600160a01b0316928c927fe9917050503e9343adf804d543af4b9ea0f7c448ca38e9b8748161b5ac48b88192612d409291909182521515602082015260400190565b60405180910390a450506001601a55505050505050565b600080516020615bbc833981519152612d6f81613dc1565b6002601a5403612d915760405162461bcd60e51b81526004016112479061556b565b6002601a5561270f612da260085490565b10612dbf5760405162461bcd60e51b81526004016112479061585c565b60008311612ddf5760405162461bcd60e51b81526004016112479061587c565b612de933846143bd565b612df28361407e565b6001600160a01b0382163314612e0d57612e0d338385613ee9565b50506001601a5550565b606061270f8310612e535760405162461bcd60e51b81526020600482015260066024820152654552522d343360d01b6044820152606401611247565b818310612e725760405162461bcd60e51b81526004016112479061589c565b82600061270f8411612e845783612e88565b61270f5b90506000612e9686836154cf565b90506000816001600160401b03811115612eb257612eb2614dc0565b604051908082528060200260200182016040528015612edb578160200160208202803683370190505b509050865b838111612f54576000818152600d6020526040902060019081015460ff1615159003612f42576000818152600d60205260409020548251839087908110612f2957612f2961551c565b602090810291909101015284612f3e81615532565b9550505b80612f4c81615532565b915050612ee0565b509695505050505050565b60145460ff1615612fae576000612f7461213b565b905080612fac5760405162461bcd60e51b81526020600482015260066024820152654552522d323760d01b6044820152606401611247565b505b6002601a5403612fd05760405162461bcd60e51b81526004016112479061556b565b6002601a5580600081612fe1611736565b612feb919061568d565b9050803410156130265760405162461bcd60e51b815260206004820152600660248201526522a92916991b60d11b6044820152606401611247565b60145460009060ff1661303b5760255461303f565b6016545b90506000841161307b5760405162461bcd60e51b81526020600482015260076024820152661154948b4c8e4d60ca1b6044820152606401611247565b60295460ff166130b75760405162461bcd60e51b81526020600482015260076024820152664552522d32303160c81b6044820152606401611247565b808411156130f15760405162461bcd60e51b81526020600482015260076024820152664552522d32393360c81b6044820152606401611247565b60145460ff161561315257601654336000908152602a602052604090205461311a9086906156ce565b11156131525760405162461bcd60e51b815260206004820152600760248201526622a92916991c9960c91b6044820152606401611247565b61270f8461315f60085490565b61316991906156ce565b11156131875760405162461bcd60e51b81526004016112479061585c565b600061319260285490565b6027549091506131a286836156ce565b11156131c05760405162461bcd60e51b81526004016112479061587c565b60005b8581101561322b5760006131d56139e9565b9050600081116131f75760405162461bcd60e51b81526004016112479061587c565b61320133826143bd565b61320a8161407e565b613218602880546001019055565b508061322381615532565b9150506131c3565b50336000908152602a60205260408120805487929061324b9084906156ce565b90915550506001601a555050505050565b611c7d3383836144ea565b606061270f82511061328b5760405162461bcd60e51b81526004016112479061589c565b600082516001600160401b038111156132a6576132a6614dc0565b6040519080825280602002602001820160405280156132df57816020015b6132cc614bf7565b8152602001906001900390816132c45790505b50905060005b83518110156133cf5760008482815181106133025761330261551c565b6020908102919091018101516000818152600d835260409081902081516060808201845282548252835160c081018552600184015460ff9081161515825260028501548289015260038501548287015260048501546001600160a01b03811693830193909352600160a01b909204821615156080820152600584015460a08201529582019590955260069091015490931615159083015284519092508490849081106133b0576133b061551c565b60200260200101819052505080806133c790615532565b9150506132e5565b5092915050565b60006133e181613dc1565b506029805496151560ff19978816179055602494909455602591909155601655601480549115159190931617909155602355565b6060600082516001600160401b0381111561343257613432614dc0565b60405190808252806020026020018201604052801561345b578160200160208202803683370190505b50905060005b83518110156133cf57600084828151811061347e5761347e61551c565b602002602001015190506011600082815260200190815260200160002060009054906101000a90046001600160a01b03168383815181106134c1576134c161551c565b6001600160a01b039092166020928302919091019091015250806134e481615532565b915050613461565b606060278054806020026020016040519081016040528092919081815260200182805480156111a257602002820191906000526020600020905b815481526020019060010190808311613526575050505050905090565b600061354e81613dc1565b81602784815481106135625761356261551c565b600091825260209091200155505050565b61357d3383613e8a565b6135995760405162461bcd60e51b81526004016112479061563f565b6119f4848484846145b4565b60006135b081613dc1565b60216135bc848261590a565b5060226119f4838261590a565b6000828152600d6020526040902060060154829060ff166135fc5760405162461bcd60e51b81526004016112479061554b565b6002601a540361361e5760405162461bcd60e51b81526004016112479061556b565b6002601a55601d5460ff166136455760405162461bcd60e51b8152600401611247906155a2565b6000613650846122fe565b90506001600160a01b038116331461367a5760405162461bcd60e51b8152600401611247906155e2565b6000848152600d602090815260409182902082516060808201855282548252845160c081018652600184015460ff9081161515825260028501548287015260038501548288015260048501546001600160a01b03811693830193909352600160a01b909204821615156080820152600584015460a0820152938201849052600690920154909116151592810192909252516137275760405162461bcd60e51b81526004016112479061572c565b6020808201805182018690526000878152600d8352604090819020845181559151805160018401805491151560ff19928316179055938101516002840155808201516003840155606081015160048401805460808401511515600160a01b026001600160a81b03199091166001600160a01b039093169290921791909117905560a0015160058301558084015160069092018054921515929093169190911790915551339086907f705ed5ca347bb98c364220493b317f3e4e1494f59c2d20fd4b50a5dd387494e1906137fd9088815260200190565b60405180910390a350506001601a55505050565b6021805461381e906154e2565b80601f016020809104026020016040519081016040528092919081815260200182805461384a906154e2565b80156138975780601f1061386c57610100808354040283529160200191613897565b820191906000526020600020905b81548152906001019060200180831161387a57829003601f168201915b505050505081565b606060006138ab6145e7565b6138b4846145f6565b60226040516020016138c8939291906159c9565b60408051601f198184030181529190529392505050565b6000828152600c60205260409020600101546138fa81613dc1565b6112e8838361427f565b600080516020615bbc83398151915261391c81613dc1565b6002601a540361393e5760405162461bcd60e51b81526004016112479061556b565b6002601a5561270f8361395060085490565b61395a91906156ce565b11156139785760405162461bcd60e51b81526004016112479061585c565b60005b83811015611d6857600061398e60085490565b6139999060016156ce565b90506139a533826143bd565b6139ae8161407e565b6001600160a01b03841633146139c9576139c9338583613ee9565b50806139d481615532565b91505061397b565b6022805461381e906154e2565b6000806139f560285490565b6027549091508110613a0957600091505090565b600060278281548110613a1e57613a1e61551c565b6000918252602090912001549392505050565b60606000613a3e60085490565b90506000816001600160401b03811115613a5a57613a5a614dc0565b604051908082528060200260200182016040528015613a83578160200160208202803683370190505b5090506000805b838111613afe576000818152600d6020526040902060019081015460ff1615159003613aec576000818152600d60205260409020548351849084908110613ad357613ad361551c565b602090810291909101015281613ae881615532565b9250505b80613af681615532565b915050613a8a565b50909392505050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b60278181548110613b4557600080fd5b600091825260209091200154905081565b6000613b6181613dc1565b50601055565b60606000613b7683600261568d565b613b819060026156ce565b6001600160401b03811115613b9857613b98614dc0565b6040519080825280601f01601f191660200182016040528015613bc2576020820181803683370190505b509050600360fc1b81600081518110613bdd57613bdd61551c565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110613c0c57613c0c61551c565b60200101906001600160f81b031916908160001a9053506000613c3084600261568d565b613c3b9060016156ce565b90505b6001811115613cb3576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110613c6f57613c6f61551c565b1a60f81b828281518110613c8557613c8561551c565b60200101906001600160f81b031916908160001a90535060049490941c93613cac81615a69565b9050613c3e565b508315613d025760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401611247565b9392505050565b60006001600160e01b03198216637965db0b60e01b14806111145750611114826146f6565b613d3781613dcb565b61176a5760405162461bcd60e51b8152600401611247906156fa565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190613d88826122fe565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61176a813361471b565b6000908152600260205260409020546001600160a01b0316151590565b60008181526012602052604090205460ff1615613e305760405162461bcd60e51b815260206004820152600660248201526522a929169a1960d11b6044820152606401611247565b6000818152601260205260409020805460ff19166001179055613e5333826143bd565b613e5c8161407e565b60405181907f1214bd87b40704372aefa30f72a10f3c3dc55c0ca4e84ac2d887e6ac85fefa6190600090a250565b600080613e96836122fe565b9050806001600160a01b0316846001600160a01b03161480613ebd5750613ebd8185613b07565b80613ee15750836001600160a01b0316613ed6846111ac565b6001600160a01b0316145b949350505050565b826001600160a01b0316613efc826122fe565b6001600160a01b031614613f605760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401611247565b6001600160a01b038216613fc25760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401611247565b613fcd83838361477f565b613fd8600082613d53565b6001600160a01b03831660009081526003602052604081208054600192906140019084906154cf565b90915550506001600160a01b038216600090815260036020526040812080546001929061402f9084906156ce565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b038681169182179092559151849391871691600080516020615bdc83398151915291a4505050565b6000614089826122fe565b90506001600160a01b03811633146140b35760405162461bcd60e51b8152600401611247906155e2565b6040805160c08101825260008082526020808301829052828401829052336060808501919091526080840183905260a08401839052845190810185528681528082018490526001818601528451601e8082526103e08201909652939490939182016103c0803683375050604080516020808201835284825260008a8152600e8252929092208151805195965091948594509092614154928492910190614c5c565b50505060009586525050600d60209081526040948590208251815581830151805160018301805491151560ff19928316179055928101516002830155808701516003830155606081015160048301805460808401511515600160a01b026001600160a81b03199091166001600160a01b039093169290921791909117905560a00151600582015594909101516006909401805494151594909116939093179092555050565b614203828261265c565b611c7d576000828152600c602090815260408083206001600160a01b03851684529091529020805460ff1916600117905561423b3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b614289828261265c565b15611c7d576000828152600c602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60006142f1826122fe565b90506142ff8160008461477f565b61430a600083613d53565b6001600160a01b03811660009081526003602052604081208054600192906143339084906154cf565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b03841690600080516020615bdc833981519152908390a45050565b6000818152600d602052604090206001015460ff161561176a576000818152600d6020526040812060018101805460ff191690556002015561176a600f614794565b6001600160a01b0382166144135760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401611247565b61441c81613dcb565b156144695760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401611247565b6144756000838361477f565b6001600160a01b038216600090815260036020526040812080546001929061449e9084906156ce565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386169081179091559051839290600080516020615bdc833981519152908290a45050565b816001600160a01b0316836001600160a01b0316036145475760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b6044820152606401611247565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6145bf848484613ee9565b6145cb848484846147eb565b6119f45760405162461bcd60e51b815260040161124790615a80565b606060218054611129906154e2565b60608160000361461d5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115614647578061463181615532565b91506146409050600a836156ba565b9150614621565b6000816001600160401b0381111561466157614661614dc0565b6040519080825280601f01601f19166020018201604052801561468b576020820181803683370190505b5090505b8415613ee1576146a06001836154cf565b91506146ad600a86615ad2565b6146b89060306156ce565b60f81b8183815181106146cd576146cd61551c565b60200101906001600160f81b031916908160001a9053506146ef600a866156ba565b945061468f565b60006001600160e01b0319821663152a902d60e11b14806111145750611114826148ec565b614725828261265c565b611c7d5761473d816001600160a01b03166014613b67565b614748836020613b67565b604051602001614759929190615ae6565b60408051601f198184030181529082905262461bcd60e51b825261124791600401614d3f565b61478a838383614911565b6112e881836149c9565b8054806147e35760405162461bcd60e51b815260206004820152601b60248201527f436f756e7465723a2064656372656d656e74206f766572666c6f7700000000006044820152606401611247565b600019019055565b60006001600160a01b0384163b156148e157604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061482f903390899088908890600401615b55565b6020604051808303816000875af192505050801561486a575060408051601f3d908101601f1916820190925261486791810190615b88565b60015b6148c7573d808015614898576040519150601f19603f3d011682016040523d82523d6000602084013e61489d565b606091505b5080516000036148bf5760405162461bcd60e51b815260040161124790615a80565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050613ee1565b506001949350505050565b60006001600160e01b0319821663780e9d6360e01b1480611114575061111482614a17565b6001600160a01b03831661496c5761496781600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61498f565b816001600160a01b0316836001600160a01b03161461498f5761498f8382614a67565b6001600160a01b0382166149a6576112e881614b04565b826001600160a01b0316826001600160a01b0316146112e8576112e88282614bb3565b6000828152600d602052604081206004810180546001600160a01b0319166001600160a01b038516179055600501805460019290614a089084906156ce565b90915550611c7d90508261437b565b60006001600160e01b031982166380ac58cd60e01b1480614a4857506001600160e01b03198216635b5e139f60e01b145b8061111457506301ffc9a760e01b6001600160e01b0319831614611114565b60006001614a74846123e5565b614a7e91906154cf565b600083815260076020526040902054909150808214614ad1576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090614b16906001906154cf565b60008381526009602052604081205460088054939450909284908110614b3e57614b3e61551c565b906000526020600020015490508060088381548110614b5f57614b5f61551c565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480614b9757614b97615ba5565b6001900381819060005260206000200160009055905550505050565b6000614bbe836123e5565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b604051806060016040528060008152602001614c4f6040518060c00160405280600015158152602001600081526020016000815260200160006001600160a01b03168152602001600015158152602001600081525090565b8152600060209091015290565b828054828255906000526020600020908101928215614c97579160200282015b82811115614c97578251825591602001919060010190614c7c565b50614ca3929150614ca7565b5090565b5b80821115614ca35760008155600101614ca8565b6001600160e01b03198116811461176a57600080fd5b600060208284031215614ce457600080fd5b8135613d0281614cbc565b60005b83811015614d0a578181015183820152602001614cf2565b50506000910152565b60008151808452614d2b816020860160208601614cef565b601f01601f19169290920160200192915050565b602081526000613d026020830184614d13565b600060208284031215614d6457600080fd5b5035919050565b6001600160a01b0391909116815260200190565b6001600160a01b038116811461176a57600080fd5b60008060408385031215614da757600080fd5b8235614db281614d7f565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715614dfe57614dfe614dc0565b604052919050565b60006001600160401b03821115614e1f57614e1f614dc0565b5060051b60200190565b600082601f830112614e3a57600080fd5b81356020614e4f614e4a83614e06565b614dd6565b82815260059290921b84018101918181019086841115614e6e57600080fd5b8286015b84811015612f545780358352918301918301614e72565b600060208284031215614e9b57600080fd5b81356001600160401b03811115614eb157600080fd5b613ee184828501614e29565b801515811461176a57600080fd5b600080600060608486031215614ee057600080fd5b833592506020840135614ef281614ebd565b929592945050506040919091013590565b80511515825260208082015190830152604080820151908301526060808201516001600160a01b03169083015260808082015115159083015260a090810151910152565b8381526101008101614f5c6020830185614f03565b82151560e0830152949350505050565b600060208284031215614f7e57600080fd5b8135613d0281614d7f565b600081518084526020808501945080840160005b83811015614fb957815187529582019590820190600101614f9d565b509495945050505050565b604081526000614fd76040830185614f89565b90508260208301529392505050565b600080600060608486031215614ffb57600080fd5b833561500681614d7f565b92506020840135614ef281614d7f565b6000806040838503121561502957600080fd5b50508035926020909101359150565b6001600160a01b03929092168252602082015260400190565b6000806040838503121561506457600080fd5b82359150602083013561507681614d7f565b809150509250929050565b6000806040838503121561509457600080fd5b823561509f81614d7f565b9150602083013561507681614ebd565b8051825260208101516150c56020840182614f03565b5060400151151560e09190910152565b60006101206150e483866150af565b806101008401528351602082850152615101610140850182614f89565b9695505050505050565b6000806040838503121561511e57600080fd5b823561509f81614ebd565b6000602080838503121561513c57600080fd5b82356001600160401b0381111561515257600080fd5b8301601f8101851361516357600080fd5b8035615171614e4a82614e06565b81815260059190911b8201830190838101908783111561519057600080fd5b928401925b828410156151b75783356151a881614d7f565b82529284019290840190615195565b979650505050505050565b6000806000606084860312156151d757600080fd5b505081359360208301359350604090920135919050565b602081526000613d026020830184614f89565b6000806040838503121561521457600080fd5b823561521f81614d7f565b915060208301356001600160401b0381111561523a57600080fd5b61524685828601614e29565b9150509250929050565b6020808252825182820181905260009190848201906040850190845b818110156152935761527f8385516150af565b92840192610100929092019160010161526c565b50909695505050505050565b60008060008060008060c087890312156152b857600080fd5b86356152c381614ebd565b95506020870135945060408701356152da81614ebd565b959894975094956060810135955060808101359460a0909101359350915050565b6020808252825182820181905260009190848201906040850190845b818110156152935783516001600160a01b031683529284019291840191600101615317565b60006001600160401b0383111561535557615355614dc0565b615368601f8401601f1916602001614dd6565b905082815283838301111561537c57600080fd5b828260208301376000602084830101529392505050565b600080600080608085870312156153a957600080fd5b84356153b481614d7f565b935060208501356153c481614d7f565b92506040850135915060608501356001600160401b038111156153e657600080fd5b8501601f810187136153f757600080fd5b6154068782356020840161533c565b91505092959194509250565b600082601f83011261542357600080fd5b613d028383356020850161533c565b6000806040838503121561544557600080fd5b82356001600160401b038082111561545c57600080fd5b61546886838701615412565b9350602085013591508082111561547e57600080fd5b5061524685828601615412565b6000806040838503121561549e57600080fd5b82356154a981614d7f565b9150602083013561507681614d7f565b634e487b7160e01b600052601160045260246000fd5b81810381811115611114576111146154b9565b600181811c908216806154f657607f821691505b60208210810361551657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b600060018201615544576155446154b9565b5060010190565b60208082526006908201526522a92916989960d11b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526006908201526504552522d32360d41b604082015260600190565b60208082526006908201526504552522d31360d41b604082015260600190565b6020808252600690820152654552522d313160d01b604082015260600190565b60208082526006908201526504552522d35360d41b604082015260600190565b60006020828403121561563457600080fd5b8151613d0281614ebd565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b8082028115828204841417611114576111146154b9565b634e487b7160e01b600052601260045260246000fd5b6000826156c9576156c96156a4565b500490565b80820180821115611114576111146154b9565b6000602082840312156156f357600080fd5b5051919050565b602080825260189082015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604082015260600190565b6020808252600690820152654552522d323160d01b604082015260600190565b600181815b8085111561578757816000190482111561576d5761576d6154b9565b8085161561577a57918102915b93841c9390800290615751565b509250929050565b60008261579e57506001611114565b816157ab57506000611114565b81600181146157c157600281146157cb576157e7565b6001915050611114565b60ff8411156157dc576157dc6154b9565b50506001821b611114565b5060208310610133831016604e8410600b841016171561580a575081810a611114565b615814838361574c565b8060001904821115615828576158286154b9565b029392505050565b6000613d02838361578f565b60208082526006908201526522a92916991960d11b604082015260600190565b6020808252600690820152654552522d323960d01b604082015260600190565b60208082526006908201526508aa4a45a64760d31b604082015260600190565b6020808252600690820152651154948b4d0d60d21b604082015260600190565b601f8211156112e857600081815260208120601f850160051c810160208610156158e35750805b601f850160051c820191505b81811015615902578281556001016158ef565b505050505050565b81516001600160401b0381111561592357615923614dc0565b6159378161593184546154e2565b846158bc565b602080601f83116001811461596c57600084156159545750858301515b600019600386901b1c1916600185901b178555615902565b600085815260208120601f198616915b8281101561599b5788860151825594840194600190910190840161597c565b50858210156159b95787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000845160206159dc8285838a01614cef565b8551918401916159ef8184848a01614cef565b8554920191600090615a00816154e2565b60018281168015615a185760018114615a2d57615a59565b60ff1984168752821515830287019450615a59565b896000528560002060005b84811015615a5157815489820152908301908701615a38565b505082870194505b50929a9950505050505050505050565b600081615a7857615a786154b9565b506000190190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600082615ae157615ae16156a4565b500690565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b815260008351615b18816017850160208801614cef565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351615b49816028840160208801614cef565b01602801949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061510190830184614d13565b600060208284031215615b9a57600080fd5b8151613d0281614cbc565b634e487b7160e01b600052603160045260246000fdfe9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122069f5f21edcfad9ec26f9c8c215bf1838124a7ee7404a2ae16bec6ff7443e917c64736f6c63430008110033697066733a2f2f516d5346584643425570574e3268704246435970733368445342565964437336344a5a754d694e464568414e6e742f000000000000000000000000cc96cb0d133864b53d05768aea2c608325a9135800000000000000000000000076994161eefb868399041339446424d947d91095000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000090000000000000000000000008927985b358692815e18f2138964679dca5d3b79000000000000000000000000cf91b99548b1c17dd1095c0680e20de380635e2000000000000000000000000000f5d01d86008d14d04e29efe88dffc75a9cac4700000000000000000000000055a41741a5f737ce420156081f9145b444d41636000000000000000000000000fe48e7e9b86cac2f748669a8a413de4ac6a6572a0000000000000000000000004c1c0032feb28e2d0cfb9c4e34918c11002915ed000000000000000000000000a2a8fbbacd45528ffec45ced448a9e2a9c3cfcff0000000000000000000000000a27e02fdaf3456bd8843848b728ecbd882510d1000000000000000000000000f119264dfd54e5c4c3ca70d6071a7888ab173266
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000cc96cb0d133864b53d05768aea2c608325a9135800000000000000000000000076994161eefb868399041339446424d947d91095000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000090000000000000000000000008927985b358692815e18f2138964679dca5d3b79000000000000000000000000cf91b99548b1c17dd1095c0680e20de380635e2000000000000000000000000000f5d01d86008d14d04e29efe88dffc75a9cac4700000000000000000000000055a41741a5f737ce420156081f9145b444d41636000000000000000000000000fe48e7e9b86cac2f748669a8a413de4ac6a6572a0000000000000000000000004c1c0032feb28e2d0cfb9c4e34918c11002915ed000000000000000000000000a2a8fbbacd45528ffec45ced448a9e2a9c3cfcff0000000000000000000000000a27e02fdaf3456bd8843848b728ecbd882510d1000000000000000000000000f119264dfd54e5c4c3ca70d6071a7888ab173266
-----Decoded View---------------
Arg [0] : royaltiesAddr (address): 0xcc96cb0d133864b53d05768aea2c608325a91358
Arg [1] : zombieEditionAddress (address): 0x76994161eefb868399041339446424d947d91095
Arg [2] : partnershipAddress (address[]): 0x8927985b358692815e18f2138964679dca5d3b79,0xcf91b99548b1c17dd1095c0680e20de380635e20,0x00f5d01d86008d14d04e29efe88dffc75a9cac47,0x55a41741a5f737ce420156081f9145b444d41636,0xfe48e7e9b86cac2f748669a8a413de4ac6a6572a,0x4c1c0032feb28e2d0cfb9c4e34918c11002915ed,0xa2a8fbbacd45528ffec45ced448a9e2a9c3cfcff,0x0a27e02fdaf3456bd8843848b728ecbd882510d1,0xf119264dfd54e5c4c3ca70d6071a7888ab173266
-----Encoded View---------------
13 Constructor Arguments found :
Arg [0] : 000000000000000000000000cc96cb0d133864b53d05768aea2c608325a91358
Arg [1] : 00000000000000000000000076994161eefb868399041339446424d947d91095
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [4] : 0000000000000000000000008927985b358692815e18f2138964679dca5d3b79
Arg [5] : 000000000000000000000000cf91b99548b1c17dd1095c0680e20de380635e20
Arg [6] : 00000000000000000000000000f5d01d86008d14d04e29efe88dffc75a9cac47
Arg [7] : 00000000000000000000000055a41741a5f737ce420156081f9145b444d41636
Arg [8] : 000000000000000000000000fe48e7e9b86cac2f748669a8a413de4ac6a6572a
Arg [9] : 0000000000000000000000004c1c0032feb28e2d0cfb9c4e34918c11002915ed
Arg [10] : 000000000000000000000000a2a8fbbacd45528ffec45ced448a9e2a9c3cfcff
Arg [11] : 0000000000000000000000000a27e02fdaf3456bd8843848b728ecbd882510d1
Arg [12] : 000000000000000000000000f119264dfd54e5c4c3ca70d6071a7888ab173266
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.