{"abi":[{"type":"function","name":"approve","inputs":[{"name":"_approved","type":"address","internalType":"address"},{"name":"_tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"balanceOf","inputs":[{"name":"_owner","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getApproved","inputs":[{"name":"_tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"isApprovedForAll","inputs":[{"name":"_owner","type":"address","internalType":"address"},{"name":"_operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"ownerOf","inputs":[{"name":"_tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"safeTransferFrom","inputs":[{"name":"_from","type":"address","internalType":"address"},{"name":"_to","type":"address","internalType":"address"},{"name":"_tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"safeTransferFrom","inputs":[{"name":"_from","type":"address","internalType":"address"},{"name":"_to","type":"address","internalType":"address"},{"name":"_tokenId","type":"uint256","internalType":"uint256"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"setApprovalForAll","inputs":[{"name":"_operator","type":"address","internalType":"address"},{"name":"_approved","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceID","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"tokenByIndex","inputs":[{"name":"_index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"tokenOfOwnerByIndex","inputs":[{"name":"_owner","type":"address","internalType":"address"},{"name":"_index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"totalSupply","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"transferFrom","inputs":[{"name":"_from","type":"address","internalType":"address"},{"name":"_to","type":"address","internalType":"address"},{"name":"_tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"event","name":"Approval","inputs":[{"name":"_owner","type":"address","indexed":true,"internalType":"address"},{"name":"_approved","type":"address","indexed":true,"internalType":"address"},{"name":"_tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ApprovalForAll","inputs":[{"name":"_owner","type":"address","indexed":true,"internalType":"address"},{"name":"_operator","type":"address","indexed":true,"internalType":"address"},{"name":"_approved","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"name":"_from","type":"address","indexed":true,"internalType":"address"},{"name":"_to","type":"address","indexed":true,"internalType":"address"},{"name":"_tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{"approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","getApproved(uint256)":"081812fc","isApprovedForAll(address,address)":"e985e9c5","ownerOf(uint256)":"6352211e","safeTransferFrom(address,address,uint256)":"42842e0e","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setApprovalForAll(address,bool)":"a22cb465","supportsInterface(bytes4)":"01ffc9a7","tokenByIndex(uint256)":"4f6ccce7","tokenOfOwnerByIndex(address,uint256)":"2f745c59","totalSupply()":"18160ddd","transferFrom(address,address,uint256)":"23b872dd"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"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\":\"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\":[{\"internalType\":\"address\",\"name\":\"_approved\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"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\":[{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"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\":\"payable\",\"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\":\"payable\",\"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\":[{\"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\":[],\"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\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-721 Note: the ERC-165 identifier for this interface is 0x780e9d63.\",\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"The zero address indicates there is no approved address. Throws unless `msg.sender` is the current NFT owner, or an authorized operator of the current owner.\",\"params\":{\"_approved\":\"The new approved NFT controller\",\"_tokenId\":\"The NFT to approve\"}},\"balanceOf(address)\":{\"details\":\"NFTs assigned to the zero address are considered invalid, and this function throws for queries about the zero address.\",\"params\":{\"_owner\":\"An address for whom to query the balance\"},\"returns\":{\"_0\":\"The number of NFTs owned by `_owner`, possibly zero\"}},\"getApproved(uint256)\":{\"details\":\"Throws if `_tokenId` is not a valid NFT.\",\"params\":{\"_tokenId\":\"The NFT to find the approved address for\"},\"returns\":{\"_0\":\"The approved address for this NFT, or the zero address if there is none\"}},\"isApprovedForAll(address,address)\":{\"params\":{\"_operator\":\"The address that acts on behalf of the owner\",\"_owner\":\"The address that owns the NFTs\"},\"returns\":{\"_0\":\"True if `_operator` is an approved operator for `_owner`, false otherwise\"}},\"ownerOf(uint256)\":{\"details\":\"NFTs assigned to zero address are considered invalid, and queries about them do throw.\",\"params\":{\"_tokenId\":\"The identifier for an NFT\"},\"returns\":{\"_0\":\"The address of the owner of the NFT\"}},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"This works identically to the other function with an extra data parameter, except this function just sets data to \\\"\\\".\",\"params\":{\"_from\":\"The current owner of the NFT\",\"_to\":\"The new owner\",\"_tokenId\":\"The NFT to transfer\"}},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Throws unless `msg.sender` is the current owner, an authorized operator, or the approved address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is the zero address. Throws if `_tokenId` is not a valid NFT. When transfer is complete, this function checks if `_to` is a smart contract (code size > 0). If so, it calls `onERC721Received` on `_to` and throws if the return value is not `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))`.\",\"params\":{\"_from\":\"The current owner of the NFT\",\"_to\":\"The new owner\",\"_tokenId\":\"The NFT to transfer\",\"data\":\"Additional data with no specified format, sent in call to `_to`\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Emits the ApprovalForAll event. The contract MUST allow multiple operators per owner.\",\"params\":{\"_approved\":\"True if the operator is approved, false to revoke approval\",\"_operator\":\"Address to add to the set of authorized operators\"}},\"supportsInterface(bytes4)\":{\"details\":\"Interface identification is specified in ERC-165. This function uses less than 30,000 gas.\",\"params\":{\"interfaceID\":\"The interface identifier, as specified in ERC-165\"},\"returns\":{\"_0\":\"`true` if the contract implements `interfaceID` and `interfaceID` is not 0xffffffff, `false` otherwise\"}},\"tokenByIndex(uint256)\":{\"details\":\"Throws if `_index` >= `totalSupply()`.\",\"params\":{\"_index\":\"A counter less than `totalSupply()`\"},\"returns\":{\"_0\":\"The token identifier for the `_index`th NFT, (sort order not specified)\"}},\"tokenOfOwnerByIndex(address,uint256)\":{\"details\":\"Throws if `_index` >= `balanceOf(_owner)` or if `_owner` is the zero address, representing invalid NFTs.\",\"params\":{\"_index\":\"A counter less than `balanceOf(_owner)`\",\"_owner\":\"An address where we are interested in NFTs owned by them\"},\"returns\":{\"_0\":\"The token identifier for the `_index`th NFT assigned to `_owner`, (sort order not specified)\"}},\"totalSupply()\":{\"returns\":{\"_0\":\"A count of valid NFTs tracked by this contract, where each one of them has an assigned and queryable owner not equal to the zero address\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Throws unless `msg.sender` is the current owner, an authorized operator, or the approved address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is the zero address. Throws if `_tokenId` is not a valid NFT.\",\"params\":{\"_from\":\"The current owner of the NFT\",\"_to\":\"The new owner\",\"_tokenId\":\"The NFT to transfer\"}}},\"title\":\"ERC-721 Non-Fungible Token Standard, optional enumeration extension\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"approve(address,uint256)\":{\"notice\":\"Change or reaffirm the approved address for an NFT\"},\"balanceOf(address)\":{\"notice\":\"Count all NFTs assigned to an owner\"},\"getApproved(uint256)\":{\"notice\":\"Get the approved address for a single NFT\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Query if an address is an authorized operator for another address\"},\"ownerOf(uint256)\":{\"notice\":\"Find the owner of an NFT\"},\"safeTransferFrom(address,address,uint256)\":{\"notice\":\"Transfers the ownership of an NFT from one address to another address\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"notice\":\"Transfers the ownership of an NFT from one address to another address\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Enable or disable approval for a third party (\\\"operator\\\") to manage all of `msg.sender`'s assets\"},\"supportsInterface(bytes4)\":{\"notice\":\"Query if a contract implements an interface\"},\"tokenByIndex(uint256)\":{\"notice\":\"Enumerate valid NFTs\"},\"tokenOfOwnerByIndex(address,uint256)\":{\"notice\":\"Enumerate NFTs assigned to an owner\"},\"totalSupply()\":{\"notice\":\"Count NFTs tracked by this contract\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE THEY MAY BE PERMANENTLY LOST\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/forge-std/src/interfaces/IERC721.sol\":\"IERC721Enumerable\"},\"evmVersion\":\"london\",\"libraries\":{\"src/tokamak-contracts/USDC/L2/tokamak-USDC/v2/FiatTokenV2_2.sol:SignatureChecker\":\"0x4200000000000000000000000000000000000776\"},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[\":@lib-keccak/=lib/lib-keccak/contracts/lib/\",\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":@openzeppelin/contracts_v3.1.0/=lib/openzeppelin-contracts_v3.1.0/contracts/\",\":@openzeppelin/contracts_v5.0.1/=lib/openzeppelin-contracts_v5.0.1/contracts/\",\":@rari-capital/solmate/=lib/solmate/\",\":@solady-test/=lib/lib-keccak/lib/solady/test/\",\":@solady/=lib/solady/src/\",\":automate/=lib/automate/contracts/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts_v5.0.1/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":gelato/=lib/automate/contracts/\",\":hardhat/=lib/automate/node_modules/hardhat/\",\":kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/\",\":lib-keccak/=lib/lib-keccak/contracts/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin-contracts_v3.1.0/=lib/openzeppelin-contracts_v3.1.0/contracts/\",\":openzeppelin-contracts_v5.0.1/=lib/openzeppelin-contracts_v5.0.1/\",\":prb-test/=lib/automate/lib/prb-test/src/\",\":prb/-est/=lib/automate/lib/prb-test/src/\",\":safe-contracts/=lib/safe-contracts/contracts/\",\":solady/=lib/solady/\",\":solmate/=lib/solmate/src/\"]},\"sources\":{\"lib/forge-std/src/interfaces/IERC165.sol\":{\"keccak256\":\"0x414b2861b1acbf816ccb7346d3f16cf6c1e002e9e5e40d2f1f26fa5ddc2ea600\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://698352fb240868ea8f1d1fe389993035eeab930f10d06934f80ccfb2b6ccbfbc\",\"dweb:/ipfs/QmT6WLHAgXxFhh12kWym895oTzXid1326iZiwT3pyfggoT\"]},\"lib/forge-std/src/interfaces/IERC721.sol\":{\"keccak256\":\"0xf069262a264fdb69f8f37a10d2df7374649e9ba73f8414c9c8a3b51184625f15\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://924a41ca82a68ffbd503a5faf2f76d13e9938f10501a71094716f12bb64b4b7f\",\"dweb:/ipfs/QmdWnqfKc5ZGhmxNPTde4zrFchnv9Yk9MpCMb2rdhXE5gm\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.15+commit.e14f2714"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_owner","type":"address","indexed":true},{"internalType":"address","name":"_approved","type":"address","indexed":true},{"internalType":"uint256","name":"_tokenId","type":"uint256","indexed":true}],"type":"event","name":"Approval","anonymous":false},{"inputs":[{"internalType":"address","name":"_owner","type":"address","indexed":true},{"internalType":"address","name":"_operator","type":"address","indexed":true},{"internalType":"bool","name":"_approved","type":"bool","indexed":false}],"type":"event","name":"ApprovalForAll","anonymous":false},{"inputs":[{"internalType":"address","name":"_from","type":"address","indexed":true},{"internalType":"address","name":"_to","type":"address","indexed":true},{"internalType":"uint256","name":"_tokenId","type":"uint256","indexed":true}],"type":"event","name":"Transfer","anonymous":false},{"inputs":[{"internalType":"address","name":"_approved","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"stateMutability":"payable","type":"function","name":"approve"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"view","type":"function","name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"stateMutability":"view","type":"function","name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"stateMutability":"payable","type":"function","name":"safeTransferFrom"},{"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"}],"stateMutability":"payable","type":"function","name":"safeTransferFrom"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"stateMutability":"nonpayable","type":"function","name":"setApprovalForAll"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"stateMutability":"view","type":"function","name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"stateMutability":"view","type":"function","name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"stateMutability":"payable","type":"function","name":"transferFrom"}],"devdoc":{"kind":"dev","methods":{"approve(address,uint256)":{"details":"The zero address indicates there is no approved address. Throws unless `msg.sender` is the current NFT owner, or an authorized operator of the current owner.","params":{"_approved":"The new approved NFT controller","_tokenId":"The NFT to approve"}},"balanceOf(address)":{"details":"NFTs assigned to the zero address are considered invalid, and this function throws for queries about the zero address.","params":{"_owner":"An address for whom to query the balance"},"returns":{"_0":"The number of NFTs owned by `_owner`, possibly zero"}},"getApproved(uint256)":{"details":"Throws if `_tokenId` is not a valid NFT.","params":{"_tokenId":"The NFT to find the approved address for"},"returns":{"_0":"The approved address for this NFT, or the zero address if there is none"}},"isApprovedForAll(address,address)":{"params":{"_operator":"The address that acts on behalf of the owner","_owner":"The address that owns the NFTs"},"returns":{"_0":"True if `_operator` is an approved operator for `_owner`, false otherwise"}},"ownerOf(uint256)":{"details":"NFTs assigned to zero address are considered invalid, and queries about them do throw.","params":{"_tokenId":"The identifier for an NFT"},"returns":{"_0":"The address of the owner of the NFT"}},"safeTransferFrom(address,address,uint256)":{"details":"This works identically to the other function with an extra data parameter, except this function just sets data to \"\".","params":{"_from":"The current owner of the NFT","_to":"The new owner","_tokenId":"The NFT to transfer"}},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Throws unless `msg.sender` is the current owner, an authorized operator, or the approved address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is the zero address. Throws if `_tokenId` is not a valid NFT. When transfer is complete, this function checks if `_to` is a smart contract (code size > 0). If so, it calls `onERC721Received` on `_to` and throws if the return value is not `bytes4(keccak256(\"onERC721Received(address,address,uint256,bytes)\"))`.","params":{"_from":"The current owner of the NFT","_to":"The new owner","_tokenId":"The NFT to transfer","data":"Additional data with no specified format, sent in call to `_to`"}},"setApprovalForAll(address,bool)":{"details":"Emits the ApprovalForAll event. The contract MUST allow multiple operators per owner.","params":{"_approved":"True if the operator is approved, false to revoke approval","_operator":"Address to add to the set of authorized operators"}},"supportsInterface(bytes4)":{"details":"Interface identification is specified in ERC-165. This function uses less than 30,000 gas.","params":{"interfaceID":"The interface identifier, as specified in ERC-165"},"returns":{"_0":"`true` if the contract implements `interfaceID` and `interfaceID` is not 0xffffffff, `false` otherwise"}},"tokenByIndex(uint256)":{"details":"Throws if `_index` >= `totalSupply()`.","params":{"_index":"A counter less than `totalSupply()`"},"returns":{"_0":"The token identifier for the `_index`th NFT, (sort order not specified)"}},"tokenOfOwnerByIndex(address,uint256)":{"details":"Throws if `_index` >= `balanceOf(_owner)` or if `_owner` is the zero address, representing invalid NFTs.","params":{"_index":"A counter less than `balanceOf(_owner)`","_owner":"An address where we are interested in NFTs owned by them"},"returns":{"_0":"The token identifier for the `_index`th NFT assigned to `_owner`, (sort order not specified)"}},"totalSupply()":{"returns":{"_0":"A count of valid NFTs tracked by this contract, where each one of them has an assigned and queryable owner not equal to the zero address"}},"transferFrom(address,address,uint256)":{"details":"Throws unless `msg.sender` is the current owner, an authorized operator, or the approved address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is the zero address. Throws if `_tokenId` is not a valid NFT.","params":{"_from":"The current owner of the NFT","_to":"The new owner","_tokenId":"The NFT to transfer"}}},"version":1},"userdoc":{"kind":"user","methods":{"approve(address,uint256)":{"notice":"Change or reaffirm the approved address for an NFT"},"balanceOf(address)":{"notice":"Count all NFTs assigned to an owner"},"getApproved(uint256)":{"notice":"Get the approved address for a single NFT"},"isApprovedForAll(address,address)":{"notice":"Query if an address is an authorized operator for another address"},"ownerOf(uint256)":{"notice":"Find the owner of an NFT"},"safeTransferFrom(address,address,uint256)":{"notice":"Transfers the ownership of an NFT from one address to another address"},"safeTransferFrom(address,address,uint256,bytes)":{"notice":"Transfers the ownership of an NFT from one address to another address"},"setApprovalForAll(address,bool)":{"notice":"Enable or disable approval for a third party (\"operator\") to manage all of `msg.sender`'s assets"},"supportsInterface(bytes4)":{"notice":"Query if a contract implements an interface"},"tokenByIndex(uint256)":{"notice":"Enumerate valid NFTs"},"tokenOfOwnerByIndex(address,uint256)":{"notice":"Enumerate NFTs assigned to an owner"},"totalSupply()":{"notice":"Count NFTs tracked by this contract"},"transferFrom(address,address,uint256)":{"notice":"Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE THEY MAY BE PERMANENTLY LOST"}},"version":1}},"settings":{"remappings":["@lib-keccak/=lib/lib-keccak/contracts/lib/","@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","@openzeppelin/contracts_v3.1.0/=lib/openzeppelin-contracts_v3.1.0/contracts/","@openzeppelin/contracts_v5.0.1/=lib/openzeppelin-contracts_v5.0.1/contracts/","@rari-capital/solmate/=lib/solmate/","@solady-test/=lib/lib-keccak/lib/solady/test/","@solady/=lib/solady/src/","automate/=lib/automate/contracts/","ds-test/=lib/forge-std/lib/ds-test/src/","erc4626-tests/=lib/openzeppelin-contracts_v5.0.1/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","gelato/=lib/automate/contracts/","hardhat/=lib/automate/node_modules/hardhat/","kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/","lib-keccak/=lib/lib-keccak/contracts/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","openzeppelin-contracts_v3.1.0/=lib/openzeppelin-contracts_v3.1.0/contracts/","openzeppelin-contracts_v5.0.1/=lib/openzeppelin-contracts_v5.0.1/","prb-test/=lib/automate/lib/prb-test/src/","prb/-est/=lib/automate/lib/prb-test/src/","safe-contracts/=lib/safe-contracts/contracts/","solady/=lib/solady/","solmate/=lib/solmate/src/"],"optimizer":{"enabled":true,"runs":999999},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"lib/forge-std/src/interfaces/IERC721.sol":"IERC721Enumerable"},"evmVersion":"london","libraries":{"src/tokamak-contracts/USDC/L2/tokamak-USDC/v2/FiatTokenV2_2.sol:SignatureChecker":"0x4200000000000000000000000000000000000776"}},"sources":{"lib/forge-std/src/interfaces/IERC165.sol":{"keccak256":"0x414b2861b1acbf816ccb7346d3f16cf6c1e002e9e5e40d2f1f26fa5ddc2ea600","urls":["bzz-raw://698352fb240868ea8f1d1fe389993035eeab930f10d06934f80ccfb2b6ccbfbc","dweb:/ipfs/QmT6WLHAgXxFhh12kWym895oTzXid1326iZiwT3pyfggoT"],"license":"MIT"},"lib/forge-std/src/interfaces/IERC721.sol":{"keccak256":"0xf069262a264fdb69f8f37a10d2df7374649e9ba73f8414c9c8a3b51184625f15","urls":["bzz-raw://924a41ca82a68ffbd503a5faf2f76d13e9938f10501a71094716f12bb64b4b7f","dweb:/ipfs/QmdWnqfKc5ZGhmxNPTde4zrFchnv9Yk9MpCMb2rdhXE5gm"],"license":"MIT"}},"version":1},"storageLayout":{"storage":[],"types":{}},"userdoc":{"version":1,"kind":"user","methods":{"approve(address,uint256)":{"notice":"Change or reaffirm the approved address for an NFT"},"balanceOf(address)":{"notice":"Count all NFTs assigned to an owner"},"getApproved(uint256)":{"notice":"Get the approved address for a single NFT"},"isApprovedForAll(address,address)":{"notice":"Query if an address is an authorized operator for another address"},"ownerOf(uint256)":{"notice":"Find the owner of an NFT"},"safeTransferFrom(address,address,uint256)":{"notice":"Transfers the ownership of an NFT from one address to another address"},"safeTransferFrom(address,address,uint256,bytes)":{"notice":"Transfers the ownership of an NFT from one address to another address"},"setApprovalForAll(address,bool)":{"notice":"Enable or disable approval for a third party (\"operator\") to manage all of `msg.sender`'s assets"},"supportsInterface(bytes4)":{"notice":"Query if a contract implements an interface"},"tokenByIndex(uint256)":{"notice":"Enumerate valid NFTs"},"tokenOfOwnerByIndex(address,uint256)":{"notice":"Enumerate NFTs assigned to an owner"},"totalSupply()":{"notice":"Count NFTs tracked by this contract"},"transferFrom(address,address,uint256)":{"notice":"Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE THEY MAY BE PERMANENTLY LOST"}}},"devdoc":{"version":1,"kind":"dev","details":"See https://eips.ethereum.org/EIPS/eip-721 Note: the ERC-165 identifier for this interface is 0x780e9d63.","methods":{"approve(address,uint256)":{"details":"The zero address indicates there is no approved address. Throws unless `msg.sender` is the current NFT owner, or an authorized operator of the current owner.","params":{"_approved":"The new approved NFT controller","_tokenId":"The NFT to approve"}},"balanceOf(address)":{"details":"NFTs assigned to the zero address are considered invalid, and this function throws for queries about the zero address.","params":{"_owner":"An address for whom to query the balance"},"returns":{"_0":"The number of NFTs owned by `_owner`, possibly zero"}},"getApproved(uint256)":{"details":"Throws if `_tokenId` is not a valid NFT.","params":{"_tokenId":"The NFT to find the approved address for"},"returns":{"_0":"The approved address for this NFT, or the zero address if there is none"}},"isApprovedForAll(address,address)":{"params":{"_operator":"The address that acts on behalf of the owner","_owner":"The address that owns the NFTs"},"returns":{"_0":"True if `_operator` is an approved operator for `_owner`, false otherwise"}},"ownerOf(uint256)":{"details":"NFTs assigned to zero address are considered invalid, and queries about them do throw.","params":{"_tokenId":"The identifier for an NFT"},"returns":{"_0":"The address of the owner of the NFT"}},"safeTransferFrom(address,address,uint256)":{"details":"This works identically to the other function with an extra data parameter, except this function just sets data to \"\".","params":{"_from":"The current owner of the NFT","_to":"The new owner","_tokenId":"The NFT to transfer"}},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Throws unless `msg.sender` is the current owner, an authorized operator, or the approved address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is the zero address. Throws if `_tokenId` is not a valid NFT. When transfer is complete, this function checks if `_to` is a smart contract (code size > 0). If so, it calls `onERC721Received` on `_to` and throws if the return value is not `bytes4(keccak256(\"onERC721Received(address,address,uint256,bytes)\"))`.","params":{"_from":"The current owner of the NFT","_to":"The new owner","_tokenId":"The NFT to transfer","data":"Additional data with no specified format, sent in call to `_to`"}},"setApprovalForAll(address,bool)":{"details":"Emits the ApprovalForAll event. The contract MUST allow multiple operators per owner.","params":{"_approved":"True if the operator is approved, false to revoke approval","_operator":"Address to add to the set of authorized operators"}},"supportsInterface(bytes4)":{"details":"Interface identification is specified in ERC-165. This function uses less than 30,000 gas.","params":{"interfaceID":"The interface identifier, as specified in ERC-165"},"returns":{"_0":"`true` if the contract implements `interfaceID` and `interfaceID` is not 0xffffffff, `false` otherwise"}},"tokenByIndex(uint256)":{"details":"Throws if `_index` >= `totalSupply()`.","params":{"_index":"A counter less than `totalSupply()`"},"returns":{"_0":"The token identifier for the `_index`th NFT, (sort order not specified)"}},"tokenOfOwnerByIndex(address,uint256)":{"details":"Throws if `_index` >= `balanceOf(_owner)` or if `_owner` is the zero address, representing invalid NFTs.","params":{"_index":"A counter less than `balanceOf(_owner)`","_owner":"An address where we are interested in NFTs owned by them"},"returns":{"_0":"The token identifier for the `_index`th NFT assigned to `_owner`, (sort order not specified)"}},"totalSupply()":{"returns":{"_0":"A count of valid NFTs tracked by this contract, where each one of them has an assigned and queryable owner not equal to the zero address"}},"transferFrom(address,address,uint256)":{"details":"Throws unless `msg.sender` is the current owner, an authorized operator, or the approved address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is the zero address. Throws if `_tokenId` is not a valid NFT.","params":{"_from":"The current owner of the NFT","_to":"The new owner","_tokenId":"The NFT to transfer"}}},"title":"ERC-721 Non-Fungible Token Standard, optional enumeration extension"},"ast":{"absolutePath":"lib/forge-std/src/interfaces/IERC721.sol","id":32792,"exportedSymbols":{"IERC165":[32511],"IERC721":[32723],"IERC721Enumerable":[32791],"IERC721Metadata":[32763],"IERC721TokenReceiver":[32739]},"nodeType":"SourceUnit","src":"32:8994:24","nodes":[{"id":32609,"nodeType":"PragmaDirective","src":"32:24:24","nodes":[],"literals":["solidity",">=","0.6",".2"]},{"id":32610,"nodeType":"ImportDirective","src":"58:23:24","nodes":[],"absolutePath":"lib/forge-std/src/interfaces/IERC165.sol","file":"./IERC165.sol","nameLocation":"-1:-1:-1","scope":32792,"sourceUnit":32512,"symbolAliases":[],"unitAlias":""},{"id":32723,"nodeType":"ContractDefinition","src":"249:5535:24","nodes":[{"id":32622,"nodeType":"EventDefinition","src":"673:85:24","nodes":[],"anonymous":false,"documentation":{"id":32614,"nodeType":"StructuredDocumentation","src":"284:384:24","text":"@dev This emits when ownership of any NFT changes by any mechanism.\n This event emits when NFTs are created (`from` == 0) and destroyed\n (`to` == 0). Exception: during contract creation, any number of NFTs\n may be created and assigned without emitting Transfer. At the time of\n any transfer, the approved address for that NFT (if any) is reset to none."},"eventSelector":"ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","name":"Transfer","nameLocation":"679:8:24","parameters":{"id":32621,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32616,"indexed":true,"mutability":"mutable","name":"_from","nameLocation":"704:5:24","nodeType":"VariableDeclaration","scope":32622,"src":"688:21:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32615,"name":"address","nodeType":"ElementaryTypeName","src":"688:7:24","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":32618,"indexed":true,"mutability":"mutable","name":"_to","nameLocation":"727:3:24","nodeType":"VariableDeclaration","scope":32622,"src":"711:19:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32617,"name":"address","nodeType":"ElementaryTypeName","src":"711:7:24","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":32620,"indexed":true,"mutability":"mutable","name":"_tokenId","nameLocation":"748:8:24","nodeType":"VariableDeclaration","scope":32622,"src":"732:24:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":32619,"name":"uint256","nodeType":"ElementaryTypeName","src":"732:7:24","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"687:70:24"}},{"id":32631,"nodeType":"EventDefinition","src":"1047:92:24","nodes":[],"anonymous":false,"documentation":{"id":32623,"nodeType":"StructuredDocumentation","src":"764:278:24","text":"@dev This emits when the approved address for an NFT is changed or\n reaffirmed. The zero address indicates there is no approved address.\n When a Transfer event emits, this also indicates that the approved\n address for that NFT (if any) is reset to none."},"eventSelector":"8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925","name":"Approval","nameLocation":"1053:8:24","parameters":{"id":32630,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32625,"indexed":true,"mutability":"mutable","name":"_owner","nameLocation":"1078:6:24","nodeType":"VariableDeclaration","scope":32631,"src":"1062:22:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32624,"name":"address","nodeType":"ElementaryTypeName","src":"1062:7:24","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":32627,"indexed":true,"mutability":"mutable","name":"_approved","nameLocation":"1102:9:24","nodeType":"VariableDeclaration","scope":32631,"src":"1086:25:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32626,"name":"address","nodeType":"ElementaryTypeName","src":"1086:7:24","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":32629,"indexed":true,"mutability":"mutable","name":"_tokenId","nameLocation":"1129:8:24","nodeType":"VariableDeclaration","scope":32631,"src":"1113:24:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":32628,"name":"uint256","nodeType":"ElementaryTypeName","src":"1113:7:24","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1061:77:24"}},{"id":32640,"nodeType":"EventDefinition","src":"1278:88:24","nodes":[],"anonymous":false,"documentation":{"id":32632,"nodeType":"StructuredDocumentation","src":"1145:128:24","text":"@dev This emits when an operator is enabled or disabled for an owner.\n The operator can manage all NFTs of the owner."},"eventSelector":"17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31","name":"ApprovalForAll","nameLocation":"1284:14:24","parameters":{"id":32639,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32634,"indexed":true,"mutability":"mutable","name":"_owner","nameLocation":"1315:6:24","nodeType":"VariableDeclaration","scope":32640,"src":"1299:22:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32633,"name":"address","nodeType":"ElementaryTypeName","src":"1299:7:24","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":32636,"indexed":true,"mutability":"mutable","name":"_operator","nameLocation":"1339:9:24","nodeType":"VariableDeclaration","scope":32640,"src":"1323:25:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32635,"name":"address","nodeType":"ElementaryTypeName","src":"1323:7:24","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":32638,"indexed":false,"mutability":"mutable","name":"_approved","nameLocation":"1355:9:24","nodeType":"VariableDeclaration","scope":32640,"src":"1350:14:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":32637,"name":"bool","nodeType":"ElementaryTypeName","src":"1350:4:24","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1298:67:24"}},{"id":32648,"nodeType":"FunctionDefinition","src":"1695:67:24","nodes":[],"documentation":{"id":32641,"nodeType":"StructuredDocumentation","src":"1372:318:24","text":"@notice Count all NFTs assigned to an owner\n @dev NFTs assigned to the zero address are considered invalid, and this\n function throws for queries about the zero address.\n @param _owner An address for whom to query the balance\n @return The number of NFTs owned by `_owner`, possibly zero"},"functionSelector":"70a08231","implemented":false,"kind":"function","modifiers":[],"name":"balanceOf","nameLocation":"1704:9:24","parameters":{"id":32644,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32643,"mutability":"mutable","name":"_owner","nameLocation":"1722:6:24","nodeType":"VariableDeclaration","scope":32648,"src":"1714:14:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32642,"name":"address","nodeType":"ElementaryTypeName","src":"1714:7:24","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1713:16:24"},"returnParameters":{"id":32647,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32646,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":32648,"src":"1753:7:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":32645,"name":"uint256","nodeType":"ElementaryTypeName","src":"1753:7:24","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1752:9:24"},"scope":32723,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":32656,"nodeType":"FunctionDefinition","src":"2019:67:24","nodes":[],"documentation":{"id":32649,"nodeType":"StructuredDocumentation","src":"1768:246:24","text":"@notice Find the owner of an NFT\n @dev NFTs assigned to zero address are considered invalid, and queries\n about them do throw.\n @param _tokenId The identifier for an NFT\n @return The address of the owner of the NFT"},"functionSelector":"6352211e","implemented":false,"kind":"function","modifiers":[],"name":"ownerOf","nameLocation":"2028:7:24","parameters":{"id":32652,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32651,"mutability":"mutable","name":"_tokenId","nameLocation":"2044:8:24","nodeType":"VariableDeclaration","scope":32656,"src":"2036:16:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":32650,"name":"uint256","nodeType":"ElementaryTypeName","src":"2036:7:24","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2035:18:24"},"returnParameters":{"id":32655,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32654,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":32656,"src":"2077:7:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32653,"name":"address","nodeType":"ElementaryTypeName","src":"2077:7:24","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2076:9:24"},"scope":32723,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":32668,"nodeType":"FunctionDefinition","src":"2931:110:24","nodes":[],"documentation":{"id":32657,"nodeType":"StructuredDocumentation","src":"2092:834:24","text":"@notice Transfers the ownership of an NFT from one address to another address\n @dev Throws unless `msg.sender` is the current owner, an authorized\n operator, or the approved address for this NFT. Throws if `_from` is\n not the current owner. Throws if `_to` is the zero address. Throws if\n `_tokenId` is not a valid NFT. When transfer is complete, this function\n checks if `_to` is a smart contract (code size > 0). If so, it calls\n `onERC721Received` on `_to` and throws if the return value is not\n `bytes4(keccak256(\"onERC721Received(address,address,uint256,bytes)\"))`.\n @param _from The current owner of the NFT\n @param _to The new owner\n @param _tokenId The NFT to transfer\n @param data Additional data with no specified format, sent in call to `_to`"},"functionSelector":"b88d4fde","implemented":false,"kind":"function","modifiers":[],"name":"safeTransferFrom","nameLocation":"2940:16:24","parameters":{"id":32666,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32659,"mutability":"mutable","name":"_from","nameLocation":"2965:5:24","nodeType":"VariableDeclaration","scope":32668,"src":"2957:13:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32658,"name":"address","nodeType":"ElementaryTypeName","src":"2957:7:24","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":32661,"mutability":"mutable","name":"_to","nameLocation":"2980:3:24","nodeType":"VariableDeclaration","scope":32668,"src":"2972:11:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32660,"name":"address","nodeType":"ElementaryTypeName","src":"2972:7:24","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":32663,"mutability":"mutable","name":"_tokenId","nameLocation":"2993:8:24","nodeType":"VariableDeclaration","scope":32668,"src":"2985:16:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":32662,"name":"uint256","nodeType":"ElementaryTypeName","src":"2985:7:24","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":32665,"mutability":"mutable","name":"data","nameLocation":"3018:4:24","nodeType":"VariableDeclaration","scope":32668,"src":"3003:19:24","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":32664,"name":"bytes","nodeType":"ElementaryTypeName","src":"3003:5:24","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2956:67:24"},"returnParameters":{"id":32667,"nodeType":"ParameterList","parameters":[],"src":"3040:0:24"},"scope":32723,"stateMutability":"payable","virtual":false,"visibility":"external"},{"id":32678,"nodeType":"FunctionDefinition","src":"3399:89:24","nodes":[],"documentation":{"id":32669,"nodeType":"StructuredDocumentation","src":"3047:347:24","text":"@notice Transfers the ownership of an NFT from one address to another address\n @dev This works identically to the other function with an extra data parameter,\n except this function just sets data to \"\".\n @param _from The current owner of the NFT\n @param _to The new owner\n @param _tokenId The NFT to transfer"},"functionSelector":"42842e0e","implemented":false,"kind":"function","modifiers":[],"name":"safeTransferFrom","nameLocation":"3408:16:24","parameters":{"id":32676,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32671,"mutability":"mutable","name":"_from","nameLocation":"3433:5:24","nodeType":"VariableDeclaration","scope":32678,"src":"3425:13:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32670,"name":"address","nodeType":"ElementaryTypeName","src":"3425:7:24","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":32673,"mutability":"mutable","name":"_to","nameLocation":"3448:3:24","nodeType":"VariableDeclaration","scope":32678,"src":"3440:11:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32672,"name":"address","nodeType":"ElementaryTypeName","src":"3440:7:24","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":32675,"mutability":"mutable","name":"_tokenId","nameLocation":"3461:8:24","nodeType":"VariableDeclaration","scope":32678,"src":"3453:16:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":32674,"name":"uint256","nodeType":"ElementaryTypeName","src":"3453:7:24","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3424:46:24"},"returnParameters":{"id":32677,"nodeType":"ParameterList","parameters":[],"src":"3487:0:24"},"scope":32723,"stateMutability":"payable","virtual":false,"visibility":"external"},{"id":32688,"nodeType":"FunctionDefinition","src":"4069:85:24","nodes":[],"documentation":{"id":32679,"nodeType":"StructuredDocumentation","src":"3494:570:24","text":"@notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE\n TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE\n THEY MAY BE PERMANENTLY LOST\n @dev Throws unless `msg.sender` is the current owner, an authorized\n operator, or the approved address for this NFT. Throws if `_from` is\n not the current owner. Throws if `_to` is the zero address. Throws if\n `_tokenId` is not a valid NFT.\n @param _from The current owner of the NFT\n @param _to The new owner\n @param _tokenId The NFT to transfer"},"functionSelector":"23b872dd","implemented":false,"kind":"function","modifiers":[],"name":"transferFrom","nameLocation":"4078:12:24","parameters":{"id":32686,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32681,"mutability":"mutable","name":"_from","nameLocation":"4099:5:24","nodeType":"VariableDeclaration","scope":32688,"src":"4091:13:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32680,"name":"address","nodeType":"ElementaryTypeName","src":"4091:7:24","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":32683,"mutability":"mutable","name":"_to","nameLocation":"4114:3:24","nodeType":"VariableDeclaration","scope":32688,"src":"4106:11:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32682,"name":"address","nodeType":"ElementaryTypeName","src":"4106:7:24","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":32685,"mutability":"mutable","name":"_tokenId","nameLocation":"4127:8:24","nodeType":"VariableDeclaration","scope":32688,"src":"4119:16:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":32684,"name":"uint256","nodeType":"ElementaryTypeName","src":"4119:7:24","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4090:46:24"},"returnParameters":{"id":32687,"nodeType":"ParameterList","parameters":[],"src":"4153:0:24"},"scope":32723,"stateMutability":"payable","virtual":false,"visibility":"external"},{"id":32696,"nodeType":"FunctionDefinition","src":"4514:71:24","nodes":[],"documentation":{"id":32689,"nodeType":"StructuredDocumentation","src":"4160:349:24","text":"@notice Change or reaffirm the approved address for an NFT\n @dev The zero address indicates there is no approved address.\n Throws unless `msg.sender` is the current NFT owner, or an authorized\n operator of the current owner.\n @param _approved The new approved NFT controller\n @param _tokenId The NFT to approve"},"functionSelector":"095ea7b3","implemented":false,"kind":"function","modifiers":[],"name":"approve","nameLocation":"4523:7:24","parameters":{"id":32694,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32691,"mutability":"mutable","name":"_approved","nameLocation":"4539:9:24","nodeType":"VariableDeclaration","scope":32696,"src":"4531:17:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32690,"name":"address","nodeType":"ElementaryTypeName","src":"4531:7:24","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":32693,"mutability":"mutable","name":"_tokenId","nameLocation":"4558:8:24","nodeType":"VariableDeclaration","scope":32696,"src":"4550:16:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":32692,"name":"uint256","nodeType":"ElementaryTypeName","src":"4550:7:24","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4530:37:24"},"returnParameters":{"id":32695,"nodeType":"ParameterList","parameters":[],"src":"4584:0:24"},"scope":32723,"stateMutability":"payable","virtual":false,"visibility":"external"},{"id":32704,"nodeType":"FunctionDefinition","src":"4978:71:24","nodes":[],"documentation":{"id":32697,"nodeType":"StructuredDocumentation","src":"4591:382:24","text":"@notice Enable or disable approval for a third party (\"operator\") to manage\n all of `msg.sender`'s assets\n @dev Emits the ApprovalForAll event. The contract MUST allow\n multiple operators per owner.\n @param _operator Address to add to the set of authorized operators\n @param _approved True if the operator is approved, false to revoke approval"},"functionSelector":"a22cb465","implemented":false,"kind":"function","modifiers":[],"name":"setApprovalForAll","nameLocation":"4987:17:24","parameters":{"id":32702,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32699,"mutability":"mutable","name":"_operator","nameLocation":"5013:9:24","nodeType":"VariableDeclaration","scope":32704,"src":"5005:17:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32698,"name":"address","nodeType":"ElementaryTypeName","src":"5005:7:24","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":32701,"mutability":"mutable","name":"_approved","nameLocation":"5029:9:24","nodeType":"VariableDeclaration","scope":32704,"src":"5024:14:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":32700,"name":"bool","nodeType":"ElementaryTypeName","src":"5024:4:24","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"5004:35:24"},"returnParameters":{"id":32703,"nodeType":"ParameterList","parameters":[],"src":"5048:0:24"},"scope":32723,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":32712,"nodeType":"FunctionDefinition","src":"5320:71:24","nodes":[],"documentation":{"id":32705,"nodeType":"StructuredDocumentation","src":"5055:260:24","text":"@notice Get the approved address for a single NFT\n @dev Throws if `_tokenId` is not a valid NFT.\n @param _tokenId The NFT to find the approved address for\n @return The approved address for this NFT, or the zero address if there is none"},"functionSelector":"081812fc","implemented":false,"kind":"function","modifiers":[],"name":"getApproved","nameLocation":"5329:11:24","parameters":{"id":32708,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32707,"mutability":"mutable","name":"_tokenId","nameLocation":"5349:8:24","nodeType":"VariableDeclaration","scope":32712,"src":"5341:16:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":32706,"name":"uint256","nodeType":"ElementaryTypeName","src":"5341:7:24","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5340:18:24"},"returnParameters":{"id":32711,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32710,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":32712,"src":"5382:7:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32709,"name":"address","nodeType":"ElementaryTypeName","src":"5382:7:24","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"5381:9:24"},"scope":32723,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":32722,"nodeType":"FunctionDefinition","src":"5692:90:24","nodes":[],"documentation":{"id":32713,"nodeType":"StructuredDocumentation","src":"5397:290:24","text":"@notice Query if an address is an authorized operator for another address\n @param _owner The address that owns the NFTs\n @param _operator The address that acts on behalf of the owner\n @return True if `_operator` is an approved operator for `_owner`, false otherwise"},"functionSelector":"e985e9c5","implemented":false,"kind":"function","modifiers":[],"name":"isApprovedForAll","nameLocation":"5701:16:24","parameters":{"id":32718,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32715,"mutability":"mutable","name":"_owner","nameLocation":"5726:6:24","nodeType":"VariableDeclaration","scope":32722,"src":"5718:14:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32714,"name":"address","nodeType":"ElementaryTypeName","src":"5718:7:24","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":32717,"mutability":"mutable","name":"_operator","nameLocation":"5742:9:24","nodeType":"VariableDeclaration","scope":32722,"src":"5734:17:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32716,"name":"address","nodeType":"ElementaryTypeName","src":"5734:7:24","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"5717:35:24"},"returnParameters":{"id":32721,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32720,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":32722,"src":"5776:4:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":32719,"name":"bool","nodeType":"ElementaryTypeName","src":"5776:4:24","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"5775:6:24"},"scope":32723,"stateMutability":"view","virtual":false,"visibility":"external"}],"abstract":false,"baseContracts":[{"baseName":{"id":32612,"name":"IERC165","nodeType":"IdentifierPath","referencedDeclaration":32511,"src":"270:7:24"},"id":32613,"nodeType":"InheritanceSpecifier","src":"270:7:24"}],"canonicalName":"IERC721","contractDependencies":[],"contractKind":"interface","documentation":{"id":32611,"nodeType":"StructuredDocumentation","src":"83:166:24","text":"@title ERC-721 Non-Fungible Token Standard\n @dev See https://eips.ethereum.org/EIPS/eip-721\n Note: the ERC-165 identifier for this interface is 0x80ac58cd."},"fullyImplemented":false,"linearizedBaseContracts":[32723,32511],"name":"IERC721","nameLocation":"259:7:24","scope":32792,"usedErrors":[]},{"id":32739,"nodeType":"ContractDefinition","src":"5858:942:24","nodes":[{"id":32738,"nodeType":"FunctionDefinition","src":"6656:142:24","nodes":[],"documentation":{"id":32725,"nodeType":"StructuredDocumentation","src":"5895:756:24","text":"@notice Handle the receipt of an NFT\n @dev The ERC721 smart contract calls this function on the recipient\n after a `transfer`. This function MAY throw to revert and reject the\n transfer. Return of other than the magic value MUST result in the\n transaction being reverted.\n Note: the contract address is always the message sender.\n @param _operator The address which called `safeTransferFrom` function\n @param _from The address which previously owned the token\n @param _tokenId The NFT identifier which is being transferred\n @param _data Additional data with no specified format\n @return `bytes4(keccak256(\"onERC721Received(address,address,uint256,bytes)\"))`\n  unless throwing"},"functionSelector":"150b7a02","implemented":false,"kind":"function","modifiers":[],"name":"onERC721Received","nameLocation":"6665:16:24","parameters":{"id":32734,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32727,"mutability":"mutable","name":"_operator","nameLocation":"6690:9:24","nodeType":"VariableDeclaration","scope":32738,"src":"6682:17:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32726,"name":"address","nodeType":"ElementaryTypeName","src":"6682:7:24","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":32729,"mutability":"mutable","name":"_from","nameLocation":"6709:5:24","nodeType":"VariableDeclaration","scope":32738,"src":"6701:13:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32728,"name":"address","nodeType":"ElementaryTypeName","src":"6701:7:24","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":32731,"mutability":"mutable","name":"_tokenId","nameLocation":"6724:8:24","nodeType":"VariableDeclaration","scope":32738,"src":"6716:16:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":32730,"name":"uint256","nodeType":"ElementaryTypeName","src":"6716:7:24","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":32733,"mutability":"mutable","name":"_data","nameLocation":"6749:5:24","nodeType":"VariableDeclaration","scope":32738,"src":"6734:20:24","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":32732,"name":"bytes","nodeType":"ElementaryTypeName","src":"6734:5:24","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"6681:74:24"},"returnParameters":{"id":32737,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32736,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":32738,"src":"6790:6:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":32735,"name":"bytes4","nodeType":"ElementaryTypeName","src":"6790:6:24","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"6789:8:24"},"scope":32739,"stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"abstract":false,"baseContracts":[],"canonicalName":"IERC721TokenReceiver","contractDependencies":[],"contractKind":"interface","documentation":{"id":32724,"nodeType":"StructuredDocumentation","src":"5786:72:24","text":"@dev Note: the ERC-165 identifier for this interface is 0x150b7a02."},"fullyImplemented":false,"linearizedBaseContracts":[32739],"name":"IERC721TokenReceiver","nameLocation":"5868:20:24","scope":32792,"usedErrors":[]},{"id":32763,"nodeType":"ContractDefinition","src":"6997:659:24","nodes":[{"id":32748,"nodeType":"FunctionDefinition","src":"7117:60:24","nodes":[],"documentation":{"id":32743,"nodeType":"StructuredDocumentation","src":"7040:72:24","text":"@notice A descriptive name for a collection of NFTs in this contract"},"functionSelector":"06fdde03","implemented":false,"kind":"function","modifiers":[],"name":"name","nameLocation":"7126:4:24","parameters":{"id":32744,"nodeType":"ParameterList","parameters":[],"src":"7130:2:24"},"returnParameters":{"id":32747,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32746,"mutability":"mutable","name":"_name","nameLocation":"7170:5:24","nodeType":"VariableDeclaration","scope":32748,"src":"7156:19:24","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":32745,"name":"string","nodeType":"ElementaryTypeName","src":"7156:6:24","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"7155:21:24"},"scope":32763,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":32754,"nodeType":"FunctionDefinition","src":"7245:64:24","nodes":[],"documentation":{"id":32749,"nodeType":"StructuredDocumentation","src":"7183:57:24","text":"@notice An abbreviated name for NFTs in this contract"},"functionSelector":"95d89b41","implemented":false,"kind":"function","modifiers":[],"name":"symbol","nameLocation":"7254:6:24","parameters":{"id":32750,"nodeType":"ParameterList","parameters":[],"src":"7260:2:24"},"returnParameters":{"id":32753,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32752,"mutability":"mutable","name":"_symbol","nameLocation":"7300:7:24","nodeType":"VariableDeclaration","scope":32754,"src":"7286:21:24","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":32751,"name":"string","nodeType":"ElementaryTypeName","src":"7286:6:24","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"7285:23:24"},"scope":32763,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":32762,"nodeType":"FunctionDefinition","src":"7580:74:24","nodes":[],"documentation":{"id":32755,"nodeType":"StructuredDocumentation","src":"7315:260:24","text":"@notice A distinct Uniform Resource Identifier (URI) for a given asset.\n @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC\n 3986. The URI may point to a JSON file that conforms to the \"ERC721\n Metadata JSON Schema\"."},"functionSelector":"c87b56dd","implemented":false,"kind":"function","modifiers":[],"name":"tokenURI","nameLocation":"7589:8:24","parameters":{"id":32758,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32757,"mutability":"mutable","name":"_tokenId","nameLocation":"7606:8:24","nodeType":"VariableDeclaration","scope":32762,"src":"7598:16:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":32756,"name":"uint256","nodeType":"ElementaryTypeName","src":"7598:7:24","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"7597:18:24"},"returnParameters":{"id":32761,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32760,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":32762,"src":"7639:13:24","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":32759,"name":"string","nodeType":"ElementaryTypeName","src":"7639:6:24","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"7638:15:24"},"scope":32763,"stateMutability":"view","virtual":false,"visibility":"external"}],"abstract":false,"baseContracts":[{"baseName":{"id":32741,"name":"IERC721","nodeType":"IdentifierPath","referencedDeclaration":32723,"src":"7026:7:24"},"id":32742,"nodeType":"InheritanceSpecifier","src":"7026:7:24"}],"canonicalName":"IERC721Metadata","contractDependencies":[],"contractKind":"interface","documentation":{"id":32740,"nodeType":"StructuredDocumentation","src":"6802:195:24","text":"@title ERC-721 Non-Fungible Token Standard, optional metadata extension\n @dev See https://eips.ethereum.org/EIPS/eip-721\n Note: the ERC-165 identifier for this interface is 0x5b5e139f."},"fullyImplemented":false,"linearizedBaseContracts":[32763,32723,32511],"name":"IERC721Metadata","nameLocation":"7007:15:24","scope":32792,"usedErrors":[]},{"id":32791,"nodeType":"ContractDefinition","src":"7856:1169:24","nodes":[{"id":32772,"nodeType":"FunctionDefinition","src":"8114:55:24","nodes":[],"documentation":{"id":32767,"nodeType":"StructuredDocumentation","src":"7901:208:24","text":"@notice Count NFTs tracked by this contract\n @return A count of valid NFTs tracked by this contract, where each one of\n them has an assigned and queryable owner not equal to the zero address"},"functionSelector":"18160ddd","implemented":false,"kind":"function","modifiers":[],"name":"totalSupply","nameLocation":"8123:11:24","parameters":{"id":32768,"nodeType":"ParameterList","parameters":[],"src":"8134:2:24"},"returnParameters":{"id":32771,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32770,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":32772,"src":"8160:7:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":32769,"name":"uint256","nodeType":"ElementaryTypeName","src":"8160:7:24","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"8159:9:24"},"scope":32791,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":32780,"nodeType":"FunctionDefinition","src":"8418:70:24","nodes":[],"documentation":{"id":32773,"nodeType":"StructuredDocumentation","src":"8175:238:24","text":"@notice Enumerate valid NFTs\n @dev Throws if `_index` >= `totalSupply()`.\n @param _index A counter less than `totalSupply()`\n @return The token identifier for the `_index`th NFT,\n (sort order not specified)"},"functionSelector":"4f6ccce7","implemented":false,"kind":"function","modifiers":[],"name":"tokenByIndex","nameLocation":"8427:12:24","parameters":{"id":32776,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32775,"mutability":"mutable","name":"_index","nameLocation":"8448:6:24","nodeType":"VariableDeclaration","scope":32780,"src":"8440:14:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":32774,"name":"uint256","nodeType":"ElementaryTypeName","src":"8440:7:24","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"8439:16:24"},"returnParameters":{"id":32779,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32778,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":32780,"src":"8479:7:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":32777,"name":"uint256","nodeType":"ElementaryTypeName","src":"8479:7:24","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"8478:9:24"},"scope":32791,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":32790,"nodeType":"FunctionDefinition","src":"8930:93:24","nodes":[],"documentation":{"id":32781,"nodeType":"StructuredDocumentation","src":"8494:431:24","text":"@notice Enumerate NFTs assigned to an owner\n @dev Throws if `_index` >= `balanceOf(_owner)` or if\n `_owner` is the zero address, representing invalid NFTs.\n @param _owner An address where we are interested in NFTs owned by them\n @param _index A counter less than `balanceOf(_owner)`\n @return The token identifier for the `_index`th NFT assigned to `_owner`,\n (sort order not specified)"},"functionSelector":"2f745c59","implemented":false,"kind":"function","modifiers":[],"name":"tokenOfOwnerByIndex","nameLocation":"8939:19:24","parameters":{"id":32786,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32783,"mutability":"mutable","name":"_owner","nameLocation":"8967:6:24","nodeType":"VariableDeclaration","scope":32790,"src":"8959:14:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32782,"name":"address","nodeType":"ElementaryTypeName","src":"8959:7:24","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":32785,"mutability":"mutable","name":"_index","nameLocation":"8983:6:24","nodeType":"VariableDeclaration","scope":32790,"src":"8975:14:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":32784,"name":"uint256","nodeType":"ElementaryTypeName","src":"8975:7:24","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"8958:32:24"},"returnParameters":{"id":32789,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32788,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":32790,"src":"9014:7:24","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":32787,"name":"uint256","nodeType":"ElementaryTypeName","src":"9014:7:24","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"9013:9:24"},"scope":32791,"stateMutability":"view","virtual":false,"visibility":"external"}],"abstract":false,"baseContracts":[{"baseName":{"id":32765,"name":"IERC721","nodeType":"IdentifierPath","referencedDeclaration":32723,"src":"7887:7:24"},"id":32766,"nodeType":"InheritanceSpecifier","src":"7887:7:24"}],"canonicalName":"IERC721Enumerable","contractDependencies":[],"contractKind":"interface","documentation":{"id":32764,"nodeType":"StructuredDocumentation","src":"7658:198:24","text":"@title ERC-721 Non-Fungible Token Standard, optional enumeration extension\n @dev See https://eips.ethereum.org/EIPS/eip-721\n Note: the ERC-165 identifier for this interface is 0x780e9d63."},"fullyImplemented":false,"linearizedBaseContracts":[32791,32723,32511],"name":"IERC721Enumerable","nameLocation":"7866:17:24","scope":32792,"usedErrors":[]}],"license":"MIT"},"id":24}