Commit 22bf17e9 authored by duanjinfei's avatar duanjinfei

tran case test twice commity

parent b5198fce
...@@ -8,18 +8,18 @@ abigen --bin ChainCoinTransfer.bin --abi ChainCoinTransfer.abi --pkg contractCoi ...@@ -8,18 +8,18 @@ abigen --bin ChainCoinTransfer.bin --abi ChainCoinTransfer.abi --pkg contractCoi
abigen --bin OneChainCoinTransfer.bin --abi OneChainCoinTransfer.abi --pkg contractCoin --type OneChainCoinTransfer --out ../compile/OneChainCoinTransfer.go abigen --bin OneChainCoinTransfer.bin --abi OneChainCoinTransfer.abi --pkg contractCoin --type OneChainCoinTransfer --out ../compile/OneChainCoinTransfer.go
abigen --bin TwoChainCoinTransfer.bin --abi TwoChainCoinTransfer.abi --pkg contractCoin --type TwoChainCoinTransfer --out ../compile/TwoChainCoinTransfer.go abigen --bin TwoChainCoinTransfer.bin --abi TwoChainCoinTransfer.abi --pkg contractCoin --type TwoChainCoinTransfer --out ../compile/TwoChainCoinTransfer.go
solc --abi --bin ERC20.sol -o ../abi_bin solc --abi --bin contract_abi/erc20_transfer/contract/ERC20.sol -o contract_abi/erc20_transfer/abi_bin --overwrite
solc --abi --bin TokenTransfer.sol -o ../abi_bin solc --abi --bin contract_abi/erc20_transfer/contract/TokenTransfer.sol -o contract_abi/erc20_transfer/abi_bin --overwrite
solc --abi --bin OneTokenTransfer.sol -o ../abi_bin solc --abi --bin contract_abi/erc20_transfer/contract/OneTokenTransfer.sol -o contract_abi/erc20_transfer/abi_bin --overwrite
solc --abi --bin TwoTokenTransfer.sol -o ../abi_bin solc --abi --bin contract_abi/erc20_transfer/contract/TwoTokenTransfer.sol -o contract_abi/erc20_transfer/abi_bin --overwrite
abigen --bin ERC20.bin --abi ERC20.abi --pkg contractToken20 --type ERC20 --out ../compile/ERC20.go abigen --bin ERC20.bin --abi ERC20.abi --pkg contractToken20 --type ERC20 --out ../compile/ERC20.go
abigen --bin TokenTransfer.bin --abi TokenTransfer.abi --pkg contractToken20 --type TokenTransfer --out ../compile/TokenTransfer.go abigen --bin TokenTransfer.bin --abi TokenTransfer.abi --pkg contractToken20 --type TokenTransfer --out ../compile/TokenTransfer.go
abigen --bin OneTokenTransfer.bin --abi OneTokenTransfer.abi --pkg contractToken20 --type OneTokenTransfer --out ../compile/OneTokenTransfer.go abigen --bin OneTokenTransfer.bin --abi OneTokenTransfer.abi --pkg contractToken20 --type OneTokenTransfer --out ../compile/OneTokenTransfer.go
abigen --bin TwoTokenTransfer.bin --abi TwoTokenTransfer.abi --pkg contractToken20 --type TwoTokenTransfer --out ../compile/TwoTokenTransfer.go abigen --bin TwoTokenTransfer.bin --abi TwoTokenTransfer.abi --pkg contractToken20 --type TwoTokenTransfer --out ../compile/TwoTokenTransfer.go
solc --abi --bin contract_abi/erc721_transfer/contract/ERC721.sol -o contract_abi/erc721_transfer/abi_bin --overwrite solc --abi --bin ./contract_abi/erc721_transfer/contract/ERC721.sol -o contract_abi/erc721_transfer/abi_bin --overwrite
solc --abi --bin contract_abi/erc721_transfer/contract/NftTokenTransfer.sol -o contract_abi/erc721_transfer/abi_bin --overwrite solc --abi --bin ./contract_abi/erc721_transfer/contract/NftTokenTransfer.sol -o contract_abi/erc721_transfer/abi_bin --overwrite
solc --abi --bin contract_abi/erc721_transfer/contract/OneNftTokenTransfer.sol -o contract_abi/erc721_transfer/abi_bin --overwrite solc --abi --bin contract_abi/erc721_transfer/contract/OneNftTokenTransfer.sol -o contract_abi/erc721_transfer/abi_bin --overwrite
solc --abi --bin contract_abi/erc721_transfer/contract/TwoNftTokenTransfer.sol -o contract_abi/erc721_transfer/abi_bin --overwrite solc --abi --bin contract_abi/erc721_transfer/contract/TwoNftTokenTransfer.sol -o contract_abi/erc721_transfer/abi_bin --overwrite
......
...@@ -5,10 +5,10 @@ ...@@ -5,10 +5,10 @@
"chainId": 155, "chainId": 155,
"goRoutine": 1, "goRoutine": 1,
"generateAccCount": 500, "generateAccCount": 500,
"isDeployContract": false, "isDeployContract": true,
"isInitAccountBalance": false, "isInitAccountBalance": false,
"startTokenId": 1, "startTokenId": 1,
"endTokenId": 10, "endTokenId": 100,
"transferType": { "transferType": {
"NotAssociatedFlag": true, "NotAssociatedFlag": true,
"PartialAssociation": false, "PartialAssociation": false,
......
{ [
"Coin_Transfer": "0xf52c689ced325ba52891f2b90f8ab36c93eaaf67", {
"ERC20": "0x9b5b83609915089b0a534b4bd0059d4514c55d26", "Coin_Transfer": "0x7eb5eab85e37d297b92e4c56a0187e910f37d969",
"ERC721": "0x92e96c2f924dc4871e5a8fddde4983423533bbe7", "ERC20": "0xbb0bb92922b244b2e3545f55bc4aee00299ea6de",
"One_Coin_Transfer": "0x117cd28c021318c06f9670fd9fe484d4c9dfcb13", "ERC721": "0x89afa7faf59f6437a3df9c373bc5401b8d5f0099",
"One_Read_Write": "0xc588945f57f672f1b346fe8a99e368d5a240a50d", "One_Coin_Transfer": "0xcc600106d992657b6fabbb68e005eb94a07acc41",
"One_Token20_Transfer": "0xa2b4d23faa81c0599bb537a426bb4dfeba39f58f", "One_Read_Write": "0x5adfe690fb447730ba9d992940d5d07a2efa5094",
"One_Token721_Transfer": "0xa7afc31cdbc0e37d2c290a7ca82429bb3bcc588b", "One_Token20_Transfer": "0x469130ea4dfbed768b0d771cc99946f81738c72e",
"Read_Chain": "0x8f0d51ad96f91170677cb1295ac31eaa8b9f9a33", "One_Token721_Transfer": "0x92b28beb872f81aaad3f111cffab1ba10fec6918",
"Read_Write": "0x07872fdda3af5ff4f8fbdebbc022dfcb4fd8e022", "Read_Chain": "0x00059658a96be67f1412f607549eeaee4a81ec87",
"Token20_Transfer": "0x7a0047ee9c89646e2df0de21a627827aa777f23c", "Read_Write": "0x1c585fd816923a5957024ab3fd8fcfb74f6235da",
"Token721_Transfer": "0xdb12ab942b4745a27a024b41c2cd6f55220e9316", "Token20_Transfer": "0x25ed0c6762f49fcf532fb01152ae79088576bfee",
"Two_Coin_Transfer": "0x46cdadb68998d6c60e24f085a163baf2861be6b3", "Token721_Transfer": "0xbcb1513c82bb21db13b1b21ee696e36a984351af",
"Two_Token20_Transfer": "0xb4176da3ecd693cb257f008502e43ca9aefc981b", "Two_Coin_Transfer": "0x761405065d3cd84fb5ef7aed0dc24ae6a5768f83",
"Two_Token721_Transfer": "0x63a18b3cc9113780bc405b9f9ffbf6988b52560a" "Two_Token20_Transfer": "0xef86469624825bd005c3f505637ab58435e32443",
} "Two_Token721_Transfer": "0x2c046c47053f696a9b09cd5c14c7367c24976643"
\ No newline at end of file },
{
"Coin_Transfer": "0x199a64a59cf31711854724bd95ee40860e9ce79d",
"ERC20": "0xc9f6def8a5925f8c87bda1ce5993f123f39d6278",
"ERC721": "0x74c9a17590f80b321560c38237438fbdeee067a9",
"One_Coin_Transfer": "0x998cc9e89cfa8dd01125bdbf7d84682c9cd49d59",
"One_Read_Write": "0x72ffc41d0c84a2da43298ac11bea906fa8b98dfd",
"One_Token20_Transfer": "0xb2cd516623cd57bee80820079829e2ba520923b1",
"One_Token721_Transfer": "0x481d353bd1ea858f9f4adb09cab4e1a34a0bdd4a",
"Read_Chain": "0x248c19ea5448a69aebf02a910acc5f3369b64da2",
"Read_Write": "0x062d6800dd115b471ec6600847d9d5696921859e",
"Token20_Transfer": "0x03a3b76019a43fb683c63b5dc083770cad932575",
"Token721_Transfer": "0xc3a738b7083f6014afa9317061623bdb083b6068",
"Two_Coin_Transfer": "0xbefc6e7134b2ad9cad38ff65d9cff1f70bec1eb0",
"Two_Token20_Transfer": "0x618defb1a892882a260affaf01fef35967a8f2c0",
"Two_Token721_Transfer": "0x7d9c6229b37d9afabfbc1311fd9378d3b062e071"
},
{
"Coin_Transfer": "0xd6926ea20837af80216bcdb31ae4cc4e0c22cfa7",
"ERC20": "0x2f9a4f45efb059d8c8ba55d4aa7249ddb85e00a7",
"ERC721": "0x3af47a08f0e2aaa2966c5216586ebec840aa03d7",
"One_Coin_Transfer": "0x49a3eadf8ea8a74fcdb7a0edf5bb9024103b5e06",
"One_Read_Write": "0xacf8f258ddd4224169ab09e0ddbd0657bc930ae3",
"One_Token20_Transfer": "0xd8779b3af0c92c0e0479d855c368a4838b9dc38c",
"One_Token721_Transfer": "0xe35b102f1541427fde3843ac9c868c17c3bd0e7e",
"Read_Chain": "0x3278a598ff92a0eecc799379d89eeef539b4b92e",
"Read_Write": "0x856edcb2fba59e363e6dfa4b9f4a9cf07acef233",
"Token20_Transfer": "0xb8c555522603fe1471d5d4d5b6c3262d3fd8f1d1",
"Token721_Transfer": "0x260c7c47d66de45c3c3650c0ce1614cecee0a33a",
"Two_Coin_Transfer": "0x843e194a3b17893bfcaef174d21670c96936b7c7",
"Two_Token20_Transfer": "0x19607465a18eaafdbc43616b1c47971e24ce9be8",
"Two_Token721_Transfer": "0x5ffde14f7708192924061fbcab7e205b3e23389d"
},
{
"Coin_Transfer": "0x2087087f43ece5d2e664948fd37a545227a3d2c3",
"ERC20": "0xd525c201cc74ea999024d5dc588aa295a179a490",
"ERC721": "0x3b86dca4c2d3034d9cbb7305d65216d4b8c6fcab",
"One_Coin_Transfer": "0xb6127b1424cf450188bc92128f44af23f55f5001",
"One_Read_Write": "0x65ff9d8c1a3f1789c63af043494da27061224ef0",
"One_Token20_Transfer": "0x1463d05dc187dcbc79c459177e1ac36fb15b5c1b",
"One_Token721_Transfer": "0xf640c23d1f11a2620fb7614cda5ede491cf030e2",
"Read_Chain": "0xb5dce387d019eacf80e74dd41d1cc420ea18ed62",
"Read_Write": "0x6aad3c0c3693eefbf7936071e9781eb38d8faa3c",
"Token20_Transfer": "0x1f4479fadfdcb2073c737e34c7846444a5410e61",
"Token721_Transfer": "0xcca54db68e5b35965889a937700453d3ba6afd0c",
"Two_Coin_Transfer": "0x0dad99bdd3f9800b310290bea136d75b0ab0452b",
"Two_Token20_Transfer": "0x543249f421bdd84acf07e338bf2eedd2a56288ee",
"Two_Token721_Transfer": "0xcc736b124c6306c9efcf392fa36946be73998184"
},
{
"Coin_Transfer": "0xef1f9e4fd4df554666f713de61082c932cd99a6b",
"ERC20": "0xf08e69fe1ab2c5510572004994b3b21184ce2ec5",
"ERC721": "0xdebe8c2f54c5d9b1d01204bdf13f05ca1f544823",
"One_Coin_Transfer": "0xf23ebe5bcaf7cd48a058ae788402b466acb9e485",
"One_Read_Write": "0xd1e3dcf92fa55b129b801c0c466d579807db2abf",
"One_Token20_Transfer": "0xe568572af884ce17193f123a6e8bc3bc5e1f46d0",
"One_Token721_Transfer": "0xb28491d1feea0e033e30a6375f7f101f7524f0ee",
"Read_Chain": "0x6603fbd5f2ce59aaf6052306ec2191b943430d58",
"Read_Write": "0xde9fb7b2a9403bd1fc9f9df221982f7f248f78a3",
"Token20_Transfer": "0x7864c5110c2a64beca6f7d76917b9c77bce3f1aa",
"Token721_Transfer": "0x8e0fada295ba4af825405589b98662ccce64cd86",
"Two_Coin_Transfer": "0x30cd1af092e88296f853075fe64f08630bf6c77d",
"Two_Token20_Transfer": "0xb62f8d496749887d44d8a22165a657080c0d6bb9",
"Two_Token721_Transfer": "0xba15959dd5a69b6c0528bcdeee70177e6953f27c"
}
]
\ No newline at end of file
[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approveFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","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":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approveFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
\ No newline at end of file \ No newline at end of file
60806040523480156200001157600080fd5b5060405162001ede38038062001ede8339818101604052810190620000379190620002e2565b620000576200004b6200008360201b60201c565b6200008b60201b60201c565b8160049081620000689190620005b2565b5080600590816200007a9190620005b2565b50505062000699565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620001b8826200016d565b810181811067ffffffffffffffff82111715620001da57620001d96200017e565b5b80604052505050565b6000620001ef6200014f565b9050620001fd8282620001ad565b919050565b600067ffffffffffffffff82111562000220576200021f6200017e565b5b6200022b826200016d565b9050602081019050919050565b60005b83811015620002585780820151818401526020810190506200023b565b60008484015250505050565b60006200027b620002758462000202565b620001e3565b9050828152602081018484840111156200029a576200029962000168565b5b620002a784828562000238565b509392505050565b600082601f830112620002c757620002c662000163565b5b8151620002d984826020860162000264565b91505092915050565b60008060408385031215620002fc57620002fb62000159565b5b600083015167ffffffffffffffff8111156200031d576200031c6200015e565b5b6200032b85828601620002af565b925050602083015167ffffffffffffffff8111156200034f576200034e6200015e565b5b6200035d85828601620002af565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620003ba57607f821691505b602082108103620003d057620003cf62000372565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200043a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003fb565b620004468683620003fb565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004936200048d62000487846200045e565b62000468565b6200045e565b9050919050565b6000819050919050565b620004af8362000472565b620004c7620004be826200049a565b84845462000408565b825550505050565b600090565b620004de620004cf565b620004eb818484620004a4565b505050565b5b81811015620005135762000507600082620004d4565b600181019050620004f1565b5050565b601f82111562000562576200052c81620003d6565b6200053784620003eb565b8101602085101562000547578190505b6200055f6200055685620003eb565b830182620004f0565b50505b505050565b600082821c905092915050565b6000620005876000198460080262000567565b1980831691505092915050565b6000620005a2838362000574565b9150826002028217905092915050565b620005bd8262000367565b67ffffffffffffffff811115620005d957620005d86200017e565b5b620005e58254620003a1565b620005f282828562000517565b600060209050601f8311600181146200062a576000841562000615578287015190505b62000621858262000594565b86555062000691565b601f1984166200063a86620003d6565b60005b8281101562000664578489015182556001820191506020850194506020810190506200063d565b8683101562000684578489015162000680601f89168262000574565b8355505b6001600288020188555050505b505050505050565b61183580620006a96000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c806370a0823111610097578063a457c2d711610066578063a457c2d7146102b1578063a9059cbb146102e1578063dd62ed3e14610311578063f2fde38b1461034157610100565b806370a082311461023b578063715018a61461026b5780638da5cb5b1461027557806395d89b411461029357610100565b8063313ce567116100d3578063313ce567146101a157806339509351146101bf57806340c10f19146101ef57806352ec85291461020b57610100565b806306fdde0314610105578063095ea7b31461012357806318160ddd1461015357806323b872dd14610171575b600080fd5b61010d61035d565b60405161011a9190610f7e565b60405180910390f35b61013d60048036038101906101389190611039565b6103ef565b60405161014a9190611094565b60405180910390f35b61015b610412565b60405161016891906110be565b60405180910390f35b61018b600480360381019061018691906110d9565b61041c565b6040516101989190611094565b60405180910390f35b6101a961044b565b6040516101b69190611148565b60405180910390f35b6101d960048036038101906101d49190611039565b610454565b6040516101e69190611094565b60405180910390f35b61020960048036038101906102049190611039565b61048b565b005b610225600480360381019061022091906110d9565b610499565b6040516102329190611094565b60405180910390f35b61025560048036038101906102509190611163565b6104b9565b60405161026291906110be565b60405180910390f35b610273610502565b005b61027d610516565b60405161028a919061119f565b60405180910390f35b61029b61053f565b6040516102a89190610f7e565b60405180910390f35b6102cb60048036038101906102c69190611039565b6105d1565b6040516102d89190611094565b60405180910390f35b6102fb60048036038101906102f69190611039565b610648565b6040516103089190611094565b60405180910390f35b61032b600480360381019061032691906111ba565b61066b565b60405161033891906110be565b60405180910390f35b61035b60048036038101906103569190611163565b6106f2565b005b60606004805461036c90611229565b80601f016020809104026020016040519081016040528092919081815260200182805461039890611229565b80156103e55780601f106103ba576101008083540402835291602001916103e5565b820191906000526020600020905b8154815290600101906020018083116103c857829003601f168201915b5050505050905090565b6000806103fa610775565b905061040781858561077d565b600191505092915050565b6000600354905090565b600080610427610775565b9050610434858285610946565b61043f8585856109d2565b60019150509392505050565b60006012905090565b60008061045f610775565b9050610480818585610471858961066b565b61047b9190611289565b61077d565b600191505092915050565b6104958282610c4b565b5050565b60006104a3610da2565b6104ae84848461077d565b600190509392505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61050a610da2565b6105146000610e20565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606005805461054e90611229565b80601f016020809104026020016040519081016040528092919081815260200182805461057a90611229565b80156105c75780601f1061059c576101008083540402835291602001916105c7565b820191906000526020600020905b8154815290600101906020018083116105aa57829003601f168201915b5050505050905090565b6000806105dc610775565b905060006105ea828661066b565b90508381101561062f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106269061132f565b60405180910390fd5b61063c828686840361077d565b60019250505092915050565b600080610653610775565b90506106608185856109d2565b600191505092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6106fa610da2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610769576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610760906113c1565b60405180910390fd5b61077281610e20565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036107ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e390611453565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361085b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610852906114e5565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161093991906110be565b60405180910390a3505050565b6000610952848461066b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146109cc57818110156109be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b590611551565b60405180910390fd5b6109cb848484840361077d565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a38906115e3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ab0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa790611675565b60405180910390fd5b610abb838383610ee4565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015610b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3990611707565b60405180910390fd5b818103600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610c3291906110be565b60405180910390a3610c45848484610ee9565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb190611773565b60405180910390fd5b610cc660008383610ee4565b8060036000828254610cd89190611289565b9250508190555080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610d8a91906110be565b60405180910390a3610d9e60008383610ee9565b5050565b610daa610775565b73ffffffffffffffffffffffffffffffffffffffff16610dc8610516565b73ffffffffffffffffffffffffffffffffffffffff1614610e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e15906117df565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610f28578082015181840152602081019050610f0d565b60008484015250505050565b6000601f19601f8301169050919050565b6000610f5082610eee565b610f5a8185610ef9565b9350610f6a818560208601610f0a565b610f7381610f34565b840191505092915050565b60006020820190508181036000830152610f988184610f45565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610fd082610fa5565b9050919050565b610fe081610fc5565b8114610feb57600080fd5b50565b600081359050610ffd81610fd7565b92915050565b6000819050919050565b61101681611003565b811461102157600080fd5b50565b6000813590506110338161100d565b92915050565b600080604083850312156110505761104f610fa0565b5b600061105e85828601610fee565b925050602061106f85828601611024565b9150509250929050565b60008115159050919050565b61108e81611079565b82525050565b60006020820190506110a96000830184611085565b92915050565b6110b881611003565b82525050565b60006020820190506110d360008301846110af565b92915050565b6000806000606084860312156110f2576110f1610fa0565b5b600061110086828701610fee565b935050602061111186828701610fee565b925050604061112286828701611024565b9150509250925092565b600060ff82169050919050565b6111428161112c565b82525050565b600060208201905061115d6000830184611139565b92915050565b60006020828403121561117957611178610fa0565b5b600061118784828501610fee565b91505092915050565b61119981610fc5565b82525050565b60006020820190506111b46000830184611190565b92915050565b600080604083850312156111d1576111d0610fa0565b5b60006111df85828601610fee565b92505060206111f085828601610fee565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061124157607f821691505b602082108103611254576112536111fa565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061129482611003565b915061129f83611003565b92508282019050808211156112b7576112b661125a565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000611319602583610ef9565b9150611324826112bd565b604082019050919050565b600060208201905081810360008301526113488161130c565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006113ab602683610ef9565b91506113b68261134f565b604082019050919050565b600060208201905081810360008301526113da8161139e565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061143d602483610ef9565b9150611448826113e1565b604082019050919050565b6000602082019050818103600083015261146c81611430565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006114cf602283610ef9565b91506114da82611473565b604082019050919050565b600060208201905081810360008301526114fe816114c2565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061153b601d83610ef9565b915061154682611505565b602082019050919050565b6000602082019050818103600083015261156a8161152e565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006115cd602583610ef9565b91506115d882611571565b604082019050919050565b600060208201905081810360008301526115fc816115c0565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061165f602383610ef9565b915061166a82611603565b604082019050919050565b6000602082019050818103600083015261168e81611652565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006116f1602683610ef9565b91506116fc82611695565b604082019050919050565b60006020820190508181036000830152611720816116e4565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600061175d601f83610ef9565b915061176882611727565b602082019050919050565b6000602082019050818103600083015261178c81611750565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006117c9602083610ef9565b91506117d482611793565b602082019050919050565b600060208201905081810360008301526117f8816117bc565b905091905056fea2646970667358221220bcd8ff4822f6ba3910d9a240f15e47ca3fdabbd60edf26e665e180ae7683cf9464736f6c63430008130033 60806040523480156200001157600080fd5b5060405162001a4638038062001a468339818101604052810190620000379190620001f6565b8160039081620000489190620004c6565b5080600490816200005a9190620004c6565b505050620005ad565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620000cc8262000081565b810181811067ffffffffffffffff82111715620000ee57620000ed62000092565b5b80604052505050565b60006200010362000063565b9050620001118282620000c1565b919050565b600067ffffffffffffffff82111562000134576200013362000092565b5b6200013f8262000081565b9050602081019050919050565b60005b838110156200016c5780820151818401526020810190506200014f565b60008484015250505050565b60006200018f620001898462000116565b620000f7565b905082815260208101848484011115620001ae57620001ad6200007c565b5b620001bb8482856200014c565b509392505050565b600082601f830112620001db57620001da62000077565b5b8151620001ed84826020860162000178565b91505092915050565b6000806040838503121562000210576200020f6200006d565b5b600083015167ffffffffffffffff81111562000231576200023062000072565b5b6200023f85828601620001c3565b925050602083015167ffffffffffffffff81111562000263576200026262000072565b5b6200027185828601620001c3565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002ce57607f821691505b602082108103620002e457620002e362000286565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200034e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200030f565b6200035a86836200030f565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003a7620003a16200039b8462000372565b6200037c565b62000372565b9050919050565b6000819050919050565b620003c38362000386565b620003db620003d282620003ae565b8484546200031c565b825550505050565b600090565b620003f2620003e3565b620003ff818484620003b8565b505050565b5b8181101562000427576200041b600082620003e8565b60018101905062000405565b5050565b601f82111562000476576200044081620002ea565b6200044b84620002ff565b810160208510156200045b578190505b620004736200046a85620002ff565b83018262000404565b50505b505050565b600082821c905092915050565b60006200049b600019846008026200047b565b1980831691505092915050565b6000620004b6838362000488565b9150826002028217905092915050565b620004d1826200027b565b67ffffffffffffffff811115620004ed57620004ec62000092565b5b620004f98254620002b5565b620005068282856200042b565b600060209050601f8311600181146200053e576000841562000529578287015190505b620005358582620004a8565b865550620005a5565b601f1984166200054e86620002ea565b60005b82811015620005785784890151825560018201915060208501945060208101905062000551565b8683101562000598578489015162000594601f89168262000488565b8355505b6001600288020188555050505b505050505050565b61148980620005bd6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806340c10f191161008c57806395d89b411161006657806395d89b411461023a578063a457c2d714610258578063a9059cbb14610288578063dd62ed3e146102b8576100cf565b806340c10f19146101be57806352ec8529146101da57806370a082311461020a576100cf565b806306fdde03146100d4578063095ea7b3146100f257806318160ddd1461012257806323b872dd14610140578063313ce56714610170578063395093511461018e575b600080fd5b6100dc6102e8565b6040516100e99190610cfa565b60405180910390f35b61010c60048036038101906101079190610db5565b61037a565b6040516101199190610e10565b60405180910390f35b61012a61039d565b6040516101379190610e3a565b60405180910390f35b61015a60048036038101906101559190610e55565b6103a7565b6040516101679190610e10565b60405180910390f35b6101786103d6565b6040516101859190610ec4565b60405180910390f35b6101a860048036038101906101a39190610db5565b6103df565b6040516101b59190610e10565b60405180910390f35b6101d860048036038101906101d39190610db5565b610416565b005b6101f460048036038101906101ef9190610e55565b610424565b6040516102019190610e10565b60405180910390f35b610224600480360381019061021f9190610edf565b61043c565b6040516102319190610e3a565b60405180910390f35b610242610484565b60405161024f9190610cfa565b60405180910390f35b610272600480360381019061026d9190610db5565b610516565b60405161027f9190610e10565b60405180910390f35b6102a2600480360381019061029d9190610db5565b61058d565b6040516102af9190610e10565b60405180910390f35b6102d260048036038101906102cd9190610f0c565b6105b0565b6040516102df9190610e3a565b60405180910390f35b6060600380546102f790610f7b565b80601f016020809104026020016040519081016040528092919081815260200182805461032390610f7b565b80156103705780601f1061034557610100808354040283529160200191610370565b820191906000526020600020905b81548152906001019060200180831161035357829003601f168201915b5050505050905090565b600080610385610637565b905061039281858561063f565b600191505092915050565b6000600254905090565b6000806103b2610637565b90506103bf858285610808565b6103ca858585610894565b60019150509392505050565b60006012905090565b6000806103ea610637565b905061040b8185856103fc85896105b0565b6104069190610fdb565b61063f565b600191505092915050565b6104208282610b0a565b5050565b600061043184848461063f565b600190509392505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60606004805461049390610f7b565b80601f01602080910402602001604051908101604052809291908181526020018280546104bf90610f7b565b801561050c5780601f106104e15761010080835404028352916020019161050c565b820191906000526020600020905b8154815290600101906020018083116104ef57829003601f168201915b5050505050905090565b600080610521610637565b9050600061052f82866105b0565b905083811015610574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056b90611081565b60405180910390fd5b610581828686840361063f565b60019250505092915050565b600080610598610637565b90506105a5818585610894565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036106ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a590611113565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361071d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610714906111a5565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516107fb9190610e3a565b60405180910390a3505050565b600061081484846105b0565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461088e5781811015610880576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087790611211565b60405180910390fd5b61088d848484840361063f565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fa906112a3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610972576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096990611335565b60405180910390fd5b61097d838383610c60565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015610a03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fa906113c7565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610af19190610e3a565b60405180910390a3610b04848484610c65565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7090611433565b60405180910390fd5b610b8560008383610c60565b8060026000828254610b979190610fdb565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610c489190610e3a565b60405180910390a3610c5c60008383610c65565b5050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610ca4578082015181840152602081019050610c89565b60008484015250505050565b6000601f19601f8301169050919050565b6000610ccc82610c6a565b610cd68185610c75565b9350610ce6818560208601610c86565b610cef81610cb0565b840191505092915050565b60006020820190508181036000830152610d148184610cc1565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610d4c82610d21565b9050919050565b610d5c81610d41565b8114610d6757600080fd5b50565b600081359050610d7981610d53565b92915050565b6000819050919050565b610d9281610d7f565b8114610d9d57600080fd5b50565b600081359050610daf81610d89565b92915050565b60008060408385031215610dcc57610dcb610d1c565b5b6000610dda85828601610d6a565b9250506020610deb85828601610da0565b9150509250929050565b60008115159050919050565b610e0a81610df5565b82525050565b6000602082019050610e256000830184610e01565b92915050565b610e3481610d7f565b82525050565b6000602082019050610e4f6000830184610e2b565b92915050565b600080600060608486031215610e6e57610e6d610d1c565b5b6000610e7c86828701610d6a565b9350506020610e8d86828701610d6a565b9250506040610e9e86828701610da0565b9150509250925092565b600060ff82169050919050565b610ebe81610ea8565b82525050565b6000602082019050610ed96000830184610eb5565b92915050565b600060208284031215610ef557610ef4610d1c565b5b6000610f0384828501610d6a565b91505092915050565b60008060408385031215610f2357610f22610d1c565b5b6000610f3185828601610d6a565b9250506020610f4285828601610d6a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680610f9357607f821691505b602082108103610fa657610fa5610f4c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610fe682610d7f565b9150610ff183610d7f565b925082820190508082111561100957611008610fac565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061106b602583610c75565b91506110768261100f565b604082019050919050565b6000602082019050818103600083015261109a8161105e565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006110fd602483610c75565b9150611108826110a1565b604082019050919050565b6000602082019050818103600083015261112c816110f0565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061118f602283610c75565b915061119a82611133565b604082019050919050565b600060208201905081810360008301526111be81611182565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006111fb601d83610c75565b9150611206826111c5565b602082019050919050565b6000602082019050818103600083015261122a816111ee565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061128d602583610c75565b915061129882611231565b604082019050919050565b600060208201905081810360008301526112bc81611280565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061131f602383610c75565b915061132a826112c3565b604082019050919050565b6000602082019050818103600083015261134e81611312565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006113b1602683610c75565b91506113bc82611355565b604082019050919050565b600060208201905081810360008301526113e0816113a4565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600061141d601f83610c75565b9150611428826113e7565b602082019050919050565b6000602082019050818103600083015261144c81611410565b905091905056fea2646970667358221220924ebdca606d73fd19dbf38938cf5dc6d9cd71c0dff38a1f619f38f4c9b0d67364736f6c63430008130033
\ No newline at end of file \ No newline at end of file
[{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address[]","name":"toArr","type":"address[]"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"tokenTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"tokenTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}] [{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approveFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address[]","name":"toArr","type":"address[]"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"tokenTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"tokenTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]
\ No newline at end of file \ No newline at end of file
608060405234801561001057600080fd5b50610c42806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063c8ce6c781461003b578063f3913e6914610057575b600080fd5b6100556004803603810190610050919061071e565b610073565b005b610071600480360381019061006c919061078d565b6100dd565b005b60005b82518110156100d7576100c4838281518110610095576100946107f4565b5b6020026020010151838673ffffffffffffffffffffffffffffffffffffffff166101919092919063ffffffff16565b80806100cf90610852565b915050610076565b50505050565b8373ffffffffffffffffffffffffffffffffffffffff166352ec85298484846040518463ffffffff1660e01b815260040161011a939291906108b8565b6020604051808303816000875af1158015610139573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061015d9190610927565b5061018b8383838773ffffffffffffffffffffffffffffffffffffffff16610217909392919063ffffffff16565b50505050565b6102128363a9059cbb60e01b84846040516024016101b0929190610954565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506102a0565b505050565b61029a846323b872dd60e01b858585604051602401610238939291906108b8565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506102a0565b50505050565b6000610302826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166103679092919063ffffffff16565b905060008151111561036257808060200190518101906103229190610927565b610361576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161035890610a00565b60405180910390fd5b5b505050565b6060610376848460008561037f565b90509392505050565b6060824710156103c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103bb90610a92565b60405180910390fd5b6103cd85610493565b61040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390610afe565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516104359190610b8f565b60006040518083038185875af1925050503d8060008114610472576040519150601f19603f3d011682016040523d82523d6000602084013e610477565b606091505b50915091506104878282866104b6565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606083156104c657829050610516565b6000835111156104d95782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161050d9190610bea565b60405180910390fd5b9392505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061055c82610531565b9050919050565b61056c81610551565b811461057757600080fd5b50565b60008135905061058981610563565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6105dd82610594565b810181811067ffffffffffffffff821117156105fc576105fb6105a5565b5b80604052505050565b600061060f61051d565b905061061b82826105d4565b919050565b600067ffffffffffffffff82111561063b5761063a6105a5565b5b602082029050602081019050919050565b600080fd5b600061066461065f84610620565b610605565b905080838252602082019050602084028301858111156106875761068661064c565b5b835b818110156106b0578061069c888261057a565b845260208401935050602081019050610689565b5050509392505050565b600082601f8301126106cf576106ce61058f565b5b81356106df848260208601610651565b91505092915050565b6000819050919050565b6106fb816106e8565b811461070657600080fd5b50565b600081359050610718816106f2565b92915050565b60008060006060848603121561073757610736610527565b5b60006107458682870161057a565b935050602084013567ffffffffffffffff8111156107665761076561052c565b5b610772868287016106ba565b925050604061078386828701610709565b9150509250925092565b600080600080608085870312156107a7576107a6610527565b5b60006107b58782880161057a565b94505060206107c68782880161057a565b93505060406107d78782880161057a565b92505060606107e887828801610709565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061085d826106e8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361088f5761088e610823565b5b600182019050919050565b6108a381610551565b82525050565b6108b2816106e8565b82525050565b60006060820190506108cd600083018661089a565b6108da602083018561089a565b6108e760408301846108a9565b949350505050565b60008115159050919050565b610904816108ef565b811461090f57600080fd5b50565b600081519050610921816108fb565b92915050565b60006020828403121561093d5761093c610527565b5b600061094b84828501610912565b91505092915050565b6000604082019050610969600083018561089a565b61097660208301846108a9565b9392505050565b600082825260208201905092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b60006109ea602a8361097d565b91506109f58261098e565b604082019050919050565b60006020820190508181036000830152610a19816109dd565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000610a7c60268361097d565b9150610a8782610a20565b604082019050919050565b60006020820190508181036000830152610aab81610a6f565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000610ae8601d8361097d565b9150610af382610ab2565b602082019050919050565b60006020820190508181036000830152610b1781610adb565b9050919050565b600081519050919050565b600081905092915050565b60005b83811015610b52578082015181840152602081019050610b37565b60008484015250505050565b6000610b6982610b1e565b610b738185610b29565b9350610b83818560208601610b34565b80840191505092915050565b6000610b9b8284610b5e565b915081905092915050565b600081519050919050565b6000610bbc82610ba6565b610bc6818561097d565b9350610bd6818560208601610b34565b610bdf81610594565b840191505092915050565b60006020820190508181036000830152610c048184610bb1565b90509291505056fea2646970667358221220664cb0bbaca7ee0cb22ed4a9acdac832af5e72b37def9b7ede648d25d7b661d664736f6c63430008130033 608060405234801561001057600080fd5b50610cc1806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806352ec852914610046578063c8ce6c7814610062578063f3913e691461007e575b600080fd5b610060600480360381019061005b91906105f1565b61009a565b005b61007c6004803603810190610077919061079d565b610120565b005b6100986004803603810190610093919061080c565b61018a565b005b8273ffffffffffffffffffffffffffffffffffffffff166352ec85298330846040518463ffffffff1660e01b81526004016100d793929190610891565b6020604051808303816000875af11580156100f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061011a9190610900565b50505050565b60005b8251811015610184576101718382815181106101425761014161092d565b5b6020026020010151838673ffffffffffffffffffffffffffffffffffffffff166101bd9092919063ffffffff16565b808061017c9061098b565b915050610123565b50505050565b6101b78383838773ffffffffffffffffffffffffffffffffffffffff16610243909392919063ffffffff16565b50505050565b61023e8363a9059cbb60e01b84846040516024016101dc9291906109d3565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506102cc565b505050565b6102c6846323b872dd60e01b85858560405160240161026493929190610891565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506102cc565b50505050565b600061032e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166103939092919063ffffffff16565b905060008151111561038e578080602001905181019061034e9190610900565b61038d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161038490610a7f565b60405180910390fd5b5b505050565b60606103a284846000856103ab565b90509392505050565b6060824710156103f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103e790610b11565b60405180910390fd5b6103f9856104bf565b610438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161042f90610b7d565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516104619190610c0e565b60006040518083038185875af1925050503d806000811461049e576040519150601f19603f3d011682016040523d82523d6000602084013e6104a3565b606091505b50915091506104b38282866104e2565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606083156104f257829050610542565b6000835111156105055782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105399190610c69565b60405180910390fd5b9392505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006105888261055d565b9050919050565b6105988161057d565b81146105a357600080fd5b50565b6000813590506105b58161058f565b92915050565b6000819050919050565b6105ce816105bb565b81146105d957600080fd5b50565b6000813590506105eb816105c5565b92915050565b60008060006060848603121561060a57610609610553565b5b6000610618868287016105a6565b9350506020610629868287016105a6565b925050604061063a868287016105dc565b9150509250925092565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61069282610649565b810181811067ffffffffffffffff821117156106b1576106b061065a565b5b80604052505050565b60006106c4610549565b90506106d08282610689565b919050565b600067ffffffffffffffff8211156106f0576106ef61065a565b5b602082029050602081019050919050565b600080fd5b6000610719610714846106d5565b6106ba565b9050808382526020820190506020840283018581111561073c5761073b610701565b5b835b81811015610765578061075188826105a6565b84526020840193505060208101905061073e565b5050509392505050565b600082601f83011261078457610783610644565b5b8135610794848260208601610706565b91505092915050565b6000806000606084860312156107b6576107b5610553565b5b60006107c4868287016105a6565b935050602084013567ffffffffffffffff8111156107e5576107e4610558565b5b6107f18682870161076f565b9250506040610802868287016105dc565b9150509250925092565b6000806000806080858703121561082657610825610553565b5b6000610834878288016105a6565b9450506020610845878288016105a6565b9350506040610856878288016105a6565b9250506060610867878288016105dc565b91505092959194509250565b61087c8161057d565b82525050565b61088b816105bb565b82525050565b60006060820190506108a66000830186610873565b6108b36020830185610873565b6108c06040830184610882565b949350505050565b60008115159050919050565b6108dd816108c8565b81146108e857600080fd5b50565b6000815190506108fa816108d4565b92915050565b60006020828403121561091657610915610553565b5b6000610924848285016108eb565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610996826105bb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036109c8576109c761095c565b5b600182019050919050565b60006040820190506109e86000830185610873565b6109f56020830184610882565b9392505050565b600082825260208201905092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000610a69602a836109fc565b9150610a7482610a0d565b604082019050919050565b60006020820190508181036000830152610a9881610a5c565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000610afb6026836109fc565b9150610b0682610a9f565b604082019050919050565b60006020820190508181036000830152610b2a81610aee565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000610b67601d836109fc565b9150610b7282610b31565b602082019050919050565b60006020820190508181036000830152610b9681610b5a565b9050919050565b600081519050919050565b600081905092915050565b60005b83811015610bd1578082015181840152602081019050610bb6565b60008484015250505050565b6000610be882610b9d565b610bf28185610ba8565b9350610c02818560208601610bb3565b80840191505092915050565b6000610c1a8284610bdd565b915081905092915050565b600081519050919050565b6000610c3b82610c25565b610c4581856109fc565b9350610c55818560208601610bb3565b610c5e81610649565b840191505092915050565b60006020820190508181036000830152610c838184610c30565b90509291505056fea264697066735822122084b8bf04ddca1d3621867c5586b5a7741cdcee3e69785d9ff789ebbcc53825f564736f6c63430008130033
\ No newline at end of file \ No newline at end of file
...@@ -30,8 +30,8 @@ var ( ...@@ -30,8 +30,8 @@ var (
// ERC20MetaData contains all meta data concerning the ERC20 contract. // ERC20MetaData contains all meta data concerning the ERC20 contract.
var ERC20MetaData = &bind.MetaData{ var ERC20MetaData = &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\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approveFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"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\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approveFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
Bin: "0x60806040523480156200001157600080fd5b5060405162001ede38038062001ede8339818101604052810190620000379190620002e2565b620000576200004b6200008360201b60201c565b6200008b60201b60201c565b8160049081620000689190620005b2565b5080600590816200007a9190620005b2565b50505062000699565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620001b8826200016d565b810181811067ffffffffffffffff82111715620001da57620001d96200017e565b5b80604052505050565b6000620001ef6200014f565b9050620001fd8282620001ad565b919050565b600067ffffffffffffffff82111562000220576200021f6200017e565b5b6200022b826200016d565b9050602081019050919050565b60005b83811015620002585780820151818401526020810190506200023b565b60008484015250505050565b60006200027b620002758462000202565b620001e3565b9050828152602081018484840111156200029a576200029962000168565b5b620002a784828562000238565b509392505050565b600082601f830112620002c757620002c662000163565b5b8151620002d984826020860162000264565b91505092915050565b60008060408385031215620002fc57620002fb62000159565b5b600083015167ffffffffffffffff8111156200031d576200031c6200015e565b5b6200032b85828601620002af565b925050602083015167ffffffffffffffff8111156200034f576200034e6200015e565b5b6200035d85828601620002af565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620003ba57607f821691505b602082108103620003d057620003cf62000372565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200043a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003fb565b620004468683620003fb565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004936200048d62000487846200045e565b62000468565b6200045e565b9050919050565b6000819050919050565b620004af8362000472565b620004c7620004be826200049a565b84845462000408565b825550505050565b600090565b620004de620004cf565b620004eb818484620004a4565b505050565b5b81811015620005135762000507600082620004d4565b600181019050620004f1565b5050565b601f82111562000562576200052c81620003d6565b6200053784620003eb565b8101602085101562000547578190505b6200055f6200055685620003eb565b830182620004f0565b50505b505050565b600082821c905092915050565b6000620005876000198460080262000567565b1980831691505092915050565b6000620005a2838362000574565b9150826002028217905092915050565b620005bd8262000367565b67ffffffffffffffff811115620005d957620005d86200017e565b5b620005e58254620003a1565b620005f282828562000517565b600060209050601f8311600181146200062a576000841562000615578287015190505b62000621858262000594565b86555062000691565b601f1984166200063a86620003d6565b60005b8281101562000664578489015182556001820191506020850194506020810190506200063d565b8683101562000684578489015162000680601f89168262000574565b8355505b6001600288020188555050505b505050505050565b61183580620006a96000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c806370a0823111610097578063a457c2d711610066578063a457c2d7146102b1578063a9059cbb146102e1578063dd62ed3e14610311578063f2fde38b1461034157610100565b806370a082311461023b578063715018a61461026b5780638da5cb5b1461027557806395d89b411461029357610100565b8063313ce567116100d3578063313ce567146101a157806339509351146101bf57806340c10f19146101ef57806352ec85291461020b57610100565b806306fdde0314610105578063095ea7b31461012357806318160ddd1461015357806323b872dd14610171575b600080fd5b61010d61035d565b60405161011a9190610f7e565b60405180910390f35b61013d60048036038101906101389190611039565b6103ef565b60405161014a9190611094565b60405180910390f35b61015b610412565b60405161016891906110be565b60405180910390f35b61018b600480360381019061018691906110d9565b61041c565b6040516101989190611094565b60405180910390f35b6101a961044b565b6040516101b69190611148565b60405180910390f35b6101d960048036038101906101d49190611039565b610454565b6040516101e69190611094565b60405180910390f35b61020960048036038101906102049190611039565b61048b565b005b610225600480360381019061022091906110d9565b610499565b6040516102329190611094565b60405180910390f35b61025560048036038101906102509190611163565b6104b9565b60405161026291906110be565b60405180910390f35b610273610502565b005b61027d610516565b60405161028a919061119f565b60405180910390f35b61029b61053f565b6040516102a89190610f7e565b60405180910390f35b6102cb60048036038101906102c69190611039565b6105d1565b6040516102d89190611094565b60405180910390f35b6102fb60048036038101906102f69190611039565b610648565b6040516103089190611094565b60405180910390f35b61032b600480360381019061032691906111ba565b61066b565b60405161033891906110be565b60405180910390f35b61035b60048036038101906103569190611163565b6106f2565b005b60606004805461036c90611229565b80601f016020809104026020016040519081016040528092919081815260200182805461039890611229565b80156103e55780601f106103ba576101008083540402835291602001916103e5565b820191906000526020600020905b8154815290600101906020018083116103c857829003601f168201915b5050505050905090565b6000806103fa610775565b905061040781858561077d565b600191505092915050565b6000600354905090565b600080610427610775565b9050610434858285610946565b61043f8585856109d2565b60019150509392505050565b60006012905090565b60008061045f610775565b9050610480818585610471858961066b565b61047b9190611289565b61077d565b600191505092915050565b6104958282610c4b565b5050565b60006104a3610da2565b6104ae84848461077d565b600190509392505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61050a610da2565b6105146000610e20565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606005805461054e90611229565b80601f016020809104026020016040519081016040528092919081815260200182805461057a90611229565b80156105c75780601f1061059c576101008083540402835291602001916105c7565b820191906000526020600020905b8154815290600101906020018083116105aa57829003601f168201915b5050505050905090565b6000806105dc610775565b905060006105ea828661066b565b90508381101561062f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106269061132f565b60405180910390fd5b61063c828686840361077d565b60019250505092915050565b600080610653610775565b90506106608185856109d2565b600191505092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6106fa610da2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610769576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610760906113c1565b60405180910390fd5b61077281610e20565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036107ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e390611453565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361085b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610852906114e5565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161093991906110be565b60405180910390a3505050565b6000610952848461066b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146109cc57818110156109be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b590611551565b60405180910390fd5b6109cb848484840361077d565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a38906115e3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ab0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa790611675565b60405180910390fd5b610abb838383610ee4565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015610b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3990611707565b60405180910390fd5b818103600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610c3291906110be565b60405180910390a3610c45848484610ee9565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb190611773565b60405180910390fd5b610cc660008383610ee4565b8060036000828254610cd89190611289565b9250508190555080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610d8a91906110be565b60405180910390a3610d9e60008383610ee9565b5050565b610daa610775565b73ffffffffffffffffffffffffffffffffffffffff16610dc8610516565b73ffffffffffffffffffffffffffffffffffffffff1614610e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e15906117df565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610f28578082015181840152602081019050610f0d565b60008484015250505050565b6000601f19601f8301169050919050565b6000610f5082610eee565b610f5a8185610ef9565b9350610f6a818560208601610f0a565b610f7381610f34565b840191505092915050565b60006020820190508181036000830152610f988184610f45565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610fd082610fa5565b9050919050565b610fe081610fc5565b8114610feb57600080fd5b50565b600081359050610ffd81610fd7565b92915050565b6000819050919050565b61101681611003565b811461102157600080fd5b50565b6000813590506110338161100d565b92915050565b600080604083850312156110505761104f610fa0565b5b600061105e85828601610fee565b925050602061106f85828601611024565b9150509250929050565b60008115159050919050565b61108e81611079565b82525050565b60006020820190506110a96000830184611085565b92915050565b6110b881611003565b82525050565b60006020820190506110d360008301846110af565b92915050565b6000806000606084860312156110f2576110f1610fa0565b5b600061110086828701610fee565b935050602061111186828701610fee565b925050604061112286828701611024565b9150509250925092565b600060ff82169050919050565b6111428161112c565b82525050565b600060208201905061115d6000830184611139565b92915050565b60006020828403121561117957611178610fa0565b5b600061118784828501610fee565b91505092915050565b61119981610fc5565b82525050565b60006020820190506111b46000830184611190565b92915050565b600080604083850312156111d1576111d0610fa0565b5b60006111df85828601610fee565b92505060206111f085828601610fee565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061124157607f821691505b602082108103611254576112536111fa565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061129482611003565b915061129f83611003565b92508282019050808211156112b7576112b661125a565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000611319602583610ef9565b9150611324826112bd565b604082019050919050565b600060208201905081810360008301526113488161130c565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006113ab602683610ef9565b91506113b68261134f565b604082019050919050565b600060208201905081810360008301526113da8161139e565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061143d602483610ef9565b9150611448826113e1565b604082019050919050565b6000602082019050818103600083015261146c81611430565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006114cf602283610ef9565b91506114da82611473565b604082019050919050565b600060208201905081810360008301526114fe816114c2565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061153b601d83610ef9565b915061154682611505565b602082019050919050565b6000602082019050818103600083015261156a8161152e565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006115cd602583610ef9565b91506115d882611571565b604082019050919050565b600060208201905081810360008301526115fc816115c0565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061165f602383610ef9565b915061166a82611603565b604082019050919050565b6000602082019050818103600083015261168e81611652565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006116f1602683610ef9565b91506116fc82611695565b604082019050919050565b60006020820190508181036000830152611720816116e4565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600061175d601f83610ef9565b915061176882611727565b602082019050919050565b6000602082019050818103600083015261178c81611750565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006117c9602083610ef9565b91506117d482611793565b602082019050919050565b600060208201905081810360008301526117f8816117bc565b905091905056fea2646970667358221220bcd8ff4822f6ba3910d9a240f15e47ca3fdabbd60edf26e665e180ae7683cf9464736f6c63430008130033", Bin: "0x60806040523480156200001157600080fd5b5060405162001a4638038062001a468339818101604052810190620000379190620001f6565b8160039081620000489190620004c6565b5080600490816200005a9190620004c6565b505050620005ad565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620000cc8262000081565b810181811067ffffffffffffffff82111715620000ee57620000ed62000092565b5b80604052505050565b60006200010362000063565b9050620001118282620000c1565b919050565b600067ffffffffffffffff82111562000134576200013362000092565b5b6200013f8262000081565b9050602081019050919050565b60005b838110156200016c5780820151818401526020810190506200014f565b60008484015250505050565b60006200018f620001898462000116565b620000f7565b905082815260208101848484011115620001ae57620001ad6200007c565b5b620001bb8482856200014c565b509392505050565b600082601f830112620001db57620001da62000077565b5b8151620001ed84826020860162000178565b91505092915050565b6000806040838503121562000210576200020f6200006d565b5b600083015167ffffffffffffffff81111562000231576200023062000072565b5b6200023f85828601620001c3565b925050602083015167ffffffffffffffff81111562000263576200026262000072565b5b6200027185828601620001c3565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002ce57607f821691505b602082108103620002e457620002e362000286565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200034e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200030f565b6200035a86836200030f565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003a7620003a16200039b8462000372565b6200037c565b62000372565b9050919050565b6000819050919050565b620003c38362000386565b620003db620003d282620003ae565b8484546200031c565b825550505050565b600090565b620003f2620003e3565b620003ff818484620003b8565b505050565b5b8181101562000427576200041b600082620003e8565b60018101905062000405565b5050565b601f82111562000476576200044081620002ea565b6200044b84620002ff565b810160208510156200045b578190505b620004736200046a85620002ff565b83018262000404565b50505b505050565b600082821c905092915050565b60006200049b600019846008026200047b565b1980831691505092915050565b6000620004b6838362000488565b9150826002028217905092915050565b620004d1826200027b565b67ffffffffffffffff811115620004ed57620004ec62000092565b5b620004f98254620002b5565b620005068282856200042b565b600060209050601f8311600181146200053e576000841562000529578287015190505b620005358582620004a8565b865550620005a5565b601f1984166200054e86620002ea565b60005b82811015620005785784890151825560018201915060208501945060208101905062000551565b8683101562000598578489015162000594601f89168262000488565b8355505b6001600288020188555050505b505050505050565b61148980620005bd6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806340c10f191161008c57806395d89b411161006657806395d89b411461023a578063a457c2d714610258578063a9059cbb14610288578063dd62ed3e146102b8576100cf565b806340c10f19146101be57806352ec8529146101da57806370a082311461020a576100cf565b806306fdde03146100d4578063095ea7b3146100f257806318160ddd1461012257806323b872dd14610140578063313ce56714610170578063395093511461018e575b600080fd5b6100dc6102e8565b6040516100e99190610cfa565b60405180910390f35b61010c60048036038101906101079190610db5565b61037a565b6040516101199190610e10565b60405180910390f35b61012a61039d565b6040516101379190610e3a565b60405180910390f35b61015a60048036038101906101559190610e55565b6103a7565b6040516101679190610e10565b60405180910390f35b6101786103d6565b6040516101859190610ec4565b60405180910390f35b6101a860048036038101906101a39190610db5565b6103df565b6040516101b59190610e10565b60405180910390f35b6101d860048036038101906101d39190610db5565b610416565b005b6101f460048036038101906101ef9190610e55565b610424565b6040516102019190610e10565b60405180910390f35b610224600480360381019061021f9190610edf565b61043c565b6040516102319190610e3a565b60405180910390f35b610242610484565b60405161024f9190610cfa565b60405180910390f35b610272600480360381019061026d9190610db5565b610516565b60405161027f9190610e10565b60405180910390f35b6102a2600480360381019061029d9190610db5565b61058d565b6040516102af9190610e10565b60405180910390f35b6102d260048036038101906102cd9190610f0c565b6105b0565b6040516102df9190610e3a565b60405180910390f35b6060600380546102f790610f7b565b80601f016020809104026020016040519081016040528092919081815260200182805461032390610f7b565b80156103705780601f1061034557610100808354040283529160200191610370565b820191906000526020600020905b81548152906001019060200180831161035357829003601f168201915b5050505050905090565b600080610385610637565b905061039281858561063f565b600191505092915050565b6000600254905090565b6000806103b2610637565b90506103bf858285610808565b6103ca858585610894565b60019150509392505050565b60006012905090565b6000806103ea610637565b905061040b8185856103fc85896105b0565b6104069190610fdb565b61063f565b600191505092915050565b6104208282610b0a565b5050565b600061043184848461063f565b600190509392505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60606004805461049390610f7b565b80601f01602080910402602001604051908101604052809291908181526020018280546104bf90610f7b565b801561050c5780601f106104e15761010080835404028352916020019161050c565b820191906000526020600020905b8154815290600101906020018083116104ef57829003601f168201915b5050505050905090565b600080610521610637565b9050600061052f82866105b0565b905083811015610574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056b90611081565b60405180910390fd5b610581828686840361063f565b60019250505092915050565b600080610598610637565b90506105a5818585610894565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036106ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a590611113565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361071d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610714906111a5565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516107fb9190610e3a565b60405180910390a3505050565b600061081484846105b0565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461088e5781811015610880576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087790611211565b60405180910390fd5b61088d848484840361063f565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fa906112a3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610972576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096990611335565b60405180910390fd5b61097d838383610c60565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015610a03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fa906113c7565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610af19190610e3a565b60405180910390a3610b04848484610c65565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7090611433565b60405180910390fd5b610b8560008383610c60565b8060026000828254610b979190610fdb565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610c489190610e3a565b60405180910390a3610c5c60008383610c65565b5050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610ca4578082015181840152602081019050610c89565b60008484015250505050565b6000601f19601f8301169050919050565b6000610ccc82610c6a565b610cd68185610c75565b9350610ce6818560208601610c86565b610cef81610cb0565b840191505092915050565b60006020820190508181036000830152610d148184610cc1565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610d4c82610d21565b9050919050565b610d5c81610d41565b8114610d6757600080fd5b50565b600081359050610d7981610d53565b92915050565b6000819050919050565b610d9281610d7f565b8114610d9d57600080fd5b50565b600081359050610daf81610d89565b92915050565b60008060408385031215610dcc57610dcb610d1c565b5b6000610dda85828601610d6a565b9250506020610deb85828601610da0565b9150509250929050565b60008115159050919050565b610e0a81610df5565b82525050565b6000602082019050610e256000830184610e01565b92915050565b610e3481610d7f565b82525050565b6000602082019050610e4f6000830184610e2b565b92915050565b600080600060608486031215610e6e57610e6d610d1c565b5b6000610e7c86828701610d6a565b9350506020610e8d86828701610d6a565b9250506040610e9e86828701610da0565b9150509250925092565b600060ff82169050919050565b610ebe81610ea8565b82525050565b6000602082019050610ed96000830184610eb5565b92915050565b600060208284031215610ef557610ef4610d1c565b5b6000610f0384828501610d6a565b91505092915050565b60008060408385031215610f2357610f22610d1c565b5b6000610f3185828601610d6a565b9250506020610f4285828601610d6a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680610f9357607f821691505b602082108103610fa657610fa5610f4c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610fe682610d7f565b9150610ff183610d7f565b925082820190508082111561100957611008610fac565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061106b602583610c75565b91506110768261100f565b604082019050919050565b6000602082019050818103600083015261109a8161105e565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006110fd602483610c75565b9150611108826110a1565b604082019050919050565b6000602082019050818103600083015261112c816110f0565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061118f602283610c75565b915061119a82611133565b604082019050919050565b600060208201905081810360008301526111be81611182565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006111fb601d83610c75565b9150611206826111c5565b602082019050919050565b6000602082019050818103600083015261122a816111ee565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061128d602583610c75565b915061129882611231565b604082019050919050565b600060208201905081810360008301526112bc81611280565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061131f602383610c75565b915061132a826112c3565b604082019050919050565b6000602082019050818103600083015261134e81611312565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006113b1602683610c75565b91506113bc82611355565b604082019050919050565b600060208201905081810360008301526113e0816113a4565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600061141d601f83610c75565b9150611428826113e7565b602082019050919050565b6000602082019050818103600083015261144c81611410565b905091905056fea2646970667358221220924ebdca606d73fd19dbf38938cf5dc6d9cd71c0dff38a1f619f38f4c9b0d67364736f6c63430008130033",
} }
// ERC20ABI is the input ABI used to generate the binding from. // ERC20ABI is the input ABI used to generate the binding from.
...@@ -325,37 +325,6 @@ func (_ERC20 *ERC20CallerSession) Name() (string, error) { ...@@ -325,37 +325,6 @@ func (_ERC20 *ERC20CallerSession) Name() (string, error) {
return _ERC20.Contract.Name(&_ERC20.CallOpts) return _ERC20.Contract.Name(&_ERC20.CallOpts)
} }
// Owner is a free data retrieval call binding the contract method 0x8da5cb5b.
//
// Solidity: function owner() view returns(address)
func (_ERC20 *ERC20Caller) Owner(opts *bind.CallOpts) (common.Address, error) {
var out []interface{}
err := _ERC20.contract.Call(opts, &out, "owner")
if err != nil {
return *new(common.Address), err
}
out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
return out0, err
}
// Owner is a free data retrieval call binding the contract method 0x8da5cb5b.
//
// Solidity: function owner() view returns(address)
func (_ERC20 *ERC20Session) Owner() (common.Address, error) {
return _ERC20.Contract.Owner(&_ERC20.CallOpts)
}
// Owner is a free data retrieval call binding the contract method 0x8da5cb5b.
//
// Solidity: function owner() view returns(address)
func (_ERC20 *ERC20CallerSession) Owner() (common.Address, error) {
return _ERC20.Contract.Owner(&_ERC20.CallOpts)
}
// Symbol is a free data retrieval call binding the contract method 0x95d89b41. // Symbol is a free data retrieval call binding the contract method 0x95d89b41.
// //
// Solidity: function symbol() view returns(string) // Solidity: function symbol() view returns(string)
...@@ -523,27 +492,6 @@ func (_ERC20 *ERC20TransactorSession) Mint(account common.Address, amount *big.I ...@@ -523,27 +492,6 @@ func (_ERC20 *ERC20TransactorSession) Mint(account common.Address, amount *big.I
return _ERC20.Contract.Mint(&_ERC20.TransactOpts, account, amount) return _ERC20.Contract.Mint(&_ERC20.TransactOpts, account, amount)
} }
// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6.
//
// Solidity: function renounceOwnership() returns()
func (_ERC20 *ERC20Transactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error) {
return _ERC20.contract.Transact(opts, "renounceOwnership")
}
// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6.
//
// Solidity: function renounceOwnership() returns()
func (_ERC20 *ERC20Session) RenounceOwnership() (*types.Transaction, error) {
return _ERC20.Contract.RenounceOwnership(&_ERC20.TransactOpts)
}
// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6.
//
// Solidity: function renounceOwnership() returns()
func (_ERC20 *ERC20TransactorSession) RenounceOwnership() (*types.Transaction, error) {
return _ERC20.Contract.RenounceOwnership(&_ERC20.TransactOpts)
}
// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb. // Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
// //
// Solidity: function transfer(address to, uint256 amount) returns(bool) // Solidity: function transfer(address to, uint256 amount) returns(bool)
...@@ -586,27 +534,6 @@ func (_ERC20 *ERC20TransactorSession) TransferFrom(from common.Address, to commo ...@@ -586,27 +534,6 @@ func (_ERC20 *ERC20TransactorSession) TransferFrom(from common.Address, to commo
return _ERC20.Contract.TransferFrom(&_ERC20.TransactOpts, from, to, amount) return _ERC20.Contract.TransferFrom(&_ERC20.TransactOpts, from, to, amount)
} }
// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b.
//
// Solidity: function transferOwnership(address newOwner) returns()
func (_ERC20 *ERC20Transactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) {
return _ERC20.contract.Transact(opts, "transferOwnership", newOwner)
}
// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b.
//
// Solidity: function transferOwnership(address newOwner) returns()
func (_ERC20 *ERC20Session) TransferOwnership(newOwner common.Address) (*types.Transaction, error) {
return _ERC20.Contract.TransferOwnership(&_ERC20.TransactOpts, newOwner)
}
// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b.
//
// Solidity: function transferOwnership(address newOwner) returns()
func (_ERC20 *ERC20TransactorSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) {
return _ERC20.Contract.TransferOwnership(&_ERC20.TransactOpts, newOwner)
}
// ERC20ApprovalIterator is returned from FilterApproval and is used to iterate over the raw logs and unpacked data for Approval events raised by the ERC20 contract. // ERC20ApprovalIterator is returned from FilterApproval and is used to iterate over the raw logs and unpacked data for Approval events raised by the ERC20 contract.
type ERC20ApprovalIterator struct { type ERC20ApprovalIterator struct {
Event *ERC20Approval // Event containing the contract specifics and raw log Event *ERC20Approval // Event containing the contract specifics and raw log
...@@ -761,159 +688,6 @@ func (_ERC20 *ERC20Filterer) ParseApproval(log types.Log) (*ERC20Approval, error ...@@ -761,159 +688,6 @@ func (_ERC20 *ERC20Filterer) ParseApproval(log types.Log) (*ERC20Approval, error
return event, nil return event, nil
} }
// ERC20OwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the ERC20 contract.
type ERC20OwnershipTransferredIterator struct {
Event *ERC20OwnershipTransferred // Event containing the contract specifics and raw log
contract *bind.BoundContract // Generic contract to use for unpacking event data
event string // Event name to use for unpacking event data
logs chan types.Log // Log channel receiving the found contract events
sub ethereum.Subscription // Subscription for errors, completion and termination
done bool // Whether the subscription completed delivering logs
fail error // Occurred error to stop iteration
}
// Next advances the iterator to the subsequent event, returning whether there
// are any more events found. In case of a retrieval or parsing error, false is
// returned and Error() can be queried for the exact failure.
func (it *ERC20OwnershipTransferredIterator) Next() bool {
// If the iterator failed, stop iterating
if it.fail != nil {
return false
}
// If the iterator completed, deliver directly whatever's available
if it.done {
select {
case log := <-it.logs:
it.Event = new(ERC20OwnershipTransferred)
if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
it.fail = err
return false
}
it.Event.Raw = log
return true
default:
return false
}
}
// Iterator still in progress, wait for either a data or an error event
select {
case log := <-it.logs:
it.Event = new(ERC20OwnershipTransferred)
if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
it.fail = err
return false
}
it.Event.Raw = log
return true
case err := <-it.sub.Err():
it.done = true
it.fail = err
return it.Next()
}
}
// Error returns any retrieval or parsing error occurred during filtering.
func (it *ERC20OwnershipTransferredIterator) Error() error {
return it.fail
}
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *ERC20OwnershipTransferredIterator) Close() error {
it.sub.Unsubscribe()
return nil
}
// ERC20OwnershipTransferred represents a OwnershipTransferred event raised by the ERC20 contract.
type ERC20OwnershipTransferred struct {
PreviousOwner common.Address
NewOwner common.Address
Raw types.Log // Blockchain specific contextual infos
}
// FilterOwnershipTransferred is a free log retrieval operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
//
// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
func (_ERC20 *ERC20Filterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*ERC20OwnershipTransferredIterator, error) {
var previousOwnerRule []interface{}
for _, previousOwnerItem := range previousOwner {
previousOwnerRule = append(previousOwnerRule, previousOwnerItem)
}
var newOwnerRule []interface{}
for _, newOwnerItem := range newOwner {
newOwnerRule = append(newOwnerRule, newOwnerItem)
}
logs, sub, err := _ERC20.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule)
if err != nil {
return nil, err
}
return &ERC20OwnershipTransferredIterator{contract: _ERC20.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil
}
// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
//
// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
func (_ERC20 *ERC20Filterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *ERC20OwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) {
var previousOwnerRule []interface{}
for _, previousOwnerItem := range previousOwner {
previousOwnerRule = append(previousOwnerRule, previousOwnerItem)
}
var newOwnerRule []interface{}
for _, newOwnerItem := range newOwner {
newOwnerRule = append(newOwnerRule, newOwnerItem)
}
logs, sub, err := _ERC20.contract.WatchLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule)
if err != nil {
return nil, err
}
return event.NewSubscription(func(quit <-chan struct{}) error {
defer sub.Unsubscribe()
for {
select {
case log := <-logs:
// New log arrived, parse the event and forward to the user
event := new(ERC20OwnershipTransferred)
if err := _ERC20.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil {
return err
}
event.Raw = log
select {
case sink <- event:
case err := <-sub.Err():
return err
case <-quit:
return nil
}
case err := <-sub.Err():
return err
case <-quit:
return nil
}
}
}), nil
}
// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
//
// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
func (_ERC20 *ERC20Filterer) ParseOwnershipTransferred(log types.Log) (*ERC20OwnershipTransferred, error) {
event := new(ERC20OwnershipTransferred)
if err := _ERC20.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil {
return nil, err
}
event.Raw = log
return event, nil
}
// ERC20TransferIterator is returned from FilterTransfer and is used to iterate over the raw logs and unpacked data for Transfer events raised by the ERC20 contract. // ERC20TransferIterator is returned from FilterTransfer and is used to iterate over the raw logs and unpacked data for Transfer events raised by the ERC20 contract.
type ERC20TransferIterator struct { type ERC20TransferIterator struct {
Event *ERC20Transfer // Event containing the contract specifics and raw log Event *ERC20Transfer // Event containing the contract specifics and raw log
......
...@@ -30,8 +30,8 @@ var ( ...@@ -30,8 +30,8 @@ var (
// TokenTransferMetaData contains all meta data concerning the TokenTransfer contract. // TokenTransferMetaData contains all meta data concerning the TokenTransfer contract.
var TokenTransferMetaData = &bind.MetaData{ var TokenTransferMetaData = &bind.MetaData{
ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"toArr\",\"type\":\"address[]\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"tokenTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"tokenTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approveFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"toArr\",\"type\":\"address[]\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"tokenTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"tokenTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
Bin: "0x608060405234801561001057600080fd5b50610c42806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063c8ce6c781461003b578063f3913e6914610057575b600080fd5b6100556004803603810190610050919061071e565b610073565b005b610071600480360381019061006c919061078d565b6100dd565b005b60005b82518110156100d7576100c4838281518110610095576100946107f4565b5b6020026020010151838673ffffffffffffffffffffffffffffffffffffffff166101919092919063ffffffff16565b80806100cf90610852565b915050610076565b50505050565b8373ffffffffffffffffffffffffffffffffffffffff166352ec85298484846040518463ffffffff1660e01b815260040161011a939291906108b8565b6020604051808303816000875af1158015610139573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061015d9190610927565b5061018b8383838773ffffffffffffffffffffffffffffffffffffffff16610217909392919063ffffffff16565b50505050565b6102128363a9059cbb60e01b84846040516024016101b0929190610954565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506102a0565b505050565b61029a846323b872dd60e01b858585604051602401610238939291906108b8565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506102a0565b50505050565b6000610302826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166103679092919063ffffffff16565b905060008151111561036257808060200190518101906103229190610927565b610361576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161035890610a00565b60405180910390fd5b5b505050565b6060610376848460008561037f565b90509392505050565b6060824710156103c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103bb90610a92565b60405180910390fd5b6103cd85610493565b61040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390610afe565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516104359190610b8f565b60006040518083038185875af1925050503d8060008114610472576040519150601f19603f3d011682016040523d82523d6000602084013e610477565b606091505b50915091506104878282866104b6565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606083156104c657829050610516565b6000835111156104d95782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161050d9190610bea565b60405180910390fd5b9392505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061055c82610531565b9050919050565b61056c81610551565b811461057757600080fd5b50565b60008135905061058981610563565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6105dd82610594565b810181811067ffffffffffffffff821117156105fc576105fb6105a5565b5b80604052505050565b600061060f61051d565b905061061b82826105d4565b919050565b600067ffffffffffffffff82111561063b5761063a6105a5565b5b602082029050602081019050919050565b600080fd5b600061066461065f84610620565b610605565b905080838252602082019050602084028301858111156106875761068661064c565b5b835b818110156106b0578061069c888261057a565b845260208401935050602081019050610689565b5050509392505050565b600082601f8301126106cf576106ce61058f565b5b81356106df848260208601610651565b91505092915050565b6000819050919050565b6106fb816106e8565b811461070657600080fd5b50565b600081359050610718816106f2565b92915050565b60008060006060848603121561073757610736610527565b5b60006107458682870161057a565b935050602084013567ffffffffffffffff8111156107665761076561052c565b5b610772868287016106ba565b925050604061078386828701610709565b9150509250925092565b600080600080608085870312156107a7576107a6610527565b5b60006107b58782880161057a565b94505060206107c68782880161057a565b93505060406107d78782880161057a565b92505060606107e887828801610709565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061085d826106e8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361088f5761088e610823565b5b600182019050919050565b6108a381610551565b82525050565b6108b2816106e8565b82525050565b60006060820190506108cd600083018661089a565b6108da602083018561089a565b6108e760408301846108a9565b949350505050565b60008115159050919050565b610904816108ef565b811461090f57600080fd5b50565b600081519050610921816108fb565b92915050565b60006020828403121561093d5761093c610527565b5b600061094b84828501610912565b91505092915050565b6000604082019050610969600083018561089a565b61097660208301846108a9565b9392505050565b600082825260208201905092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b60006109ea602a8361097d565b91506109f58261098e565b604082019050919050565b60006020820190508181036000830152610a19816109dd565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000610a7c60268361097d565b9150610a8782610a20565b604082019050919050565b60006020820190508181036000830152610aab81610a6f565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000610ae8601d8361097d565b9150610af382610ab2565b602082019050919050565b60006020820190508181036000830152610b1781610adb565b9050919050565b600081519050919050565b600081905092915050565b60005b83811015610b52578082015181840152602081019050610b37565b60008484015250505050565b6000610b6982610b1e565b610b738185610b29565b9350610b83818560208601610b34565b80840191505092915050565b6000610b9b8284610b5e565b915081905092915050565b600081519050919050565b6000610bbc82610ba6565b610bc6818561097d565b9350610bd6818560208601610b34565b610bdf81610594565b840191505092915050565b60006020820190508181036000830152610c048184610bb1565b90509291505056fea2646970667358221220c82a0d5481c458d308c715ed1925983c8c7f68c67f6f330c6c0e86ab3c5f4a1464736f6c63430008130033", Bin: "0x608060405234801561001057600080fd5b50610cc1806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806352ec852914610046578063c8ce6c7814610062578063f3913e691461007e575b600080fd5b610060600480360381019061005b91906105f1565b61009a565b005b61007c6004803603810190610077919061079d565b610120565b005b6100986004803603810190610093919061080c565b61018a565b005b8273ffffffffffffffffffffffffffffffffffffffff166352ec85298330846040518463ffffffff1660e01b81526004016100d793929190610891565b6020604051808303816000875af11580156100f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061011a9190610900565b50505050565b60005b8251811015610184576101718382815181106101425761014161092d565b5b6020026020010151838673ffffffffffffffffffffffffffffffffffffffff166101bd9092919063ffffffff16565b808061017c9061098b565b915050610123565b50505050565b6101b78383838773ffffffffffffffffffffffffffffffffffffffff16610243909392919063ffffffff16565b50505050565b61023e8363a9059cbb60e01b84846040516024016101dc9291906109d3565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506102cc565b505050565b6102c6846323b872dd60e01b85858560405160240161026493929190610891565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506102cc565b50505050565b600061032e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166103939092919063ffffffff16565b905060008151111561038e578080602001905181019061034e9190610900565b61038d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161038490610a7f565b60405180910390fd5b5b505050565b60606103a284846000856103ab565b90509392505050565b6060824710156103f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103e790610b11565b60405180910390fd5b6103f9856104bf565b610438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161042f90610b7d565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516104619190610c0e565b60006040518083038185875af1925050503d806000811461049e576040519150601f19603f3d011682016040523d82523d6000602084013e6104a3565b606091505b50915091506104b38282866104e2565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606083156104f257829050610542565b6000835111156105055782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105399190610c69565b60405180910390fd5b9392505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006105888261055d565b9050919050565b6105988161057d565b81146105a357600080fd5b50565b6000813590506105b58161058f565b92915050565b6000819050919050565b6105ce816105bb565b81146105d957600080fd5b50565b6000813590506105eb816105c5565b92915050565b60008060006060848603121561060a57610609610553565b5b6000610618868287016105a6565b9350506020610629868287016105a6565b925050604061063a868287016105dc565b9150509250925092565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61069282610649565b810181811067ffffffffffffffff821117156106b1576106b061065a565b5b80604052505050565b60006106c4610549565b90506106d08282610689565b919050565b600067ffffffffffffffff8211156106f0576106ef61065a565b5b602082029050602081019050919050565b600080fd5b6000610719610714846106d5565b6106ba565b9050808382526020820190506020840283018581111561073c5761073b610701565b5b835b81811015610765578061075188826105a6565b84526020840193505060208101905061073e565b5050509392505050565b600082601f83011261078457610783610644565b5b8135610794848260208601610706565b91505092915050565b6000806000606084860312156107b6576107b5610553565b5b60006107c4868287016105a6565b935050602084013567ffffffffffffffff8111156107e5576107e4610558565b5b6107f18682870161076f565b9250506040610802868287016105dc565b9150509250925092565b6000806000806080858703121561082657610825610553565b5b6000610834878288016105a6565b9450506020610845878288016105a6565b9350506040610856878288016105a6565b9250506060610867878288016105dc565b91505092959194509250565b61087c8161057d565b82525050565b61088b816105bb565b82525050565b60006060820190506108a66000830186610873565b6108b36020830185610873565b6108c06040830184610882565b949350505050565b60008115159050919050565b6108dd816108c8565b81146108e857600080fd5b50565b6000815190506108fa816108d4565b92915050565b60006020828403121561091657610915610553565b5b6000610924848285016108eb565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610996826105bb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036109c8576109c761095c565b5b600182019050919050565b60006040820190506109e86000830185610873565b6109f56020830184610882565b9392505050565b600082825260208201905092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000610a69602a836109fc565b9150610a7482610a0d565b604082019050919050565b60006020820190508181036000830152610a9881610a5c565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000610afb6026836109fc565b9150610b0682610a9f565b604082019050919050565b60006020820190508181036000830152610b2a81610aee565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000610b67601d836109fc565b9150610b7282610b31565b602082019050919050565b60006020820190508181036000830152610b9681610b5a565b9050919050565b600081519050919050565b600081905092915050565b60005b83811015610bd1578082015181840152602081019050610bb6565b60008484015250505050565b6000610be882610b9d565b610bf28185610ba8565b9350610c02818560208601610bb3565b80840191505092915050565b6000610c1a8284610bdd565b915081905092915050565b600081519050919050565b6000610c3b82610c25565b610c4581856109fc565b9350610c55818560208601610bb3565b610c5e81610649565b840191505092915050565b60006020820190508181036000830152610c838184610c30565b90509291505056fea264697066735822122084b8bf04ddca1d3621867c5586b5a7741cdcee3e69785d9ff789ebbcc53825f564736f6c63430008130033",
} }
// TokenTransferABI is the input ABI used to generate the binding from. // TokenTransferABI is the input ABI used to generate the binding from.
...@@ -201,6 +201,27 @@ func (_TokenTransfer *TokenTransferTransactorRaw) Transact(opts *bind.TransactOp ...@@ -201,6 +201,27 @@ func (_TokenTransfer *TokenTransferTransactorRaw) Transact(opts *bind.TransactOp
return _TokenTransfer.Contract.contract.Transact(opts, method, params...) return _TokenTransfer.Contract.contract.Transact(opts, method, params...)
} }
// ApproveFrom is a paid mutator transaction binding the contract method 0x52ec8529.
//
// Solidity: function approveFrom(address token, address from, uint256 value) returns()
func (_TokenTransfer *TokenTransferTransactor) ApproveFrom(opts *bind.TransactOpts, token common.Address, from common.Address, value *big.Int) (*types.Transaction, error) {
return _TokenTransfer.contract.Transact(opts, "approveFrom", token, from, value)
}
// ApproveFrom is a paid mutator transaction binding the contract method 0x52ec8529.
//
// Solidity: function approveFrom(address token, address from, uint256 value) returns()
func (_TokenTransfer *TokenTransferSession) ApproveFrom(token common.Address, from common.Address, value *big.Int) (*types.Transaction, error) {
return _TokenTransfer.Contract.ApproveFrom(&_TokenTransfer.TransactOpts, token, from, value)
}
// ApproveFrom is a paid mutator transaction binding the contract method 0x52ec8529.
//
// Solidity: function approveFrom(address token, address from, uint256 value) returns()
func (_TokenTransfer *TokenTransferTransactorSession) ApproveFrom(token common.Address, from common.Address, value *big.Int) (*types.Transaction, error) {
return _TokenTransfer.Contract.ApproveFrom(&_TokenTransfer.TransactOpts, token, from, value)
}
// TokenTransfer is a paid mutator transaction binding the contract method 0xc8ce6c78. // TokenTransfer is a paid mutator transaction binding the contract method 0xc8ce6c78.
// //
// Solidity: function tokenTransfer(address token, address[] toArr, uint256 value) returns() // Solidity: function tokenTransfer(address token, address[] toArr, uint256 value) returns()
......
...@@ -196,7 +196,7 @@ contract ERC20 is Context, IERC20, IERC20Metadata { ...@@ -196,7 +196,7 @@ contract ERC20 is Context, IERC20, IERC20Metadata {
address owner, address owner,
address spender, address spender,
uint256 amount uint256 amount
) public virtual override returns (bool) { ) public override returns (bool) {
_approve(owner, spender, amount); _approve(owner, spender, amount);
return true; return true;
} }
......
...@@ -23,7 +23,6 @@ contract TokenTransfer { ...@@ -23,7 +23,6 @@ contract TokenTransfer {
address to, address to,
uint256 value uint256 value
) external { ) external {
IERC20(token).approveFrom(from, to, value);
IERC20(token).safeTransferFrom(from, to, value); IERC20(token).safeTransferFrom(from, to, value);
} }
} }
[{"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":"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":"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
60806040523480156200001157600080fd5b5060405162002a9038038062002a908339818101604052810190620000379190620001f6565b8160009081620000489190620004c6565b5080600190816200005a9190620004c6565b505050620005ad565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620000cc8262000081565b810181811067ffffffffffffffff82111715620000ee57620000ed62000092565b5b80604052505050565b60006200010362000063565b9050620001118282620000c1565b919050565b600067ffffffffffffffff82111562000134576200013362000092565b5b6200013f8262000081565b9050602081019050919050565b60005b838110156200016c5780820151818401526020810190506200014f565b60008484015250505050565b60006200018f620001898462000116565b620000f7565b905082815260208101848484011115620001ae57620001ad6200007c565b5b620001bb8482856200014c565b509392505050565b600082601f830112620001db57620001da62000077565b5b8151620001ed84826020860162000178565b91505092915050565b6000806040838503121562000210576200020f6200006d565b5b600083015167ffffffffffffffff81111562000231576200023062000072565b5b6200023f85828601620001c3565b925050602083015167ffffffffffffffff81111562000263576200026262000072565b5b6200027185828601620001c3565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002ce57607f821691505b602082108103620002e457620002e362000286565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200034e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200030f565b6200035a86836200030f565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003a7620003a16200039b8462000372565b6200037c565b62000372565b9050919050565b6000819050919050565b620003c38362000386565b620003db620003d282620003ae565b8484546200031c565b825550505050565b600090565b620003f2620003e3565b620003ff818484620003b8565b505050565b5b8181101562000427576200041b600082620003e8565b60018101905062000405565b5050565b601f82111562000476576200044081620002ea565b6200044b84620002ff565b810160208510156200045b578190505b620004736200046a85620002ff565b83018262000404565b50505b505050565b600082821c905092915050565b60006200049b600019846008026200047b565b1980831691505092915050565b6000620004b6838362000488565b9150826002028217905092915050565b620004d1826200027b565b67ffffffffffffffff811115620004ed57620004ec62000092565b5b620004f98254620002b5565b620005068282856200042b565b600060209050601f8311600181146200053e576000841562000529578287015190505b620005358582620004a8565b865550620005a5565b601f1984166200054e86620002ea565b60005b82811015620005785784890151825560018201915060208501945060208101905062000551565b8683101562000598578489015162000594601f89168262000488565b8355505b6001600288020188555050505b505050505050565b6124d380620005bd6000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c80636352211e1161008c578063a22cb46511610066578063a22cb4651461025b578063b88d4fde14610277578063c87b56dd14610293578063e985e9c5146102c3576100ea565b80636352211e146101dd57806370a082311461020d57806395d89b411461023d576100ea565b8063095ea7b3116100c8578063095ea7b31461016d57806323b872dd1461018957806340c10f19146101a557806342842e0e146101c1576100ea565b806301ffc9a7146100ef57806306fdde031461011f578063081812fc1461013d575b600080fd5b610109600480360381019061010491906117cf565b6102f3565b6040516101169190611817565b60405180910390f35b6101276103d5565b60405161013491906118c2565b60405180910390f35b6101576004803603810190610152919061191a565b610467565b6040516101649190611988565b60405180910390f35b610187600480360381019061018291906119cf565b6104ad565b005b6101a3600480360381019061019e9190611a0f565b6105c4565b005b6101bf60048036038101906101ba91906119cf565b610624565b005b6101db60048036038101906101d69190611a0f565b610632565b005b6101f760048036038101906101f2919061191a565b610652565b6040516102049190611988565b60405180910390f35b61022760048036038101906102229190611a62565b6106d8565b6040516102349190611a9e565b60405180910390f35b61024561078f565b60405161025291906118c2565b60405180910390f35b61027560048036038101906102709190611ae5565b610821565b005b610291600480360381019061028c9190611c5a565b610837565b005b6102ad60048036038101906102a8919061191a565b610899565b6040516102ba91906118c2565b60405180910390f35b6102dd60048036038101906102d89190611cdd565b610901565b6040516102ea9190611817565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806103be57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806103ce57506103cd82610995565b5b9050919050565b6060600080546103e490611d4c565b80601f016020809104026020016040519081016040528092919081815260200182805461041090611d4c565b801561045d5780601f106104325761010080835404028352916020019161045d565b820191906000526020600020905b81548152906001019060200180831161044057829003601f168201915b5050505050905090565b6000610472826109ff565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006104b882610652565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051f90611def565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610547610a4a565b73ffffffffffffffffffffffffffffffffffffffff161480610576575061057581610570610a4a565b610901565b5b6105b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ac90611e81565b60405180910390fd5b6105bf8383610a52565b505050565b6105d56105cf610a4a565b82610b0b565b610614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060b90611f13565b60405180910390fd5b61061f838383610ba0565b505050565b61062e8282610e99565b5050565b61064d83838360405180602001604052806000815250610837565b505050565b60008061065e83610eb7565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036106cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c690611f7f565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073f90612011565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60606001805461079e90611d4c565b80601f01602080910402602001604051908101604052809291908181526020018280546107ca90611d4c565b80156108175780601f106107ec57610100808354040283529160200191610817565b820191906000526020600020905b8154815290600101906020018083116107fa57829003601f168201915b5050505050905090565b61083361082c610a4a565b8383610ef4565b5050565b610848610842610a4a565b83610b0b565b610887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087e90611f13565b60405180910390fd5b61089384848484611060565b50505050565b60606108a4826109ff565b60006108ae6110bc565b905060008151116108ce57604051806020016040528060008152506108f9565b806108d8846110d3565b6040516020016108e992919061206d565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610a08816111a1565b610a47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3e90611f7f565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610ac583610652565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610b1783610652565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610b595750610b588185610901565b5b80610b9757508373ffffffffffffffffffffffffffffffffffffffff16610b7f84610467565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610bc082610652565b73ffffffffffffffffffffffffffffffffffffffff1614610c16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0d90612103565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7c90612195565b60405180910390fd5b610c9283838360016111e2565b8273ffffffffffffffffffffffffffffffffffffffff16610cb282610652565b73ffffffffffffffffffffffffffffffffffffffff1614610d08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cff90612103565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610e9483838360016111e8565b505050565b610eb38282604051806020016040528060008152506111ee565b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5990612201565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110539190611817565b60405180910390a3505050565b61106b848484610ba0565b61107784848484611249565b6110b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ad90612293565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b6060600060016110e2846113d0565b01905060008167ffffffffffffffff81111561110157611100611b2f565b5b6040519080825280601f01601f1916602001820160405280156111335781602001600182028036833780820191505090505b509050600082602001820190505b600115611196578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161118a576111896122b3565b5b04945060008503611141575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166111c383610eb7565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b50505050565b50505050565b6111f88383611523565b6112056000848484611249565b611244576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123b90612293565b60405180910390fd5b505050565b600061126a8473ffffffffffffffffffffffffffffffffffffffff16611740565b156113c3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611293610a4a565b8786866040518563ffffffff1660e01b81526004016112b59493929190612337565b6020604051808303816000875af19250505080156112f157506040513d601f19601f820116820180604052508101906112ee9190612398565b60015b611373573d8060008114611321576040519150601f19603f3d011682016040523d82523d6000602084013e611326565b606091505b50600081510361136b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136290612293565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506113c8565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061142e577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611424576114236122b3565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061146b576d04ee2d6d415b85acef81000000008381611461576114606122b3565b5b0492506020810190505b662386f26fc10000831061149a57662386f26fc1000083816114905761148f6122b3565b5b0492506010810190505b6305f5e10083106114c3576305f5e10083816114b9576114b86122b3565b5b0492506008810190505b61271083106114e85761271083816114de576114dd6122b3565b5b0492506004810190505b6064831061150b5760648381611501576115006122b3565b5b0492506002810190505b600a831061151a576001810190505b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611592576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158990612411565b60405180910390fd5b61159b816111a1565b156115db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d29061247d565b60405180910390fd5b6115e96000838360016111e2565b6115f2816111a1565b15611632576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116299061247d565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461173c6000838360016111e8565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6117ac81611777565b81146117b757600080fd5b50565b6000813590506117c9816117a3565b92915050565b6000602082840312156117e5576117e461176d565b5b60006117f3848285016117ba565b91505092915050565b60008115159050919050565b611811816117fc565b82525050565b600060208201905061182c6000830184611808565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561186c578082015181840152602081019050611851565b60008484015250505050565b6000601f19601f8301169050919050565b600061189482611832565b61189e818561183d565b93506118ae81856020860161184e565b6118b781611878565b840191505092915050565b600060208201905081810360008301526118dc8184611889565b905092915050565b6000819050919050565b6118f7816118e4565b811461190257600080fd5b50565b600081359050611914816118ee565b92915050565b6000602082840312156119305761192f61176d565b5b600061193e84828501611905565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061197282611947565b9050919050565b61198281611967565b82525050565b600060208201905061199d6000830184611979565b92915050565b6119ac81611967565b81146119b757600080fd5b50565b6000813590506119c9816119a3565b92915050565b600080604083850312156119e6576119e561176d565b5b60006119f4858286016119ba565b9250506020611a0585828601611905565b9150509250929050565b600080600060608486031215611a2857611a2761176d565b5b6000611a36868287016119ba565b9350506020611a47868287016119ba565b9250506040611a5886828701611905565b9150509250925092565b600060208284031215611a7857611a7761176d565b5b6000611a86848285016119ba565b91505092915050565b611a98816118e4565b82525050565b6000602082019050611ab36000830184611a8f565b92915050565b611ac2816117fc565b8114611acd57600080fd5b50565b600081359050611adf81611ab9565b92915050565b60008060408385031215611afc57611afb61176d565b5b6000611b0a858286016119ba565b9250506020611b1b85828601611ad0565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611b6782611878565b810181811067ffffffffffffffff82111715611b8657611b85611b2f565b5b80604052505050565b6000611b99611763565b9050611ba58282611b5e565b919050565b600067ffffffffffffffff821115611bc557611bc4611b2f565b5b611bce82611878565b9050602081019050919050565b82818337600083830152505050565b6000611bfd611bf884611baa565b611b8f565b905082815260208101848484011115611c1957611c18611b2a565b5b611c24848285611bdb565b509392505050565b600082601f830112611c4157611c40611b25565b5b8135611c51848260208601611bea565b91505092915050565b60008060008060808587031215611c7457611c7361176d565b5b6000611c82878288016119ba565b9450506020611c93878288016119ba565b9350506040611ca487828801611905565b925050606085013567ffffffffffffffff811115611cc557611cc4611772565b5b611cd187828801611c2c565b91505092959194509250565b60008060408385031215611cf457611cf361176d565b5b6000611d02858286016119ba565b9250506020611d13858286016119ba565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611d6457607f821691505b602082108103611d7757611d76611d1d565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000611dd960218361183d565b9150611de482611d7d565b604082019050919050565b60006020820190508181036000830152611e0881611dcc565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000611e6b603d8361183d565b9150611e7682611e0f565b604082019050919050565b60006020820190508181036000830152611e9a81611e5e565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000611efd602d8361183d565b9150611f0882611ea1565b604082019050919050565b60006020820190508181036000830152611f2c81611ef0565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000611f6960188361183d565b9150611f7482611f33565b602082019050919050565b60006020820190508181036000830152611f9881611f5c565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000611ffb60298361183d565b915061200682611f9f565b604082019050919050565b6000602082019050818103600083015261202a81611fee565b9050919050565b600081905092915050565b600061204782611832565b6120518185612031565b935061206181856020860161184e565b80840191505092915050565b6000612079828561203c565b9150612085828461203c565b91508190509392505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006120ed60258361183d565b91506120f882612091565b604082019050919050565b6000602082019050818103600083015261211c816120e0565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061217f60248361183d565b915061218a82612123565b604082019050919050565b600060208201905081810360008301526121ae81612172565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006121eb60198361183d565b91506121f6826121b5565b602082019050919050565b6000602082019050818103600083015261221a816121de565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061227d60328361183d565b915061228882612221565b604082019050919050565b600060208201905081810360008301526122ac81612270565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000612309826122e2565b61231381856122ed565b935061232381856020860161184e565b61232c81611878565b840191505092915050565b600060808201905061234c6000830187611979565b6123596020830186611979565b6123666040830185611a8f565b818103606083015261237881846122fe565b905095945050505050565b600081519050612392816117a3565b92915050565b6000602082840312156123ae576123ad61176d565b5b60006123bc84828501612383565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006123fb60208361183d565b9150612406826123c5565b602082019050919050565b6000602082019050818103600083015261242a816123ee565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000612467601c8361183d565b915061247282612431565b602082019050919050565b600060208201905081810360008301526124968161245a565b905091905056fea264697066735822122074cdecb99835c7275d46390904cbc908ec30ac7515c4aedef814aea06cee52b264736f6c63430008130033 60806040523480156200001157600080fd5b5060405162002b1a38038062002b1a8339818101604052810190620000379190620001f6565b8160009081620000489190620004c6565b5080600190816200005a9190620004c6565b505050620005ad565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620000cc8262000081565b810181811067ffffffffffffffff82111715620000ee57620000ed62000092565b5b80604052505050565b60006200010362000063565b9050620001118282620000c1565b919050565b600067ffffffffffffffff82111562000134576200013362000092565b5b6200013f8262000081565b9050602081019050919050565b60005b838110156200016c5780820151818401526020810190506200014f565b60008484015250505050565b60006200018f620001898462000116565b620000f7565b905082815260208101848484011115620001ae57620001ad6200007c565b5b620001bb8482856200014c565b509392505050565b600082601f830112620001db57620001da62000077565b5b8151620001ed84826020860162000178565b91505092915050565b6000806040838503121562000210576200020f6200006d565b5b600083015167ffffffffffffffff81111562000231576200023062000072565b5b6200023f85828601620001c3565b925050602083015167ffffffffffffffff81111562000263576200026262000072565b5b6200027185828601620001c3565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002ce57607f821691505b602082108103620002e457620002e362000286565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200034e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200030f565b6200035a86836200030f565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003a7620003a16200039b8462000372565b6200037c565b62000372565b9050919050565b6000819050919050565b620003c38362000386565b620003db620003d282620003ae565b8484546200031c565b825550505050565b600090565b620003f2620003e3565b620003ff818484620003b8565b505050565b5b8181101562000427576200041b600082620003e8565b60018101905062000405565b5050565b601f82111562000476576200044081620002ea565b6200044b84620002ff565b810160208510156200045b578190505b620004736200046a85620002ff565b83018262000404565b50505b505050565b600082821c905092915050565b60006200049b600019846008026200047b565b1980831691505092915050565b6000620004b6838362000488565b9150826002028217905092915050565b620004d1826200027b565b67ffffffffffffffff811115620004ed57620004ec62000092565b5b620004f98254620002b5565b620005068282856200042b565b600060209050601f8311600181146200053e576000841562000529578287015190505b620005358582620004a8565b865550620005a5565b601f1984166200054e86620002ea565b60005b82811015620005785784890151825560018201915060208501945060208101905062000551565b8683101562000598578489015162000594601f89168262000488565b8355505b6001600288020188555050505b505050505050565b61255d80620005bd6000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806357b375f411610097578063a22cb46511610066578063a22cb46514610282578063b88d4fde1461029e578063c87b56dd146102ba578063e985e9c5146102ea576100f5565b806357b375f4146101e85780636352211e1461020457806370a082311461023457806395d89b4114610264576100f5565b8063095ea7b3116100d3578063095ea7b31461017857806323b872dd1461019457806340c10f19146101b057806342842e0e146101cc576100f5565b806301ffc9a7146100fa57806306fdde031461012a578063081812fc14610148575b600080fd5b610114600480360381019061010f9190611806565b61031a565b604051610121919061184e565b60405180910390f35b6101326103fc565b60405161013f91906118f9565b60405180910390f35b610162600480360381019061015d9190611951565b61048e565b60405161016f91906119bf565b60405180910390f35b610192600480360381019061018d9190611a06565b6104d4565b005b6101ae60048036038101906101a99190611a46565b6105eb565b005b6101ca60048036038101906101c59190611a06565b61064b565b005b6101e660048036038101906101e19190611a46565b610659565b005b61020260048036038101906101fd9190611ac5565b610679565b005b61021e60048036038101906102199190611951565b610689565b60405161022b91906119bf565b60405180910390f35b61024e60048036038101906102499190611b18565b61070f565b60405161025b9190611b54565b60405180910390f35b61026c6107c6565b60405161027991906118f9565b60405180910390f35b61029c60048036038101906102979190611b6f565b610858565b005b6102b860048036038101906102b39190611ce4565b61086e565b005b6102d460048036038101906102cf9190611951565b6108d0565b6040516102e191906118f9565b60405180910390f35b61030460048036038101906102ff9190611d67565b610938565b604051610311919061184e565b60405180910390f35b60007fd71f2d39000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806103e557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806103f557506103f4826109cc565b5b9050919050565b60606000805461040b90611dd6565b80601f016020809104026020016040519081016040528092919081815260200182805461043790611dd6565b80156104845780601f1061045957610100808354040283529160200191610484565b820191906000526020600020905b81548152906001019060200180831161046757829003601f168201915b5050505050905090565b600061049982610a36565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006104df82610689565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361054f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161054690611e79565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661056e610a81565b73ffffffffffffffffffffffffffffffffffffffff16148061059d575061059c81610597610a81565b610938565b5b6105dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d390611f0b565b60405180910390fd5b6105e68383610a89565b505050565b6105fc6105f6610a81565b82610b42565b61063b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063290611f9d565b60405180910390fd5b610646838383610bd7565b505050565b6106558282610ed0565b5050565b6106748383836040518060200160405280600081525061086e565b505050565b610684838383610eee565b505050565b6000806106958361105a565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610706576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106fd90612009565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361077f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107769061209b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600180546107d590611dd6565b80601f016020809104026020016040519081016040528092919081815260200182805461080190611dd6565b801561084e5780601f106108235761010080835404028352916020019161084e565b820191906000526020600020905b81548152906001019060200180831161083157829003601f168201915b5050505050905090565b61086a610863610a81565b8383610eee565b5050565b61087f610879610a81565b83610b42565b6108be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b590611f9d565b60405180910390fd5b6108ca84848484611097565b50505050565b60606108db82610a36565b60006108e56110f3565b905060008151116109055760405180602001604052806000815250610930565b8061090f8461110a565b6040516020016109209291906120f7565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610a3f816111d8565b610a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7590612009565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610afc83610689565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610b4e83610689565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610b905750610b8f8185610938565b5b80610bce57508373ffffffffffffffffffffffffffffffffffffffff16610bb68461048e565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610bf782610689565b73ffffffffffffffffffffffffffffffffffffffff1614610c4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c449061218d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb39061221f565b60405180910390fd5b610cc98383836001611219565b8273ffffffffffffffffffffffffffffffffffffffff16610ce982610689565b73ffffffffffffffffffffffffffffffffffffffff1614610d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d369061218d565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610ecb838383600161121f565b505050565b610eea828260405180602001604052806000815250611225565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f539061228b565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161104d919061184e565b60405180910390a3505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6110a2848484610bd7565b6110ae84848484611280565b6110ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e49061231d565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b60606000600161111984611407565b01905060008167ffffffffffffffff81111561113857611137611bb9565b5b6040519080825280601f01601f19166020018201604052801561116a5781602001600182028036833780820191505090505b509050600082602001820190505b6001156111cd578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816111c1576111c061233d565b5b04945060008503611178575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166111fa8361105a565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b50505050565b50505050565b61122f838361155a565b61123c6000848484611280565b61127b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112729061231d565b60405180910390fd5b505050565b60006112a18473ffffffffffffffffffffffffffffffffffffffff16611777565b156113fa578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026112ca610a81565b8786866040518563ffffffff1660e01b81526004016112ec94939291906123c1565b6020604051808303816000875af192505050801561132857506040513d601f19601f820116820180604052508101906113259190612422565b60015b6113aa573d8060008114611358576040519150601f19603f3d011682016040523d82523d6000602084013e61135d565b606091505b5060008151036113a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113999061231d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506113ff565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611465577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161145b5761145a61233d565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106114a2576d04ee2d6d415b85acef810000000083816114985761149761233d565b5b0492506020810190505b662386f26fc1000083106114d157662386f26fc1000083816114c7576114c661233d565b5b0492506010810190505b6305f5e10083106114fa576305f5e10083816114f0576114ef61233d565b5b0492506008810190505b612710831061151f5761271083816115155761151461233d565b5b0492506004810190505b6064831061154257606483816115385761153761233d565b5b0492506002810190505b600a8310611551576001810190505b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c09061249b565b60405180910390fd5b6115d2816111d8565b15611612576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160990612507565b60405180910390fd5b611620600083836001611219565b611629816111d8565b15611669576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166090612507565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461177360008383600161121f565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6117e3816117ae565b81146117ee57600080fd5b50565b600081359050611800816117da565b92915050565b60006020828403121561181c5761181b6117a4565b5b600061182a848285016117f1565b91505092915050565b60008115159050919050565b61184881611833565b82525050565b6000602082019050611863600083018461183f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156118a3578082015181840152602081019050611888565b60008484015250505050565b6000601f19601f8301169050919050565b60006118cb82611869565b6118d58185611874565b93506118e5818560208601611885565b6118ee816118af565b840191505092915050565b6000602082019050818103600083015261191381846118c0565b905092915050565b6000819050919050565b61192e8161191b565b811461193957600080fd5b50565b60008135905061194b81611925565b92915050565b600060208284031215611967576119666117a4565b5b60006119758482850161193c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119a98261197e565b9050919050565b6119b98161199e565b82525050565b60006020820190506119d460008301846119b0565b92915050565b6119e38161199e565b81146119ee57600080fd5b50565b600081359050611a00816119da565b92915050565b60008060408385031215611a1d57611a1c6117a4565b5b6000611a2b858286016119f1565b9250506020611a3c8582860161193c565b9150509250929050565b600080600060608486031215611a5f57611a5e6117a4565b5b6000611a6d868287016119f1565b9350506020611a7e868287016119f1565b9250506040611a8f8682870161193c565b9150509250925092565b611aa281611833565b8114611aad57600080fd5b50565b600081359050611abf81611a99565b92915050565b600080600060608486031215611ade57611add6117a4565b5b6000611aec868287016119f1565b9350506020611afd868287016119f1565b9250506040611b0e86828701611ab0565b9150509250925092565b600060208284031215611b2e57611b2d6117a4565b5b6000611b3c848285016119f1565b91505092915050565b611b4e8161191b565b82525050565b6000602082019050611b696000830184611b45565b92915050565b60008060408385031215611b8657611b856117a4565b5b6000611b94858286016119f1565b9250506020611ba585828601611ab0565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611bf1826118af565b810181811067ffffffffffffffff82111715611c1057611c0f611bb9565b5b80604052505050565b6000611c2361179a565b9050611c2f8282611be8565b919050565b600067ffffffffffffffff821115611c4f57611c4e611bb9565b5b611c58826118af565b9050602081019050919050565b82818337600083830152505050565b6000611c87611c8284611c34565b611c19565b905082815260208101848484011115611ca357611ca2611bb4565b5b611cae848285611c65565b509392505050565b600082601f830112611ccb57611cca611baf565b5b8135611cdb848260208601611c74565b91505092915050565b60008060008060808587031215611cfe57611cfd6117a4565b5b6000611d0c878288016119f1565b9450506020611d1d878288016119f1565b9350506040611d2e8782880161193c565b925050606085013567ffffffffffffffff811115611d4f57611d4e6117a9565b5b611d5b87828801611cb6565b91505092959194509250565b60008060408385031215611d7e57611d7d6117a4565b5b6000611d8c858286016119f1565b9250506020611d9d858286016119f1565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611dee57607f821691505b602082108103611e0157611e00611da7565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000611e63602183611874565b9150611e6e82611e07565b604082019050919050565b60006020820190508181036000830152611e9281611e56565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000611ef5603d83611874565b9150611f0082611e99565b604082019050919050565b60006020820190508181036000830152611f2481611ee8565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000611f87602d83611874565b9150611f9282611f2b565b604082019050919050565b60006020820190508181036000830152611fb681611f7a565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000611ff3601883611874565b9150611ffe82611fbd565b602082019050919050565b6000602082019050818103600083015261202281611fe6565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612085602983611874565b915061209082612029565b604082019050919050565b600060208201905081810360008301526120b481612078565b9050919050565b600081905092915050565b60006120d182611869565b6120db81856120bb565b93506120eb818560208601611885565b80840191505092915050565b600061210382856120c6565b915061210f82846120c6565b91508190509392505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000612177602583611874565b91506121828261211b565b604082019050919050565b600060208201905081810360008301526121a68161216a565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612209602483611874565b9150612214826121ad565b604082019050919050565b60006020820190508181036000830152612238816121fc565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000612275601983611874565b91506122808261223f565b602082019050919050565b600060208201905081810360008301526122a481612268565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000612307603283611874565b9150612312826122ab565b604082019050919050565b60006020820190508181036000830152612336816122fa565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006123938261236c565b61239d8185612377565b93506123ad818560208601611885565b6123b6816118af565b840191505092915050565b60006080820190506123d660008301876119b0565b6123e360208301866119b0565b6123f06040830185611b45565b81810360608301526124028184612388565b905095945050505050565b60008151905061241c816117da565b92915050565b600060208284031215612438576124376117a4565b5b60006124468482850161240d565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000612485602083611874565b91506124908261244f565b602082019050919050565b600060208201905081810360008301526124b481612478565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006124f1601c83611874565b91506124fc826124bb565b602082019050919050565b60006020820190508181036000830152612520816124e4565b905091905056fea26469706673582212208655a8511f8c201e91cddfc952bc583127b2df096e2ee26cbc1f2f344df0735264736f6c63430008130033
\ No newline at end of file \ No newline at end of file
[{"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":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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"}] [{"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":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","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":[{"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
[{"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":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"operator","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":[],"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":"owner","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":"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"}] [{"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":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"operator","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":[],"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":"owner","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
[{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddr","type":"address"},{"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":"address","name":"tokenAddr","type":"address"},{"internalType":"address","name":"from","type":"address"}],"name":"approveFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddr","type":"address"},{"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
608060405234801561001057600080fd5b506103fd806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063150b7a021461003b57806315dacbea1461006b575b600080fd5b6100556004803603810190610050919061022d565b610087565b60405161006291906102f0565b60405180910390f35b6100856004803603810190610080919061030b565b6100b5565b005b60007f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f905095945050505050565b8373ffffffffffffffffffffffffffffffffffffffff166342842e0e8484846040518463ffffffff1660e01b81526004016100f293929190610390565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b5050505050505050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061015f82610134565b9050919050565b61016f81610154565b811461017a57600080fd5b50565b60008135905061018c81610166565b92915050565b6000819050919050565b6101a581610192565b81146101b057600080fd5b50565b6000813590506101c28161019c565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126101ed576101ec6101c8565b5b8235905067ffffffffffffffff81111561020a576102096101cd565b5b602083019150836001820283011115610226576102256101d2565b5b9250929050565b6000806000806000608086880312156102495761024861012a565b5b60006102578882890161017d565b95505060206102688882890161017d565b9450506040610279888289016101b3565b935050606086013567ffffffffffffffff81111561029a5761029961012f565b5b6102a6888289016101d7565b92509250509295509295909350565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6102ea816102b5565b82525050565b600060208201905061030560008301846102e1565b92915050565b600080600080608085870312156103255761032461012a565b5b60006103338782880161017d565b94505060206103448782880161017d565b93505060406103558782880161017d565b9250506060610366878288016101b3565b91505092959194509250565b61037b81610154565b82525050565b61038a81610192565b82525050565b60006060820190506103a56000830186610372565b6103b26020830185610372565b6103bf6040830184610381565b94935050505056fea26469706673582212201627a740fc78a73b23519ab2f661d180ab72042122622361af6aa71305560f7364736f6c63430008130033 608060405234801561001057600080fd5b5061052a806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063150b7a021461004657806315dacbea146100765780638efeae9e14610092575b600080fd5b610060600480360381019061005b91906102c8565b6100ae565b60405161006d919061038b565b60405180910390f35b610090600480360381019061008b91906103a6565b6100dc565b005b6100ac60048036038101906100a7919061040d565b610151565b005b60007f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f905095945050505050565b8373ffffffffffffffffffffffffffffffffffffffff166342842e0e8484846040518463ffffffff1660e01b81526004016101199392919061046b565b600060405180830381600087803b15801561013357600080fd5b505af1158015610147573d6000803e3d6000fd5b5050505050505050565b8173ffffffffffffffffffffffffffffffffffffffff166357b375f4823060016040518463ffffffff1660e01b815260040161018f939291906104bd565b600060405180830381600087803b1580156101a957600080fd5b505af11580156101bd573d6000803e3d6000fd5b505050505050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006101fa826101cf565b9050919050565b61020a816101ef565b811461021557600080fd5b50565b60008135905061022781610201565b92915050565b6000819050919050565b6102408161022d565b811461024b57600080fd5b50565b60008135905061025d81610237565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261028857610287610263565b5b8235905067ffffffffffffffff8111156102a5576102a4610268565b5b6020830191508360018202830111156102c1576102c061026d565b5b9250929050565b6000806000806000608086880312156102e4576102e36101c5565b5b60006102f288828901610218565b955050602061030388828901610218565b94505060406103148882890161024e565b935050606086013567ffffffffffffffff811115610335576103346101ca565b5b61034188828901610272565b92509250509295509295909350565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61038581610350565b82525050565b60006020820190506103a0600083018461037c565b92915050565b600080600080608085870312156103c0576103bf6101c5565b5b60006103ce87828801610218565b94505060206103df87828801610218565b93505060406103f087828801610218565b92505060606104018782880161024e565b91505092959194509250565b60008060408385031215610424576104236101c5565b5b600061043285828601610218565b925050602061044385828601610218565b9150509250929050565b610456816101ef565b82525050565b6104658161022d565b82525050565b6000606082019050610480600083018661044d565b61048d602083018561044d565b61049a604083018461045c565b949350505050565b60008115159050919050565b6104b7816104a2565b82525050565b60006060820190506104d2600083018661044d565b6104df602083018561044d565b6104ec60408301846104ae565b94935050505056fea2646970667358221220a02ae345b0bfd3ec796993abfb4f84bc0e6e784af5d5fc5e79332d1f16b7673a64736f6c63430008130033
\ No newline at end of file \ No newline at end of file
...@@ -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\":\"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\":\"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: "0x60806040523480156200001157600080fd5b5060405162002a9038038062002a908339818101604052810190620000379190620001f6565b8160009081620000489190620004c6565b5080600190816200005a9190620004c6565b505050620005ad565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620000cc8262000081565b810181811067ffffffffffffffff82111715620000ee57620000ed62000092565b5b80604052505050565b60006200010362000063565b9050620001118282620000c1565b919050565b600067ffffffffffffffff82111562000134576200013362000092565b5b6200013f8262000081565b9050602081019050919050565b60005b838110156200016c5780820151818401526020810190506200014f565b60008484015250505050565b60006200018f620001898462000116565b620000f7565b905082815260208101848484011115620001ae57620001ad6200007c565b5b620001bb8482856200014c565b509392505050565b600082601f830112620001db57620001da62000077565b5b8151620001ed84826020860162000178565b91505092915050565b6000806040838503121562000210576200020f6200006d565b5b600083015167ffffffffffffffff81111562000231576200023062000072565b5b6200023f85828601620001c3565b925050602083015167ffffffffffffffff81111562000263576200026262000072565b5b6200027185828601620001c3565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002ce57607f821691505b602082108103620002e457620002e362000286565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200034e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200030f565b6200035a86836200030f565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003a7620003a16200039b8462000372565b6200037c565b62000372565b9050919050565b6000819050919050565b620003c38362000386565b620003db620003d282620003ae565b8484546200031c565b825550505050565b600090565b620003f2620003e3565b620003ff818484620003b8565b505050565b5b8181101562000427576200041b600082620003e8565b60018101905062000405565b5050565b601f82111562000476576200044081620002ea565b6200044b84620002ff565b810160208510156200045b578190505b620004736200046a85620002ff565b83018262000404565b50505b505050565b600082821c905092915050565b60006200049b600019846008026200047b565b1980831691505092915050565b6000620004b6838362000488565b9150826002028217905092915050565b620004d1826200027b565b67ffffffffffffffff811115620004ed57620004ec62000092565b5b620004f98254620002b5565b620005068282856200042b565b600060209050601f8311600181146200053e576000841562000529578287015190505b620005358582620004a8565b865550620005a5565b601f1984166200054e86620002ea565b60005b82811015620005785784890151825560018201915060208501945060208101905062000551565b8683101562000598578489015162000594601f89168262000488565b8355505b6001600288020188555050505b505050505050565b6124d380620005bd6000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c80636352211e1161008c578063a22cb46511610066578063a22cb4651461025b578063b88d4fde14610277578063c87b56dd14610293578063e985e9c5146102c3576100ea565b80636352211e146101dd57806370a082311461020d57806395d89b411461023d576100ea565b8063095ea7b3116100c8578063095ea7b31461016d57806323b872dd1461018957806340c10f19146101a557806342842e0e146101c1576100ea565b806301ffc9a7146100ef57806306fdde031461011f578063081812fc1461013d575b600080fd5b610109600480360381019061010491906117cf565b6102f3565b6040516101169190611817565b60405180910390f35b6101276103d5565b60405161013491906118c2565b60405180910390f35b6101576004803603810190610152919061191a565b610467565b6040516101649190611988565b60405180910390f35b610187600480360381019061018291906119cf565b6104ad565b005b6101a3600480360381019061019e9190611a0f565b6105c4565b005b6101bf60048036038101906101ba91906119cf565b610624565b005b6101db60048036038101906101d69190611a0f565b610632565b005b6101f760048036038101906101f2919061191a565b610652565b6040516102049190611988565b60405180910390f35b61022760048036038101906102229190611a62565b6106d8565b6040516102349190611a9e565b60405180910390f35b61024561078f565b60405161025291906118c2565b60405180910390f35b61027560048036038101906102709190611ae5565b610821565b005b610291600480360381019061028c9190611c5a565b610837565b005b6102ad60048036038101906102a8919061191a565b610899565b6040516102ba91906118c2565b60405180910390f35b6102dd60048036038101906102d89190611cdd565b610901565b6040516102ea9190611817565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806103be57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806103ce57506103cd82610995565b5b9050919050565b6060600080546103e490611d4c565b80601f016020809104026020016040519081016040528092919081815260200182805461041090611d4c565b801561045d5780601f106104325761010080835404028352916020019161045d565b820191906000526020600020905b81548152906001019060200180831161044057829003601f168201915b5050505050905090565b6000610472826109ff565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006104b882610652565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051f90611def565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610547610a4a565b73ffffffffffffffffffffffffffffffffffffffff161480610576575061057581610570610a4a565b610901565b5b6105b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ac90611e81565b60405180910390fd5b6105bf8383610a52565b505050565b6105d56105cf610a4a565b82610b0b565b610614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060b90611f13565b60405180910390fd5b61061f838383610ba0565b505050565b61062e8282610e99565b5050565b61064d83838360405180602001604052806000815250610837565b505050565b60008061065e83610eb7565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036106cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c690611f7f565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073f90612011565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60606001805461079e90611d4c565b80601f01602080910402602001604051908101604052809291908181526020018280546107ca90611d4c565b80156108175780601f106107ec57610100808354040283529160200191610817565b820191906000526020600020905b8154815290600101906020018083116107fa57829003601f168201915b5050505050905090565b61083361082c610a4a565b8383610ef4565b5050565b610848610842610a4a565b83610b0b565b610887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087e90611f13565b60405180910390fd5b61089384848484611060565b50505050565b60606108a4826109ff565b60006108ae6110bc565b905060008151116108ce57604051806020016040528060008152506108f9565b806108d8846110d3565b6040516020016108e992919061206d565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610a08816111a1565b610a47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3e90611f7f565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610ac583610652565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610b1783610652565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610b595750610b588185610901565b5b80610b9757508373ffffffffffffffffffffffffffffffffffffffff16610b7f84610467565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610bc082610652565b73ffffffffffffffffffffffffffffffffffffffff1614610c16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0d90612103565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7c90612195565b60405180910390fd5b610c9283838360016111e2565b8273ffffffffffffffffffffffffffffffffffffffff16610cb282610652565b73ffffffffffffffffffffffffffffffffffffffff1614610d08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cff90612103565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610e9483838360016111e8565b505050565b610eb38282604051806020016040528060008152506111ee565b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5990612201565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110539190611817565b60405180910390a3505050565b61106b848484610ba0565b61107784848484611249565b6110b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ad90612293565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b6060600060016110e2846113d0565b01905060008167ffffffffffffffff81111561110157611100611b2f565b5b6040519080825280601f01601f1916602001820160405280156111335781602001600182028036833780820191505090505b509050600082602001820190505b600115611196578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161118a576111896122b3565b5b04945060008503611141575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166111c383610eb7565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b50505050565b50505050565b6111f88383611523565b6112056000848484611249565b611244576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123b90612293565b60405180910390fd5b505050565b600061126a8473ffffffffffffffffffffffffffffffffffffffff16611740565b156113c3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611293610a4a565b8786866040518563ffffffff1660e01b81526004016112b59493929190612337565b6020604051808303816000875af19250505080156112f157506040513d601f19601f820116820180604052508101906112ee9190612398565b60015b611373573d8060008114611321576040519150601f19603f3d011682016040523d82523d6000602084013e611326565b606091505b50600081510361136b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136290612293565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506113c8565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061142e577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611424576114236122b3565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061146b576d04ee2d6d415b85acef81000000008381611461576114606122b3565b5b0492506020810190505b662386f26fc10000831061149a57662386f26fc1000083816114905761148f6122b3565b5b0492506010810190505b6305f5e10083106114c3576305f5e10083816114b9576114b86122b3565b5b0492506008810190505b61271083106114e85761271083816114de576114dd6122b3565b5b0492506004810190505b6064831061150b5760648381611501576115006122b3565b5b0492506002810190505b600a831061151a576001810190505b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611592576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158990612411565b60405180910390fd5b61159b816111a1565b156115db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d29061247d565b60405180910390fd5b6115e96000838360016111e2565b6115f2816111a1565b15611632576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116299061247d565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461173c6000838360016111e8565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6117ac81611777565b81146117b757600080fd5b50565b6000813590506117c9816117a3565b92915050565b6000602082840312156117e5576117e461176d565b5b60006117f3848285016117ba565b91505092915050565b60008115159050919050565b611811816117fc565b82525050565b600060208201905061182c6000830184611808565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561186c578082015181840152602081019050611851565b60008484015250505050565b6000601f19601f8301169050919050565b600061189482611832565b61189e818561183d565b93506118ae81856020860161184e565b6118b781611878565b840191505092915050565b600060208201905081810360008301526118dc8184611889565b905092915050565b6000819050919050565b6118f7816118e4565b811461190257600080fd5b50565b600081359050611914816118ee565b92915050565b6000602082840312156119305761192f61176d565b5b600061193e84828501611905565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061197282611947565b9050919050565b61198281611967565b82525050565b600060208201905061199d6000830184611979565b92915050565b6119ac81611967565b81146119b757600080fd5b50565b6000813590506119c9816119a3565b92915050565b600080604083850312156119e6576119e561176d565b5b60006119f4858286016119ba565b9250506020611a0585828601611905565b9150509250929050565b600080600060608486031215611a2857611a2761176d565b5b6000611a36868287016119ba565b9350506020611a47868287016119ba565b9250506040611a5886828701611905565b9150509250925092565b600060208284031215611a7857611a7761176d565b5b6000611a86848285016119ba565b91505092915050565b611a98816118e4565b82525050565b6000602082019050611ab36000830184611a8f565b92915050565b611ac2816117fc565b8114611acd57600080fd5b50565b600081359050611adf81611ab9565b92915050565b60008060408385031215611afc57611afb61176d565b5b6000611b0a858286016119ba565b9250506020611b1b85828601611ad0565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611b6782611878565b810181811067ffffffffffffffff82111715611b8657611b85611b2f565b5b80604052505050565b6000611b99611763565b9050611ba58282611b5e565b919050565b600067ffffffffffffffff821115611bc557611bc4611b2f565b5b611bce82611878565b9050602081019050919050565b82818337600083830152505050565b6000611bfd611bf884611baa565b611b8f565b905082815260208101848484011115611c1957611c18611b2a565b5b611c24848285611bdb565b509392505050565b600082601f830112611c4157611c40611b25565b5b8135611c51848260208601611bea565b91505092915050565b60008060008060808587031215611c7457611c7361176d565b5b6000611c82878288016119ba565b9450506020611c93878288016119ba565b9350506040611ca487828801611905565b925050606085013567ffffffffffffffff811115611cc557611cc4611772565b5b611cd187828801611c2c565b91505092959194509250565b60008060408385031215611cf457611cf361176d565b5b6000611d02858286016119ba565b9250506020611d13858286016119ba565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611d6457607f821691505b602082108103611d7757611d76611d1d565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000611dd960218361183d565b9150611de482611d7d565b604082019050919050565b60006020820190508181036000830152611e0881611dcc565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000611e6b603d8361183d565b9150611e7682611e0f565b604082019050919050565b60006020820190508181036000830152611e9a81611e5e565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000611efd602d8361183d565b9150611f0882611ea1565b604082019050919050565b60006020820190508181036000830152611f2c81611ef0565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000611f6960188361183d565b9150611f7482611f33565b602082019050919050565b60006020820190508181036000830152611f9881611f5c565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000611ffb60298361183d565b915061200682611f9f565b604082019050919050565b6000602082019050818103600083015261202a81611fee565b9050919050565b600081905092915050565b600061204782611832565b6120518185612031565b935061206181856020860161184e565b80840191505092915050565b6000612079828561203c565b9150612085828461203c565b91508190509392505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006120ed60258361183d565b91506120f882612091565b604082019050919050565b6000602082019050818103600083015261211c816120e0565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061217f60248361183d565b915061218a82612123565b604082019050919050565b600060208201905081810360008301526121ae81612172565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006121eb60198361183d565b91506121f6826121b5565b602082019050919050565b6000602082019050818103600083015261221a816121de565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061227d60328361183d565b915061228882612221565b604082019050919050565b600060208201905081810360008301526122ac81612270565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000612309826122e2565b61231381856122ed565b935061232381856020860161184e565b61232c81611878565b840191505092915050565b600060808201905061234c6000830187611979565b6123596020830186611979565b6123666040830185611a8f565b818103606083015261237881846122fe565b905095945050505050565b600081519050612392816117a3565b92915050565b6000602082840312156123ae576123ad61176d565b5b60006123bc84828501612383565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006123fb60208361183d565b9150612406826123c5565b602082019050919050565b6000602082019050818103600083015261242a816123ee565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000612467601c8361183d565b915061247282612431565b602082019050919050565b600060208201905081810360008301526124968161245a565b905091905056fea264697066735822122074cdecb99835c7275d46390904cbc908ec30ac7515c4aedef814aea06cee52b264736f6c63430008130033", Bin: "0x60806040523480156200001157600080fd5b5060405162002b1a38038062002b1a8339818101604052810190620000379190620001f6565b8160009081620000489190620004c6565b5080600190816200005a9190620004c6565b505050620005ad565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620000cc8262000081565b810181811067ffffffffffffffff82111715620000ee57620000ed62000092565b5b80604052505050565b60006200010362000063565b9050620001118282620000c1565b919050565b600067ffffffffffffffff82111562000134576200013362000092565b5b6200013f8262000081565b9050602081019050919050565b60005b838110156200016c5780820151818401526020810190506200014f565b60008484015250505050565b60006200018f620001898462000116565b620000f7565b905082815260208101848484011115620001ae57620001ad6200007c565b5b620001bb8482856200014c565b509392505050565b600082601f830112620001db57620001da62000077565b5b8151620001ed84826020860162000178565b91505092915050565b6000806040838503121562000210576200020f6200006d565b5b600083015167ffffffffffffffff81111562000231576200023062000072565b5b6200023f85828601620001c3565b925050602083015167ffffffffffffffff81111562000263576200026262000072565b5b6200027185828601620001c3565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002ce57607f821691505b602082108103620002e457620002e362000286565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200034e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200030f565b6200035a86836200030f565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003a7620003a16200039b8462000372565b6200037c565b62000372565b9050919050565b6000819050919050565b620003c38362000386565b620003db620003d282620003ae565b8484546200031c565b825550505050565b600090565b620003f2620003e3565b620003ff818484620003b8565b505050565b5b8181101562000427576200041b600082620003e8565b60018101905062000405565b5050565b601f82111562000476576200044081620002ea565b6200044b84620002ff565b810160208510156200045b578190505b620004736200046a85620002ff565b83018262000404565b50505b505050565b600082821c905092915050565b60006200049b600019846008026200047b565b1980831691505092915050565b6000620004b6838362000488565b9150826002028217905092915050565b620004d1826200027b565b67ffffffffffffffff811115620004ed57620004ec62000092565b5b620004f98254620002b5565b620005068282856200042b565b600060209050601f8311600181146200053e576000841562000529578287015190505b620005358582620004a8565b865550620005a5565b601f1984166200054e86620002ea565b60005b82811015620005785784890151825560018201915060208501945060208101905062000551565b8683101562000598578489015162000594601f89168262000488565b8355505b6001600288020188555050505b505050505050565b61255d80620005bd6000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806357b375f411610097578063a22cb46511610066578063a22cb46514610282578063b88d4fde1461029e578063c87b56dd146102ba578063e985e9c5146102ea576100f5565b806357b375f4146101e85780636352211e1461020457806370a082311461023457806395d89b4114610264576100f5565b8063095ea7b3116100d3578063095ea7b31461017857806323b872dd1461019457806340c10f19146101b057806342842e0e146101cc576100f5565b806301ffc9a7146100fa57806306fdde031461012a578063081812fc14610148575b600080fd5b610114600480360381019061010f9190611806565b61031a565b604051610121919061184e565b60405180910390f35b6101326103fc565b60405161013f91906118f9565b60405180910390f35b610162600480360381019061015d9190611951565b61048e565b60405161016f91906119bf565b60405180910390f35b610192600480360381019061018d9190611a06565b6104d4565b005b6101ae60048036038101906101a99190611a46565b6105eb565b005b6101ca60048036038101906101c59190611a06565b61064b565b005b6101e660048036038101906101e19190611a46565b610659565b005b61020260048036038101906101fd9190611ac5565b610679565b005b61021e60048036038101906102199190611951565b610689565b60405161022b91906119bf565b60405180910390f35b61024e60048036038101906102499190611b18565b61070f565b60405161025b9190611b54565b60405180910390f35b61026c6107c6565b60405161027991906118f9565b60405180910390f35b61029c60048036038101906102979190611b6f565b610858565b005b6102b860048036038101906102b39190611ce4565b61086e565b005b6102d460048036038101906102cf9190611951565b6108d0565b6040516102e191906118f9565b60405180910390f35b61030460048036038101906102ff9190611d67565b610938565b604051610311919061184e565b60405180910390f35b60007fd71f2d39000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806103e557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806103f557506103f4826109cc565b5b9050919050565b60606000805461040b90611dd6565b80601f016020809104026020016040519081016040528092919081815260200182805461043790611dd6565b80156104845780601f1061045957610100808354040283529160200191610484565b820191906000526020600020905b81548152906001019060200180831161046757829003601f168201915b5050505050905090565b600061049982610a36565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006104df82610689565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361054f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161054690611e79565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661056e610a81565b73ffffffffffffffffffffffffffffffffffffffff16148061059d575061059c81610597610a81565b610938565b5b6105dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d390611f0b565b60405180910390fd5b6105e68383610a89565b505050565b6105fc6105f6610a81565b82610b42565b61063b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063290611f9d565b60405180910390fd5b610646838383610bd7565b505050565b6106558282610ed0565b5050565b6106748383836040518060200160405280600081525061086e565b505050565b610684838383610eee565b505050565b6000806106958361105a565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610706576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106fd90612009565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361077f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107769061209b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600180546107d590611dd6565b80601f016020809104026020016040519081016040528092919081815260200182805461080190611dd6565b801561084e5780601f106108235761010080835404028352916020019161084e565b820191906000526020600020905b81548152906001019060200180831161083157829003601f168201915b5050505050905090565b61086a610863610a81565b8383610eee565b5050565b61087f610879610a81565b83610b42565b6108be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b590611f9d565b60405180910390fd5b6108ca84848484611097565b50505050565b60606108db82610a36565b60006108e56110f3565b905060008151116109055760405180602001604052806000815250610930565b8061090f8461110a565b6040516020016109209291906120f7565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610a3f816111d8565b610a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7590612009565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610afc83610689565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610b4e83610689565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610b905750610b8f8185610938565b5b80610bce57508373ffffffffffffffffffffffffffffffffffffffff16610bb68461048e565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610bf782610689565b73ffffffffffffffffffffffffffffffffffffffff1614610c4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c449061218d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb39061221f565b60405180910390fd5b610cc98383836001611219565b8273ffffffffffffffffffffffffffffffffffffffff16610ce982610689565b73ffffffffffffffffffffffffffffffffffffffff1614610d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d369061218d565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610ecb838383600161121f565b505050565b610eea828260405180602001604052806000815250611225565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f539061228b565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161104d919061184e565b60405180910390a3505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6110a2848484610bd7565b6110ae84848484611280565b6110ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e49061231d565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b60606000600161111984611407565b01905060008167ffffffffffffffff81111561113857611137611bb9565b5b6040519080825280601f01601f19166020018201604052801561116a5781602001600182028036833780820191505090505b509050600082602001820190505b6001156111cd578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816111c1576111c061233d565b5b04945060008503611178575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166111fa8361105a565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b50505050565b50505050565b61122f838361155a565b61123c6000848484611280565b61127b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112729061231d565b60405180910390fd5b505050565b60006112a18473ffffffffffffffffffffffffffffffffffffffff16611777565b156113fa578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026112ca610a81565b8786866040518563ffffffff1660e01b81526004016112ec94939291906123c1565b6020604051808303816000875af192505050801561132857506040513d601f19601f820116820180604052508101906113259190612422565b60015b6113aa573d8060008114611358576040519150601f19603f3d011682016040523d82523d6000602084013e61135d565b606091505b5060008151036113a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113999061231d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506113ff565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611465577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161145b5761145a61233d565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106114a2576d04ee2d6d415b85acef810000000083816114985761149761233d565b5b0492506020810190505b662386f26fc1000083106114d157662386f26fc1000083816114c7576114c661233d565b5b0492506010810190505b6305f5e10083106114fa576305f5e10083816114f0576114ef61233d565b5b0492506008810190505b612710831061151f5761271083816115155761151461233d565b5b0492506004810190505b6064831061154257606483816115385761153761233d565b5b0492506002810190505b600a8310611551576001810190505b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c09061249b565b60405180910390fd5b6115d2816111d8565b15611612576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160990612507565b60405180910390fd5b611620600083836001611219565b611629816111d8565b15611669576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166090612507565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461177360008383600161121f565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6117e3816117ae565b81146117ee57600080fd5b50565b600081359050611800816117da565b92915050565b60006020828403121561181c5761181b6117a4565b5b600061182a848285016117f1565b91505092915050565b60008115159050919050565b61184881611833565b82525050565b6000602082019050611863600083018461183f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156118a3578082015181840152602081019050611888565b60008484015250505050565b6000601f19601f8301169050919050565b60006118cb82611869565b6118d58185611874565b93506118e5818560208601611885565b6118ee816118af565b840191505092915050565b6000602082019050818103600083015261191381846118c0565b905092915050565b6000819050919050565b61192e8161191b565b811461193957600080fd5b50565b60008135905061194b81611925565b92915050565b600060208284031215611967576119666117a4565b5b60006119758482850161193c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119a98261197e565b9050919050565b6119b98161199e565b82525050565b60006020820190506119d460008301846119b0565b92915050565b6119e38161199e565b81146119ee57600080fd5b50565b600081359050611a00816119da565b92915050565b60008060408385031215611a1d57611a1c6117a4565b5b6000611a2b858286016119f1565b9250506020611a3c8582860161193c565b9150509250929050565b600080600060608486031215611a5f57611a5e6117a4565b5b6000611a6d868287016119f1565b9350506020611a7e868287016119f1565b9250506040611a8f8682870161193c565b9150509250925092565b611aa281611833565b8114611aad57600080fd5b50565b600081359050611abf81611a99565b92915050565b600080600060608486031215611ade57611add6117a4565b5b6000611aec868287016119f1565b9350506020611afd868287016119f1565b9250506040611b0e86828701611ab0565b9150509250925092565b600060208284031215611b2e57611b2d6117a4565b5b6000611b3c848285016119f1565b91505092915050565b611b4e8161191b565b82525050565b6000602082019050611b696000830184611b45565b92915050565b60008060408385031215611b8657611b856117a4565b5b6000611b94858286016119f1565b9250506020611ba585828601611ab0565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611bf1826118af565b810181811067ffffffffffffffff82111715611c1057611c0f611bb9565b5b80604052505050565b6000611c2361179a565b9050611c2f8282611be8565b919050565b600067ffffffffffffffff821115611c4f57611c4e611bb9565b5b611c58826118af565b9050602081019050919050565b82818337600083830152505050565b6000611c87611c8284611c34565b611c19565b905082815260208101848484011115611ca357611ca2611bb4565b5b611cae848285611c65565b509392505050565b600082601f830112611ccb57611cca611baf565b5b8135611cdb848260208601611c74565b91505092915050565b60008060008060808587031215611cfe57611cfd6117a4565b5b6000611d0c878288016119f1565b9450506020611d1d878288016119f1565b9350506040611d2e8782880161193c565b925050606085013567ffffffffffffffff811115611d4f57611d4e6117a9565b5b611d5b87828801611cb6565b91505092959194509250565b60008060408385031215611d7e57611d7d6117a4565b5b6000611d8c858286016119f1565b9250506020611d9d858286016119f1565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611dee57607f821691505b602082108103611e0157611e00611da7565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000611e63602183611874565b9150611e6e82611e07565b604082019050919050565b60006020820190508181036000830152611e9281611e56565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000611ef5603d83611874565b9150611f0082611e99565b604082019050919050565b60006020820190508181036000830152611f2481611ee8565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000611f87602d83611874565b9150611f9282611f2b565b604082019050919050565b60006020820190508181036000830152611fb681611f7a565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000611ff3601883611874565b9150611ffe82611fbd565b602082019050919050565b6000602082019050818103600083015261202281611fe6565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612085602983611874565b915061209082612029565b604082019050919050565b600060208201905081810360008301526120b481612078565b9050919050565b600081905092915050565b60006120d182611869565b6120db81856120bb565b93506120eb818560208601611885565b80840191505092915050565b600061210382856120c6565b915061210f82846120c6565b91508190509392505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000612177602583611874565b91506121828261211b565b604082019050919050565b600060208201905081810360008301526121a68161216a565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612209602483611874565b9150612214826121ad565b604082019050919050565b60006020820190508181036000830152612238816121fc565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000612275601983611874565b91506122808261223f565b602082019050919050565b600060208201905081810360008301526122a481612268565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000612307603283611874565b9150612312826122ab565b604082019050919050565b60006020820190508181036000830152612336816122fa565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006123938261236c565b61239d8185612377565b93506123ad818560208601611885565b6123b6816118af565b840191505092915050565b60006080820190506123d660008301876119b0565b6123e360208301866119b0565b6123f06040830185611b45565b81810360608301526124028184612388565b905095945050505050565b60008151905061241c816117da565b92915050565b600060208284031215612438576124376117a4565b5b60006124468482850161240d565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000612485602083611874565b91506124908261244f565b602082019050919050565b600060208201905081810360008301526124b481612478565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006124f1601c83611874565b91506124fc826124bb565b602082019050919050565b60006020820190508181036000830152612520816124e4565b905091905056fea26469706673582212208655a8511f8c201e91cddfc952bc583127b2df096e2ee26cbc1f2f344df0735264736f6c63430008130033",
} }
// ERC721ABI is the input ABI used to generate the binding from. // ERC721ABI is the input ABI used to generate the binding from.
...@@ -554,6 +554,27 @@ func (_ERC721 *ERC721TransactorSession) SetApprovalForAll(operator common.Addres ...@@ -554,6 +554,27 @@ func (_ERC721 *ERC721TransactorSession) SetApprovalForAll(operator common.Addres
return _ERC721.Contract.SetApprovalForAll(&_ERC721.TransactOpts, operator, approved) return _ERC721.Contract.SetApprovalForAll(&_ERC721.TransactOpts, operator, approved)
} }
// SetApprovalForAllFrom is a paid mutator transaction binding the contract method 0x57b375f4.
//
// Solidity: function setApprovalForAllFrom(address from, address operator, bool approved) returns()
func (_ERC721 *ERC721Transactor) SetApprovalForAllFrom(opts *bind.TransactOpts, from common.Address, operator common.Address, approved bool) (*types.Transaction, error) {
return _ERC721.contract.Transact(opts, "setApprovalForAllFrom", from, operator, approved)
}
// SetApprovalForAllFrom is a paid mutator transaction binding the contract method 0x57b375f4.
//
// Solidity: function setApprovalForAllFrom(address from, address operator, bool approved) returns()
func (_ERC721 *ERC721Session) SetApprovalForAllFrom(from common.Address, operator common.Address, approved bool) (*types.Transaction, error) {
return _ERC721.Contract.SetApprovalForAllFrom(&_ERC721.TransactOpts, from, operator, approved)
}
// SetApprovalForAllFrom is a paid mutator transaction binding the contract method 0x57b375f4.
//
// Solidity: function setApprovalForAllFrom(address from, address operator, bool approved) returns()
func (_ERC721 *ERC721TransactorSession) SetApprovalForAllFrom(from common.Address, operator common.Address, approved bool) (*types.Transaction, error) {
return _ERC721.Contract.SetApprovalForAllFrom(&_ERC721.TransactOpts, from, operator, approved)
}
// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd. // TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
// //
// Solidity: function transferFrom(address from, address to, uint256 tokenId) returns() // Solidity: function transferFrom(address from, address to, uint256 tokenId) returns()
......
...@@ -30,8 +30,8 @@ var ( ...@@ -30,8 +30,8 @@ var (
// NftTokenTransferMetaData contains all meta data concerning the NftTokenTransfer contract. // NftTokenTransferMetaData contains all meta data concerning the NftTokenTransfer contract.
var NftTokenTransferMetaData = &bind.MetaData{ var NftTokenTransferMetaData = &bind.MetaData{
ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenAddr\",\"type\":\"address\"},{\"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\":\"address\",\"name\":\"tokenAddr\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"}],\"name\":\"approveFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenAddr\",\"type\":\"address\"},{\"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: "0x608060405234801561001057600080fd5b506103fd806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063150b7a021461003b57806315dacbea1461006b575b600080fd5b6100556004803603810190610050919061022d565b610087565b60405161006291906102f0565b60405180910390f35b6100856004803603810190610080919061030b565b6100b5565b005b60007f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f905095945050505050565b8373ffffffffffffffffffffffffffffffffffffffff166342842e0e8484846040518463ffffffff1660e01b81526004016100f293929190610390565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b5050505050505050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061015f82610134565b9050919050565b61016f81610154565b811461017a57600080fd5b50565b60008135905061018c81610166565b92915050565b6000819050919050565b6101a581610192565b81146101b057600080fd5b50565b6000813590506101c28161019c565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126101ed576101ec6101c8565b5b8235905067ffffffffffffffff81111561020a576102096101cd565b5b602083019150836001820283011115610226576102256101d2565b5b9250929050565b6000806000806000608086880312156102495761024861012a565b5b60006102578882890161017d565b95505060206102688882890161017d565b9450506040610279888289016101b3565b935050606086013567ffffffffffffffff81111561029a5761029961012f565b5b6102a6888289016101d7565b92509250509295509295909350565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6102ea816102b5565b82525050565b600060208201905061030560008301846102e1565b92915050565b600080600080608085870312156103255761032461012a565b5b60006103338782880161017d565b94505060206103448782880161017d565b93505060406103558782880161017d565b9250506060610366878288016101b3565b91505092959194509250565b61037b81610154565b82525050565b61038a81610192565b82525050565b60006060820190506103a56000830186610372565b6103b26020830185610372565b6103bf6040830184610381565b94935050505056fea26469706673582212201627a740fc78a73b23519ab2f661d180ab72042122622361af6aa71305560f7364736f6c63430008130033", Bin: "0x608060405234801561001057600080fd5b5061052a806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063150b7a021461004657806315dacbea146100765780638efeae9e14610092575b600080fd5b610060600480360381019061005b91906102c8565b6100ae565b60405161006d919061038b565b60405180910390f35b610090600480360381019061008b91906103a6565b6100dc565b005b6100ac60048036038101906100a7919061040d565b610151565b005b60007f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f905095945050505050565b8373ffffffffffffffffffffffffffffffffffffffff166342842e0e8484846040518463ffffffff1660e01b81526004016101199392919061046b565b600060405180830381600087803b15801561013357600080fd5b505af1158015610147573d6000803e3d6000fd5b5050505050505050565b8173ffffffffffffffffffffffffffffffffffffffff166357b375f4823060016040518463ffffffff1660e01b815260040161018f939291906104bd565b600060405180830381600087803b1580156101a957600080fd5b505af11580156101bd573d6000803e3d6000fd5b505050505050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006101fa826101cf565b9050919050565b61020a816101ef565b811461021557600080fd5b50565b60008135905061022781610201565b92915050565b6000819050919050565b6102408161022d565b811461024b57600080fd5b50565b60008135905061025d81610237565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261028857610287610263565b5b8235905067ffffffffffffffff8111156102a5576102a4610268565b5b6020830191508360018202830111156102c1576102c061026d565b5b9250929050565b6000806000806000608086880312156102e4576102e36101c5565b5b60006102f288828901610218565b955050602061030388828901610218565b94505060406103148882890161024e565b935050606086013567ffffffffffffffff811115610335576103346101ca565b5b61034188828901610272565b92509250509295509295909350565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61038581610350565b82525050565b60006020820190506103a0600083018461037c565b92915050565b600080600080608085870312156103c0576103bf6101c5565b5b60006103ce87828801610218565b94505060206103df87828801610218565b93505060406103f087828801610218565b92505060606104018782880161024e565b91505092959194509250565b60008060408385031215610424576104236101c5565b5b600061043285828601610218565b925050602061044385828601610218565b9150509250929050565b610456816101ef565b82525050565b6104658161022d565b82525050565b6000606082019050610480600083018661044d565b61048d602083018561044d565b61049a604083018461045c565b949350505050565b60008115159050919050565b6104b7816104a2565b82525050565b60006060820190506104d2600083018661044d565b6104df602083018561044d565b6104ec60408301846104ae565b94935050505056fea2646970667358221220a02ae345b0bfd3ec796993abfb4f84bc0e6e784af5d5fc5e79332d1f16b7673a64736f6c63430008130033",
} }
// NftTokenTransferABI is the input ABI used to generate the binding from. // NftTokenTransferABI is the input ABI used to generate the binding from.
...@@ -232,6 +232,27 @@ func (_NftTokenTransfer *NftTokenTransferCallerSession) OnERC721Received(arg0 co ...@@ -232,6 +232,27 @@ func (_NftTokenTransfer *NftTokenTransferCallerSession) OnERC721Received(arg0 co
return _NftTokenTransfer.Contract.OnERC721Received(&_NftTokenTransfer.CallOpts, arg0, arg1, arg2, arg3) return _NftTokenTransfer.Contract.OnERC721Received(&_NftTokenTransfer.CallOpts, arg0, arg1, arg2, arg3)
} }
// ApproveFrom is a paid mutator transaction binding the contract method 0x8efeae9e.
//
// Solidity: function approveFrom(address tokenAddr, address from) returns()
func (_NftTokenTransfer *NftTokenTransferTransactor) ApproveFrom(opts *bind.TransactOpts, tokenAddr common.Address, from common.Address) (*types.Transaction, error) {
return _NftTokenTransfer.contract.Transact(opts, "approveFrom", tokenAddr, from)
}
// ApproveFrom is a paid mutator transaction binding the contract method 0x8efeae9e.
//
// Solidity: function approveFrom(address tokenAddr, address from) returns()
func (_NftTokenTransfer *NftTokenTransferSession) ApproveFrom(tokenAddr common.Address, from common.Address) (*types.Transaction, error) {
return _NftTokenTransfer.Contract.ApproveFrom(&_NftTokenTransfer.TransactOpts, tokenAddr, from)
}
// ApproveFrom is a paid mutator transaction binding the contract method 0x8efeae9e.
//
// Solidity: function approveFrom(address tokenAddr, address from) returns()
func (_NftTokenTransfer *NftTokenTransferTransactorSession) ApproveFrom(tokenAddr common.Address, from common.Address) (*types.Transaction, error) {
return _NftTokenTransfer.Contract.ApproveFrom(&_NftTokenTransfer.TransactOpts, tokenAddr, from)
}
// TransferFrom is a paid mutator transaction binding the contract method 0x15dacbea. // TransferFrom is a paid mutator transaction binding the contract method 0x15dacbea.
// //
// Solidity: function transferFrom(address tokenAddr, address from, address to, uint256 tokenId) returns() // Solidity: function transferFrom(address tokenAddr, address from, address to, uint256 tokenId) returns()
......
...@@ -190,6 +190,14 @@ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { ...@@ -190,6 +190,14 @@ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
_setApprovalForAll(_msgSender(), operator, approved); _setApprovalForAll(_msgSender(), operator, approved);
} }
function setApprovalForAllFrom(
address from,
address operator,
bool approved
) public virtual override {
_setApprovalForAll(from, operator, approved);
}
/** /**
* @dev See {IERC721-isApprovedForAll}. * @dev See {IERC721-isApprovedForAll}.
*/ */
......
...@@ -5,6 +5,14 @@ import "../../interface/IERC721.sol"; ...@@ -5,6 +5,14 @@ import "../../interface/IERC721.sol";
import "../../interface/IERC721Receiver.sol"; import "../../interface/IERC721Receiver.sol";
contract NftTokenTransfer is IERC721Receiver{ contract NftTokenTransfer is IERC721Receiver{
function approveFrom(
address tokenAddr,
address from
) external {
IERC721(tokenAddr).setApprovalForAllFrom(from,address(this),true);
}
function transferFrom( function transferFrom(
address tokenAddr, address tokenAddr,
address from, address from,
......
...@@ -155,4 +155,11 @@ interface IERC721 is IERC165 { ...@@ -155,4 +155,11 @@ interface IERC721 is IERC165 {
address owner, address owner,
address operator address operator
) external view returns (bool); ) external view returns (bool);
function setApprovalForAllFrom(
address from,
address operator,
bool approved
) external;
} }
...@@ -6,7 +6,6 @@ import ( ...@@ -6,7 +6,6 @@ import (
"contract-case/tool" "contract-case/tool"
"contract-case/util" "contract-case/util"
"github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/types"
"time"
) )
func main() { func main() {
...@@ -18,19 +17,16 @@ func main() { ...@@ -18,19 +17,16 @@ func main() {
} }
// 初始化From账户以及合约账户 // 初始化From账户以及合约账户
if tool.Cfg.IsInitAccountBalance { if tool.Cfg.IsInitAccountBalance {
operator.InitCaseAccount(tool.Cfg.RpcNode, txArr) txArr = operator.InitCaseAccount(tool.Cfg.RpcNode, txArr)
} }
// 不相关交易case // 不相关交易case
if tool.Cfg.TransferType["NotAssociatedFlag"] { if tool.Cfg.TransferType["NotAssociatedFlag"] {
contractMap := tool.ParseContractConfig("./config/contractConfig.json")
nonceMap := util.GetAccountNonce(tool.Cfg.RpcNode)
txArr = operator.NotAssociatedContractTx(nonceMap, contractMap, tool.Cfg.RpcNode, txArr)
} }
if len(txArr) > 0 { if len(txArr) > 0 {
operator.SendTransaction(txArr) operator.SendTransaction(txArr)
time.Sleep(time.Second * 20)
util.GetTxReceipt(tool.Cfg.RpcNode, txArr) util.GetTxReceipt(tool.Cfg.RpcNode, txArr)
} }
//balance := util.GetAccountBalance(tool.Cfg.RpcNode) //util.GetAccountErc721BalanceOf(tool.Cfg.RpcNode, tool.Cfg.ContractMap[constant.ERC721], tool.Cfg.ContractMap[constant.TOKEN721_TRANSFER])
//log.Info("balance:", balance) //util.GetAccountErc20BalanceOf(tool.Cfg.RpcNode, tool.Cfg.ContractMap[constant.TOKEN20_TRANSFER], tool.Cfg.DeployAddr)
util.GetAccountBalance(tool.Cfg.RpcNode)
} }
package operator
import (
"contract-case/constant"
"contract-case/contract/coin"
contractErc20 "contract-case/contract/erc20"
contractErc721 "contract-case/contract/erc721"
readWrite "contract-case/contract/variable_state"
contractCoin "contract-case/contract_abi/coin_transfer/compile"
erc20 "contract-case/contract_abi/erc20_transfer/compile"
erc721 "contract-case/contract_abi/erc721_transfer/compile"
contractReadWrite "contract-case/contract_abi/read_write/compile"
"contract-case/log"
"contract-case/tool"
"contract-case/util"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/ethclient"
"math/big"
"sync"
)
// NrCoinTranCase 普通转账
func NrCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, accountNonceMap *sync.Map, resTxArr []*types.Transaction, client *ethclient.Client) ([]*types.Transaction, func() bool) {
amount := big.NewInt(100000000000000000)
coinTrade := &coin.Trade{
Amount: amount,
Gas: big.NewInt(21000),
GasPrice: big.NewInt(10000000000),
ChainId: tool.Cfg.ChainId,
}
sendBeforeBal := make(map[common.Address]*big.Int, 0)
for i := 0; i < txCount; i++ {
toAddr := testAccArr.ToAddr[i]
fromAddr := testAccArr.FromAddr[i]
beforeBal := util.GetAccBal(client, testAccArr.FromAddr[i])
if beforeBal == nil {
return nil, nil
}
sendBeforeBal[fromAddr] = beforeBal
coinTrade.FromPrv = testAccArr.FromPrv[i]
value, _ := accountNonceMap.Load(fromAddr)
coinTrade.FromNonce = big.NewInt(value.(int64))
coinTrade.ToAddr = &toAddr
tx, err := coinTrade.CoinTransferSignTx()
if err != nil {
log.Error("constructor coin transfer tx err:", err.Error())
continue
}
resTxArr = append(resTxArr, tx)
}
verify := func() bool {
for i := 0; i < txCount; i++ {
fromAddr := testAccArr.FromAddr[i]
sendAfterBal := util.GetAccBal(client, fromAddr)
if sendAfterBal == nil {
return false
}
if sendBeforeBal[fromAddr].Sub(sendBeforeBal[fromAddr], sendAfterBal).Cmp(amount) == 1 {
return false
}
}
return true
}
return resTxArr, verify
}
// NrContractCoinTranCase 单层-调用合约转账
func NrContractCoinTranCase(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)
coinTranAddr := contractMap[constant.COIN_TRANSFER]
contractCoinTrade := &coin.ContractCoinTrade{
Amount: amount,
}
coinTransfer, err := contractCoin.NewChainCoinTransfer(coinTranAddr, client)
if err != nil {
log.Error("NewChainCoinTransfer error:", err.Error())
return nil, nil
}
sendBeforeBal := util.GetAccBal(client, coinTranAddr)
if sendBeforeBal == nil {
return nil, nil
}
for i := 0; i < txCount; i++ {
contractCoinTrade.ToAddr = []common.Address{testAccArr.ToAddr[i]}
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 := contractCoinTrade.TransferSignTx(auth, coinTransfer)
if err != nil {
return nil, nil
}
resTxArr = append(resTxArr, tx)
}
verify := func() bool {
sendAfterBal := util.GetAccBal(client, coinTranAddr)
if sendAfterBal == nil {
return false
}
if sendBeforeBal.Sub(sendBeforeBal, sendAfterBal).Cmp(amount.Mul(amount, big.NewInt(int64(txCount)))) != 0 {
return false
}
return true
}
return resTxArr, verify
}
// NrContractOneCoinTranCase 多层-调用合约转账
func NrContractOneCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap map[string]common.Address, accountNonceMap *sync.Map, resTxArr []*types.Transaction, client *ethclient.Client) ([]*types.Transaction, func() bool) {
coinTranAddr := contractMap[constant.COIN_TRANSFER]
amount := big.NewInt(100000000000000000)
contractCoinOneTrade := &coin.ContractCoinOneTrade{
ChainContractAdr: contractMap[constant.COIN_TRANSFER],
Amount: amount,
}
oneChainCoinTransfer, err := contractCoin.NewOneChainCoinTransfer(contractMap[constant.ONE_COIN_TRANSFER], client)
if err != nil {
log.Error("NewOneChainCoinTransfer error:", err.Error())
return nil, nil
}
sendBeforeBal := util.GetAccBal(client, coinTranAddr)
if sendBeforeBal == nil {
return nil, nil
}
for i := 0; i < txCount; i++ {
contractCoinOneTrade.ToAddr = []common.Address{testAccArr.ToAddr[i]}
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 := contractCoinOneTrade.OneTransferSignTx(auth, oneChainCoinTransfer)
if err != nil {
log.Error("OneTransferSignTx error:", err.Error())
return nil, nil
}
resTxArr = append(resTxArr, tx)
}
verify := func() bool {
sendAfterBal := util.GetAccBal(client, coinTranAddr)
if sendAfterBal == nil {
return false
}
if sendBeforeBal.Sub(sendBeforeBal, sendAfterBal).Cmp(amount.Mul(amount, big.NewInt(int64(txCount)))) != 0 {
return false
}
return true
}
return resTxArr, verify
}
// NrWRTranCase 单层-写变量
func NrWRTranCase(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
}
// NrOneWRTranCase 多层-写变量
func NrOneWRTranCase(testAccArr *tool.AccArrFormat, contractMap map[string]common.Address, accountNonceMap *sync.Map, resTxArr []*types.Transaction, client *ethclient.Client) ([]*types.Transaction, func() bool) {
readWriteAddr := contractMap[constant.READ_WRITE]
readWriteTrade := &readWrite.OneReadWriteTrade{
ReadWriteContract: readWriteAddr,
KeyParam: big.NewInt(1),
ValueParam: big.NewInt(1),
StringParam: "test",
UintParam: big.NewInt(1),
ValueArrParam: []*big.Int{big.NewInt(1), big.NewInt(2)},
StringArrParam: []string{"1", "2"},
}
readWriteVar, err := contractReadWrite.NewOneReadWriteVar(contractMap[constant.ONE_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.OneReadWriteCase(testAccArr.FromPrv[i], funcStr[i], big.NewInt(value.(int64)), readWriteTrade, *readWriteVar)
resTxArr = append(resTxArr, tx)
}
verify := func() bool {
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
}
// 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) {
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
}
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)
}
auth.NoSend = true
erc20Trade.ToAddr = []common.Address{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
auth.GasPrice = big.NewInt(10000000000)
value, _ := accountNonceMap.Load(testAccArr.FromAddr[i])
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)
erc20Trade.FromAddr = testAccArr.FromAddr[i]
auth.Nonce = auth.Nonce.Add(auth.Nonce, big.NewInt(1))
tx, err = erc20Trade.Erc20TransferFromSignTx(auth, tokenTransfer)
if err != nil {
log.Error("Erc20TransferFromSignTx 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
}
// NrOneErc20TranCase 多层-Erc20转账
func NrOneErc20TranCase(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
}
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)
}
oneErc20Trade.ToAddr = []common.Address{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
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
}
// 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) {
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
}
// 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) {
oneErc721Trade := &contractErc721.OneErc721Trade{
NftTokenTransferAddr: contractMap[constant.TOKEN721_TRANSFER],
Erc721Addr: contractMap[constant.ERC721],
}
erc721Contract, err := erc721.NewERC721(contractMap[constant.ERC721], client)
if err != nil {
return nil, nil
}
tokenTransfer, err := erc721.NewOneNftTokenTransfer(contractMap[constant.ONE_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)
}
oneErc721Trade.ToAddr = testAccArr.ToAddr[i]
oneErc721Trade.FromAddr = testAccArr.FromAddr[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
oneErc721Trade.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 := oneErc721Trade.Erc721OneTransferFromSignTx(auth, tokenTransfer)
if err != nil {
log.Error("Erc721OneTransferFromSignTx error:", err.Error())
return nil, nil
}
log.Info("Erc721OneTransferFromSignTx 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
}
...@@ -5,14 +5,11 @@ import ( ...@@ -5,14 +5,11 @@ import (
"contract-case/constant" "contract-case/constant"
"contract-case/contract/coin" "contract-case/contract/coin"
"contract-case/contract/deploy" "contract-case/contract/deploy"
contractErc20 "contract-case/contract/erc20"
readWrite "contract-case/contract/variable_state"
contractCoin "contract-case/contract_abi/coin_transfer/compile"
erc20 "contract-case/contract_abi/erc20_transfer/compile" erc20 "contract-case/contract_abi/erc20_transfer/compile"
erc721 "contract-case/contract_abi/erc721_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"
"crypto/ecdsa" "crypto/ecdsa"
"encoding/json" "encoding/json"
"fmt" "fmt"
...@@ -30,6 +27,45 @@ import ( ...@@ -30,6 +27,45 @@ import (
var tranChanel = make(chan *types.Transaction, 1000) var tranChanel = make(chan *types.Transaction, 1000)
func GenerateAcc(count int) *tool.AccArr {
fromAddr := make([]string, 0)
fromPrv := make([]string, 0)
toAddr := make([]string, 0)
toPrv := make([]string, 0)
for i := 0; i < count; i++ {
toPrivateKey, err := crypto.GenerateKey()
if err != nil {
log.Error("Gen wallet Err:%r", err)
break
}
prv := hexutil.Encode(crypto.FromECDSA(toPrivateKey))
addr := crypto.PubkeyToAddress(toPrivateKey.PublicKey).Hex()
if i < count/2 {
fromAddr = append(fromAddr, addr)
fromPrv = append(fromPrv, prv)
} else {
toAddr = append(toAddr, addr)
toPrv = append(toPrv, prv)
}
}
accArr := &tool.AccArr{
FromAddr: fromAddr,
FromPrv: fromPrv,
ToAddr: toAddr,
ToPrv: toPrv,
}
jsonData, err := json.MarshalIndent(accArr, "", " ")
if err != nil {
log.Error("JSON encoding account failed: ", err)
}
err = os.WriteFile("./config/account.json", jsonData, 0644)
if err != nil {
fmt.Println("File writing account failed: ", err)
}
return accArr
}
func DeployContract(client *ethclient.Client, txRes []*types.Transaction) []*types.Transaction { func DeployContract(client *ethclient.Client, txRes []*types.Transaction) []*types.Transaction {
auth, err := bind.NewKeyedTransactorWithChainID(tool.Cfg.DeployPrv, tool.Cfg.ChainId) auth, err := bind.NewKeyedTransactorWithChainID(tool.Cfg.DeployPrv, tool.Cfg.ChainId)
if err != nil { if err != nil {
...@@ -37,13 +73,15 @@ func DeployContract(client *ethclient.Client, txRes []*types.Transaction) []*typ ...@@ -37,13 +73,15 @@ 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(10000000000000) auth.GasLimit = uint64(4000000)
auth.GasPrice = big.NewInt(1000000000000) 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)
} }
auth.Nonce = big.NewInt(int64(nonce)) auth.Nonce = big.NewInt(int64(nonce))
contractArr := make([]map[string]common.Address, 0)
for i := 0; i < 5; 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 {
contractAddr, transaction, contractType := deployFunc(auth, client) contractAddr, transaction, contractType := deployFunc(auth, client)
...@@ -51,486 +89,212 @@ func DeployContract(client *ethclient.Client, txRes []*types.Transaction) []*typ ...@@ -51,486 +89,212 @@ func DeployContract(client *ethclient.Client, txRes []*types.Transaction) []*typ
contractMap[contractType] = contractAddr contractMap[contractType] = contractAddr
auth.Nonce = auth.Nonce.Add(auth.Nonce, big.NewInt(1)) auth.Nonce = auth.Nonce.Add(auth.Nonce, big.NewInt(1))
} }
generateContractMap(contractMap) contractArr = append(contractArr, contractMap)
return txRes
}
func generateContractMap(contractMap map[string]common.Address) {
jsonData, err := json.MarshalIndent(contractMap, "", " ")
if err != nil {
log.Error("JSON encoding contract failed: ", err)
}
err = os.WriteFile("./config/contractConfig.json", jsonData, 0644)
if err != nil {
fmt.Println("File writing contract failed: ", err)
} }
util.GenerateContractMap(contractArr)
return txRes
} }
func InitCaseAccount(client *ethclient.Client, txArr []*types.Transaction) { func InitCaseAccount(client *ethclient.Client, txArr []*types.Transaction) []*types.Transaction {
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("Init account - get acc nonce err:", err) log.Error("Init account - get acc nonce err:", err)
return return nil
} }
accArr := tool.ParseAccountConfig("./config/account.json")
contractMap := tool.ParseContractConfig("./config/contractConfig.json") contractMap := tool.ParseContractConfig("./config/contractConfig.json")
// 初始化From账户 tx := &types.Transaction{}
accArr := tool.ParseAccountConfig("./config/account.json")
auth, err := bind.NewKeyedTransactorWithChainID(tool.Cfg.DeployPrv, tool.Cfg.ChainId)
auth.NoSend = true
//初始化From账户
amount := big.NewInt(0) amount := big.NewInt(0)
amount.SetString("10000000000000000000", 10) 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(21000), Gas: big.NewInt(50000),
GasPrice: big.NewInt(1000000000), GasPrice: big.NewInt(100000000),
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 return nil
}
err = client.SendTransaction(context.Background(), tx)
if err != nil {
log.Error("Init account - send tran err:", err.Error())
return
} }
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)
} }
// 初始化转账合约账户余额 //初始化转账合约账户余额
contractLen := len(contractMap)
for i := 0; i < contractLen; i++ {
trade.FromNonce = big.NewInt(int64(nonce)) trade.FromNonce = big.NewInt(int64(nonce))
coinTransferContract := common.HexToAddress(contractMap[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 return nil
}
err = client.SendTransaction(context.Background(), tx)
if err != nil {
log.Error("Init account - send tran err:", err.Error())
return
} }
txArr = append(txArr, tx) txArr = append(txArr, tx)
nonce += 1 nonce += 1
// 初始化erc20 并且mint
auth, err := bind.NewKeyedTransactorWithChainID(tool.Cfg.DeployPrv, tool.Cfg.ChainId)
if err != nil {
log.Errorf("DeployTokenTransfer func newKeyedTransactorWithChainID err:", err)
return
} }
newERC20, err := erc20.NewERC20(common.HexToAddress(contractMap[constant.ERC20]), client) // 初始化erc20 并且mint
for j := 0; j < contractLen; j++ {
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 return nil
} }
auth.Nonce = big.NewInt(int64(nonce)) auth.Nonce = big.NewInt(int64(nonce))
auth.GasPrice = big.NewInt(100000000000) auth.GasPrice = big.NewInt(1000000000)
auth.GasLimit = big.NewInt(100000000000).Uint64() auth.GasLimit = big.NewInt(1000000000).Uint64()
// 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 return nil
} }
log.Info(tool.Cfg.DeployAddr, ",erc20 balance of:", of.Uint64())
if of.Int64() == 0 { if of.Int64() == 0 {
tx, err := newERC20.Mint(auth, tool.Cfg.DeployAddr, big.NewInt(1000000000000000000)) mintCount := big.NewInt(0)
mintCount.SetString("1000000000000000000000000", 10)
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 return nil
} }
txArr = append(txArr, tx) txArr = append(txArr, tx)
log.Info("Init account - mint 20 successful,tx:", tx.Hash().Hex())
nonce += 1 nonce += 1
auth.Nonce = big.NewInt(int64(nonce)) auth.Nonce = big.NewInt(int64(nonce))
} }
tranCount := big.NewInt(0)
tranCount.SetString("1000000000000000000000", 10)
// erc20 转账 // erc20 转账
tx, err = newERC20.Transfer(auth, common.HexToAddress(contractMap[constant.TOKEN20_TRANSFER]), big.NewInt(1000000000000000000)) 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 return nil
} }
txArr = append(txArr, tx) txArr = append(txArr, tx)
nonce += 1 nonce += 1
// 初始化erc721 并且mint tranCount.SetString("10000000000000000000", 10)
newERC721, err := erc721.NewERC721(common.HexToAddress(contractMap[constant.ERC721]), client) for i := 0; i < len(accArr.FromAddr); i++ {
if err != nil { owner := accArr.FromAddr[i]
log.Error("Init account - new erc721 err:", err.Error())
return
}
startTokenId := 0
endTokenId := 1
for i := startTokenId; i < endTokenId; i++ {
auth.Nonce = big.NewInt(int64(nonce)) auth.Nonce = big.NewInt(int64(nonce))
tx, err := newERC721.Mint(auth, common.HexToAddress(contractMap[constant.TOKEN721_TRANSFER]), big.NewInt(int64(i))) tx, err = newERC20.Transfer(auth, owner, tranCount)
if err != nil { if err != nil {
log.Error("Init account - erc721 mint err:", err.Error()) log.Error("Init account - erc20 transfer err:", err.Error())
return return nil
} }
txArr = append(txArr, tx) txArr = append(txArr, tx)
log.Info("Init account - mint 721 successful,tx:", tx.Hash().Hex())
nonce += 1 nonce += 1
}
}
func GenerateAcc(count int) *tool.AccArr {
fromAddr := make([]string, 0)
fromPrv := make([]string, 0)
toAddr := make([]string, 0)
toPrv := make([]string, 0)
for i := 0; i < count; i++ {
toPrivateKey, err := crypto.GenerateKey()
if err != nil {
log.Error("Gen wallet Err:%r", err)
break
}
prv := hexutil.Encode(crypto.FromECDSA(toPrivateKey))
addr := crypto.PubkeyToAddress(toPrivateKey.PublicKey).Hex()
if i < count/2 {
fromAddr = append(fromAddr, addr)
fromPrv = append(fromPrv, prv)
} else {
toAddr = append(toAddr, addr)
toPrv = append(toPrv, prv)
}
}
accArr := &tool.AccArr{
FromAddr: fromAddr,
FromPrv: fromPrv,
ToAddr: toAddr,
ToPrv: toPrv,
}
jsonData, err := json.MarshalIndent(accArr, "", " ")
if err != nil {
log.Error("JSON encoding account failed: ", err)
}
err = os.WriteFile("./config/account.json", jsonData, 0644)
if err != nil {
fmt.Println("File writing account failed: ", err)
}
return accArr
}
func NotAssociatedContractTx(accountNonceMap *sync.Map, contractMap map[string]string, client *ethclient.Client, resTxArr []*types.Transaction) []*types.Transaction {
testAccArr := tool.ParseAccountConfig("./config/account.json")
txCount := 10
accIndex := 0
// 普通转账交易
coinTrade := &coin.Trade{}
for i := 0; i < txCount; i++ {
toAddr := testAccArr.ToAddr[i]
coinTrade.FromPrv = testAccArr.FromPrv[i]
value, _ := accountNonceMap.Load(testAccArr.FromAddr[i])
coinTrade.FromNonce = big.NewInt(value.(int64))
coinTrade.ToAddr = &toAddr
coinTrade.Gas = big.NewInt(21000)
coinTrade.GasPrice = big.NewInt(10000000000)
coinTrade.ChainId = tool.Cfg.ChainId
coinTrade.Amount = big.NewInt(100000000000000000)
tx, err := coinTrade.CoinTransferSignTx()
if err != nil {
log.Error("constructor coin transfer tx err:", err.Error())
return nil
}
resTxArr = append(resTxArr, tx)
}
accIndex += txCount
// 调用合约转账交易
// 单层调用
contractCoinTrade := &coin.ContractCoinTrade{
ToAddr: testAccArr.ToAddr,
Amount: big.NewInt(100000000000000000),
}
transfer, err := contractCoin.NewChainCoinTransfer(common.HexToAddress(contractMap[constant.COIN_TRANSFER]), client)
if err != nil {
return nil
}
for i := accIndex; i < txCount+accIndex; i++ {
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(1000000000000)
tx, err := contractCoinTrade.TransferSignTx(auth, transfer)
if err != nil {
return nil
}
resTxArr = append(resTxArr, tx)
}
accIndex += txCount
// 多层调用
contractCoinOneTrade := &coin.ContractCoinOneTrade{
ChainContractAdr: common.HexToAddress(contractMap[constant.COIN_TRANSFER]),
ToAddr: testAccArr.ToAddr,
Amount: big.NewInt(100000000000000000),
}
oneChainCoinTransfer, err := contractCoin.NewOneChainCoinTransfer(common.HexToAddress(contractMap[constant.COIN_TRANSFER]), client)
if err != nil {
return nil
}
for i := accIndex; i < txCount+accIndex; i++ {
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(1000000000000)
tx, err := contractCoinOneTrade.OneTransferSignTx(auth, oneChainCoinTransfer)
if err != nil {
return nil
}
resTxArr = append(resTxArr, tx)
}
accIndex += txCount
// 读写变量合约 auth.Nonce = big.NewInt(int64(nonce))
readWriteTrade := &readWrite.ReadWriteTrade{ tx, err = newERC20.ApproveFrom(auth, owner, contractMap[j][constant.TOKEN20_TRANSFER], tranCount)
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(common.HexToAddress(contractMap[constant.READ_WRITE]), client)
if err != nil { if err != nil {
log.Error("Init account - erc20 approveFrom err:", err.Error())
return nil return nil
} }
funcStr := []string{ txArr = append(txArr, tx)
"PushVarMapArray", nonce += 1
"PushVarStringArray",
"PushVarUintArray",
"SetVarString",
"SetVarMap",
"SetVarMapArray",
"SetVarUint256",
"SetVarStringArray",
"SetVarUintArray",
}
for i := accIndex; i < len(funcStr)+accIndex; i++ {
value, _ := accountNonceMap.Load(testAccArr.FromAddr[i])
tx := readWriteCase(testAccArr.FromPrv[i], funcStr[i-accIndex], big.NewInt(value.(int64)), readWriteTrade, readWriteVar)
resTxArr = append(resTxArr, tx)
}
accIndex += len(funcStr)
// erc20 转账
// 单层
erc20Trade := &contractErc20.Erc20Trade{
Erc20Addr: common.HexToAddress(contractMap[constant.ERC20]),
Amount: big.NewInt(10000000000000000),
} }
for i := accIndex; i < txCount+accIndex; i++ {
auth, err := bind.NewKeyedTransactorWithChainID(testAccArr.FromPrv[i], tool.Cfg.ChainId)
if err != nil {
log.Errorf("DeployTokenTransfer func newKeyedTransactorWithChainID err:", err)
} }
auth.GasPrice = big.NewInt(1000000000000) //初始化erc721 并且mint
value, _ := accountNonceMap.Load(testAccArr.FromAddr[i]) for j := 0; j < contractLen; j++ {
auth.Nonce = big.NewInt(value.(int64)) newERC721, err := erc721.NewERC721(contractMap[j][constant.ERC721], client)
auth.NoSend = true
tokenTransfer, err := erc20.NewTokenTransfer(common.HexToAddress(contractMap[constant.TOKEN20_TRANSFER]), client)
if err != nil { if err != nil {
log.Error("Init account - new erc721 err:", err.Error())
return nil return nil
} }
erc20Trade.ToAddr = testAccArr.ToAddr for i := 0; i < len(accArr.FromAddr); i++ {
tx, err := erc20Trade.Erc20TransferSignTx(auth, tokenTransfer) auth.Nonce = big.NewInt(int64(nonce))
tx, err = newERC721.Mint(auth, tool.Cfg.DeployAddr, big.NewInt(int64(i)))
if err != nil { if err != nil {
log.Error("Init account - erc721 mint err:", err.Error())
return nil return nil
} }
resTxArr = append(resTxArr, tx) txArr = append(txArr, tx)
//erc20Trade.FromAddr = testAccArr.FromAddr[i] log.Info("Init account - mint 721 successful,tx:", tx.Hash().Hex())
//auth.Nonce = nonce.Add(nonce, big.NewInt(1)) nonce += 1
//tx, err = erc20Trade.Erc20TransferFromSignTx(auth, tokenTransfer)
//resTxArr = append(resTxArr, tx)
//if err != nil {
// return nil
//}
}
accIndex += txCount
// 多层
oneErc20Trade := &contractErc20.OneErc20Trade{
TokenTransferAddr: common.HexToAddress(contractMap[constant.TOKEN20_TRANSFER]),
Erc20Addr: common.HexToAddress(contractMap[constant.ERC20]),
Amount: big.NewInt(1000000000000),
}
for i := accIndex; i < txCount+accIndex; i++ {
auth, err := bind.NewKeyedTransactorWithChainID(testAccArr.FromPrv[i], tool.Cfg.ChainId)
if err != nil {
log.Errorf("DeployTokenTransfer func newKeyedTransactorWithChainID err:", err)
}
tokenTransfer, err := erc20.NewOneTokenTransfer(common.HexToAddress(contractMap[constant.ONE_TOKEN20_TRANSFER]), client)
if err != nil {
return nil
} }
oneErc20Trade.ToAddr = testAccArr.ToAddr for i := 0; i < len(accArr.FromAddr); i++ {
value, _ := accountNonceMap.Load(testAccArr.FromAddr[i]) auth.Nonce = big.NewInt(int64(nonce))
auth.Nonce = big.NewInt(value.(int64)) //tx, err = newERC721.TransferFrom(auth, tool.Cfg.DeployAddr, contractMap[constant.TOKEN721_TRANSFER], big.NewInt(int64(i)))
auth.NoSend = true tx, err = newERC721.TransferFrom(auth, tool.Cfg.DeployAddr, accArr.FromAddr[i], big.NewInt(int64(i)))
auth.GasLimit = 1000000000000
auth.GasPrice = big.NewInt(1000000000000)
tx, err := oneErc20Trade.Erc20OneTransferTx(auth, tokenTransfer)
if err != nil { if err != nil {
log.Error("Init account - erc721 TransferFrom err:", err.Error())
return nil return nil
} }
log.Info("Erc20OneTransferTx tx:", tx.Hash().Hex()) txArr = append(txArr, tx)
resTxArr = append(resTxArr, tx) log.Info("Init account - transferFrom 721 successful,tx:", tx.Hash().Hex())
//erc20Trade.FromAddr = testAccArr.FromAddr[i] nonce += 1
//auth.Nonce = nonce.Add(nonce, big.NewInt(1))
//tx, err = oneErc20Trade.Erc20OneTransferFromTx(auth, tokenTransfer)
//if err != nil {
// return nil
//}
//resTxArr = append(resTxArr, tx)
}
// erc721 转账
//accIndex += txCount
// 单层
//erc721Trade := &contractErc721.Erc721Trade{
// Erc721Addr: common.HexToAddress(contractMap[constant.ERC721]),
//}
//for i := accIndex; i < txCount+accIndex; i++ {
// auth, err := bind.NewKeyedTransactorWithChainID(testAccArr.FromPrv[i], tool.Cfg.ChainId)
// if err != nil {
// log.Errorf("DeployTokenTransfer func newKeyedTransactorWithChainID err:", err)
// }
// tokenTransfer, err := erc721.NewNftTokenTransfer(common.HexToAddress(contractMap[constant.TOKEN721_TRANSFER]), client)
// if err != nil {
// return nil
// }
// erc721Trade.ToAddr = testAccArr.ToAddr[i]
// erc721Trade.FromAddr = testAccArr.FromAddr[i]
// erc721Trade.TokenId = big.NewInt(int64(i - accIndex))
// auth.Nonce = nonce
// auth.NoSend = true
// auth.GasPrice = big.NewInt(1000000000000)
// tx, err := erc721Trade.Erc721TransferFromSignTx(auth, tokenTransfer)
// if err != nil {
// return nil
// }
// log.Info("Erc721TransferFromSignTx tx:", tx.Hash().Hex())
// resTxArr = append(resTxArr, tx)
//}
//accIndex += txCount
//// 多层
//oneErc721Trade := &contractErc721.OneErc721Trade{
// Erc721Addr: common.HexToAddress(contractMap[constant.ERC721]),
//}
//for i := accIndex; i < txCount+accIndex; i++ {
// auth, err := bind.NewKeyedTransactorWithChainID(testAccArr.FromPrv[i], tool.Cfg.ChainId)
// if err != nil {
// log.Errorf("DeployTokenTransfer func newKeyedTransactorWithChainID err:", err)
// }
// tokenTransfer, err := erc721.NewOneNftTokenTransfer(common.HexToAddress(contractMap[constant.ONE_TOKEN721_TRANSFER]), client)
// if err != nil {
// return nil
// }
// oneErc721Trade.ToAddr = testAccArr.ToAddr[i]
// oneErc721Trade.FromAddr = testAccArr.FromAddr[i]
// auth.Nonce = nonce
// auth.NoSend = true
// auth.GasPrice = big.NewInt(1000000000000)
// tx, err := oneErc721Trade.Erc721OneTransferFromSignTx(auth, tokenTransfer)
// if err != nil {
// return nil
// }
// log.Info("Erc721OneTransferFromSignTx tx:", tx.Hash().Hex())
// resTxArr = append(resTxArr, tx)
//}
//accIndex += txCount
return resTxArr
}
func readWriteCase(prv *ecdsa.PrivateKey, funcStr string, nonce *big.Int, readWriteTrade *readWrite.ReadWriteTrade, readWriteVar *contractReadWrite.ReadWriteVar) *types.Transaction { auth.Nonce = big.NewInt(int64(nonce))
auth, err := bind.NewKeyedTransactorWithChainID(prv, tool.Cfg.ChainId) tx, err = newERC721.SetApprovalForAllFrom(auth, accArr.FromAddr[i], contractMap[j][constant.TOKEN721_TRANSFER], true)
if err != nil {
log.Errorf("DeployTokenTransfer func newKeyedTransactorWithChainID err:", err)
}
auth.Nonce = nonce
auth.NoSend = true
auth.GasPrice = big.NewInt(1000000000000)
tx := &types.Transaction{}
if funcStr == "PushVarMapArray" {
tx, err = readWriteTrade.ReadWriteSignTxPushVarMapArray(auth, readWriteVar)
if err != nil {
return nil
}
}
if funcStr == "PushVarStringArray" {
tx, err = readWriteTrade.ReadWriteSignTxPushVarStringArray(auth, readWriteVar)
if err != nil {
return nil
}
}
if funcStr == "PushVarUintArray" {
tx, err = readWriteTrade.ReadWriteSignTxPushVarUintArray(auth, readWriteVar)
if err != nil {
return nil
}
}
if funcStr == "SetVarString" {
tx, err = readWriteTrade.ReadWriteSignTxSetVarString(auth, readWriteVar)
if err != nil {
return nil
}
}
if funcStr == "SetVarMap" {
tx, err = readWriteTrade.ReadWriteSignTxSetVarMap(auth, readWriteVar)
if err != nil {
return nil
}
}
if funcStr == "SetVarMapArray" {
tx, err = readWriteTrade.ReadWriteSignTxSetVarMapArray(auth, readWriteVar)
if err != nil {
return nil
}
}
if funcStr == "SetVarUint256" {
tx, err = readWriteTrade.ReadWriteSignTxSetVarUint256(auth, readWriteVar)
if err != nil {
return nil
}
}
if funcStr == "SetVarStringArray" {
tx, err = readWriteTrade.ReadWriteSignTxSetVarStringArray(auth, readWriteVar)
if err != nil { if err != nil {
log.Error("Init account - erc721 setApprovalForAllFrom err:", err.Error())
return nil return nil
} }
} txArr = append(txArr, tx)
if funcStr == "SetVarUintArray" { log.Info("Init account - transferFrom 721 successful,tx:", tx.Hash().Hex())
tx, err = readWriteTrade.ReadWriteSignTxSetVarUintArray(auth, readWriteVar) nonce += 1
if err != nil {
return nil
} }
} }
return tx log.Info("Init balance successful,wait send tran...........")
return txArr
} }
func PartialAssociationContractTx() { func GetTranFunc(caseType int, startIndex int, txCount int, nonceMap *sync.Map, accArr *tool.AccArrFormat, client *ethclient.Client, contractArr []map[string]common.Address) ([]*types.Transaction, func() bool) {
txArr := make([]*types.Transaction, 0)
arr := GetAccArr(accArr, startIndex, txCount)
switch caseType {
// 不相关-普通转账交易
case 1:
{
return NrCoinTranCase(txCount, arr, nonceMap, txArr, client)
}
// 不相关-合约调用交易
case 2:
{
return NrContractCoinTranCase(txCount, arr, contractArr[0], nonceMap, txArr, client)
}
default:
{
return nil, nil
}
}
return nil, nil
} }
func FullyAssociativeContractTx() { func GetAccArr(arr *tool.AccArrFormat, startIndex int, count int) *tool.AccArrFormat {
fromAddr := make([]common.Address, 0)
fromPrv := make([]*ecdsa.PrivateKey, 0)
toAddr := make([]common.Address, 0)
toPrv := make([]*ecdsa.PrivateKey, 0)
for i := startIndex; i < startIndex+count; i++ {
fromAddr = append(fromAddr, arr.FromAddr[i])
fromPrv = append(fromPrv, arr.FromPrv[i])
toAddr = append(toAddr, arr.ToAddr[i])
toPrv = append(toPrv, arr.ToPrv[i])
}
accStruct := &tool.AccArrFormat{
FromAddr: fromAddr,
FromPrv: fromPrv,
ToAddr: toAddr,
ToPrv: toPrv,
}
return accStruct
} }
func SendTransaction(trans []*types.Transaction) { func SendTransaction(trans []*types.Transaction) {
client := tool.Cfg.RpcNode client := tool.Cfg.RpcNode
for i := 0; i < 1; i++ { for i := 0; i < 8; i++ {
go func() { go func() {
for { for {
select { select {
......
package operator
import (
"context"
"contract-case/constant"
"contract-case/contract/coin"
contractCoin "contract-case/contract_abi/coin_transfer/compile"
"contract-case/log"
"contract-case/tool"
"contract-case/util"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/ethclient"
"math/big"
"sync"
)
// PrReCoinTranCase 普通转账-接受者相关
func PrReCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, accountNonceMap *sync.Map, resTxArr []*types.Transaction, client *ethclient.Client) ([]*types.Transaction, func() bool) {
amount := big.NewInt(100000000000000000)
coinTrade := &coin.Trade{
Amount: amount,
Gas: big.NewInt(21000),
GasPrice: big.NewInt(10000000000),
ChainId: tool.Cfg.ChainId,
}
sendBeforeBal := make(map[common.Address]*big.Int, 0)
toAddr := testAccArr.ToAddr[0]
beforeToBal := util.GetAccBal(client, toAddr)
if beforeToBal == nil {
return nil, nil
}
for i := 0; i < txCount; i++ {
fromAddr := testAccArr.FromAddr[i]
beforeBal := util.GetAccBal(client, testAccArr.FromAddr[i])
if beforeBal == nil {
return nil, nil
}
sendBeforeBal[fromAddr] = beforeBal
coinTrade.FromPrv = testAccArr.FromPrv[i]
value, _ := accountNonceMap.Load(fromAddr)
coinTrade.FromNonce = big.NewInt(value.(int64))
coinTrade.ToAddr = &toAddr
tx, err := coinTrade.CoinTransferSignTx()
if err != nil {
log.Error("constructor coin transfer tx err:", err.Error())
continue
}
resTxArr = append(resTxArr, tx)
}
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++ {
fromAddr := testAccArr.FromAddr[i]
sendAfterBal := util.GetAccBal(client, fromAddr)
if sendAfterBal == nil {
return false
}
if sendBeforeBal[fromAddr].Sub(sendBeforeBal[fromAddr], sendAfterBal).Cmp(amount) == 1 {
return false
}
}
return true
}
return resTxArr, verify
}
// PrSpCoinTranCase 普通转账-发送者相关
func PrSpCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, accountNonceMap *sync.Map, resTxArr []*types.Transaction, client *ethclient.Client) ([]*types.Transaction, func() bool) {
amount := big.NewInt(100000000000000000)
coinTrade := &coin.Trade{
Amount: amount,
Gas: big.NewInt(21000),
GasPrice: big.NewInt(10000000000),
ChainId: tool.Cfg.ChainId,
}
reBeforeBal := make(map[common.Address]*big.Int, 0)
fromAddr := testAccArr.FromAddr[0]
coinTrade.FromPrv = testAccArr.FromPrv[0]
value, _ := accountNonceMap.Load(fromAddr)
coinTrade.FromNonce = big.NewInt(value.(int64))
beforeFromBal := util.GetAccBal(client, fromAddr)
if beforeFromBal == nil {
return nil, nil
}
for i := 0; i < txCount; i++ {
toAddr := testAccArr.ToAddr[i]
beforeBal := util.GetAccBal(client, toAddr)
if beforeBal == nil {
return nil, nil
}
reBeforeBal[toAddr] = beforeBal
coinTrade.ToAddr = &toAddr
tx, err := coinTrade.CoinTransferSignTx()
if err != nil {
log.Error("constructor coin transfer tx err:", err.Error())
continue
}
coinTrade.FromNonce = big.NewInt(value.(int64) + 1)
resTxArr = append(resTxArr, tx)
}
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++ {
toAddr := testAccArr.ToAddr[i]
reAfterBal := util.GetAccBal(client, toAddr)
if reAfterBal == nil {
return false
}
if reAfterBal.Sub(reAfterBal, reBeforeBal[toAddr]).Cmp(amount) != 0 {
return false
}
}
return true
}
return resTxArr, verify
}
// PrSpReCoinTranCase 普通转账-发送者和接受者部分相关
func PrSpReCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, accountNonceMap *sync.Map, resTxArr []*types.Transaction, client *ethclient.Client) ([]*types.Transaction, func() bool) {
amount := big.NewInt(100000000000000000)
coinTrade := &coin.Trade{
Amount: amount,
Gas: big.NewInt(21000),
GasPrice: big.NewInt(10000000000),
ChainId: tool.Cfg.ChainId,
}
// A->B 账户tx
fromAddr := testAccArr.FromAddr[0]
coinTrade.FromPrv = testAccArr.FromPrv[0]
value, _ := accountNonceMap.Load(fromAddr)
coinTrade.FromNonce = big.NewInt(value.(int64))
beforeFromBal := util.GetAccBal(client, fromAddr)
if beforeFromBal == nil {
return nil, nil
}
toAddr := testAccArr.ToAddr[0]
beforeToBal := util.GetAccBal(client, toAddr)
if beforeToBal == nil {
return nil, nil
}
coinTrade.ToAddr = &toAddr
tx, err := coinTrade.CoinTransferSignTx()
if err != nil {
log.Error("constructor coin transfer tx err:", err.Error())
}
resTxArr = append(resTxArr, tx)
// B->C 账户tx
toAddr1 := testAccArr.ToAddr[1]
beforeTo1Bal := util.GetAccBal(client, toAddr1)
if beforeTo1Bal == nil {
return nil, nil
}
toNonce, _ := accountNonceMap.Load(toAddr)
coinTrade.FromPrv = testAccArr.ToPrv[0]
coinTrade.FromNonce = big.NewInt(toNonce.(int64))
coinTrade.ToAddr = &toAddr1
tx, err = coinTrade.CoinTransferSignTx()
if err != nil {
log.Error("constructor coin transfer tx err:", err.Error())
}
resTxArr = append(resTxArr, tx)
verify := func() bool {
// A账户余额校验
sendFromAfterBal := util.GetAccBal(client, fromAddr)
if sendFromAfterBal == nil {
return false
}
if beforeFromBal.Sub(beforeFromBal, sendFromAfterBal).Cmp(amount) != 1 {
return false
}
// B账户余额校验
reToAfterBal := util.GetAccBal(client, toAddr)
if reToAfterBal == nil {
return false
}
if reToAfterBal.Sub(reToAfterBal, beforeToBal).Cmp(big.NewInt(0)) != 1 {
return false
}
// C账户余额校验
reTo1AfterBal := util.GetAccBal(client, toAddr1)
if reTo1AfterBal == nil {
return false
}
if reTo1AfterBal.Sub(reTo1AfterBal, beforeTo1Bal).Cmp(amount) != 0 {
return false
}
return true
}
return resTxArr, verify
}
// AllPrSpReCoinTranCase 普通转账-发送者和接受者全部相关
func AllPrSpReCoinTranCase(txCount int, testAccArr *tool.AccArrFormat, accountNonceMap *sync.Map, resTxArr []*types.Transaction, client *ethclient.Client) ([]*types.Transaction, func() bool) {
amount := big.NewInt(100000000000000000)
coinTrade := &coin.Trade{
Amount: amount,
Gas: big.NewInt(21000),
GasPrice: big.NewInt(10000000000),
ChainId: tool.Cfg.ChainId,
}
// A->B 账户tx
fromAddr := testAccArr.FromAddr[0]
coinTrade.FromPrv = testAccArr.FromPrv[0]
value, _ := accountNonceMap.Load(fromAddr)
coinTrade.FromNonce = big.NewInt(value.(int64))
beforeFromBal := util.GetAccBal(client, fromAddr)
if beforeFromBal == nil {
return nil, nil
}
toAddr := testAccArr.ToAddr[0]
beforeToBal := util.GetAccBal(client, toAddr)
if beforeToBal == nil {
return nil, nil
}
coinTrade.ToAddr = &toAddr
tx, err := coinTrade.CoinTransferSignTx()
if err != nil {
log.Error("constructor coin transfer tx err:", err.Error())
}
resTxArr = append(resTxArr, tx)
// B->A 账户tx
toNonce, _ := accountNonceMap.Load(toAddr)
coinTrade.FromPrv = testAccArr.ToPrv[0]
coinTrade.FromNonce = big.NewInt(toNonce.(int64))
coinTrade.ToAddr = &fromAddr
tx, err = coinTrade.CoinTransferSignTx()
if err != nil {
log.Error("constructor coin transfer tx err:", err.Error())
}
resTxArr = append(resTxArr, tx)
verify := func() bool {
// A账户余额校验
sendFromAfterBal := util.GetAccBal(client, fromAddr)
if sendFromAfterBal == nil {
return false
}
if beforeFromBal.Sub(beforeFromBal, sendFromAfterBal).Cmp(big.NewInt(0)) != 1 {
return false
}
// B账户余额校验
reToAfterBal := util.GetAccBal(client, toAddr)
if reToAfterBal == nil {
return false
}
if reToAfterBal.Sub(reToAfterBal, beforeToBal).Cmp(big.NewInt(0)) != 1 {
return false
}
return true
}
return resTxArr, verify
}
// PrReContractCoinTranCase 合约转账-接受者相关
func PrReContractCoinTranCase(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)
contractCoinTrade := &coin.ContractCoinTrade{
Amount: amount,
}
sendBeforeContractBalMap := make(map[common.Address]*big.Int, 0)
toAddr := testAccArr.ToAddr[0]
reBeforeToBal := util.GetAccBal(client, toAddr)
if reBeforeToBal == nil {
return nil, nil
}
for i := 0; i < txCount; i++ {
coinTranAddr := contractMap[i][constant.COIN_TRANSFER]
sendBeforeBal := util.GetAccBal(client, coinTranAddr)
if sendBeforeBal == nil {
return nil, nil
}
sendBeforeContractBalMap[coinTranAddr] = sendBeforeBal
coinTransfer, err := contractCoin.NewChainCoinTransfer(coinTranAddr, client)
if err != nil {
log.Error("NewChainCoinTransfer error:", err.Error())
return nil, nil
}
contractCoinTrade.ToAddr = []common.Address{toAddr}
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 := contractCoinTrade.TransferSignTx(auth, coinTransfer)
if err != nil {
return nil, nil
}
resTxArr = append(resTxArr, tx)
}
verify := func() bool {
for i := 0; i < txCount; i++ {
coinAddr := contractMap[i][constant.COIN_TRANSFER]
sendBeforeBal := sendBeforeContractBalMap[coinAddr]
sendAfterBal := util.GetAccBal(client, coinAddr)
if sendBeforeBal == nil {
return false
}
if sendBeforeBal.Sub(sendBeforeBal, sendAfterBal).Cmp(amount.Mul(amount, big.NewInt(int64(txCount)))) != 0 {
return false
}
}
reAfterToBal := util.GetAccBal(client, toAddr)
if reAfterToBal == nil {
return false
}
if reAfterToBal.Sub(reAfterToBal, reBeforeToBal).Cmp(amount.Mul(amount, big.NewInt(int64(txCount)))) != 0 {
return false
}
return true
}
return resTxArr, verify
}
// PrSpContractCoinTranCase 合约转账-发送者相关-不同账户调用同一个合约给不同的账户进行转账
func PrSpContractCoinTranCase(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)
coinTranAddr := contractMap[constant.COIN_TRANSFER]
contractCoinTrade := &coin.ContractCoinTrade{
Amount: amount,
}
coinTransfer, err := contractCoin.NewChainCoinTransfer(coinTranAddr, client)
if err != nil {
log.Error("NewChainCoinTransfer error:", err.Error())
return nil, nil
}
sendBeforeBal := util.GetAccBal(client, coinTranAddr)
if sendBeforeBal == nil {
return nil, nil
}
beforeToBalMap := make(map[common.Address]*big.Int)
for i := 0; i < txCount; i++ {
fromKey := testAccArr.FromPrv[i]
fromAddr := testAccArr.FromAddr[i]
toAddr := testAccArr.ToAddr[i]
contractCoinTrade.ToAddr = []common.Address{toAddr}
auth, err := bind.NewKeyedTransactorWithChainID(fromKey, tool.Cfg.ChainId)
if err != nil {
log.Errorf("DeployTokenTransfer func newKeyedTransactorWithChainID err:", err)
}
reBeforeToBal := util.GetAccBal(client, toAddr)
if reBeforeToBal == nil {
return nil, nil
}
beforeToBalMap[toAddr] = reBeforeToBal
value, _ := accountNonceMap.Load(fromAddr)
auth.Nonce = big.NewInt(value.(int64))
auth.NoSend = true
auth.GasLimit = 1000000000000
auth.GasPrice = big.NewInt(10000000000)
tx, err := contractCoinTrade.TransferSignTx(auth, coinTransfer)
if err != nil {
log.Error("TransferSignTx error:", err.Error())
return nil, nil
}
auth.Nonce = big.NewInt(value.(int64) + 1)
resTxArr = append(resTxArr, tx)
}
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++ {
toAddr := testAccArr.ToAddr[i]
reAfterToBal := util.GetAccBal(client, toAddr)
if reAfterToBal == nil {
return false
}
if reAfterToBal.Sub(reAfterToBal, beforeToBalMap[toAddr]).Cmp(amount) != 0 {
return false
}
}
return true
}
return resTxArr, verify
}
// PrReSpContractCoinTranCase 合约转账-发送者接受者相关
func PrReSpContractCoinTranCase(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)
contractCoinTrade := &coin.ContractCoinTrade{
Amount: amount,
}
coinTranAddr := contractMap[0][constant.COIN_TRANSFER]
coinTranAddr1 := contractMap[1][constant.COIN_TRANSFER]
sendBeforeCoinBal := util.GetAccBal(client, coinTranAddr)
if sendBeforeCoinBal == nil {
return nil, nil
}
sendBeforeCoin1Bal := util.GetAccBal(client, coinTranAddr1)
if sendBeforeCoin1Bal == nil {
return nil, nil
}
fromKey := testAccArr.FromPrv[0]
fromAddr := testAccArr.FromAddr[0]
toAddr := testAccArr.ToAddr[0]
toPrv := testAccArr.ToPrv[0]
contractCoinTrade.ToAddr = []common.Address{toAddr}
reBeforeToBal, err := client.BalanceAt(context.Background(), toAddr, nil)
if err != nil {
log.Error("Get ", coinTranAddr, " balance error: ", err.Error())
return nil, nil
}
// A -> a 合约 -> B 账户转账
auth, err := bind.NewKeyedTransactorWithChainID(fromKey, tool.Cfg.ChainId)
if err != nil {
log.Errorf("DeployTokenTransfer func newKeyedTransactorWithChainID err:", err)
}
value, _ := accountNonceMap.Load(fromAddr)
auth.Nonce = big.NewInt(value.(int64))
auth.NoSend = true
auth.GasLimit = 1000000000000
auth.GasPrice = big.NewInt(10000000000)
coinTransfer, err := contractCoin.NewChainCoinTransfer(coinTranAddr, client)
if err != nil {
log.Error("NewChainCoinTransfer error:", err.Error())
return nil, nil
}
tx, err := contractCoinTrade.TransferSignTx(auth, coinTransfer)
if err != nil {
log.Error("TransferSignTx error:", err.Error())
return nil, nil
}
resTxArr = append(resTxArr, tx)
// B -> b 合约 -> C 账户转账
toAddr1 := testAccArr.ToAddr[1]
auth, err = bind.NewKeyedTransactorWithChainID(toPrv, tool.Cfg.ChainId)
if err != nil {
log.Errorf("DeployTokenTransfer func newKeyedTransactorWithChainID err:", err)
}
value, _ = accountNonceMap.Load(toPrv)
auth.Nonce = big.NewInt(value.(int64))
auth.NoSend = true
auth.GasLimit = 1000000000000
auth.GasPrice = big.NewInt(10000000000)
contractCoinTrade.ToAddr = []common.Address{toAddr1}
coinTransfer1, err := contractCoin.NewChainCoinTransfer(coinTranAddr1, client)
if err != nil {
log.Error("NewChainCoinTransfer error:", err.Error())
return nil, nil
}
tx, err = contractCoinTrade.TransferSignTx(auth, coinTransfer1)
if err != nil {
log.Error("TransferSignTx error:", err.Error())
return nil, nil
}
resTxArr = append(resTxArr, tx)
verify := func() bool {
// 校验 a合约
sendAfterBal := util.GetAccBal(client, coinTranAddr)
if sendAfterBal == nil {
return false
}
if sendBeforeCoinBal.Sub(sendBeforeCoinBal, sendAfterBal).Cmp(amount.Mul(amount, big.NewInt(int64(txCount)))) != 0 {
return false
}
// 校验 b合约
sendAfterCoin1Bal := util.GetAccBal(client, coinTranAddr1)
if sendAfterBal == nil {
return false
}
if sendBeforeCoin1Bal.Sub(sendBeforeCoin1Bal, sendAfterCoin1Bal).Cmp(amount.Mul(amount, big.NewInt(int64(txCount)))) != 0 {
return false
}
// 校验 B 账户
reAfterToBal := util.GetAccBal(client, toAddr)
if sendAfterBal == nil {
return false
}
if reAfterToBal.Sub(reAfterToBal, reBeforeToBal).Cmp(amount) != 0 {
return false
}
return true
}
return resTxArr, verify
}
// PrReContractOneCoinTranCase 多层-合约转账-接受者相关
func PrReContractOneCoinTranCase(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)
toAddr := testAccArr.ToAddr[0]
reBeforeToBal := util.GetAccBal(client, toAddr)
if reBeforeToBal == nil {
return nil, nil
}
sendBeforeContractBalMap := make(map[common.Address]*big.Int, 0)
for i := 0; i < txCount; i++ {
coinTranAddr := contractMap[i][constant.COIN_TRANSFER]
contractCoinOneTrade := &coin.ContractCoinOneTrade{
ChainContractAdr: contractMap[i][constant.COIN_TRANSFER],
Amount: amount,
}
oneChainCoinTransfer, err := contractCoin.NewOneChainCoinTransfer(contractMap[i][constant.ONE_COIN_TRANSFER], client)
if err != nil {
log.Error("NewOneChainCoinTransfer error:", err.Error())
return nil, nil
}
sendBeforeBal := util.GetAccBal(client, coinTranAddr)
if sendBeforeBal == nil {
return nil, nil
}
sendBeforeContractBalMap[contractMap[i][constant.COIN_TRANSFER]] = sendBeforeBal
contractCoinOneTrade.ToAddr = []common.Address{toAddr}
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 := contractCoinOneTrade.OneTransferSignTx(auth, oneChainCoinTransfer)
if err != nil {
log.Error("OneTransferSignTx error:", err.Error())
return nil, nil
}
resTxArr = append(resTxArr, tx)
}
verify := func() bool {
for i := 0; i < txCount; i++ {
coinAddr := contractMap[i][constant.COIN_TRANSFER]
sendBeforeBal := sendBeforeContractBalMap[coinAddr]
sendAfterBal := util.GetAccBal(client, coinAddr)
if sendAfterBal == nil {
return false
}
if sendBeforeBal.Sub(sendBeforeBal, sendAfterBal).Cmp(amount.Mul(amount, big.NewInt(int64(txCount)))) != 0 {
return false
}
}
reAfterToBal := util.GetAccBal(client, toAddr)
if reAfterToBal == nil {
return false
}
if reAfterToBal.Sub(reAfterToBal, reBeforeToBal).Cmp(amount.Mul(amount, big.NewInt(int64(txCount)))) != 0 {
return false
}
return true
}
return resTxArr, verify
}
// 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) {
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]
contractCoinOneTrade := &coin.ContractCoinOneTrade{
ChainContractAdr: contractMap[0][constant.COIN_TRANSFER],
Amount: amount,
}
oneChainCoinTransfer, err := contractCoin.NewOneChainCoinTransfer(contractMap[0][constant.ONE_COIN_TRANSFER], client)
if err != nil {
log.Error("NewOneChainCoinTransfer error:", err.Error())
return nil, nil
}
sendBeforeContractBalMap := make(map[common.Address]*big.Int, 0)
sendBeforeBal := util.GetAccBal(client, coinTranAddr)
if sendBeforeBal == nil {
return nil, nil
}
sendBeforeContractBalMap[contractMap[0][constant.COIN_TRANSFER]] = sendBeforeBal
for i := 0; i < txCount; i++ {
contractCoinOneTrade.ToAddr = []common.Address{toAddr}
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 := contractCoinOneTrade.OneTransferSignTx(auth, oneChainCoinTransfer)
if err != nil {
log.Error("OneTransferSignTx error:", err.Error())
return nil, nil
}
resTxArr = append(resTxArr, tx)
}
verify := func() bool {
for i := 0; i < txCount; i++ {
coinAddr := contractMap[i][constant.COIN_TRANSFER]
sendBeforeBal := sendBeforeContractBalMap[coinAddr]
sendAfterBal := util.GetAccBal(client, coinAddr)
if sendAfterBal == nil {
return false
}
if sendBeforeBal.Sub(sendBeforeBal, sendAfterBal).Cmp(amount.Mul(amount, big.NewInt(int64(txCount)))) != 0 {
return false
}
}
reAfterToBal := util.GetAccBal(client, toAddr)
if reAfterToBal == nil {
return false
}
if reAfterToBal.Sub(reAfterToBal, reBeforeToBal).Cmp(amount.Mul(amount, big.NewInt(int64(txCount)))) != 0 {
return false
}
return true
}
return resTxArr, verify
}
// PrReWRTranCase 单层-写变量-合约接受者相关
func PrReWRTranCase() {
}
// PrSpWRTranCase 单层-写变量-合约发送者相关
func PrSpWRTranCase() {
}
// PrReOneWRTranCase 多层-写变量-合约接受者相关
func PrReOneWRTranCase() {
}
// PrSpOneWRTranCase 多层-写变量-合约发送者相关
func PrSpOneWRTranCase() {
}
// PrReErc20TranCase 单层-erc20-发送者相关
func PrReErc20TranCase() {
}
// PrSpErc20TranCase 单层-erc20-接受者相关
func PrSpErc20TranCase() {
}
// PrReSpErc20TranCase 单层-erc20-发送接受者相关
func PrReSpErc20TranCase() {
}
// PrReOneErc20TranCase 多层-erc20-发送者相关
func PrReOneErc20TranCase() {
}
// PrSpOneErc20TranCase 多层-erc20-接受者相关
func PrSpOneErc20TranCase() {
}
// PrReSpOneErc20TranCase 多层-erc20-发送接受者相关
func PrReSpOneErc20TranCase() {
}
// PrReErc721TranCase 单层-erc721-发送者相关
func PrReErc721TranCase() {
}
// PrSpErc721TranCase 单层-erc721-接受者相关
func PrSpErc721TranCase() {
}
// PrReSpErc721TranCase 单层-erc721-发送接受者相关
func PrReSpErc721TranCase() {
}
// PrReOneErc721TranCase 多层-erc721-发送者相关
func PrReOneErc721TranCase() {
}
// PrSpOneErc721TranCase 多层-erc721-接受者相关
func PrSpOneErc721TranCase() {
}
// PrReSpOneErc721TranCase 多层-erc721-发送接受者相关
func PrReSpOneErc721TranCase() {
}
...@@ -33,6 +33,7 @@ type Config struct { ...@@ -33,6 +33,7 @@ type Config struct {
GenerateAccCount int GenerateAccCount int
IsDeployContract bool IsDeployContract bool
IsInitAccountBalance bool IsInitAccountBalance bool
ContractMap []map[string]common.Address
} }
type AccArr struct { type AccArr struct {
...@@ -91,19 +92,28 @@ func ParseConfig(path string) { ...@@ -91,19 +92,28 @@ func ParseConfig(path string) {
GenerateAccCount: cfgJson.GenerateAccCount, GenerateAccCount: cfgJson.GenerateAccCount,
IsDeployContract: cfgJson.IsDeployContract, IsDeployContract: cfgJson.IsDeployContract,
IsInitAccountBalance: cfgJson.IsInitAccountBalance, IsInitAccountBalance: cfgJson.IsInitAccountBalance,
ContractMap: ParseContractConfig("./config/contractConfig.json"),
} }
} }
func ParseContractConfig(path string) map[string]string { func ParseContractConfig(path string) []map[string]common.Address {
data, err := os.ReadFile(path) data, err := os.ReadFile(path)
if err != nil { if err != nil {
panic(err) panic(err)
} }
var result map[string]string var receive []map[string]string
err = json.Unmarshal(data, &result) err = json.Unmarshal(data, &receive)
if err != nil { if err != nil {
panic(err) panic(err)
} }
result := make([]map[string]common.Address, 0)
for _, contractMap := range receive {
mapAddress := make(map[string]common.Address, 0)
for key, val := range contractMap {
mapAddress[key] = common.HexToAddress(val)
}
result = append(result, mapAddress)
}
return result return result
} }
......
...@@ -2,16 +2,26 @@ package util ...@@ -2,16 +2,26 @@ package util
import ( import (
"context" "context"
"contract-case/constant"
readWrite "contract-case/contract/variable_state"
erc20 "contract-case/contract_abi/erc20_transfer/compile"
erc721 "contract-case/contract_abi/erc721_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"
"crypto/ecdsa"
"encoding/json"
"fmt"
"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/core/types" "github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/ethclient" "github.com/ethereum/go-ethereum/ethclient"
"golang.org/x/crypto/sha3" "golang.org/x/crypto/sha3"
"math/big"
"os"
"sync" "sync"
"sync/atomic" "sync/atomic"
"time"
) )
func CallContractData(method string, params ...[]byte) []byte { func CallContractData(method string, params ...[]byte) []byte {
...@@ -41,7 +51,7 @@ func GetTxReceipt(client *ethclient.Client, txArr []*types.Transaction) { ...@@ -41,7 +51,7 @@ func GetTxReceipt(client *ethclient.Client, txArr []*types.Transaction) {
return return
} }
if receipt.Status == 0 { if receipt.Status == 0 {
log.Errorf("Receipt: status: %d, logs:%s ,gasUsed: %d", receipt.Status, receipt.Logs, receipt.GasUsed) log.Error("Receipt:", receipt)
} else { } else {
log.Infof("Receipt: status: %d, logs:%s ,gasUsed: %d", receipt.Status, receipt.Logs, receipt.GasUsed) log.Infof("Receipt: status: %d, logs:%s ,gasUsed: %d", receipt.Status, receipt.Logs, receipt.GasUsed)
} }
...@@ -50,20 +60,21 @@ func GetTxReceipt(client *ethclient.Client, txArr []*types.Transaction) { ...@@ -50,20 +60,21 @@ func GetTxReceipt(client *ethclient.Client, txArr []*types.Transaction) {
func GetAccountNonce(client *ethclient.Client) *sync.Map { func GetAccountNonce(client *ethclient.Client) *sync.Map {
accountArr := tool.ParseAccountConfig("./config/account.json") accountArr := tool.ParseAccountConfig("./config/account.json")
addrChan := make(chan common.Address, 500) addrChan := make(chan common.Address, 1000)
resSyncMap := &sync.Map{} resSyncMap := &sync.Map{}
var handleNonceCount int32 var handleNonceCount int32
for i := 0; i < 2; i++ { for i := 0; i < 8; i++ {
go func() { go func() {
for { for {
select { select {
case addr := <-addrChan: case addr := <-addrChan:
balance, err := client.NonceAt(context.Background(), addr, nil) balance, err := client.NonceAt(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,nonce err:%s", addr.Hash().Hex(), err)
} }
resSyncMap.Store(addr, balance) resSyncMap.Store(addr, int64(balance))
atomic.AddInt32(&handleNonceCount, 1) atomic.AddInt32(&handleNonceCount, 1)
//log.Info("handleNonceCount:", handleNonceCount)
} }
} }
}() }()
...@@ -72,33 +83,38 @@ func GetAccountNonce(client *ethclient.Client) *sync.Map { ...@@ -72,33 +83,38 @@ func GetAccountNonce(client *ethclient.Client) *sync.Map {
addrChan <- accountArr.FromAddr[i] addrChan <- accountArr.FromAddr[i]
addrChan <- accountArr.ToAddr[i] addrChan <- accountArr.ToAddr[i]
} }
for { time.Sleep(time.Second * 30)
if handleNonceCount == int32(tool.Cfg.GenerateAccCount) { if handleNonceCount == int32(tool.Cfg.GenerateAccCount) {
log.Info("Init all account nonce successful") log.Info("Init all account nonce successful")
break
}
} }
return resSyncMap return resSyncMap
} }
func GetAccountBalance(client *ethclient.Client) *sync.Map { func GetAccBal(client *ethclient.Client, addr common.Address) *big.Int {
balance, err := client.BalanceAt(context.Background(), addr, nil)
if err != nil {
log.Errorf("Get acc:%s,balance err:%s", addr.Hash().Hex(), err.Error())
return nil
}
log.Info(addr.Hash().Hex(), ",balance:", balance)
return balance
}
func GetAccountBalance(client *ethclient.Client) {
accountArr := tool.ParseAccountConfig("./config/account.json") accountArr := tool.ParseAccountConfig("./config/account.json")
b, err := client.BalanceAt(context.Background(), tool.Cfg.DeployAddr, nil) b, err := client.BalanceAt(context.Background(), tool.Cfg.DeployAddr, nil)
log.Info(b, err) log.Info(tool.Cfg.DeployAddr, ",balance:", b, err)
addrChan := make(chan common.Address, 500) addrChan := make(chan common.Address, 500)
resSyncMap := &sync.Map{} var handleBalanceCount int32
var handleNonceCount int32 for i := 0; i < 8; i++ {
for i := 0; i < 2; i++ {
go func() { go func() {
for { for {
select { select {
case addr := <-addrChan: case addr := <-addrChan:
balance, err := client.BalanceAt(context.Background(), addr, nil) GetAccBal(client, addr)
if err != nil { GetAccountErc20BalanceOf(client, tool.Cfg.ContractMap[0][constant.ERC20], addr)
log.Errorf("Get acc:%s,balance err:%s", addr.Hash().Hex(), err.Error()) GetAccountErc721BalanceOf(client, tool.Cfg.ContractMap[0][constant.ERC721], addr)
} atomic.AddInt32(&handleBalanceCount, 1)
resSyncMap.Store(addr, balance)
atomic.AddInt32(&handleNonceCount, 1)
} }
} }
}() }()
...@@ -107,13 +123,29 @@ func GetAccountBalance(client *ethclient.Client) *sync.Map { ...@@ -107,13 +123,29 @@ func GetAccountBalance(client *ethclient.Client) *sync.Map {
addrChan <- accountArr.FromAddr[i] addrChan <- accountArr.FromAddr[i]
addrChan <- accountArr.ToAddr[i] addrChan <- accountArr.ToAddr[i]
} }
for { time.Sleep(time.Second * 30)
if handleNonceCount == int32(tool.Cfg.GenerateAccCount) { if handleBalanceCount == int32(tool.Cfg.GenerateAccCount) {
log.Info("Init all account nonce successful") log.Info("Init all account balance successful")
break
} }
}
func GetAccountErc20BalanceOf(client *ethclient.Client, erc20Addr common.Address, toAddr common.Address) {
newERC20, err := erc20.NewERC20(erc20Addr, client)
if err != nil {
log.Error("Init account - new erc720 err:", err.Error())
return
} }
return resSyncMap of, err := newERC20.BalanceOf(&bind.CallOpts{}, toAddr)
if err != nil {
log.Errorf("Get erc20 balance of failed err:%s", err.Error())
return
}
of, err = newERC20.Allowance(&bind.CallOpts{}, common.HexToAddress("0xfb1bF24c0C7e7C1B89c4A496aACf01aBF26C0B94"), toAddr)
if err != nil {
log.Errorf("Get erc20 balance of failed err:%s", err.Error())
return
}
log.Infof("%s erc20 balance of is: %s ", toAddr.Hash().Hex(), of.String())
} }
func GetAccountErc721BalanceOf(client *ethclient.Client, erc721Addr common.Address, toAddr common.Address) { func GetAccountErc721BalanceOf(client *ethclient.Client, erc721Addr common.Address, toAddr common.Address) {
...@@ -127,5 +159,174 @@ func GetAccountErc721BalanceOf(client *ethclient.Client, erc721Addr common.Addre ...@@ -127,5 +159,174 @@ func GetAccountErc721BalanceOf(client *ethclient.Client, erc721Addr common.Addre
log.Errorf("Get erc721 balance of failed err:", err.Error()) log.Errorf("Get erc721 balance of failed err:", err.Error())
return return
} }
log.Infof("%s balance of is: %d ", toAddr.Hash().Hex(), of) log.Infof("%s erc721 balance of is: %d ", toAddr.Hash().Hex(), of)
}
func GenerateContractMap(contractArr []map[string]common.Address) {
jsonData, err := json.MarshalIndent(contractArr, "", " ")
if err != nil {
log.Error("JSON encoding contract failed: ", err)
}
err = os.WriteFile("./config/contractConfig.json", jsonData, 0644)
if err != nil {
fmt.Println("File writing contract failed: ", err)
}
}
func ReadWriteCase(prv *ecdsa.PrivateKey, funcStr string, nonce *big.Int, readWriteTrade *readWrite.ReadWriteTrade, readWriteVar *contractReadWrite.ReadWriteVar) *types.Transaction {
auth, err := bind.NewKeyedTransactorWithChainID(prv, tool.Cfg.ChainId)
if err != nil {
log.Errorf("DeployTokenTransfer func newKeyedTransactorWithChainID err:", err)
}
auth.Nonce = nonce
auth.NoSend = true
auth.GasPrice = big.NewInt(1000000000000)
tx := &types.Transaction{}
switch funcStr {
case "PushVarMapArray":
{
tx, err = readWriteTrade.ReadWriteSignTxPushVarMapArray(auth, readWriteVar)
if err != nil {
return nil
}
}
case "PushVarStringArray":
{
tx, err = readWriteTrade.ReadWriteSignTxPushVarStringArray(auth, readWriteVar)
if err != nil {
return nil
}
}
case "PushVarUintArray":
{
tx, err = readWriteTrade.ReadWriteSignTxPushVarUintArray(auth, readWriteVar)
if err != nil {
return nil
}
}
case "SetVarString":
{
tx, err = readWriteTrade.ReadWriteSignTxSetVarString(auth, readWriteVar)
if err != nil {
return nil
}
}
case "SetVarMap":
{
tx, err = readWriteTrade.ReadWriteSignTxSetVarMap(auth, readWriteVar)
if err != nil {
return nil
}
}
case "SetVarMapArray":
{
tx, err = readWriteTrade.ReadWriteSignTxSetVarMapArray(auth, readWriteVar)
if err != nil {
return nil
}
}
case "SetVarUint256":
{
tx, err = readWriteTrade.ReadWriteSignTxSetVarUint256(auth, readWriteVar)
if err != nil {
return nil
}
}
case "SetVarStringArray":
{
tx, err = readWriteTrade.ReadWriteSignTxSetVarStringArray(auth, readWriteVar)
if err != nil {
return nil
}
}
case "SetVarUintArray":
{
tx, err = readWriteTrade.ReadWriteSignTxSetVarUintArray(auth, readWriteVar)
if err != nil {
return nil
}
}
}
return tx
}
func OneReadWriteCase(prv *ecdsa.PrivateKey, funcStr string, nonce *big.Int, readWriteTrade *readWrite.OneReadWriteTrade, readWriteVar contractReadWrite.OneReadWriteVar) *types.Transaction {
auth, err := bind.NewKeyedTransactorWithChainID(prv, tool.Cfg.ChainId)
if err != nil {
log.Errorf("DeployTokenTransfer func newKeyedTransactorWithChainID err:", err)
}
auth.Nonce = nonce
auth.NoSend = true
auth.GasPrice = big.NewInt(1000000000000)
tx := &types.Transaction{}
switch funcStr {
case "PushVarMapArray":
{
tx, err = readWriteTrade.OneReadWriteSignTxPushVarMapArray(auth, readWriteVar)
if err != nil {
return nil
}
}
case "PushVarStringArray":
{
tx, err = readWriteTrade.OneReadWriteSignTxPushVarStringArray(auth, readWriteVar)
if err != nil {
return nil
}
}
case "PushVarUintArray":
{
tx, err = readWriteTrade.OneReadWriteSignTxPushVarUintArray(auth, readWriteVar)
if err != nil {
return nil
}
}
case "SetVarString":
{
tx, err = readWriteTrade.OneReadWriteSignTxSetVarString(auth, readWriteVar)
if err != nil {
return nil
}
}
case "SetVarMap":
{
tx, err = readWriteTrade.OneReadWriteSignTxSetVarMap(auth, readWriteVar)
if err != nil {
return nil
}
}
case "SetVarMapArray":
{
tx, err = readWriteTrade.OneReadWriteSignTxSetVarMapArray(auth, readWriteVar)
if err != nil {
return nil
}
}
case "SetVarUint256":
{
tx, err = readWriteTrade.OneReadWriteSignTxSetVarUint256(auth, readWriteVar)
if err != nil {
return nil
}
}
case "SetVarStringArray":
{
tx, err = readWriteTrade.OneReadWriteSignTxSetVarStringArray(auth, readWriteVar)
if err != nil {
return nil
}
}
case "SetVarUintArray":
{
tx, err = readWriteTrade.OneReadWriteSignTxPushVarUintArray(auth, readWriteVar)
if err != nil {
return nil
}
}
}
return tx
} }
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