Commit c1ac0912 authored by duanjinfei's avatar duanjinfei

four commit

parent c72a9be3
{ {
"deployAddr1": "0xe2bA4B27E835f3D5A8f74B53aD6b8b6264D3F501", "deployAddr": "0xe2bA4B27E835f3D5A8f74B53aD6b8b6264D3F501",
"deployPrv1": "115725efa0b457a764bb0b73b79a26605a54a5025d825b5a627f69354cdbbbf4", "deployPrv": "115725efa0b457a764bb0b73b79a26605a54a5025d825b5a627f69354cdbbbf4",
"deployAddr": "0x40EC4256fcBCA69CdbAc942594caeC79FBE10494", "deployAddr1": "0x40EC4256fcBCA69CdbAc942594caeC79FBE10494",
"deployPrv": "37871f094f89fc95599e73d72d3008c828bb76d0864759011fa14dbaf6cf3c06", "deployPrv1": "37871f094f89fc95599e73d72d3008c828bb76d0864759011fa14dbaf6cf3c06",
"rpcNode1": "http://192.168.1.125:50000", "rpcNode": "http://54.72.101.87:50000",
"rpcNode": "http://15.161.177.5:26658", "rpcNode1": "http://15.161.177.5:26658",
"chainId1": 155, "chainId": 155,
"chainId": 256256, "chainId1": 256256,
"goRoutine": 1, "goRoutine": 1,
"generateAccCount": 500, "generateAccCount": 500,
"isDeployContract": false, "isDeployContract": false,
......
[ [
{ {
"Coin_Transfer": "0xacea4c028c233e5d896b5ea28eb1c24d64b937e2", "Coin_Transfer": "0xa589cc6ef990fa4f5aa03d522652958a5d55b0b1",
"ERC20": "0x76e45ce8aa97a3c31d5de9808138e4e31e59fed2", "ERC20": "0xb7ca7e3d6a01e3e50628b80d7e532baa91b15595",
"ERC721": "0xA1C950aA702174E41BCD0ECB7f4c37FDfd672704", "ERC721": "0x8d7263a431c9a8029c4584d9d5485130243f456a",
"One_Coin_Transfer": "0x751d4fe23f0d12b24e58a8e7fc8dccebb5cce2f8", "One_Coin_Transfer": "0xb8f19a4bccbbcf9022c92d415cf84dc61e6daf7d",
"One_Read_Write": "0x8d1d06ccb26436a6dcc34d2a2d85086036d5510c", "One_Read_Write": "0xf0d9674e12e82e8ea27ca078ef55cf8ca184e70d",
"One_Token20_Transfer": "0x5f126393985dba423b740cad1ffd105d63905aa6", "One_Token20_Transfer": "0xa85b42d70eea5327b457871d04f9b32be115571c",
"One_Token721_Transfer": "0xd4b3b40c2b53ea256af8606c711538bfb6eb14a0", "One_Token721_Transfer": "0xd8f1c3b2b6a925a6e458ae8f18b5e60639c31f5f",
"Read_Chain": "0x5b42b6bda3d6ea631dfd5b9a64e0816c03d13e44", "Read_Chain": "0x1efc5623ad299fccfd377e9d7444445c2fe832ca",
"Read_Write": "0xcad5fbc5966f72efa1a4b0cc6c342bce20c73682", "Read_Write": "0x085696039a6d7cfe7cdd39dd93553e874fe5329d",
"Token20_Transfer": "0x217dca03b245abc49a4661cd10f890cc07b4b374", "Token20_Transfer": "0xf634b94595a0a98c56e8664692dc945a920f87e1",
"Token721_Transfer": "0x4169a1d185869ef9c6153d964fcfd155496cf903", "Token721_Transfer": "0xa9c688ed700e8984765093f22ff21f07723c6706",
"Two_Coin_Transfer": "0x55dbf6b2c432094dfaace8d3fbdc6d8d486c6789", "Two_Coin_Transfer": "0x307914ca53f3874f74d0611c14222e549659a857",
"Two_Token20_Transfer": "0xf016b61f45e21345c80bd98142c7abc1f2369ccb", "Two_Token20_Transfer": "0x044bfa516df8d6cb4cae0523286b85c0787d0dd2",
"Two_Token721_Transfer": "0x1bf3024b501cab75e7659a5564e35dfa02bc0370" "Two_Token721_Transfer": "0xebac9101d367f562903e99c432b2640c9d0acdd5"
}, },
{ {
"Coin_Transfer": "0xfd4e1842dee40e3659569a2994c44ad81c588b82", "Coin_Transfer": "0xdf2d6b72184f798fd9b599facbbb450a14ddfdab",
"ERC20": "0xad1ba974bd3bc14556cc884991823223c92b98b6", "ERC20": "0x2ba73a39ef543abc80b30c28018ed539cedc50e4",
"ERC721": "0x450260F10b2D55b785037388fA3aA3b2232cC9F4", "ERC721": "0xe20ebde1f619f8a078a5d8aa93e007cd7c29eb5c",
"One_Coin_Transfer": "0x5ccbafa9811a3a315e1f7c05b80337ec95f69e51", "One_Coin_Transfer": "0xc18618830876c5fee157043e966b1a2dbd20064b",
"One_Read_Write": "0x72fc53dc11970380b4b48c4a5f66fa97227918d5", "One_Read_Write": "0x62c435fbe09bfec39c02db60ae4dd7206de88392",
"One_Token20_Transfer": "0xc7e40a453efefae4bd5eab74b6d242286b75ff85", "One_Token20_Transfer": "0xf81a7c6563a0532a55723b862fc89396f329a5b1",
"One_Token721_Transfer": "0x1a384b70ef274a681eecf5ae680041893bf0563c", "One_Token721_Transfer": "0xc05c6e28e2ae345da67e7f734e92490c888cdc0b",
"Read_Chain": "0x22f8e10b428c801dde2ec902c788657fd6ecff27", "Read_Chain": "0xf2edfcbe91f56cae98e93f116bac14df45a63a10",
"Read_Write": "0x9c929501bb92a36355356881d8d2ed56667881f3", "Read_Write": "0x35c6bdb1d5c14daa0981a1888b89dee3827f4368",
"Token20_Transfer": "0xddf839293a5056e3b41f4599b63e9b6d2db80365", "Token20_Transfer": "0xe3b4a50b2193bef24ee62e4070a12ce46ae66c90",
"Token721_Transfer": "0x41a48d703f0aec53ca698c7ee5077069c69e9efe", "Token721_Transfer": "0x51f6eafc4f07142ff64599b4d3e8edfbaa1d3a4e",
"Two_Coin_Transfer": "0x46725530114818f36ab574a6844b7d93e7b23e2e", "Two_Coin_Transfer": "0x55e25ad3c753739347da6d5ec4a12aa68d35da23",
"Two_Token20_Transfer": "0x5f0294fe1bbcf708a3cda7dd1cc86ceb44aa16ed", "Two_Token20_Transfer": "0x81b8355f8755491e2f190f696fc76ca341d76fd4",
"Two_Token721_Transfer": "0x69d7bed3eeeba10d7fe5a47221b7484816250055" "Two_Token721_Transfer": "0xf313d4958bf05f2429b7f67d8c3b90dcde0b769a"
}, },
{ {
"Coin_Transfer": "0x15a973b26eddf34727d6cbd85c689eabd1b0ea12", "Coin_Transfer": "0x38b1ea3d1a59eb30b5c7e6808b19a3c57fa7f100",
"ERC20": "0xe5ea1be6856130dfed8baba94e8e3e667d7a5641", "ERC20": "0xc483248a1d966bbcb24c56abc05b3c125da4da20",
"ERC721": "0xf7c49C0264204f8346F659a4BB729567f0081daE", "ERC721": "0x5597c1a356622a8d0213257fd03a092f67da71bb",
"One_Coin_Transfer": "0xafc5b39e4f702316fa822bd7168645cdff22c6d8", "One_Coin_Transfer": "0x49378c860aee4e99d3f2e4a8d3aab1b97e2a68be",
"One_Read_Write": "0xf862f78ff1e10590248c9baa5bafa84d3e33148c", "One_Read_Write": "0x618c0c8d30b2f3b45af879e46c21522efa799855",
"One_Token20_Transfer": "0x349c6d13ba2091f0317e8622c59c5d933ec53f7d", "One_Token20_Transfer": "0x044bf7306253db9e8c02d92c056e2c1c2b0371c4",
"One_Token721_Transfer": "0x82284e4df1e2ad4f30c9df610e27550e53320b63", "One_Token721_Transfer": "0x372dc122051e5abd80d468397cec4875d1682a7b",
"Read_Chain": "0x37019503113a937d3afda0f8d586a326cfe589da", "Read_Chain": "0x4c05ad7c37d46afa137620bb0a08b2eb0d364677",
"Read_Write": "0xf156c92b515402cd9a0e6c9574938bf36964bc9c", "Read_Write": "0xdac17232b136cf04f397ded922a12de10bde2ee6",
"Token20_Transfer": "0x8585f124527624e878c862b6126dc40432809644", "Token20_Transfer": "0x809fb09b24e040f0688899e3cb3ade0e1e435891",
"Token721_Transfer": "0xb829a81cb13f01c59ac28452794516707400a850", "Token721_Transfer": "0xf63a76d44b3c4dc51071b61d05d1de31f49d785b",
"Two_Coin_Transfer": "0xf6e6be579f0bc80554cde98e441dbc424e848a81", "Two_Coin_Transfer": "0xacc3fd6bab727b3e8a9bf6ef3bde1f8c2d803301",
"Two_Token20_Transfer": "0x3ccaaf61a375be2ae88fcbed9a87b4ed1b451818", "Two_Token20_Transfer": "0x7ad46537d6693c49edb8783eb99aff93bd182d27",
"Two_Token721_Transfer": "0xbe9f151c8ba8262e6aceb8e1f57f4280ba8bf907" "Two_Token721_Transfer": "0xe476eb1c20aa88031db6e68cbc521800b435e13c"
}, },
{ {
"Coin_Transfer": "0x7172b82c77f84caffe98b1a60b666a579ede033f", "Coin_Transfer": "0x38db3e3175249748ecccd32b77f5943dd5413aa6",
"ERC20": "0x07961ad0013c843966731f42f9ba0dc4d218661b", "ERC20": "0xdd88f8677a2a19616bb92065a8504e2e9cb777c7",
"ERC721": "0x5F82Ca8b2D756749420709F7A216F57eC8043306", "ERC721": "0xc9dc89f8aecac22a1d34356e0cc2805a16a59daa",
"One_Coin_Transfer": "0x090012ad83fbbb14c63ac3da6ded8b17f9f90ade", "One_Coin_Transfer": "0xb62f350c1c3f0079bdcdeb50bc9d6717dc861f35",
"One_Read_Write": "0xf9fc7e5fec25c3671ff2b55f84a2aff0f309e252", "One_Read_Write": "0x839ddfc307b23e26795acbeb080ca0e6c4471343",
"One_Token20_Transfer": "0x91e96b3e8232b61cbda3241948eb5c53b7001382", "One_Token20_Transfer": "0x8899adb6c137a3b7adff855d5ba9123554c5dc48",
"One_Token721_Transfer": "0x06ccfdeb8c4eaffc7cf839f45ff158845abf66dd", "One_Token721_Transfer": "0x18a9c4a69ad725761190fe214302d9260e8b4d08",
"Read_Chain": "0x08ae8a0a2000b39f8472b61a8063ef016e8d73a6", "Read_Chain": "0xf4551dd4e90511837bdad8634bfeedaab61baf37",
"Read_Write": "0xb147a01cf3e83c6514a0ccdec402612c47f97de8", "Read_Write": "0x2b9803d12d1c92e993fa25ed0ae73e4d09319f2c",
"Token20_Transfer": "0x0c18d08c20acceae425458b2b186aa70632d3b25", "Token20_Transfer": "0x0ab33868ff5d93ac985dc95f90a9cde41026baa4",
"Token721_Transfer": "0xedb8bea3b505f41d778e5e4e016a68176fdebb50", "Token721_Transfer": "0xd1853d8444a91911b5ce5e3f1205b78cfbf70de1",
"Two_Coin_Transfer": "0xb70f158bee8ee10d68ab3ff4236ff6d08e31ce50", "Two_Coin_Transfer": "0xbdaa9afcdff574c41852eacc333b942157d82206",
"Two_Token20_Transfer": "0x5138395a30b8338fd6e78e76adba7aeac0087944", "Two_Token20_Transfer": "0xa0d3e321f5decd0f9a36ed999def15494a360c13",
"Two_Token721_Transfer": "0xc29d555448a0ebb176e81bc0d6bfeeaba7d2f177" "Two_Token721_Transfer": "0x48edda9f5b032916975b73dfcd77fe66ef6a2f06"
}, },
{ {
"Coin_Transfer": "0xfe178e9eab1c124b2eec9dcd6ac8711addcfcd1c", "Coin_Transfer": "0x92280d850ecd79c49800adf3366f3026df895677",
"ERC20": "0x739bcc47af1794e44bc15a3edc7bc157e15df012", "ERC20": "0x8df746459f0f3cc57354c2c6f824ae34c2e156a1",
"ERC721": "0x60e35B92C0b616E2786A22598460ee9B97DdBF86", "ERC721": "0xf53232d142b9eb07519ff07cf07e01db921c77a1",
"One_Coin_Transfer": "0x5d6a15ce48a01fc40cce2b67b28f043e214f37ad", "One_Coin_Transfer": "0x036351dfe16320b55f5106cdae88c0f18d586172",
"One_Read_Write": "0x302211cfdcd202b2679b5af30abd47e01b1e8434", "One_Read_Write": "0x3cb9ed694aaf4291b309a374e47d6d1838b75651",
"One_Token20_Transfer": "0x368582fb44ac0263e5f7af3b9b77747aaab73977", "One_Token20_Transfer": "0x38676a7f768e4f9075dda75d48f25dc108a15407",
"One_Token721_Transfer": "0x1498fe5416f654522511958430d436d852944116", "One_Token721_Transfer": "0x2fc3ffbd4c85a5aa93dd05aab3391905882e3dc7",
"Read_Chain": "0x79802c8bd4f85703cc41935aa978485257c09c16", "Read_Chain": "0xa6463d921b33ebd148be10050a92ef984890f346",
"Read_Write": "0x63dac1be62787dd59dab7a2faabacd8d34d86da8", "Read_Write": "0x6a38d73d9fa3f0e505990824343a41c62af9fc20",
"Token20_Transfer": "0x3849c9ddf95abd07e03ecd9cf24542d4f9f22499", "Token20_Transfer": "0xe78d5bb07fcff7d8481f74ca34ddb939905d78ee",
"Token721_Transfer": "0x9e984435a395b25c0f27b1aece334dfe02c0485a", "Token721_Transfer": "0xa670fb3e614e4a87312d0293b7b8843acb6f3416",
"Two_Coin_Transfer": "0x0ced6919a38fa91b6b6927fc1f15e0c569c68a68", "Two_Coin_Transfer": "0x0552a89967f204d69f21bcf07e798b66345a5554",
"Two_Token20_Transfer": "0x53eb1be5898698bdf37a888f3e0318ca92cc998c", "Two_Token20_Transfer": "0xccdd01ce90fb87e59e413c0d0c935ee32979e92e",
"Two_Token721_Transfer": "0xb070769e4a0d65066f0a621d674413db661cafad" "Two_Token721_Transfer": "0x1648c0e71a36b6ea23e1201b4592ae17e3bcfe8f"
}, },
{ {
"Coin_Transfer": "0xe71e6339a12fdea0b21639f2ae0c66213fcf5c86", "Coin_Transfer": "0x97793ac67e4b9781803dda46f3dcdaff53efb6b4",
"ERC20": "0xcfb496315a3293c8628f46f7eb6584af735a3417", "ERC20": "0x66aaa7f2881e351f18697b6fa01fe2129f197f8f",
"ERC721": "0x107C9A668e6B5A5830633deDf2Ab0985246A8f4d", "ERC721": "0x37516343d02566dc25fc9e1aa083cf66eecc4686",
"One_Coin_Transfer": "0x7d12567d5f6a3366954b304721fc9ca629bba810", "One_Coin_Transfer": "0x9c6383f7824bd9017a933d54b532a2631f9bc44d",
"One_Read_Write": "0xbe65ff6c27f663f5773238ad0c587314ec480bc3", "One_Read_Write": "0xb90e9181c48c370bc1d03656995fba73b604957d",
"One_Token20_Transfer": "0xeddc3405b0ea01fd86c9ddc4ee452365fdf0f52e", "One_Token20_Transfer": "0x04dd317de502114b323ff00f8951b4e70c38e72b",
"One_Token721_Transfer": "0xb71212aed50e73dfda62d4b6668c7e4848fd4d97", "One_Token721_Transfer": "0x02eae8b01a144d74cc47e231069a93ead2d6ebd3",
"Read_Chain": "0x5c06399590f0401e0df344ca58a0c7a6497e290f", "Read_Chain": "0x361ffc858f28b648a546fab7c4446bc7e3ff7153",
"Read_Write": "0x6141fa8e3aa8ff702343dc6fa8d789d56d0e98af", "Read_Write": "0x2f1a7ebc2a2de0392f17c65dd4a8aab2a608b648",
"Token20_Transfer": "0x8a29a59af8d2a69b2de1d20f031ba8c1b42922df", "Token20_Transfer": "0xb47db2ed6571cb557160c2151db3d6cd83d7e671",
"Token721_Transfer": "0x3db2fe248be93b87b9691a73db47214ad8e9f272", "Token721_Transfer": "0x2b194a92bab5bb165dd2650850792161cfb70aa2",
"Two_Coin_Transfer": "0x053d3e1d5037f81b3988e2b82eb34bfd2e823e5d", "Two_Coin_Transfer": "0x987f8710d129b43a0f9557cafd53293acd5366f3",
"Two_Token20_Transfer": "0xcb1dc9dd3968388191fd40f22543ad1d31a1b273", "Two_Token20_Transfer": "0x4bb22faf5d382108d2a2fd4ec4b579e94c37c01f",
"Two_Token721_Transfer": "0x70b1bc30bd318e03d2f46bdaaed861749f6849d2" "Two_Token721_Transfer": "0x5a058381c912d985d179ace46502ca8bfbe926cc"
}, },
{ {
"Coin_Transfer": "0x70bf5a5755afaf564bb72eb890c5c45c37f70e39", "Coin_Transfer": "0x709298ebcdc0411b09107312a9d12e6aee05766b",
"ERC20": "0xb4a635e9f02639210d4914aed557f9ac488ee11c", "ERC20": "0x07352d5a526688b5cb83581c3046618934e6031e",
"ERC721": "0x618A1f37C911dAaCbfEa6e98Cf46252E35228120", "ERC721": "0xf6f2986a7aea23912cdc566711005d9ecf064f08",
"One_Coin_Transfer": "0x82d7057c6615d3700a72a8e8bc47a6efd2013dbf", "One_Coin_Transfer": "0x44860ac77eecd2bf02dd88887e29a658eb9681d3",
"One_Read_Write": "0x8b0d5cd7211b54b4362d90cbe3410459ffdf2da7", "One_Read_Write": "0xbfda289940be1a3bc748622da0817c1f8ab60311",
"One_Token20_Transfer": "0xc56b670655a3689e17c7f9471f53da7486232597", "One_Token20_Transfer": "0xb2ed2298cc9cc14775f324c03ce72c975a41e65f",
"One_Token721_Transfer": "0x3c2a1200cb7c115c178865c0f2ceecee5b3600f9", "One_Token721_Transfer": "0x039f4860353941006f5b9b2fe1967a8238dc8585",
"Read_Chain": "0xb4950877d2f93e5740d96ae446520dd6b07a2907", "Read_Chain": "0x53964578cb52c4a2a181864ebe9d7355a5f4f83f",
"Read_Write": "0x47506a0c311c78218793cb10c6ae71871781b872", "Read_Write": "0x5458069f0d6b6bddab805d0ccb2001caae8b4f79",
"Token20_Transfer": "0xec57db1ae50998ab8d7bea8f1009107da55953a2", "Token20_Transfer": "0x5cdfcc9d583e694cb09220ae56e5d3416e64be48",
"Token721_Transfer": "0x42cadad1c4a6282f9bb1ce2ec7ce0256f09ae91f", "Token721_Transfer": "0x70f5602e95818ac577a056b712b888a16e7714aa",
"Two_Coin_Transfer": "0xff535d3047b7587470e839209e36e2c4bedbf607", "Two_Coin_Transfer": "0x74a2d7fa4bc864e2366fd0fe95cde14266bc584c",
"Two_Token20_Transfer": "0x6898cdde8559e0fe2d7d68077bab4db0122b7d15", "Two_Token20_Transfer": "0xd855b2a515efd89d201067434afbd5facdd261fd",
"Two_Token721_Transfer": "0x17f2db82dc83d548bdc064f56b78e24862f75fe4" "Two_Token721_Transfer": "0xbf8a4ad0213685c3a13f2bceea01687e330298ca"
}, },
{ {
"Coin_Transfer": "0x6247716c5134a42d7d0feb272d49efc7d168dc47", "Coin_Transfer": "0x0d67a63bc5110e70029c9bf293129695758358a6",
"ERC20": "0xad3a37fe702f415b9b640b9d564f570924873d82", "ERC20": "0xbc43ceea0e97cc54cd402372c86a07ee7ee541bc",
"ERC721": "0xeac8C1F9918A4337C038d469e157C7Ff579767bA", "ERC721": "0x404425c0144697aa45df1155ae4b020f5e5b46f2",
"One_Coin_Transfer": "0xaa9e2254aba0285f861377665bfe854b863de4f8", "One_Coin_Transfer": "0x16a9636bbf398aae0ec30439bd1694747ae482ed",
"One_Read_Write": "0xfabc9b9f6f027947c09c80e201610b3d0d604344", "One_Read_Write": "0x767c103c8d478df44c751b9c75696b6ab02dab09",
"One_Token20_Transfer": "0xccc76e49ed363b36b87bbe15aacfcb5bb844fb67", "One_Token20_Transfer": "0xebbb2b870e7033c1118f5ce29434fb516cd8407f",
"One_Token721_Transfer": "0xd465066492ec1c5a843f985d145d92c963caf6da", "One_Token721_Transfer": "0xfd7948b8465c5de9e8413f4949dc3c8d6fe0ccd1",
"Read_Chain": "0xd014f0a02dd46cd26b8b3f7f6e82e3f5cbbfbe8b", "Read_Chain": "0x72b4fa81aa7a47013b4ab1a71fa20c9625e75c44",
"Read_Write": "0xed4e8e4c5a6b4421e68f15a6227b65a540a32e88", "Read_Write": "0xb77c2ec6b65a1a729ffc43f96268abc2aa82073a",
"Token20_Transfer": "0x99172a17c545bc036ea3f385b530ad04838a1660", "Token20_Transfer": "0xc34da4a383e8e7ca5f172b965df1ab89aa1d6acb",
"Token721_Transfer": "0x1aa08646ea9729cb7385145932f011459c8bc267", "Token721_Transfer": "0xa674fba5ce84f4a8cfbfaf5f1c3ba716bcc55732",
"Two_Coin_Transfer": "0x08a45eccdac3fd0e3238c519586ef9a27e1df883", "Two_Coin_Transfer": "0x07c8a4a3db3b0185b8d0592b983910b3609ebe31",
"Two_Token20_Transfer": "0x33250c6a91bb302ffba0304c2c39c8801e3f8913", "Two_Token20_Transfer": "0xd5d25d34e0b0e3978e630f03b6ac9c45b2aae2a4",
"Two_Token721_Transfer": "0x8ed13c75bf4e72f963812253ab27866fff70b218" "Two_Token721_Transfer": "0xe6fe4aa48aa2f9d8187fa13f01874adfa85d15d2"
}, },
{ {
"Coin_Transfer": "0x9347d3194439fb116370cff969593d79cfe2d433", "Coin_Transfer": "0xb684b37ec8f35115f0a624c013425b16aabb8c5c",
"ERC20": "0x83a60a11afe707aa3aeec8eebc1dbe9ed94aea2c", "ERC20": "0xf6208cd9310f19ab25136246aaea1f5958d5a2d7",
"ERC721": "0x98B12C56b562441e1c6fa467D376B04ED96Ae06D", "ERC721": "0x93e14ec7cbabc88146ba0bff0c600ee5aec4f382",
"One_Coin_Transfer": "0xb12907ddd95de81c1af911105841657ea1c9f75a", "One_Coin_Transfer": "0x4fe6ede7a8930acfb54b8d033ef2fe82ee9c03af",
"One_Read_Write": "0x006e7a861d302f5216fcced2a83ddee40d88b9d4", "One_Read_Write": "0x9e4e894dee5c3d6b8902207273a4fc07a1c74799",
"One_Token20_Transfer": "0x48c7047b3a16c4119dc7708e4f67894ecf225fd3", "One_Token20_Transfer": "0xac79e98d823d10c9d79040bcd80d56406d136df4",
"One_Token721_Transfer": "0xfe1eecab184b90abae0387b0f160130c00c6851c", "One_Token721_Transfer": "0x407d6ab88251172f2b76ed96c2aebde128af38ef",
"Read_Chain": "0xbd29c1fabd4d8be577918b944e559d2ebe170154", "Read_Chain": "0xaa76a90038f30d0fa29a72e8c33a3211bcc788d8",
"Read_Write": "0xb29d262862c3b3bc3dc04d9c39cbb7d283ab73d8", "Read_Write": "0x85fa032739d560708c705d350fb4c88933032d6a",
"Token20_Transfer": "0x9f1974b3a9fd0612fd040245b79fea3e1d7f06fa", "Token20_Transfer": "0xe1730a0d52a814f7b5a81342127240394af990ba",
"Token721_Transfer": "0xebcea2e5d56e83203ebfab8fa7d625bac57191a9", "Token721_Transfer": "0xff9b44554371dda78344134fc3a13c50be5bd479",
"Two_Coin_Transfer": "0x60b1dc15af5b9656ae6c96f3d016d71e13cb97f2", "Two_Coin_Transfer": "0xb9905ebe85fdaa20220e52295ebc3a4b5f0dc4a4",
"Two_Token20_Transfer": "0x9539a22a9dcb0d3e3f31d42bcfcae147084c2b1f", "Two_Token20_Transfer": "0xbd2f615d51250f0ce9e3120d1b2c0f35dd125395",
"Two_Token721_Transfer": "0xbc337175f6a1f35fd1fb01570a2b802d5c20c8c6" "Two_Token721_Transfer": "0x0e4141a3eafb005002db9193a6f00f8c1750d723"
}, },
{ {
"Coin_Transfer": "0x39ee6b50d409999d3aa1c7a46b512f8f8c70fa54", "Coin_Transfer": "0xf78a64e2032869fe92e781ea115beb015e88b52e",
"ERC20": "0x91f2c122c8060258605c287cea0bdda056b7b25d", "ERC20": "0x14f2567347beb8ed0fec95397940f17ef7a94541",
"ERC721": "0xb3106447c16e2fEe16693AD6175AC7e6299411aD", "ERC721": "0x658ad763a6273ed1affe98d020254650d2c9930e",
"One_Coin_Transfer": "0x9d0614f575e69f1f44fd9391ab7c94536edba67a", "One_Coin_Transfer": "0x1a3c8575f7eeed4188d3401a7cb6c2e712706b4e",
"One_Read_Write": "0xbdbbbe7bb874ae466e39a994bd079eb1596efb4e", "One_Read_Write": "0x8ac0189d77d9f272a4e5767393d820ccc4eaf6d0",
"One_Token20_Transfer": "0x2903adfeb04931aa46e5c214f7125a35c2874a4c", "One_Token20_Transfer": "0xd2e15ac631afd04338ea47db456c4e4134d1e4b5",
"One_Token721_Transfer": "0xf3f86fc99fe8173be298440edbdc40a629e1bcf8", "One_Token721_Transfer": "0x0e1db23f89fe9dfccbd1f00ced9eec0439bb6758",
"Read_Chain": "0x37c619274d0177c46bad99e681cb435414c1d810", "Read_Chain": "0x2e54edf7356beeb5b47a3434e645b6af6f9d09ea",
"Read_Write": "0x67d3d3d96fe2ea497e1ea6041bb99a09f1957b76", "Read_Write": "0x5493ce8fed7a6aeb2e62df2510c460a41b9907b5",
"Token20_Transfer": "0x1360e4d1f88e69126b651306f2344c8652beaf00", "Token20_Transfer": "0x2acc321f898bcf976070f3dc6629bf3d1479cc37",
"Token721_Transfer": "0x8661f43334c719e88893bc42c65d185a3e20f737", "Token721_Transfer": "0xabd447e855304b0d0ed59aa48b0903925e9b018d",
"Two_Coin_Transfer": "0x999c32d673a1fbbe3b0ff2a345b4faf9e3a3cd05", "Two_Coin_Transfer": "0x484e004c79779f52f4088c2d095d3619420c2133",
"Two_Token20_Transfer": "0x9f33a6f7e682ccae056e74b51588e81fb3189c39", "Two_Token20_Transfer": "0x3924bbc15efe484dd127fce960e283a774238cfa",
"Two_Token721_Transfer": "0x27b79866d089875ac50b7021ec41eed83c0358dd" "Two_Token721_Transfer": "0x636248bf39fbbd7a4e6a2d4bbe9f57cd6992ae60"
} }
] ]
\ No newline at end of file
...@@ -25,7 +25,7 @@ func main() { ...@@ -25,7 +25,7 @@ func main() {
// 转账交易case // 转账交易case
if len(tool.Cfg.TransferType) != 0 { if len(tool.Cfg.TransferType) != 0 {
accIndex := 0 accIndex := 12
nonceMap := util.GetAccountNonce(tool.Cfg.RpcNode) nonceMap := util.GetAccountNonce(tool.Cfg.RpcNode)
arrFormat := tool.ParseAccountConfig("./config/account.json") arrFormat := tool.ParseAccountConfig("./config/account.json")
parseContractConfig := tool.ParseContractConfig("./config/contractConfig.json") parseContractConfig := tool.ParseContractConfig("./config/contractConfig.json")
......
...@@ -34,7 +34,7 @@ func NrCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, accountNonceMap ...@@ -34,7 +34,7 @@ func NrCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, accountNonceMap
for i := 0; i < txCount; i++ { for i := 0; i < txCount; i++ {
toAddr := testAccArr.ToAddr[i] toAddr := testAccArr.ToAddr[i]
fromAddr := testAccArr.FromAddr[i] fromAddr := testAccArr.FromAddr[i]
beforeBal := util.GetAccBal(client, testAccArr.FromAddr[i]) beforeBal := util.GetAccBal(client, fromAddr)
if beforeBal == nil { if beforeBal == nil {
return nil, nil return nil, nil
} }
...@@ -55,9 +55,11 @@ func NrCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, accountNonceMap ...@@ -55,9 +55,11 @@ func NrCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, accountNonceMap
fromAddr := testAccArr.FromAddr[i] fromAddr := testAccArr.FromAddr[i]
sendAfterBal := util.GetAccBal(client, fromAddr) sendAfterBal := util.GetAccBal(client, fromAddr)
if sendAfterBal == nil { if sendAfterBal == nil {
log.Error("Verify error:", "get sendAfterBal err")
return false return false
} }
if sendBeforeBal[fromAddr].Sub(sendBeforeBal[fromAddr], sendAfterBal).Cmp(amount) == 1 { subBal := sendBeforeBal[fromAddr].Sub(sendBeforeBal[fromAddr], sendAfterBal)
if subBal.Cmp(amount) != 1 {
return false return false
} }
} }
...@@ -91,8 +93,8 @@ func NrContractCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, contract ...@@ -91,8 +93,8 @@ func NrContractCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, contract
value, _ := accountNonceMap.Load(testAccArr.FromAddr[i]) value, _ := accountNonceMap.Load(testAccArr.FromAddr[i])
auth.Nonce = big.NewInt(value.(int64)) auth.Nonce = big.NewInt(value.(int64))
auth.NoSend = true auth.NoSend = true
auth.GasLimit = 1000000000000 auth.GasLimit = 500000
auth.GasPrice = big.NewInt(10000000000) auth.GasPrice = big.NewInt(1000000000)
tx, err := contractCoinTrade.TransferSignTx(auth, coinTransfer) tx, err := contractCoinTrade.TransferSignTx(auth, coinTransfer)
if err != nil { if err != nil {
return nil, nil return nil, nil
...@@ -138,7 +140,7 @@ func NrContractOneCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, contr ...@@ -138,7 +140,7 @@ func NrContractOneCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, contr
value, _ := accountNonceMap.Load(testAccArr.FromAddr[i]) value, _ := accountNonceMap.Load(testAccArr.FromAddr[i])
auth.Nonce = big.NewInt(value.(int64)) auth.Nonce = big.NewInt(value.(int64))
auth.NoSend = true auth.NoSend = true
auth.GasLimit = 1000000000000 auth.GasLimit = 500000
auth.GasPrice = big.NewInt(10000000000) auth.GasPrice = big.NewInt(10000000000)
tx, err := contractCoinOneTrade.OneTransferSignTx(auth, oneChainCoinTransfer) tx, err := contractCoinOneTrade.OneTransferSignTx(auth, oneChainCoinTransfer)
if err != nil { if err != nil {
...@@ -256,11 +258,12 @@ func NrOneWRTranCase(testAccArr *tool.AccArrFormat, contractMap map[string]commo ...@@ -256,11 +258,12 @@ func NrOneWRTranCase(testAccArr *tool.AccArrFormat, contractMap map[string]commo
// NrErc20TranCase 单层-Erc20转账 // NrErc20TranCase 单层-Erc20转账
func NrErc20TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap map[string]common.Address, accountNonceMap *sync.Map, resTxArr []*types.Transaction, client *ethclient.Client) ([]*types.Transaction, func() bool) { func NrErc20TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap map[string]common.Address, accountNonceMap *sync.Map, resTxArr []*types.Transaction, client *ethclient.Client) ([]*types.Transaction, func() bool) {
erc20Addr := contractMap[constant.ERC20]
erc20Trade := &contractErc20.Erc20Trade{ erc20Trade := &contractErc20.Erc20Trade{
Erc20Addr: contractMap[constant.ERC20], Erc20Addr: erc20Addr,
Amount: big.NewInt(10000000000000000), Amount: big.NewInt(10000000000000000),
} }
erc20Contract, err := erc20.NewERC20(contractMap[constant.ERC20], client) erc20Contract, err := erc20.NewERC20(erc20Addr, client)
if err != nil { if err != nil {
log.Error("NewTokenTransfer error:", err.Error()) log.Error("NewTokenTransfer error:", err.Error())
return nil, nil return nil, nil
...@@ -289,6 +292,7 @@ func NrErc20TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap map ...@@ -289,6 +292,7 @@ func NrErc20TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap map
return nil, nil return nil, nil
} }
beforeToAddrErc20Bal[testAccArr.ToAddr[i]] = toBal beforeToAddrErc20Bal[testAccArr.ToAddr[i]] = toBal
auth.GasLimit = 500000
auth.GasPrice = big.NewInt(10000000000) auth.GasPrice = big.NewInt(10000000000)
value, _ := accountNonceMap.Load(testAccArr.FromAddr[i]) value, _ := accountNonceMap.Load(testAccArr.FromAddr[i])
auth.Nonce = big.NewInt(value.(int64)) auth.Nonce = big.NewInt(value.(int64))
...@@ -313,7 +317,7 @@ func NrErc20TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap map ...@@ -313,7 +317,7 @@ func NrErc20TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap map
log.Error("Get erc20 balanceOf error:", err.Error()) log.Error("Get erc20 balanceOf error:", err.Error())
return false return false
} }
if afterToken20Bal.Sub(afterToken20Bal, beforeToken20Bal).Cmp(erc20Trade.Amount.Mul(erc20Trade.Amount, big.NewInt(int64(txCount)))) != 0 { if beforeToken20Bal.Sub(beforeToken20Bal, afterToken20Bal).Cmp(big.NewInt(1).Mul(big.NewInt(10000000000000000), big.NewInt(int64(txCount)))) != 0 {
return false return false
} }
for i := 0; i < txCount; i++ { for i := 0; i < txCount; i++ {
...@@ -322,7 +326,7 @@ func NrErc20TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap map ...@@ -322,7 +326,7 @@ func NrErc20TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap map
log.Error("Get erc20 balanceOf error:", err.Error()) log.Error("Get erc20 balanceOf error:", err.Error())
return false return false
} }
if of.Sub(of, beforeToAddrErc20Bal[testAccArr.ToAddr[i]]).Cmp(erc20Trade.Amount) != 0 { if of.Sub(of, beforeToAddrErc20Bal[testAccArr.ToAddr[i]]).Cmp(big.NewInt(1).Mul(big.NewInt(10000000000000000), big.NewInt(2))) != 0 {
return false return false
} }
} }
...@@ -350,6 +354,7 @@ func NrOneErc20TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap ...@@ -350,6 +354,7 @@ func NrOneErc20TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap
} }
beforeToAddrErc20Bal := make(map[common.Address]*big.Int, 0) beforeToAddrErc20Bal := make(map[common.Address]*big.Int, 0)
beforeToken20Bal, err := erc20Contract.BalanceOf(&bind.CallOpts{}, contractMap[constant.TOKEN20_TRANSFER]) beforeToken20Bal, err := erc20Contract.BalanceOf(&bind.CallOpts{}, contractMap[constant.TOKEN20_TRANSFER])
log.Info("beforeToken20Bal:", beforeToken20Bal.String())
if err != nil { if err != nil {
log.Error("Get token20ContractBal erc20 balanceOf error:", err.Error()) log.Error("Get token20ContractBal erc20 balanceOf error:", err.Error())
return nil, nil return nil, nil
...@@ -369,7 +374,7 @@ func NrOneErc20TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap ...@@ -369,7 +374,7 @@ func NrOneErc20TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap
value, _ := accountNonceMap.Load(testAccArr.FromAddr[i]) value, _ := accountNonceMap.Load(testAccArr.FromAddr[i])
auth.Nonce = big.NewInt(value.(int64)) auth.Nonce = big.NewInt(value.(int64))
auth.NoSend = true auth.NoSend = true
auth.GasLimit = 1000000000000 auth.GasLimit = 500000
auth.GasPrice = big.NewInt(10000000000) auth.GasPrice = big.NewInt(10000000000)
tx, err := oneErc20Trade.Erc20OneTransferTx(auth, tokenTransfer) tx, err := oneErc20Trade.Erc20OneTransferTx(auth, tokenTransfer)
if err != nil { if err != nil {
...@@ -378,13 +383,10 @@ func NrOneErc20TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap ...@@ -378,13 +383,10 @@ func NrOneErc20TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap
log.Info("Erc20OneTransferTx tx:", tx.Hash().Hex()) log.Info("Erc20OneTransferTx tx:", tx.Hash().Hex())
resTxArr = append(resTxArr, tx) 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 { verify := func() bool {
if beforeToken20Bal.Sub(beforeToken20Bal, afterToken20Bal).Cmp(amount.Mul(amount, big.NewInt(int64(txCount)))) != 0 { afterToken20Bal, err := erc20Contract.BalanceOf(&bind.CallOpts{}, contractMap[constant.TOKEN20_TRANSFER])
if err != nil {
log.Error("Get token20ContractBal erc20 balanceOf error:", err.Error())
return false return false
} }
for i := 0; i < txCount; i++ { for i := 0; i < txCount; i++ {
...@@ -397,13 +399,16 @@ func NrOneErc20TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap ...@@ -397,13 +399,16 @@ func NrOneErc20TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap
return false return false
} }
} }
if beforeToken20Bal.Sub(beforeToken20Bal, afterToken20Bal).Cmp(amount.Mul(amount, big.NewInt(int64(txCount)))) != 0 {
return false
}
return true return true
} }
return resTxArr, verify return resTxArr, verify
} }
// NrErc721TranCase 单层-Erc721转账 // NrErc721TranCase 单层-Erc721转账
func NrErc721TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap map[string]common.Address, accountNonceMap *sync.Map, resTxArr []*types.Transaction, client *ethclient.Client) ([]*types.Transaction, func() bool) { func NrErc721TranCase(startIndex int, 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{ erc721Trade := &contractErc721.Erc721Trade{
Erc721Addr: contractMap[constant.ERC721], Erc721Addr: contractMap[constant.ERC721],
} }
...@@ -437,11 +442,11 @@ func NrErc721TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap ma ...@@ -437,11 +442,11 @@ func NrErc721TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap ma
beforeToErc721Bal[testAccArr.ToAddr[i]] = toErc721Bal beforeToErc721Bal[testAccArr.ToAddr[i]] = toErc721Bal
beforeFromErc721Bal[testAccArr.FromAddr[i]] = fromErc721Bal beforeFromErc721Bal[testAccArr.FromAddr[i]] = fromErc721Bal
erc721Trade.FromAddr = testAccArr.FromAddr[i] erc721Trade.FromAddr = testAccArr.FromAddr[i]
// todo 需要初始化时知道sender对应的tokenId erc721Trade.TokenId = big.NewInt(int64(startIndex))
erc721Trade.TokenId = big.NewInt(int64(i))
value, _ := accountNonceMap.Load(testAccArr.FromAddr[i]) value, _ := accountNonceMap.Load(testAccArr.FromAddr[i])
auth.Nonce = big.NewInt(value.(int64)) auth.Nonce = big.NewInt(value.(int64))
auth.NoSend = true auth.NoSend = true
auth.GasLimit = 500000
auth.GasPrice = big.NewInt(10000000000) auth.GasPrice = big.NewInt(10000000000)
tx, err := erc721Trade.Erc721TransferFromSignTx(auth, tokenTransfer) tx, err := erc721Trade.Erc721TransferFromSignTx(auth, tokenTransfer)
if err != nil { if err != nil {
...@@ -450,6 +455,7 @@ func NrErc721TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap ma ...@@ -450,6 +455,7 @@ func NrErc721TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap ma
} }
log.Info("Erc721TransferFromSignTx tx:", tx.Hash().Hex()) log.Info("Erc721TransferFromSignTx tx:", tx.Hash().Hex())
resTxArr = append(resTxArr, tx) resTxArr = append(resTxArr, tx)
startIndex++
} }
verify := func() bool { verify := func() bool {
for i := 0; i < txCount; i++ { for i := 0; i < txCount; i++ {
...@@ -458,7 +464,7 @@ func NrErc721TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap ma ...@@ -458,7 +464,7 @@ func NrErc721TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap ma
log.Error("Get erc721 bal error:", err.Error()) log.Error("Get erc721 bal error:", err.Error())
return false return false
} }
if beforeToErc721Bal[testAccArr.ToAddr[i]].Sub(beforeToErc721Bal[testAccArr.ToAddr[i]], toErc721Bal).Cmp(big.NewInt(1)) != 0 { if toErc721Bal.Sub(toErc721Bal, beforeToErc721Bal[testAccArr.ToAddr[i]]).Cmp(big.NewInt(1)) != 0 {
return false return false
} }
fromErc721Bal, err := erc721Contract.BalanceOf(&bind.CallOpts{}, testAccArr.FromAddr[i]) fromErc721Bal, err := erc721Contract.BalanceOf(&bind.CallOpts{}, testAccArr.FromAddr[i])
...@@ -466,7 +472,7 @@ func NrErc721TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap ma ...@@ -466,7 +472,7 @@ func NrErc721TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap ma
log.Error("Get erc721 bal error:", err.Error()) log.Error("Get erc721 bal error:", err.Error())
return false return false
} }
if beforeFromErc721Bal[testAccArr.FromAddr[i]].Sub(beforeToErc721Bal[testAccArr.FromAddr[i]], fromErc721Bal).Cmp(big.NewInt(1)) != 0 { if beforeFromErc721Bal[testAccArr.FromAddr[i]].Sub(beforeFromErc721Bal[testAccArr.FromAddr[i]], fromErc721Bal).Cmp(big.NewInt(1)) != 0 {
return false return false
} }
} }
...@@ -476,7 +482,7 @@ func NrErc721TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap ma ...@@ -476,7 +482,7 @@ func NrErc721TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap ma
} }
// NrOneErc721TranCase 多层-Erc721转账 // NrOneErc721TranCase 多层-Erc721转账
func NrOneErc721TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap map[string]common.Address, accountNonceMap *sync.Map, resTxArr []*types.Transaction, client *ethclient.Client) ([]*types.Transaction, func() bool) { func NrOneErc721TranCase(startIndex int, txCount int, testAccArr *tool.AccArrFormat, contractMap map[string]common.Address, accountNonceMap *sync.Map, resTxArr []*types.Transaction, client *ethclient.Client) ([]*types.Transaction, func() bool) {
oneErc721Trade := &contractErc721.OneErc721Trade{ oneErc721Trade := &contractErc721.OneErc721Trade{
NftTokenTransferAddr: contractMap[constant.TOKEN721_TRANSFER], NftTokenTransferAddr: contractMap[constant.TOKEN721_TRANSFER],
Erc721Addr: contractMap[constant.ERC721], Erc721Addr: contractMap[constant.ERC721],
...@@ -510,10 +516,11 @@ func NrOneErc721TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap ...@@ -510,10 +516,11 @@ func NrOneErc721TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap
} }
beforeToErc721Bal[testAccArr.ToAddr[i]] = toErc721Bal beforeToErc721Bal[testAccArr.ToAddr[i]] = toErc721Bal
beforeFromErc721Bal[testAccArr.FromAddr[i]] = fromErc721Bal beforeFromErc721Bal[testAccArr.FromAddr[i]] = fromErc721Bal
oneErc721Trade.TokenId = big.NewInt(int64(i)) oneErc721Trade.TokenId = big.NewInt(int64(startIndex))
value, _ := accountNonceMap.Load(testAccArr.FromAddr[i]) value, _ := accountNonceMap.Load(testAccArr.FromAddr[i])
auth.Nonce = big.NewInt(value.(int64)) auth.Nonce = big.NewInt(value.(int64))
auth.NoSend = true auth.NoSend = true
auth.GasLimit = 500000
auth.GasPrice = big.NewInt(10000000000) auth.GasPrice = big.NewInt(10000000000)
tx, err := oneErc721Trade.Erc721OneTransferFromSignTx(auth, tokenTransfer) tx, err := oneErc721Trade.Erc721OneTransferFromSignTx(auth, tokenTransfer)
if err != nil { if err != nil {
...@@ -530,7 +537,7 @@ func NrOneErc721TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap ...@@ -530,7 +537,7 @@ func NrOneErc721TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap
log.Error("Get erc721 bal error:", err.Error()) log.Error("Get erc721 bal error:", err.Error())
return false return false
} }
if beforeToErc721Bal[testAccArr.ToAddr[i]].Sub(beforeToErc721Bal[testAccArr.ToAddr[i]], toErc721Bal).Cmp(big.NewInt(1)) != 0 { if toErc721Bal.Sub(toErc721Bal, beforeToErc721Bal[testAccArr.ToAddr[i]]).Cmp(big.NewInt(1)) != 0 {
return false return false
} }
fromErc721Bal, err := erc721Contract.BalanceOf(&bind.CallOpts{}, testAccArr.FromAddr[i]) fromErc721Bal, err := erc721Contract.BalanceOf(&bind.CallOpts{}, testAccArr.FromAddr[i])
...@@ -538,7 +545,7 @@ func NrOneErc721TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap ...@@ -538,7 +545,7 @@ func NrOneErc721TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap
log.Error("Get erc721 bal error:", err.Error()) log.Error("Get erc721 bal error:", err.Error())
return false return false
} }
if beforeFromErc721Bal[testAccArr.FromAddr[i]].Sub(beforeToErc721Bal[testAccArr.FromAddr[i]], fromErc721Bal).Cmp(big.NewInt(1)) != 0 { if beforeFromErc721Bal[testAccArr.FromAddr[i]].Sub(beforeFromErc721Bal[testAccArr.FromAddr[i]], fromErc721Bal).Cmp(big.NewInt(1)) != 0 {
return false return false
} }
} }
......
...@@ -73,8 +73,8 @@ func DeployContract(client *ethclient.Client, txRes []*types.Transaction) []*typ ...@@ -73,8 +73,8 @@ 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(5000000000) auth.GasLimit = uint64(4000000)
auth.GasPrice = big.NewInt(5000000000) auth.GasPrice = big.NewInt(4000000)
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)
...@@ -355,12 +355,12 @@ func GetTranFunc(caseType int, startIndex int, txCount int, nonceMap *sync.Map, ...@@ -355,12 +355,12 @@ func GetTranFunc(caseType int, startIndex int, txCount int, nonceMap *sync.Map,
// 不相关-单层-Erc721转账 // 不相关-单层-Erc721转账
case 8: case 8:
{ {
return NrErc721TranCase(txCount, arr, contractArr[0], nonceMap, txArr, client) return NrErc721TranCase(startIndex, txCount, arr, contractArr[0], nonceMap, txArr, client)
} }
// 不相关-多层-Erc721转账 // 不相关-多层-Erc721转账
case 9: case 9:
{ {
return NrOneErc721TranCase(txCount, arr, contractArr[0], nonceMap, txArr, client) return NrOneErc721TranCase(startIndex, txCount, arr, contractArr[0], nonceMap, txArr, client)
} }
// 部分相关-普通转账-接受者相关 // 部分相关-普通转账-接受者相关
case 10: case 10:
......
...@@ -56,24 +56,23 @@ func PrReCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, accountNonceMa ...@@ -56,24 +56,23 @@ func PrReCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, accountNonceMa
resTxArr = append(resTxArr, tx) resTxArr = append(resTxArr, tx)
} }
verify := func() bool { verify := func() bool {
reToAfterBal := util.GetAccBal(client, toAddr)
if reToAfterBal == nil {
return false
}
if beforeToBal.Sub(beforeToBal, reToAfterBal).Cmp(amount.Mul(amount, big.NewInt(int64(txCount)))) != 0 {
return false
}
for i := 0; i < txCount; i++ { for i := 0; i < txCount; i++ {
fromAddr := testAccArr.FromAddr[i] fromAddr := testAccArr.FromAddr[i]
sendAfterBal := util.GetAccBal(client, fromAddr) sendAfterBal := util.GetAccBal(client, fromAddr)
if sendAfterBal == nil { if sendAfterBal == nil {
return false return false
} }
if sendBeforeBal[fromAddr].Sub(sendBeforeBal[fromAddr], sendAfterBal).Cmp(amount) == 1 { if sendBeforeBal[fromAddr].Sub(sendBeforeBal[fromAddr], sendAfterBal).Cmp(amount) != 1 {
return false return false
} }
} }
reToAfterBal := util.GetAccBal(client, toAddr)
if reToAfterBal == nil {
return false
}
if reToAfterBal.Sub(reToAfterBal, beforeToBal).Cmp(amount.Mul(amount, big.NewInt(int64(txCount)))) != 0 {
return false
}
return true return true
} }
return resTxArr, verify return resTxArr, verify
...@@ -114,13 +113,6 @@ func PrSpCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, accountNonceMa ...@@ -114,13 +113,6 @@ func PrSpCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, accountNonceMa
resTxArr = append(resTxArr, tx) resTxArr = append(resTxArr, tx)
} }
verify := func() bool { verify := func() bool {
sendAfterBal := util.GetAccBal(client, fromAddr)
if sendAfterBal == nil {
return false
}
if beforeFromBal.Sub(beforeFromBal, sendAfterBal).Cmp(amount.Mul(amount, big.NewInt(int64(txCount)))) != 1 {
return false
}
for i := 0; i < txCount; i++ { for i := 0; i < txCount; i++ {
toAddr := testAccArr.ToAddr[i] toAddr := testAccArr.ToAddr[i]
reAfterBal := util.GetAccBal(client, toAddr) reAfterBal := util.GetAccBal(client, toAddr)
...@@ -131,6 +123,13 @@ func PrSpCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, accountNonceMa ...@@ -131,6 +123,13 @@ func PrSpCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, accountNonceMa
return false return false
} }
} }
sendAfterBal := util.GetAccBal(client, fromAddr)
if sendAfterBal == nil {
return false
}
if beforeFromBal.Sub(beforeFromBal, sendAfterBal).Cmp(amount.Mul(amount, big.NewInt(int64(txCount)))) != 1 {
return false
}
return true return true
} }
return resTxArr, verify return resTxArr, verify
...@@ -196,7 +195,7 @@ func PrSpReCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, accountNonce ...@@ -196,7 +195,7 @@ func PrSpReCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, accountNonce
if reToAfterBal == nil { if reToAfterBal == nil {
return false return false
} }
if reToAfterBal.Sub(reToAfterBal, beforeToBal).Cmp(big.NewInt(0)) != 1 { if beforeToBal.Sub(beforeToBal, reToAfterBal).Cmp(big.NewInt(0)) != 1 {
return false return false
} }
// C账户余额校验 // C账户余额校验
...@@ -267,7 +266,7 @@ func AllPrSpReCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, accountNo ...@@ -267,7 +266,7 @@ func AllPrSpReCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, accountNo
if reToAfterBal == nil { if reToAfterBal == nil {
return false return false
} }
if reToAfterBal.Sub(reToAfterBal, beforeToBal).Cmp(big.NewInt(0)) != 1 { if beforeToBal.Sub(beforeToBal, reToAfterBal).Cmp(big.NewInt(0)) != 1 {
return false return false
} }
return true return true
...@@ -307,7 +306,7 @@ func PrReContractCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, contra ...@@ -307,7 +306,7 @@ func PrReContractCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, contra
value, _ := accountNonceMap.Load(testAccArr.FromAddr[i]) value, _ := accountNonceMap.Load(testAccArr.FromAddr[i])
auth.Nonce = big.NewInt(value.(int64)) auth.Nonce = big.NewInt(value.(int64))
auth.NoSend = true auth.NoSend = true
auth.GasLimit = 1000000000000 auth.GasLimit = 500000
auth.GasPrice = big.NewInt(10000000000) auth.GasPrice = big.NewInt(10000000000)
tx, err := contractCoinTrade.TransferSignTx(auth, coinTransfer) tx, err := contractCoinTrade.TransferSignTx(auth, coinTransfer)
if err != nil { if err != nil {
...@@ -323,7 +322,7 @@ func PrReContractCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, contra ...@@ -323,7 +322,7 @@ func PrReContractCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, contra
if sendBeforeBal == nil { if sendBeforeBal == nil {
return false return false
} }
if sendBeforeBal.Sub(sendBeforeBal, sendAfterBal).Cmp(amount.Mul(amount, big.NewInt(int64(txCount)))) != 0 { if sendBeforeBal.Sub(sendBeforeBal, sendAfterBal).Cmp(amount) != 0 {
return false return false
} }
} }
...@@ -331,7 +330,7 @@ func PrReContractCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, contra ...@@ -331,7 +330,7 @@ func PrReContractCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, contra
if reAfterToBal == nil { if reAfterToBal == nil {
return false return false
} }
if reAfterToBal.Sub(reAfterToBal, reBeforeToBal).Cmp(amount.Mul(amount, big.NewInt(int64(txCount)))) != 0 { if reAfterToBal.Sub(reAfterToBal, reBeforeToBal).Cmp(big.NewInt(1).Mul(amount, big.NewInt(int64(txCount)))) != 0 {
return false return false
} }
return true return true
...@@ -373,7 +372,7 @@ func PrSpContractCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, contra ...@@ -373,7 +372,7 @@ func PrSpContractCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, contra
value, _ := accountNonceMap.Load(fromAddr) value, _ := accountNonceMap.Load(fromAddr)
auth.Nonce = big.NewInt(value.(int64)) auth.Nonce = big.NewInt(value.(int64))
auth.NoSend = true auth.NoSend = true
auth.GasLimit = 1000000000000 auth.GasLimit = 500000
auth.GasPrice = big.NewInt(10000000000) auth.GasPrice = big.NewInt(10000000000)
tx, err := contractCoinTrade.TransferSignTx(auth, coinTransfer) tx, err := contractCoinTrade.TransferSignTx(auth, coinTransfer)
if err != nil { if err != nil {
...@@ -384,14 +383,6 @@ func PrSpContractCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, contra ...@@ -384,14 +383,6 @@ func PrSpContractCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, contra
resTxArr = append(resTxArr, tx) resTxArr = append(resTxArr, tx)
} }
verify := func() bool { verify := func() bool {
sendAfterBal, err := client.BalanceAt(context.Background(), coinTranAddr, nil)
if err != nil {
log.Error("Get ", coinTranAddr, " balance error: ", err.Error())
return false
}
if sendBeforeBal.Sub(sendBeforeBal, sendAfterBal).Cmp(amount.Mul(amount, big.NewInt(int64(txCount)))) != 0 {
return false
}
for i := 0; i < txCount; i++ { for i := 0; i < txCount; i++ {
toAddr := testAccArr.ToAddr[i] toAddr := testAccArr.ToAddr[i]
reAfterToBal := util.GetAccBal(client, toAddr) reAfterToBal := util.GetAccBal(client, toAddr)
...@@ -402,6 +393,14 @@ func PrSpContractCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, contra ...@@ -402,6 +393,14 @@ func PrSpContractCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, contra
return false return false
} }
} }
sendAfterBal, err := client.BalanceAt(context.Background(), coinTranAddr, nil)
if err != nil {
log.Error("Get ", coinTranAddr, " balance error: ", err.Error())
return false
}
if sendBeforeBal.Sub(sendBeforeBal, sendAfterBal).Cmp(amount.Mul(amount, big.NewInt(int64(txCount)))) != 0 {
return false
}
return true return true
} }
return resTxArr, verify return resTxArr, verify
...@@ -441,7 +440,7 @@ func PrReSpContractCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, cont ...@@ -441,7 +440,7 @@ func PrReSpContractCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, cont
value, _ := accountNonceMap.Load(fromAddr) value, _ := accountNonceMap.Load(fromAddr)
auth.Nonce = big.NewInt(value.(int64)) auth.Nonce = big.NewInt(value.(int64))
auth.NoSend = true auth.NoSend = true
auth.GasLimit = 1000000000000 auth.GasLimit = 500000
auth.GasPrice = big.NewInt(10000000000) auth.GasPrice = big.NewInt(10000000000)
coinTransfer, err := contractCoin.NewChainCoinTransfer(coinTranAddr, client) coinTransfer, err := contractCoin.NewChainCoinTransfer(coinTranAddr, client)
if err != nil { if err != nil {
...@@ -457,14 +456,19 @@ func PrReSpContractCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, cont ...@@ -457,14 +456,19 @@ func PrReSpContractCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, cont
// B -> b 合约 -> C 账户转账 // B -> b 合约 -> C 账户转账
toAddr1 := testAccArr.ToAddr[1] toAddr1 := testAccArr.ToAddr[1]
reBeforeTo1Bal, err := client.BalanceAt(context.Background(), toAddr1, nil)
if err != nil {
log.Error("Get ", coinTranAddr, " balance error: ", err.Error())
return nil, nil
}
auth, err = bind.NewKeyedTransactorWithChainID(toPrv, tool.Cfg.ChainId) auth, err = bind.NewKeyedTransactorWithChainID(toPrv, tool.Cfg.ChainId)
if err != nil { if err != nil {
log.Errorf("DeployTokenTransfer func newKeyedTransactorWithChainID err:", err) log.Errorf("DeployTokenTransfer func newKeyedTransactorWithChainID err:", err)
} }
value, _ = accountNonceMap.Load(toPrv) value, _ = accountNonceMap.Load(toAddr)
auth.Nonce = big.NewInt(value.(int64)) auth.Nonce = big.NewInt(value.(int64))
auth.NoSend = true auth.NoSend = true
auth.GasLimit = 1000000000000 auth.GasLimit = 500000
auth.GasPrice = big.NewInt(10000000000) auth.GasPrice = big.NewInt(10000000000)
contractCoinTrade.ToAddr = []common.Address{toAddr1} contractCoinTrade.ToAddr = []common.Address{toAddr1}
coinTransfer1, err := contractCoin.NewChainCoinTransfer(coinTranAddr1, client) coinTransfer1, err := contractCoin.NewChainCoinTransfer(coinTranAddr1, client)
...@@ -485,23 +489,34 @@ func PrReSpContractCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, cont ...@@ -485,23 +489,34 @@ func PrReSpContractCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, cont
if sendAfterBal == nil { if sendAfterBal == nil {
return false return false
} }
if sendBeforeCoinBal.Sub(sendBeforeCoinBal, sendAfterBal).Cmp(amount.Mul(amount, big.NewInt(int64(txCount)))) != 0 { if sendBeforeCoinBal.Sub(sendBeforeCoinBal, sendAfterBal).Cmp(amount) != 0 {
return false return false
} }
// 校验 b合约 // 校验 b合约
sendAfterCoin1Bal := util.GetAccBal(client, coinTranAddr1) sendAfterCoin1Bal := util.GetAccBal(client, coinTranAddr1)
if sendAfterBal == nil { if sendAfterBal == nil {
return false return false
} }
if sendBeforeCoin1Bal.Sub(sendBeforeCoin1Bal, sendAfterCoin1Bal).Cmp(amount.Mul(amount, big.NewInt(int64(txCount)))) != 0 { if sendBeforeCoin1Bal.Sub(sendBeforeCoin1Bal, sendAfterCoin1Bal).Cmp(amount) != 0 {
return false return false
} }
// 校验 B 账户 // 校验 B 账户
reAfterToBal := util.GetAccBal(client, toAddr) reAfterToBal := util.GetAccBal(client, toAddr)
if sendAfterBal == nil { if reAfterToBal == nil {
return false
}
if reAfterToBal.Sub(reAfterToBal, reBeforeToBal).Cmp(amount) != -1 {
return false
}
// 校验 C 账户
reAfterTo1Bal := util.GetAccBal(client, toAddr1)
if reAfterTo1Bal == nil {
return false return false
} }
if reAfterToBal.Sub(reAfterToBal, reBeforeToBal).Cmp(amount) != 0 { if reAfterTo1Bal.Sub(reAfterTo1Bal, reBeforeTo1Bal).Cmp(amount) != 0 {
return false return false
} }
return true return true
...@@ -542,7 +557,7 @@ func PrReContractOneCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, con ...@@ -542,7 +557,7 @@ func PrReContractOneCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, con
value, _ := accountNonceMap.Load(testAccArr.FromAddr[i]) value, _ := accountNonceMap.Load(testAccArr.FromAddr[i])
auth.Nonce = big.NewInt(value.(int64)) auth.Nonce = big.NewInt(value.(int64))
auth.NoSend = true auth.NoSend = true
auth.GasLimit = 1000000000000 auth.GasLimit = 500000
auth.GasPrice = big.NewInt(10000000000) auth.GasPrice = big.NewInt(10000000000)
tx, err := contractCoinOneTrade.OneTransferSignTx(auth, oneChainCoinTransfer) tx, err := contractCoinOneTrade.OneTransferSignTx(auth, oneChainCoinTransfer)
if err != nil { if err != nil {
...@@ -559,7 +574,7 @@ func PrReContractOneCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, con ...@@ -559,7 +574,7 @@ func PrReContractOneCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, con
if sendAfterBal == nil { if sendAfterBal == nil {
return false return false
} }
if sendBeforeBal.Sub(sendBeforeBal, sendAfterBal).Cmp(amount.Mul(amount, big.NewInt(int64(txCount)))) != 0 { if sendBeforeBal.Sub(sendBeforeBal, sendAfterBal).Cmp(amount) != 0 {
return false return false
} }
} }
...@@ -567,7 +582,7 @@ func PrReContractOneCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, con ...@@ -567,7 +582,7 @@ func PrReContractOneCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, con
if reAfterToBal == nil { if reAfterToBal == nil {
return false return false
} }
if reAfterToBal.Sub(reAfterToBal, reBeforeToBal).Cmp(amount.Mul(amount, big.NewInt(int64(txCount)))) != 0 { if reAfterToBal.Sub(reAfterToBal, reBeforeToBal).Cmp(big.NewInt(1).Mul(amount, big.NewInt(int64(txCount)))) != 0 {
return false return false
} }
return true return true
...@@ -578,11 +593,6 @@ func PrReContractOneCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, con ...@@ -578,11 +593,6 @@ func PrReContractOneCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, con
// PrSpContractOneCoinTranCase 多层-合约转账-发送者相关 // PrSpContractOneCoinTranCase 多层-合约转账-发送者相关
func PrSpContractOneCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap []map[string]common.Address, accountNonceMap *sync.Map, resTxArr []*types.Transaction, client *ethclient.Client) ([]*types.Transaction, func() bool) { func PrSpContractOneCoinTranCase(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(100000000000000000) amount := big.NewInt(100000000000000000)
toAddr := testAccArr.ToAddr[0]
reBeforeToBal := util.GetAccBal(client, toAddr)
if reBeforeToBal == nil {
return nil, nil
}
coinTranAddr := contractMap[0][constant.COIN_TRANSFER] coinTranAddr := contractMap[0][constant.COIN_TRANSFER]
contractCoinOneTrade := &coin.ContractCoinOneTrade{ contractCoinOneTrade := &coin.ContractCoinOneTrade{
ChainContractAdr: contractMap[0][constant.COIN_TRANSFER], ChainContractAdr: contractMap[0][constant.COIN_TRANSFER],
...@@ -593,14 +603,18 @@ func PrSpContractOneCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, con ...@@ -593,14 +603,18 @@ func PrSpContractOneCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, con
log.Error("NewOneChainCoinTransfer error:", err.Error()) log.Error("NewOneChainCoinTransfer error:", err.Error())
return nil, nil return nil, nil
} }
sendBeforeContractBalMap := make(map[common.Address]*big.Int, 0) reBeforeToBalMap := make(map[common.Address]*big.Int, 0)
sendBeforeBal := util.GetAccBal(client, coinTranAddr) sendBeforeBal := util.GetAccBal(client, coinTranAddr)
if sendBeforeBal == nil { if sendBeforeBal == nil {
return nil, nil return nil, nil
} }
sendBeforeContractBalMap[contractMap[0][constant.COIN_TRANSFER]] = sendBeforeBal
for i := 0; i < txCount; i++ { for i := 0; i < txCount; i++ {
toAddr := testAccArr.ToAddr[i]
reBeforeToBal := util.GetAccBal(client, toAddr)
if reBeforeToBal == nil {
return nil, nil
}
reBeforeToBalMap[toAddr] = reBeforeToBal
contractCoinOneTrade.ToAddr = []common.Address{toAddr} contractCoinOneTrade.ToAddr = []common.Address{toAddr}
auth, err := bind.NewKeyedTransactorWithChainID(testAccArr.FromPrv[i], tool.Cfg.ChainId) auth, err := bind.NewKeyedTransactorWithChainID(testAccArr.FromPrv[i], tool.Cfg.ChainId)
if err != nil { if err != nil {
...@@ -609,7 +623,7 @@ func PrSpContractOneCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, con ...@@ -609,7 +623,7 @@ func PrSpContractOneCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, con
value, _ := accountNonceMap.Load(testAccArr.FromAddr[i]) value, _ := accountNonceMap.Load(testAccArr.FromAddr[i])
auth.Nonce = big.NewInt(value.(int64)) auth.Nonce = big.NewInt(value.(int64))
auth.NoSend = true auth.NoSend = true
auth.GasLimit = 1000000000000 auth.GasLimit = 500000
auth.GasPrice = big.NewInt(10000000000) auth.GasPrice = big.NewInt(10000000000)
tx, err := contractCoinOneTrade.OneTransferSignTx(auth, oneChainCoinTransfer) tx, err := contractCoinOneTrade.OneTransferSignTx(auth, oneChainCoinTransfer)
if err != nil { if err != nil {
...@@ -620,23 +634,24 @@ func PrSpContractOneCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, con ...@@ -620,23 +634,24 @@ func PrSpContractOneCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, con
} }
verify := func() bool { verify := func() bool {
for i := 0; i < txCount; i++ { for i := 0; i < txCount; i++ {
coinAddr := contractMap[i][constant.COIN_TRANSFER] reAfterToBal := util.GetAccBal(client, testAccArr.ToAddr[i])
sendBeforeBal := sendBeforeContractBalMap[coinAddr] if reAfterToBal == nil {
sendAfterBal := util.GetAccBal(client, coinAddr)
if sendAfterBal == nil {
return false return false
} }
if sendBeforeBal.Sub(sendBeforeBal, sendAfterBal).Cmp(amount.Mul(amount, big.NewInt(int64(txCount)))) != 0 { if reAfterToBal.Sub(reAfterToBal, reBeforeToBalMap[testAccArr.ToAddr[i]]).Cmp(amount) != 0 {
return false return false
} }
} }
reAfterToBal := util.GetAccBal(client, toAddr)
if reAfterToBal == nil { coinAddr := contractMap[0][constant.COIN_TRANSFER]
sendAfterBal := util.GetAccBal(client, coinAddr)
if sendAfterBal == nil {
return false return false
} }
if reAfterToBal.Sub(reAfterToBal, reBeforeToBal).Cmp(amount.Mul(amount, big.NewInt(int64(txCount)))) != 0 { if sendBeforeBal.Sub(sendBeforeBal, sendAfterBal).Cmp(amount.Mul(amount, big.NewInt(int64(txCount)))) != 0 {
return false return false
} }
return true return true
} }
return resTxArr, verify return resTxArr, verify
...@@ -828,6 +843,7 @@ func PrReErc20TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap m ...@@ -828,6 +843,7 @@ func PrReErc20TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap m
log.Errorf("DeployTokenTransfer func newKeyedTransactorWithChainID err:", err) log.Errorf("DeployTokenTransfer func newKeyedTransactorWithChainID err:", err)
} }
auth.NoSend = true auth.NoSend = true
auth.GasLimit = 500000
auth.GasPrice = big.NewInt(10000000000) auth.GasPrice = big.NewInt(10000000000)
value, _ := accountNonceMap.Load(testAccArr.FromAddr[0]) value, _ := accountNonceMap.Load(testAccArr.FromAddr[0])
auth.Nonce = big.NewInt(value.(int64)) auth.Nonce = big.NewInt(value.(int64))
...@@ -843,7 +859,7 @@ func PrReErc20TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap m ...@@ -843,7 +859,7 @@ func PrReErc20TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap m
log.Error("Get erc20 balanceOf error:", err.Error()) log.Error("Get erc20 balanceOf error:", err.Error())
return false return false
} }
if afterToken20Bal.Sub(afterToken20Bal, beforeToken20Bal).Cmp(erc20Trade.Amount.Mul(erc20Trade.Amount, big.NewInt(int64(txCount)))) != 0 { if beforeToken20Bal.Sub(beforeToken20Bal, afterToken20Bal).Cmp(big.NewInt(1).Mul(erc20Trade.Amount, big.NewInt(int64(txCount)))) != 0 {
return false return false
} }
for i := 0; i < txCount; i++ { for i := 0; i < txCount; i++ {
...@@ -902,7 +918,7 @@ func PrSpOneErc20TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMa ...@@ -902,7 +918,7 @@ func PrSpOneErc20TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMa
value, _ := accountNonceMap.Load(testAccArr.FromAddr[0]) value, _ := accountNonceMap.Load(testAccArr.FromAddr[0])
auth.Nonce = big.NewInt(value.(int64)) auth.Nonce = big.NewInt(value.(int64))
auth.NoSend = true auth.NoSend = true
auth.GasLimit = 1000000000000 auth.GasLimit = 500000
auth.GasPrice = big.NewInt(10000000000) auth.GasPrice = big.NewInt(10000000000)
tx, err := oneErc20Trade.Erc20OneTransferTx(auth, tokenTransfer) tx, err := oneErc20Trade.Erc20OneTransferTx(auth, tokenTransfer)
if err != nil { if err != nil {
...@@ -910,13 +926,14 @@ func PrSpOneErc20TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMa ...@@ -910,13 +926,14 @@ func PrSpOneErc20TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMa
} }
log.Info("Erc20OneTransferTx tx:", tx.Hash().Hex()) log.Info("Erc20OneTransferTx tx:", tx.Hash().Hex())
resTxArr = append(resTxArr, tx) 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 { verify := func() bool {
if beforeToken20Bal.Sub(beforeToken20Bal, afterToken20Bal).Cmp(amount.Mul(amount, big.NewInt(int64(txCount)))) != 0 { afterToken20Bal, err := erc20Contract.BalanceOf(&bind.CallOpts{}, contractMap[constant.TOKEN20_TRANSFER])
if err != nil {
log.Error("Get token20ContractBal erc20 balanceOf error:", err.Error())
return false
}
if beforeToken20Bal.Sub(beforeToken20Bal, afterToken20Bal).Cmp(big.NewInt(1).Mul(amount, big.NewInt(int64(txCount)))) != 0 {
return false return false
} }
for i := 0; i < txCount; i++ { for i := 0; i < txCount; i++ {
...@@ -950,28 +967,29 @@ func PrReSpErc20TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap ...@@ -950,28 +967,29 @@ func PrReSpErc20TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap
log.Error("NewTokenTransfer error:", err.Error()) log.Error("NewTokenTransfer error:", err.Error())
return nil, nil return nil, nil
} }
beforeToAddrErc20Bal := make(map[common.Address]*big.Int, 0) beforeAddrErc20Bal := 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++ { for i := 0; i < txCount; i++ {
toAddrArr = append(toAddrArr, testAccArr.ToAddr[i])
toBal, err := erc20Contract.BalanceOf(&bind.CallOpts{}, testAccArr.ToAddr[i]) toBal, err := erc20Contract.BalanceOf(&bind.CallOpts{}, testAccArr.ToAddr[i])
if err != nil { if err != nil {
log.Error("Get erc20 balanceOf error:", err.Error()) log.Error("Get erc20 balanceOf error:", err.Error())
return nil, nil return nil, nil
} }
beforeToAddrErc20Bal[testAccArr.ToAddr[i]] = toBal beforeAddrErc20Bal[testAccArr.ToAddr[i]] = toBal
fromBal, err := erc20Contract.BalanceOf(&bind.CallOpts{}, testAccArr.FromAddr[i])
if err != nil {
log.Error("Get erc20 balanceOf error:", err.Error())
return nil, nil
}
beforeAddrErc20Bal[testAccArr.FromAddr[i]] = fromBal
erc20Trade.FromAddr = testAccArr.FromAddr[i] erc20Trade.FromAddr = testAccArr.FromAddr[i]
erc20Trade.ToAddr = toAddrArr erc20Trade.ToAddr = []common.Address{testAccArr.ToAddr[i]}
auth, err := bind.NewKeyedTransactorWithChainID(testAccArr.FromPrv[i], tool.Cfg.ChainId) auth, err := bind.NewKeyedTransactorWithChainID(testAccArr.FromPrv[i], tool.Cfg.ChainId)
if err != nil { if err != nil {
log.Errorf("DeployTokenTransfer func newKeyedTransactorWithChainID err:", err) log.Errorf("DeployTokenTransfer func newKeyedTransactorWithChainID err:", err)
} }
auth.NoSend = true auth.NoSend = true
auth.GasLimit = 500000
auth.GasPrice = big.NewInt(10000000000) auth.GasPrice = big.NewInt(10000000000)
value, _ := accountNonceMap.Load(testAccArr.FromAddr[i]) value, _ := accountNonceMap.Load(testAccArr.FromAddr[i])
auth.Nonce = big.NewInt(value.(int64)) auth.Nonce = big.NewInt(value.(int64))
...@@ -983,21 +1001,24 @@ func PrReSpErc20TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap ...@@ -983,21 +1001,24 @@ func PrReSpErc20TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap
resTxArr = append(resTxArr, tx) resTxArr = append(resTxArr, tx)
} }
verify := func() bool { 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++ { for i := 0; i < txCount; i++ {
of, err := erc20Contract.BalanceOf(&bind.CallOpts{}, testAccArr.ToAddr[i]) toAddr := testAccArr.ToAddr[i]
to, err := erc20Contract.BalanceOf(&bind.CallOpts{}, toAddr)
if err != nil { if err != nil {
log.Error("Get erc20 balanceOf error:", err.Error()) log.Error("Get erc20 balanceOf error:", err.Error())
return false return false
} }
if of.Sub(of, beforeToAddrErc20Bal[testAccArr.ToAddr[i]]).Cmp(erc20Trade.Amount) != 0 { if to.Sub(to, beforeAddrErc20Bal[toAddr]).Cmp(erc20Trade.Amount) != 0 {
return false
}
fromAddr := testAccArr.FromAddr[i]
from, err := erc20Contract.BalanceOf(&bind.CallOpts{}, fromAddr)
if err != nil {
log.Error("Get erc20 balanceOf error:", err.Error())
return false
}
if beforeAddrErc20Bal[fromAddr].Sub(beforeAddrErc20Bal[fromAddr], from).Cmp(erc20Trade.Amount) != 0 {
return false return false
} }
} }
...@@ -1023,22 +1044,23 @@ func PrReOneErc20TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMa ...@@ -1023,22 +1044,23 @@ func PrReOneErc20TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMa
log.Error("NewTokenTransfer error:", err.Error()) log.Error("NewTokenTransfer error:", err.Error())
return nil, nil return nil, nil
} }
beforeToAddrErc20Bal := make(map[common.Address]*big.Int, 0) beforeAddrErc20Bal := 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++ { for i := 0; i < txCount; i++ {
toAddrArr = append(toAddrArr, testAccArr.ToAddr[i])
toBal, err := erc20Contract.BalanceOf(&bind.CallOpts{}, testAccArr.ToAddr[i]) toBal, err := erc20Contract.BalanceOf(&bind.CallOpts{}, testAccArr.ToAddr[i])
if err != nil { if err != nil {
log.Error("Get erc20 balanceOf error:", err.Error()) log.Error("Get erc20 balanceOf error:", err.Error())
return nil, nil return nil, nil
} }
beforeToAddrErc20Bal[testAccArr.ToAddr[i]] = toBal beforeAddrErc20Bal[testAccArr.ToAddr[i]] = toBal
oneErc20Trade.ToAddr = toAddrArr
fromBal, err := erc20Contract.BalanceOf(&bind.CallOpts{}, testAccArr.FromAddr[i])
if err != nil {
log.Error("Get erc20 balanceOf error:", err.Error())
return nil, nil
}
beforeAddrErc20Bal[testAccArr.FromAddr[i]] = fromBal
oneErc20Trade.ToAddr = []common.Address{testAccArr.ToAddr[i]}
auth, err := bind.NewKeyedTransactorWithChainID(testAccArr.FromPrv[i], tool.Cfg.ChainId) auth, err := bind.NewKeyedTransactorWithChainID(testAccArr.FromPrv[i], tool.Cfg.ChainId)
if err != nil { if err != nil {
log.Errorf("DeployTokenTransfer func newKeyedTransactorWithChainID err:", err) log.Errorf("DeployTokenTransfer func newKeyedTransactorWithChainID err:", err)
...@@ -1046,7 +1068,7 @@ func PrReOneErc20TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMa ...@@ -1046,7 +1068,7 @@ func PrReOneErc20TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMa
value, _ := accountNonceMap.Load(testAccArr.FromAddr[i]) value, _ := accountNonceMap.Load(testAccArr.FromAddr[i])
auth.Nonce = big.NewInt(value.(int64)) auth.Nonce = big.NewInt(value.(int64))
auth.NoSend = true auth.NoSend = true
auth.GasLimit = 1000000000000 auth.GasLimit = 500000
auth.GasPrice = big.NewInt(10000000000) auth.GasPrice = big.NewInt(10000000000)
tx, err := oneErc20Trade.Erc20OneTransferTx(auth, tokenTransfer) tx, err := oneErc20Trade.Erc20OneTransferTx(auth, tokenTransfer)
if err != nil { if err != nil {
...@@ -1055,22 +1077,23 @@ func PrReOneErc20TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMa ...@@ -1055,22 +1077,23 @@ func PrReOneErc20TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMa
log.Info("Erc20OneTransferTx tx:", tx.Hash().Hex()) log.Info("Erc20OneTransferTx tx:", tx.Hash().Hex())
resTxArr = append(resTxArr, tx) 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 { 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++ { for i := 0; i < txCount; i++ {
of, err := erc20Contract.BalanceOf(&bind.CallOpts{}, testAccArr.ToAddr[i]) to, err := erc20Contract.BalanceOf(&bind.CallOpts{}, testAccArr.ToAddr[i])
if err != nil { if err != nil {
log.Error("Get erc20 balanceOf error:", err.Error()) log.Error("Get erc20 balanceOf error:", err.Error())
return false return false
} }
if of.Sub(of, beforeToAddrErc20Bal[testAccArr.ToAddr[i]]).Cmp(amount) != 0 { if to.Sub(to, beforeAddrErc20Bal[testAccArr.ToAddr[i]]).Cmp(amount) != 0 {
return false
}
from, err := erc20Contract.BalanceOf(&bind.CallOpts{}, testAccArr.FromAddr[i])
if err != nil {
log.Error("Get erc20 balanceOf error:", err.Error())
return false
}
if beforeAddrErc20Bal[testAccArr.FromAddr[i]].Sub(beforeAddrErc20Bal[testAccArr.FromAddr[i]], from).Cmp(amount) != 1 {
return false return false
} }
} }
...@@ -1216,18 +1239,3 @@ func PrSpErc721TranCase() { ...@@ -1216,18 +1239,3 @@ func PrSpErc721TranCase() {
func PrReSpErc721TranCase() { func PrReSpErc721TranCase() {
} }
// PrReOneErc721TranCase 多层-erc721-发送者相关
func PrReOneErc721TranCase() {
}
// PrSpOneErc721TranCase 多层-erc721-接受者相关
func PrSpOneErc721TranCase() {
}
// PrReSpOneErc721TranCase 多层-erc721-发送接受者相关
func PrReSpOneErc721TranCase() {
}
...@@ -10,6 +10,7 @@ import ( ...@@ -10,6 +10,7 @@ import (
"github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/ethclient" "github.com/ethereum/go-ethereum/ethclient"
"math/big"
"strings" "strings"
"testing" "testing"
) )
...@@ -47,13 +48,13 @@ func TestGetContractAbi(t *testing.T) { ...@@ -47,13 +48,13 @@ func TestGetContractAbi(t *testing.T) {
func TestGetErc20Balance(t *testing.T) { func TestGetErc20Balance(t *testing.T) {
// 连接以太坊网络 // 连接以太坊网络
client, err := ethclient.Dial("http://15.161.177.5:26658") client, err := ethclient.Dial("http://54.72.101.87:50000")
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
// 从合约地址获取合约代码 // 从合约地址获取合约代码
contractAddress := common.HexToAddress("0x91f2c122c8060258605c287cea0bdda056b7b25d") contractAddress := common.HexToAddress("0x14f2567347beb8ed0fec95397940f17ef7a94541")
accountAddr := common.HexToAddress("0x4b0ae7ac4886e7c54e40529cc008df84407e5975") accountAddr := common.HexToAddress("0x812D866f7f558A7325c16B729286e0e661b9DB36")
newERC20, err := erc20.NewERC20(contractAddress, client) newERC20, err := erc20.NewERC20(contractAddress, client)
if err != nil { if err != nil {
...@@ -86,3 +87,13 @@ func TestGetErc721Balance(t *testing.T) { ...@@ -86,3 +87,13 @@ func TestGetErc721Balance(t *testing.T) {
} }
log.Info("balance is :", of.String()) log.Info("balance is :", of.String())
} }
func TestBigIntFunc(t *testing.T) {
//amount := big.NewInt(10000000000)
mul := big.NewInt(1).Mul(big.NewInt(10000000000000000), big.NewInt(2))
t.Log("amount:", mul.String())
}
...@@ -44,18 +44,28 @@ func HexToAddress(addr string) common.Address { ...@@ -44,18 +44,28 @@ func HexToAddress(addr string) common.Address {
} }
func GetTxReceipt(client *ethclient.Client, txArr []*types.Transaction) { func GetTxReceipt(client *ethclient.Client, txArr []*types.Transaction) {
txChanel := make(chan common.Hash, 1000)
for i := 0; i < 8; i++ {
go func() {
select {
case hash := <-txChanel:
receipt, err := client.TransactionReceipt(context.Background(), hash)
if err != nil {
log.Error("Get tran receipt err:", err)
return
}
if receipt.Status == 0 {
log.Error("Receipt:", receipt)
} else {
log.Infof("Receipt: status: %d,gasUsed: %d", receipt.Status, receipt.GasUsed)
}
}
}()
}
for _, tx := range txArr { for _, tx := range txArr {
receipt, err := client.TransactionReceipt(context.Background(), tx.Hash()) txChanel <- tx.Hash()
if err != nil {
log.Error("Get tran receipt err:", err)
return
}
if receipt.Status == 0 {
log.Error("Receipt:", receipt)
} else {
log.Infof("Receipt: status: %d,gasUsed: %d", receipt.Status, receipt.GasUsed)
}
} }
time.Sleep(time.Second * 10)
} }
func GetAccountNonce(client *ethclient.Client) *sync.Map { func GetAccountNonce(client *ethclient.Client) *sync.Map {
...@@ -115,7 +125,6 @@ func GetAccountBalance(client *ethclient.Client) { ...@@ -115,7 +125,6 @@ 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)
...@@ -147,11 +156,11 @@ func GetAccountErc20BalanceOf(client *ethclient.Client, erc20Addr common.Address ...@@ -147,11 +156,11 @@ func GetAccountErc20BalanceOf(client *ethclient.Client, erc20Addr common.Address
log.Errorf("Get erc20 balance of failed err:%s", err.Error()) log.Errorf("Get erc20 balance of failed err:%s", err.Error())
return return
} }
of, err = newERC20.Allowance(&bind.CallOpts{}, common.HexToAddress("0xfb1bF24c0C7e7C1B89c4A496aACf01aBF26C0B94"), toAddr) //of, err = newERC20.Allowance(&bind.CallOpts{}, common.HexToAddress("0xfb1bF24c0C7e7C1B89c4A496aACf01aBF26C0B94"), toAddr)
if err != nil { //if err != nil {
log.Errorf("Get erc20 balance of failed err:%s", err.Error()) // log.Errorf("Get erc20 balance of failed err:%s", err.Error())
return // return
} //}
log.Infof("%s erc20 balance of is: %s ", toAddr.Hash().Hex(), of.String()) log.Infof("%s erc20 balance of is: %s ", toAddr.Hash().Hex(), of.String())
} }
...@@ -190,6 +199,7 @@ func ReadWriteCase(prv *ecdsa.PrivateKey, funcStr string, nonce *big.Int, readWr ...@@ -190,6 +199,7 @@ func ReadWriteCase(prv *ecdsa.PrivateKey, funcStr string, nonce *big.Int, readWr
} }
auth.Nonce = nonce auth.Nonce = nonce
auth.NoSend = true auth.NoSend = true
auth.GasLimit = 500000
auth.GasPrice = big.NewInt(1000000000000) auth.GasPrice = big.NewInt(1000000000000)
tx := &types.Transaction{} tx := &types.Transaction{}
switch funcStr { switch funcStr {
...@@ -269,6 +279,7 @@ func OneReadWriteCase(prv *ecdsa.PrivateKey, funcStr string, nonce *big.Int, rea ...@@ -269,6 +279,7 @@ func OneReadWriteCase(prv *ecdsa.PrivateKey, funcStr string, nonce *big.Int, rea
} }
auth.Nonce = nonce auth.Nonce = nonce
auth.NoSend = true auth.NoSend = true
auth.GasLimit = 500000
auth.GasPrice = big.NewInt(1000000000000) auth.GasPrice = big.NewInt(1000000000000)
tx := &types.Transaction{} tx := &types.Transaction{}
switch funcStr { switch funcStr {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment