Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
C
contract-case
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
duanjinfei
contract-case
Commits
c72a9be3
Commit
c72a9be3
authored
Apr 20, 2023
by
duanjinfei
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
tidy tran case
parent
22bf17e9
Changes
12
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
1131 additions
and
221 deletions
+1131
-221
app.json
config/app.json
+11
-29
contractConfig.json
config/contractConfig.json
+152
-71
ERC721.abi
contract_abi/erc721_transfer/abi_bin/ERC721.abi
+1
-1
ERC721.bin
contract_abi/erc721_transfer/abi_bin/ERC721.bin
+1
-1
ERC721.go
contract_abi/erc721_transfer/compile/ERC721.go
+23
-2
ERC721.sol
contract_abi/erc721_transfer/contract/ERC721.sol
+6
-0
main.go
main.go
+24
-4
operator.go
operator/operator.go
+260
-74
partlyRelatedCase.go
operator/partlyRelatedCase.go
+545
-29
contract_test.go
test/contract_test.go
+88
-0
Config.go
tool/Config.go
+9
-9
contract_util.go
util/contract_util.go
+11
-1
No files found.
config/app.json
View file @
c72a9be3
{
{
"deployAddr"
:
"0xe2bA4B27E835f3D5A8f74B53aD6b8b6264D3F501"
,
"deployAddr1"
:
"0xe2bA4B27E835f3D5A8f74B53aD6b8b6264D3F501"
,
"deployPrv"
:
"115725efa0b457a764bb0b73b79a26605a54a5025d825b5a627f69354cdbbbf4"
,
"deployPrv1"
:
"115725efa0b457a764bb0b73b79a26605a54a5025d825b5a627f69354cdbbbf4"
,
"rpcNode"
:
"http://54.72.101.87:50000"
,
"deployAddr"
:
"0x40EC4256fcBCA69CdbAc942594caeC79FBE10494"
,
"chainId"
:
155
,
"deployPrv"
:
"37871f094f89fc95599e73d72d3008c828bb76d0864759011fa14dbaf6cf3c06"
,
"rpcNode1"
:
"http://192.168.1.125:50000"
,
"rpcNode"
:
"http://15.161.177.5:26658"
,
"chainId1"
:
155
,
"chainId"
:
256256
,
"goRoutine"
:
1
,
"goRoutine"
:
1
,
"generateAccCount"
:
500
,
"generateAccCount"
:
500
,
"isDeployContract"
:
tru
e
,
"isDeployContract"
:
fals
e
,
"isInitAccountBalance"
:
fals
e
,
"isInitAccountBalance"
:
tru
e
,
"startTokenId"
:
1
,
"startTokenId"
:
1
,
"endTokenId"
:
100
,
"endTokenId"
:
100
,
"transferType"
:
{
"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
}
}
}
config/contractConfig.json
View file @
c72a9be3
[
[
{
{
"Coin_Transfer"
:
"0x
7eb5eab85e37d297b92e4c56a0187e910f37d969
"
,
"Coin_Transfer"
:
"0x
acea4c028c233e5d896b5ea28eb1c24d64b937e2
"
,
"ERC20"
:
"0x
bb0bb92922b244b2e3545f55bc4aee00299ea6de
"
,
"ERC20"
:
"0x
76e45ce8aa97a3c31d5de9808138e4e31e59fed2
"
,
"ERC721"
:
"0x
89afa7faf59f6437a3df9c373bc5401b8d5f0099
"
,
"ERC721"
:
"0x
A1C950aA702174E41BCD0ECB7f4c37FDfd672704
"
,
"One_Coin_Transfer"
:
"0x
cc600106d992657b6fabbb68e005eb94a07acc41
"
,
"One_Coin_Transfer"
:
"0x
751d4fe23f0d12b24e58a8e7fc8dccebb5cce2f8
"
,
"One_Read_Write"
:
"0x
5adfe690fb447730ba9d992940d5d07a2efa5094
"
,
"One_Read_Write"
:
"0x
8d1d06ccb26436a6dcc34d2a2d85086036d5510c
"
,
"One_Token20_Transfer"
:
"0x
469130ea4dfbed768b0d771cc99946f81738c72e
"
,
"One_Token20_Transfer"
:
"0x
5f126393985dba423b740cad1ffd105d63905aa6
"
,
"One_Token721_Transfer"
:
"0x
92b28beb872f81aaad3f111cffab1ba10fec6918
"
,
"One_Token721_Transfer"
:
"0x
d4b3b40c2b53ea256af8606c711538bfb6eb14a0
"
,
"Read_Chain"
:
"0x
00059658a96be67f1412f607549eeaee4a81ec87
"
,
"Read_Chain"
:
"0x
5b42b6bda3d6ea631dfd5b9a64e0816c03d13e44
"
,
"Read_Write"
:
"0x
1c585fd816923a5957024ab3fd8fcfb74f6235da
"
,
"Read_Write"
:
"0x
cad5fbc5966f72efa1a4b0cc6c342bce20c73682
"
,
"Token20_Transfer"
:
"0x2
5ed0c6762f49fcf532fb01152ae79088576bfee
"
,
"Token20_Transfer"
:
"0x2
17dca03b245abc49a4661cd10f890cc07b4b374
"
,
"Token721_Transfer"
:
"0x
bcb1513c82bb21db13b1b21ee696e36a984351af
"
,
"Token721_Transfer"
:
"0x
4169a1d185869ef9c6153d964fcfd155496cf903
"
,
"Two_Coin_Transfer"
:
"0x
761405065d3cd84fb5ef7aed0dc24ae6a5768f83
"
,
"Two_Coin_Transfer"
:
"0x
55dbf6b2c432094dfaace8d3fbdc6d8d486c6789
"
,
"Two_Token20_Transfer"
:
"0x
ef86469624825bd005c3f505637ab58435e32443
"
,
"Two_Token20_Transfer"
:
"0x
f016b61f45e21345c80bd98142c7abc1f2369ccb
"
,
"Two_Token721_Transfer"
:
"0x
2c046c47053f696a9b09cd5c14c7367c24976643
"
"Two_Token721_Transfer"
:
"0x
1bf3024b501cab75e7659a5564e35dfa02bc0370
"
},
},
{
{
"Coin_Transfer"
:
"0x
199a64a59cf31711854724bd95ee40860e9ce79d
"
,
"Coin_Transfer"
:
"0x
fd4e1842dee40e3659569a2994c44ad81c588b82
"
,
"ERC20"
:
"0x
c9f6def8a5925f8c87bda1ce5993f123f39d6278
"
,
"ERC20"
:
"0x
ad1ba974bd3bc14556cc884991823223c92b98b6
"
,
"ERC721"
:
"0x
74c9a17590f80b321560c38237438fbdeee067a9
"
,
"ERC721"
:
"0x
450260F10b2D55b785037388fA3aA3b2232cC9F4
"
,
"One_Coin_Transfer"
:
"0x
998cc9e89cfa8dd01125bdbf7d84682c9cd49d59
"
,
"One_Coin_Transfer"
:
"0x
5ccbafa9811a3a315e1f7c05b80337ec95f69e51
"
,
"One_Read_Write"
:
"0x72f
fc41d0c84a2da43298ac11bea906fa8b98dfd
"
,
"One_Read_Write"
:
"0x72f
c53dc11970380b4b48c4a5f66fa97227918d5
"
,
"One_Token20_Transfer"
:
"0x
b2cd516623cd57bee80820079829e2ba520923b1
"
,
"One_Token20_Transfer"
:
"0x
c7e40a453efefae4bd5eab74b6d242286b75ff85
"
,
"One_Token721_Transfer"
:
"0x
481d353bd1ea858f9f4adb09cab4e1a34a0bdd4a
"
,
"One_Token721_Transfer"
:
"0x
1a384b70ef274a681eecf5ae680041893bf0563c
"
,
"Read_Chain"
:
"0x2
48c19ea5448a69aebf02a910acc5f3369b64da2
"
,
"Read_Chain"
:
"0x2
2f8e10b428c801dde2ec902c788657fd6ecff27
"
,
"Read_Write"
:
"0x
062d6800dd115b471ec6600847d9d5696921859e
"
,
"Read_Write"
:
"0x
9c929501bb92a36355356881d8d2ed56667881f3
"
,
"Token20_Transfer"
:
"0x
03a3b76019a43fb683c63b5dc083770cad93257
5"
,
"Token20_Transfer"
:
"0x
ddf839293a5056e3b41f4599b63e9b6d2db8036
5"
,
"Token721_Transfer"
:
"0x
c3a738b7083f6014afa9317061623bdb083b6068
"
,
"Token721_Transfer"
:
"0x
41a48d703f0aec53ca698c7ee5077069c69e9efe
"
,
"Two_Coin_Transfer"
:
"0x
befc6e7134b2ad9cad38ff65d9cff1f70bec1eb0
"
,
"Two_Coin_Transfer"
:
"0x
46725530114818f36ab574a6844b7d93e7b23e2e
"
,
"Two_Token20_Transfer"
:
"0x
618defb1a892882a260affaf01fef35967a8f2c0
"
,
"Two_Token20_Transfer"
:
"0x
5f0294fe1bbcf708a3cda7dd1cc86ceb44aa16ed
"
,
"Two_Token721_Transfer"
:
"0x
7d9c6229b37d9afabfbc1311fd9378d3b062e071
"
"Two_Token721_Transfer"
:
"0x
69d7bed3eeeba10d7fe5a47221b7484816250055
"
},
},
{
{
"Coin_Transfer"
:
"0x
d6926ea20837af80216bcdb31ae4cc4e0c22cfa7
"
,
"Coin_Transfer"
:
"0x
15a973b26eddf34727d6cbd85c689eabd1b0ea12
"
,
"ERC20"
:
"0x
2f9a4f45efb059d8c8ba55d4aa7249ddb85e00a7
"
,
"ERC20"
:
"0x
e5ea1be6856130dfed8baba94e8e3e667d7a5641
"
,
"ERC721"
:
"0x
3af47a08f0e2aaa2966c5216586ebec840aa03d7
"
,
"ERC721"
:
"0x
f7c49C0264204f8346F659a4BB729567f0081daE
"
,
"One_Coin_Transfer"
:
"0x
49a3eadf8ea8a74fcdb7a0edf5bb9024103b5e06
"
,
"One_Coin_Transfer"
:
"0x
afc5b39e4f702316fa822bd7168645cdff22c6d8
"
,
"One_Read_Write"
:
"0x
acf8f258ddd4224169ab09e0ddbd0657bc930ae3
"
,
"One_Read_Write"
:
"0x
f862f78ff1e10590248c9baa5bafa84d3e33148c
"
,
"One_Token20_Transfer"
:
"0x
d8779b3af0c92c0e0479d855c368a4838b9dc38c
"
,
"One_Token20_Transfer"
:
"0x
349c6d13ba2091f0317e8622c59c5d933ec53f7d
"
,
"One_Token721_Transfer"
:
"0x
e35b102f1541427fde3843ac9c868c17c3bd0e7e
"
,
"One_Token721_Transfer"
:
"0x
82284e4df1e2ad4f30c9df610e27550e53320b63
"
,
"Read_Chain"
:
"0x3
278a598ff92a0eecc799379d89eeef539b4b92e
"
,
"Read_Chain"
:
"0x3
7019503113a937d3afda0f8d586a326cfe589da
"
,
"Read_Write"
:
"0x
856edcb2fba59e363e6dfa4b9f4a9cf07acef233
"
,
"Read_Write"
:
"0x
f156c92b515402cd9a0e6c9574938bf36964bc9c
"
,
"Token20_Transfer"
:
"0x
b8c555522603fe1471d5d4d5b6c3262d3fd8f1d1
"
,
"Token20_Transfer"
:
"0x
8585f124527624e878c862b6126dc40432809644
"
,
"Token721_Transfer"
:
"0x
260c7c47d66de45c3c3650c0ce1614cecee0a33a
"
,
"Token721_Transfer"
:
"0x
b829a81cb13f01c59ac28452794516707400a850
"
,
"Two_Coin_Transfer"
:
"0x
843e194a3b17893bfcaef174d21670c96936b7c7
"
,
"Two_Coin_Transfer"
:
"0x
f6e6be579f0bc80554cde98e441dbc424e848a81
"
,
"Two_Token20_Transfer"
:
"0x
19607465a18eaafdbc43616b1c47971e24ce9be
8"
,
"Two_Token20_Transfer"
:
"0x
3ccaaf61a375be2ae88fcbed9a87b4ed1b45181
8"
,
"Two_Token721_Transfer"
:
"0x
5ffde14f7708192924061fbcab7e205b3e23389d
"
"Two_Token721_Transfer"
:
"0x
be9f151c8ba8262e6aceb8e1f57f4280ba8bf907
"
},
},
{
{
"Coin_Transfer"
:
"0x
2087087f43ece5d2e664948fd37a545227a3d2c3
"
,
"Coin_Transfer"
:
"0x
7172b82c77f84caffe98b1a60b666a579ede033f
"
,
"ERC20"
:
"0x
d525c201cc74ea999024d5dc588aa295a179a490
"
,
"ERC20"
:
"0x
07961ad0013c843966731f42f9ba0dc4d218661b
"
,
"ERC721"
:
"0x
3b86dca4c2d3034d9cbb7305d65216d4b8c6fcab
"
,
"ERC721"
:
"0x
5F82Ca8b2D756749420709F7A216F57eC8043306
"
,
"One_Coin_Transfer"
:
"0x
b6127b1424cf450188bc92128f44af23f55f5001
"
,
"One_Coin_Transfer"
:
"0x
090012ad83fbbb14c63ac3da6ded8b17f9f90ade
"
,
"One_Read_Write"
:
"0x
65ff9d8c1a3f1789c63af043494da27061224ef0
"
,
"One_Read_Write"
:
"0x
f9fc7e5fec25c3671ff2b55f84a2aff0f309e252
"
,
"One_Token20_Transfer"
:
"0x
1463d05dc187dcbc79c459177e1ac36fb15b5c1b
"
,
"One_Token20_Transfer"
:
"0x
91e96b3e8232b61cbda3241948eb5c53b7001382
"
,
"One_Token721_Transfer"
:
"0x
f640c23d1f11a2620fb7614cda5ede491cf030e2
"
,
"One_Token721_Transfer"
:
"0x
06ccfdeb8c4eaffc7cf839f45ff158845abf66dd
"
,
"Read_Chain"
:
"0x
b5dce387d019eacf80e74dd41d1cc420ea18ed62
"
,
"Read_Chain"
:
"0x
08ae8a0a2000b39f8472b61a8063ef016e8d73a6
"
,
"Read_Write"
:
"0x
6aad3c0c3693eefbf7936071e9781eb38d8faa3c
"
,
"Read_Write"
:
"0x
b147a01cf3e83c6514a0ccdec402612c47f97de8
"
,
"Token20_Transfer"
:
"0x
1f4479fadfdcb2073c737e34c7846444a5410e61
"
,
"Token20_Transfer"
:
"0x
0c18d08c20acceae425458b2b186aa70632d3b25
"
,
"Token721_Transfer"
:
"0x
cca54db68e5b35965889a937700453d3ba6afd0c
"
,
"Token721_Transfer"
:
"0x
edb8bea3b505f41d778e5e4e016a68176fdebb50
"
,
"Two_Coin_Transfer"
:
"0x
0dad99bdd3f9800b310290bea136d75b0ab0452b
"
,
"Two_Coin_Transfer"
:
"0x
b70f158bee8ee10d68ab3ff4236ff6d08e31ce50
"
,
"Two_Token20_Transfer"
:
"0x5
43249f421bdd84acf07e338bf2eedd2a56288ee
"
,
"Two_Token20_Transfer"
:
"0x5
138395a30b8338fd6e78e76adba7aeac0087944
"
,
"Two_Token721_Transfer"
:
"0xc
c736b124c6306c9efcf392fa36946be73998184
"
"Two_Token721_Transfer"
:
"0xc
29d555448a0ebb176e81bc0d6bfeeaba7d2f177
"
},
},
{
{
"Coin_Transfer"
:
"0xef1f9e4fd4df554666f713de61082c932cd99a6b"
,
"Coin_Transfer"
:
"0xfe178e9eab1c124b2eec9dcd6ac8711addcfcd1c"
,
"ERC20"
:
"0xf08e69fe1ab2c5510572004994b3b21184ce2ec5"
,
"ERC20"
:
"0x739bcc47af1794e44bc15a3edc7bc157e15df012"
,
"ERC721"
:
"0xdebe8c2f54c5d9b1d01204bdf13f05ca1f544823"
,
"ERC721"
:
"0x60e35B92C0b616E2786A22598460ee9B97DdBF86"
,
"One_Coin_Transfer"
:
"0xf23ebe5bcaf7cd48a058ae788402b466acb9e485"
,
"One_Coin_Transfer"
:
"0x5d6a15ce48a01fc40cce2b67b28f043e214f37ad"
,
"One_Read_Write"
:
"0xd1e3dcf92fa55b129b801c0c466d579807db2abf"
,
"One_Read_Write"
:
"0x302211cfdcd202b2679b5af30abd47e01b1e8434"
,
"One_Token20_Transfer"
:
"0xe568572af884ce17193f123a6e8bc3bc5e1f46d0"
,
"One_Token20_Transfer"
:
"0x368582fb44ac0263e5f7af3b9b77747aaab73977"
,
"One_Token721_Transfer"
:
"0xb28491d1feea0e033e30a6375f7f101f7524f0ee"
,
"One_Token721_Transfer"
:
"0x1498fe5416f654522511958430d436d852944116"
,
"Read_Chain"
:
"0x6603fbd5f2ce59aaf6052306ec2191b943430d58"
,
"Read_Chain"
:
"0x79802c8bd4f85703cc41935aa978485257c09c16"
,
"Read_Write"
:
"0xde9fb7b2a9403bd1fc9f9df221982f7f248f78a3"
,
"Read_Write"
:
"0x63dac1be62787dd59dab7a2faabacd8d34d86da8"
,
"Token20_Transfer"
:
"0x7864c5110c2a64beca6f7d76917b9c77bce3f1aa"
,
"Token20_Transfer"
:
"0x3849c9ddf95abd07e03ecd9cf24542d4f9f22499"
,
"Token721_Transfer"
:
"0x8e0fada295ba4af825405589b98662ccce64cd86"
,
"Token721_Transfer"
:
"0x9e984435a395b25c0f27b1aece334dfe02c0485a"
,
"Two_Coin_Transfer"
:
"0x30cd1af092e88296f853075fe64f08630bf6c77d"
,
"Two_Coin_Transfer"
:
"0x0ced6919a38fa91b6b6927fc1f15e0c569c68a68"
,
"Two_Token20_Transfer"
:
"0xb62f8d496749887d44d8a22165a657080c0d6bb9"
,
"Two_Token20_Transfer"
:
"0x53eb1be5898698bdf37a888f3e0318ca92cc998c"
,
"Two_Token721_Transfer"
:
"0xba15959dd5a69b6c0528bcdeee70177e6953f27c"
"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
contract_abi/erc721_transfer/abi_bin/ERC721.abi
View file @
c72a9be3
[{"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"}]
[{"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
\ No newline at end of file
contract_abi/erc721_transfer/abi_bin/ERC721.bin
View file @
c72a9be3
60806040523480156200001157600080fd5b5060405162002b1a38038062002b1a8339818101604052810190620000379190620001f6565b8160009081620000489190620004c6565b5080600190816200005a9190620004c6565b505050620005ad565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620000cc8262000081565b810181811067ffffffffffffffff82111715620000ee57620000ed62000092565b5b80604052505050565b60006200010362000063565b9050620001118282620000c1565b919050565b600067ffffffffffffffff82111562000134576200013362000092565b5b6200013f8262000081565b9050602081019050919050565b60005b838110156200016c5780820151818401526020810190506200014f565b60008484015250505050565b60006200018f620001898462000116565b620000f7565b905082815260208101848484011115620001ae57620001ad6200007c565b5b620001bb8482856200014c565b509392505050565b600082601f830112620001db57620001da62000077565b5b8151620001ed84826020860162000178565b91505092915050565b6000806040838503121562000210576200020f6200006d565b5b600083015167ffffffffffffffff81111562000231576200023062000072565b5b6200023f85828601620001c3565b925050602083015167ffffffffffffffff81111562000263576200026262000072565b5b6200027185828601620001c3565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002ce57607f821691505b602082108103620002e457620002e362000286565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200034e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200030f565b6200035a86836200030f565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003a7620003a16200039b8462000372565b6200037c565b62000372565b9050919050565b6000819050919050565b620003c38362000386565b620003db620003d282620003ae565b8484546200031c565b825550505050565b600090565b620003f2620003e3565b620003ff818484620003b8565b505050565b5b8181101562000427576200041b600082620003e8565b60018101905062000405565b5050565b601f82111562000476576200044081620002ea565b6200044b84620002ff565b810160208510156200045b578190505b620004736200046a85620002ff565b83018262000404565b50505b505050565b600082821c905092915050565b60006200049b600019846008026200047b565b1980831691505092915050565b6000620004b6838362000488565b9150826002028217905092915050565b620004d1826200027b565b67ffffffffffffffff811115620004ed57620004ec62000092565b5b620004f98254620002b5565b620005068282856200042b565b600060209050601f8311600181146200053e576000841562000529578287015190505b620005358582620004a8565b865550620005a5565b601f1984166200054e86620002ea565b60005b82811015620005785784890151825560018201915060208501945060208101905062000551565b8683101562000598578489015162000594601f89168262000488565b8355505b6001600288020188555050505b505050505050565b61255d80620005bd6000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806357b375f411610097578063a22cb46511610066578063a22cb46514610282578063b88d4fde1461029e578063c87b56dd146102ba578063e985e9c5146102ea576100f5565b806357b375f4146101e85780636352211e1461020457806370a082311461023457806395d89b4114610264576100f5565b8063095ea7b3116100d3578063095ea7b31461017857806323b872dd1461019457806340c10f19146101b057806342842e0e146101cc576100f5565b806301ffc9a7146100fa57806306fdde031461012a578063081812fc14610148575b600080fd5b610114600480360381019061010f9190611806565b61031a565b604051610121919061184e565b60405180910390f35b6101326103fc565b60405161013f91906118f9565b60405180910390f35b610162600480360381019061015d9190611951565b61048e565b60405161016f91906119bf565b60405180910390f35b610192600480360381019061018d9190611a06565b6104d4565b005b6101ae60048036038101906101a99190611a46565b6105eb565b005b6101ca60048036038101906101c59190611a06565b61064b565b005b6101e660048036038101906101e19190611a46565b610659565b005b61020260048036038101906101fd9190611ac5565b610679565b005b61021e60048036038101906102199190611951565b610689565b60405161022b91906119bf565b60405180910390f35b61024e60048036038101906102499190611b18565b61070f565b60405161025b9190611b54565b60405180910390f35b61026c6107c6565b60405161027991906118f9565b60405180910390f35b61029c60048036038101906102979190611b6f565b610858565b005b6102b860048036038101906102b39190611ce4565b61086e565b005b6102d460048036038101906102cf9190611951565b6108d0565b6040516102e191906118f9565b60405180910390f35b61030460048036038101906102ff9190611d67565b610938565b604051610311919061184e565b60405180910390f35b60007fd71f2d39000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806103e557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806103f557506103f4826109cc565b5b9050919050565b60606000805461040b90611dd6565b80601f016020809104026020016040519081016040528092919081815260200182805461043790611dd6565b80156104845780601f1061045957610100808354040283529160200191610484565b820191906000526020600020905b81548152906001019060200180831161046757829003601f168201915b5050505050905090565b600061049982610a36565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006104df82610689565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361054f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161054690611e79565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661056e610a81565b73ffffffffffffffffffffffffffffffffffffffff16148061059d575061059c81610597610a81565b610938565b5b6105dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d390611f0b565b60405180910390fd5b6105e68383610a89565b505050565b6105fc6105f6610a81565b82610b42565b61063b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063290611f9d565b60405180910390fd5b610646838383610bd7565b505050565b6106558282610ed0565b5050565b6106748383836040518060200160405280600081525061086e565b505050565b610684838383610eee565b505050565b6000806106958361105a565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610706576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106fd90612009565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361077f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107769061209b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600180546107d590611dd6565b80601f016020809104026020016040519081016040528092919081815260200182805461080190611dd6565b801561084e5780601f106108235761010080835404028352916020019161084e565b820191906000526020600020905b81548152906001019060200180831161083157829003601f168201915b5050505050905090565b61086a610863610a81565b8383610eee565b5050565b61087f610879610a81565b83610b42565b6108be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b590611f9d565b60405180910390fd5b6108ca84848484611097565b50505050565b60606108db82610a36565b60006108e56110f3565b905060008151116109055760405180602001604052806000815250610930565b8061090f8461110a565b6040516020016109209291906120f7565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610a3f816111d8565b610a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7590612009565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610afc83610689565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610b4e83610689565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610b905750610b8f8185610938565b5b80610bce57508373ffffffffffffffffffffffffffffffffffffffff16610bb68461048e565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610bf782610689565b73ffffffffffffffffffffffffffffffffffffffff1614610c4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c449061218d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb39061221f565b60405180910390fd5b610cc98383836001611219565b8273ffffffffffffffffffffffffffffffffffffffff16610ce982610689565b73ffffffffffffffffffffffffffffffffffffffff1614610d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d369061218d565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610ecb838383600161121f565b505050565b610eea828260405180602001604052806000815250611225565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f539061228b565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161104d919061184e565b60405180910390a3505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6110a2848484610bd7565b6110ae84848484611280565b6110ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e49061231d565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b60606000600161111984611407565b01905060008167ffffffffffffffff81111561113857611137611bb9565b5b6040519080825280601f01601f19166020018201604052801561116a5781602001600182028036833780820191505090505b509050600082602001820190505b6001156111cd578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816111c1576111c061233d565b5b04945060008503611178575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166111fa8361105a565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b50505050565b50505050565b61122f838361155a565b61123c6000848484611280565b61127b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112729061231d565b60405180910390fd5b505050565b60006112a18473ffffffffffffffffffffffffffffffffffffffff16611777565b156113fa578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026112ca610a81565b8786866040518563ffffffff1660e01b81526004016112ec94939291906123c1565b6020604051808303816000875af192505050801561132857506040513d601f19601f820116820180604052508101906113259190612422565b60015b6113aa573d8060008114611358576040519150601f19603f3d011682016040523d82523d6000602084013e61135d565b606091505b5060008151036113a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113999061231d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506113ff565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611465577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161145b5761145a61233d565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106114a2576d04ee2d6d415b85acef810000000083816114985761149761233d565b5b0492506020810190505b662386f26fc1000083106114d157662386f26fc1000083816114c7576114c661233d565b5b0492506010810190505b6305f5e10083106114fa576305f5e10083816114f0576114ef61233d565b5b0492506008810190505b612710831061151f5761271083816115155761151461233d565b5b0492506004810190505b6064831061154257606483816115385761153761233d565b5b0492506002810190505b600a8310611551576001810190505b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c09061249b565b60405180910390fd5b6115d2816111d8565b15611612576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160990612507565b60405180910390fd5b611620600083836001611219565b611629816111d8565b15611669576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166090612507565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461177360008383600161121f565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6117e3816117ae565b81146117ee57600080fd5b50565b600081359050611800816117da565b92915050565b60006020828403121561181c5761181b6117a4565b5b600061182a848285016117f1565b91505092915050565b60008115159050919050565b61184881611833565b82525050565b6000602082019050611863600083018461183f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156118a3578082015181840152602081019050611888565b60008484015250505050565b6000601f19601f8301169050919050565b60006118cb82611869565b6118d58185611874565b93506118e5818560208601611885565b6118ee816118af565b840191505092915050565b6000602082019050818103600083015261191381846118c0565b905092915050565b6000819050919050565b61192e8161191b565b811461193957600080fd5b50565b60008135905061194b81611925565b92915050565b600060208284031215611967576119666117a4565b5b60006119758482850161193c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119a98261197e565b9050919050565b6119b98161199e565b82525050565b60006020820190506119d460008301846119b0565b92915050565b6119e38161199e565b81146119ee57600080fd5b50565b600081359050611a00816119da565b92915050565b60008060408385031215611a1d57611a1c6117a4565b5b6000611a2b858286016119f1565b9250506020611a3c8582860161193c565b9150509250929050565b600080600060608486031215611a5f57611a5e6117a4565b5b6000611a6d868287016119f1565b9350506020611a7e868287016119f1565b9250506040611a8f8682870161193c565b9150509250925092565b611aa281611833565b8114611aad57600080fd5b50565b600081359050611abf81611a99565b92915050565b600080600060608486031215611ade57611add6117a4565b5b6000611aec868287016119f1565b9350506020611afd868287016119f1565b9250506040611b0e86828701611ab0565b9150509250925092565b600060208284031215611b2e57611b2d6117a4565b5b6000611b3c848285016119f1565b91505092915050565b611b4e8161191b565b82525050565b6000602082019050611b696000830184611b45565b92915050565b60008060408385031215611b8657611b856117a4565b5b6000611b94858286016119f1565b9250506020611ba585828601611ab0565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611bf1826118af565b810181811067ffffffffffffffff82111715611c1057611c0f611bb9565b5b80604052505050565b6000611c2361179a565b9050611c2f8282611be8565b919050565b600067ffffffffffffffff821115611c4f57611c4e611bb9565b5b611c58826118af565b9050602081019050919050565b82818337600083830152505050565b6000611c87611c8284611c34565b611c19565b905082815260208101848484011115611ca357611ca2611bb4565b5b611cae848285611c65565b509392505050565b600082601f830112611ccb57611cca611baf565b5b8135611cdb848260208601611c74565b91505092915050565b60008060008060808587031215611cfe57611cfd6117a4565b5b6000611d0c878288016119f1565b9450506020611d1d878288016119f1565b9350506040611d2e8782880161193c565b925050606085013567ffffffffffffffff811115611d4f57611d4e6117a9565b5b611d5b87828801611cb6565b91505092959194509250565b60008060408385031215611d7e57611d7d6117a4565b5b6000611d8c858286016119f1565b9250506020611d9d858286016119f1565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611dee57607f821691505b602082108103611e0157611e00611da7565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000611e63602183611874565b9150611e6e82611e07565b604082019050919050565b60006020820190508181036000830152611e9281611e56565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000611ef5603d83611874565b9150611f0082611e99565b604082019050919050565b60006020820190508181036000830152611f2481611ee8565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000611f87602d83611874565b9150611f9282611f2b565b604082019050919050565b60006020820190508181036000830152611fb681611f7a565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000611ff3601883611874565b9150611ffe82611fbd565b602082019050919050565b6000602082019050818103600083015261202281611fe6565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612085602983611874565b915061209082612029565b604082019050919050565b600060208201905081810360008301526120b481612078565b9050919050565b600081905092915050565b60006120d182611869565b6120db81856120bb565b93506120eb818560208601611885565b80840191505092915050565b600061210382856120c6565b915061210f82846120c6565b91508190509392505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000612177602583611874565b91506121828261211b565b604082019050919050565b600060208201905081810360008301526121a68161216a565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612209602483611874565b9150612214826121ad565b604082019050919050565b60006020820190508181036000830152612238816121fc565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000612275601983611874565b91506122808261223f565b602082019050919050565b600060208201905081810360008301526122a481612268565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000612307603283611874565b9150612312826122ab565b604082019050919050565b60006020820190508181036000830152612336816122fa565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006123938261236c565b61239d8185612377565b93506123ad818560208601611885565b6123b6816118af565b840191505092915050565b60006080820190506123d660008301876119b0565b6123e360208301866119b0565b6123f06040830185611b45565b81810360608301526124028184612388565b905095945050505050565b60008151905061241c816117da565b92915050565b600060208284031215612438576124376117a4565b5b60006124468482850161240d565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000612485602083611874565b91506124908261244f565b602082019050919050565b600060208201905081810360008301526124b481612478565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006124f1601c83611874565b91506124fc826124bb565b602082019050919050565b60006020820190508181036000830152612520816124e4565b905091905056fea26469706673582212208655a8511f8c201e91cddfc952bc583127b2df096e2ee26cbc1f2f344df0735264736f6c63430008130033
60806040523480156200001157600080fd5b5060405162002cf138038062002cf18339818101604052810190620000379190620001f6565b8160009081620000489190620004c6565b5080600190816200005a9190620004c6565b505050620005ad565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620000cc8262000081565b810181811067ffffffffffffffff82111715620000ee57620000ed62000092565b5b80604052505050565b60006200010362000063565b9050620001118282620000c1565b919050565b600067ffffffffffffffff82111562000134576200013362000092565b5b6200013f8262000081565b9050602081019050919050565b60005b838110156200016c5780820151818401526020810190506200014f565b60008484015250505050565b60006200018f620001898462000116565b620000f7565b905082815260208101848484011115620001ae57620001ad6200007c565b5b620001bb8482856200014c565b509392505050565b600082601f830112620001db57620001da62000077565b5b8151620001ed84826020860162000178565b91505092915050565b6000806040838503121562000210576200020f6200006d565b5b600083015167ffffffffffffffff81111562000231576200023062000072565b5b6200023f85828601620001c3565b925050602083015167ffffffffffffffff81111562000263576200026262000072565b5b6200027185828601620001c3565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002ce57607f821691505b602082108103620002e457620002e362000286565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200034e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200030f565b6200035a86836200030f565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003a7620003a16200039b8462000372565b6200037c565b62000372565b9050919050565b6000819050919050565b620003c38362000386565b620003db620003d282620003ae565b8484546200031c565b825550505050565b600090565b620003f2620003e3565b620003ff818484620003b8565b505050565b5b8181101562000427576200041b600082620003e8565b60018101905062000405565b5050565b601f82111562000476576200044081620002ea565b6200044b84620002ff565b810160208510156200045b578190505b620004736200046a85620002ff565b83018262000404565b50505b505050565b600082821c905092915050565b60006200049b600019846008026200047b565b1980831691505092915050565b6000620004b6838362000488565b9150826002028217905092915050565b620004d1826200027b565b67ffffffffffffffff811115620004ed57620004ec62000092565b5b620004f98254620002b5565b620005068282856200042b565b600060209050601f8311600181146200053e576000841562000529578287015190505b620005358582620004a8565b865550620005a5565b601f1984166200054e86620002ea565b60005b82811015620005785784890151825560018201915060208501945060208101905062000551565b8683101562000598578489015162000594601f89168262000488565b8355505b6001600288020188555050505b505050505050565b61273480620005bd6000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c806357b375f411610097578063a22cb46511610066578063a22cb465146102a9578063b88d4fde146102c5578063c87b56dd146102e1578063e985e9c51461031157610100565b806357b375f41461020f5780636352211e1461022b57806370a082311461025b57806395d89b411461028b57610100565b806323b872dd116100d357806323b872dd1461019f57806340c10f19146101bb57806342842e0e146101d75780634684d7e9146101f357610100565b806301ffc9a71461010557806306fdde0314610135578063081812fc14610153578063095ea7b314610183575b600080fd5b61011f600480360381019061011a9190611877565b610341565b60405161012c91906118bf565b60405180910390f35b61013d610423565b60405161014a919061196a565b60405180910390f35b61016d600480360381019061016891906119c2565b6104b5565b60405161017a9190611a30565b60405180910390f35b61019d60048036038101906101989190611a77565b6104fb565b005b6101b960048036038101906101b49190611ab7565b610612565b005b6101d560048036038101906101d09190611a77565b610672565b005b6101f160048036038101906101ec9190611ab7565b610680565b005b61020d60048036038101906102089190611b6f565b6106a0565b005b61022960048036038101906102249190611bfb565b6106ea565b005b610245600480360381019061024091906119c2565b6106fa565b6040516102529190611a30565b60405180910390f35b61027560048036038101906102709190611c4e565b610780565b6040516102829190611c8a565b60405180910390f35b610293610837565b6040516102a0919061196a565b60405180910390f35b6102c360048036038101906102be9190611ca5565b6108c9565b005b6102df60048036038101906102da9190611e15565b6108df565b005b6102fb60048036038101906102f691906119c2565b610941565b604051610308919061196a565b60405180910390f35b61032b60048036038101906103269190611e98565b6109a9565b60405161033891906118bf565b60405180910390f35b60007fd71f2d39000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061040c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061041c575061041b82610a3d565b5b9050919050565b60606000805461043290611f07565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611f07565b80156104ab5780601f10610480576101008083540402835291602001916104ab565b820191906000526020600020905b81548152906001019060200180831161048e57829003601f168201915b5050505050905090565b60006104c082610aa7565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610506826106fa565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056d90611faa565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610595610af2565b73ffffffffffffffffffffffffffffffffffffffff1614806105c457506105c3816105be610af2565b6109a9565b5b610603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105fa9061203c565b60405180910390fd5b61060d8383610afa565b505050565b61062361061d610af2565b82610bb3565b610662576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610659906120ce565b60405180910390fd5b61066d838383610c48565b505050565b61067c8282610f41565b5050565b61069b838383604051806020016040528060008152506108df565b505050565b60005b828290508110156106e4576106d1848484848181106106c5576106c46120ee565b5b90506020020135610f41565b80806106dc9061214c565b9150506106a3565b50505050565b6106f5838383610f5f565b505050565b600080610706836110cb565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076e906121e0565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036107f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e790612272565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60606001805461084690611f07565b80601f016020809104026020016040519081016040528092919081815260200182805461087290611f07565b80156108bf5780601f10610894576101008083540402835291602001916108bf565b820191906000526020600020905b8154815290600101906020018083116108a257829003601f168201915b5050505050905090565b6108db6108d4610af2565b8383610f5f565b5050565b6108f06108ea610af2565b83610bb3565b61092f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610926906120ce565b60405180910390fd5b61093b84848484611108565b50505050565b606061094c82610aa7565b6000610956611164565b9050600081511161097657604051806020016040528060008152506109a1565b806109808461117b565b6040516020016109919291906122ce565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610ab081611249565b610aef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae6906121e0565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610b6d836106fa565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610bbf836106fa565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610c015750610c0081856109a9565b5b80610c3f57508373ffffffffffffffffffffffffffffffffffffffff16610c27846104b5565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610c68826106fa565b73ffffffffffffffffffffffffffffffffffffffff1614610cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb590612364565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d24906123f6565b60405180910390fd5b610d3a838383600161128a565b8273ffffffffffffffffffffffffffffffffffffffff16610d5a826106fa565b73ffffffffffffffffffffffffffffffffffffffff1614610db0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da790612364565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f3c8383836001611290565b505050565b610f5b828260405180602001604052806000815250611296565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610fcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc490612462565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110be91906118bf565b60405180910390a3505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b611113848484610c48565b61111f848484846112f1565b61115e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611155906124f4565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b60606000600161118a84611478565b01905060008167ffffffffffffffff8111156111a9576111a8611cea565b5b6040519080825280601f01601f1916602001820160405280156111db5781602001600182028036833780820191505090505b509050600082602001820190505b60011561123e578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161123257611231612514565b5b049450600085036111e9575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff1661126b836110cb565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b50505050565b50505050565b6112a083836115cb565b6112ad60008484846112f1565b6112ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e3906124f4565b60405180910390fd5b505050565b60006113128473ffffffffffffffffffffffffffffffffffffffff166117e8565b1561146b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261133b610af2565b8786866040518563ffffffff1660e01b815260040161135d9493929190612598565b6020604051808303816000875af192505050801561139957506040513d601f19601f8201168201806040525081019061139691906125f9565b60015b61141b573d80600081146113c9576040519150601f19603f3d011682016040523d82523d6000602084013e6113ce565b606091505b506000815103611413576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140a906124f4565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611470565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106114d6577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816114cc576114cb612514565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611513576d04ee2d6d415b85acef8100000000838161150957611508612514565b5b0492506020810190505b662386f26fc10000831061154257662386f26fc10000838161153857611537612514565b5b0492506010810190505b6305f5e100831061156b576305f5e100838161156157611560612514565b5b0492506008810190505b612710831061159057612710838161158657611585612514565b5b0492506004810190505b606483106115b357606483816115a9576115a8612514565b5b0492506002810190505b600a83106115c2576001810190505b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361163a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163190612672565b60405180910390fd5b61164381611249565b15611683576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167a906126de565b60405180910390fd5b61169160008383600161128a565b61169a81611249565b156116da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d1906126de565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46117e4600083836001611290565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6118548161181f565b811461185f57600080fd5b50565b6000813590506118718161184b565b92915050565b60006020828403121561188d5761188c611815565b5b600061189b84828501611862565b91505092915050565b60008115159050919050565b6118b9816118a4565b82525050565b60006020820190506118d460008301846118b0565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156119145780820151818401526020810190506118f9565b60008484015250505050565b6000601f19601f8301169050919050565b600061193c826118da565b61194681856118e5565b93506119568185602086016118f6565b61195f81611920565b840191505092915050565b600060208201905081810360008301526119848184611931565b905092915050565b6000819050919050565b61199f8161198c565b81146119aa57600080fd5b50565b6000813590506119bc81611996565b92915050565b6000602082840312156119d8576119d7611815565b5b60006119e6848285016119ad565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611a1a826119ef565b9050919050565b611a2a81611a0f565b82525050565b6000602082019050611a456000830184611a21565b92915050565b611a5481611a0f565b8114611a5f57600080fd5b50565b600081359050611a7181611a4b565b92915050565b60008060408385031215611a8e57611a8d611815565b5b6000611a9c85828601611a62565b9250506020611aad858286016119ad565b9150509250929050565b600080600060608486031215611ad057611acf611815565b5b6000611ade86828701611a62565b9350506020611aef86828701611a62565b9250506040611b00868287016119ad565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f840112611b2f57611b2e611b0a565b5b8235905067ffffffffffffffff811115611b4c57611b4b611b0f565b5b602083019150836020820283011115611b6857611b67611b14565b5b9250929050565b600080600060408486031215611b8857611b87611815565b5b6000611b9686828701611a62565b935050602084013567ffffffffffffffff811115611bb757611bb661181a565b5b611bc386828701611b19565b92509250509250925092565b611bd8816118a4565b8114611be357600080fd5b50565b600081359050611bf581611bcf565b92915050565b600080600060608486031215611c1457611c13611815565b5b6000611c2286828701611a62565b9350506020611c3386828701611a62565b9250506040611c4486828701611be6565b9150509250925092565b600060208284031215611c6457611c63611815565b5b6000611c7284828501611a62565b91505092915050565b611c848161198c565b82525050565b6000602082019050611c9f6000830184611c7b565b92915050565b60008060408385031215611cbc57611cbb611815565b5b6000611cca85828601611a62565b9250506020611cdb85828601611be6565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611d2282611920565b810181811067ffffffffffffffff82111715611d4157611d40611cea565b5b80604052505050565b6000611d5461180b565b9050611d608282611d19565b919050565b600067ffffffffffffffff821115611d8057611d7f611cea565b5b611d8982611920565b9050602081019050919050565b82818337600083830152505050565b6000611db8611db384611d65565b611d4a565b905082815260208101848484011115611dd457611dd3611ce5565b5b611ddf848285611d96565b509392505050565b600082601f830112611dfc57611dfb611b0a565b5b8135611e0c848260208601611da5565b91505092915050565b60008060008060808587031215611e2f57611e2e611815565b5b6000611e3d87828801611a62565b9450506020611e4e87828801611a62565b9350506040611e5f878288016119ad565b925050606085013567ffffffffffffffff811115611e8057611e7f61181a565b5b611e8c87828801611de7565b91505092959194509250565b60008060408385031215611eaf57611eae611815565b5b6000611ebd85828601611a62565b9250506020611ece85828601611a62565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611f1f57607f821691505b602082108103611f3257611f31611ed8565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000611f946021836118e5565b9150611f9f82611f38565b604082019050919050565b60006020820190508181036000830152611fc381611f87565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000612026603d836118e5565b915061203182611fca565b604082019050919050565b6000602082019050818103600083015261205581612019565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006120b8602d836118e5565b91506120c38261205c565b604082019050919050565b600060208201905081810360008301526120e7816120ab565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006121578261198c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036121895761218861211d565b5b600182019050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006121ca6018836118e5565b91506121d582612194565b602082019050919050565b600060208201905081810360008301526121f9816121bd565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b600061225c6029836118e5565b915061226782612200565b604082019050919050565b6000602082019050818103600083015261228b8161224f565b9050919050565b600081905092915050565b60006122a8826118da565b6122b28185612292565b93506122c28185602086016118f6565b80840191505092915050565b60006122da828561229d565b91506122e6828461229d565b91508190509392505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061234e6025836118e5565b9150612359826122f2565b604082019050919050565b6000602082019050818103600083015261237d81612341565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006123e06024836118e5565b91506123eb82612384565b604082019050919050565b6000602082019050818103600083015261240f816123d3565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061244c6019836118e5565b915061245782612416565b602082019050919050565b6000602082019050818103600083015261247b8161243f565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006124de6032836118e5565b91506124e982612482565b604082019050919050565b6000602082019050818103600083015261250d816124d1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b600061256a82612543565b612574818561254e565b93506125848185602086016118f6565b61258d81611920565b840191505092915050565b60006080820190506125ad6000830187611a21565b6125ba6020830186611a21565b6125c76040830185611c7b565b81810360608301526125d9818461255f565b905095945050505050565b6000815190506125f38161184b565b92915050565b60006020828403121561260f5761260e611815565b5b600061261d848285016125e4565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061265c6020836118e5565b915061266782612626565b602082019050919050565b6000602082019050818103600083015261268b8161264f565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006126c8601c836118e5565b91506126d382612692565b602082019050919050565b600060208201905081810360008301526126f7816126bb565b905091905056fea26469706673582212201043a78e09b47736c056c4a25b4904389874842b94452f3305f64e642dd7d19364736f6c63430008130033
\ No newline at end of file
\ No newline at end of file
contract_abi/erc721_transfer/compile/ERC721.go
View file @
c72a9be3
...
@@ -30,8 +30,8 @@ var (
...
@@ -30,8 +30,8 @@ var (
// ERC721MetaData contains all meta data concerning the ERC721 contract.
// ERC721MetaData contains all meta data concerning the ERC721 contract.
var
ERC721MetaData
=
&
bind
.
MetaData
{
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
\"
}]"
,
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
:
"0x60806040523480156200001157600080fd5b5060405162002
b1a38038062002b1a8339818101604052810190620000379190620001f6565b8160009081620000489190620004c6565b5080600190816200005a9190620004c6565b505050620005ad565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620000cc8262000081565b810181811067ffffffffffffffff82111715620000ee57620000ed62000092565b5b80604052505050565b60006200010362000063565b9050620001118282620000c1565b919050565b600067ffffffffffffffff82111562000134576200013362000092565b5b6200013f8262000081565b9050602081019050919050565b60005b838110156200016c5780820151818401526020810190506200014f565b60008484015250505050565b60006200018f620001898462000116565b620000f7565b905082815260208101848484011115620001ae57620001ad6200007c565b5b620001bb8482856200014c565b509392505050565b600082601f830112620001db57620001da62000077565b5b8151620001ed84826020860162000178565b91505092915050565b6000806040838503121562000210576200020f6200006d565b5b600083015167ffffffffffffffff81111562000231576200023062000072565b5b6200023f85828601620001c3565b925050602083015167ffffffffffffffff81111562000263576200026262000072565b5b6200027185828601620001c3565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002ce57607f821691505b602082108103620002e457620002e362000286565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200034e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200030f565b6200035a86836200030f565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003a7620003a16200039b8462000372565b6200037c565b62000372565b9050919050565b6000819050919050565b620003c38362000386565b620003db620003d282620003ae565b8484546200031c565b825550505050565b600090565b620003f2620003e3565b620003ff818484620003b8565b505050565b5b8181101562000427576200041b600082620003e8565b60018101905062000405565b5050565b601f82111562000476576200044081620002ea565b6200044b84620002ff565b810160208510156200045b578190505b620004736200046a85620002ff565b83018262000404565b50505b505050565b600082821c905092915050565b60006200049b600019846008026200047b565b1980831691505092915050565b6000620004b6838362000488565b9150826002028217905092915050565b620004d1826200027b565b67ffffffffffffffff811115620004ed57620004ec62000092565b5b620004f98254620002b5565b620005068282856200042b565b600060209050601f8311600181146200053e576000841562000529578287015190505b620005358582620004a8565b865550620005a5565b601f1984166200054e86620002ea565b60005b82811015620005785784890151825560018201915060208501945060208101905062000551565b8683101562000598578489015162000594601f89168262000488565b8355505b6001600288020188555050505b505050505050565b61255d80620005bd6000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806357b375f411610097578063a22cb46511610066578063a22cb46514610282578063b88d4fde1461029e578063c87b56dd146102ba578063e985e9c5146102ea576100f5565b806357b375f4146101e85780636352211e1461020457806370a082311461023457806395d89b4114610264576100f5565b8063095ea7b3116100d3578063095ea7b31461017857806323b872dd1461019457806340c10f19146101b057806342842e0e146101cc576100f5565b806301ffc9a7146100fa57806306fdde031461012a578063081812fc14610148575b600080fd5b610114600480360381019061010f9190611806565b61031a565b604051610121919061184e565b60405180910390f35b6101326103fc565b60405161013f91906118f9565b60405180910390f35b610162600480360381019061015d9190611951565b61048e565b60405161016f91906119bf565b60405180910390f35b610192600480360381019061018d9190611a06565b6104d4565b005b6101ae60048036038101906101a99190611a46565b6105eb565b005b6101ca60048036038101906101c59190611a06565b61064b565b005b6101e660048036038101906101e19190611a46565b610659565b005b61020260048036038101906101fd9190611ac5565b610679565b005b61021e60048036038101906102199190611951565b610689565b60405161022b91906119bf565b60405180910390f35b61024e60048036038101906102499190611b18565b61070f565b60405161025b9190611b54565b60405180910390f35b61026c6107c6565b60405161027991906118f9565b60405180910390f35b61029c60048036038101906102979190611b6f565b610858565b005b6102b860048036038101906102b39190611ce4565b61086e565b005b6102d460048036038101906102cf9190611951565b6108d0565b6040516102e191906118f9565b60405180910390f35b61030460048036038101906102ff9190611d67565b610938565b604051610311919061184e565b60405180910390f35b60007fd71f2d39000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806103e557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806103f557506103f4826109cc565b5b9050919050565b60606000805461040b90611dd6565b80601f016020809104026020016040519081016040528092919081815260200182805461043790611dd6565b80156104845780601f1061045957610100808354040283529160200191610484565b820191906000526020600020905b81548152906001019060200180831161046757829003601f168201915b5050505050905090565b600061049982610a36565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006104df82610689565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361054f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161054690611e79565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661056e610a81565b73ffffffffffffffffffffffffffffffffffffffff16148061059d575061059c81610597610a81565b610938565b5b6105dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d390611f0b565b60405180910390fd5b6105e68383610a89565b505050565b6105fc6105f6610a81565b82610b42565b61063b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063290611f9d565b60405180910390fd5b610646838383610bd7565b505050565b6106558282610ed0565b5050565b6106748383836040518060200160405280600081525061086e565b505050565b610684838383610eee565b505050565b6000806106958361105a565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610706576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106fd90612009565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361077f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107769061209b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600180546107d590611dd6565b80601f016020809104026020016040519081016040528092919081815260200182805461080190611dd6565b801561084e5780601f106108235761010080835404028352916020019161084e565b820191906000526020600020905b81548152906001019060200180831161083157829003601f168201915b5050505050905090565b61086a610863610a81565b8383610eee565b5050565b61087f610879610a81565b83610b42565b6108be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b590611f9d565b60405180910390fd5b6108ca84848484611097565b50505050565b60606108db82610a36565b60006108e56110f3565b905060008151116109055760405180602001604052806000815250610930565b8061090f8461110a565b6040516020016109209291906120f7565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610a3f816111d8565b610a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7590612009565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610afc83610689565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610b4e83610689565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610b905750610b8f8185610938565b5b80610bce57508373ffffffffffffffffffffffffffffffffffffffff16610bb68461048e565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610bf782610689565b73ffffffffffffffffffffffffffffffffffffffff1614610c4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c449061218d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb39061221f565b60405180910390fd5b610cc98383836001611219565b8273ffffffffffffffffffffffffffffffffffffffff16610ce982610689565b73ffffffffffffffffffffffffffffffffffffffff1614610d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d369061218d565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610ecb838383600161121f565b505050565b610eea828260405180602001604052806000815250611225565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f539061228b565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161104d919061184e565b60405180910390a3505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6110a2848484610bd7565b6110ae84848484611280565b6110ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e49061231d565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b60606000600161111984611407565b01905060008167ffffffffffffffff81111561113857611137611bb9565b5b6040519080825280601f01601f19166020018201604052801561116a5781602001600182028036833780820191505090505b509050600082602001820190505b6001156111cd578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816111c1576111c061233d565b5b04945060008503611178575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166111fa8361105a565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b50505050565b50505050565b61122f838361155a565b61123c6000848484611280565b61127b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112729061231d565b60405180910390fd5b505050565b60006112a18473ffffffffffffffffffffffffffffffffffffffff16611777565b156113fa578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026112ca610a81565b8786866040518563ffffffff1660e01b81526004016112ec94939291906123c1565b6020604051808303816000875af192505050801561132857506040513d601f19601f820116820180604052508101906113259190612422565b60015b6113aa573d8060008114611358576040519150601f19603f3d011682016040523d82523d6000602084013e61135d565b606091505b5060008151036113a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113999061231d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506113ff565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611465577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161145b5761145a61233d565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106114a2576d04ee2d6d415b85acef810000000083816114985761149761233d565b5b0492506020810190505b662386f26fc1000083106114d157662386f26fc1000083816114c7576114c661233d565b5b0492506010810190505b6305f5e10083106114fa576305f5e10083816114f0576114ef61233d565b5b0492506008810190505b612710831061151f5761271083816115155761151461233d565b5b0492506004810190505b6064831061154257606483816115385761153761233d565b5b0492506002810190505b600a8310611551576001810190505b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c09061249b565b60405180910390fd5b6115d2816111d8565b15611612576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160990612507565b60405180910390fd5b611620600083836001611219565b611629816111d8565b15611669576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166090612507565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461177360008383600161121f565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6117e3816117ae565b81146117ee57600080fd5b50565b600081359050611800816117da565b92915050565b60006020828403121561181c5761181b6117a4565b5b600061182a848285016117f1565b91505092915050565b60008115159050919050565b61184881611833565b82525050565b6000602082019050611863600083018461183f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156118a3578082015181840152602081019050611888565b60008484015250505050565b6000601f19601f8301169050919050565b60006118cb82611869565b6118d58185611874565b93506118e5818560208601611885565b6118ee816118af565b840191505092915050565b6000602082019050818103600083015261191381846118c0565b905092915050565b6000819050919050565b61192e8161191b565b811461193957600080fd5b50565b60008135905061194b81611925565b92915050565b600060208284031215611967576119666117a4565b5b60006119758482850161193c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119a98261197e565b9050919050565b6119b98161199e565b82525050565b60006020820190506119d460008301846119b0565b92915050565b6119e38161199e565b81146119ee57600080fd5b50565b600081359050611a00816119da565b92915050565b60008060408385031215611a1d57611a1c6117a4565b5b6000611a2b858286016119f1565b9250506020611a3c8582860161193c565b9150509250929050565b600080600060608486031215611a5f57611a5e6117a4565b5b6000611a6d868287016119f1565b9350506020611a7e868287016119f1565b9250506040611a8f8682870161193c565b9150509250925092565b611aa281611833565b8114611aad57600080fd5b50565b600081359050611abf81611a99565b92915050565b600080600060608486031215611ade57611add6117a4565b5b6000611aec868287016119f1565b9350506020611afd868287016119f1565b9250506040611b0e86828701611ab0565b9150509250925092565b600060208284031215611b2e57611b2d6117a4565b5b6000611b3c848285016119f1565b91505092915050565b611b4e8161191b565b82525050565b6000602082019050611b696000830184611b45565b92915050565b60008060408385031215611b8657611b856117a4565b5b6000611b94858286016119f1565b9250506020611ba585828601611ab0565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611bf1826118af565b810181811067ffffffffffffffff82111715611c1057611c0f611bb9565b5b80604052505050565b6000611c2361179a565b9050611c2f8282611be8565b919050565b600067ffffffffffffffff821115611c4f57611c4e611bb9565b5b611c58826118af565b9050602081019050919050565b82818337600083830152505050565b6000611c87611c8284611c34565b611c19565b905082815260208101848484011115611ca357611ca2611bb4565b5b611cae848285611c65565b509392505050565b600082601f830112611ccb57611cca611baf565b5b8135611cdb848260208601611c74565b91505092915050565b60008060008060808587031215611cfe57611cfd6117a4565b5b6000611d0c878288016119f1565b9450506020611d1d878288016119f1565b9350506040611d2e8782880161193c565b925050606085013567ffffffffffffffff811115611d4f57611d4e6117a9565b5b611d5b87828801611cb6565b91505092959194509250565b60008060408385031215611d7e57611d7d6117a4565b5b6000611d8c858286016119f1565b9250506020611d9d858286016119f1565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611dee57607f821691505b602082108103611e0157611e00611da7565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000611e63602183611874565b9150611e6e82611e07565b604082019050919050565b60006020820190508181036000830152611e9281611e56565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000611ef5603d83611874565b9150611f0082611e99565b604082019050919050565b60006020820190508181036000830152611f2481611ee8565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000611f87602d83611874565b9150611f9282611f2b565b604082019050919050565b60006020820190508181036000830152611fb681611f7a565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000611ff3601883611874565b9150611ffe82611fbd565b602082019050919050565b6000602082019050818103600083015261202281611fe6565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612085602983611874565b915061209082612029565b604082019050919050565b600060208201905081810360008301526120b481612078565b9050919050565b600081905092915050565b60006120d182611869565b6120db81856120bb565b93506120eb818560208601611885565b80840191505092915050565b600061210382856120c6565b915061210f82846120c6565b91508190509392505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000612177602583611874565b91506121828261211b565b604082019050919050565b600060208201905081810360008301526121a68161216a565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612209602483611874565b9150612214826121ad565b604082019050919050565b60006020820190508181036000830152612238816121fc565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000612275601983611874565b91506122808261223f565b602082019050919050565b600060208201905081810360008301526122a481612268565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000612307603283611874565b9150612312826122ab565b604082019050919050565b60006020820190508181036000830152612336816122fa565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006123938261236c565b61239d8185612377565b93506123ad818560208601611885565b6123b6816118af565b840191505092915050565b60006080820190506123d660008301876119b0565b6123e360208301866119b0565b6123f06040830185611b45565b81810360608301526124028184612388565b905095945050505050565b60008151905061241c816117da565b92915050565b600060208284031215612438576124376117a4565b5b60006124468482850161240d565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000612485602083611874565b91506124908261244f565b602082019050919050565b600060208201905081810360008301526124b481612478565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006124f1601c83611874565b91506124fc826124bb565b602082019050919050565b60006020820190508181036000830152612520816124e4565b905091905056fea26469706673582212208655a8511f8c201e91cddfc952bc583127b2df096e2ee26cbc1f2f344df07352
64736f6c63430008130033"
,
Bin
:
"0x60806040523480156200001157600080fd5b5060405162002
cf138038062002cf18339818101604052810190620000379190620001f6565b8160009081620000489190620004c6565b5080600190816200005a9190620004c6565b505050620005ad565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620000cc8262000081565b810181811067ffffffffffffffff82111715620000ee57620000ed62000092565b5b80604052505050565b60006200010362000063565b9050620001118282620000c1565b919050565b600067ffffffffffffffff82111562000134576200013362000092565b5b6200013f8262000081565b9050602081019050919050565b60005b838110156200016c5780820151818401526020810190506200014f565b60008484015250505050565b60006200018f620001898462000116565b620000f7565b905082815260208101848484011115620001ae57620001ad6200007c565b5b620001bb8482856200014c565b509392505050565b600082601f830112620001db57620001da62000077565b5b8151620001ed84826020860162000178565b91505092915050565b6000806040838503121562000210576200020f6200006d565b5b600083015167ffffffffffffffff81111562000231576200023062000072565b5b6200023f85828601620001c3565b925050602083015167ffffffffffffffff81111562000263576200026262000072565b5b6200027185828601620001c3565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002ce57607f821691505b602082108103620002e457620002e362000286565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200034e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200030f565b6200035a86836200030f565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003a7620003a16200039b8462000372565b6200037c565b62000372565b9050919050565b6000819050919050565b620003c38362000386565b620003db620003d282620003ae565b8484546200031c565b825550505050565b600090565b620003f2620003e3565b620003ff818484620003b8565b505050565b5b8181101562000427576200041b600082620003e8565b60018101905062000405565b5050565b601f82111562000476576200044081620002ea565b6200044b84620002ff565b810160208510156200045b578190505b620004736200046a85620002ff565b83018262000404565b50505b505050565b600082821c905092915050565b60006200049b600019846008026200047b565b1980831691505092915050565b6000620004b6838362000488565b9150826002028217905092915050565b620004d1826200027b565b67ffffffffffffffff811115620004ed57620004ec62000092565b5b620004f98254620002b5565b620005068282856200042b565b600060209050601f8311600181146200053e576000841562000529578287015190505b620005358582620004a8565b865550620005a5565b601f1984166200054e86620002ea565b60005b82811015620005785784890151825560018201915060208501945060208101905062000551565b8683101562000598578489015162000594601f89168262000488565b8355505b6001600288020188555050505b505050505050565b61273480620005bd6000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c806357b375f411610097578063a22cb46511610066578063a22cb465146102a9578063b88d4fde146102c5578063c87b56dd146102e1578063e985e9c51461031157610100565b806357b375f41461020f5780636352211e1461022b57806370a082311461025b57806395d89b411461028b57610100565b806323b872dd116100d357806323b872dd1461019f57806340c10f19146101bb57806342842e0e146101d75780634684d7e9146101f357610100565b806301ffc9a71461010557806306fdde0314610135578063081812fc14610153578063095ea7b314610183575b600080fd5b61011f600480360381019061011a9190611877565b610341565b60405161012c91906118bf565b60405180910390f35b61013d610423565b60405161014a919061196a565b60405180910390f35b61016d600480360381019061016891906119c2565b6104b5565b60405161017a9190611a30565b60405180910390f35b61019d60048036038101906101989190611a77565b6104fb565b005b6101b960048036038101906101b49190611ab7565b610612565b005b6101d560048036038101906101d09190611a77565b610672565b005b6101f160048036038101906101ec9190611ab7565b610680565b005b61020d60048036038101906102089190611b6f565b6106a0565b005b61022960048036038101906102249190611bfb565b6106ea565b005b610245600480360381019061024091906119c2565b6106fa565b6040516102529190611a30565b60405180910390f35b61027560048036038101906102709190611c4e565b610780565b6040516102829190611c8a565b60405180910390f35b610293610837565b6040516102a0919061196a565b60405180910390f35b6102c360048036038101906102be9190611ca5565b6108c9565b005b6102df60048036038101906102da9190611e15565b6108df565b005b6102fb60048036038101906102f691906119c2565b610941565b604051610308919061196a565b60405180910390f35b61032b60048036038101906103269190611e98565b6109a9565b60405161033891906118bf565b60405180910390f35b60007fd71f2d39000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061040c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061041c575061041b82610a3d565b5b9050919050565b60606000805461043290611f07565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611f07565b80156104ab5780601f10610480576101008083540402835291602001916104ab565b820191906000526020600020905b81548152906001019060200180831161048e57829003601f168201915b5050505050905090565b60006104c082610aa7565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610506826106fa565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056d90611faa565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610595610af2565b73ffffffffffffffffffffffffffffffffffffffff1614806105c457506105c3816105be610af2565b6109a9565b5b610603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105fa9061203c565b60405180910390fd5b61060d8383610afa565b505050565b61062361061d610af2565b82610bb3565b610662576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610659906120ce565b60405180910390fd5b61066d838383610c48565b505050565b61067c8282610f41565b5050565b61069b838383604051806020016040528060008152506108df565b505050565b60005b828290508110156106e4576106d1848484848181106106c5576106c46120ee565b5b90506020020135610f41565b80806106dc9061214c565b9150506106a3565b50505050565b6106f5838383610f5f565b505050565b600080610706836110cb565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076e906121e0565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036107f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e790612272565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60606001805461084690611f07565b80601f016020809104026020016040519081016040528092919081815260200182805461087290611f07565b80156108bf5780601f10610894576101008083540402835291602001916108bf565b820191906000526020600020905b8154815290600101906020018083116108a257829003601f168201915b5050505050905090565b6108db6108d4610af2565b8383610f5f565b5050565b6108f06108ea610af2565b83610bb3565b61092f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610926906120ce565b60405180910390fd5b61093b84848484611108565b50505050565b606061094c82610aa7565b6000610956611164565b9050600081511161097657604051806020016040528060008152506109a1565b806109808461117b565b6040516020016109919291906122ce565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610ab081611249565b610aef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae6906121e0565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610b6d836106fa565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610bbf836106fa565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610c015750610c0081856109a9565b5b80610c3f57508373ffffffffffffffffffffffffffffffffffffffff16610c27846104b5565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610c68826106fa565b73ffffffffffffffffffffffffffffffffffffffff1614610cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb590612364565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d24906123f6565b60405180910390fd5b610d3a838383600161128a565b8273ffffffffffffffffffffffffffffffffffffffff16610d5a826106fa565b73ffffffffffffffffffffffffffffffffffffffff1614610db0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da790612364565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f3c8383836001611290565b505050565b610f5b828260405180602001604052806000815250611296565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610fcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc490612462565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110be91906118bf565b60405180910390a3505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b611113848484610c48565b61111f848484846112f1565b61115e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611155906124f4565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b60606000600161118a84611478565b01905060008167ffffffffffffffff8111156111a9576111a8611cea565b5b6040519080825280601f01601f1916602001820160405280156111db5781602001600182028036833780820191505090505b509050600082602001820190505b60011561123e578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161123257611231612514565b5b049450600085036111e9575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff1661126b836110cb565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b50505050565b50505050565b6112a083836115cb565b6112ad60008484846112f1565b6112ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e3906124f4565b60405180910390fd5b505050565b60006113128473ffffffffffffffffffffffffffffffffffffffff166117e8565b1561146b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261133b610af2565b8786866040518563ffffffff1660e01b815260040161135d9493929190612598565b6020604051808303816000875af192505050801561139957506040513d601f19601f8201168201806040525081019061139691906125f9565b60015b61141b573d80600081146113c9576040519150601f19603f3d011682016040523d82523d6000602084013e6113ce565b606091505b506000815103611413576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140a906124f4565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611470565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106114d6577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816114cc576114cb612514565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611513576d04ee2d6d415b85acef8100000000838161150957611508612514565b5b0492506020810190505b662386f26fc10000831061154257662386f26fc10000838161153857611537612514565b5b0492506010810190505b6305f5e100831061156b576305f5e100838161156157611560612514565b5b0492506008810190505b612710831061159057612710838161158657611585612514565b5b0492506004810190505b606483106115b357606483816115a9576115a8612514565b5b0492506002810190505b600a83106115c2576001810190505b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361163a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163190612672565b60405180910390fd5b61164381611249565b15611683576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167a906126de565b60405180910390fd5b61169160008383600161128a565b61169a81611249565b156116da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d1906126de565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46117e4600083836001611290565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6118548161181f565b811461185f57600080fd5b50565b6000813590506118718161184b565b92915050565b60006020828403121561188d5761188c611815565b5b600061189b84828501611862565b91505092915050565b60008115159050919050565b6118b9816118a4565b82525050565b60006020820190506118d460008301846118b0565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156119145780820151818401526020810190506118f9565b60008484015250505050565b6000601f19601f8301169050919050565b600061193c826118da565b61194681856118e5565b93506119568185602086016118f6565b61195f81611920565b840191505092915050565b600060208201905081810360008301526119848184611931565b905092915050565b6000819050919050565b61199f8161198c565b81146119aa57600080fd5b50565b6000813590506119bc81611996565b92915050565b6000602082840312156119d8576119d7611815565b5b60006119e6848285016119ad565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611a1a826119ef565b9050919050565b611a2a81611a0f565b82525050565b6000602082019050611a456000830184611a21565b92915050565b611a5481611a0f565b8114611a5f57600080fd5b50565b600081359050611a7181611a4b565b92915050565b60008060408385031215611a8e57611a8d611815565b5b6000611a9c85828601611a62565b9250506020611aad858286016119ad565b9150509250929050565b600080600060608486031215611ad057611acf611815565b5b6000611ade86828701611a62565b9350506020611aef86828701611a62565b9250506040611b00868287016119ad565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f840112611b2f57611b2e611b0a565b5b8235905067ffffffffffffffff811115611b4c57611b4b611b0f565b5b602083019150836020820283011115611b6857611b67611b14565b5b9250929050565b600080600060408486031215611b8857611b87611815565b5b6000611b9686828701611a62565b935050602084013567ffffffffffffffff811115611bb757611bb661181a565b5b611bc386828701611b19565b92509250509250925092565b611bd8816118a4565b8114611be357600080fd5b50565b600081359050611bf581611bcf565b92915050565b600080600060608486031215611c1457611c13611815565b5b6000611c2286828701611a62565b9350506020611c3386828701611a62565b9250506040611c4486828701611be6565b9150509250925092565b600060208284031215611c6457611c63611815565b5b6000611c7284828501611a62565b91505092915050565b611c848161198c565b82525050565b6000602082019050611c9f6000830184611c7b565b92915050565b60008060408385031215611cbc57611cbb611815565b5b6000611cca85828601611a62565b9250506020611cdb85828601611be6565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611d2282611920565b810181811067ffffffffffffffff82111715611d4157611d40611cea565b5b80604052505050565b6000611d5461180b565b9050611d608282611d19565b919050565b600067ffffffffffffffff821115611d8057611d7f611cea565b5b611d8982611920565b9050602081019050919050565b82818337600083830152505050565b6000611db8611db384611d65565b611d4a565b905082815260208101848484011115611dd457611dd3611ce5565b5b611ddf848285611d96565b509392505050565b600082601f830112611dfc57611dfb611b0a565b5b8135611e0c848260208601611da5565b91505092915050565b60008060008060808587031215611e2f57611e2e611815565b5b6000611e3d87828801611a62565b9450506020611e4e87828801611a62565b9350506040611e5f878288016119ad565b925050606085013567ffffffffffffffff811115611e8057611e7f61181a565b5b611e8c87828801611de7565b91505092959194509250565b60008060408385031215611eaf57611eae611815565b5b6000611ebd85828601611a62565b9250506020611ece85828601611a62565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611f1f57607f821691505b602082108103611f3257611f31611ed8565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000611f946021836118e5565b9150611f9f82611f38565b604082019050919050565b60006020820190508181036000830152611fc381611f87565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000612026603d836118e5565b915061203182611fca565b604082019050919050565b6000602082019050818103600083015261205581612019565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006120b8602d836118e5565b91506120c38261205c565b604082019050919050565b600060208201905081810360008301526120e7816120ab565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006121578261198c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036121895761218861211d565b5b600182019050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006121ca6018836118e5565b91506121d582612194565b602082019050919050565b600060208201905081810360008301526121f9816121bd565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b600061225c6029836118e5565b915061226782612200565b604082019050919050565b6000602082019050818103600083015261228b8161224f565b9050919050565b600081905092915050565b60006122a8826118da565b6122b28185612292565b93506122c28185602086016118f6565b80840191505092915050565b60006122da828561229d565b91506122e6828461229d565b91508190509392505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061234e6025836118e5565b9150612359826122f2565b604082019050919050565b6000602082019050818103600083015261237d81612341565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006123e06024836118e5565b91506123eb82612384565b604082019050919050565b6000602082019050818103600083015261240f816123d3565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061244c6019836118e5565b915061245782612416565b602082019050919050565b6000602082019050818103600083015261247b8161243f565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006124de6032836118e5565b91506124e982612482565b604082019050919050565b6000602082019050818103600083015261250d816124d1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b600061256a82612543565b612574818561254e565b93506125848185602086016118f6565b61258d81611920565b840191505092915050565b60006080820190506125ad6000830187611a21565b6125ba6020830186611a21565b6125c76040830185611c7b565b81810360608301526125d9818461255f565b905095945050505050565b6000815190506125f38161184b565b92915050565b60006020828403121561260f5761260e611815565b5b600061261d848285016125e4565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061265c6020836118e5565b915061266782612626565b602082019050919050565b6000602082019050818103600083015261268b8161264f565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006126c8601c836118e5565b91506126d382612692565b602082019050919050565b600060208201905081810360008301526126f7816126bb565b905091905056fea26469706673582212201043a78e09b47736c056c4a25b4904389874842b94452f3305f64e642dd7d193
64736f6c63430008130033"
,
}
}
// ERC721ABI is the input ABI used to generate the binding from.
// ERC721ABI is the input ABI used to generate the binding from.
...
@@ -470,6 +470,27 @@ func (_ERC721 *ERC721TransactorSession) Approve(to common.Address, tokenId *big.
...
@@ -470,6 +470,27 @@ func (_ERC721 *ERC721TransactorSession) Approve(to common.Address, tokenId *big.
return
_ERC721
.
Contract
.
Approve
(
&
_ERC721
.
TransactOpts
,
to
,
tokenId
)
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.
// Mint is a paid mutator transaction binding the contract method 0x40c10f19.
//
//
// Solidity: function mint(address to, uint256 tokenId) returns()
// Solidity: function mint(address to, uint256 tokenId) returns()
...
...
contract_abi/erc721_transfer/contract/ERC721.sol
View file @
c72a9be3
...
@@ -323,6 +323,12 @@ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
...
@@ -323,6 +323,12 @@ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
_safeMint(to, tokenId);
_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`.
* @dev Safely mints `tokenId` and transfers it to `to`.
*
*
...
...
main.go
View file @
c72a9be3
...
@@ -11,22 +11,42 @@ import (
...
@@ -11,22 +11,42 @@ import (
func
main
()
{
func
main
()
{
log
.
InitLog
(
log
.
LogConfig
{
Path
:
"logs"
,
Level
:
"debug"
,
Save
:
3
})
log
.
InitLog
(
log
.
LogConfig
{
Path
:
"logs"
,
Level
:
"debug"
,
Save
:
3
})
txArr
:=
make
([]
*
types
.
Transaction
,
0
)
txArr
:=
make
([]
*
types
.
Transaction
,
0
)
verifyFuncArr
:=
make
([]
func
()
bool
,
0
)
// 部署合约
// 部署合约
if
tool
.
Cfg
.
IsDeployContract
{
if
tool
.
Cfg
.
IsDeployContract
{
txArr
=
operator
.
DeployContract
(
tool
.
Cfg
.
RpcNode
,
txArr
)
txArr
=
operator
.
DeployContract
(
tool
.
Cfg
.
RpcNode
,
txArr
)
}
}
// 初始化From账户以及合约账户
// 初始化From账户以及合约账户
if
tool
.
Cfg
.
IsInitAccountBalance
{
if
tool
.
Cfg
.
IsInitAccountBalance
{
txArr
=
operator
.
InitCaseAccount
(
tool
.
Cfg
.
RpcNode
,
txArr
)
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
{
if
len
(
txArr
)
>
0
{
operator
.
SendTransaction
(
txArr
)
operator
.
SendTransaction
(
txArr
)
util
.
GetTxReceipt
(
tool
.
Cfg
.
RpcNode
,
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
)
util
.
GetAccountBalance
(
tool
.
Cfg
.
RpcNode
)
}
}
operator/operator.go
View file @
c72a9be3
...
@@ -73,21 +73,22 @@ func DeployContract(client *ethclient.Client, txRes []*types.Transaction) []*typ
...
@@ -73,21 +73,22 @@ func DeployContract(client *ethclient.Client, txRes []*types.Transaction) []*typ
}
}
auth
.
NoSend
=
true
auth
.
NoSend
=
true
auth
.
Value
=
big
.
NewInt
(
0
)
auth
.
Value
=
big
.
NewInt
(
0
)
auth
.
GasLimit
=
uint64
(
4
000000
)
auth
.
GasLimit
=
uint64
(
5000
000000
)
auth
.
GasPrice
=
big
.
NewInt
(
4
000000
)
auth
.
GasPrice
=
big
.
NewInt
(
5000
000000
)
nonce
,
err
:=
client
.
NonceAt
(
context
.
Background
(),
tool
.
Cfg
.
DeployAddr
,
nil
)
nonce
,
err
:=
client
.
NonceAt
(
context
.
Background
(),
tool
.
Cfg
.
DeployAddr
,
nil
)
if
err
!=
nil
{
if
err
!=
nil
{
log
.
Error
(
"DeployTokenTransfer func get acc nonce err:"
,
err
)
log
.
Error
(
"DeployTokenTransfer func get acc nonce err:"
,
err
)
}
}
auth
.
Nonce
=
big
.
NewInt
(
int64
(
nonce
))
contractArr
:=
make
([]
map
[
string
]
common
.
Address
,
0
)
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
)
contractMap
:=
make
(
map
[
string
]
common
.
Address
,
0
)
for
_
,
deployFunc
:=
range
deploy
.
DeployFunc
{
for
_
,
deployFunc
:=
range
deploy
.
DeployFunc
{
auth
.
Nonce
=
big
.
NewInt
(
int64
(
nonce
))
contractAddr
,
transaction
,
contractType
:=
deployFunc
(
auth
,
client
)
contractAddr
,
transaction
,
contractType
:=
deployFunc
(
auth
,
client
)
log
.
Info
(
"contractAddr:"
,
contractAddr
)
txRes
=
append
(
txRes
,
transaction
)
txRes
=
append
(
txRes
,
transaction
)
contractMap
[
contractType
]
=
contractAddr
contractMap
[
contractType
]
=
contractAddr
auth
.
Nonce
=
auth
.
Nonce
.
Add
(
auth
.
Nonce
,
big
.
NewInt
(
1
))
nonce
+=
1
}
}
contractArr
=
append
(
contractArr
,
contractMap
)
contractArr
=
append
(
contractArr
,
contractMap
)
}
}
...
@@ -95,61 +96,126 @@ func DeployContract(client *ethclient.Client, txRes []*types.Transaction) []*typ
...
@@ -95,61 +96,126 @@ func DeployContract(client *ethclient.Client, txRes []*types.Transaction) []*typ
return
txRes
return
txRes
}
}
func
InitCaseAccount
(
client
*
ethclient
.
Client
,
txArr
[]
*
types
.
Transaction
)
[]
*
types
.
Transaction
{
func
InitAccountCoin
(
txArr
[]
*
types
.
Transaction
,
nonce
uint64
,
amount
*
big
.
Int
,
accArr
*
tool
.
AccArrFormat
)
([]
*
types
.
Transaction
,
uint64
)
{
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
//初始化From账户
//初始化From账户
amount
:=
big
.
NewInt
(
0
)
amount
.
SetString
(
"10000000000000000000"
,
10
)
trade
:=
&
coin
.
Trade
{
trade
:=
&
coin
.
Trade
{
FromPrv
:
tool
.
Cfg
.
DeployPrv
,
FromPrv
:
tool
.
Cfg
.
DeployPrv
,
FromNonce
:
big
.
NewInt
(
int64
(
nonce
)),
FromNonce
:
big
.
NewInt
(
int64
(
nonce
)),
Amount
:
amount
,
Amount
:
amount
,
Gas
:
big
.
NewInt
(
50000
),
Gas
:
big
.
NewInt
(
50000
),
GasPrice
:
big
.
NewInt
(
100000000
),
GasPrice
:
big
.
NewInt
(
100000000
00
),
ChainId
:
tool
.
Cfg
.
ChainId
,
ChainId
:
tool
.
Cfg
.
ChainId
,
}
}
for
i
:=
0
;
i
<
len
(
accArr
.
FromAddr
);
i
++
{
for
i
:=
0
;
i
<
len
(
accArr
.
FromAddr
);
i
++
{
toAddress
:=
accArr
.
FromAddr
[
i
]
toAddress
:=
accArr
.
FromAddr
[
i
]
trade
.
ToAddr
=
&
toAddress
trade
.
ToAddr
=
&
toAddress
tx
,
err
=
trade
.
CoinTransferSignTx
()
tx
,
err
:
=
trade
.
CoinTransferSignTx
()
if
err
!=
nil
{
if
err
!=
nil
{
log
.
Error
(
"Init account - sign tran err:"
,
err
.
Error
())
log
.
Error
(
"Init account - sign tran err:"
,
err
.
Error
())
return
nil
return
nil
,
0
}
}
txArr
=
append
(
txArr
,
tx
)
txArr
=
append
(
txArr
,
tx
)
nonce
+=
1
nonce
+=
1
trade
.
FromNonce
=
big
.
NewInt
(
int64
(
nonce
))
trade
.
FromNonce
=
big
.
NewInt
(
int64
(
nonce
))
log
.
Info
(
"Init acc successful,addr:"
,
toAddress
)
log
.
Info
(
"Init acc successful,addr:"
,
toAddress
)
}
}
//初始化转账合约账户余额
for
i
:=
0
;
i
<
len
(
accArr
.
ToAddr
);
i
++
{
contractLen
:=
len
(
contractMap
)
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
++
{
for
i
:=
0
;
i
<
contractLen
;
i
++
{
trade
.
FromNonce
=
big
.
NewInt
(
int64
(
nonce
))
trade
.
FromNonce
=
big
.
NewInt
(
int64
(
nonce
))
coinTransferContract
:=
contractMap
[
i
][
constant
.
COIN_TRANSFER
]
coinTransferContract
:=
contractMap
[
i
][
constant
.
COIN_TRANSFER
]
trade
.
ToAddr
=
&
coinTransferContract
trade
.
ToAddr
=
&
coinTransferContract
tx
,
err
=
trade
.
CoinTransferSignTx
()
tx
,
err
:
=
trade
.
CoinTransferSignTx
()
if
err
!=
nil
{
if
err
!=
nil
{
log
.
Error
(
"Init account - sign tran err:"
,
err
.
Error
())
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
)
txArr
=
append
(
txArr
,
tx
)
log
.
Info
(
"Init account - mint 721 successful,tx:"
,
tx
.
Hash
()
.
Hex
())
nonce
+=
1
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
++
{
for
j
:=
0
;
j
<
contractLen
;
j
++
{
newERC20
,
err
:=
erc20
.
NewERC20
(
contractMap
[
j
][
constant
.
ERC20
],
client
)
newERC20
,
err
:=
erc20
.
NewERC20
(
contractMap
[
j
][
constant
.
ERC20
],
client
)
if
err
!=
nil
{
if
err
!=
nil
{
log
.
Error
(
"Init account - new erc20 err:"
,
err
.
Error
())
log
.
Error
(
"Init account - new erc20 err:"
,
err
.
Error
())
return
nil
return
nil
,
0
}
}
auth
.
Nonce
=
big
.
NewInt
(
int64
(
nonce
))
auth
.
Nonce
=
big
.
NewInt
(
int64
(
nonce
))
auth
.
GasPrice
=
big
.
NewInt
(
1000000000
)
auth
.
GasPrice
=
big
.
NewInt
(
1000000000
)
...
@@ -157,7 +223,8 @@ func InitCaseAccount(client *ethclient.Client, txArr []*types.Transaction) []*ty
...
@@ -157,7 +223,8 @@ func InitCaseAccount(client *ethclient.Client, txArr []*types.Transaction) []*ty
// mint
// mint
of
,
err
:=
newERC20
.
BalanceOf
(
&
bind
.
CallOpts
{},
tool
.
Cfg
.
DeployAddr
)
of
,
err
:=
newERC20
.
BalanceOf
(
&
bind
.
CallOpts
{},
tool
.
Cfg
.
DeployAddr
)
if
err
!=
nil
{
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
())
log
.
Info
(
tool
.
Cfg
.
DeployAddr
,
",erc20 balance of:"
,
of
.
Uint64
())
if
of
.
Int64
()
==
0
{
if
of
.
Int64
()
==
0
{
...
@@ -166,7 +233,7 @@ func InitCaseAccount(client *ethclient.Client, txArr []*types.Transaction) []*ty
...
@@ -166,7 +233,7 @@ func InitCaseAccount(client *ethclient.Client, txArr []*types.Transaction) []*ty
tx
,
err
=
newERC20
.
Mint
(
auth
,
tool
.
Cfg
.
DeployAddr
,
mintCount
)
tx
,
err
=
newERC20
.
Mint
(
auth
,
tool
.
Cfg
.
DeployAddr
,
mintCount
)
if
err
!=
nil
{
if
err
!=
nil
{
log
.
Error
(
"Init account - erc20 mint err:"
,
err
.
Error
())
log
.
Error
(
"Init account - erc20 mint err:"
,
err
.
Error
())
return
nil
return
nil
,
0
}
}
txArr
=
append
(
txArr
,
tx
)
txArr
=
append
(
txArr
,
tx
)
nonce
+=
1
nonce
+=
1
...
@@ -178,7 +245,7 @@ func InitCaseAccount(client *ethclient.Client, txArr []*types.Transaction) []*ty
...
@@ -178,7 +245,7 @@ func InitCaseAccount(client *ethclient.Client, txArr []*types.Transaction) []*ty
tx
,
err
=
newERC20
.
Transfer
(
auth
,
contractMap
[
j
][
constant
.
TOKEN20_TRANSFER
],
tranCount
)
tx
,
err
=
newERC20
.
Transfer
(
auth
,
contractMap
[
j
][
constant
.
TOKEN20_TRANSFER
],
tranCount
)
if
err
!=
nil
{
if
err
!=
nil
{
log
.
Error
(
"Init account - erc20 transfer err:"
,
err
.
Error
())
log
.
Error
(
"Init account - erc20 transfer err:"
,
err
.
Error
())
return
nil
return
nil
,
0
}
}
txArr
=
append
(
txArr
,
tx
)
txArr
=
append
(
txArr
,
tx
)
nonce
+=
1
nonce
+=
1
...
@@ -189,7 +256,7 @@ func InitCaseAccount(client *ethclient.Client, txArr []*types.Transaction) []*ty
...
@@ -189,7 +256,7 @@ func InitCaseAccount(client *ethclient.Client, txArr []*types.Transaction) []*ty
tx
,
err
=
newERC20
.
Transfer
(
auth
,
owner
,
tranCount
)
tx
,
err
=
newERC20
.
Transfer
(
auth
,
owner
,
tranCount
)
if
err
!=
nil
{
if
err
!=
nil
{
log
.
Error
(
"Init account - erc20 transfer err:"
,
err
.
Error
())
log
.
Error
(
"Init account - erc20 transfer err:"
,
err
.
Error
())
return
nil
return
nil
,
0
}
}
txArr
=
append
(
txArr
,
tx
)
txArr
=
append
(
txArr
,
tx
)
nonce
+=
1
nonce
+=
1
...
@@ -198,53 +265,50 @@ func InitCaseAccount(client *ethclient.Client, txArr []*types.Transaction) []*ty
...
@@ -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
)
tx
,
err
=
newERC20
.
ApproveFrom
(
auth
,
owner
,
contractMap
[
j
][
constant
.
TOKEN20_TRANSFER
],
tranCount
)
if
err
!=
nil
{
if
err
!=
nil
{
log
.
Error
(
"Init account - erc20 approveFrom err:"
,
err
.
Error
())
log
.
Error
(
"Init account - erc20 approveFrom err:"
,
err
.
Error
())
return
nil
return
nil
,
0
}
}
txArr
=
append
(
txArr
,
tx
)
txArr
=
append
(
txArr
,
tx
)
nonce
+=
1
nonce
+=
1
}
}
}
}
//初始化erc721 并且mint
return
txArr
,
nonce
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
auth
.
Nonce
=
big
.
NewInt
(
int64
(
nonce
))
func
InitCaseAccount
(
client
*
ethclient
.
Client
,
txArr
[]
*
types
.
Transaction
)
[]
*
types
.
Transaction
{
tx
,
err
=
newERC721
.
SetApprovalForAllFrom
(
auth
,
accArr
.
FromAddr
[
i
],
contractMap
[
j
][
constant
.
TOKEN721_TRANSFER
],
true
)
nonce
,
err
:=
client
.
NonceAt
(
context
.
Background
(),
tool
.
Cfg
.
DeployAddr
,
nil
)
if
err
!=
nil
{
if
err
!=
nil
{
log
.
Error
(
"Init account - erc721 setApprovalForAllFrom err:"
,
err
.
Error
())
log
.
Error
(
"Init account - get acc nonce err:"
,
err
)
return
nil
return
nil
}
txArr
=
append
(
txArr
,
tx
)
log
.
Info
(
"Init account - transferFrom 721 successful,tx:"
,
tx
.
Hash
()
.
Hex
())
nonce
+=
1
}
}
}
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..........."
)
log
.
Info
(
"Init balance successful,wait send tran..........."
)
return
txArr
return
txArr
}
}
...
@@ -258,11 +322,126 @@ func GetTranFunc(caseType int, startIndex int, txCount int, nonceMap *sync.Map,
...
@@ -258,11 +322,126 @@ func GetTranFunc(caseType int, startIndex int, txCount int, nonceMap *sync.Map,
{
{
return
NrCoinTranCase
(
txCount
,
arr
,
nonceMap
,
txArr
,
client
)
return
NrCoinTranCase
(
txCount
,
arr
,
nonceMap
,
txArr
,
client
)
}
}
// 不相关-合约调用交易
// 不相关-单层-调用合约转账
case
2
:
case
2
:
{
{
return
NrContractCoinTranCase
(
txCount
,
arr
,
contractArr
[
0
],
nonceMap
,
txArr
,
client
)
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
:
default
:
{
{
return
nil
,
nil
return
nil
,
nil
...
@@ -310,9 +489,16 @@ func SendTransaction(trans []*types.Transaction) {
...
@@ -310,9 +489,16 @@ func SendTransaction(trans []*types.Transaction) {
}()
}()
}
}
for
i
:=
0
;
i
<
len
(
trans
);
i
++
{
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
)
log
.
Info
(
"Input count:"
,
i
)
}
}
time
.
Sleep
(
time
.
Second
*
6
0
)
time
.
Sleep
(
time
.
Second
*
12
0
)
log
.
Info
(
"Send tran successful"
)
log
.
Info
(
"Send tran successful"
)
}
}
operator/partlyRelatedCase.go
View file @
c72a9be3
...
@@ -4,7 +4,13 @@ import (
...
@@ -4,7 +4,13 @@ import (
"context"
"context"
"contract-case/constant"
"contract-case/constant"
"contract-case/contract/coin"
"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"
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/log"
"contract-case/tool"
"contract-case/tool"
"contract-case/util"
"contract-case/util"
...
@@ -637,58 +643,568 @@ func PrSpContractOneCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, con
...
@@ -637,58 +643,568 @@ func PrSpContractOneCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, con
}
}
// PrReWRTranCase 单层-写变量-合约接受者相关
// 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 单层-写变量-合约发送者相关
// 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 多层-写变量-合约接受者相关
// PrReOneWRTranCase 多层-写变量-合约接受者相关
func
PrReOneWRTranCase
()
{
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
,
// PrSpOneWRTranCase 多层-写变量-合约发送者相关
KeyParam
:
big
.
NewInt
(
1
),
func
PrSpOneWRTranCase
()
{
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-发送者相关
// PrReErc20TranCase 单层-erc20-向多个接受者进行转账
func
PrReErc20TranCase
()
{
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-接受者相关
// PrSpOneErc20TranCase 多层-erc20-transfer-向多个接受者进行转账
func
PrSpErc20TranCase
()
{
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-发送接受者相关
// PrReSpErc20TranCase 单层-erc20-transferFrom-A->B 转账
func
PrReSpErc20TranCase
()
{
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-发送者相关
// PrReOneErc20TranCase 多层-erc20-transferFrom-发送者相关
func
PrReOneErc20TranCase
()
{
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-接受者相关
// PrSpErc20ApproveTranCase 单层-erc20-approve
func
PrSpOneErc20TranCase
()
{
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
}
}
// PrReSpOneErc20
TranCase 多层-erc20-发送接受者相关
// PrReSpOneErc20
ApproveTranCase 多层-erc20-approve
func
PrReSpOneErc20TranCase
()
{
func
PrReSpOneErc20
Approve
TranCase
()
{
}
}
// PrReErc721TranCase 单层-erc721-发送者相关
// 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-接受者相关
// PrSpErc721TranCase 单层-erc721-接受者相关
...
...
test/contract_test.go
0 → 100644
View file @
c72a9be3
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
())
}
tool/Config.go
View file @
c72a9be3
...
@@ -14,14 +14,14 @@ import (
...
@@ -14,14 +14,14 @@ import (
)
)
type
ConfigJson
struct
{
type
ConfigJson
struct
{
DeployAddr
string
`json:"deployAddr"`
DeployAddr
string
`json:"deployAddr"`
DeployPrv
string
`json:"deployPrv"`
DeployPrv
string
`json:"deployPrv"`
RpcNode
string
`json:"rpcNode"`
RpcNode
string
`json:"rpcNode"`
ChainId
int64
`json:"chainId"`
ChainId
int64
`json:"chainId"`
TransferType
map
[
string
]
bool
`json:"transferType"`
TransferType
[]
int
`json:"transferType"`
GenerateAccCount
int
`json:"generateAccCount"`
GenerateAccCount
int
`json:"generateAccCount"`
IsDeployContract
bool
`json:"isDeployContract"`
IsDeployContract
bool
`json:"isDeployContract"`
IsInitAccountBalance
bool
`json:"isInitAccountBalance"`
IsInitAccountBalance
bool
`json:"isInitAccountBalance"`
}
}
type
Config
struct
{
type
Config
struct
{
...
@@ -29,7 +29,7 @@ type Config struct {
...
@@ -29,7 +29,7 @@ type Config struct {
DeployPrv
*
ecdsa
.
PrivateKey
DeployPrv
*
ecdsa
.
PrivateKey
RpcNode
*
ethclient
.
Client
RpcNode
*
ethclient
.
Client
ChainId
*
big
.
Int
ChainId
*
big
.
Int
TransferType
map
[
string
]
bool
TransferType
[]
int
GenerateAccCount
int
GenerateAccCount
int
IsDeployContract
bool
IsDeployContract
bool
IsInitAccountBalance
bool
IsInitAccountBalance
bool
...
...
util/contract_util.go
View file @
c72a9be3
...
@@ -53,7 +53,7 @@ func GetTxReceipt(client *ethclient.Client, txArr []*types.Transaction) {
...
@@ -53,7 +53,7 @@ func GetTxReceipt(client *ethclient.Client, txArr []*types.Transaction) {
if
receipt
.
Status
==
0
{
if
receipt
.
Status
==
0
{
log
.
Error
(
"Receipt:"
,
receipt
)
log
.
Error
(
"Receipt:"
,
receipt
)
}
else
{
}
else
{
log
.
Infof
(
"Receipt: status: %d,
logs:%s ,gasUsed: %d"
,
receipt
.
Status
,
receipt
.
Log
s
,
receipt
.
GasUsed
)
log
.
Infof
(
"Receipt: status: %d,
gasUsed: %d"
,
receipt
.
Statu
s
,
receipt
.
GasUsed
)
}
}
}
}
}
}
...
@@ -91,6 +91,9 @@ func GetAccountNonce(client *ethclient.Client) *sync.Map {
...
@@ -91,6 +91,9 @@ func GetAccountNonce(client *ethclient.Client) *sync.Map {
}
}
func
GetAccBal
(
client
*
ethclient
.
Client
,
addr
common
.
Address
)
*
big
.
Int
{
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
)
balance
,
err
:=
client
.
BalanceAt
(
context
.
Background
(),
addr
,
nil
)
if
err
!=
nil
{
if
err
!=
nil
{
log
.
Errorf
(
"Get acc:%s,balance err:%s"
,
addr
.
Hash
()
.
Hex
(),
err
.
Error
())
log
.
Errorf
(
"Get acc:%s,balance err:%s"
,
addr
.
Hash
()
.
Hex
(),
err
.
Error
())
...
@@ -112,6 +115,7 @@ func GetAccountBalance(client *ethclient.Client) {
...
@@ -112,6 +115,7 @@ func GetAccountBalance(client *ethclient.Client) {
select
{
select
{
case
addr
:=
<-
addrChan
:
case
addr
:=
<-
addrChan
:
GetAccBal
(
client
,
addr
)
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
)
GetAccountErc20BalanceOf
(
client
,
tool
.
Cfg
.
ContractMap
[
0
][
constant
.
ERC20
],
addr
)
GetAccountErc721BalanceOf
(
client
,
tool
.
Cfg
.
ContractMap
[
0
][
constant
.
ERC721
],
addr
)
GetAccountErc721BalanceOf
(
client
,
tool
.
Cfg
.
ContractMap
[
0
][
constant
.
ERC721
],
addr
)
atomic
.
AddInt32
(
&
handleBalanceCount
,
1
)
atomic
.
AddInt32
(
&
handleBalanceCount
,
1
)
...
@@ -130,6 +134,9 @@ func GetAccountBalance(client *ethclient.Client) {
...
@@ -130,6 +134,9 @@ func GetAccountBalance(client *ethclient.Client) {
}
}
func
GetAccountErc20BalanceOf
(
client
*
ethclient
.
Client
,
erc20Addr
common
.
Address
,
toAddr
common
.
Address
)
{
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
)
newERC20
,
err
:=
erc20
.
NewERC20
(
erc20Addr
,
client
)
if
err
!=
nil
{
if
err
!=
nil
{
log
.
Error
(
"Init account - new erc720 err:"
,
err
.
Error
())
log
.
Error
(
"Init account - new erc720 err:"
,
err
.
Error
())
...
@@ -149,6 +156,9 @@ func GetAccountErc20BalanceOf(client *ethclient.Client, erc20Addr common.Address
...
@@ -149,6 +156,9 @@ func GetAccountErc20BalanceOf(client *ethclient.Client, erc20Addr common.Address
}
}
func
GetAccountErc721BalanceOf
(
client
*
ethclient
.
Client
,
erc721Addr
common
.
Address
,
toAddr
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
)
newERC721
,
err
:=
erc721
.
NewERC721
(
erc721Addr
,
client
)
if
err
!=
nil
{
if
err
!=
nil
{
log
.
Error
(
"Init account - new erc721 err:"
,
err
.
Error
())
log
.
Error
(
"Init account - new erc721 err:"
,
err
.
Error
())
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment