Commit c72a9be3 authored by duanjinfei's avatar duanjinfei

tidy tran case

parent 22bf17e9
{
"deployAddr": "0xe2bA4B27E835f3D5A8f74B53aD6b8b6264D3F501",
"deployPrv": "115725efa0b457a764bb0b73b79a26605a54a5025d825b5a627f69354cdbbbf4",
"rpcNode": "http://54.72.101.87:50000",
"chainId": 155,
"deployAddr1": "0xe2bA4B27E835f3D5A8f74B53aD6b8b6264D3F501",
"deployPrv1": "115725efa0b457a764bb0b73b79a26605a54a5025d825b5a627f69354cdbbbf4",
"deployAddr": "0x40EC4256fcBCA69CdbAc942594caeC79FBE10494",
"deployPrv": "37871f094f89fc95599e73d72d3008c828bb76d0864759011fa14dbaf6cf3c06",
"rpcNode1": "http://192.168.1.125:50000",
"rpcNode": "http://15.161.177.5:26658",
"chainId1": 155,
"chainId": 256256,
"goRoutine": 1,
"generateAccCount": 500,
"isDeployContract": true,
"isInitAccountBalance": false,
"isDeployContract": false,
"isInitAccountBalance": true,
"startTokenId": 1,
"endTokenId": 100,
"transferType": {
"NotAssociatedFlag": true,
"PartialAssociation": false,
"FullyAssociative": false,
"Coin": true,
"Coin_Transfer":true,
"One_Coin_Transfer": true,
"Two_Coin_Transfer":true,
"ERC20": true,
"Token20_Transfer":true,
"One_Token20_Transfer": true,
"Two_Token20_Transfer":true,
"ERC721": true,
"Token721_Transfer":true,
"One_Token721_Transfer": true,
"Two_Token721_Transfer":true,
"Read_Write": true,
"One_Read_Write":true,
"Read_Chain": true
}
"transferType": []
}
[
{
"Coin_Transfer": "0x7eb5eab85e37d297b92e4c56a0187e910f37d969",
"ERC20": "0xbb0bb92922b244b2e3545f55bc4aee00299ea6de",
"ERC721": "0x89afa7faf59f6437a3df9c373bc5401b8d5f0099",
"One_Coin_Transfer": "0xcc600106d992657b6fabbb68e005eb94a07acc41",
"One_Read_Write": "0x5adfe690fb447730ba9d992940d5d07a2efa5094",
"One_Token20_Transfer": "0x469130ea4dfbed768b0d771cc99946f81738c72e",
"One_Token721_Transfer": "0x92b28beb872f81aaad3f111cffab1ba10fec6918",
"Read_Chain": "0x00059658a96be67f1412f607549eeaee4a81ec87",
"Read_Write": "0x1c585fd816923a5957024ab3fd8fcfb74f6235da",
"Token20_Transfer": "0x25ed0c6762f49fcf532fb01152ae79088576bfee",
"Token721_Transfer": "0xbcb1513c82bb21db13b1b21ee696e36a984351af",
"Two_Coin_Transfer": "0x761405065d3cd84fb5ef7aed0dc24ae6a5768f83",
"Two_Token20_Transfer": "0xef86469624825bd005c3f505637ab58435e32443",
"Two_Token721_Transfer": "0x2c046c47053f696a9b09cd5c14c7367c24976643"
"Coin_Transfer": "0xacea4c028c233e5d896b5ea28eb1c24d64b937e2",
"ERC20": "0x76e45ce8aa97a3c31d5de9808138e4e31e59fed2",
"ERC721": "0xA1C950aA702174E41BCD0ECB7f4c37FDfd672704",
"One_Coin_Transfer": "0x751d4fe23f0d12b24e58a8e7fc8dccebb5cce2f8",
"One_Read_Write": "0x8d1d06ccb26436a6dcc34d2a2d85086036d5510c",
"One_Token20_Transfer": "0x5f126393985dba423b740cad1ffd105d63905aa6",
"One_Token721_Transfer": "0xd4b3b40c2b53ea256af8606c711538bfb6eb14a0",
"Read_Chain": "0x5b42b6bda3d6ea631dfd5b9a64e0816c03d13e44",
"Read_Write": "0xcad5fbc5966f72efa1a4b0cc6c342bce20c73682",
"Token20_Transfer": "0x217dca03b245abc49a4661cd10f890cc07b4b374",
"Token721_Transfer": "0x4169a1d185869ef9c6153d964fcfd155496cf903",
"Two_Coin_Transfer": "0x55dbf6b2c432094dfaace8d3fbdc6d8d486c6789",
"Two_Token20_Transfer": "0xf016b61f45e21345c80bd98142c7abc1f2369ccb",
"Two_Token721_Transfer": "0x1bf3024b501cab75e7659a5564e35dfa02bc0370"
},
{
"Coin_Transfer": "0x199a64a59cf31711854724bd95ee40860e9ce79d",
"ERC20": "0xc9f6def8a5925f8c87bda1ce5993f123f39d6278",
"ERC721": "0x74c9a17590f80b321560c38237438fbdeee067a9",
"One_Coin_Transfer": "0x998cc9e89cfa8dd01125bdbf7d84682c9cd49d59",
"One_Read_Write": "0x72ffc41d0c84a2da43298ac11bea906fa8b98dfd",
"One_Token20_Transfer": "0xb2cd516623cd57bee80820079829e2ba520923b1",
"One_Token721_Transfer": "0x481d353bd1ea858f9f4adb09cab4e1a34a0bdd4a",
"Read_Chain": "0x248c19ea5448a69aebf02a910acc5f3369b64da2",
"Read_Write": "0x062d6800dd115b471ec6600847d9d5696921859e",
"Token20_Transfer": "0x03a3b76019a43fb683c63b5dc083770cad932575",
"Token721_Transfer": "0xc3a738b7083f6014afa9317061623bdb083b6068",
"Two_Coin_Transfer": "0xbefc6e7134b2ad9cad38ff65d9cff1f70bec1eb0",
"Two_Token20_Transfer": "0x618defb1a892882a260affaf01fef35967a8f2c0",
"Two_Token721_Transfer": "0x7d9c6229b37d9afabfbc1311fd9378d3b062e071"
"Coin_Transfer": "0xfd4e1842dee40e3659569a2994c44ad81c588b82",
"ERC20": "0xad1ba974bd3bc14556cc884991823223c92b98b6",
"ERC721": "0x450260F10b2D55b785037388fA3aA3b2232cC9F4",
"One_Coin_Transfer": "0x5ccbafa9811a3a315e1f7c05b80337ec95f69e51",
"One_Read_Write": "0x72fc53dc11970380b4b48c4a5f66fa97227918d5",
"One_Token20_Transfer": "0xc7e40a453efefae4bd5eab74b6d242286b75ff85",
"One_Token721_Transfer": "0x1a384b70ef274a681eecf5ae680041893bf0563c",
"Read_Chain": "0x22f8e10b428c801dde2ec902c788657fd6ecff27",
"Read_Write": "0x9c929501bb92a36355356881d8d2ed56667881f3",
"Token20_Transfer": "0xddf839293a5056e3b41f4599b63e9b6d2db80365",
"Token721_Transfer": "0x41a48d703f0aec53ca698c7ee5077069c69e9efe",
"Two_Coin_Transfer": "0x46725530114818f36ab574a6844b7d93e7b23e2e",
"Two_Token20_Transfer": "0x5f0294fe1bbcf708a3cda7dd1cc86ceb44aa16ed",
"Two_Token721_Transfer": "0x69d7bed3eeeba10d7fe5a47221b7484816250055"
},
{
"Coin_Transfer": "0xd6926ea20837af80216bcdb31ae4cc4e0c22cfa7",
"ERC20": "0x2f9a4f45efb059d8c8ba55d4aa7249ddb85e00a7",
"ERC721": "0x3af47a08f0e2aaa2966c5216586ebec840aa03d7",
"One_Coin_Transfer": "0x49a3eadf8ea8a74fcdb7a0edf5bb9024103b5e06",
"One_Read_Write": "0xacf8f258ddd4224169ab09e0ddbd0657bc930ae3",
"One_Token20_Transfer": "0xd8779b3af0c92c0e0479d855c368a4838b9dc38c",
"One_Token721_Transfer": "0xe35b102f1541427fde3843ac9c868c17c3bd0e7e",
"Read_Chain": "0x3278a598ff92a0eecc799379d89eeef539b4b92e",
"Read_Write": "0x856edcb2fba59e363e6dfa4b9f4a9cf07acef233",
"Token20_Transfer": "0xb8c555522603fe1471d5d4d5b6c3262d3fd8f1d1",
"Token721_Transfer": "0x260c7c47d66de45c3c3650c0ce1614cecee0a33a",
"Two_Coin_Transfer": "0x843e194a3b17893bfcaef174d21670c96936b7c7",
"Two_Token20_Transfer": "0x19607465a18eaafdbc43616b1c47971e24ce9be8",
"Two_Token721_Transfer": "0x5ffde14f7708192924061fbcab7e205b3e23389d"
"Coin_Transfer": "0x15a973b26eddf34727d6cbd85c689eabd1b0ea12",
"ERC20": "0xe5ea1be6856130dfed8baba94e8e3e667d7a5641",
"ERC721": "0xf7c49C0264204f8346F659a4BB729567f0081daE",
"One_Coin_Transfer": "0xafc5b39e4f702316fa822bd7168645cdff22c6d8",
"One_Read_Write": "0xf862f78ff1e10590248c9baa5bafa84d3e33148c",
"One_Token20_Transfer": "0x349c6d13ba2091f0317e8622c59c5d933ec53f7d",
"One_Token721_Transfer": "0x82284e4df1e2ad4f30c9df610e27550e53320b63",
"Read_Chain": "0x37019503113a937d3afda0f8d586a326cfe589da",
"Read_Write": "0xf156c92b515402cd9a0e6c9574938bf36964bc9c",
"Token20_Transfer": "0x8585f124527624e878c862b6126dc40432809644",
"Token721_Transfer": "0xb829a81cb13f01c59ac28452794516707400a850",
"Two_Coin_Transfer": "0xf6e6be579f0bc80554cde98e441dbc424e848a81",
"Two_Token20_Transfer": "0x3ccaaf61a375be2ae88fcbed9a87b4ed1b451818",
"Two_Token721_Transfer": "0xbe9f151c8ba8262e6aceb8e1f57f4280ba8bf907"
},
{
"Coin_Transfer": "0x2087087f43ece5d2e664948fd37a545227a3d2c3",
"ERC20": "0xd525c201cc74ea999024d5dc588aa295a179a490",
"ERC721": "0x3b86dca4c2d3034d9cbb7305d65216d4b8c6fcab",
"One_Coin_Transfer": "0xb6127b1424cf450188bc92128f44af23f55f5001",
"One_Read_Write": "0x65ff9d8c1a3f1789c63af043494da27061224ef0",
"One_Token20_Transfer": "0x1463d05dc187dcbc79c459177e1ac36fb15b5c1b",
"One_Token721_Transfer": "0xf640c23d1f11a2620fb7614cda5ede491cf030e2",
"Read_Chain": "0xb5dce387d019eacf80e74dd41d1cc420ea18ed62",
"Read_Write": "0x6aad3c0c3693eefbf7936071e9781eb38d8faa3c",
"Token20_Transfer": "0x1f4479fadfdcb2073c737e34c7846444a5410e61",
"Token721_Transfer": "0xcca54db68e5b35965889a937700453d3ba6afd0c",
"Two_Coin_Transfer": "0x0dad99bdd3f9800b310290bea136d75b0ab0452b",
"Two_Token20_Transfer": "0x543249f421bdd84acf07e338bf2eedd2a56288ee",
"Two_Token721_Transfer": "0xcc736b124c6306c9efcf392fa36946be73998184"
"Coin_Transfer": "0x7172b82c77f84caffe98b1a60b666a579ede033f",
"ERC20": "0x07961ad0013c843966731f42f9ba0dc4d218661b",
"ERC721": "0x5F82Ca8b2D756749420709F7A216F57eC8043306",
"One_Coin_Transfer": "0x090012ad83fbbb14c63ac3da6ded8b17f9f90ade",
"One_Read_Write": "0xf9fc7e5fec25c3671ff2b55f84a2aff0f309e252",
"One_Token20_Transfer": "0x91e96b3e8232b61cbda3241948eb5c53b7001382",
"One_Token721_Transfer": "0x06ccfdeb8c4eaffc7cf839f45ff158845abf66dd",
"Read_Chain": "0x08ae8a0a2000b39f8472b61a8063ef016e8d73a6",
"Read_Write": "0xb147a01cf3e83c6514a0ccdec402612c47f97de8",
"Token20_Transfer": "0x0c18d08c20acceae425458b2b186aa70632d3b25",
"Token721_Transfer": "0xedb8bea3b505f41d778e5e4e016a68176fdebb50",
"Two_Coin_Transfer": "0xb70f158bee8ee10d68ab3ff4236ff6d08e31ce50",
"Two_Token20_Transfer": "0x5138395a30b8338fd6e78e76adba7aeac0087944",
"Two_Token721_Transfer": "0xc29d555448a0ebb176e81bc0d6bfeeaba7d2f177"
},
{
"Coin_Transfer": "0xef1f9e4fd4df554666f713de61082c932cd99a6b",
"ERC20": "0xf08e69fe1ab2c5510572004994b3b21184ce2ec5",
"ERC721": "0xdebe8c2f54c5d9b1d01204bdf13f05ca1f544823",
"One_Coin_Transfer": "0xf23ebe5bcaf7cd48a058ae788402b466acb9e485",
"One_Read_Write": "0xd1e3dcf92fa55b129b801c0c466d579807db2abf",
"One_Token20_Transfer": "0xe568572af884ce17193f123a6e8bc3bc5e1f46d0",
"One_Token721_Transfer": "0xb28491d1feea0e033e30a6375f7f101f7524f0ee",
"Read_Chain": "0x6603fbd5f2ce59aaf6052306ec2191b943430d58",
"Read_Write": "0xde9fb7b2a9403bd1fc9f9df221982f7f248f78a3",
"Token20_Transfer": "0x7864c5110c2a64beca6f7d76917b9c77bce3f1aa",
"Token721_Transfer": "0x8e0fada295ba4af825405589b98662ccce64cd86",
"Two_Coin_Transfer": "0x30cd1af092e88296f853075fe64f08630bf6c77d",
"Two_Token20_Transfer": "0xb62f8d496749887d44d8a22165a657080c0d6bb9",
"Two_Token721_Transfer": "0xba15959dd5a69b6c0528bcdeee70177e6953f27c"
"Coin_Transfer": "0xfe178e9eab1c124b2eec9dcd6ac8711addcfcd1c",
"ERC20": "0x739bcc47af1794e44bc15a3edc7bc157e15df012",
"ERC721": "0x60e35B92C0b616E2786A22598460ee9B97DdBF86",
"One_Coin_Transfer": "0x5d6a15ce48a01fc40cce2b67b28f043e214f37ad",
"One_Read_Write": "0x302211cfdcd202b2679b5af30abd47e01b1e8434",
"One_Token20_Transfer": "0x368582fb44ac0263e5f7af3b9b77747aaab73977",
"One_Token721_Transfer": "0x1498fe5416f654522511958430d436d852944116",
"Read_Chain": "0x79802c8bd4f85703cc41935aa978485257c09c16",
"Read_Write": "0x63dac1be62787dd59dab7a2faabacd8d34d86da8",
"Token20_Transfer": "0x3849c9ddf95abd07e03ecd9cf24542d4f9f22499",
"Token721_Transfer": "0x9e984435a395b25c0f27b1aece334dfe02c0485a",
"Two_Coin_Transfer": "0x0ced6919a38fa91b6b6927fc1f15e0c569c68a68",
"Two_Token20_Transfer": "0x53eb1be5898698bdf37a888f3e0318ca92cc998c",
"Two_Token721_Transfer": "0xb070769e4a0d65066f0a621d674413db661cafad"
},
{
"Coin_Transfer": "0xe71e6339a12fdea0b21639f2ae0c66213fcf5c86",
"ERC20": "0xcfb496315a3293c8628f46f7eb6584af735a3417",
"ERC721": "0x107C9A668e6B5A5830633deDf2Ab0985246A8f4d",
"One_Coin_Transfer": "0x7d12567d5f6a3366954b304721fc9ca629bba810",
"One_Read_Write": "0xbe65ff6c27f663f5773238ad0c587314ec480bc3",
"One_Token20_Transfer": "0xeddc3405b0ea01fd86c9ddc4ee452365fdf0f52e",
"One_Token721_Transfer": "0xb71212aed50e73dfda62d4b6668c7e4848fd4d97",
"Read_Chain": "0x5c06399590f0401e0df344ca58a0c7a6497e290f",
"Read_Write": "0x6141fa8e3aa8ff702343dc6fa8d789d56d0e98af",
"Token20_Transfer": "0x8a29a59af8d2a69b2de1d20f031ba8c1b42922df",
"Token721_Transfer": "0x3db2fe248be93b87b9691a73db47214ad8e9f272",
"Two_Coin_Transfer": "0x053d3e1d5037f81b3988e2b82eb34bfd2e823e5d",
"Two_Token20_Transfer": "0xcb1dc9dd3968388191fd40f22543ad1d31a1b273",
"Two_Token721_Transfer": "0x70b1bc30bd318e03d2f46bdaaed861749f6849d2"
},
{
"Coin_Transfer": "0x70bf5a5755afaf564bb72eb890c5c45c37f70e39",
"ERC20": "0xb4a635e9f02639210d4914aed557f9ac488ee11c",
"ERC721": "0x618A1f37C911dAaCbfEa6e98Cf46252E35228120",
"One_Coin_Transfer": "0x82d7057c6615d3700a72a8e8bc47a6efd2013dbf",
"One_Read_Write": "0x8b0d5cd7211b54b4362d90cbe3410459ffdf2da7",
"One_Token20_Transfer": "0xc56b670655a3689e17c7f9471f53da7486232597",
"One_Token721_Transfer": "0x3c2a1200cb7c115c178865c0f2ceecee5b3600f9",
"Read_Chain": "0xb4950877d2f93e5740d96ae446520dd6b07a2907",
"Read_Write": "0x47506a0c311c78218793cb10c6ae71871781b872",
"Token20_Transfer": "0xec57db1ae50998ab8d7bea8f1009107da55953a2",
"Token721_Transfer": "0x42cadad1c4a6282f9bb1ce2ec7ce0256f09ae91f",
"Two_Coin_Transfer": "0xff535d3047b7587470e839209e36e2c4bedbf607",
"Two_Token20_Transfer": "0x6898cdde8559e0fe2d7d68077bab4db0122b7d15",
"Two_Token721_Transfer": "0x17f2db82dc83d548bdc064f56b78e24862f75fe4"
},
{
"Coin_Transfer": "0x6247716c5134a42d7d0feb272d49efc7d168dc47",
"ERC20": "0xad3a37fe702f415b9b640b9d564f570924873d82",
"ERC721": "0xeac8C1F9918A4337C038d469e157C7Ff579767bA",
"One_Coin_Transfer": "0xaa9e2254aba0285f861377665bfe854b863de4f8",
"One_Read_Write": "0xfabc9b9f6f027947c09c80e201610b3d0d604344",
"One_Token20_Transfer": "0xccc76e49ed363b36b87bbe15aacfcb5bb844fb67",
"One_Token721_Transfer": "0xd465066492ec1c5a843f985d145d92c963caf6da",
"Read_Chain": "0xd014f0a02dd46cd26b8b3f7f6e82e3f5cbbfbe8b",
"Read_Write": "0xed4e8e4c5a6b4421e68f15a6227b65a540a32e88",
"Token20_Transfer": "0x99172a17c545bc036ea3f385b530ad04838a1660",
"Token721_Transfer": "0x1aa08646ea9729cb7385145932f011459c8bc267",
"Two_Coin_Transfer": "0x08a45eccdac3fd0e3238c519586ef9a27e1df883",
"Two_Token20_Transfer": "0x33250c6a91bb302ffba0304c2c39c8801e3f8913",
"Two_Token721_Transfer": "0x8ed13c75bf4e72f963812253ab27866fff70b218"
},
{
"Coin_Transfer": "0x9347d3194439fb116370cff969593d79cfe2d433",
"ERC20": "0x83a60a11afe707aa3aeec8eebc1dbe9ed94aea2c",
"ERC721": "0x98B12C56b562441e1c6fa467D376B04ED96Ae06D",
"One_Coin_Transfer": "0xb12907ddd95de81c1af911105841657ea1c9f75a",
"One_Read_Write": "0x006e7a861d302f5216fcced2a83ddee40d88b9d4",
"One_Token20_Transfer": "0x48c7047b3a16c4119dc7708e4f67894ecf225fd3",
"One_Token721_Transfer": "0xfe1eecab184b90abae0387b0f160130c00c6851c",
"Read_Chain": "0xbd29c1fabd4d8be577918b944e559d2ebe170154",
"Read_Write": "0xb29d262862c3b3bc3dc04d9c39cbb7d283ab73d8",
"Token20_Transfer": "0x9f1974b3a9fd0612fd040245b79fea3e1d7f06fa",
"Token721_Transfer": "0xebcea2e5d56e83203ebfab8fa7d625bac57191a9",
"Two_Coin_Transfer": "0x60b1dc15af5b9656ae6c96f3d016d71e13cb97f2",
"Two_Token20_Transfer": "0x9539a22a9dcb0d3e3f31d42bcfcae147084c2b1f",
"Two_Token721_Transfer": "0xbc337175f6a1f35fd1fb01570a2b802d5c20c8c6"
},
{
"Coin_Transfer": "0x39ee6b50d409999d3aa1c7a46b512f8f8c70fa54",
"ERC20": "0x91f2c122c8060258605c287cea0bdda056b7b25d",
"ERC721": "0xb3106447c16e2fEe16693AD6175AC7e6299411aD",
"One_Coin_Transfer": "0x9d0614f575e69f1f44fd9391ab7c94536edba67a",
"One_Read_Write": "0xbdbbbe7bb874ae466e39a994bd079eb1596efb4e",
"One_Token20_Transfer": "0x2903adfeb04931aa46e5c214f7125a35c2874a4c",
"One_Token721_Transfer": "0xf3f86fc99fe8173be298440edbdc40a629e1bcf8",
"Read_Chain": "0x37c619274d0177c46bad99e681cb435414c1d810",
"Read_Write": "0x67d3d3d96fe2ea497e1ea6041bb99a09f1957b76",
"Token20_Transfer": "0x1360e4d1f88e69126b651306f2344c8652beaf00",
"Token721_Transfer": "0x8661f43334c719e88893bc42c65d185a3e20f737",
"Two_Coin_Transfer": "0x999c32d673a1fbbe3b0ff2a345b4faf9e3a3cd05",
"Two_Token20_Transfer": "0x9f33a6f7e682ccae056e74b51588e81fb3189c39",
"Two_Token721_Transfer": "0x27b79866d089875ac50b7021ec41eed83c0358dd"
}
]
\ No newline at end of file
]
[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"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":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAllFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]
\ No newline at end of file
[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"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":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAllFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]
\ No newline at end of file
60806040523480156200001157600080fd5b5060405162002b1a38038062002b1a8339818101604052810190620000379190620001f6565b8160009081620000489190620004c6565b5080600190816200005a9190620004c6565b505050620005ad565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620000cc8262000081565b810181811067ffffffffffffffff82111715620000ee57620000ed62000092565b5b80604052505050565b60006200010362000063565b9050620001118282620000c1565b919050565b600067ffffffffffffffff82111562000134576200013362000092565b5b6200013f8262000081565b9050602081019050919050565b60005b838110156200016c5780820151818401526020810190506200014f565b60008484015250505050565b60006200018f620001898462000116565b620000f7565b905082815260208101848484011115620001ae57620001ad6200007c565b5b620001bb8482856200014c565b509392505050565b600082601f830112620001db57620001da62000077565b5b8151620001ed84826020860162000178565b91505092915050565b6000806040838503121562000210576200020f6200006d565b5b600083015167ffffffffffffffff81111562000231576200023062000072565b5b6200023f85828601620001c3565b925050602083015167ffffffffffffffff81111562000263576200026262000072565b5b6200027185828601620001c3565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002ce57607f821691505b602082108103620002e457620002e362000286565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200034e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200030f565b6200035a86836200030f565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003a7620003a16200039b8462000372565b6200037c565b62000372565b9050919050565b6000819050919050565b620003c38362000386565b620003db620003d282620003ae565b8484546200031c565b825550505050565b600090565b620003f2620003e3565b620003ff818484620003b8565b505050565b5b8181101562000427576200041b600082620003e8565b60018101905062000405565b5050565b601f82111562000476576200044081620002ea565b6200044b84620002ff565b810160208510156200045b578190505b620004736200046a85620002ff565b83018262000404565b50505b505050565b600082821c905092915050565b60006200049b600019846008026200047b565b1980831691505092915050565b6000620004b6838362000488565b9150826002028217905092915050565b620004d1826200027b565b67ffffffffffffffff811115620004ed57620004ec62000092565b5b620004f98254620002b5565b620005068282856200042b565b600060209050601f8311600181146200053e576000841562000529578287015190505b620005358582620004a8565b865550620005a5565b601f1984166200054e86620002ea565b60005b82811015620005785784890151825560018201915060208501945060208101905062000551565b8683101562000598578489015162000594601f89168262000488565b8355505b6001600288020188555050505b505050505050565b61255d80620005bd6000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806357b375f411610097578063a22cb46511610066578063a22cb46514610282578063b88d4fde1461029e578063c87b56dd146102ba578063e985e9c5146102ea576100f5565b806357b375f4146101e85780636352211e1461020457806370a082311461023457806395d89b4114610264576100f5565b8063095ea7b3116100d3578063095ea7b31461017857806323b872dd1461019457806340c10f19146101b057806342842e0e146101cc576100f5565b806301ffc9a7146100fa57806306fdde031461012a578063081812fc14610148575b600080fd5b610114600480360381019061010f9190611806565b61031a565b604051610121919061184e565b60405180910390f35b6101326103fc565b60405161013f91906118f9565b60405180910390f35b610162600480360381019061015d9190611951565b61048e565b60405161016f91906119bf565b60405180910390f35b610192600480360381019061018d9190611a06565b6104d4565b005b6101ae60048036038101906101a99190611a46565b6105eb565b005b6101ca60048036038101906101c59190611a06565b61064b565b005b6101e660048036038101906101e19190611a46565b610659565b005b61020260048036038101906101fd9190611ac5565b610679565b005b61021e60048036038101906102199190611951565b610689565b60405161022b91906119bf565b60405180910390f35b61024e60048036038101906102499190611b18565b61070f565b60405161025b9190611b54565b60405180910390f35b61026c6107c6565b60405161027991906118f9565b60405180910390f35b61029c60048036038101906102979190611b6f565b610858565b005b6102b860048036038101906102b39190611ce4565b61086e565b005b6102d460048036038101906102cf9190611951565b6108d0565b6040516102e191906118f9565b60405180910390f35b61030460048036038101906102ff9190611d67565b610938565b604051610311919061184e565b60405180910390f35b60007fd71f2d39000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806103e557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806103f557506103f4826109cc565b5b9050919050565b60606000805461040b90611dd6565b80601f016020809104026020016040519081016040528092919081815260200182805461043790611dd6565b80156104845780601f1061045957610100808354040283529160200191610484565b820191906000526020600020905b81548152906001019060200180831161046757829003601f168201915b5050505050905090565b600061049982610a36565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006104df82610689565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361054f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161054690611e79565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661056e610a81565b73ffffffffffffffffffffffffffffffffffffffff16148061059d575061059c81610597610a81565b610938565b5b6105dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d390611f0b565b60405180910390fd5b6105e68383610a89565b505050565b6105fc6105f6610a81565b82610b42565b61063b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063290611f9d565b60405180910390fd5b610646838383610bd7565b505050565b6106558282610ed0565b5050565b6106748383836040518060200160405280600081525061086e565b505050565b610684838383610eee565b505050565b6000806106958361105a565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610706576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106fd90612009565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361077f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107769061209b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600180546107d590611dd6565b80601f016020809104026020016040519081016040528092919081815260200182805461080190611dd6565b801561084e5780601f106108235761010080835404028352916020019161084e565b820191906000526020600020905b81548152906001019060200180831161083157829003601f168201915b5050505050905090565b61086a610863610a81565b8383610eee565b5050565b61087f610879610a81565b83610b42565b6108be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b590611f9d565b60405180910390fd5b6108ca84848484611097565b50505050565b60606108db82610a36565b60006108e56110f3565b905060008151116109055760405180602001604052806000815250610930565b8061090f8461110a565b6040516020016109209291906120f7565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610a3f816111d8565b610a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7590612009565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610afc83610689565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610b4e83610689565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610b905750610b8f8185610938565b5b80610bce57508373ffffffffffffffffffffffffffffffffffffffff16610bb68461048e565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610bf782610689565b73ffffffffffffffffffffffffffffffffffffffff1614610c4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c449061218d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb39061221f565b60405180910390fd5b610cc98383836001611219565b8273ffffffffffffffffffffffffffffffffffffffff16610ce982610689565b73ffffffffffffffffffffffffffffffffffffffff1614610d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d369061218d565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610ecb838383600161121f565b505050565b610eea828260405180602001604052806000815250611225565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f539061228b565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161104d919061184e565b60405180910390a3505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6110a2848484610bd7565b6110ae84848484611280565b6110ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e49061231d565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b60606000600161111984611407565b01905060008167ffffffffffffffff81111561113857611137611bb9565b5b6040519080825280601f01601f19166020018201604052801561116a5781602001600182028036833780820191505090505b509050600082602001820190505b6001156111cd578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816111c1576111c061233d565b5b04945060008503611178575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166111fa8361105a565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b50505050565b50505050565b61122f838361155a565b61123c6000848484611280565b61127b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112729061231d565b60405180910390fd5b505050565b60006112a18473ffffffffffffffffffffffffffffffffffffffff16611777565b156113fa578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026112ca610a81565b8786866040518563ffffffff1660e01b81526004016112ec94939291906123c1565b6020604051808303816000875af192505050801561132857506040513d601f19601f820116820180604052508101906113259190612422565b60015b6113aa573d8060008114611358576040519150601f19603f3d011682016040523d82523d6000602084013e61135d565b606091505b5060008151036113a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113999061231d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506113ff565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611465577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161145b5761145a61233d565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106114a2576d04ee2d6d415b85acef810000000083816114985761149761233d565b5b0492506020810190505b662386f26fc1000083106114d157662386f26fc1000083816114c7576114c661233d565b5b0492506010810190505b6305f5e10083106114fa576305f5e10083816114f0576114ef61233d565b5b0492506008810190505b612710831061151f5761271083816115155761151461233d565b5b0492506004810190505b6064831061154257606483816115385761153761233d565b5b0492506002810190505b600a8310611551576001810190505b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c09061249b565b60405180910390fd5b6115d2816111d8565b15611612576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160990612507565b60405180910390fd5b611620600083836001611219565b611629816111d8565b15611669576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166090612507565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461177360008383600161121f565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6117e3816117ae565b81146117ee57600080fd5b50565b600081359050611800816117da565b92915050565b60006020828403121561181c5761181b6117a4565b5b600061182a848285016117f1565b91505092915050565b60008115159050919050565b61184881611833565b82525050565b6000602082019050611863600083018461183f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156118a3578082015181840152602081019050611888565b60008484015250505050565b6000601f19601f8301169050919050565b60006118cb82611869565b6118d58185611874565b93506118e5818560208601611885565b6118ee816118af565b840191505092915050565b6000602082019050818103600083015261191381846118c0565b905092915050565b6000819050919050565b61192e8161191b565b811461193957600080fd5b50565b60008135905061194b81611925565b92915050565b600060208284031215611967576119666117a4565b5b60006119758482850161193c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119a98261197e565b9050919050565b6119b98161199e565b82525050565b60006020820190506119d460008301846119b0565b92915050565b6119e38161199e565b81146119ee57600080fd5b50565b600081359050611a00816119da565b92915050565b60008060408385031215611a1d57611a1c6117a4565b5b6000611a2b858286016119f1565b9250506020611a3c8582860161193c565b9150509250929050565b600080600060608486031215611a5f57611a5e6117a4565b5b6000611a6d868287016119f1565b9350506020611a7e868287016119f1565b9250506040611a8f8682870161193c565b9150509250925092565b611aa281611833565b8114611aad57600080fd5b50565b600081359050611abf81611a99565b92915050565b600080600060608486031215611ade57611add6117a4565b5b6000611aec868287016119f1565b9350506020611afd868287016119f1565b9250506040611b0e86828701611ab0565b9150509250925092565b600060208284031215611b2e57611b2d6117a4565b5b6000611b3c848285016119f1565b91505092915050565b611b4e8161191b565b82525050565b6000602082019050611b696000830184611b45565b92915050565b60008060408385031215611b8657611b856117a4565b5b6000611b94858286016119f1565b9250506020611ba585828601611ab0565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611bf1826118af565b810181811067ffffffffffffffff82111715611c1057611c0f611bb9565b5b80604052505050565b6000611c2361179a565b9050611c2f8282611be8565b919050565b600067ffffffffffffffff821115611c4f57611c4e611bb9565b5b611c58826118af565b9050602081019050919050565b82818337600083830152505050565b6000611c87611c8284611c34565b611c19565b905082815260208101848484011115611ca357611ca2611bb4565b5b611cae848285611c65565b509392505050565b600082601f830112611ccb57611cca611baf565b5b8135611cdb848260208601611c74565b91505092915050565b60008060008060808587031215611cfe57611cfd6117a4565b5b6000611d0c878288016119f1565b9450506020611d1d878288016119f1565b9350506040611d2e8782880161193c565b925050606085013567ffffffffffffffff811115611d4f57611d4e6117a9565b5b611d5b87828801611cb6565b91505092959194509250565b60008060408385031215611d7e57611d7d6117a4565b5b6000611d8c858286016119f1565b9250506020611d9d858286016119f1565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611dee57607f821691505b602082108103611e0157611e00611da7565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000611e63602183611874565b9150611e6e82611e07565b604082019050919050565b60006020820190508181036000830152611e9281611e56565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000611ef5603d83611874565b9150611f0082611e99565b604082019050919050565b60006020820190508181036000830152611f2481611ee8565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000611f87602d83611874565b9150611f9282611f2b565b604082019050919050565b60006020820190508181036000830152611fb681611f7a565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000611ff3601883611874565b9150611ffe82611fbd565b602082019050919050565b6000602082019050818103600083015261202281611fe6565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612085602983611874565b915061209082612029565b604082019050919050565b600060208201905081810360008301526120b481612078565b9050919050565b600081905092915050565b60006120d182611869565b6120db81856120bb565b93506120eb818560208601611885565b80840191505092915050565b600061210382856120c6565b915061210f82846120c6565b91508190509392505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000612177602583611874565b91506121828261211b565b604082019050919050565b600060208201905081810360008301526121a68161216a565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612209602483611874565b9150612214826121ad565b604082019050919050565b60006020820190508181036000830152612238816121fc565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000612275601983611874565b91506122808261223f565b602082019050919050565b600060208201905081810360008301526122a481612268565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000612307603283611874565b9150612312826122ab565b604082019050919050565b60006020820190508181036000830152612336816122fa565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006123938261236c565b61239d8185612377565b93506123ad818560208601611885565b6123b6816118af565b840191505092915050565b60006080820190506123d660008301876119b0565b6123e360208301866119b0565b6123f06040830185611b45565b81810360608301526124028184612388565b905095945050505050565b60008151905061241c816117da565b92915050565b600060208284031215612438576124376117a4565b5b60006124468482850161240d565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000612485602083611874565b91506124908261244f565b602082019050919050565b600060208201905081810360008301526124b481612478565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006124f1601c83611874565b91506124fc826124bb565b602082019050919050565b60006020820190508181036000830152612520816124e4565b905091905056fea26469706673582212208655a8511f8c201e91cddfc952bc583127b2df096e2ee26cbc1f2f344df0735264736f6c63430008130033
\ No newline at end of file
60806040523480156200001157600080fd5b5060405162002cf138038062002cf18339818101604052810190620000379190620001f6565b8160009081620000489190620004c6565b5080600190816200005a9190620004c6565b505050620005ad565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620000cc8262000081565b810181811067ffffffffffffffff82111715620000ee57620000ed62000092565b5b80604052505050565b60006200010362000063565b9050620001118282620000c1565b919050565b600067ffffffffffffffff82111562000134576200013362000092565b5b6200013f8262000081565b9050602081019050919050565b60005b838110156200016c5780820151818401526020810190506200014f565b60008484015250505050565b60006200018f620001898462000116565b620000f7565b905082815260208101848484011115620001ae57620001ad6200007c565b5b620001bb8482856200014c565b509392505050565b600082601f830112620001db57620001da62000077565b5b8151620001ed84826020860162000178565b91505092915050565b6000806040838503121562000210576200020f6200006d565b5b600083015167ffffffffffffffff81111562000231576200023062000072565b5b6200023f85828601620001c3565b925050602083015167ffffffffffffffff81111562000263576200026262000072565b5b6200027185828601620001c3565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002ce57607f821691505b602082108103620002e457620002e362000286565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200034e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200030f565b6200035a86836200030f565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003a7620003a16200039b8462000372565b6200037c565b62000372565b9050919050565b6000819050919050565b620003c38362000386565b620003db620003d282620003ae565b8484546200031c565b825550505050565b600090565b620003f2620003e3565b620003ff818484620003b8565b505050565b5b8181101562000427576200041b600082620003e8565b60018101905062000405565b5050565b601f82111562000476576200044081620002ea565b6200044b84620002ff565b810160208510156200045b578190505b620004736200046a85620002ff565b83018262000404565b50505b505050565b600082821c905092915050565b60006200049b600019846008026200047b565b1980831691505092915050565b6000620004b6838362000488565b9150826002028217905092915050565b620004d1826200027b565b67ffffffffffffffff811115620004ed57620004ec62000092565b5b620004f98254620002b5565b620005068282856200042b565b600060209050601f8311600181146200053e576000841562000529578287015190505b620005358582620004a8565b865550620005a5565b601f1984166200054e86620002ea565b60005b82811015620005785784890151825560018201915060208501945060208101905062000551565b8683101562000598578489015162000594601f89168262000488565b8355505b6001600288020188555050505b505050505050565b61273480620005bd6000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c806357b375f411610097578063a22cb46511610066578063a22cb465146102a9578063b88d4fde146102c5578063c87b56dd146102e1578063e985e9c51461031157610100565b806357b375f41461020f5780636352211e1461022b57806370a082311461025b57806395d89b411461028b57610100565b806323b872dd116100d357806323b872dd1461019f57806340c10f19146101bb57806342842e0e146101d75780634684d7e9146101f357610100565b806301ffc9a71461010557806306fdde0314610135578063081812fc14610153578063095ea7b314610183575b600080fd5b61011f600480360381019061011a9190611877565b610341565b60405161012c91906118bf565b60405180910390f35b61013d610423565b60405161014a919061196a565b60405180910390f35b61016d600480360381019061016891906119c2565b6104b5565b60405161017a9190611a30565b60405180910390f35b61019d60048036038101906101989190611a77565b6104fb565b005b6101b960048036038101906101b49190611ab7565b610612565b005b6101d560048036038101906101d09190611a77565b610672565b005b6101f160048036038101906101ec9190611ab7565b610680565b005b61020d60048036038101906102089190611b6f565b6106a0565b005b61022960048036038101906102249190611bfb565b6106ea565b005b610245600480360381019061024091906119c2565b6106fa565b6040516102529190611a30565b60405180910390f35b61027560048036038101906102709190611c4e565b610780565b6040516102829190611c8a565b60405180910390f35b610293610837565b6040516102a0919061196a565b60405180910390f35b6102c360048036038101906102be9190611ca5565b6108c9565b005b6102df60048036038101906102da9190611e15565b6108df565b005b6102fb60048036038101906102f691906119c2565b610941565b604051610308919061196a565b60405180910390f35b61032b60048036038101906103269190611e98565b6109a9565b60405161033891906118bf565b60405180910390f35b60007fd71f2d39000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061040c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061041c575061041b82610a3d565b5b9050919050565b60606000805461043290611f07565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611f07565b80156104ab5780601f10610480576101008083540402835291602001916104ab565b820191906000526020600020905b81548152906001019060200180831161048e57829003601f168201915b5050505050905090565b60006104c082610aa7565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610506826106fa565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056d90611faa565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610595610af2565b73ffffffffffffffffffffffffffffffffffffffff1614806105c457506105c3816105be610af2565b6109a9565b5b610603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105fa9061203c565b60405180910390fd5b61060d8383610afa565b505050565b61062361061d610af2565b82610bb3565b610662576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610659906120ce565b60405180910390fd5b61066d838383610c48565b505050565b61067c8282610f41565b5050565b61069b838383604051806020016040528060008152506108df565b505050565b60005b828290508110156106e4576106d1848484848181106106c5576106c46120ee565b5b90506020020135610f41565b80806106dc9061214c565b9150506106a3565b50505050565b6106f5838383610f5f565b505050565b600080610706836110cb565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076e906121e0565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036107f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e790612272565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60606001805461084690611f07565b80601f016020809104026020016040519081016040528092919081815260200182805461087290611f07565b80156108bf5780601f10610894576101008083540402835291602001916108bf565b820191906000526020600020905b8154815290600101906020018083116108a257829003601f168201915b5050505050905090565b6108db6108d4610af2565b8383610f5f565b5050565b6108f06108ea610af2565b83610bb3565b61092f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610926906120ce565b60405180910390fd5b61093b84848484611108565b50505050565b606061094c82610aa7565b6000610956611164565b9050600081511161097657604051806020016040528060008152506109a1565b806109808461117b565b6040516020016109919291906122ce565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610ab081611249565b610aef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae6906121e0565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610b6d836106fa565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610bbf836106fa565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610c015750610c0081856109a9565b5b80610c3f57508373ffffffffffffffffffffffffffffffffffffffff16610c27846104b5565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610c68826106fa565b73ffffffffffffffffffffffffffffffffffffffff1614610cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb590612364565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d24906123f6565b60405180910390fd5b610d3a838383600161128a565b8273ffffffffffffffffffffffffffffffffffffffff16610d5a826106fa565b73ffffffffffffffffffffffffffffffffffffffff1614610db0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da790612364565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f3c8383836001611290565b505050565b610f5b828260405180602001604052806000815250611296565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610fcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc490612462565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110be91906118bf565b60405180910390a3505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b611113848484610c48565b61111f848484846112f1565b61115e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611155906124f4565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b60606000600161118a84611478565b01905060008167ffffffffffffffff8111156111a9576111a8611cea565b5b6040519080825280601f01601f1916602001820160405280156111db5781602001600182028036833780820191505090505b509050600082602001820190505b60011561123e578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161123257611231612514565b5b049450600085036111e9575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff1661126b836110cb565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b50505050565b50505050565b6112a083836115cb565b6112ad60008484846112f1565b6112ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e3906124f4565b60405180910390fd5b505050565b60006113128473ffffffffffffffffffffffffffffffffffffffff166117e8565b1561146b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261133b610af2565b8786866040518563ffffffff1660e01b815260040161135d9493929190612598565b6020604051808303816000875af192505050801561139957506040513d601f19601f8201168201806040525081019061139691906125f9565b60015b61141b573d80600081146113c9576040519150601f19603f3d011682016040523d82523d6000602084013e6113ce565b606091505b506000815103611413576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140a906124f4565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611470565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106114d6577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816114cc576114cb612514565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611513576d04ee2d6d415b85acef8100000000838161150957611508612514565b5b0492506020810190505b662386f26fc10000831061154257662386f26fc10000838161153857611537612514565b5b0492506010810190505b6305f5e100831061156b576305f5e100838161156157611560612514565b5b0492506008810190505b612710831061159057612710838161158657611585612514565b5b0492506004810190505b606483106115b357606483816115a9576115a8612514565b5b0492506002810190505b600a83106115c2576001810190505b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361163a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163190612672565b60405180910390fd5b61164381611249565b15611683576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167a906126de565b60405180910390fd5b61169160008383600161128a565b61169a81611249565b156116da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d1906126de565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46117e4600083836001611290565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6118548161181f565b811461185f57600080fd5b50565b6000813590506118718161184b565b92915050565b60006020828403121561188d5761188c611815565b5b600061189b84828501611862565b91505092915050565b60008115159050919050565b6118b9816118a4565b82525050565b60006020820190506118d460008301846118b0565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156119145780820151818401526020810190506118f9565b60008484015250505050565b6000601f19601f8301169050919050565b600061193c826118da565b61194681856118e5565b93506119568185602086016118f6565b61195f81611920565b840191505092915050565b600060208201905081810360008301526119848184611931565b905092915050565b6000819050919050565b61199f8161198c565b81146119aa57600080fd5b50565b6000813590506119bc81611996565b92915050565b6000602082840312156119d8576119d7611815565b5b60006119e6848285016119ad565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611a1a826119ef565b9050919050565b611a2a81611a0f565b82525050565b6000602082019050611a456000830184611a21565b92915050565b611a5481611a0f565b8114611a5f57600080fd5b50565b600081359050611a7181611a4b565b92915050565b60008060408385031215611a8e57611a8d611815565b5b6000611a9c85828601611a62565b9250506020611aad858286016119ad565b9150509250929050565b600080600060608486031215611ad057611acf611815565b5b6000611ade86828701611a62565b9350506020611aef86828701611a62565b9250506040611b00868287016119ad565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f840112611b2f57611b2e611b0a565b5b8235905067ffffffffffffffff811115611b4c57611b4b611b0f565b5b602083019150836020820283011115611b6857611b67611b14565b5b9250929050565b600080600060408486031215611b8857611b87611815565b5b6000611b9686828701611a62565b935050602084013567ffffffffffffffff811115611bb757611bb661181a565b5b611bc386828701611b19565b92509250509250925092565b611bd8816118a4565b8114611be357600080fd5b50565b600081359050611bf581611bcf565b92915050565b600080600060608486031215611c1457611c13611815565b5b6000611c2286828701611a62565b9350506020611c3386828701611a62565b9250506040611c4486828701611be6565b9150509250925092565b600060208284031215611c6457611c63611815565b5b6000611c7284828501611a62565b91505092915050565b611c848161198c565b82525050565b6000602082019050611c9f6000830184611c7b565b92915050565b60008060408385031215611cbc57611cbb611815565b5b6000611cca85828601611a62565b9250506020611cdb85828601611be6565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611d2282611920565b810181811067ffffffffffffffff82111715611d4157611d40611cea565b5b80604052505050565b6000611d5461180b565b9050611d608282611d19565b919050565b600067ffffffffffffffff821115611d8057611d7f611cea565b5b611d8982611920565b9050602081019050919050565b82818337600083830152505050565b6000611db8611db384611d65565b611d4a565b905082815260208101848484011115611dd457611dd3611ce5565b5b611ddf848285611d96565b509392505050565b600082601f830112611dfc57611dfb611b0a565b5b8135611e0c848260208601611da5565b91505092915050565b60008060008060808587031215611e2f57611e2e611815565b5b6000611e3d87828801611a62565b9450506020611e4e87828801611a62565b9350506040611e5f878288016119ad565b925050606085013567ffffffffffffffff811115611e8057611e7f61181a565b5b611e8c87828801611de7565b91505092959194509250565b60008060408385031215611eaf57611eae611815565b5b6000611ebd85828601611a62565b9250506020611ece85828601611a62565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611f1f57607f821691505b602082108103611f3257611f31611ed8565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000611f946021836118e5565b9150611f9f82611f38565b604082019050919050565b60006020820190508181036000830152611fc381611f87565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000612026603d836118e5565b915061203182611fca565b604082019050919050565b6000602082019050818103600083015261205581612019565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006120b8602d836118e5565b91506120c38261205c565b604082019050919050565b600060208201905081810360008301526120e7816120ab565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006121578261198c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036121895761218861211d565b5b600182019050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006121ca6018836118e5565b91506121d582612194565b602082019050919050565b600060208201905081810360008301526121f9816121bd565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b600061225c6029836118e5565b915061226782612200565b604082019050919050565b6000602082019050818103600083015261228b8161224f565b9050919050565b600081905092915050565b60006122a8826118da565b6122b28185612292565b93506122c28185602086016118f6565b80840191505092915050565b60006122da828561229d565b91506122e6828461229d565b91508190509392505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061234e6025836118e5565b9150612359826122f2565b604082019050919050565b6000602082019050818103600083015261237d81612341565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006123e06024836118e5565b91506123eb82612384565b604082019050919050565b6000602082019050818103600083015261240f816123d3565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061244c6019836118e5565b915061245782612416565b602082019050919050565b6000602082019050818103600083015261247b8161243f565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006124de6032836118e5565b91506124e982612482565b604082019050919050565b6000602082019050818103600083015261250d816124d1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b600061256a82612543565b612574818561254e565b93506125848185602086016118f6565b61258d81611920565b840191505092915050565b60006080820190506125ad6000830187611a21565b6125ba6020830186611a21565b6125c76040830185611c7b565b81810360608301526125d9818461255f565b905095945050505050565b6000815190506125f38161184b565b92915050565b60006020828403121561260f5761260e611815565b5b600061261d848285016125e4565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061265c6020836118e5565b915061266782612626565b602082019050919050565b6000602082019050818103600083015261268b8161264f565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006126c8601c836118e5565b91506126d382612692565b602082019050919050565b600060208201905081810360008301526126f7816126bb565b905091905056fea26469706673582212201043a78e09b47736c056c4a25b4904389874842b94452f3305f64e642dd7d19364736f6c63430008130033
\ No newline at end of file
......@@ -30,8 +30,8 @@ var (
// ERC721MetaData contains all meta data concerning the ERC721 contract.
var ERC721MetaData = &bind.MetaData{
ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol_\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"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\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"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\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"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\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAllFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
Bin: "0x60806040523480156200001157600080fd5b5060405162002b1a38038062002b1a8339818101604052810190620000379190620001f6565b8160009081620000489190620004c6565b5080600190816200005a9190620004c6565b505050620005ad565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620000cc8262000081565b810181811067ffffffffffffffff82111715620000ee57620000ed62000092565b5b80604052505050565b60006200010362000063565b9050620001118282620000c1565b919050565b600067ffffffffffffffff82111562000134576200013362000092565b5b6200013f8262000081565b9050602081019050919050565b60005b838110156200016c5780820151818401526020810190506200014f565b60008484015250505050565b60006200018f620001898462000116565b620000f7565b905082815260208101848484011115620001ae57620001ad6200007c565b5b620001bb8482856200014c565b509392505050565b600082601f830112620001db57620001da62000077565b5b8151620001ed84826020860162000178565b91505092915050565b6000806040838503121562000210576200020f6200006d565b5b600083015167ffffffffffffffff81111562000231576200023062000072565b5b6200023f85828601620001c3565b925050602083015167ffffffffffffffff81111562000263576200026262000072565b5b6200027185828601620001c3565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002ce57607f821691505b602082108103620002e457620002e362000286565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200034e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200030f565b6200035a86836200030f565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003a7620003a16200039b8462000372565b6200037c565b62000372565b9050919050565b6000819050919050565b620003c38362000386565b620003db620003d282620003ae565b8484546200031c565b825550505050565b600090565b620003f2620003e3565b620003ff818484620003b8565b505050565b5b8181101562000427576200041b600082620003e8565b60018101905062000405565b5050565b601f82111562000476576200044081620002ea565b6200044b84620002ff565b810160208510156200045b578190505b620004736200046a85620002ff565b83018262000404565b50505b505050565b600082821c905092915050565b60006200049b600019846008026200047b565b1980831691505092915050565b6000620004b6838362000488565b9150826002028217905092915050565b620004d1826200027b565b67ffffffffffffffff811115620004ed57620004ec62000092565b5b620004f98254620002b5565b620005068282856200042b565b600060209050601f8311600181146200053e576000841562000529578287015190505b620005358582620004a8565b865550620005a5565b601f1984166200054e86620002ea565b60005b82811015620005785784890151825560018201915060208501945060208101905062000551565b8683101562000598578489015162000594601f89168262000488565b8355505b6001600288020188555050505b505050505050565b61255d80620005bd6000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806357b375f411610097578063a22cb46511610066578063a22cb46514610282578063b88d4fde1461029e578063c87b56dd146102ba578063e985e9c5146102ea576100f5565b806357b375f4146101e85780636352211e1461020457806370a082311461023457806395d89b4114610264576100f5565b8063095ea7b3116100d3578063095ea7b31461017857806323b872dd1461019457806340c10f19146101b057806342842e0e146101cc576100f5565b806301ffc9a7146100fa57806306fdde031461012a578063081812fc14610148575b600080fd5b610114600480360381019061010f9190611806565b61031a565b604051610121919061184e565b60405180910390f35b6101326103fc565b60405161013f91906118f9565b60405180910390f35b610162600480360381019061015d9190611951565b61048e565b60405161016f91906119bf565b60405180910390f35b610192600480360381019061018d9190611a06565b6104d4565b005b6101ae60048036038101906101a99190611a46565b6105eb565b005b6101ca60048036038101906101c59190611a06565b61064b565b005b6101e660048036038101906101e19190611a46565b610659565b005b61020260048036038101906101fd9190611ac5565b610679565b005b61021e60048036038101906102199190611951565b610689565b60405161022b91906119bf565b60405180910390f35b61024e60048036038101906102499190611b18565b61070f565b60405161025b9190611b54565b60405180910390f35b61026c6107c6565b60405161027991906118f9565b60405180910390f35b61029c60048036038101906102979190611b6f565b610858565b005b6102b860048036038101906102b39190611ce4565b61086e565b005b6102d460048036038101906102cf9190611951565b6108d0565b6040516102e191906118f9565b60405180910390f35b61030460048036038101906102ff9190611d67565b610938565b604051610311919061184e565b60405180910390f35b60007fd71f2d39000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806103e557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806103f557506103f4826109cc565b5b9050919050565b60606000805461040b90611dd6565b80601f016020809104026020016040519081016040528092919081815260200182805461043790611dd6565b80156104845780601f1061045957610100808354040283529160200191610484565b820191906000526020600020905b81548152906001019060200180831161046757829003601f168201915b5050505050905090565b600061049982610a36565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006104df82610689565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361054f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161054690611e79565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661056e610a81565b73ffffffffffffffffffffffffffffffffffffffff16148061059d575061059c81610597610a81565b610938565b5b6105dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d390611f0b565b60405180910390fd5b6105e68383610a89565b505050565b6105fc6105f6610a81565b82610b42565b61063b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063290611f9d565b60405180910390fd5b610646838383610bd7565b505050565b6106558282610ed0565b5050565b6106748383836040518060200160405280600081525061086e565b505050565b610684838383610eee565b505050565b6000806106958361105a565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610706576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106fd90612009565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361077f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107769061209b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600180546107d590611dd6565b80601f016020809104026020016040519081016040528092919081815260200182805461080190611dd6565b801561084e5780601f106108235761010080835404028352916020019161084e565b820191906000526020600020905b81548152906001019060200180831161083157829003601f168201915b5050505050905090565b61086a610863610a81565b8383610eee565b5050565b61087f610879610a81565b83610b42565b6108be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b590611f9d565b60405180910390fd5b6108ca84848484611097565b50505050565b60606108db82610a36565b60006108e56110f3565b905060008151116109055760405180602001604052806000815250610930565b8061090f8461110a565b6040516020016109209291906120f7565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610a3f816111d8565b610a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7590612009565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610afc83610689565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610b4e83610689565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610b905750610b8f8185610938565b5b80610bce57508373ffffffffffffffffffffffffffffffffffffffff16610bb68461048e565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610bf782610689565b73ffffffffffffffffffffffffffffffffffffffff1614610c4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c449061218d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb39061221f565b60405180910390fd5b610cc98383836001611219565b8273ffffffffffffffffffffffffffffffffffffffff16610ce982610689565b73ffffffffffffffffffffffffffffffffffffffff1614610d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d369061218d565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610ecb838383600161121f565b505050565b610eea828260405180602001604052806000815250611225565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f539061228b565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161104d919061184e565b60405180910390a3505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6110a2848484610bd7565b6110ae84848484611280565b6110ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e49061231d565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b60606000600161111984611407565b01905060008167ffffffffffffffff81111561113857611137611bb9565b5b6040519080825280601f01601f19166020018201604052801561116a5781602001600182028036833780820191505090505b509050600082602001820190505b6001156111cd578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816111c1576111c061233d565b5b04945060008503611178575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166111fa8361105a565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b50505050565b50505050565b61122f838361155a565b61123c6000848484611280565b61127b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112729061231d565b60405180910390fd5b505050565b60006112a18473ffffffffffffffffffffffffffffffffffffffff16611777565b156113fa578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026112ca610a81565b8786866040518563ffffffff1660e01b81526004016112ec94939291906123c1565b6020604051808303816000875af192505050801561132857506040513d601f19601f820116820180604052508101906113259190612422565b60015b6113aa573d8060008114611358576040519150601f19603f3d011682016040523d82523d6000602084013e61135d565b606091505b5060008151036113a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113999061231d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506113ff565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611465577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161145b5761145a61233d565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106114a2576d04ee2d6d415b85acef810000000083816114985761149761233d565b5b0492506020810190505b662386f26fc1000083106114d157662386f26fc1000083816114c7576114c661233d565b5b0492506010810190505b6305f5e10083106114fa576305f5e10083816114f0576114ef61233d565b5b0492506008810190505b612710831061151f5761271083816115155761151461233d565b5b0492506004810190505b6064831061154257606483816115385761153761233d565b5b0492506002810190505b600a8310611551576001810190505b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c09061249b565b60405180910390fd5b6115d2816111d8565b15611612576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160990612507565b60405180910390fd5b611620600083836001611219565b611629816111d8565b15611669576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166090612507565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461177360008383600161121f565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6117e3816117ae565b81146117ee57600080fd5b50565b600081359050611800816117da565b92915050565b60006020828403121561181c5761181b6117a4565b5b600061182a848285016117f1565b91505092915050565b60008115159050919050565b61184881611833565b82525050565b6000602082019050611863600083018461183f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156118a3578082015181840152602081019050611888565b60008484015250505050565b6000601f19601f8301169050919050565b60006118cb82611869565b6118d58185611874565b93506118e5818560208601611885565b6118ee816118af565b840191505092915050565b6000602082019050818103600083015261191381846118c0565b905092915050565b6000819050919050565b61192e8161191b565b811461193957600080fd5b50565b60008135905061194b81611925565b92915050565b600060208284031215611967576119666117a4565b5b60006119758482850161193c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119a98261197e565b9050919050565b6119b98161199e565b82525050565b60006020820190506119d460008301846119b0565b92915050565b6119e38161199e565b81146119ee57600080fd5b50565b600081359050611a00816119da565b92915050565b60008060408385031215611a1d57611a1c6117a4565b5b6000611a2b858286016119f1565b9250506020611a3c8582860161193c565b9150509250929050565b600080600060608486031215611a5f57611a5e6117a4565b5b6000611a6d868287016119f1565b9350506020611a7e868287016119f1565b9250506040611a8f8682870161193c565b9150509250925092565b611aa281611833565b8114611aad57600080fd5b50565b600081359050611abf81611a99565b92915050565b600080600060608486031215611ade57611add6117a4565b5b6000611aec868287016119f1565b9350506020611afd868287016119f1565b9250506040611b0e86828701611ab0565b9150509250925092565b600060208284031215611b2e57611b2d6117a4565b5b6000611b3c848285016119f1565b91505092915050565b611b4e8161191b565b82525050565b6000602082019050611b696000830184611b45565b92915050565b60008060408385031215611b8657611b856117a4565b5b6000611b94858286016119f1565b9250506020611ba585828601611ab0565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611bf1826118af565b810181811067ffffffffffffffff82111715611c1057611c0f611bb9565b5b80604052505050565b6000611c2361179a565b9050611c2f8282611be8565b919050565b600067ffffffffffffffff821115611c4f57611c4e611bb9565b5b611c58826118af565b9050602081019050919050565b82818337600083830152505050565b6000611c87611c8284611c34565b611c19565b905082815260208101848484011115611ca357611ca2611bb4565b5b611cae848285611c65565b509392505050565b600082601f830112611ccb57611cca611baf565b5b8135611cdb848260208601611c74565b91505092915050565b60008060008060808587031215611cfe57611cfd6117a4565b5b6000611d0c878288016119f1565b9450506020611d1d878288016119f1565b9350506040611d2e8782880161193c565b925050606085013567ffffffffffffffff811115611d4f57611d4e6117a9565b5b611d5b87828801611cb6565b91505092959194509250565b60008060408385031215611d7e57611d7d6117a4565b5b6000611d8c858286016119f1565b9250506020611d9d858286016119f1565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611dee57607f821691505b602082108103611e0157611e00611da7565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000611e63602183611874565b9150611e6e82611e07565b604082019050919050565b60006020820190508181036000830152611e9281611e56565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000611ef5603d83611874565b9150611f0082611e99565b604082019050919050565b60006020820190508181036000830152611f2481611ee8565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000611f87602d83611874565b9150611f9282611f2b565b604082019050919050565b60006020820190508181036000830152611fb681611f7a565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000611ff3601883611874565b9150611ffe82611fbd565b602082019050919050565b6000602082019050818103600083015261202281611fe6565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612085602983611874565b915061209082612029565b604082019050919050565b600060208201905081810360008301526120b481612078565b9050919050565b600081905092915050565b60006120d182611869565b6120db81856120bb565b93506120eb818560208601611885565b80840191505092915050565b600061210382856120c6565b915061210f82846120c6565b91508190509392505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000612177602583611874565b91506121828261211b565b604082019050919050565b600060208201905081810360008301526121a68161216a565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612209602483611874565b9150612214826121ad565b604082019050919050565b60006020820190508181036000830152612238816121fc565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000612275601983611874565b91506122808261223f565b602082019050919050565b600060208201905081810360008301526122a481612268565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000612307603283611874565b9150612312826122ab565b604082019050919050565b60006020820190508181036000830152612336816122fa565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006123938261236c565b61239d8185612377565b93506123ad818560208601611885565b6123b6816118af565b840191505092915050565b60006080820190506123d660008301876119b0565b6123e360208301866119b0565b6123f06040830185611b45565b81810360608301526124028184612388565b905095945050505050565b60008151905061241c816117da565b92915050565b600060208284031215612438576124376117a4565b5b60006124468482850161240d565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000612485602083611874565b91506124908261244f565b602082019050919050565b600060208201905081810360008301526124b481612478565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006124f1601c83611874565b91506124fc826124bb565b602082019050919050565b60006020820190508181036000830152612520816124e4565b905091905056fea26469706673582212208655a8511f8c201e91cddfc952bc583127b2df096e2ee26cbc1f2f344df0735264736f6c63430008130033",
ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol_\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"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\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"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\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"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\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAllFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
Bin: "0x60806040523480156200001157600080fd5b5060405162002cf138038062002cf18339818101604052810190620000379190620001f6565b8160009081620000489190620004c6565b5080600190816200005a9190620004c6565b505050620005ad565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620000cc8262000081565b810181811067ffffffffffffffff82111715620000ee57620000ed62000092565b5b80604052505050565b60006200010362000063565b9050620001118282620000c1565b919050565b600067ffffffffffffffff82111562000134576200013362000092565b5b6200013f8262000081565b9050602081019050919050565b60005b838110156200016c5780820151818401526020810190506200014f565b60008484015250505050565b60006200018f620001898462000116565b620000f7565b905082815260208101848484011115620001ae57620001ad6200007c565b5b620001bb8482856200014c565b509392505050565b600082601f830112620001db57620001da62000077565b5b8151620001ed84826020860162000178565b91505092915050565b6000806040838503121562000210576200020f6200006d565b5b600083015167ffffffffffffffff81111562000231576200023062000072565b5b6200023f85828601620001c3565b925050602083015167ffffffffffffffff81111562000263576200026262000072565b5b6200027185828601620001c3565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002ce57607f821691505b602082108103620002e457620002e362000286565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200034e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200030f565b6200035a86836200030f565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003a7620003a16200039b8462000372565b6200037c565b62000372565b9050919050565b6000819050919050565b620003c38362000386565b620003db620003d282620003ae565b8484546200031c565b825550505050565b600090565b620003f2620003e3565b620003ff818484620003b8565b505050565b5b8181101562000427576200041b600082620003e8565b60018101905062000405565b5050565b601f82111562000476576200044081620002ea565b6200044b84620002ff565b810160208510156200045b578190505b620004736200046a85620002ff565b83018262000404565b50505b505050565b600082821c905092915050565b60006200049b600019846008026200047b565b1980831691505092915050565b6000620004b6838362000488565b9150826002028217905092915050565b620004d1826200027b565b67ffffffffffffffff811115620004ed57620004ec62000092565b5b620004f98254620002b5565b620005068282856200042b565b600060209050601f8311600181146200053e576000841562000529578287015190505b620005358582620004a8565b865550620005a5565b601f1984166200054e86620002ea565b60005b82811015620005785784890151825560018201915060208501945060208101905062000551565b8683101562000598578489015162000594601f89168262000488565b8355505b6001600288020188555050505b505050505050565b61273480620005bd6000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c806357b375f411610097578063a22cb46511610066578063a22cb465146102a9578063b88d4fde146102c5578063c87b56dd146102e1578063e985e9c51461031157610100565b806357b375f41461020f5780636352211e1461022b57806370a082311461025b57806395d89b411461028b57610100565b806323b872dd116100d357806323b872dd1461019f57806340c10f19146101bb57806342842e0e146101d75780634684d7e9146101f357610100565b806301ffc9a71461010557806306fdde0314610135578063081812fc14610153578063095ea7b314610183575b600080fd5b61011f600480360381019061011a9190611877565b610341565b60405161012c91906118bf565b60405180910390f35b61013d610423565b60405161014a919061196a565b60405180910390f35b61016d600480360381019061016891906119c2565b6104b5565b60405161017a9190611a30565b60405180910390f35b61019d60048036038101906101989190611a77565b6104fb565b005b6101b960048036038101906101b49190611ab7565b610612565b005b6101d560048036038101906101d09190611a77565b610672565b005b6101f160048036038101906101ec9190611ab7565b610680565b005b61020d60048036038101906102089190611b6f565b6106a0565b005b61022960048036038101906102249190611bfb565b6106ea565b005b610245600480360381019061024091906119c2565b6106fa565b6040516102529190611a30565b60405180910390f35b61027560048036038101906102709190611c4e565b610780565b6040516102829190611c8a565b60405180910390f35b610293610837565b6040516102a0919061196a565b60405180910390f35b6102c360048036038101906102be9190611ca5565b6108c9565b005b6102df60048036038101906102da9190611e15565b6108df565b005b6102fb60048036038101906102f691906119c2565b610941565b604051610308919061196a565b60405180910390f35b61032b60048036038101906103269190611e98565b6109a9565b60405161033891906118bf565b60405180910390f35b60007fd71f2d39000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061040c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061041c575061041b82610a3d565b5b9050919050565b60606000805461043290611f07565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611f07565b80156104ab5780601f10610480576101008083540402835291602001916104ab565b820191906000526020600020905b81548152906001019060200180831161048e57829003601f168201915b5050505050905090565b60006104c082610aa7565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610506826106fa565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056d90611faa565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610595610af2565b73ffffffffffffffffffffffffffffffffffffffff1614806105c457506105c3816105be610af2565b6109a9565b5b610603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105fa9061203c565b60405180910390fd5b61060d8383610afa565b505050565b61062361061d610af2565b82610bb3565b610662576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610659906120ce565b60405180910390fd5b61066d838383610c48565b505050565b61067c8282610f41565b5050565b61069b838383604051806020016040528060008152506108df565b505050565b60005b828290508110156106e4576106d1848484848181106106c5576106c46120ee565b5b90506020020135610f41565b80806106dc9061214c565b9150506106a3565b50505050565b6106f5838383610f5f565b505050565b600080610706836110cb565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076e906121e0565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036107f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e790612272565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60606001805461084690611f07565b80601f016020809104026020016040519081016040528092919081815260200182805461087290611f07565b80156108bf5780601f10610894576101008083540402835291602001916108bf565b820191906000526020600020905b8154815290600101906020018083116108a257829003601f168201915b5050505050905090565b6108db6108d4610af2565b8383610f5f565b5050565b6108f06108ea610af2565b83610bb3565b61092f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610926906120ce565b60405180910390fd5b61093b84848484611108565b50505050565b606061094c82610aa7565b6000610956611164565b9050600081511161097657604051806020016040528060008152506109a1565b806109808461117b565b6040516020016109919291906122ce565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610ab081611249565b610aef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae6906121e0565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610b6d836106fa565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610bbf836106fa565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610c015750610c0081856109a9565b5b80610c3f57508373ffffffffffffffffffffffffffffffffffffffff16610c27846104b5565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610c68826106fa565b73ffffffffffffffffffffffffffffffffffffffff1614610cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb590612364565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d24906123f6565b60405180910390fd5b610d3a838383600161128a565b8273ffffffffffffffffffffffffffffffffffffffff16610d5a826106fa565b73ffffffffffffffffffffffffffffffffffffffff1614610db0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da790612364565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f3c8383836001611290565b505050565b610f5b828260405180602001604052806000815250611296565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610fcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc490612462565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110be91906118bf565b60405180910390a3505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b611113848484610c48565b61111f848484846112f1565b61115e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611155906124f4565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b60606000600161118a84611478565b01905060008167ffffffffffffffff8111156111a9576111a8611cea565b5b6040519080825280601f01601f1916602001820160405280156111db5781602001600182028036833780820191505090505b509050600082602001820190505b60011561123e578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161123257611231612514565b5b049450600085036111e9575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff1661126b836110cb565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b50505050565b50505050565b6112a083836115cb565b6112ad60008484846112f1565b6112ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e3906124f4565b60405180910390fd5b505050565b60006113128473ffffffffffffffffffffffffffffffffffffffff166117e8565b1561146b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261133b610af2565b8786866040518563ffffffff1660e01b815260040161135d9493929190612598565b6020604051808303816000875af192505050801561139957506040513d601f19601f8201168201806040525081019061139691906125f9565b60015b61141b573d80600081146113c9576040519150601f19603f3d011682016040523d82523d6000602084013e6113ce565b606091505b506000815103611413576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140a906124f4565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611470565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106114d6577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816114cc576114cb612514565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611513576d04ee2d6d415b85acef8100000000838161150957611508612514565b5b0492506020810190505b662386f26fc10000831061154257662386f26fc10000838161153857611537612514565b5b0492506010810190505b6305f5e100831061156b576305f5e100838161156157611560612514565b5b0492506008810190505b612710831061159057612710838161158657611585612514565b5b0492506004810190505b606483106115b357606483816115a9576115a8612514565b5b0492506002810190505b600a83106115c2576001810190505b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361163a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163190612672565b60405180910390fd5b61164381611249565b15611683576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167a906126de565b60405180910390fd5b61169160008383600161128a565b61169a81611249565b156116da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d1906126de565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46117e4600083836001611290565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6118548161181f565b811461185f57600080fd5b50565b6000813590506118718161184b565b92915050565b60006020828403121561188d5761188c611815565b5b600061189b84828501611862565b91505092915050565b60008115159050919050565b6118b9816118a4565b82525050565b60006020820190506118d460008301846118b0565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156119145780820151818401526020810190506118f9565b60008484015250505050565b6000601f19601f8301169050919050565b600061193c826118da565b61194681856118e5565b93506119568185602086016118f6565b61195f81611920565b840191505092915050565b600060208201905081810360008301526119848184611931565b905092915050565b6000819050919050565b61199f8161198c565b81146119aa57600080fd5b50565b6000813590506119bc81611996565b92915050565b6000602082840312156119d8576119d7611815565b5b60006119e6848285016119ad565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611a1a826119ef565b9050919050565b611a2a81611a0f565b82525050565b6000602082019050611a456000830184611a21565b92915050565b611a5481611a0f565b8114611a5f57600080fd5b50565b600081359050611a7181611a4b565b92915050565b60008060408385031215611a8e57611a8d611815565b5b6000611a9c85828601611a62565b9250506020611aad858286016119ad565b9150509250929050565b600080600060608486031215611ad057611acf611815565b5b6000611ade86828701611a62565b9350506020611aef86828701611a62565b9250506040611b00868287016119ad565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f840112611b2f57611b2e611b0a565b5b8235905067ffffffffffffffff811115611b4c57611b4b611b0f565b5b602083019150836020820283011115611b6857611b67611b14565b5b9250929050565b600080600060408486031215611b8857611b87611815565b5b6000611b9686828701611a62565b935050602084013567ffffffffffffffff811115611bb757611bb661181a565b5b611bc386828701611b19565b92509250509250925092565b611bd8816118a4565b8114611be357600080fd5b50565b600081359050611bf581611bcf565b92915050565b600080600060608486031215611c1457611c13611815565b5b6000611c2286828701611a62565b9350506020611c3386828701611a62565b9250506040611c4486828701611be6565b9150509250925092565b600060208284031215611c6457611c63611815565b5b6000611c7284828501611a62565b91505092915050565b611c848161198c565b82525050565b6000602082019050611c9f6000830184611c7b565b92915050565b60008060408385031215611cbc57611cbb611815565b5b6000611cca85828601611a62565b9250506020611cdb85828601611be6565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611d2282611920565b810181811067ffffffffffffffff82111715611d4157611d40611cea565b5b80604052505050565b6000611d5461180b565b9050611d608282611d19565b919050565b600067ffffffffffffffff821115611d8057611d7f611cea565b5b611d8982611920565b9050602081019050919050565b82818337600083830152505050565b6000611db8611db384611d65565b611d4a565b905082815260208101848484011115611dd457611dd3611ce5565b5b611ddf848285611d96565b509392505050565b600082601f830112611dfc57611dfb611b0a565b5b8135611e0c848260208601611da5565b91505092915050565b60008060008060808587031215611e2f57611e2e611815565b5b6000611e3d87828801611a62565b9450506020611e4e87828801611a62565b9350506040611e5f878288016119ad565b925050606085013567ffffffffffffffff811115611e8057611e7f61181a565b5b611e8c87828801611de7565b91505092959194509250565b60008060408385031215611eaf57611eae611815565b5b6000611ebd85828601611a62565b9250506020611ece85828601611a62565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611f1f57607f821691505b602082108103611f3257611f31611ed8565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000611f946021836118e5565b9150611f9f82611f38565b604082019050919050565b60006020820190508181036000830152611fc381611f87565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000612026603d836118e5565b915061203182611fca565b604082019050919050565b6000602082019050818103600083015261205581612019565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006120b8602d836118e5565b91506120c38261205c565b604082019050919050565b600060208201905081810360008301526120e7816120ab565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006121578261198c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036121895761218861211d565b5b600182019050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006121ca6018836118e5565b91506121d582612194565b602082019050919050565b600060208201905081810360008301526121f9816121bd565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b600061225c6029836118e5565b915061226782612200565b604082019050919050565b6000602082019050818103600083015261228b8161224f565b9050919050565b600081905092915050565b60006122a8826118da565b6122b28185612292565b93506122c28185602086016118f6565b80840191505092915050565b60006122da828561229d565b91506122e6828461229d565b91508190509392505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061234e6025836118e5565b9150612359826122f2565b604082019050919050565b6000602082019050818103600083015261237d81612341565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006123e06024836118e5565b91506123eb82612384565b604082019050919050565b6000602082019050818103600083015261240f816123d3565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061244c6019836118e5565b915061245782612416565b602082019050919050565b6000602082019050818103600083015261247b8161243f565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006124de6032836118e5565b91506124e982612482565b604082019050919050565b6000602082019050818103600083015261250d816124d1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b600061256a82612543565b612574818561254e565b93506125848185602086016118f6565b61258d81611920565b840191505092915050565b60006080820190506125ad6000830187611a21565b6125ba6020830186611a21565b6125c76040830185611c7b565b81810360608301526125d9818461255f565b905095945050505050565b6000815190506125f38161184b565b92915050565b60006020828403121561260f5761260e611815565b5b600061261d848285016125e4565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061265c6020836118e5565b915061266782612626565b602082019050919050565b6000602082019050818103600083015261268b8161264f565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006126c8601c836118e5565b91506126d382612692565b602082019050919050565b600060208201905081810360008301526126f7816126bb565b905091905056fea26469706673582212201043a78e09b47736c056c4a25b4904389874842b94452f3305f64e642dd7d19364736f6c63430008130033",
}
// ERC721ABI is the input ABI used to generate the binding from.
......@@ -470,6 +470,27 @@ func (_ERC721 *ERC721TransactorSession) Approve(to common.Address, tokenId *big.
return _ERC721.Contract.Approve(&_ERC721.TransactOpts, to, tokenId)
}
// BatchMint is a paid mutator transaction binding the contract method 0x4684d7e9.
//
// Solidity: function batchMint(address to, uint256[] tokenIds) returns()
func (_ERC721 *ERC721Transactor) BatchMint(opts *bind.TransactOpts, to common.Address, tokenIds []*big.Int) (*types.Transaction, error) {
return _ERC721.contract.Transact(opts, "batchMint", to, tokenIds)
}
// BatchMint is a paid mutator transaction binding the contract method 0x4684d7e9.
//
// Solidity: function batchMint(address to, uint256[] tokenIds) returns()
func (_ERC721 *ERC721Session) BatchMint(to common.Address, tokenIds []*big.Int) (*types.Transaction, error) {
return _ERC721.Contract.BatchMint(&_ERC721.TransactOpts, to, tokenIds)
}
// BatchMint is a paid mutator transaction binding the contract method 0x4684d7e9.
//
// Solidity: function batchMint(address to, uint256[] tokenIds) returns()
func (_ERC721 *ERC721TransactorSession) BatchMint(to common.Address, tokenIds []*big.Int) (*types.Transaction, error) {
return _ERC721.Contract.BatchMint(&_ERC721.TransactOpts, to, tokenIds)
}
// Mint is a paid mutator transaction binding the contract method 0x40c10f19.
//
// Solidity: function mint(address to, uint256 tokenId) returns()
......
......@@ -323,6 +323,12 @@ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
_safeMint(to, tokenId);
}
function batchMint(address to, uint256[] calldata tokenIds) public {
for(uint i = 0;i < tokenIds.length;i++){
_safeMint(to, tokenIds[i]);
}
}
/**
* @dev Safely mints `tokenId` and transfers it to `to`.
*
......
......@@ -11,22 +11,42 @@ import (
func main() {
log.InitLog(log.LogConfig{Path: "logs", Level: "debug", Save: 3})
txArr := make([]*types.Transaction, 0)
verifyFuncArr := make([]func() bool, 0)
// 部署合约
if tool.Cfg.IsDeployContract {
txArr = operator.DeployContract(tool.Cfg.RpcNode, txArr)
}
// 初始化From账户以及合约账户
if tool.Cfg.IsInitAccountBalance {
txArr = operator.InitCaseAccount(tool.Cfg.RpcNode, txArr)
}
// 不相关交易case
if tool.Cfg.TransferType["NotAssociatedFlag"] {
// 转账交易case
if len(tool.Cfg.TransferType) != 0 {
accIndex := 0
nonceMap := util.GetAccountNonce(tool.Cfg.RpcNode)
arrFormat := tool.ParseAccountConfig("./config/account.json")
parseContractConfig := tool.ParseContractConfig("./config/contractConfig.json")
for _, caseType := range tool.Cfg.TransferType {
tranList, verifyFunc := operator.GetTranFunc(caseType, accIndex, 2, nonceMap, arrFormat, tool.Cfg.RpcNode, parseContractConfig)
txArr = append(txArr, tranList...)
verifyFuncArr = append(verifyFuncArr, verifyFunc)
accIndex += 2
}
}
// 发送整合后的交易
if len(txArr) > 0 {
operator.SendTransaction(txArr)
util.GetTxReceipt(tool.Cfg.RpcNode, txArr)
for _, vf := range verifyFuncArr {
if !vf() {
log.Error("Verify failed")
}
}
}
//util.GetAccountErc721BalanceOf(tool.Cfg.RpcNode, tool.Cfg.ContractMap[constant.ERC721], tool.Cfg.ContractMap[constant.TOKEN721_TRANSFER])
//util.GetAccountErc20BalanceOf(tool.Cfg.RpcNode, tool.Cfg.ContractMap[constant.TOKEN20_TRANSFER], tool.Cfg.DeployAddr)
util.GetAccountBalance(tool.Cfg.RpcNode)
}
......@@ -73,21 +73,22 @@ func DeployContract(client *ethclient.Client, txRes []*types.Transaction) []*typ
}
auth.NoSend = true
auth.Value = big.NewInt(0)
auth.GasLimit = uint64(4000000)
auth.GasPrice = big.NewInt(4000000)
auth.GasLimit = uint64(5000000000)
auth.GasPrice = big.NewInt(5000000000)
nonce, err := client.NonceAt(context.Background(), tool.Cfg.DeployAddr, nil)
if err != nil {
log.Error("DeployTokenTransfer func get acc nonce err:", err)
}
auth.Nonce = big.NewInt(int64(nonce))
contractArr := make([]map[string]common.Address, 0)
for i := 0; i < 5; i++ {
for i := 0; i < 10; i++ {
contractMap := make(map[string]common.Address, 0)
for _, deployFunc := range deploy.DeployFunc {
auth.Nonce = big.NewInt(int64(nonce))
contractAddr, transaction, contractType := deployFunc(auth, client)
log.Info("contractAddr:", contractAddr)
txRes = append(txRes, transaction)
contractMap[contractType] = contractAddr
auth.Nonce = auth.Nonce.Add(auth.Nonce, big.NewInt(1))
nonce += 1
}
contractArr = append(contractArr, contractMap)
}
......@@ -95,61 +96,126 @@ func DeployContract(client *ethclient.Client, txRes []*types.Transaction) []*typ
return txRes
}
func InitCaseAccount(client *ethclient.Client, txArr []*types.Transaction) []*types.Transaction {
nonce, err := client.NonceAt(context.Background(), tool.Cfg.DeployAddr, nil)
if err != nil {
log.Error("Init account - get acc nonce err:", err)
return nil
}
contractMap := tool.ParseContractConfig("./config/contractConfig.json")
tx := &types.Transaction{}
accArr := tool.ParseAccountConfig("./config/account.json")
auth, err := bind.NewKeyedTransactorWithChainID(tool.Cfg.DeployPrv, tool.Cfg.ChainId)
auth.NoSend = true
func InitAccountCoin(txArr []*types.Transaction, nonce uint64, amount *big.Int, accArr *tool.AccArrFormat) ([]*types.Transaction, uint64) {
//初始化From账户
amount := big.NewInt(0)
amount.SetString("10000000000000000000", 10)
trade := &coin.Trade{
FromPrv: tool.Cfg.DeployPrv,
FromNonce: big.NewInt(int64(nonce)),
Amount: amount,
Gas: big.NewInt(50000),
GasPrice: big.NewInt(100000000),
GasPrice: big.NewInt(10000000000),
ChainId: tool.Cfg.ChainId,
}
for i := 0; i < len(accArr.FromAddr); i++ {
toAddress := accArr.FromAddr[i]
trade.ToAddr = &toAddress
tx, err = trade.CoinTransferSignTx()
tx, err := trade.CoinTransferSignTx()
if err != nil {
log.Error("Init account - sign tran err:", err.Error())
return nil
return nil, 0
}
txArr = append(txArr, tx)
nonce += 1
trade.FromNonce = big.NewInt(int64(nonce))
log.Info("Init acc successful,addr:", toAddress)
}
//初始化转账合约账户余额
contractLen := len(contractMap)
for i := 0; i < len(accArr.ToAddr); i++ {
toAddress := accArr.ToAddr[i]
trade.ToAddr = &toAddress
tx, err := trade.CoinTransferSignTx()
if err != nil {
log.Error("Init account - sign tran err:", err.Error())
return nil, 0
}
txArr = append(txArr, tx)
nonce += 1
trade.FromNonce = big.NewInt(int64(nonce))
log.Info("Init acc successful,addr:", toAddress)
}
return txArr, nonce
}
func InitContractCoin(txArr []*types.Transaction, nonce uint64, contractLen int, contractMap []map[string]common.Address, trade *coin.Trade) ([]*types.Transaction, uint64) {
for i := 0; i < contractLen; i++ {
trade.FromNonce = big.NewInt(int64(nonce))
coinTransferContract := contractMap[i][constant.COIN_TRANSFER]
trade.ToAddr = &coinTransferContract
tx, err = trade.CoinTransferSignTx()
tx, err := trade.CoinTransferSignTx()
if err != nil {
log.Error("Init account - sign tran err:", err.Error())
return nil
return nil, 0
}
txArr = append(txArr, tx)
nonce += 1
}
return txArr, nonce
}
func InitErc721AccMint(txArr []*types.Transaction, nonce uint64, contractLen int, contractMap []map[string]common.Address, accArr *tool.AccArrFormat, client *ethclient.Client, auth *bind.TransactOpts) ([]*types.Transaction, uint64) {
tx := &types.Transaction{}
for j := 0; j < contractLen; j++ {
newERC721, err := erc721.NewERC721(contractMap[j][constant.ERC721], client)
if err != nil {
log.Error("Init account - new erc721 err:", err.Error())
return nil, 0
}
tokenIds := make([]*big.Int, 0)
for i := 0; i < len(accArr.FromAddr); i++ {
tokenIds = append(tokenIds, big.NewInt(int64(i)))
}
auth.Nonce = big.NewInt(int64(nonce))
tx, err = newERC721.BatchMint(auth, tool.Cfg.DeployAddr, tokenIds)
if err != nil {
log.Error("Init account - erc721 mint err:", err.Error())
return nil, 0
}
txArr = append(txArr, tx)
log.Info("Init account - mint 721 successful,tx:", tx.Hash().Hex())
nonce += 1
}
// 初始化erc20 并且mint
return txArr, nonce
}
func InitErc721AccTransfer(txArr []*types.Transaction, nonce uint64, contractLen int, contractMap []map[string]common.Address, accArr *tool.AccArrFormat, client *ethclient.Client, auth *bind.TransactOpts) ([]*types.Transaction, uint64) {
tx := &types.Transaction{}
for j := 0; j < contractLen; j++ {
newERC721, err := erc721.NewERC721(contractMap[j][constant.ERC721], client)
if err != nil {
log.Error("Init account - new erc721 err:", err.Error())
return nil, 0
}
for i := 0; i < len(accArr.FromAddr); i++ {
auth.Nonce = big.NewInt(int64(nonce))
tx, err = newERC721.TransferFrom(auth, tool.Cfg.DeployAddr, accArr.FromAddr[i], big.NewInt(int64(i)))
if err != nil {
log.Error("Init account - erc721 TransferFrom err:", err.Error())
return nil, 0
}
txArr = append(txArr, tx)
log.Info("Init account - transferFrom 721 successful,tx:", tx.Hash().Hex())
nonce += 1
auth.Nonce = big.NewInt(int64(nonce))
tx, err = newERC721.SetApprovalForAllFrom(auth, accArr.FromAddr[i], contractMap[j][constant.TOKEN721_TRANSFER], true)
if err != nil {
log.Error("Init account - erc721 setApprovalForAllFrom err:", err.Error())
return nil, 0
}
txArr = append(txArr, tx)
log.Info("Init account - transferFrom 721 successful,tx:", tx.Hash().Hex())
nonce += 1
}
}
return txArr, nonce
}
func InitErc20Acc(txArr []*types.Transaction, nonce uint64, contractLen int, contractMap []map[string]common.Address, accArr *tool.AccArrFormat, client *ethclient.Client, auth *bind.TransactOpts) ([]*types.Transaction, uint64) {
tx := &types.Transaction{}
for j := 0; j < contractLen; j++ {
newERC20, err := erc20.NewERC20(contractMap[j][constant.ERC20], client)
if err != nil {
log.Error("Init account - new erc20 err:", err.Error())
return nil
return nil, 0
}
auth.Nonce = big.NewInt(int64(nonce))
auth.GasPrice = big.NewInt(1000000000)
......@@ -157,7 +223,8 @@ func InitCaseAccount(client *ethclient.Client, txArr []*types.Transaction) []*ty
// mint
of, err := newERC20.BalanceOf(&bind.CallOpts{}, tool.Cfg.DeployAddr)
if err != nil {
return nil
log.Error(tool.Cfg.DeployAddr, "Get erc20 balance of error:", err.Error())
return nil, 0
}
log.Info(tool.Cfg.DeployAddr, ",erc20 balance of:", of.Uint64())
if of.Int64() == 0 {
......@@ -166,7 +233,7 @@ func InitCaseAccount(client *ethclient.Client, txArr []*types.Transaction) []*ty
tx, err = newERC20.Mint(auth, tool.Cfg.DeployAddr, mintCount)
if err != nil {
log.Error("Init account - erc20 mint err:", err.Error())
return nil
return nil, 0
}
txArr = append(txArr, tx)
nonce += 1
......@@ -178,7 +245,7 @@ func InitCaseAccount(client *ethclient.Client, txArr []*types.Transaction) []*ty
tx, err = newERC20.Transfer(auth, contractMap[j][constant.TOKEN20_TRANSFER], tranCount)
if err != nil {
log.Error("Init account - erc20 transfer err:", err.Error())
return nil
return nil, 0
}
txArr = append(txArr, tx)
nonce += 1
......@@ -189,7 +256,7 @@ func InitCaseAccount(client *ethclient.Client, txArr []*types.Transaction) []*ty
tx, err = newERC20.Transfer(auth, owner, tranCount)
if err != nil {
log.Error("Init account - erc20 transfer err:", err.Error())
return nil
return nil, 0
}
txArr = append(txArr, tx)
nonce += 1
......@@ -198,53 +265,50 @@ func InitCaseAccount(client *ethclient.Client, txArr []*types.Transaction) []*ty
tx, err = newERC20.ApproveFrom(auth, owner, contractMap[j][constant.TOKEN20_TRANSFER], tranCount)
if err != nil {
log.Error("Init account - erc20 approveFrom err:", err.Error())
return nil
return nil, 0
}
txArr = append(txArr, tx)
nonce += 1
}
}
//初始化erc721 并且mint
for j := 0; j < contractLen; j++ {
newERC721, err := erc721.NewERC721(contractMap[j][constant.ERC721], client)
if err != nil {
log.Error("Init account - new erc721 err:", err.Error())
return nil
}
for i := 0; i < len(accArr.FromAddr); i++ {
auth.Nonce = big.NewInt(int64(nonce))
tx, err = newERC721.Mint(auth, tool.Cfg.DeployAddr, big.NewInt(int64(i)))
if err != nil {
log.Error("Init account - erc721 mint err:", err.Error())
return nil
}
txArr = append(txArr, tx)
log.Info("Init account - mint 721 successful,tx:", tx.Hash().Hex())
nonce += 1
}
for i := 0; i < len(accArr.FromAddr); i++ {
auth.Nonce = big.NewInt(int64(nonce))
//tx, err = newERC721.TransferFrom(auth, tool.Cfg.DeployAddr, contractMap[constant.TOKEN721_TRANSFER], big.NewInt(int64(i)))
tx, err = newERC721.TransferFrom(auth, tool.Cfg.DeployAddr, accArr.FromAddr[i], big.NewInt(int64(i)))
if err != nil {
log.Error("Init account - erc721 TransferFrom err:", err.Error())
return nil
}
txArr = append(txArr, tx)
log.Info("Init account - transferFrom 721 successful,tx:", tx.Hash().Hex())
nonce += 1
return txArr, nonce
}
auth.Nonce = big.NewInt(int64(nonce))
tx, err = newERC721.SetApprovalForAllFrom(auth, accArr.FromAddr[i], contractMap[j][constant.TOKEN721_TRANSFER], true)
if err != nil {
log.Error("Init account - erc721 setApprovalForAllFrom err:", err.Error())
return nil
}
txArr = append(txArr, tx)
log.Info("Init account - transferFrom 721 successful,tx:", tx.Hash().Hex())
nonce += 1
}
func InitCaseAccount(client *ethclient.Client, txArr []*types.Transaction) []*types.Transaction {
nonce, err := client.NonceAt(context.Background(), tool.Cfg.DeployAddr, nil)
if err != nil {
log.Error("Init account - get acc nonce err:", err)
return nil
}
accArr := tool.ParseAccountConfig("./config/account.json")
auth, err := bind.NewKeyedTransactorWithChainID(tool.Cfg.DeployPrv, tool.Cfg.ChainId)
auth.NoSend = true
amount := big.NewInt(0)
amount.SetString("10000000000000000000", 10)
//trade := &coin.Trade{
// FromPrv: tool.Cfg.DeployPrv,
// FromNonce: big.NewInt(int64(nonce)),
// Amount: amount,
// Gas: big.NewInt(50000),
// GasPrice: big.NewInt(1000000000),
// ChainId: tool.Cfg.ChainId,
//}
contractMap := tool.ParseContractConfig("./config/contractConfig.json")
contractLen := len(contractMap)
//初始化From账户-500tx
//coinTxArr, nonce := InitAccountCoin(txArr, nonce, amount, accArr)
//txArr = append(txArr, coinTxArr...)
//初始化转账合约账户余额-10tx
//contractCoinTxArr, nonce := InitContractCoin(txArr, nonce, contractLen, contractMap, trade)
//txArr = append(txArr, contractCoinTxArr...)
//// 初始化erc20 并且mint
//erc20TxArr, nonce := InitErc20Acc(txArr, nonce, contractLen, contractMap, accArr, client, auth)
//txArr = append(txArr, erc20TxArr...)
////初始化erc721 并且mint
//erc721MintTxArr, nonce := InitErc721AccMint(txArr, nonce, contractLen, contractMap, accArr, client, auth)
//txArr = append(txArr, erc721MintTxArr...)
erc721TransferTxArr, nonce := InitErc721AccTransfer(txArr, nonce, contractLen, contractMap, accArr, client, auth)
txArr = append(txArr, erc721TransferTxArr...)
log.Info("Init balance successful,wait send tran...........")
return txArr
}
......@@ -258,11 +322,126 @@ func GetTranFunc(caseType int, startIndex int, txCount int, nonceMap *sync.Map,
{
return NrCoinTranCase(txCount, arr, nonceMap, txArr, client)
}
// 不相关-合约调用交易
// 不相关-单层-调用合约转账
case 2:
{
return NrContractCoinTranCase(txCount, arr, contractArr[0], nonceMap, txArr, client)
}
// 不相关-多层-调用合约转账
case 3:
{
return NrContractOneCoinTranCase(txCount, arr, contractArr[0], nonceMap, txArr, client)
}
// 不相关-单层-写变量
case 4:
{
return NrWRTranCase(arr, contractArr[0], nonceMap, txArr, client)
}
// 不相关-多层-写变量
case 5:
{
return NrOneWRTranCase(arr, contractArr[0], nonceMap, txArr, client)
}
// 不相关-单层-Erc20转账
case 6:
{
return NrErc20TranCase(txCount, arr, contractArr[0], nonceMap, txArr, client)
}
// 不相关-多层-Erc20转账
case 7:
{
return NrOneErc20TranCase(txCount, arr, contractArr[0], nonceMap, txArr, client)
}
// 不相关-单层-Erc721转账
case 8:
{
return NrErc721TranCase(txCount, arr, contractArr[0], nonceMap, txArr, client)
}
// 不相关-多层-Erc721转账
case 9:
{
return NrOneErc721TranCase(txCount, arr, contractArr[0], nonceMap, txArr, client)
}
// 部分相关-普通转账-接受者相关
case 10:
{
return PrReCoinTranCase(txCount, arr, nonceMap, txArr, client)
}
// 部分相关-普通转账-发送者相关
case 11:
{
return PrSpCoinTranCase(txCount, arr, nonceMap, txArr, client)
}
// 部分相关-普通转账-发送者和接受者部分相关
case 12:
{
return PrSpReCoinTranCase(txCount, arr, nonceMap, txArr, client)
}
// 部分相关-普通转账-发送者和接受者全部相关
case 13:
{
return AllPrSpReCoinTranCase(txCount, arr, nonceMap, txArr, client)
}
// 部分相关-合约转账-接受者相关
case 14:
{
return PrReContractCoinTranCase(txCount, arr, contractArr, nonceMap, txArr, client)
}
// 部分相关-合约转账-发送者相关-不同账户调用同一个合约给不同的账户进行转账
case 15:
{
return PrSpContractCoinTranCase(txCount, arr, contractArr[0], nonceMap, txArr, client)
}
// 部分相关-合约转账-发送者接受者相关
case 16:
{
return PrReSpContractCoinTranCase(txCount, arr, contractArr, nonceMap, txArr, client)
}
// 部分相关-多层-合约转账-接受者相关
case 17:
{
return PrReContractOneCoinTranCase(txCount, arr, contractArr, nonceMap, txArr, client)
}
// 部分相关-多层-合约转账-发送者相关
case 18:
{
return PrSpContractOneCoinTranCase(txCount, arr, contractArr, nonceMap, txArr, client)
}
// 部分相关-单层-写变量-合约接受者相关
case 19:
{
return PrReWRTranCase(arr, contractArr[0], nonceMap, txArr, client)
}
// 部分相关-单层-写变量-合约发送者相关
case 20:
{
return PrSpWRTranCase(arr, contractArr[0], nonceMap, txArr, client)
}
// 部分相关-多层-写变量-合约接受者相关
case 21:
{
return PrReOneWRTranCase(arr, contractArr, nonceMap, txArr, client)
}
// 部分相关-单层-erc20-向多个接受者进行转账
case 22:
{
return PrReErc20TranCase(txCount, arr, contractArr[0], nonceMap, txArr, client)
}
// 部分相关-多层-erc20-transfer-向多个接受者进行转账
case 23:
{
return PrSpOneErc20TranCase(txCount, arr, contractArr[0], nonceMap, txArr, client)
}
// 部分相关-单层-erc20-transferFrom-A->B 转账
case 24:
{
return PrReSpErc20TranCase(txCount, arr, contractArr[0], nonceMap, txArr, client)
}
// 部分相关-多层-erc20-transferFrom-发送者相关
case 25:
{
return PrReOneErc20TranCase(txCount, arr, contractArr[0], nonceMap, txArr, client)
}
default:
{
return nil, nil
......@@ -310,9 +489,16 @@ func SendTransaction(trans []*types.Transaction) {
}()
}
for i := 0; i < len(trans); i++ {
tranChanel <- trans[i]
tran := trans[i]
tranChanel <- tran
//err := client.SendTransaction(context.Background(), tran)
//log.Info("Send tran:", tran.Hash())
//if err != nil {
// log.Error("send tx error:", err.Error(), ",tx:", tran.Hash().Hex())
// return
//}
log.Info("Input count:", i)
}
time.Sleep(time.Second * 60)
time.Sleep(time.Second * 120)
log.Info("Send tran successful")
}
......@@ -4,7 +4,13 @@ import (
"context"
"contract-case/constant"
"contract-case/contract/coin"
contractErc20 "contract-case/contract/erc20"
contractErc721 "contract-case/contract/erc721"
readWrite "contract-case/contract/variable_state"
contractCoin "contract-case/contract_abi/coin_transfer/compile"
erc20 "contract-case/contract_abi/erc20_transfer/compile"
erc721 "contract-case/contract_abi/erc721_transfer/compile"
contractReadWrite "contract-case/contract_abi/read_write/compile"
"contract-case/log"
"contract-case/tool"
"contract-case/util"
......@@ -637,58 +643,568 @@ func PrSpContractOneCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, con
}
// PrReWRTranCase 单层-写变量-合约接受者相关
func PrReWRTranCase() {
func PrReWRTranCase(testAccArr *tool.AccArrFormat, contractMap map[string]common.Address, accountNonceMap *sync.Map, resTxArr []*types.Transaction, client *ethclient.Client) ([]*types.Transaction, func() bool) {
readWriteTrade := &readWrite.ReadWriteTrade{
KeyParam: big.NewInt(1),
ValueParam: big.NewInt(1),
StringParam: "test",
UintParam: big.NewInt(1),
ValueArrParam: []*big.Int{big.NewInt(1), big.NewInt(2)},
StringArrParam: []string{"1", "2"},
}
readWriteVar, err := contractReadWrite.NewReadWriteVar(contractMap[constant.READ_WRITE], client)
if err != nil {
log.Error("NewReadWriteVar error:", err.Error())
return nil, nil
}
funcStr := []string{
"PushVarMapArray",
"PushVarStringArray",
"PushVarUintArray",
"SetVarString",
"SetVarMap",
"SetVarMapArray",
"SetVarUint256",
"SetVarStringArray",
"SetVarUintArray",
}
for i := 0; i < len(funcStr); i++ {
value, _ := accountNonceMap.Load(testAccArr.FromAddr[i])
tx := util.ReadWriteCase(testAccArr.FromPrv[i], funcStr[i], big.NewInt(value.(int64)), readWriteTrade, readWriteVar)
resTxArr = append(resTxArr, tx)
}
verify := func() bool {
varString, err := readWriteVar.GetVarString(&bind.CallOpts{})
if err != nil {
log.Error("GetVarString error:", err.Error())
return false
}
if varString != readWriteTrade.StringParam {
log.Error(varString, " != ", readWriteTrade.StringParam)
return false
}
return true
}
return resTxArr, verify
}
// PrSpWRTranCase 单层-写变量-合约发送者相关
func PrSpWRTranCase() {
func PrSpWRTranCase(testAccArr *tool.AccArrFormat, contractMap map[string]common.Address, accountNonceMap *sync.Map, resTxArr []*types.Transaction, client *ethclient.Client) ([]*types.Transaction, func() bool) {
readWriteTrade := &readWrite.ReadWriteTrade{
KeyParam: big.NewInt(1),
ValueParam: big.NewInt(1),
StringParam: "test",
UintParam: big.NewInt(1),
ValueArrParam: []*big.Int{big.NewInt(1), big.NewInt(2)},
StringArrParam: []string{"1", "2"},
}
readWriteVar, err := contractReadWrite.NewReadWriteVar(contractMap[constant.READ_WRITE], client)
if err != nil {
log.Error("NewReadWriteVar error:", err.Error())
return nil, nil
}
funcStr := []string{
"PushVarMapArray",
"PushVarStringArray",
"PushVarUintArray",
"SetVarString",
"SetVarMap",
"SetVarMapArray",
"SetVarUint256",
"SetVarStringArray",
"SetVarUintArray",
}
for i := 0; i < len(funcStr); i++ {
value, _ := accountNonceMap.Load(testAccArr.FromAddr[0])
tx := util.ReadWriteCase(testAccArr.FromPrv[0], funcStr[i], big.NewInt(value.(int64)), readWriteTrade, readWriteVar)
resTxArr = append(resTxArr, tx)
}
verify := func() bool {
varString, err := readWriteVar.GetVarString(&bind.CallOpts{})
if err != nil {
log.Error("GetVarString error:", err.Error())
return false
}
if varString != readWriteTrade.StringParam {
log.Error(varString, " != ", readWriteTrade.StringParam)
return false
}
return true
}
return resTxArr, verify
}
// PrReOneWRTranCase 多层-写变量-合约接受者相关
func PrReOneWRTranCase() {
}
// PrSpOneWRTranCase 多层-写变量-合约发送者相关
func PrSpOneWRTranCase() {
func PrReOneWRTranCase(testAccArr *tool.AccArrFormat, contractMap []map[string]common.Address, accountNonceMap *sync.Map, resTxArr []*types.Transaction, client *ethclient.Client) ([]*types.Transaction, func() bool) {
readWriteAddr := contractMap[0][constant.READ_WRITE]
readWriteTrade := &readWrite.OneReadWriteTrade{
ReadWriteContract: readWriteAddr,
KeyParam: big.NewInt(1),
ValueParam: big.NewInt(1),
StringParam: "test",
UintParam: big.NewInt(1),
ValueArrParam: []*big.Int{big.NewInt(1), big.NewInt(2)},
StringArrParam: []string{"1", "2"},
}
funcStr := []string{
"PushVarMapArray",
"PushVarStringArray",
"PushVarUintArray",
"SetVarString",
"SetVarMap",
"SetVarMapArray",
"SetVarUint256",
"SetVarStringArray",
"SetVarUintArray",
}
for i := 0; i < len(funcStr); i++ {
readWriteVar, err := contractReadWrite.NewOneReadWriteVar(contractMap[i][constant.ONE_READ_WRITE], client)
if err != nil {
log.Error("NewReadWriteVar error:", err.Error())
return nil, nil
}
value, _ := accountNonceMap.Load(testAccArr.FromAddr[i])
tx := util.OneReadWriteCase(testAccArr.FromPrv[i], funcStr[i], big.NewInt(value.(int64)), readWriteTrade, *readWriteVar)
resTxArr = append(resTxArr, tx)
}
verify := func() bool {
for i := 0; i < len(funcStr); i++ {
readWriteVar, err := contractReadWrite.NewOneReadWriteVar(contractMap[i][constant.ONE_READ_WRITE], client)
if err != nil {
log.Error("NewReadWriteVar error:", err.Error())
return false
}
varString, err := readWriteVar.OneGetVarString(&bind.CallOpts{}, readWriteAddr)
if err != nil {
log.Error("GetVarString error:", err.Error())
return false
}
if varString != readWriteTrade.StringParam {
log.Error(varString, " != ", readWriteTrade.StringParam)
return false
}
}
return true
}
return resTxArr, verify
}
// PrReErc20TranCase 单层-erc20-发送者相关
func PrReErc20TranCase() {
// PrReErc20TranCase 单层-erc20-向多个接受者进行转账
func PrReErc20TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap map[string]common.Address, accountNonceMap *sync.Map, resTxArr []*types.Transaction, client *ethclient.Client) ([]*types.Transaction, func() bool) {
erc20Trade := &contractErc20.Erc20Trade{
Erc20Addr: contractMap[constant.ERC20],
Amount: big.NewInt(10000000000000000),
}
erc20Contract, err := erc20.NewERC20(contractMap[constant.ERC20], client)
if err != nil {
log.Error("NewTokenTransfer error:", err.Error())
return nil, nil
}
tokenTransfer, err := erc20.NewTokenTransfer(contractMap[constant.TOKEN20_TRANSFER], client)
if err != nil {
log.Error("NewTokenTransfer error:", err.Error())
return nil, nil
}
beforeToAddrErc20Bal := make(map[common.Address]*big.Int, 0)
beforeToken20Bal, err := erc20Contract.BalanceOf(&bind.CallOpts{}, contractMap[constant.TOKEN20_TRANSFER])
if err != nil {
log.Error("Get token20ContractBal erc20 balanceOf error:", err.Error())
return nil, nil
}
toAddrArr := make([]common.Address, 0)
for i := 0; i < txCount; i++ {
toAddrArr = append(toAddrArr, testAccArr.ToAddr[i])
toBal, err := erc20Contract.BalanceOf(&bind.CallOpts{}, testAccArr.ToAddr[i])
if err != nil {
log.Error("Get erc20 balanceOf error:", err.Error())
return nil, nil
}
beforeToAddrErc20Bal[testAccArr.ToAddr[i]] = toBal
}
erc20Trade.ToAddr = toAddrArr
auth, err := bind.NewKeyedTransactorWithChainID(testAccArr.FromPrv[0], tool.Cfg.ChainId)
if err != nil {
log.Errorf("DeployTokenTransfer func newKeyedTransactorWithChainID err:", err)
}
auth.NoSend = true
auth.GasPrice = big.NewInt(10000000000)
value, _ := accountNonceMap.Load(testAccArr.FromAddr[0])
auth.Nonce = big.NewInt(value.(int64))
tx, err := erc20Trade.Erc20TransferSignTx(auth, tokenTransfer)
if err != nil {
log.Error("Erc20TransferSignTx error:", err.Error())
return nil, nil
}
resTxArr = append(resTxArr, tx)
verify := func() bool {
afterToken20Bal, err := erc20Contract.BalanceOf(&bind.CallOpts{}, contractMap[constant.TOKEN20_TRANSFER])
if err != nil {
log.Error("Get erc20 balanceOf error:", err.Error())
return false
}
if afterToken20Bal.Sub(afterToken20Bal, beforeToken20Bal).Cmp(erc20Trade.Amount.Mul(erc20Trade.Amount, big.NewInt(int64(txCount)))) != 0 {
return false
}
for i := 0; i < txCount; i++ {
of, err := erc20Contract.BalanceOf(&bind.CallOpts{}, testAccArr.ToAddr[i])
if err != nil {
log.Error("Get erc20 balanceOf error:", err.Error())
return false
}
if of.Sub(of, beforeToAddrErc20Bal[testAccArr.ToAddr[i]]).Cmp(erc20Trade.Amount) != 0 {
return false
}
}
return true
}
return resTxArr, verify
}
// PrSpErc20TranCase 单层-erc20-接受者相关
func PrSpErc20TranCase() {
// PrSpOneErc20TranCase 多层-erc20-transfer-向多个接受者进行转账
func PrSpOneErc20TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap map[string]common.Address, accountNonceMap *sync.Map, resTxArr []*types.Transaction, client *ethclient.Client) ([]*types.Transaction, func() bool) {
amount := big.NewInt(1000000000000)
oneErc20Trade := &contractErc20.OneErc20Trade{
TokenTransferAddr: contractMap[constant.TOKEN20_TRANSFER],
Erc20Addr: contractMap[constant.ERC20],
Amount: amount,
}
tokenTransfer, err := erc20.NewOneTokenTransfer(contractMap[constant.ONE_TOKEN20_TRANSFER], client)
if err != nil {
return nil, nil
}
erc20Contract, err := erc20.NewERC20(contractMap[constant.ERC20], client)
if err != nil {
log.Error("NewTokenTransfer error:", err.Error())
return nil, nil
}
beforeToAddrErc20Bal := make(map[common.Address]*big.Int, 0)
beforeToken20Bal, err := erc20Contract.BalanceOf(&bind.CallOpts{}, contractMap[constant.TOKEN20_TRANSFER])
if err != nil {
log.Error("Get token20ContractBal erc20 balanceOf error:", err.Error())
return nil, nil
}
toAddrArr := make([]common.Address, 0)
for i := 0; i < txCount; i++ {
toAddrArr = append(toAddrArr, testAccArr.ToAddr[i])
toBal, err := erc20Contract.BalanceOf(&bind.CallOpts{}, testAccArr.ToAddr[i])
if err != nil {
log.Error("Get erc20 balanceOf error:", err.Error())
return nil, nil
}
beforeToAddrErc20Bal[testAccArr.ToAddr[i]] = toBal
}
oneErc20Trade.ToAddr = toAddrArr
auth, err := bind.NewKeyedTransactorWithChainID(testAccArr.FromPrv[0], tool.Cfg.ChainId)
if err != nil {
log.Errorf("DeployTokenTransfer func newKeyedTransactorWithChainID err:", err)
}
value, _ := accountNonceMap.Load(testAccArr.FromAddr[0])
auth.Nonce = big.NewInt(value.(int64))
auth.NoSend = true
auth.GasLimit = 1000000000000
auth.GasPrice = big.NewInt(10000000000)
tx, err := oneErc20Trade.Erc20OneTransferTx(auth, tokenTransfer)
if err != nil {
return nil, nil
}
log.Info("Erc20OneTransferTx tx:", tx.Hash().Hex())
resTxArr = append(resTxArr, tx)
afterToken20Bal, err := erc20Contract.BalanceOf(&bind.CallOpts{}, contractMap[constant.TOKEN20_TRANSFER])
if err != nil {
log.Error("Get token20ContractBal erc20 balanceOf error:", err.Error())
return nil, nil
}
verify := func() bool {
if beforeToken20Bal.Sub(beforeToken20Bal, afterToken20Bal).Cmp(amount.Mul(amount, big.NewInt(int64(txCount)))) != 0 {
return false
}
for i := 0; i < txCount; i++ {
of, err := erc20Contract.BalanceOf(&bind.CallOpts{}, testAccArr.ToAddr[i])
if err != nil {
log.Error("Get erc20 balanceOf error:", err.Error())
return false
}
if of.Sub(of, beforeToAddrErc20Bal[testAccArr.ToAddr[i]]).Cmp(amount) != 0 {
return false
}
}
return true
}
return resTxArr, verify
}
// PrReSpErc20TranCase 单层-erc20-发送接受者相关
func PrReSpErc20TranCase() {
// PrReSpErc20TranCase 单层-erc20-transferFrom-A->B 转账
func PrReSpErc20TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap map[string]common.Address, accountNonceMap *sync.Map, resTxArr []*types.Transaction, client *ethclient.Client) ([]*types.Transaction, func() bool) {
erc20Trade := &contractErc20.Erc20Trade{
Erc20Addr: contractMap[constant.ERC20],
Amount: big.NewInt(10000000000000000),
}
erc20Contract, err := erc20.NewERC20(contractMap[constant.ERC20], client)
if err != nil {
log.Error("NewTokenTransfer error:", err.Error())
return nil, nil
}
tokenTransfer, err := erc20.NewTokenTransfer(contractMap[constant.TOKEN20_TRANSFER], client)
if err != nil {
log.Error("NewTokenTransfer error:", err.Error())
return nil, nil
}
beforeToAddrErc20Bal := make(map[common.Address]*big.Int, 0)
beforeToken20Bal, err := erc20Contract.BalanceOf(&bind.CallOpts{}, contractMap[constant.TOKEN20_TRANSFER])
if err != nil {
log.Error("Get token20ContractBal erc20 balanceOf error:", err.Error())
return nil, nil
}
toAddrArr := make([]common.Address, 0)
for i := 0; i < txCount; i++ {
toAddrArr = append(toAddrArr, testAccArr.ToAddr[i])
toBal, err := erc20Contract.BalanceOf(&bind.CallOpts{}, testAccArr.ToAddr[i])
if err != nil {
log.Error("Get erc20 balanceOf error:", err.Error())
return nil, nil
}
beforeToAddrErc20Bal[testAccArr.ToAddr[i]] = toBal
erc20Trade.FromAddr = testAccArr.FromAddr[i]
erc20Trade.ToAddr = toAddrArr
auth, err := bind.NewKeyedTransactorWithChainID(testAccArr.FromPrv[i], tool.Cfg.ChainId)
if err != nil {
log.Errorf("DeployTokenTransfer func newKeyedTransactorWithChainID err:", err)
}
auth.NoSend = true
auth.GasPrice = big.NewInt(10000000000)
value, _ := accountNonceMap.Load(testAccArr.FromAddr[i])
auth.Nonce = big.NewInt(value.(int64))
tx, err := erc20Trade.Erc20TransferFromSignTx(auth, tokenTransfer)
if err != nil {
log.Error("Erc20TransferSignTx error:", err.Error())
return nil, nil
}
resTxArr = append(resTxArr, tx)
}
verify := func() bool {
afterToken20Bal, err := erc20Contract.BalanceOf(&bind.CallOpts{}, contractMap[constant.TOKEN20_TRANSFER])
if err != nil {
log.Error("Get erc20 balanceOf error:", err.Error())
return false
}
if afterToken20Bal.Sub(afterToken20Bal, beforeToken20Bal).Cmp(erc20Trade.Amount.Mul(erc20Trade.Amount, big.NewInt(int64(txCount)))) != 0 {
return false
}
for i := 0; i < txCount; i++ {
of, err := erc20Contract.BalanceOf(&bind.CallOpts{}, testAccArr.ToAddr[i])
if err != nil {
log.Error("Get erc20 balanceOf error:", err.Error())
return false
}
if of.Sub(of, beforeToAddrErc20Bal[testAccArr.ToAddr[i]]).Cmp(erc20Trade.Amount) != 0 {
return false
}
}
return true
}
return resTxArr, verify
}
// PrReOneErc20TranCase 多层-erc20-发送者相关
func PrReOneErc20TranCase() {
// PrReOneErc20TranCase 多层-erc20-transferFrom-发送者相关
func PrReOneErc20TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap map[string]common.Address, accountNonceMap *sync.Map, resTxArr []*types.Transaction, client *ethclient.Client) ([]*types.Transaction, func() bool) {
amount := big.NewInt(1000000000000)
oneErc20Trade := &contractErc20.OneErc20Trade{
TokenTransferAddr: contractMap[constant.TOKEN20_TRANSFER],
Erc20Addr: contractMap[constant.ERC20],
Amount: amount,
}
tokenTransfer, err := erc20.NewOneTokenTransfer(contractMap[constant.ONE_TOKEN20_TRANSFER], client)
if err != nil {
return nil, nil
}
erc20Contract, err := erc20.NewERC20(contractMap[constant.ERC20], client)
if err != nil {
log.Error("NewTokenTransfer error:", err.Error())
return nil, nil
}
beforeToAddrErc20Bal := make(map[common.Address]*big.Int, 0)
beforeToken20Bal, err := erc20Contract.BalanceOf(&bind.CallOpts{}, contractMap[constant.TOKEN20_TRANSFER])
if err != nil {
log.Error("Get token20ContractBal erc20 balanceOf error:", err.Error())
return nil, nil
}
toAddrArr := make([]common.Address, 0)
for i := 0; i < txCount; i++ {
toAddrArr = append(toAddrArr, testAccArr.ToAddr[i])
toBal, err := erc20Contract.BalanceOf(&bind.CallOpts{}, testAccArr.ToAddr[i])
if err != nil {
log.Error("Get erc20 balanceOf error:", err.Error())
return nil, nil
}
beforeToAddrErc20Bal[testAccArr.ToAddr[i]] = toBal
oneErc20Trade.ToAddr = toAddrArr
auth, err := bind.NewKeyedTransactorWithChainID(testAccArr.FromPrv[i], tool.Cfg.ChainId)
if err != nil {
log.Errorf("DeployTokenTransfer func newKeyedTransactorWithChainID err:", err)
}
value, _ := accountNonceMap.Load(testAccArr.FromAddr[i])
auth.Nonce = big.NewInt(value.(int64))
auth.NoSend = true
auth.GasLimit = 1000000000000
auth.GasPrice = big.NewInt(10000000000)
tx, err := oneErc20Trade.Erc20OneTransferTx(auth, tokenTransfer)
if err != nil {
return nil, nil
}
log.Info("Erc20OneTransferTx tx:", tx.Hash().Hex())
resTxArr = append(resTxArr, tx)
}
afterToken20Bal, err := erc20Contract.BalanceOf(&bind.CallOpts{}, contractMap[constant.TOKEN20_TRANSFER])
if err != nil {
log.Error("Get token20ContractBal erc20 balanceOf error:", err.Error())
return nil, nil
}
verify := func() bool {
if beforeToken20Bal.Sub(beforeToken20Bal, afterToken20Bal).Cmp(amount.Mul(amount, big.NewInt(int64(txCount)))) != 0 {
return false
}
for i := 0; i < txCount; i++ {
of, err := erc20Contract.BalanceOf(&bind.CallOpts{}, testAccArr.ToAddr[i])
if err != nil {
log.Error("Get erc20 balanceOf error:", err.Error())
return false
}
if of.Sub(of, beforeToAddrErc20Bal[testAccArr.ToAddr[i]]).Cmp(amount) != 0 {
return false
}
}
return true
}
return resTxArr, verify
}
// PrSpOneErc20TranCase 多层-erc20-接受者相关
func PrSpOneErc20TranCase() {
// PrSpErc20ApproveTranCase 单层-erc20-approve
func PrSpErc20ApproveTranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap map[string]common.Address, accountNonceMap *sync.Map, resTxArr []*types.Transaction, client *ethclient.Client) ([]*types.Transaction, func() bool) {
amount := big.NewInt(0)
amount.SetString("100000000000000000000000", 10)
erc20Addr := contractMap[constant.ERC20]
erc20Contract, err := erc20.NewERC20(erc20Addr, client)
if err != nil {
log.Error("NewERC20 error:", err.Error())
return nil, nil
}
beforeFromToAllowanceArr := make([]*big.Int, 0)
for i := 0; i < txCount; i++ {
beforeFromToAllowance, err := erc20Contract.Allowance(&bind.CallOpts{}, testAccArr.FromAddr[i], testAccArr.ToAddr[i])
if err != nil {
log.Error("Get token20ContractBal erc20 allowance error:", err.Error())
return nil, nil
}
beforeFromToAllowanceArr = append(beforeFromToAllowanceArr, beforeFromToAllowance)
auth, err := bind.NewKeyedTransactorWithChainID(testAccArr.FromPrv[i], tool.Cfg.ChainId)
if err != nil {
log.Errorf("DeployTokenTransfer func newKeyedTransactorWithChainID err:", err)
}
value, _ := accountNonceMap.Load(testAccArr.FromAddr[i])
auth.Nonce = big.NewInt(value.(int64))
auth.NoSend = true
auth.GasLimit = 1000000000000
auth.GasPrice = big.NewInt(10000000000)
tx, err := erc20Contract.Approve(auth, testAccArr.ToAddr[i], amount)
if err != nil {
log.Error("Approve failed:", err)
return nil, nil
}
resTxArr = append(resTxArr, tx)
}
verify := func() bool {
for i := 0; i < txCount; i++ {
of, err := erc20Contract.Allowance(&bind.CallOpts{}, testAccArr.FromAddr[i], testAccArr.ToAddr[i])
if err != nil {
log.Error("Get erc20 balanceOf error:", err.Error())
return false
}
if of.Sub(of, beforeFromToAllowanceArr[i]) != amount {
return false
}
}
return true
}
return resTxArr, verify
}
// PrReSpOneErc20TranCase 多层-erc20-发送接受者相关
func PrReSpOneErc20TranCase() {
// PrReSpOneErc20ApproveTranCase 多层-erc20-approve
func PrReSpOneErc20ApproveTranCase() {
}
// PrReErc721TranCase 单层-erc721-发送者相关
func PrReErc721TranCase() {
func PrReErc721TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap map[string]common.Address, accountNonceMap *sync.Map, resTxArr []*types.Transaction, client *ethclient.Client) ([]*types.Transaction, func() bool) {
erc721Trade := &contractErc721.Erc721Trade{
Erc721Addr: contractMap[constant.ERC721],
}
erc721Contract, err := erc721.NewERC721(contractMap[constant.ERC721], client)
if err != nil {
return nil, nil
}
tokenTransfer, err := erc721.NewNftTokenTransfer(contractMap[constant.TOKEN721_TRANSFER], client)
if err != nil {
return nil, nil
}
beforeToErc721Bal := make(map[common.Address]*big.Int, 0)
beforeFromErc721Bal := make(map[common.Address]*big.Int, 0)
for i := 0; i < txCount; i++ {
auth, err := bind.NewKeyedTransactorWithChainID(testAccArr.FromPrv[i], tool.Cfg.ChainId)
if err != nil {
log.Errorf("DeployTokenTransfer func newKeyedTransactorWithChainID err:", err)
continue
}
erc721Trade.ToAddr = testAccArr.ToAddr[i]
toErc721Bal, err := erc721Contract.BalanceOf(&bind.CallOpts{}, testAccArr.ToAddr[i])
if err != nil {
log.Error("Get erc721 bal error:", err.Error())
return nil, nil
}
fromErc721Bal, err := erc721Contract.BalanceOf(&bind.CallOpts{}, testAccArr.FromAddr[i])
if err != nil {
log.Error("Get erc721 bal error:", err.Error())
return nil, nil
}
beforeToErc721Bal[testAccArr.ToAddr[i]] = toErc721Bal
beforeFromErc721Bal[testAccArr.FromAddr[i]] = fromErc721Bal
erc721Trade.FromAddr = testAccArr.FromAddr[i]
// todo 需要初始化时知道sender对应的tokenId
erc721Trade.TokenId = big.NewInt(int64(i))
value, _ := accountNonceMap.Load(testAccArr.FromAddr[i])
auth.Nonce = big.NewInt(value.(int64))
auth.NoSend = true
auth.GasPrice = big.NewInt(10000000000)
tx, err := erc721Trade.Erc721TransferFromSignTx(auth, tokenTransfer)
if err != nil {
log.Error("Erc721TransferFromSignTx error:", err.Error())
return nil, nil
}
log.Info("Erc721TransferFromSignTx tx:", tx.Hash().Hex())
resTxArr = append(resTxArr, tx)
}
verify := func() bool {
for i := 0; i < txCount; i++ {
toErc721Bal, err := erc721Contract.BalanceOf(&bind.CallOpts{}, testAccArr.ToAddr[i])
if err != nil {
log.Error("Get erc721 bal error:", err.Error())
return false
}
if beforeToErc721Bal[testAccArr.ToAddr[i]].Sub(beforeToErc721Bal[testAccArr.ToAddr[i]], toErc721Bal).Cmp(big.NewInt(1)) != 0 {
return false
}
fromErc721Bal, err := erc721Contract.BalanceOf(&bind.CallOpts{}, testAccArr.FromAddr[i])
if err != nil {
log.Error("Get erc721 bal error:", err.Error())
return false
}
if beforeFromErc721Bal[testAccArr.FromAddr[i]].Sub(beforeToErc721Bal[testAccArr.FromAddr[i]], fromErc721Bal).Cmp(big.NewInt(1)) != 0 {
return false
}
}
return true
}
return resTxArr, verify
}
// PrSpErc721TranCase 单层-erc721-接受者相关
......
package main
import (
"context"
erc20 "contract-case/contract_abi/erc20_transfer/compile"
erc721 "contract-case/contract_abi/erc721_transfer/compile"
"contract-case/log"
"fmt"
"github.com/ethereum/go-ethereum/accounts/abi"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/ethclient"
"strings"
"testing"
)
func TestGetContractAbi(t *testing.T) {
// 连接以太坊网络
client, err := ethclient.Dial("http://15.161.177.5:26658")
if err != nil {
log.Fatal(err)
}
// 从合约地址获取合约代码
contractAddress := common.HexToAddress("0xacea4c028c233e5d896b5ea28eb1c24d64b937e2")
code, err := client.CodeAt(context.Background(), contractAddress, nil)
if err != nil {
log.Fatal("get contract code err:", err)
}
balance, err := client.BalanceAt(context.Background(), contractAddress, nil)
if err != nil {
log.Fatal("Get account balance err:", err.Error())
}
log.Info("balance:", balance.String())
// 解析ABI
contractAbi, err := abi.JSON(strings.NewReader(string(code)))
if err != nil {
log.Fatal(err)
}
// 打印ABI信息
fmt.Println(contractAbi.Methods)
}
func TestGetErc20Balance(t *testing.T) {
// 连接以太坊网络
client, err := ethclient.Dial("http://15.161.177.5:26658")
if err != nil {
log.Fatal(err)
}
// 从合约地址获取合约代码
contractAddress := common.HexToAddress("0x91f2c122c8060258605c287cea0bdda056b7b25d")
accountAddr := common.HexToAddress("0x4b0ae7ac4886e7c54e40529cc008df84407e5975")
newERC20, err := erc20.NewERC20(contractAddress, client)
if err != nil {
return
}
of, err := newERC20.BalanceOf(&bind.CallOpts{}, accountAddr)
if err != nil {
return
}
log.Info("balance is :", of.String())
}
func TestGetErc721Balance(t *testing.T) {
// 连接以太坊网络
client, err := ethclient.Dial("http://15.161.177.5:26658")
if err != nil {
log.Fatal(err)
}
// 从合约地址获取合约代码
contractAddress := common.HexToAddress("0x450260F10b2D55b785037388fA3aA3b2232cC9F4")
accountAddr := common.HexToAddress("0x40EC4256fcBCA69CdbAc942594caeC79FBE10494")
newERC721, err := erc721.NewERC721(contractAddress, client)
if err != nil {
return
}
of, err := newERC721.BalanceOf(&bind.CallOpts{}, accountAddr)
if err != nil {
return
}
log.Info("balance is :", of.String())
}
......@@ -14,14 +14,14 @@ import (
)
type ConfigJson struct {
DeployAddr string `json:"deployAddr"`
DeployPrv string `json:"deployPrv"`
RpcNode string `json:"rpcNode"`
ChainId int64 `json:"chainId"`
TransferType map[string]bool `json:"transferType"`
GenerateAccCount int `json:"generateAccCount"`
IsDeployContract bool `json:"isDeployContract"`
IsInitAccountBalance bool `json:"isInitAccountBalance"`
DeployAddr string `json:"deployAddr"`
DeployPrv string `json:"deployPrv"`
RpcNode string `json:"rpcNode"`
ChainId int64 `json:"chainId"`
TransferType []int `json:"transferType"`
GenerateAccCount int `json:"generateAccCount"`
IsDeployContract bool `json:"isDeployContract"`
IsInitAccountBalance bool `json:"isInitAccountBalance"`
}
type Config struct {
......@@ -29,7 +29,7 @@ type Config struct {
DeployPrv *ecdsa.PrivateKey
RpcNode *ethclient.Client
ChainId *big.Int
TransferType map[string]bool
TransferType []int
GenerateAccCount int
IsDeployContract bool
IsInitAccountBalance bool
......
......@@ -53,7 +53,7 @@ func GetTxReceipt(client *ethclient.Client, txArr []*types.Transaction) {
if receipt.Status == 0 {
log.Error("Receipt:", receipt)
} else {
log.Infof("Receipt: status: %d, logs:%s ,gasUsed: %d", receipt.Status, receipt.Logs, receipt.GasUsed)
log.Infof("Receipt: status: %d,gasUsed: %d", receipt.Status, receipt.GasUsed)
}
}
}
......@@ -91,6 +91,9 @@ func GetAccountNonce(client *ethclient.Client) *sync.Map {
}
func GetAccBal(client *ethclient.Client, addr common.Address) *big.Int {
mutex := sync.Mutex{}
mutex.Lock()
defer mutex.Unlock()
balance, err := client.BalanceAt(context.Background(), addr, nil)
if err != nil {
log.Errorf("Get acc:%s,balance err:%s", addr.Hash().Hex(), err.Error())
......@@ -112,6 +115,7 @@ func GetAccountBalance(client *ethclient.Client) {
select {
case addr := <-addrChan:
GetAccBal(client, addr)
log.Info("tool.Cfg.ContractMap[0][constant.ERC20]:", tool.Cfg.ContractMap[0][constant.ERC20])
GetAccountErc20BalanceOf(client, tool.Cfg.ContractMap[0][constant.ERC20], addr)
GetAccountErc721BalanceOf(client, tool.Cfg.ContractMap[0][constant.ERC721], addr)
atomic.AddInt32(&handleBalanceCount, 1)
......@@ -130,6 +134,9 @@ func GetAccountBalance(client *ethclient.Client) {
}
func GetAccountErc20BalanceOf(client *ethclient.Client, erc20Addr common.Address, toAddr common.Address) {
mutex := sync.Mutex{}
mutex.Lock()
defer mutex.Unlock()
newERC20, err := erc20.NewERC20(erc20Addr, client)
if err != nil {
log.Error("Init account - new erc720 err:", err.Error())
......@@ -149,6 +156,9 @@ func GetAccountErc20BalanceOf(client *ethclient.Client, erc20Addr common.Address
}
func GetAccountErc721BalanceOf(client *ethclient.Client, erc721Addr common.Address, toAddr common.Address) {
mutex := sync.Mutex{}
mutex.Lock()
defer mutex.Unlock()
newERC721, err := erc721.NewERC721(erc721Addr, client)
if err != nil {
log.Error("Init account - new erc721 err:", err.Error())
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment