├── .gitignore ├── jquery-simplefolders ├── icons.png ├── main.js └── main.css ├── index.js ├── package.json ├── 4bytes.js ├── index.html ├── github.js ├── decoder.js └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /jquery-simplefolders/icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/k06a/parity-trace-decoder/HEAD/jquery-simplefolders/icons.png -------------------------------------------------------------------------------- /jquery-simplefolders/main.js: -------------------------------------------------------------------------------- 1 | $(document).delegate('.expander','click',function(){ 2 | $(this).toggleClass('expanded') 3 | .nextAll('ul:first').toggleClass('expanded'); 4 | return true; 5 | }); 6 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const decoder = require('./decoder.js'); 3 | 4 | const traces = JSON.parse(fs.readFileSync(process.argv[2], 'utf8')); 5 | const methods = JSON.parse(fs.readFileSync('4bytes.json', 'utf8')); 6 | 7 | console.log(decoder(traces, methods)); 8 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "parity-trace-decoder", 3 | "version": "1.0.0", 4 | "description": "Parity Trace Decoder", 5 | "main": "index.js", 6 | "directories": { 7 | "doc": "docs" 8 | }, 9 | "dependencies": { 10 | "bn.js": "^4.11.8", 11 | "browserify": "^16.2.3", 12 | "ethereumjs-abi": "^0.6.7", 13 | "request": "^2.88.0", 14 | "throttled-request": "^0.1.1", 15 | "xmlhttprequest": "^1.8.0" 16 | }, 17 | "devDependencies": {}, 18 | "scripts": { 19 | "dist": "browserify decoder.js > web-decoder.js", 20 | "test": "echo \"Error: no test specified\" && exit 1" 21 | }, 22 | "repository": { 23 | "type": "git", 24 | "url": "git+https://github.com/k06a/parity-trace-decoder.git" 25 | }, 26 | "keywords": [ 27 | "ethereum", 28 | "solidity", 29 | "callstack", 30 | "tree", 31 | "traces" 32 | ], 33 | "author": "Anton Bukov ", 34 | "license": "MIT", 35 | "bugs": { 36 | "url": "https://github.com/k06a/parity-trace-decoder/issues" 37 | }, 38 | "homepage": "https://github.com/k06a/parity-trace-decoder#readme" 39 | } 40 | -------------------------------------------------------------------------------- /4bytes.js: -------------------------------------------------------------------------------- 1 | var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest; 2 | 3 | (async function () { 4 | 5 | const batch_size = 1; 6 | let url = 'https://www.4byte.directory/api/v1/signatures/?format=json&page='; 7 | 8 | let promises = []; 9 | for (let i = 1; i < 1500; i++) { 10 | promises.push(new Promise(resolve => { 11 | const request = new XMLHttpRequest(""); 12 | request.open('GET', url + i, false); 13 | request.send(); 14 | 15 | if (!request.responseText.startsWith('<')) { 16 | const res = JSON.parse(request.responseText); 17 | 18 | for (let sig of res.results) { 19 | console.log(`"${sig.hex_signature}":"${sig.text_signature}",`); 20 | } 21 | } 22 | 23 | resolve(); 24 | })); 25 | 26 | if (promises.length >= batch_size) { 27 | await Promise.all(promises); 28 | promises = []; 29 | console.error(`Downloaded ${promises.length} pages ${i - batch_size + 1}..${i}`); 30 | } 31 | } 32 | 33 | await Promise.all(promises); 34 | })(); 35 | 36 | // Need to remove last comma in array 37 | -------------------------------------------------------------------------------- /jquery-simplefolders/main.css: -------------------------------------------------------------------------------- 1 | .tree { margin: 0 0 0 4px; } 2 | .tree,.tree ul { 3 | list-style-type: none; 4 | position: relative; 5 | padding: 0; 6 | cursor: default; 7 | border-left: 1px dotted #ccc; 8 | } 9 | .tree ul { 10 | margin: 0; 11 | display: none; 12 | } 13 | .tree li { 14 | position: relative; 15 | margin: 0 0 0 10px; 16 | padding: 2px 0 2px 0; 17 | } 18 | /* extend a line to the list item */ 19 | .tree li:before { 20 | position: absolute; 21 | top: 10px; left: -9px; height: 1px; width: 5px; 22 | border-top: 1px dotted #ccc; 23 | content: ' '; 24 | } 25 | 26 | /* erase all lines for last item */ 27 | .tree li:last-child:after { 28 | position: absolute; 29 | top: 17px; left: -13px; bottom: 0; width: 7px; 30 | background-color: white; 31 | content: ' '; 32 | } 33 | /* add expander widget */ 34 | .tree .expander { 35 | background: #fff url(icons.png) no-repeat scroll; 36 | background-position: -64px -4px; 37 | position: absolute; 38 | top: 8px; left: -15px; 39 | height: 9px; width: 9px; 40 | cursor: pointer; 41 | } 42 | .tree .expander:hover { background-color: #eee; } 43 | .tree .expander.expanded { background-position: -78px -4px; } 44 | .tree ul.expanded { display: block; } 45 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Parity Traces Decoder 5 | 6 | 7 | 8 | 9 | 10 | 11 | 23 | 24 | 25 | 26 | 27 |
28 |
29 | 30 | 31 |
32 |
33 |
34 |
35 |
36 |
37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 69 | 70 | -------------------------------------------------------------------------------- /github.js: -------------------------------------------------------------------------------- 1 | const XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest; 2 | const request = require('request'); 3 | const throttledRequest = require('throttled-request')(request); 4 | const fs = require('fs'); 5 | 6 | throttledRequest.configure({ 7 | requests: 1, 8 | milliseconds: 2100 9 | }); 10 | 11 | function urlWithHeaders(url) { 12 | return { 13 | url: url, 14 | headers: { 15 | 'Authorization': 'token ***', 16 | 'User-Agent': '4bytes' 17 | } 18 | }; 19 | } 20 | 21 | function urlWithHeadersWithMatches(url) { 22 | const options = urlWithHeaders(url); 23 | options.headers.Accept = 'application/vnd.github.v3.text-match+json'; 24 | return options; 25 | } 26 | 27 | (async function () { 28 | let page = 0; 29 | const uniqueFunctions = {}; 30 | while (page < 10000) { 31 | let json; 32 | await new Promise(done => throttledRequest(urlWithHeadersWithMatches(`https://api.github.com/search/code?q=function+extension:sol&page=${page}&per_page=100`), function(error, response, searchBody) { 33 | json = JSON.parse(searchBody); 34 | done(); 35 | })); 36 | 37 | if (json.items == undefined) { 38 | console.error(json); 39 | await new Promise(done => setTimeout(done, 120000)); 40 | continue; 41 | } 42 | 43 | for (let item of json.items) { 44 | for (let match of item.text_matches) { 45 | //console.log('>' + JSON.stringify(match.fragment)); 46 | for (let micro_match of match.matches) { 47 | //console.log('-' + JSON.stringify(micro_match)); 48 | const from = micro_match.indices[0]; 49 | const to = match.fragment.indexOf(')', from); 50 | if (to != -1) { 51 | const text = match.fragment.substr(from + 8, match.fragment.indexOf(')', from) - from + 1 - 8).trim(); 52 | if (text.match(/^[0-9a-zA-Z_]+\(([0-9a-zA-Z_\[\]]+\s+[0-9a-zA-Z_]+,\s*)*\s*([0-9a-zA-Z_\[\]]+\s+[0-9a-zA-Z_]+)?\s*\)$/)) { 53 | const fun = text.replace(/\s*([0-9a-zA-Z\[\]]+)\s+[0-9a-zA-Z_]+\s*/g, '$1'); 54 | const tokens = fun.split(/[,\(\)]/); 55 | const res = tokens[0] + '(' + tokens.slice(1, -1).map(t => { 56 | if (t.length != 0 && 57 | !t.startsWith('int') && !t.startsWith('uint') && 58 | !t.startsWith('address') && !t.startsWith('byte') && 59 | !t.startsWith('string') && !t.startsWith('bool')) 60 | { 61 | return 'address'; 62 | } 63 | return t; 64 | }).join(',') + ')'; 65 | 66 | if (!uniqueFunctions[res]) { 67 | uniqueFunctions[res] = true; 68 | console.log(res); 69 | } 70 | } 71 | } 72 | } 73 | } 74 | } 75 | 76 | console.error(`Downloaded page ${page}`); 77 | page += 1; 78 | } 79 | })(); 80 | -------------------------------------------------------------------------------- /decoder.js: -------------------------------------------------------------------------------- 1 | const BigNumber = require('bn.js'); 2 | const abi = require('ethereumjs-abi'); 3 | 4 | decoder = function (traces, methods) { 5 | const tree = {}; 6 | for (let trace of traces) { 7 | let subtree = tree; 8 | for (let index of trace.traceAddress) { 9 | if (!subtree[index]) { 10 | subtree[index] = {}; 11 | } 12 | subtree = subtree[index]; 13 | } 14 | 15 | subtree.trace = trace; 16 | } 17 | 18 | function printArg(type, value) { 19 | if (type.startsWith('int') || type.startsWith('uint') || type == 'address') { 20 | return '(' + type + ')(0x' + value.toString(16) + ')'; 21 | } 22 | if (type.startsWith('bytes')) { 23 | return '(' + type + ')(0x' + value.toString('hex') + ')'; 24 | } 25 | if (type.startsWith('string')) { 26 | return '(' + type + ')("' + value.toString() + '")'; 27 | } 28 | return '(' + type + ')(' + value + ')'; 29 | } 30 | 31 | function recursivePrint(tree, index = 1, tab = '') { 32 | const error = function () { 33 | if (tree.trace.error == 'Reverted') { 34 | return '*'; 35 | } 36 | if (tree.trace.error == 'Bad instruction') { 37 | return '#'; 38 | } 39 | if (tree.trace.error == 'Bad jump destination') { 40 | return '?'; 41 | } 42 | if (tree.trace.error == 'Out of gas') { 43 | return '$'; 44 | } 45 | if (tree.trace.error == 'Mutable Call In Static Context') { 46 | return '%'; 47 | } 48 | return ' '; 49 | }(); 50 | 51 | let value = new BigNumber((tree.trace.action.value || '').substr(2), 16); 52 | if (tree.trace.type == 'suicide') { 53 | value = new BigNumber(tree.trace.action.balance.substr(2), 16); 54 | } 55 | const methodId = (tree.trace.action.input || '').substr(0,10); 56 | const method = (methods || {})[methodId] || methodId; 57 | 58 | let methodStr = method + '(0x' + (tree.trace.action.input || '').substr(10) + ')'; 59 | let parsedArguments = []; 60 | if (method.endsWith(')')) { 61 | const input = (tree.trace.action.input || '').substr(10); 62 | const methodName = method.split('(')[0]; 63 | 64 | let inTypes; 65 | if (method.indexOf('(') == method.lastIndexOf('(')) { 66 | 67 | inTypes = method.split(/[(),]+/).slice(1, -1); 68 | } else { 69 | 70 | inTypes = []; 71 | let iter = inTypes; 72 | const backs = []; 73 | for (let letter of method.substr(method.indexOf('(') + 1)) { 74 | if (letter == '(') { 75 | iter.push([]); 76 | backs.push(iter); 77 | iter = iter[iter.length - 1]; 78 | } else 79 | if (letter == ')') { 80 | iter = backs.pop(); 81 | } else 82 | if (letter == ',') { 83 | iter.push(""); 84 | } else { 85 | if (iter.length == 0 || typeof(iter[iter.length - 1]) != 'string') { 86 | iter.push(""); 87 | } 88 | iter[iter.length - 1] = iter[iter.length - 1] + letter; 89 | } 90 | } 91 | } 92 | 93 | let inDecoded; 94 | try { 95 | inDecoded = abi.rawDecode(inTypes, Buffer.from(input, 'hex')); 96 | parsedArguments = inTypes.map((type, i) => printArg(type, inDecoded[i])); 97 | methodStr = methodName + '(' + parsedArguments + ')'; 98 | } catch(e) { 99 | } 100 | } 101 | 102 | let shortResult = '0x'; 103 | if (tree.trace.result && tree.trace.result.output) { 104 | shortResult = tree.trace.result.output.replace(/0x0+/, '0x'); 105 | methodStr += ':' + (shortResult == '0x' ? '0x0' : shortResult); 106 | } 107 | 108 | var result = (tab.length == 0 ? '' + 109 | ['Err', '#', 'Tree', 'To', 'Value', 'Gas Left', 'Gas Used'].map(a => ``).join('') + 110 | '' : '') + ''; 111 | 112 | const prefix = tab.split('').map(x => ' ').join(''); 113 | 114 | result += 115 | `` + 116 | `` + 117 | `` + 125 | `` + 126 | `` + 127 | `` + 128 | ``; 129 | 130 | if (Object.keys(tree).length > 0) { 131 | let anyLeaf = false; 132 | for (let leaf of Object.keys(tree)) { 133 | if (leaf != 'trace') { 134 | let str; 135 | [str, index] = recursivePrint(tree[leaf], index, tab + ' '); 136 | result += str; 137 | } 138 | } 139 | } 140 | result += '' + (tab.length == 0 ? '
${a}
${error}[${index++}]` + 118 | '
  • ' + prefix + (tree.trace.type == 'suicide' ? `selfdestruct(${tree.trace.action.to || tree.trace.action.refundAddress})` : methodStr) + 119 | '
      ' + 120 | `
    • ${prefix}[ARGUMENTS]:
    • ` + 121 | parsedArguments.map(a => '
    •   ' + prefix + a + '
    • ').join('') + 122 | (shortResult.length == '0x' ? '' : `
    • ${prefix}[RETURN]:
    •   ${prefix + shortResult}
    • `) + 123 | '
' + 124 | `
 ${tree.trace.action.to || tree.trace.action.refundAddress}  ` + (value.isZero() ? '0' : Number.parseInt(value.toString())/10**18) + ` ETH  ` + (tree.trace.action.gas ? parseInt(tree.trace.action.gas.substr(2), 16) : '') + `  ` + ((tree.trace.result && tree.trace.result.gasUsed) ? parseInt(tree.trace.result.gasUsed.substr(2), 16) + 700 : '') + ` 
' : ''); 141 | 142 | return [result, index]; 143 | } 144 | 145 | return recursivePrint(tree)[0];// + '\n'; 146 | }; 147 | 148 | module.exports = decoder; 149 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # parity-trace-decoder 2 | 3 | Parity Trace Decoder to call tree 4 | 5 | # Usage 6 | 7 | Try web version here: https://k06a.github.io/parity-trace-decoder/ 8 | 9 | Install dependencies 10 | ``` 11 | npm install 12 | ``` 13 | 14 | Run main script with file name argument, containing parity traces JSON array 15 | ``` 16 | node index.js 1.json 17 | ``` 18 | 19 | Example of transaction [0x1d3aac5004de6d3027eb6c8ec86bde589db4d563f26428e8738d36d07ef7994e](https://etherscan.io/tx/0x1d3aac5004de6d3027eb6c8ec86bde589db4d563f26428e8738d36d07ef7994e) parity trace decoding 20 | 21 | ``` 22 | * [1] approveAndCall((address)(0x12863901098aa24fa81f1ab952a449f6c8211afc),(uint256)(0xde0b6b3a7640000),(bytes)(0xfae9e186000000000000000000000000e1e83a85c9db1bbd7cfab3e6bffaf255c5013adb0000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000640000000000000000000000000787b7c484fba6237dc156f9551c0bc804570c1d90000000000000000000000000000000000000000000000000000000000000004000000000000000000000000f20b9e713a33f61fa38792d2afaf1cd30339126a000000000000000000000000f20b9e713a33f61fa38792d2afaf1cd30339126a000000000000000000000000f20b9e713a33f61fa38792d2afaf1cd30339126a000000000000000000000000f20b9e713a33f61fa38792d2afaf1cd30339126a0000000000000000000000000000000000000000000000000000000000000490c7ba24bc000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000007ac4000faeb84ec0000000000000000000000000000000000000000000000000001835aeb7d071600000000000000000000000000000000000000000000000000000000000000050000000000000000000000000d8775f648430679a709e98d2b0cb6250d2887ef000000000000000000000000131da075a2832549128e93acc2b54174045232cf0000000000000000000000001f573d6fb3f13d689ff844b4ce37794d79a7ff1c0000000000000000000000001f573d6fb3f13d689ff844b4ce37794d79a7ff1c000000000000000000000000c0829421c1d260bd3cb3e0f06cfe2d52db2ce315c7ba24bc00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000007e73ecbb24d58763000000000000000000000000000000000000000000000000000117824da7be6c0000000000000000000000000000000000000000000000000000000000000005000000000000000000000000d0a4b8946cb52f0661273bfbc6fd0e0c75fc6433000000000000000000000000cad4da66e00fdecabec137a24e12af8edf303a1d0000000000000000000000001f573d6fb3f13d689ff844b4ce37794d79a7ff1c0000000000000000000000001f573d6fb3f13d689ff844b4ce37794d79a7ff1c000000000000000000000000c0829421c1d260bd3cb3e0f06cfe2d52db2ce315c7ba24bc000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000080616f0aec0ea6f2000000000000000000000000000000000000000000000000000000000000431200000000000000000000000000000000000000000000000000000000000000050000000000000000000000000d262e5dc4a06a0f1c90ce79c7a60c09dfc884e40000000000000000000000008e00bacd7d8265d8f3f9d5b4fbd7f6b0b0c46f360000000000000000000000001f573d6fb3f13d689ff844b4ce37794d79a7ff1c0000000000000000000000001f573d6fb3f13d689ff844b4ce37794d79a7ff1c000000000000000000000000c0829421c1d260bd3cb3e0f06cfe2d52db2ce315c7ba24bc0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000a3306518fc65fc5e00000000000000000000000000000000000000000000000000004cae9d7b9a8f000000000000000000000000000000000000000000000000000000000000000500000000000000000000000084f7c44b6fed1080f647e354d552595be2cc602f000000000000000000000000980b4118dab781829df80d7912d70b059a280dad0000000000000000000000001f573d6fb3f13d689ff844b4ce37794d79a7ff1c0000000000000000000000001f573d6fb3f13d689ff844b4ce37794d79a7ff1c000000000000000000000000c0829421c1d260bd3cb3e0f06cfe2d52db2ce315000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001240000000000000000000000000000000000000000000000000000000000000248000000000000000000000000000000000000000000000000000000000000036c0000000000000000000000000000000000000000000000000000000000000490)) 23 | [2] makeCall((address)(0x12863901098aa24fa81f1ab952a449f6c8211afc),(bytes)(0xfae9e186000000000000000000000000e1e83a85c9db1bbd7cfab3e6bffaf255c5013adb0000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000640000000000000000000000000787b7c484fba6237dc156f9551c0bc804570c1d90000000000000000000000000000000000000000000000000000000000000004000000000000000000000000f20b9e713a33f61fa38792d2afaf1cd30339126a000000000000000000000000f20b9e713a33f61fa38792d2afaf1cd30339126a000000000000000000000000f20b9e713a33f61fa38792d2afaf1cd30339126a000000000000000000000000f20b9e713a33f61fa38792d2afaf1cd30339126a0000000000000000000000000000000000000000000000000000000000000490c7ba24bc000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000007ac4000faeb84ec0000000000000000000000000000000000000000000000000001835aeb7d071600000000000000000000000000000000000000000000000000000000000000050000000000000000000000000d8775f648430679a709e98d2b0cb6250d2887ef000000000000000000000000131da075a2832549128e93acc2b54174045232cf0000000000000000000000001f573d6fb3f13d689ff844b4ce37794d79a7ff1c0000000000000000000000001f573d6fb3f13d689ff844b4ce37794d79a7ff1c000000000000000000000000c0829421c1d260bd3cb3e0f06cfe2d52db2ce315c7ba24bc00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000007e73ecbb24d58763000000000000000000000000000000000000000000000000000117824da7be6c0000000000000000000000000000000000000000000000000000000000000005000000000000000000000000d0a4b8946cb52f0661273bfbc6fd0e0c75fc6433000000000000000000000000cad4da66e00fdecabec137a24e12af8edf303a1d0000000000000000000000001f573d6fb3f13d689ff844b4ce37794d79a7ff1c0000000000000000000000001f573d6fb3f13d689ff844b4ce37794d79a7ff1c000000000000000000000000c0829421c1d260bd3cb3e0f06cfe2d52db2ce315c7ba24bc000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000080616f0aec0ea6f2000000000000000000000000000000000000000000000000000000000000431200000000000000000000000000000000000000000000000000000000000000050000000000000000000000000d262e5dc4a06a0f1c90ce79c7a60c09dfc884e40000000000000000000000008e00bacd7d8265d8f3f9d5b4fbd7f6b0b0c46f360000000000000000000000001f573d6fb3f13d689ff844b4ce37794d79a7ff1c0000000000000000000000001f573d6fb3f13d689ff844b4ce37794d79a7ff1c000000000000000000000000c0829421c1d260bd3cb3e0f06cfe2d52db2ce315c7ba24bc0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000a3306518fc65fc5e00000000000000000000000000000000000000000000000000004cae9d7b9a8f000000000000000000000000000000000000000000000000000000000000000500000000000000000000000084f7c44b6fed1080f647e354d552595be2cc602f000000000000000000000000980b4118dab781829df80d7912d70b059a280dad0000000000000000000000001f573d6fb3f13d689ff844b4ce37794d79a7ff1c0000000000000000000000001f573d6fb3f13d689ff844b4ce37794d79a7ff1c000000000000000000000000c0829421c1d260bd3cb3e0f06cfe2d52db2ce315000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001240000000000000000000000000000000000000000000000000000000000000248000000000000000000000000000000000000000000000000000000000000036c0000000000000000000000000000000000000000000000000000000000000490)):0x0 24 | * [3] 0xfae9e186(0x000000000000000000000000e1e83a85c9db1bbd7cfab3e6bffaf255c5013adb0000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000640000000000000000000000000787b7c484fba6237dc156f9551c0bc804570c1d90000000000000000000000000000000000000000000000000000000000000004000000000000000000000000f20b9e713a33f61fa38792d2afaf1cd30339126a000000000000000000000000f20b9e713a33f61fa38792d2afaf1cd30339126a000000000000000000000000f20b9e713a33f61fa38792d2afaf1cd30339126a000000000000000000000000f20b9e713a33f61fa38792d2afaf1cd30339126a0000000000000000000000000000000000000000000000000000000000000490c7ba24bc000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000007ac4000faeb84ec0000000000000000000000000000000000000000000000000001835aeb7d071600000000000000000000000000000000000000000000000000000000000000050000000000000000000000000d8775f648430679a709e98d2b0cb6250d2887ef000000000000000000000000131da075a2832549128e93acc2b54174045232cf0000000000000000000000001f573d6fb3f13d689ff844b4ce37794d79a7ff1c0000000000000000000000001f573d6fb3f13d689ff844b4ce37794d79a7ff1c000000000000000000000000c0829421c1d260bd3cb3e0f06cfe2d52db2ce315c7ba24bc00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000007e73ecbb24d58763000000000000000000000000000000000000000000000000000117824da7be6c0000000000000000000000000000000000000000000000000000000000000005000000000000000000000000d0a4b8946cb52f0661273bfbc6fd0e0c75fc6433000000000000000000000000cad4da66e00fdecabec137a24e12af8edf303a1d0000000000000000000000001f573d6fb3f13d689ff844b4ce37794d79a7ff1c0000000000000000000000001f573d6fb3f13d689ff844b4ce37794d79a7ff1c000000000000000000000000c0829421c1d260bd3cb3e0f06cfe2d52db2ce315c7ba24bc000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000080616f0aec0ea6f2000000000000000000000000000000000000000000000000000000000000431200000000000000000000000000000000000000000000000000000000000000050000000000000000000000000d262e5dc4a06a0f1c90ce79c7a60c09dfc884e40000000000000000000000008e00bacd7d8265d8f3f9d5b4fbd7f6b0b0c46f360000000000000000000000001f573d6fb3f13d689ff844b4ce37794d79a7ff1c0000000000000000000000001f573d6fb3f13d689ff844b4ce37794d79a7ff1c000000000000000000000000c0829421c1d260bd3cb3e0f06cfe2d52db2ce315c7ba24bc0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000a3306518fc65fc5e00000000000000000000000000000000000000000000000000004cae9d7b9a8f000000000000000000000000000000000000000000000000000000000000000500000000000000000000000084f7c44b6fed1080f647e354d552595be2cc602f000000000000000000000000980b4118dab781829df80d7912d70b059a280dad0000000000000000000000001f573d6fb3f13d689ff844b4ce37794d79a7ff1c0000000000000000000000001f573d6fb3f13d689ff844b4ce37794d79a7ff1c000000000000000000000000c0829421c1d260bd3cb3e0f06cfe2d52db2ce315000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001240000000000000000000000000000000000000000000000000000000000000248000000000000000000000000000000000000000000000000000000000000036c0000000000000000000000000000000000000000000000000000000000000490) 25 | [4] tokensCount():0x4 26 | [5] transferFrom((address)(0xd98123195b7692b57518198e7fe877fec592f204),(address)(0x12863901098aa24fa81f1ab952a449f6c8211afc),(uint256)(0xde0b6b3a7640000)):0x1 27 | [6] 0xb4dc3dc7(0x00000000000000000000000012863901098aa24fa81f1ab952a449f6c8211afc0000000000000000000000000000000000000000000000000de0b6b3a7640000):0x0 28 | [7] balanceOf((address)(0xe1e83a85c9db1bbd7cfab3e6bffaf255c5013adb)):0x370168a3169e85d83 29 | [8] balanceOf((address)(0xe1e83a85c9db1bbd7cfab3e6bffaf255c5013adb)):0x370168a3169e85d83 30 | [9] transfer((address)(0x12863901098aa24fa81f1ab952a449f6c8211afc),(uint256)(0x7ac4000faeb84ec)):0x1 31 | [10] balanceOf((address)(0xe1e83a85c9db1bbd7cfab3e6bffaf255c5013adb)):0x3686a4a306efcd897 32 | [11] balanceOf((address)(0xe1e83a85c9db1bbd7cfab3e6bffaf255c5013adb)):0x38a8563f89b31b9585 33 | [12] balanceOf((address)(0xe1e83a85c9db1bbd7cfab3e6bffaf255c5013adb)):0x38a8563f89b31b9585 34 | [13] transfer((address)(0x12863901098aa24fa81f1ab952a449f6c8211afc),(uint256)(0x7e73ecbb24d58763)):0x1 35 | [14] balanceOf((address)(0xe1e83a85c9db1bbd7cfab3e6bffaf255c5013adb)):0x3829e252ce8e460e22 36 | [15] balanceOf((address)(0xe1e83a85c9db1bbd7cfab3e6bffaf255c5013adb)):0x18b488e8e7 37 | [16] balanceOf((address)(0xe1e83a85c9db1bbd7cfab3e6bffaf255c5013adb)):0x18b488e8e7 38 | [17] transfer((address)(0x12863901098aa24fa81f1ab952a449f6c8211afc),(uint256)(0x372398a8)):0x1 39 | [18] balanceOf((address)(0xe1e83a85c9db1bbd7cfab3e6bffaf255c5013adb)):0x187d65503f 40 | [19] balanceOf((address)(0xe1e83a85c9db1bbd7cfab3e6bffaf255c5013adb)):0x491e09a4c4dad63aa6 41 | [20] balanceOf((address)(0xe1e83a85c9db1bbd7cfab3e6bffaf255c5013adb)):0x491e09a4c4dad63aa6 42 | [21] transfer((address)(0x12863901098aa24fa81f1ab952a449f6c8211afc),(uint256)(0xa3306518fc65fc5e)):0x1 43 | [22] balanceOf((address)(0xe1e83a85c9db1bbd7cfab3e6bffaf255c5013adb)):0x487ad93fabde703e48 44 | [23] tokens((uint256)(0x0)):0xd8775f648430679a709e98d2b0cb6250d2887ef 45 | [24] balanceOf((address)(0x12863901098aa24fa81f1ab952a449f6c8211afc)):0x7ac4000faeb84ec 46 | [25] approve((address)(0xf20b9e713a33f61fa38792d2afaf1cd30339126a),(uint256)(0x7ac4000faeb84ec)):0x1 47 | [26] claimAndConvert((address[])(0d8775f648430679a709e98d2b0cb6250d2887ef,131da075a2832549128e93acc2b54174045232cf,1f573d6fb3f13d689ff844b4ce37794d79a7ff1c,1f573d6fb3f13d689ff844b4ce37794d79a7ff1c,c0829421c1d260bd3cb3e0f06cfe2d52db2ce315),(uint256)(0x7ac4000faeb84ec),(uint256)(0x1835aeb7d0716)):0x18bb79faa28c0 48 | [27] transferFrom((address)(0x12863901098aa24fa81f1ab952a449f6c8211afc),(address)(0xf20b9e713a33f61fa38792d2afaf1cd30339126a),(uint256)(0x7ac4000faeb84ec)):0x1 49 | [28] validateGasPrice((uint256)(0xb2d05e00)):0x0 50 | [29] getAddress((bytes32)(0x436f6e7472616374466561747572657300000000000000000000000000000000)):0x563172281800b139f69fb038cc2c08cad56ce699 51 | [30] owner():0x46ffcdc6d8e6ed69f124d944bbfe0ac74f8fcf7f 52 | [31] isSupported((address)(0x46ffcdc6d8e6ed69f124d944bbfe0ac74f8fcf7f),(uint256)(0x1)):0x1 53 | [32] conversionWhitelist():0x0 54 | [33] allowance((address)(0xf20b9e713a33f61fa38792d2afaf1cd30339126a),(address)(0x46ffcdc6d8e6ed69f124d944bbfe0ac74f8fcf7f)):0x0 55 | [34] allowance((address)(0xf20b9e713a33f61fa38792d2afaf1cd30339126a),(address)(0x46ffcdc6d8e6ed69f124d944bbfe0ac74f8fcf7f)):0x0 56 | [35] approve((address)(0x46ffcdc6d8e6ed69f124d944bbfe0ac74f8fcf7f),(uint256)(0x7ac4000faeb84ec)):0x1 57 | [36] change((address)(0x0d8775f648430679a709e98d2b0cb6250d2887ef),(address)(0x1f573d6fb3f13d689ff844b4ce37794d79a7ff1c),(uint256)(0x7ac4000faeb84ec),(uint256)(0x1)):0x1024321304c0e2d 58 | [37] getAddress((bytes32)(0x42616e636f724e6574776f726b00000000000000000000000000000000000000)):0xf20b9e713a33f61fa38792d2afaf1cd30339126a 59 | [38] owner():0x46ffcdc6d8e6ed69f124d944bbfe0ac74f8fcf7f 60 | [39] balanceOf((address)(0x46ffcdc6d8e6ed69f124d944bbfe0ac74f8fcf7f)):0xe8fbe767958c059db185 61 | [40] balanceOf((address)(0x46ffcdc6d8e6ed69f124d944bbfe0ac74f8fcf7f)):0x1eb1c5a67b67ccb0a015 62 | [41] getAddress((bytes32)(0x42616e636f72466f726d756c6100000000000000000000000000000000000000)):0xffd2de852b694f88656e91d9defa6b425c454742 63 | [42] calculateCrossConnectorReturn((uint256)(0xe8fbe767958c059db185),(uint32)(0x7a120),(uint256)(0x1eb1c5a67b67ccb0a015),(uint32)(0x7a120),(uint256)(0x7ac4000faeb84ec)):0x102c78efaafbc79 64 | [43] balanceOf((address)(0x46ffcdc6d8e6ed69f124d944bbfe0ac74f8fcf7f)):0x1eb1c5a67b67ccb0a015 65 | [44] transferFrom((address)(0xf20b9e713a33f61fa38792d2afaf1cd30339126a),(address)(0x46ffcdc6d8e6ed69f124d944bbfe0ac74f8fcf7f),(uint256)(0x7ac4000faeb84ec)):0x1 66 | [45] transfer((address)(0xf20b9e713a33f61fa38792d2afaf1cd30339126a),(uint256)(0x1024321304c0e2d)):0x1 67 | [46] totalSupply():0x276a250617ff40364058 68 | [47] balanceOf((address)(0x46ffcdc6d8e6ed69f124d944bbfe0ac74f8fcf7f)):0xe8fbef13d58d00893671 69 | [48] totalSupply():0x276a250617ff40364058 70 | [49] balanceOf((address)(0x46ffcdc6d8e6ed69f124d944bbfe0ac74f8fcf7f)):0x1eb1c4a438469c6491e8 71 | [50] owner():0x3839416bd0095d97be9b354cbfb0f6807d4d609e 72 | [51] isSupported((address)(0x3839416bd0095d97be9b354cbfb0f6807d4d609e),(uint256)(0x1)):0x1 73 | [52] conversionWhitelist():0x0 74 | [53] change((address)(0x1f573d6fb3f13d689ff844b4ce37794d79a7ff1c),(address)(0xc0829421c1d260bd3cb3e0f06cfe2d52db2ce315),(uint256)(0x1024321304c0e2d),(uint256)(0x1835aeb7d0716)):0x18bb79faa28c0 75 | [54] getAddress((bytes32)(0x42616e636f724e6574776f726b00000000000000000000000000000000000000)):0xf20b9e713a33f61fa38792d2afaf1cd30339126a 76 | [55] balanceOf((address)(0xf20b9e713a33f61fa38792d2afaf1cd30339126a)):0x1024321304c0e30 77 | [56] owner():0x3839416bd0095d97be9b354cbfb0f6807d4d609e 78 | [57] totalSupply():0x4035db94501ade767f9452 79 | [58] getAddress((bytes32)(0x42616e636f72466f726d756c6100000000000000000000000000000000000000)):0xffd2de852b694f88656e91d9defa6b425c454742 80 | [59] calculateSaleReturn((uint256)(0x4035db94501ade767f9452),(uint256)(0x9d6a8aa18d1f40f4a55),(uint32)(0x186a0),(uint256)(0x1024321304c0e2d)):0x18bb79faa28c0 81 | [60] totalSupply():0x4035db94501ade767f9452 82 | [61] destroy((address)(0xf20b9e713a33f61fa38792d2afaf1cd30339126a),(uint256)(0x1024321304c0e2d)):0x0 83 | [62] transfer((address)(0xf20b9e713a33f61fa38792d2afaf1cd30339126a),(uint256)(0x18bb79faa28c0)):0x1 84 | [63] totalSupply():0x4035db934dd7bd46338625 85 | [64] withdrawTo((address)(0x12863901098aa24fa81f1ab952a449f6c8211afc),(uint256)(0x18bb79faa28c0)):0x0 86 | [65] 0x(0x):0x0 // => 0.000435095750715584 ETH 87 | [66] tokens((uint256)(0x1)):0xd0a4b8946cb52f0661273bfbc6fd0e0c75fc6433 88 | [67] balanceOf((address)(0x12863901098aa24fa81f1ab952a449f6c8211afc)):0x7e73ecbb24d58763 89 | [68] approve((address)(0xf20b9e713a33f61fa38792d2afaf1cd30339126a),(uint256)(0x7e73ecbb24d58763)):0x1 90 | [69] claimAndConvert((address[])(d0a4b8946cb52f0661273bfbc6fd0e0c75fc6433,cad4da66e00fdecabec137a24e12af8edf303a1d,1f573d6fb3f13d689ff844b4ce37794d79a7ff1c,1f573d6fb3f13d689ff844b4ce37794d79a7ff1c,c0829421c1d260bd3cb3e0f06cfe2d52db2ce315),(uint256)(0x7e73ecbb24d58763),(uint256)(0x117824da7be6c)):0x11cd9a7239090 91 | [70] transferFrom((address)(0x12863901098aa24fa81f1ab952a449f6c8211afc),(address)(0xf20b9e713a33f61fa38792d2afaf1cd30339126a),(uint256)(0x7e73ecbb24d58763)):0x1 92 | [71] validateGasPrice((uint256)(0xb2d05e00)):0x0 93 | [72] getAddress((bytes32)(0x436f6e7472616374466561747572657300000000000000000000000000000000)):0x563172281800b139f69fb038cc2c08cad56ce699 94 | [73] owner():0x58b249b613ce917b6ccc2f66787856ef39f4f0b6 95 | [74] isSupported((address)(0x58b249b613ce917b6ccc2f66787856ef39f4f0b6),(uint256)(0x1)):0x0 96 | [75] allowance((address)(0xf20b9e713a33f61fa38792d2afaf1cd30339126a),(address)(0x58b249b613ce917b6ccc2f66787856ef39f4f0b6)):0x0 97 | [76] allowance((address)(0xf20b9e713a33f61fa38792d2afaf1cd30339126a),(address)(0x58b249b613ce917b6ccc2f66787856ef39f4f0b6)):0x0 98 | [77] approve((address)(0x58b249b613ce917b6ccc2f66787856ef39f4f0b6),(uint256)(0x7e73ecbb24d58763)):0x1 99 | [78] change((address)(0xd0a4b8946cb52f0661273bfbc6fd0e0c75fc6433),(address)(0x1f573d6fb3f13d689ff844b4ce37794d79a7ff1c),(uint256)(0x7e73ecbb24d58763),(uint256)(0x1)):0xb9e7d3cdaf0c6e 100 | [79] gasPriceLimit():0x607a5c47978e2eb6d59c6c6f51bc0bf411f4b85a 101 | [80] gasPrice():0x165a0bc00 102 | [81] owner():0x58b249b613ce917b6ccc2f66787856ef39f4f0b6 103 | [82] totalSupply():0x397cf00bef9cb2756c37 104 | [83] balanceOf((address)(0x58b249b613ce917b6ccc2f66787856ef39f4f0b6)):0x25e1c8185650b0cf56caab 105 | [84] formula():0xffd2de852b694f88656e91d9defa6b425c454742 106 | [85] calculatePurchaseReturn((uint256)(0x397cf00bef9cb2756c37),(uint256)(0x25e1c8185650b0cf56caab),(uint32)(0x7a120),(uint256)(0x7e73ecbb24d58763)):0x5ff31f164dd756 107 | [86] transferFrom((address)(0xf20b9e713a33f61fa38792d2afaf1cd30339126a),(address)(0x58b249b613ce917b6ccc2f66787856ef39f4f0b6),(uint256)(0x7e73ecbb24d58763)):0x1 108 | [87] issue((address)(0xf20b9e713a33f61fa38792d2afaf1cd30339126a),(uint256)(0x5fda8eed93e846)):0x0 109 | [88] balanceOf((address)(0x58b249b613ce917b6ccc2f66787856ef39f4f0b6)):0x25e1c896ca3d6bf42c520e 110 | [89] totalSupply():0x397cf06bca2ba009547d 111 | [90] decimals():0x12 112 | [91] decimals():0x12 113 | [92] gasPriceLimit():0x607a5c47978e2eb6d59c6c6f51bc0bf411f4b85a 114 | [93] gasPrice():0x165a0bc00 115 | [94] balanceOf((address)(0xf20b9e713a33f61fa38792d2afaf1cd30339126a)):0x5fda8eed93e846 116 | [95] totalSupply():0x397cf06bca2ba009547d 117 | [96] owner():0x58b249b613ce917b6ccc2f66787856ef39f4f0b6 118 | [97] balanceOf((address)(0x58b249b613ce917b6ccc2f66787856ef39f4f0b6)):0x37cdd38fd33bd6c0db40 119 | [98] formula():0xffd2de852b694f88656e91d9defa6b425c454742 120 | [99] calculateSaleReturn((uint256)(0x397cf06bca2ba009547d),(uint256)(0x37cdd38fd33bd6c0db40),(uint32)(0x7a120),(uint256)(0x5fda8eed93e846)):0xba177781c814a4 121 | [100] totalSupply():0x397cf06bca2ba009547d 122 | [101] balanceOf((address)(0x58b249b613ce917b6ccc2f66787856ef39f4f0b6)):0x37cdd38fd33bd6c0db40 123 | [102] destroy((address)(0xf20b9e713a33f61fa38792d2afaf1cd30339126a),(uint256)(0x5fda8eed93e846)):0x0 124 | [103] transfer((address)(0xf20b9e713a33f61fa38792d2afaf1cd30339126a),(uint256)(0xb9e7d3cdaf0c6e)):0x1 125 | [104] balanceOf((address)(0x58b249b613ce917b6ccc2f66787856ef39f4f0b6)):0x37cdd2d5eb680911ced2 126 | [105] totalSupply():0x397cf00bef9cb2756c37 127 | [106] decimals():0x12 128 | [107] decimals():0x12 129 | [108] owner():0x3839416bd0095d97be9b354cbfb0f6807d4d609e 130 | [109] isSupported((address)(0x3839416bd0095d97be9b354cbfb0f6807d4d609e),(uint256)(0x1)):0x1 131 | [110] conversionWhitelist():0x0 132 | [111] change((address)(0x1f573d6fb3f13d689ff844b4ce37794d79a7ff1c),(address)(0xc0829421c1d260bd3cb3e0f06cfe2d52db2ce315),(uint256)(0xb9e7d3cdaf0c6e),(uint256)(0x117824da7be6c)):0x11cd9a7239090 133 | [112] getAddress((bytes32)(0x42616e636f724e6574776f726b00000000000000000000000000000000000000)):0xf20b9e713a33f61fa38792d2afaf1cd30339126a 134 | [113] balanceOf((address)(0xf20b9e713a33f61fa38792d2afaf1cd30339126a)):0xb9e7d3cdaf0c71 135 | [114] owner():0x3839416bd0095d97be9b354cbfb0f6807d4d609e 136 | [115] totalSupply():0x4035db934dd7bd46338625 137 | [116] getAddress((bytes32)(0x42616e636f72466f726d756c6100000000000000000000000000000000000000)):0xffd2de852b694f88656e91d9defa6b425c454742 138 | [117] calculateSaleReturn((uint256)(0x4035db934dd7bd46338625),(uint256)(0x9d6a8a88d1a54652195),(uint32)(0x186a0),(uint256)(0xb9e7d3cdaf0c6e)):0x11cd9a7239090 139 | [118] totalSupply():0x4035db934dd7bd46338625 140 | [119] destroy((address)(0xf20b9e713a33f61fa38792d2afaf1cd30339126a),(uint256)(0xb9e7d3cdaf0c6e)):0x0 141 | [120] transfer((address)(0xf20b9e713a33f61fa38792d2afaf1cd30339126a),(uint256)(0x11cd9a7239090)):0x1 142 | [121] totalSupply():0x4035db9293efe9788479b7 143 | [122] withdrawTo((address)(0x12863901098aa24fa81f1ab952a449f6c8211afc),(uint256)(0x11cd9a7239090)):0x0 144 | [123] 0x(0x):0x0 // => 0.000313196114317456 ETH 145 | [124] tokens((uint256)(0x2)):0xd262e5dc4a06a0f1c90ce79c7a60c09dfc884e4 146 | [125] balanceOf((address)(0x12863901098aa24fa81f1ab952a449f6c8211afc)):0x372398a8 147 | [126] approve((address)(0xf20b9e713a33f61fa38792d2afaf1cd30339126a),(uint256)(0x372398a8)):0x1 148 | * [127] claimAndConvert((address[])(0d262e5dc4a06a0f1c90ce79c7a60c09dfc884e4,8e00bacd7d8265d8f3f9d5b4fbd7f6b0b0c46f36,1f573d6fb3f13d689ff844b4ce37794d79a7ff1c,1f573d6fb3f13d689ff844b4ce37794d79a7ff1c,c0829421c1d260bd3cb3e0f06cfe2d52db2ce315),(uint256)(0x80616f0aec0ea6f2),(uint256)(0x4312)) 149 | # [128] transferFrom((address)(0x12863901098aa24fa81f1ab952a449f6c8211afc),(address)(0xf20b9e713a33f61fa38792d2afaf1cd30339126a),(uint256)(0x80616f0aec0ea6f2)) 150 | ``` 151 | --------------------------------------------------------------------------------