data:application/vnd.facet.tx+json;rule=esip6,{"op":"create","data":{"init_code_hash":"0xb5b742d755877bac6b80e2f0af4d97792fce2b2a58ff0ee2274b86eac91e977f","args":{"name":"test","symbol":"test","maxSupply":"1","baseURI":"","weth":"0x1673540243e793b0e77c038d4a88448eff524dce","perMintFee":"0","feeTo":"0x2052051a0474fb0b98283b3f38c13b0b0b6a3677"},"source_code":"pragma(:rubidity, \"1.0.0\")\ncontract(:ERC20, abstract: true) {\n event(:Transfer, { from: :address, to: :address, amount: :uint256 })\n event(:Approval, { owner: :address, spender: :address, amount: :uint256 })\n string(:public, :name)\n string(:public, :symbol)\n uint8(:public, :decimals)\n uint256(:public, :totalSupply)\n mapping(({ address: :uint256 }), :public, :balanceOf)\n mapping(({ address: mapping(address: :uint256) }), :public, :allowance)\n constructor(name: :string, symbol: :string, decimals: :uint8) {\n s.name=name\n s.symbol=symbol\n s.decimals=decimals\n }\n function(:approve, { spender: :address, amount: :uint256 }, :public, :virtual, returns: :bool) {\n s.allowance[msg.sender][spender] = amount\n emit(:Approval, owner: msg.sender, spender: spender, amount: amount)\n return true\n }\n function(:transfer, { to: :address, amount: :uint256 }, :public, :virtual, returns: :bool) {\n require(s.balanceOf[msg.sender] >= amount, \"Insufficient balance\")\n s.balanceOf[msg.sender] -= amount\n s.balanceOf[to] += amount\n emit(:Transfer, from: msg.sender, to: to, amount: amount)\n return true\n }\n function(:transferFrom, { from: :address, to: :address, amount: :uint256 }, :public, :virtual, returns: :bool) {\n allowed = s.allowance[from][msg.sender]\n require(s.balanceOf[from] >= amount, \"Insufficient balance\")\n require(allowed >= amount, \"Insufficient allowance\")\n s.allowance[from][msg.sender] = allowed - amount\n s.balanceOf[from] -= amount\n s.balanceOf[to] += amount\n emit(:Transfer, from: from, to: to, amount: amount)\n return true\n }\n function(:_mint, { to: :address, amount: :uint256 }, :internal, :virtual) {\n s.totalSupply += amount\n s.balanceOf[to] += amount\n emit(:Transfer, from: address(0), to: to, amount: amount)\n }\n function(:_burn, { from: :address, amount: :uint256 }, :internal, :virtual) {\n require(s.balanceOf[from] >= amount, \"Insufficient balance\")\n s.balanceOf[from] -= amount\n s.totalSupply -= amount\n emit(:Transfer, from: from, to: address(0), amount: amount)\n }\n}\ncontract(:ERC2981, abstract: true) {\n event(:DefaultRoyaltyUpdated, { receiver: :address, feeNumerator: :uint96 })\n event(:TokenRoyaltyUpdated, { tokenId: :uint256, receiver: :address, feeNumerator: :uint96 })\n mapping(({ uint256: :address }), :internal, :_tokenIdToReceiver)\n mapping(({ uint256: :uint96 }), :internal, :_tokenIdToFeeNumerator)\n address(:internal, :_defaultRoyaltyReceiver)\n uint96(:internal, :_defaultFeeNumerator)\n function(:royaltyInfo, { tokenId: :uint256, salePrice: :uint256 }, :public, :view, :virtual, returns: { receiver: :address, royaltyAmount: :uint256 }) {\n receiver = s._tokenIdToReceiver[tokenId]\n feeNumerator = s._tokenIdToFeeNumerator[tokenId]\n if receiver == address(0)\n receiver = s._defaultRoyaltyReceiver\n feeNumerator = s._defaultFeeNumerator\n end\n royaltyAmount = (salePrice * feeNumerator).div(_feeDenominator)\n return { receiver: receiver, royaltyAmount: royaltyAmount }\n }\n function(:_setDefaultRoyalty, { receiver: :address, feeNumerator: :uint96 }, :internal, :virtual) {\n require(feeNumerator <= _feeDenominator, \"ERC2981InvalidDefaultRoyalty\")\n require(receiver != address(0), \"ERC2981InvalidDefaultRoyaltyReceiver: address(0)\")\n s._defaultRoyaltyReceiver=receiver\n s._defaultFeeNumerator=feeNumerator\n emit(:DefaultRoyaltyUpdated, receiver: receiver, feeNumerator: feeNumerator)\n }\n function(:_deleteDefaultRoyalty, :internal, :virtual) {\n s._defaultRoyaltyReceiver=address(0)\n s._defaultFeeNumerator=0\n emit(:DefaultRoyaltyUpdated, receiver: address(0), feeNumerator: 0)\n }\n function(:_setTokenRoyalty, { tokenId: :uint256, receiver: :address, feeNumerator: :uint96 }, :internal, :virtual) {\n require(feeNumerator <= _feeDenominator, \"ERC2981InvalidTokenRoyalty\")\n require(receiver != address(0), \"ERC2981InvalidTokenRoyaltyReceiver\")\n s._tokenIdToReceiver[tokenId] = receiver\n s._tokenIdToFeeNumerator[tokenId] = feeNumerator\n emit(:TokenRoyaltyUpdated, tokenId: tokenId, receiver: receiver, feeNumerator: feeNumerator)\n }\n function(:_deleteTokenRoyalty, { tokenId: :uint256 }, :internal, :virtual) {\n s._tokenIdToReceiver[tokenId] = address(0)\n s._tokenIdToFeeNumerator[tokenId] = 0\n emit(:TokenRoyaltyUpdated, tokenId: tokenId, receiver: address(0), feeNumerator: 0)\n }\n function(:_feeDenominator, :internal, :view, :virtual, returns: :uint96) {\n return 10000\n }\n function(:supportsERC2981, :public, :pure, :virtual, returns: :bool) {\n return true\n }\n}\ncontract(:ERC721, abstract: true) {\n event(:Transfer, { from: :address, to: :address, id: :uint256 })\n event(:Approval, { owner: :address, spender: :address, id: :uint256 })\n event(:ApprovalForAll, { owner: :address, operator: :address, approved: :bool })\n string(:public, :name)\n string(:public, :symbol)\n mapping(({ uint256: :address }), :internal, :_ownerOf)\n mapping(({ address: :uint256 }), :internal, :_balanceOf)\n mapping(({ uint256: :address }), :public, :getApproved)\n mapping(({ address: mapping(address: :bool) }), :public, :isApprovedForAll)\n constructor(name: :string, symbol: :string) {\n s.name=name\n s.symbol=symbol\n }\n function(:ownerOf, { id: :uint256 }, :public, :view, :virtual, returns: :address) {\n owner = s._ownerOf[id]\n require(owner != address(0), \"ERC721: owner query for nonexistent token\")\n return owner\n }\n function(:balanceOf, { owner: :address }, :public, :view, :virtual, returns: :uint256) {\n require(owner != address(0), \"ERC721: balance query for nonexistent owner\")\n return s._balanceOf[owner]\n }\n function(:approve, { spender: :address, id: :uint256 }, :public, :virtual) {\n owner = ownerOf(id)\n require(msg.sender == owner || s.isApprovedForAll[owner][msg.sender], \"ERC721: msg.sender not authorized to approve\")\n s.getApproved[id] = spender\n emit(:Approval, owner: owner, spender: spender, id: id)\n }\n function(:setApprovalForAll, { operator: :address, approved: :bool }, :public, :virtual) {\n s.isApprovedForAll[msg.sender][operator] = approved\n emit(:ApprovalForAll, owner: msg.sender, operator: operator, approved: approved)\n }\n function(:transferFrom, { from: :address, to: :address, id: :uint256 }, :public, :virtual) {\n require(from == ownerOf(id), \"ERC721: transfer of token that is not own\")\n require(to != address(0), \"ERC721: transfer to the zero address\")\n require(isApprovedOrOwner(spender: msg.sender, id: id), \"ERC721: msg.sender not authorized to call transferFrom\")\n s._balanceOf[from] -= 1\n s._balanceOf[to] += 1\n s._ownerOf[id] = to\n s.getApproved[id] = address(0)\n emit(:Transfer, from: from, to: to, id: id)\n }\n function(:isApprovedOrOwner, { spender: :address, id: :uint256 }, :public, :view, :virtual, returns: :bool) {\n owner = ownerOf(id)\n spender == owner || s.getApproved[id] == spender || s.isApprovedForAll[owner][spender]\n }\n function(:_exists, { id: :uint256 }, :internal, :view, :virtual, returns: :bool) {\n return s._ownerOf[id] != address(0)\n }\n function(:_mint, { to: :address, id: :uint256 }, :internal, :virtual) {\n require(to != address(0), \"ERC721: mint to the zero address\")\n require(s._ownerOf[id] == address(0), \"ERC721: token already minted\")\n s._balanceOf[to] += 1\n s._ownerOf[id] = to\n emit(:Transfer, from: address(0), to: to, id: id)\n }\n function(:_burn, { id: :uint256 }, :internal, :virtual) {\n owner = s._ownerOf[id]\n require(owner != address(0), \"ERC721: burn of nonexistent token\")\n s._balanceOf[owner] -= 1\n s._ownerOf[id] = address(0)\n s.getApproved[id] = address(0)\n emit(:Transfer, from: owner, to: address(0), id: id)\n }\n function(:tokenURI, { id: :uint256 }, :public, :view, :virtual, returns: :string) {\n }\n}\ncontract(:IEditionMetadataRenderer01, abstract: true) {\n function(:tokenURI, { tokenId: :uint256 }, :external, :view, returns: :string)\n function(:contractURI, :external, :view, returns: :string)\n function(:initializeWithData, { data: [:string] }, :external)\n}\ncontract(:MerkleProof, abstract: true) {\n function(:verify, { proof: [:bytes32], root: :bytes32, leaf: :bytes32 }, :internal, :pure, returns: :bool) {\n processProof(proof, leaf) == root\n }\n function(:processProof, { proof: [:bytes32], leaf: :bytes32 }, :internal, :pure, returns: :bytes32) {\n computedHash = leaf\n forLoop(condition: ->(i) {\n i < proof.length\n }, max_iterations: 25) { |i|\n computedHash = _hashPair(computedHash, proof[i])\n }\n computedHash\n }\n function(:_hashPair, { a: :bytes32, b: :bytes32 }, :private, :pure, returns: :bytes32) {\n if a.cast(:uint256) < b.cast(:uint256)\n _efficientHash(a, b)\n else\n _efficientHash(b, a)\n end\n }\n function(:_efficientHash, { a: :bytes32, b: :bytes32 }, :private, :pure, returns: :bytes32) {\n keccak256(abi.encodePacked(a, b))\n }\n}\ncontract(:Ownable, abstract: true) {\n address(:public, :owner)\n event(:OwnershipTransferred, { previousOwner: :address, newOwner: :address })\n constructor(owner: :address) {\n s.owner=owner\n }\n function(:transferOwnership, { newOwner: :address }, :public) {\n onlyOwner!\n previousOwner = s.owner\n s.owner=newOwner\n emit(:OwnershipTransferred, previousOwner: previousOwner, newOwner: newOwner)\n }\n function(:onlyOwner!, :internal) {\n require(msg.sender == s.owner, \"msg.sender is not the owner\")\n }\n}\ncontract(:Pausable, abstract: true) {\n bool(:public, :paused)\n event(:Paused, { account: :address })\n event(:Unpaused, { account: :address })\n constructor(initialPauseState: :bool) {\n s.paused=initialPauseState\n }\n function(:_pause, :internal) {\n s.paused=true\n emit(:Paused, account: msg.sender)\n }\n function(:_unpause, :internal) {\n s.paused=false\n emit(:Unpaused, account: msg.sender)\n }\n function(:whenPaused!, :internal) {\n require(s.paused, \"Contract is not paused\")\n }\n function(:whenNotPaused!, :internal) {\n require(!s.paused, \"Contract is paused\")\n }\n}\ncontract(:Upgradeable, abstract: true) {\n address(:public, :upgradeAdmin)\n event(:ContractUpgraded, { oldHash: :bytes32, newHash: :bytes32 })\n event(:UpgradeAdminChanged, { newUpgradeAdmin: :address })\n constructor(upgradeAdmin: :address) {\n s.upgradeAdmin=upgradeAdmin\n }\n function(:setUpgradeAdmin, { newUpgradeAdmin: :address }, :public) {\n require(msg.sender == s.upgradeAdmin, \"NOT_AUTHORIZED\")\n s.upgradeAdmin=newUpgradeAdmin\n emit(:UpgradeAdminChanged, newUpgradeAdmin: newUpgradeAdmin)\n }\n function(:upgradeAndCall, { newHash: :bytes32, newSource: :string, migrationCalldata: :string }, :public) {\n upgrade(newHash: newHash, newSource: newSource)\n (success, data) = address(this).call(migrationCalldata)\n require(success, \"Migration failed\")\n }\n function(:upgrade, { newHash: :bytes32, newSource: :string }, :public) {\n currentHash = this.currentInitCodeHash\n require(msg.sender == s.upgradeAdmin, \"NOT_AUTHORIZED\")\n this.upgradeImplementation(newHash, newSource)\n emit(:ContractUpgraded, oldHash: currentHash, newHash: newHash)\n }\n}\ncontract(:NFTCollection01, is: [:ERC721, :ERC2981, :Upgradeable, :Ownable, :Pausable, :MerkleProof], upgradeable: true) {\n event(:Minted, { to: :address, amount: :uint256, mintPrice: :uint256, totalCost: :uint256, newTotalSupply: :uint256, isPublic: :bool })\n event(:PublicMaxPerAddressUpdated, { publicMaxPerAddress: :uint256 })\n event(:PublicMintStartUpdated, { publicMintStart: :uint256 })\n event(:PublicMintEndUpdated, { publicMintEnd: :uint256 })\n event(:PublicMintPriceUpdated, { publicMintPrice: :uint256 })\n event(:AllowListMerkleRootUpdated, { allowListMerkleRoot: :bytes32 })\n event(:AllowListMaxPerAddressUpdated, { allowListMaxPerAddress: :uint256 })\n event(:AllowListMintStartUpdated, { allowListMintStart: :uint256 })\n event(:AllowListMintEndUpdated, { allowListMintEnd: :uint256 })\n event(:AllowListMintPriceUpdated, { allowListMintPrice: :uint256 })\n event(:MaxSupplyUpdated, { maxSupply: :uint256 })\n event(:BaseURIUpdated, { baseURI: :string })\n event(:MetadataRendererUpdated, { metadataRenderer: :string })\n uint256(:public, :maxSupply)\n uint256(:public, :totalSupply)\n uint256(:public, :nextTokenId)\n uint256(:public, :maxPerMint)\n string(:public, :baseURI)\n address(:public, :WETH)\n address(:public, :metadataRenderer)\n uint256(:public, :publicMaxPerAddress)\n uint256(:public, :publicMintStart)\n uint256(:public, :publicMintEnd)\n uint256(:public, :publicMintPrice)\n bytes32(:public, :allowListMerkleRoot)\n uint256(:public, :allowListMaxPerAddress)\n uint256(:public, :allowListMintStart)\n uint256(:public, :allowListMintEnd)\n uint256(:public, :allowListMintPrice)\n uint256(:public, :perMintFee)\n address(:public, :feeTo)\n mapping(({ address: :uint256 }), :public, :publicNumberMinted)\n mapping(({ address: :uint256 }), :public, :allowListNumberMinted)\n constructor(name: :string, symbol: :string, maxSupply: :uint256, baseURI: :string, weth: :address, perMintFee: :uint256, feeTo: :address) {\n self.ERC721.constructor(name: name, symbol: symbol)\n self.Ownable.constructor(owner: msg.sender)\n self.Upgradeable.constructor(upgradeAdmin: msg.sender)\n s.maxSupply=maxSupply\n s.baseURI=baseURI\n s.WETH=weth\n s.maxPerMint=25\n s.perMintFee=perMintFee\n s.feeTo=feeTo\n s.nextTokenId=1\n }\n function(:_handleMint, { to: :address, amount: :uint256, merkleProof: [:bytes32] }, :internal) {\n whenNotPaused!\n require(isMintActive, \"Mint is not active\")\n require(amount > 0, \"Amount must be positive\")\n require(s.maxSupply == 0 || s.totalSupply + amount <= s.maxSupply, \"Exceeded max supply\")\n require(amount <= s.maxPerMint, \"Exceeded max per mint\")\n isAllowListMint = merkleProof.length > 0 && isAllowListMintActive\n (numberMinted, mintPrice, maxPerAddress) = if isAllowListMint\n require(isOnAllowList(to, merkleProof), \"Not on allow list\")\n s.allowListNumberMinted[to] += amount\n [s.allowListNumberMinted[to], s.allowListMintPrice, s.allowListMaxPerAddress]\n else\n s.publicNumberMinted[to] += amount\n [s.publicNumberMinted[to], s.publicMintPrice, s.publicMaxPerAddress]\n end\n require(maxPerAddress == 0 || numberMinted <= maxPerAddress, \"Exceeded mint limit\")\n totalFee = s.perMintFee * amount\n if totalFee > 0 && s.feeTo != address(0)\n ERC20(s.WETH).transferFrom(msg.sender, s.feeTo, totalFee)\n end\n totalCost = mintPrice * amount\n if totalCost > 0\n require(s.WETH != address(0), \"WETH not set\")\n ERC20(s.WETH).transferFrom(msg.sender, address(this), totalCost)\n end\n initialId = s.nextTokenId\n s.nextTokenId += amount\n s.totalSupply += amount\n forLoop(condition: ->(i) {\n i < amount\n }, max_iterations: s.maxPerMint) { |i|\n _mint(to: to, id: initialId + i)\n }\n emit(:Minted, to: to, amount: amount, mintPrice: mintPrice, totalCost: totalCost, newTotalSupply: s.totalSupply, isPublic: !isAllowListMint)\n }\n function(:_isMintActive, { mintStart: :uint256, mintEnd: :uint256 }, :internal, :view, returns: :bool) {\n isNotMintedOut = s.maxSupply == 0 || s.totalSupply < s.maxSupply\n isOwner = s.owner == msg.sender\n isOrAfterStart = block.timestamp >= mintStart && mintStart > 0\n isBeforeEnd = block.timestamp < mintEnd || mintEnd == 0\n isNotMintedOut && isBeforeEnd && (isOwner || isOrAfterStart)\n }\n function(:isPublicMintActive, :public, :view, returns: :bool) {\n _isMintActive(mintStart: s.publicMintStart, mintEnd: s.publicMintEnd)\n }\n function(:isAllowListMintActive, :public, :view, returns: :bool) {\n _isMintActive(mintStart: s.allowListMintStart, mintEnd: s.allowListMintEnd)\n }\n function(:isMintActive, :public, :view, returns: :bool) {\n isPublicMintActive || isAllowListMintActive\n }\n function(:isOnAllowList, { wallet: :address, merkleProof: [:bytes32] }, :public, :view, returns: :bool) {\n self.MerkleProof.verify(merkleProof, s.allowListMerkleRoot, keccak256(abi.encodePacked(wallet)))\n }\n function(:tokenURI, { tokenId: :uint256 }, :public, :view, :override, returns: :string) {\n require(_exists(id: tokenId), \"URI query for nonexistent token\")\n if s.metadataRenderer != address(0)\n return IEditionMetadataRenderer01(s.metadataRenderer).tokenURI(tokenId)\n end\n if s.baseURI.length == 0\n return \"\"\n end\n if s.baseURI[s.baseURI.length - 1] != \"/\"\n return s.baseURI\n end\n s.baseURI + tokenId.toString\n }\n function(:contractURI, :public, :view, returns: :string) {\n if s.metadataRenderer == address(0)\n return \"\"\n end\n IEditionMetadataRenderer01(s.metadataRenderer).contractURI\n }\n function(:airdrop, { to: :address, amount: :uint256, merkleProof: [:bytes32] }, :public) {\n _handleMint(to: to, amount: amount, merkleProof: merkleProof)\n }\n function(:mint, { amount: :uint256, merkleProof: [:bytes32] }, :public) {\n _handleMint(to: msg.sender, amount: amount, merkleProof: merkleProof)\n }\n function(:setPublicMaxPerAddress, { publicMaxPerAddress: :uint256 }, :public) {\n onlyOwner!\n s.publicMaxPerAddress=publicMaxPerAddress\n emit(:PublicMaxPerAddressUpdated, publicMaxPerAddress: publicMaxPerAddress)\n }\n function(:setPublicMintStart, { publicMintStart: :uint256 }, :public) {\n onlyOwner!\n s.publicMintStart=publicMintStart\n emit(:PublicMintStartUpdated, publicMintStart: publicMintStart)\n }\n function(:setPublicMintEnd, { publicMintEnd: :uint256 }, :public) {\n onlyOwner!\n s.publicMintEnd=publicMintEnd\n emit(:PublicMintEndUpdated, publicMintEnd: publicMintEnd)\n }\n function(:setPublicMintPrice, { publicMintPrice: :uint256 }, :public) {\n onlyOwner!\n s.publicMintPrice=publicMintPrice\n emit(:PublicMintPriceUpdated, publicMintPrice: publicMintPrice)\n }\n function(:setAllowListMerkleRoot, { allowListMerkleRoot: :bytes32 }, :public) {\n onlyOwner!\n s.allowListMerkleRoot=allowListMerkleRoot\n emit(:AllowListMerkleRootUpdated, allowListMerkleRoot: allowListMerkleRoot)\n }\n function(:setAllowListMaxPerAddress, { allowListMaxPerAddress: :uint256 }, :public) {\n onlyOwner!\n s.allowListMaxPerAddress=allowListMaxPerAddress\n emit(:AllowListMaxPerAddressUpdated, allowListMaxPerAddress: allowListMaxPerAddress)\n }\n function(:setAllowListMintStart, { allowListMintStart: :uint256 }, :public) {\n onlyOwner!\n s.allowListMintStart=allowListMintStart\n emit(:AllowListMintStartUpdated, allowListMintStart: allowListMintStart)\n }\n function(:setAllowListMintEnd, { allowListMintEnd: :uint256 }, :public) {\n onlyOwner!\n s.allowListMintEnd=allowListMintEnd\n emit(:AllowListMintEndUpdated, allowListMintEnd: allowListMintEnd)\n }\n function(:setAllowListMintPrice, { allowListMintPrice: :uint256 }, :public) {\n onlyOwner!\n s.allowListMintPrice=allowListMintPrice\n emit(:AllowListMintPriceUpdated, allowListMintPrice: allowListMintPrice)\n }\n function(:setMaxSupply, { maxSupply: :uint256 }, :public) {\n onlyOwner!\n require(s.maxSupply == 0, \"Max supply already set\")\n require(maxSupply >= s.totalSupply, \"New max supply must be greater than total supply\")\n s.maxSupply=maxSupply\n emit(:MaxSupplyUpdated, maxSupply: maxSupply)\n }\n function(:setMetadataRenderer, { metadataRenderer: :address, data: :string }, :public) {\n onlyOwner!\n s.metadataRenderer=metadataRenderer\n if data.length > 0\n (success, _) = metadataRenderer.call(data)\n require(success, \"setMetadataRenderer failed\")\n end\n emit(:MetadataRendererUpdated, metadataRenderer: metadataRenderer)\n }\n function(:setPublicMintSettings, { publicMaxPerAddress: :uint256, publicMintStart: :uint256, publicMintEnd: :uint256, publicMintPrice: :uint256 }, :public) {\n setPublicMaxPerAddress(publicMaxPerAddress)\n setPublicMintStart(publicMintStart)\n setPublicMintEnd(publicMintEnd)\n setPublicMintPrice(publicMintPrice)\n }\n function(:setAllowListMintSettings, { allowListMerkleRoot: :bytes32, allowListMaxPerAddress: :uint256, allowListMintStart: :uint256, allowListMintEnd: :uint256, allowListMintPrice: :uint256 }, :public) {\n setAllowListMerkleRoot(allowListMerkleRoot)\n setAllowListMaxPerAddress(allowListMaxPerAddress)\n setAllowListMintStart(allowListMintStart)\n setAllowListMintEnd(allowListMintEnd)\n setAllowListMintPrice(allowListMintPrice)\n }\n function(:setBaseURI, { baseURI: :string }, :public) {\n onlyOwner!\n s.baseURI=baseURI\n emit(:BaseURIUpdated, baseURI: baseURI)\n }\n function(:burn, { tokenId: :uint256 }, :public) {\n require(isApprovedOrOwner(spender: msg.sender, id: tokenId), \"ERC721: msg.sender not authorized to burn id #{tokenId.toString}\")\n s.totalSupply -= 1\n _burn(tokenId)\n }\n function(:burnMultiple, { tokenIds: [:uint256] }, :public) {\n require(tokenIds.length > 0, \"No token ids provided\")\n require(tokenIds.length <= 20, \"Too many token ids provided\")\n forLoop(condition: ->(i) {\n i < tokenIds.length\n }, max_iterations: 20) { |i|\n burn(tokenIds[i])\n }\n }\n function(:pause, :public) {\n onlyOwner!\n _pause\n }\n function(:unpause, :public) {\n onlyOwner!\n _unpause\n }\n function(:withdrawWETH, :public, returns: :bool) {\n onlyOwner!\n amount = ERC20(s.WETH).balanceOf(address(this))\n ERC20(s.WETH).transfer(s.owner, amount)\n }\n function(:setDefaultRoyalty, { receiver: :address, feeNumerator: :uint96 }, :public) {\n onlyOwner!\n _setDefaultRoyalty(receiver: receiver, feeNumerator: feeNumerator)\n }\n function(:deleteDefaultRoyalty, :public) {\n onlyOwner!\n _deleteDefaultRoyalty\n }\n function(:setTokenRoyalty, { tokenId: :uint256, receiver: :address, feeNumerator: :uint96 }, :public) {\n onlyOwner!\n _setTokenRoyalty(tokenId: tokenId, receiver: receiver, feeNumerator: feeNumerator)\n }\n function(:deleteTokenRoyalty, { tokenId: :uint256 }, :public) {\n onlyOwner!\n _deleteTokenRoyalty(tokenId)\n }\n function(:setFeeTo, { feeTo: :address }, :public) {\n require(msg.sender == s.feeTo, \"Only feeTo can change feeTo\")\n s.feeTo=feeTo\n nil\n }\n}\n"}}