git.delta.rocks / unique-network / refs/commits / 5a6e19099ff1

difftreelog

test evm collection properties

Yaroslav Bolyukin2022-05-17parent: #6edd3f1.patch.diff
in: master

2 files changed

addedtests/src/eth/collectionProperties.test.tsdiffbeforeafterboth
--- /dev/null
+++ b/tests/src/eth/collectionProperties.test.ts
@@ -0,0 +1,55 @@
+import privateKey from '../substrate/privateKey';
+import {addCollectionAdminExpectSuccess, createCollectionExpectSuccess} from '../util/helpers';
+import {collectionIdToAddress, createEthAccount, createEthAccountWithBalance, GAS_ARGS, itWeb3} from './util/helpers';
+import nonFungibleAbi from './nonFungibleAbi.json';
+import {expect} from 'chai';
+import {executeTransaction} from '../substrate/substrate-api';
+
+describe('EVM collection properties', () => {
+  itWeb3('Can be set', async({web3, api}) => {
+    const alice = privateKey('//Alice');
+    const caller = await createEthAccountWithBalance(api, web3);
+    const collection = await createCollectionExpectSuccess({mode: {type: 'NFT'}});
+
+    await addCollectionAdminExpectSuccess(alice, collection, {Ethereum: caller});
+
+    const address = collectionIdToAddress(collection);
+    const contract = new web3.eth.Contract(nonFungibleAbi as any, address, {from: caller, ...GAS_ARGS});
+
+    await contract.methods.setCollectionProperty('testKey', Buffer.from('testValue')).send({from: caller});
+
+    const [{value}] = (await api.rpc.unique.collectionProperties(collection, ['testKey'])).toHuman()! as any;
+    expect(value).to.equal('testValue');
+  });
+  itWeb3('Can be deleted', async({web3, api}) => {
+    const alice = privateKey('//Alice');
+    const caller = await createEthAccountWithBalance(api, web3);
+    const collection = await createCollectionExpectSuccess({mode: {type: 'NFT'}});
+
+    await executeTransaction(api, alice, api.tx.unique.setCollectionProperties(collection, [{key: 'testKey', value: 'testValue'}]));
+
+    await addCollectionAdminExpectSuccess(alice, collection, {Ethereum: caller});
+
+    const address = collectionIdToAddress(collection);
+    const contract = new web3.eth.Contract(nonFungibleAbi as any, address, {from: caller, ...GAS_ARGS});
+
+    await contract.methods.deleteCollectionProperty('testKey').send({from: caller});
+
+    const result = (await api.rpc.unique.collectionProperties(collection, ['testKey'])).toJSON()! as any;
+    expect(result.length).to.equal(0);
+  });
+  itWeb3('Can be read', async({web3, api}) => {
+    const alice = privateKey('//Alice');
+    const caller = createEthAccount(web3);
+    const collection = await createCollectionExpectSuccess({mode: {type:'NFT'}});
+
+    await executeTransaction(api, alice, api.tx.unique.setCollectionProperties(collection, [{key: 'testKey', value: 'testValue'}]));
+
+    const address = collectionIdToAddress(collection);
+    const contract = new web3.eth.Contract(nonFungibleAbi as any, address, {from: caller, ...GAS_ARGS});
+
+    const value = await contract.methods.collectionProperty('testKey').call();
+
+    expect(value).to.equal(web3.utils.toHex('testValue'));
+  });
+});
modifiedtests/src/eth/nonFungibleAbi.jsondiffbeforeafterboth
before · tests/src/eth/nonFungibleAbi.json
1[2    {3        "anonymous": false,4        "inputs": [5            {6                "indexed": true,7                "internalType": "address",8                "name": "owner",9                "type": "address"10            },11            {12                "indexed": true,13                "internalType": "address",14                "name": "approved",15                "type": "address"16            },17            {18                "indexed": true,19                "internalType": "uint256",20                "name": "tokenId",21                "type": "uint256"22            }23        ],24        "name": "Approval",25        "type": "event"26    },27    {28        "anonymous": false,29        "inputs": [30            {31                "indexed": true,32                "internalType": "address",33                "name": "owner",34                "type": "address"35            },36            {37                "indexed": true,38                "internalType": "address",39                "name": "operator",40                "type": "address"41            },42            {43                "indexed": false,44                "internalType": "bool",45                "name": "approved",46                "type": "bool"47            }48        ],49        "name": "ApprovalForAll",50        "type": "event"51    },52    {53        "anonymous": false,54        "inputs": [],55        "name": "MintingFinished",56        "type": "event"57    },58    {59        "anonymous": false,60        "inputs": [61            {62                "indexed": true,63                "internalType": "address",64                "name": "from",65                "type": "address"66            },67            {68                "indexed": true,69                "internalType": "address",70                "name": "to",71                "type": "address"72            },73            {74                "indexed": true,75                "internalType": "uint256",76                "name": "tokenId",77                "type": "uint256"78            }79        ],80        "name": "Transfer",81        "type": "event"82    },83    {84        "inputs": [85            {86                "internalType": "address",87                "name": "approved",88                "type": "address"89            },90            {91                "internalType": "uint256",92                "name": "tokenId",93                "type": "uint256"94            }95        ],96        "name": "approve",97        "outputs": [],98        "stateMutability": "nonpayable",99        "type": "function"100    },101    {102        "inputs": [103            {104                "internalType": "address",105                "name": "owner",106                "type": "address"107            }108        ],109        "name": "balanceOf",110        "outputs": [111            {112                "internalType": "uint256",113                "name": "",114                "type": "uint256"115            }116        ],117        "stateMutability": "view",118        "type": "function"119    },120    {121        "inputs": [122            {123                "internalType": "uint256",124                "name": "tokenId",125                "type": "uint256"126            }127        ],128        "name": "burn",129        "outputs": [],130        "stateMutability": "nonpayable",131        "type": "function"132    },133    {134        "inputs": [],135        "name": "finishMinting",136        "outputs": [137            {138                "internalType": "bool",139                "name": "",140                "type": "bool"141            }142        ],143        "stateMutability": "nonpayable",144        "type": "function"145    },146    {147        "inputs": [148            {149                "internalType": "uint256",150                "name": "tokenId",151                "type": "uint256"152            }153        ],154        "name": "getApproved",155        "outputs": [156            {157                "internalType": "address",158                "name": "",159                "type": "address"160            }161        ],162        "stateMutability": "view",163        "type": "function"164    },165    {166        "inputs": [167            {168                "internalType": "uint256",169                "name": "tokenId",170                "type": "uint256"171            }172        ],173        "name": "getVariableMetadata",174        "outputs": [175            {176                "internalType": "bytes",177                "name": "",178                "type": "bytes"179            }180        ],181        "stateMutability": "view",182        "type": "function"183    },184    {185        "inputs": [186            {187                "internalType": "address",188                "name": "owner",189                "type": "address"190            },191            {192                "internalType": "address",193                "name": "operator",194                "type": "address"195            }196        ],197        "name": "isApprovedForAll",198        "outputs": [199            {200                "internalType": "address",201                "name": "",202                "type": "address"203            }204        ],205        "stateMutability": "view",206        "type": "function"207    },208    {209        "inputs": [210            {211                "internalType": "address",212                "name": "to",213                "type": "address"214            },215            {216                "internalType": "uint256",217                "name": "tokenId",218                "type": "uint256"219            }220        ],221        "name": "mint",222        "outputs": [223            {224                "internalType": "bool",225                "name": "",226                "type": "bool"227            }228        ],229        "stateMutability": "nonpayable",230        "type": "function"231    },232    {233        "inputs": [234            {235                "internalType": "address",236                "name": "to",237                "type": "address"238            },239            {240                "internalType": "uint256[]",241                "name": "tokenIds",242                "type": "uint256[]"243            }244        ],245        "name": "mintBulk",246        "outputs": [247            {248                "internalType": "bool",249                "name": "",250                "type": "bool"251            }252        ],253        "stateMutability": "nonpayable",254        "type": "function"255    },256    {257        "inputs": [258            {259                "internalType": "address",260                "name": "to",261                "type": "address"262            },263            {264                "components": [265                    {266                        "internalType": "uint256",267                        "name": "field_0",268                        "type": "uint256"269                    },270                    {271                        "internalType": "string",272                        "name": "field_1",273                        "type": "string"274                    }275                ],276                "internalType": "struct Tuple0[]",277                "name": "tokens",278                "type": "tuple[]"279            }280        ],281        "name": "mintBulkWithTokenURI",282        "outputs": [283            {284                "internalType": "bool",285                "name": "",286                "type": "bool"287            }288        ],289        "stateMutability": "nonpayable",290        "type": "function"291    },292    {293        "inputs": [294            {295                "internalType": "address",296                "name": "to",297                "type": "address"298            },299            {300                "internalType": "uint256",301                "name": "tokenId",302                "type": "uint256"303            },304            {305                "internalType": "string",306                "name": "tokenUri",307                "type": "string"308            }309        ],310        "name": "mintWithTokenURI",311        "outputs": [312            {313                "internalType": "bool",314                "name": "",315                "type": "bool"316            }317        ],318        "stateMutability": "nonpayable",319        "type": "function"320    },321    {322        "inputs": [],323        "name": "mintingFinished",324        "outputs": [325            {326                "internalType": "bool",327                "name": "",328                "type": "bool"329            }330        ],331        "stateMutability": "view",332        "type": "function"333    },334    {335        "inputs": [],336        "name": "name",337        "outputs": [338            {339                "internalType": "string",340                "name": "",341                "type": "string"342            }343        ],344        "stateMutability": "view",345        "type": "function"346    },347    {348        "inputs": [],349        "name": "nextTokenId",350        "outputs": [351            {352                "internalType": "uint256",353                "name": "",354                "type": "uint256"355            }356        ],357        "stateMutability": "view",358        "type": "function"359    },360    {361        "inputs": [362            {363                "internalType": "uint256",364                "name": "tokenId",365                "type": "uint256"366            }367        ],368        "name": "ownerOf",369        "outputs": [370            {371                "internalType": "address",372                "name": "",373                "type": "address"374            }375        ],376        "stateMutability": "view",377        "type": "function"378    },379    {380        "inputs": [381            {382                "internalType": "address",383                "name": "from",384                "type": "address"385            },386            {387                "internalType": "address",388                "name": "to",389                "type": "address"390            },391            {392                "internalType": "uint256",393                "name": "tokenId",394                "type": "uint256"395            }396        ],397        "name": "safeTransferFrom",398        "outputs": [],399        "stateMutability": "nonpayable",400        "type": "function"401    },402    {403        "inputs": [404            {405                "internalType": "address",406                "name": "from",407                "type": "address"408            },409            {410                "internalType": "address",411                "name": "to",412                "type": "address"413            },414            {415                "internalType": "uint256",416                "name": "tokenId",417                "type": "uint256"418            },419            {420                "internalType": "bytes",421                "name": "data",422                "type": "bytes"423            }424        ],425        "name": "safeTransferFromWithData",426        "outputs": [],427        "stateMutability": "nonpayable",428        "type": "function"429    },430    {431        "inputs": [432            {433                "internalType": "address",434                "name": "operator",435                "type": "address"436            },437            {438                "internalType": "bool",439                "name": "approved",440                "type": "bool"441            }442        ],443        "name": "setApprovalForAll",444        "outputs": [],445        "stateMutability": "nonpayable",446        "type": "function"447    },448    {449        "inputs": [450            {451                "internalType": "uint256",452                "name": "tokenId",453                "type": "uint256"454            },455            {456                "internalType": "bytes",457                "name": "data",458                "type": "bytes"459            }460        ],461        "name": "setVariableMetadata",462        "outputs": [],463        "stateMutability": "nonpayable",464        "type": "function"465    },466    {467        "inputs": [468            {469                "internalType": "bytes4",470                "name": "interfaceId",471                "type": "bytes4"472            }473        ],474        "name": "supportsInterface",475        "outputs": [476            {477                "internalType": "bool",478                "name": "",479                "type": "bool"480            }481        ],482        "stateMutability": "view",483        "type": "function"484    },485    {486        "inputs": [],487        "name": "symbol",488        "outputs": [489            {490                "internalType": "string",491                "name": "",492                "type": "string"493            }494        ],495        "stateMutability": "view",496        "type": "function"497    },498    {499        "inputs": [500            {501                "internalType": "uint256",502                "name": "index",503                "type": "uint256"504            }505        ],506        "name": "tokenByIndex",507        "outputs": [508            {509                "internalType": "uint256",510                "name": "",511                "type": "uint256"512            }513        ],514        "stateMutability": "view",515        "type": "function"516    },517    {518        "inputs": [519            {520                "internalType": "address",521                "name": "owner",522                "type": "address"523            },524            {525                "internalType": "uint256",526                "name": "index",527                "type": "uint256"528            }529        ],530        "name": "tokenOfOwnerByIndex",531        "outputs": [532            {533                "internalType": "uint256",534                "name": "",535                "type": "uint256"536            }537        ],538        "stateMutability": "view",539        "type": "function"540    },541    {542        "inputs": [543            {544                "internalType": "uint256",545                "name": "tokenId",546                "type": "uint256"547            }548        ],549        "name": "tokenURI",550        "outputs": [551            {552                "internalType": "string",553                "name": "",554                "type": "string"555            }556        ],557        "stateMutability": "view",558        "type": "function"559    },560    {561        "inputs": [],562        "name": "totalSupply",563        "outputs": [564            {565                "internalType": "uint256",566                "name": "",567                "type": "uint256"568            }569        ],570        "stateMutability": "view",571        "type": "function"572    },573    {574        "inputs": [575            {576                "internalType": "address",577                "name": "to",578                "type": "address"579            },580            {581                "internalType": "uint256",582                "name": "tokenId",583                "type": "uint256"584            }585        ],586        "name": "transfer",587        "outputs": [],588        "stateMutability": "nonpayable",589        "type": "function"590    },591    {592        "inputs": [593            {594                "internalType": "address",595                "name": "from",596                "type": "address"597            },598            {599                "internalType": "address",600                "name": "to",601                "type": "address"602            },603            {604                "internalType": "uint256",605                "name": "tokenId",606                "type": "uint256"607            }608        ],609        "name": "transferFrom",610        "outputs": [],611        "stateMutability": "nonpayable",612        "type": "function"613    }614]
after · tests/src/eth/nonFungibleAbi.json
1[2	{3		"anonymous": false,4		"inputs": [5			{6				"indexed": true,7				"internalType": "address",8				"name": "owner",9				"type": "address"10			},11			{12				"indexed": true,13				"internalType": "address",14				"name": "approved",15				"type": "address"16			},17			{18				"indexed": true,19				"internalType": "uint256",20				"name": "tokenId",21				"type": "uint256"22			}23		],24		"name": "Approval",25		"type": "event"26	},27	{28		"anonymous": false,29		"inputs": [30			{31				"indexed": true,32				"internalType": "address",33				"name": "owner",34				"type": "address"35			},36			{37				"indexed": true,38				"internalType": "address",39				"name": "operator",40				"type": "address"41			},42			{43				"indexed": false,44				"internalType": "bool",45				"name": "approved",46				"type": "bool"47			}48		],49		"name": "ApprovalForAll",50		"type": "event"51	},52	{53		"anonymous": false,54		"inputs": [],55		"name": "MintingFinished",56		"type": "event"57	},58	{59		"anonymous": false,60		"inputs": [61			{62				"indexed": true,63				"internalType": "address",64				"name": "from",65				"type": "address"66			},67			{68				"indexed": true,69				"internalType": "address",70				"name": "to",71				"type": "address"72			},73			{74				"indexed": true,75				"internalType": "uint256",76				"name": "tokenId",77				"type": "uint256"78			}79		],80		"name": "Transfer",81		"type": "event"82	},83	{84		"inputs": [85			{86				"internalType": "address",87				"name": "approved",88				"type": "address"89			},90			{91				"internalType": "uint256",92				"name": "tokenId",93				"type": "uint256"94			}95		],96		"name": "approve",97		"outputs": [],98		"stateMutability": "nonpayable",99		"type": "function"100	},101	{102		"inputs": [103			{104				"internalType": "address",105				"name": "owner",106				"type": "address"107			}108		],109		"name": "balanceOf",110		"outputs": [111			{112				"internalType": "uint256",113				"name": "",114				"type": "uint256"115			}116		],117		"stateMutability": "view",118		"type": "function"119	},120	{121		"inputs": [122			{123				"internalType": "uint256",124				"name": "tokenId",125				"type": "uint256"126			}127		],128		"name": "burn",129		"outputs": [],130		"stateMutability": "nonpayable",131		"type": "function"132	},133	{134		"inputs": [135			{136				"internalType": "address",137				"name": "from",138				"type": "address"139			},140			{141				"internalType": "uint256",142				"name": "tokenId",143				"type": "uint256"144			}145		],146		"name": "burnFrom",147		"outputs": [],148		"stateMutability": "nonpayable",149		"type": "function"150	},151	{152		"inputs": [153			{154				"internalType": "string",155				"name": "key",156				"type": "string"157			}158		],159		"name": "collectionProperty",160		"outputs": [161			{162				"internalType": "bytes",163				"name": "",164				"type": "bytes"165			}166		],167		"stateMutability": "view",168		"type": "function"169	},170	{171		"inputs": [172			{173				"internalType": "string",174				"name": "key",175				"type": "string"176			}177		],178		"name": "deleteCollectionProperty",179		"outputs": [],180		"stateMutability": "nonpayable",181		"type": "function"182	},183	{184		"inputs": [185			{186				"internalType": "uint256",187				"name": "tokenId",188				"type": "uint256"189			},190			{191				"internalType": "string",192				"name": "key",193				"type": "string"194			}195		],196		"name": "deleteProperty",197		"outputs": [],198		"stateMutability": "nonpayable",199		"type": "function"200	},201	{202		"inputs": [],203		"name": "finishMinting",204		"outputs": [205			{206				"internalType": "bool",207				"name": "",208				"type": "bool"209			}210		],211		"stateMutability": "nonpayable",212		"type": "function"213	},214	{215		"inputs": [216			{217				"internalType": "uint256",218				"name": "tokenId",219				"type": "uint256"220			}221		],222		"name": "getApproved",223		"outputs": [224			{225				"internalType": "address",226				"name": "",227				"type": "address"228			}229		],230		"stateMutability": "view",231		"type": "function"232	},233	{234		"inputs": [235			{236				"internalType": "address",237				"name": "owner",238				"type": "address"239			},240			{241				"internalType": "address",242				"name": "operator",243				"type": "address"244			}245		],246		"name": "isApprovedForAll",247		"outputs": [248			{249				"internalType": "address",250				"name": "",251				"type": "address"252			}253		],254		"stateMutability": "view",255		"type": "function"256	},257	{258		"inputs": [259			{260				"internalType": "address",261				"name": "to",262				"type": "address"263			},264			{265				"internalType": "uint256",266				"name": "tokenId",267				"type": "uint256"268			}269		],270		"name": "mint",271		"outputs": [272			{273				"internalType": "bool",274				"name": "",275				"type": "bool"276			}277		],278		"stateMutability": "nonpayable",279		"type": "function"280	},281	{282		"inputs": [283			{284				"internalType": "address",285				"name": "to",286				"type": "address"287			},288			{289				"internalType": "uint256[]",290				"name": "tokenIds",291				"type": "uint256[]"292			}293		],294		"name": "mintBulk",295		"outputs": [296			{297				"internalType": "bool",298				"name": "",299				"type": "bool"300			}301		],302		"stateMutability": "nonpayable",303		"type": "function"304	},305	{306		"inputs": [307			{308				"internalType": "address",309				"name": "to",310				"type": "address"311			},312			{313				"components": [314					{315						"internalType": "uint256",316						"name": "field_0",317						"type": "uint256"318					},319					{320						"internalType": "string",321						"name": "field_1",322						"type": "string"323					}324				],325				"internalType": "struct Tuple0[]",326				"name": "tokens",327				"type": "tuple[]"328			}329		],330		"name": "mintBulkWithTokenURI",331		"outputs": [332			{333				"internalType": "bool",334				"name": "",335				"type": "bool"336			}337		],338		"stateMutability": "nonpayable",339		"type": "function"340	},341	{342		"inputs": [343			{344				"internalType": "address",345				"name": "to",346				"type": "address"347			},348			{349				"internalType": "uint256",350				"name": "tokenId",351				"type": "uint256"352			},353			{354				"internalType": "string",355				"name": "tokenUri",356				"type": "string"357			}358		],359		"name": "mintWithTokenURI",360		"outputs": [361			{362				"internalType": "bool",363				"name": "",364				"type": "bool"365			}366		],367		"stateMutability": "nonpayable",368		"type": "function"369	},370	{371		"inputs": [],372		"name": "mintingFinished",373		"outputs": [374			{375				"internalType": "bool",376				"name": "",377				"type": "bool"378			}379		],380		"stateMutability": "view",381		"type": "function"382	},383	{384		"inputs": [],385		"name": "name",386		"outputs": [387			{388				"internalType": "string",389				"name": "",390				"type": "string"391			}392		],393		"stateMutability": "view",394		"type": "function"395	},396	{397		"inputs": [],398		"name": "nextTokenId",399		"outputs": [400			{401				"internalType": "uint256",402				"name": "",403				"type": "uint256"404			}405		],406		"stateMutability": "view",407		"type": "function"408	},409	{410		"inputs": [411			{412				"internalType": "uint256",413				"name": "tokenId",414				"type": "uint256"415			}416		],417		"name": "ownerOf",418		"outputs": [419			{420				"internalType": "address",421				"name": "",422				"type": "address"423			}424		],425		"stateMutability": "view",426		"type": "function"427	},428	{429		"inputs": [430			{431				"internalType": "uint256",432				"name": "tokenId",433				"type": "uint256"434			},435			{436				"internalType": "string",437				"name": "key",438				"type": "string"439			}440		],441		"name": "property",442		"outputs": [443			{444				"internalType": "bytes",445				"name": "",446				"type": "bytes"447			}448		],449		"stateMutability": "view",450		"type": "function"451	},452	{453		"inputs": [454			{455				"internalType": "address",456				"name": "from",457				"type": "address"458			},459			{460				"internalType": "address",461				"name": "to",462				"type": "address"463			},464			{465				"internalType": "uint256",466				"name": "tokenId",467				"type": "uint256"468			}469		],470		"name": "safeTransferFrom",471		"outputs": [],472		"stateMutability": "nonpayable",473		"type": "function"474	},475	{476		"inputs": [477			{478				"internalType": "address",479				"name": "from",480				"type": "address"481			},482			{483				"internalType": "address",484				"name": "to",485				"type": "address"486			},487			{488				"internalType": "uint256",489				"name": "tokenId",490				"type": "uint256"491			},492			{493				"internalType": "bytes",494				"name": "data",495				"type": "bytes"496			}497		],498		"name": "safeTransferFromWithData",499		"outputs": [],500		"stateMutability": "nonpayable",501		"type": "function"502	},503	{504		"inputs": [505			{506				"internalType": "address",507				"name": "operator",508				"type": "address"509			},510			{511				"internalType": "bool",512				"name": "approved",513				"type": "bool"514			}515		],516		"name": "setApprovalForAll",517		"outputs": [],518		"stateMutability": "nonpayable",519		"type": "function"520	},521	{522		"inputs": [523			{524				"internalType": "string",525				"name": "key",526				"type": "string"527			},528			{529				"internalType": "bytes",530				"name": "value",531				"type": "bytes"532			}533		],534		"name": "setCollectionProperty",535		"outputs": [],536		"stateMutability": "nonpayable",537		"type": "function"538	},539	{540		"inputs": [541			{542				"internalType": "uint256",543				"name": "tokenId",544				"type": "uint256"545			},546			{547				"internalType": "string",548				"name": "key",549				"type": "string"550			},551			{552				"internalType": "bytes",553				"name": "value",554				"type": "bytes"555			}556		],557		"name": "setProperty",558		"outputs": [],559		"stateMutability": "nonpayable",560		"type": "function"561	},562	{563		"inputs": [564			{565				"internalType": "string",566				"name": "key",567				"type": "string"568			},569			{570				"internalType": "bool",571				"name": "isMutable",572				"type": "bool"573			},574			{575				"internalType": "bool",576				"name": "collectionAdmin",577				"type": "bool"578			},579			{580				"internalType": "bool",581				"name": "tokenOwner",582				"type": "bool"583			}584		],585		"name": "setTokenPropertyPermission",586		"outputs": [],587		"stateMutability": "nonpayable",588		"type": "function"589	},590	{591		"inputs": [592			{593				"internalType": "bytes4",594				"name": "interfaceID",595				"type": "bytes4"596			}597		],598		"name": "supportsInterface",599		"outputs": [600			{601				"internalType": "bool",602				"name": "",603				"type": "bool"604			}605		],606		"stateMutability": "view",607		"type": "function"608	},609	{610		"inputs": [],611		"name": "symbol",612		"outputs": [613			{614				"internalType": "string",615				"name": "",616				"type": "string"617			}618		],619		"stateMutability": "view",620		"type": "function"621	},622	{623		"inputs": [624			{625				"internalType": "uint256",626				"name": "index",627				"type": "uint256"628			}629		],630		"name": "tokenByIndex",631		"outputs": [632			{633				"internalType": "uint256",634				"name": "",635				"type": "uint256"636			}637		],638		"stateMutability": "view",639		"type": "function"640	},641	{642		"inputs": [643			{644				"internalType": "address",645				"name": "owner",646				"type": "address"647			},648			{649				"internalType": "uint256",650				"name": "index",651				"type": "uint256"652			}653		],654		"name": "tokenOfOwnerByIndex",655		"outputs": [656			{657				"internalType": "uint256",658				"name": "",659				"type": "uint256"660			}661		],662		"stateMutability": "view",663		"type": "function"664	},665	{666		"inputs": [667			{668				"internalType": "uint256",669				"name": "tokenId",670				"type": "uint256"671			}672		],673		"name": "tokenURI",674		"outputs": [675			{676				"internalType": "string",677				"name": "",678				"type": "string"679			}680		],681		"stateMutability": "view",682		"type": "function"683	},684	{685		"inputs": [],686		"name": "totalSupply",687		"outputs": [688			{689				"internalType": "uint256",690				"name": "",691				"type": "uint256"692			}693		],694		"stateMutability": "view",695		"type": "function"696	},697	{698		"inputs": [699			{700				"internalType": "address",701				"name": "to",702				"type": "address"703			},704			{705				"internalType": "uint256",706				"name": "tokenId",707				"type": "uint256"708			}709		],710		"name": "transfer",711		"outputs": [],712		"stateMutability": "nonpayable",713		"type": "function"714	},715	{716		"inputs": [717			{718				"internalType": "address",719				"name": "from",720				"type": "address"721			},722			{723				"internalType": "address",724				"name": "to",725				"type": "address"726			},727			{728				"internalType": "uint256",729				"name": "tokenId",730				"type": "uint256"731			}732		],733		"name": "transferFrom",734		"outputs": [],735		"stateMutability": "nonpayable",736		"type": "function"737	}738]