Call tracer with address tracing support (#65)

* Tracing client package, basic utils.

* Start of address tracer.

* Rename trace CLI.

* Call tracer API.

* Tracing timeout, more traces.

* Integrate address tracer into call address tracer.
This commit is contained in:
Ashwin Phatak 2021-06-16 16:14:35 +05:30 committed by GitHub
parent 909242a827
commit 4e08f359fc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 12780 additions and 0 deletions

View File

@ -0,0 +1,106 @@
# Tracing Client
```bash
npx ts-node src/cli/get-tx-trace.ts --txHash 0xa58ec012f8b6d5baac684b9939287866deffa3806f4c8252a190f264cc07b872
npx ts-node src/cli/get-tx-trace.ts --txHash 0xa58ec012f8b6d5baac684b9939287866deffa3806f4c8252a190f264cc07b872 --tracer callTracer
npx ts-node src/cli/get-tx-trace.ts --txHash 0xa58ec012f8b6d5baac684b9939287866deffa3806f4c8252a190f264cc07b872 --tracerFile src/tracers/call_tracer.js
npx ts-node src/cli/get-tx-trace.ts --txHash 0xa58ec012f8b6d5baac684b9939287866deffa3806f4c8252a190f264cc07b872 --tracerFile src/tracers/address_tracer.js
```
Rinkeby:
```bash
npx ts-node src/cli/get-call-trace.ts --block 0x66bbe015dec07f55bc916dff724a962bca067fa0fcdd42eb211474ad609f87be --txFile test/tx/rinkeby-test.json --providerUrl http://rinkeby-testing.vdb.to:8545
npx ts-node src/cli/get-call-trace.ts --block 0x85C9ED --txFile test/tx/rinkeby-test.json --providerUrl http://rinkeby-testing.vdb.to:8545
```
Mainnet:
```bash
ssh geth@arch1.vdb.to -L 8545:127.0.0.1:8545
# https://etherscan.io/tx/0xab6b8315187d3333f2cad87eb861203c856b6cb997b0d58f2d96b6ea1a42c258
# Note: 43 internal transactions.
npx ts-node src/cli/get-tx-trace.ts --txHash 0xab6b8315187d3333f2cad87eb861203c856b6cb997b0d58f2d96b6ea1a42c258 --tracer callTracer
npx ts-node src/cli/get-tx-trace.ts --txHash 0xab6b8315187d3333f2cad87eb861203c856b6cb997b0d58f2d96b6ea1a42c258 --tracerFile src/tracers/address_tracer.js --timeout 20s
{
"0xf94d7953d44bdcc7a5585a61ed91899ef2d39524": 1,
"0x240c7488df044d2f69d66201ee59a296c64d714c": 1,
"0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8": 1,
"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48": 1,
"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2": 1,
"0x1f4de5cc412ff43db7663e39aaa04221ca9e995f": 1,
"0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3": 1,
"0x00004d59594796297b1b33f9dbc3fb1829ebaaf9": 0.6,
"0x0081a5107db14797df968e243e8918fec5c189ec": 0.6,
"0x41120695a494e1653b6c5fd69d8de0d301be2810": 0.75,
"0x0001ef68096b0199f8afcdd6eedbb16a461c1272": 0.6,
"0xfffd8963efd1fc6a506488495d951d5263988d26": 0.75,
"0x00004d6d099aa3197c9a709447db6b6a00000000": 0.6,
"0x0003050b85adc04db540d95779a4000000000000": 0.6,
"0x0003050b831e5bcc09c1d4fd1eb3ed5e62ffc556": 0.6,
"0x00004d6d28b4e64200d8556776f0fc20a12bc1ad": 0.6,
"0x11b815efb8f581194ae79006d24e0d814b7697f6": 1,
"0xdac17f958d2ee523a2206206994597c13d831ec7": 1,
"0x058ca87960e3da12000000000000000000000000": 0.6,
"0x0005aa065bcf8dcf069c57ed3fad1980b2a4a873": 0.6,
"0x058e98dfce0fd2a2b9373e6974cea7ffbe91decc": 0.6,
"0x0001efb93682b84a1014b9fb7941273c0ba0e9f5": 0.6,
"0x3333333acdedbbc9ad7bda0876e60714195681c5": 1,
"0xbebc44782c7db0a1a60cb6fe97d0b483032ff1c7": 1,
"0x00002af904b638ed930cddfe78cf741a9f440000": 0.6,
"0x0000334c40df9502deb37a4ac7f2d72780000000": 0.6,
"0x00002dc527a4a9017812d98e236bc2cb40000000": 0.6,
"0x0feef93405c3ca6c31df80109628d3137dcbe3b0": 0.6,
"0x807a96288a1a408dbc13de2b1d087d10356395d2": 1,
"0xa2327a938febf5fec13bacfb16ae10ecbc4cbdcf": 1,
"0xe592427a0aece92de3edee1f18e0157c05861564": 1,
"0x1f98431c8ad98523631ae4a59f267346ea31f984": 1,
"0xffffffff00000000000000000000000000000000": 0.75,
"0xf0d160dec1749afaf5a831668093b1431f7c8527": 1,
"0xc6cde7c39eb2f0f0095f41570af89efc2c1ea828": 1
}
npx ts-node src/cli/get-tx-trace.ts --txHash 0xab6b8315187d3333f2cad87eb861203c856b6cb997b0d58f2d96b6ea1a42c258 --tracerFile src/tracers/call_address_tracer.js --timeout 20s
# https://etherscan.io/tx/0xa3446df7ce6e26dd510aea009790769f3379fbeb5671e9fa4e5091854e2cf36a
# Note: 5 internal transactions, too many false positives.
npx ts-node src/cli/get-tx-trace.ts --txHash 0xa3446df7ce6e26dd510aea009790769f3379fbeb5671e9fa4e5091854e2cf36a --tracerFile src/tracers/address_tracer.js
{
"0x80e9540c204c05be63cfe44b43302780175b60ff": 1,
"0x8f99ddc76cf23fef479b5ca1ab2b143c6d77198b": 1,
"0xca30274b11140581cfbd7ddf7f48adb4f324377e": 1,
"0x44b13a9ec5bba78a52a1e074e37a690eea45eaca": 1,
"0xfa54969a776f57b6af8117b6b157b448b6c1ef7f": 1,
"0x1788430620960f9a70e3dc14202a3a35dde1a316": 1,
"0xa35e62e5eb729142643df04838e5c71113564fbd": 0.75,
"0x629dbb4ecde5fa809fdc68cb1b75f6f43d7f5575": 1,
"0x898b4cdaae3d6e638c5c139a3909c1928f63b63c": 1,
"0xb355f12949091ac418c2dbd96704423f57aa5ecb": 1
}
# ERC20 transfer (many false positives)
# https://etherscan.io/tx/0x036f7b1da4c3b0d0359728852b4f7923c02b155c5b7d4d3aab55e6fda6ca50a1
npx ts-node src/cli/get-call-trace.ts --block 0x8baa3abf4faee54750a95f649236c116c4ec1660774ad5a3b4e00c84167ecbb7 --txFile test/tx/mainnet-test.json --tracerFile src/tracers/address_tracer.js
npx ts-node src/cli/get-tx-trace.ts --txHash 0x036f7b1da4c3b0d0359728852b4f7923c02b155c5b7d4d3aab55e6fda6ca50a1 --tracerFile src/tracers/address_tracer.js
{
"0x9acbb72cf67103a30333a32cd203459c6a9c3311": 1,
"0x66b6d6e78fbc4575f5197ae15af62f5dc7d48349": 1
}
```
## References
* https://geth.ethereum.org/docs/rpc/ns-debug#debug_tracetransaction
* https://golang.org/pkg/time/#ParseDuration

View File

View File

@ -0,0 +1,40 @@
{
"name": "@vulcanize/tracing-client",
"version": "0.1.0",
"description": "ETH VM tracing client",
"private": true,
"main": "index.ts",
"scripts": {
"test": "mocha -r ts-node/register src/**/*.spec.ts",
"build": "tsc",
"lint": "eslint ."
},
"repository": {
"type": "git",
"url": "git+https://github.com/vulcanize/erc20-watcher.git"
},
"author": "",
"license": "UNLICENSED",
"bugs": {
"url": "https://github.com/vulcanize/erc20-watcher/issues"
},
"homepage": "https://github.com/vulcanize/erc20-watcher#readme",
"dependencies": {
"canonical-json": "^0.0.4",
"debug": "^4.3.1",
"ethers": "^5.3.1",
"yargs": "^17.0.1"
},
"devDependencies": {
"@types/debug": "^4.1.5",
"@typescript-eslint/eslint-plugin": "^4.25.0",
"@typescript-eslint/parser": "^4.25.0",
"eslint": "^7.27.0",
"eslint-config-semistandard": "^15.0.1",
"eslint-config-standard": "^16.0.3",
"eslint-plugin-import": "^2.23.3",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^5.1.0",
"eslint-plugin-standard": "^5.0.0"
}
}

View File

@ -0,0 +1,52 @@
import fs from 'fs';
import yargs from 'yargs';
import { ethers } from 'ethers';
interface StructLog {
stack: string[]
}
(async () => {
const argv = await yargs.parserConfiguration({
'parse-numbers': false
}).options({
traceFile: {
type: 'string',
require: true,
demandOption: true
}
}).argv;
const { structLogs }: { structLogs: StructLog[] } = JSON.parse(fs.readFileSync(argv.traceFile).toString("utf-8"));
const addressMap: any = {};
structLogs.forEach((log: StructLog) => {
if (!log.stack.length) {
return;
}
let maybeAddress = log.stack[log.stack.length - 1];
// Address are 40 bytes.
// Example: 000000000000000000000000ca6d29232d1435d8198e3e5302495417dd073d61
if (!maybeAddress.startsWith("000000000000000000000000")) {
return;
}
if (addressMap[maybeAddress]) {
return;
}
maybeAddress = maybeAddress.substr("000000000000000000000000".length);
if (!ethers.utils.isAddress(maybeAddress)) {
return;
}
addressMap[ethers.utils.getAddress(maybeAddress)] = true;
Object.keys(addressMap).forEach(address => {
console.log(address);
});
});
})();

View File

@ -0,0 +1,51 @@
import fs from 'fs';
import yargs from 'yargs';
import { getCallTrace } from '../tracing';
(async () => {
const argv = await yargs.parserConfiguration({
'parse-numbers': false
}).options({
providerUrl: {
type: 'string',
require: true,
demandOption: true,
default: 'http://localhost:8545',
describe: 'ETH JSON-RPC provider URL'
},
block: {
type: 'string',
require: true,
demandOption: true,
describe: 'Block hash or number'
},
txFile: {
type: 'string',
require: true,
demandOption: true,
describe: 'File with tx data for call tracing'
},
tracer: {
type: 'string',
describe: 'The tracer to use'
},
tracerFile: {
type: 'string',
"describe": 'File with custom tracing JS code'
}
}).argv;
let tracer = argv.tracer;
const tracerFile = argv.tracerFile;
if (tracerFile) {
tracer = fs.readFileSync(tracerFile).toString("utf-8");
}
const txData = JSON.parse(fs.readFileSync(argv.txFile).toString("utf-8"));
const result = await getCallTrace(argv.providerUrl, argv.block, txData, tracer);
console.log(JSON.stringify(result, null, 2));
})();

View File

@ -0,0 +1,48 @@
import fs from 'fs';
import yargs from 'yargs';
import { getTxTrace } from '../tracing';
(async () => {
const argv = await yargs.parserConfiguration({
'parse-numbers': false
}).options({
providerUrl: {
type: 'string',
require: true,
demandOption: true,
default: 'http://localhost:8545',
describe: 'ETH JSON-RPC provider URL'
},
txHash: {
type: 'string',
require: true,
demandOption: true,
describe: 'Transaction hash'
},
tracer: {
type: 'string',
describe: 'The tracer to use'
},
tracerFile: {
type: 'string',
describe: 'File with custom tracing JS code'
},
timeout: {
type: 'string',
default: "10s",
describe: 'Trace execution timeout'
}
}).argv;
let tracer = argv.tracer;
const tracerFile = argv.tracerFile;
if (tracerFile) {
tracer = fs.readFileSync(tracerFile).toString("utf-8");
}
const result = await getTxTrace(argv.providerUrl, argv.txHash, tracer, argv.timeout);
console.log(JSON.stringify(result, null, 2));
})();

View File

@ -0,0 +1,73 @@
{
minVanityAddressLength: 35,
excludedAddresses: [
"0x0000000000000000000000000000000000000000",
"0xffffffffffffffffffffffffffffffffffffffff"
],
// Known vanity addresses. Empty by default, but can replace this object when making dynamic requests.
// Burner addresses go here too.
knownVanityAddresses: {
// "0x000026b86Ac8B3c08ADDEeacd7ee19e807D94742": true
},
data: {},
isAddress: function(log, db, value) {
// More than 40 chars or too small in length, so not an address.
if (value.length > 40 || value.length < this.minVanityAddressLength) {
return { isAddress: false };
}
var address = toAddress(value);
var addressAsHex = toHex(address);
// Check list of known exclusions.
if (this.excludedAddresses.indexOf(addressAsHex) != -1) {
return { isAddress: false };
}
// Address exists in db, so definitely an address.
if (db.exists(address)) {
return { isAddress: true, address: addressAsHex, confidence: 1 };
}
// May still be a valid address (e.g. for ERC20 transfer).
// It won't exist in DB e.g. if no ETH was sent to it directly.
// Apply heuristics.
// Length heuristic - addresses are usually 40 bytes.
if (value.length == 40 && log.op.isPush()) {
return { isAddress: true, address: addressAsHex, confidence: 0.75 };
}
// Vanity addresses might start with leading zeros, so length will be < 40.
// But we use a min length of addresses, otherwise there are too many false positives.
// Also use a known vanity address list to override the normal logic.
if (this.knownVanityAddresses[addressAsHex] || (log.op.isPush() && value.length > this.minVanityAddressLength)) {
return { isAddress: true, address: addressAsHex, confidence: 0.60 };
}
return { isAddress: false };
},
// step is invoked for every opcode that the VM executes.
step: function(log, db) {
var topOfStack = log.stack.peek(0).toString(16);
var result = this.isAddress(log, db, topOfStack);
if (result.isAddress) {
this.data[result.address] = result.confidence;
}
},
// fault is invoked when the actual execution of an opcode fails.
fault: function(log, db) { },
// result is invoked when all the opcodes have been iterated over and returns
// the final result of the tracing.
result: function(ctx, db) {
return this.data;
}
}

View File

@ -0,0 +1,320 @@
// Based on call_tracer.js in go-ethereum
//
// Original Notice:
//
// Copyright 2017 The go-ethereum Authors
// This file is part of the go-ethereum library.
//
// The go-ethereum library is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// The go-ethereum library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
// callTracer is a full blown transaction tracer that extracts and reports all
// the internal calls made by a transaction, along with any useful information.
// addressTracer is a tracer that watches for address like strings for each call.
{
minVanityAddressLength: 35,
excludedAddresses: [
"0x0000000000000000000000000000000000000000",
"0xffffffffffffffffffffffffffffffffffffffff"
],
// Known vanity addresses. Empty by default, but can replace this object when making dynamic requests.
// Burner addresses go here too.
knownVanityAddresses: {
// "0x000026b86Ac8B3c08ADDEeacd7ee19e807D94742": true
},
isAddress: function(log, db, value) {
// More than 40 chars or too small in length, so not an address.
if (value.length > 40 || value.length < this.minVanityAddressLength) {
return { isAddress: false };
}
var address = toAddress(value);
var addressAsHex = toHex(address);
// Check list of known exclusions.
if (this.excludedAddresses.indexOf(addressAsHex) != -1) {
return { isAddress: false };
}
// Address exists in db, so definitely an address.
if (db.exists(address)) {
return { isAddress: true, address: addressAsHex, confidence: 1 };
}
// May still be a valid address (e.g. for ERC20 transfer).
// It won't exist in DB e.g. if no ETH was sent to it directly.
// Apply heuristics.
// Length heuristic - addresses are usually 40 bytes.
if (value.length == 40 && log.op.isPush()) {
return { isAddress: true, address: addressAsHex, confidence: 0.75 };
}
// Vanity addresses might start with leading zeros, so length will be < 40.
// But we use a min length of addresses, otherwise there are too many false positives.
// Also use a known vanity address list to override the normal logic.
if (this.knownVanityAddresses[addressAsHex] || (log.op.isPush() && value.length > this.minVanityAddressLength)) {
return { isAddress: true, address: addressAsHex, confidence: 0.60 };
}
return { isAddress: false };
},
// callstack is the current recursive call stack of the EVM execution.
callstack: [{}],
// descended tracks whether we've just descended from an outer transaction into
// an inner call.
descended: false,
// step is invoked for every opcode that the VM executes.
step: function(log, db) {
// Capture any errors immediately
var error = log.getError();
if (error !== undefined) {
this.fault(log, db);
return;
}
// We only care about system opcodes, faster if we pre-check once
var syscall = (log.op.toNumber() & 0xf0) == 0xf0;
if (syscall) {
var op = log.op.toString();
}
// If a new contract is being created, add to the call stack
if (syscall && (op == 'CREATE' || op == "CREATE2")) {
var inOff = log.stack.peek(1).valueOf();
var inEnd = inOff + log.stack.peek(2).valueOf();
// Assemble the internal call report and store for completion
var call = {
type: op,
from: toHex(log.contract.getAddress()),
input: toHex(log.memory.slice(inOff, inEnd)),
gasIn: log.getGas(),
gasCost: log.getCost(),
value: '0x' + log.stack.peek(0).toString(16)
};
this.callstack.push(call);
this.descended = true
return;
}
// If a contract is being self destructed, gather that as a subcall too
if (syscall && op == 'SELFDESTRUCT') {
var left = this.callstack.length;
if (this.callstack[left-1].calls === undefined) {
this.callstack[left-1].calls = [];
}
this.callstack[left-1].calls.push({
type: op,
from: toHex(log.contract.getAddress()),
to: toHex(toAddress(log.stack.peek(0).toString(16))),
gasIn: log.getGas(),
gasCost: log.getCost(),
value: '0x' + db.getBalance(log.contract.getAddress()).toString(16)
});
return
}
// If a new method invocation is being done, add to the call stack
if (syscall && (op == 'CALL' || op == 'CALLCODE' || op == 'DELEGATECALL' || op == 'STATICCALL')) {
// Skip any pre-compile invocations, those are just fancy opcodes
var to = toAddress(log.stack.peek(1).toString(16));
if (isPrecompiled(to)) {
return
}
var off = (op == 'DELEGATECALL' || op == 'STATICCALL' ? 0 : 1);
var inOff = log.stack.peek(2 + off).valueOf();
var inEnd = inOff + log.stack.peek(3 + off).valueOf();
// Assemble the internal call report and store for completion
var call = {
type: op,
from: toHex(log.contract.getAddress()),
to: toHex(to),
input: toHex(log.memory.slice(inOff, inEnd)),
gasIn: log.getGas(),
gasCost: log.getCost(),
outOff: log.stack.peek(4 + off).valueOf(),
outLen: log.stack.peek(5 + off).valueOf()
};
if (op != 'DELEGATECALL' && op != 'STATICCALL') {
call.value = '0x' + log.stack.peek(2).toString(16);
}
this.callstack.push(call);
this.descended = true
return;
}
// If we've just descended into an inner call, retrieve it's true allowance. We
// need to extract if from within the call as there may be funky gas dynamics
// with regard to requested and actually given gas (2300 stipend, 63/64 rule).
if (this.descended) {
if (log.getDepth() >= this.callstack.length) {
this.callstack[this.callstack.length - 1].gas = log.getGas();
} else {
// TODO(karalabe): The call was made to a plain account. We currently don't
// have access to the true gas amount inside the call and so any amount will
// mostly be wrong since it depends on a lot of input args. Skip gas for now.
}
this.descended = false;
}
// If an existing call is returning, pop off the call stack
if (syscall && op == 'REVERT') {
this.callstack[this.callstack.length - 1].error = "execution reverted";
return;
}
if (log.getDepth() == this.callstack.length - 1) {
// Pop off the last call and get the execution results
var call = this.callstack.pop();
if (call.type == 'CREATE' || call.type == "CREATE2") {
// If the call was a CREATE, retrieve the contract address and output code
call.gasUsed = '0x' + bigInt(call.gasIn - call.gasCost - log.getGas()).toString(16);
delete call.gasIn; delete call.gasCost;
var ret = log.stack.peek(0);
if (!ret.equals(0)) {
call.to = toHex(toAddress(ret.toString(16)));
call.output = toHex(db.getCode(toAddress(ret.toString(16))));
} else if (call.error === undefined) {
call.error = "internal failure"; // TODO(karalabe): surface these faults somehow
}
} else {
// If the call was a contract call, retrieve the gas usage and output
if (call.gas !== undefined) {
call.gasUsed = '0x' + bigInt(call.gasIn - call.gasCost + call.gas - log.getGas()).toString(16);
}
var ret = log.stack.peek(0);
if (!ret.equals(0)) {
call.output = toHex(log.memory.slice(call.outOff, call.outOff + call.outLen));
} else if (call.error === undefined) {
call.error = "internal failure"; // TODO(karalabe): surface these faults somehow
}
delete call.gasIn; delete call.gasCost;
delete call.outOff; delete call.outLen;
}
if (call.gas !== undefined) {
call.gas = '0x' + bigInt(call.gas).toString(16);
}
// Inject the call into the previous one
var left = this.callstack.length;
if (this.callstack[left-1].calls === undefined) {
this.callstack[left-1].calls = [];
}
this.callstack[left-1].calls.push(call);
}
var topOfStack = log.stack.peek(0).toString(16);
var result = this.isAddress(log, db, topOfStack);
if (result.isAddress) {
var call = this.callstack[this.callstack.length - 1];
if (!call.addresses) {
call.addresses = {};
}
call.addresses[result.address] = result.confidence;
}
},
// fault is invoked when the actual execution of an opcode fails.
fault: function(log, db) {
// If the topmost call already reverted, don't handle the additional fault again
if (this.callstack[this.callstack.length - 1].error !== undefined) {
return;
}
// Pop off the just failed call
var call = this.callstack.pop();
call.error = log.getError();
// Consume all available gas and clean any leftovers
if (call.gas !== undefined) {
call.gas = '0x' + bigInt(call.gas).toString(16);
call.gasUsed = call.gas
}
delete call.gasIn; delete call.gasCost;
delete call.outOff; delete call.outLen;
// Flatten the failed call into its parent
var left = this.callstack.length;
if (left > 0) {
if (this.callstack[left-1].calls === undefined) {
this.callstack[left-1].calls = [];
}
this.callstack[left-1].calls.push(call);
return;
}
// Last call failed too, leave it in the stack
this.callstack.push(call);
},
// result is invoked when all the opcodes have been iterated over and returns
// the final result of the tracing.
result: function(ctx, db) {
var result = {
type: ctx.type,
from: toHex(ctx.from),
to: toHex(ctx.to),
value: '0x' + ctx.value.toString(16),
gas: '0x' + bigInt(ctx.gas).toString(16),
gasUsed: '0x' + bigInt(ctx.gasUsed).toString(16),
input: toHex(ctx.input),
output: toHex(ctx.output),
time: ctx.time,
};
if (this.callstack[0].calls !== undefined) {
result.calls = this.callstack[0].calls;
}
if (this.callstack[0].error !== undefined) {
result.error = this.callstack[0].error;
} else if (ctx.error !== undefined) {
result.error = ctx.error;
}
if (result.error !== undefined && (result.error !== "execution reverted" || result.output ==="0x")) {
delete result.output;
}
return this.finalize(result);
},
// finalize recreates a call object using the final desired field oder for json
// serialization. This is a nicety feature to pass meaningfully ordered results
// to users who don't interpret it, just display it.
finalize: function(call) {
var sorted = {
type: call.type,
from: call.from,
to: call.to,
value: call.value,
gas: call.gas,
gasUsed: call.gasUsed,
input: call.input,
output: call.output,
error: call.error,
time: call.time,
calls: call.calls,
addresses: call.addresses,
}
for (var key in sorted) {
if (sorted[key] === undefined) {
delete sorted[key];
}
}
if (sorted.calls !== undefined) {
for (var i=0; i<sorted.calls.length; i++) {
sorted.calls[i] = this.finalize(sorted.calls[i]);
}
}
return sorted;
}
}

View File

@ -0,0 +1,252 @@
// Copyright 2017 The go-ethereum Authors
// This file is part of the go-ethereum library.
//
// The go-ethereum library is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// The go-ethereum library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
// callTracer is a full blown transaction tracer that extracts and reports all
// the internal calls made by a transaction, along with any useful information.
{
// callstack is the current recursive call stack of the EVM execution.
callstack: [{}],
// descended tracks whether we've just descended from an outer transaction into
// an inner call.
descended: false,
// step is invoked for every opcode that the VM executes.
step: function(log, db) {
// Capture any errors immediately
var error = log.getError();
if (error !== undefined) {
this.fault(log, db);
return;
}
// We only care about system opcodes, faster if we pre-check once
var syscall = (log.op.toNumber() & 0xf0) == 0xf0;
if (syscall) {
var op = log.op.toString();
}
// If a new contract is being created, add to the call stack
if (syscall && (op == 'CREATE' || op == "CREATE2")) {
var inOff = log.stack.peek(1).valueOf();
var inEnd = inOff + log.stack.peek(2).valueOf();
// Assemble the internal call report and store for completion
var call = {
type: op,
from: toHex(log.contract.getAddress()),
input: toHex(log.memory.slice(inOff, inEnd)),
gasIn: log.getGas(),
gasCost: log.getCost(),
value: '0x' + log.stack.peek(0).toString(16)
};
this.callstack.push(call);
this.descended = true
return;
}
// If a contract is being self destructed, gather that as a subcall too
if (syscall && op == 'SELFDESTRUCT') {
var left = this.callstack.length;
if (this.callstack[left-1].calls === undefined) {
this.callstack[left-1].calls = [];
}
this.callstack[left-1].calls.push({
type: op,
from: toHex(log.contract.getAddress()),
to: toHex(toAddress(log.stack.peek(0).toString(16))),
gasIn: log.getGas(),
gasCost: log.getCost(),
value: '0x' + db.getBalance(log.contract.getAddress()).toString(16)
});
return
}
// If a new method invocation is being done, add to the call stack
if (syscall && (op == 'CALL' || op == 'CALLCODE' || op == 'DELEGATECALL' || op == 'STATICCALL')) {
// Skip any pre-compile invocations, those are just fancy opcodes
var to = toAddress(log.stack.peek(1).toString(16));
if (isPrecompiled(to)) {
return
}
var off = (op == 'DELEGATECALL' || op == 'STATICCALL' ? 0 : 1);
var inOff = log.stack.peek(2 + off).valueOf();
var inEnd = inOff + log.stack.peek(3 + off).valueOf();
// Assemble the internal call report and store for completion
var call = {
type: op,
from: toHex(log.contract.getAddress()),
to: toHex(to),
input: toHex(log.memory.slice(inOff, inEnd)),
gasIn: log.getGas(),
gasCost: log.getCost(),
outOff: log.stack.peek(4 + off).valueOf(),
outLen: log.stack.peek(5 + off).valueOf()
};
if (op != 'DELEGATECALL' && op != 'STATICCALL') {
call.value = '0x' + log.stack.peek(2).toString(16);
}
this.callstack.push(call);
this.descended = true
return;
}
// If we've just descended into an inner call, retrieve it's true allowance. We
// need to extract if from within the call as there may be funky gas dynamics
// with regard to requested and actually given gas (2300 stipend, 63/64 rule).
if (this.descended) {
if (log.getDepth() >= this.callstack.length) {
this.callstack[this.callstack.length - 1].gas = log.getGas();
} else {
// TODO(karalabe): The call was made to a plain account. We currently don't
// have access to the true gas amount inside the call and so any amount will
// mostly be wrong since it depends on a lot of input args. Skip gas for now.
}
this.descended = false;
}
// If an existing call is returning, pop off the call stack
if (syscall && op == 'REVERT') {
this.callstack[this.callstack.length - 1].error = "execution reverted";
return;
}
if (log.getDepth() == this.callstack.length - 1) {
// Pop off the last call and get the execution results
var call = this.callstack.pop();
if (call.type == 'CREATE' || call.type == "CREATE2") {
// If the call was a CREATE, retrieve the contract address and output code
call.gasUsed = '0x' + bigInt(call.gasIn - call.gasCost - log.getGas()).toString(16);
delete call.gasIn; delete call.gasCost;
var ret = log.stack.peek(0);
if (!ret.equals(0)) {
call.to = toHex(toAddress(ret.toString(16)));
call.output = toHex(db.getCode(toAddress(ret.toString(16))));
} else if (call.error === undefined) {
call.error = "internal failure"; // TODO(karalabe): surface these faults somehow
}
} else {
// If the call was a contract call, retrieve the gas usage and output
if (call.gas !== undefined) {
call.gasUsed = '0x' + bigInt(call.gasIn - call.gasCost + call.gas - log.getGas()).toString(16);
}
var ret = log.stack.peek(0);
if (!ret.equals(0)) {
call.output = toHex(log.memory.slice(call.outOff, call.outOff + call.outLen));
} else if (call.error === undefined) {
call.error = "internal failure"; // TODO(karalabe): surface these faults somehow
}
delete call.gasIn; delete call.gasCost;
delete call.outOff; delete call.outLen;
}
if (call.gas !== undefined) {
call.gas = '0x' + bigInt(call.gas).toString(16);
}
// Inject the call into the previous one
var left = this.callstack.length;
if (this.callstack[left-1].calls === undefined) {
this.callstack[left-1].calls = [];
}
this.callstack[left-1].calls.push(call);
}
},
// fault is invoked when the actual execution of an opcode fails.
fault: function(log, db) {
// If the topmost call already reverted, don't handle the additional fault again
if (this.callstack[this.callstack.length - 1].error !== undefined) {
return;
}
// Pop off the just failed call
var call = this.callstack.pop();
call.error = log.getError();
// Consume all available gas and clean any leftovers
if (call.gas !== undefined) {
call.gas = '0x' + bigInt(call.gas).toString(16);
call.gasUsed = call.gas
}
delete call.gasIn; delete call.gasCost;
delete call.outOff; delete call.outLen;
// Flatten the failed call into its parent
var left = this.callstack.length;
if (left > 0) {
if (this.callstack[left-1].calls === undefined) {
this.callstack[left-1].calls = [];
}
this.callstack[left-1].calls.push(call);
return;
}
// Last call failed too, leave it in the stack
this.callstack.push(call);
},
// result is invoked when all the opcodes have been iterated over and returns
// the final result of the tracing.
result: function(ctx, db) {
var result = {
type: ctx.type,
from: toHex(ctx.from),
to: toHex(ctx.to),
value: '0x' + ctx.value.toString(16),
gas: '0x' + bigInt(ctx.gas).toString(16),
gasUsed: '0x' + bigInt(ctx.gasUsed).toString(16),
input: toHex(ctx.input),
output: toHex(ctx.output),
time: ctx.time,
};
if (this.callstack[0].calls !== undefined) {
result.calls = this.callstack[0].calls;
}
if (this.callstack[0].error !== undefined) {
result.error = this.callstack[0].error;
} else if (ctx.error !== undefined) {
result.error = ctx.error;
}
if (result.error !== undefined && (result.error !== "execution reverted" || result.output ==="0x")) {
delete result.output;
}
return this.finalize(result);
},
// finalize recreates a call object using the final desired field oder for json
// serialization. This is a nicety feature to pass meaningfully ordered results
// to users who don't interpret it, just display it.
finalize: function(call) {
var sorted = {
type: call.type,
from: call.from,
to: call.to,
value: call.value,
gas: call.gas,
gasUsed: call.gasUsed,
input: call.input,
output: call.output,
error: call.error,
time: call.time,
calls: call.calls,
}
for (var key in sorted) {
if (sorted[key] === undefined) {
delete sorted[key];
}
}
if (sorted.calls !== undefined) {
for (var i=0; i<sorted.calls.length; i++) {
sorted.calls[i] = this.finalize(sorted.calls[i]);
}
}
return sorted;
}
}

View File

@ -0,0 +1,11 @@
import { ethers } from 'ethers';
export const getTxTrace = async (providerUrl: string, txHash: string, tracer: string | undefined, timeout: string | undefined): Promise<any> => {
const provider = new ethers.providers.JsonRpcProvider(providerUrl);
return provider.send('debug_traceTransaction', [txHash, { tracer, timeout }]);
};
export const getCallTrace = async (providerUrl: string, block: string, txData: any, tracer: string | undefined): Promise<any> => {
const provider = new ethers.providers.JsonRpcProvider(providerUrl);
return provider.send('debug_traceCall', [ txData, block, { tracer }]);
};

View File

@ -0,0 +1,655 @@
{
"type": "CALL",
"from": "0xf94d7953d44bdcc7a5585a61ed91899ef2d39524",
"to": "0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"value": "0x0",
"gas": "0xb3237",
"gasUsed": "0x5e42a",
"input": "0x0000004d0000000000000000000000000000000000000000000000000000000000c057bd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002c40000007300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000066aeefc9200000000000000000000000000000000000000000000000000000000009896800000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000003f8ad599c3a0ff1de082011efddc58f1908eb6e6d8a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000bb800000000000000000000000000000000000000000000000000000000000000003f11b815efb8f581194ae79006d24e0d814b7697f6c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2dac17f958d2ee523a2206206994597c13d831ec70001f40000000000000000000000000000000000000000000000000000000000000000173333333acdedbbc9ad7bda0876e60714195681c502010000000000000000000000000000000000000000000000000000000000000000000000000000",
"output": "0x",
"time": "13.379333774s",
"calls": [
{
"type": "DELEGATECALL",
"from": "0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"to": "0x240c7488df044d2f69d66201ee59a296c64d714c",
"gas": "0xae6af",
"gasUsed": "0x5c47b",
"input": "0x0000007300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000066aeefc9200000000000000000000000000000000000000000000000000000000009896800000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000003f8ad599c3a0ff1de082011efddc58f1908eb6e6d8a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000bb800000000000000000000000000000000000000000000000000000000000000003f11b815efb8f581194ae79006d24e0d814b7697f6c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2dac17f958d2ee523a2206206994597c13d831ec70001f40000000000000000000000000000000000000000000000000000000000000000173333333acdedbbc9ad7bda0876e60714195681c5020100000000000000000000",
"output": "0x",
"calls": [
{
"type": "DELEGATECALL",
"from": "0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"to": "0x1f4de5cc412ff43db7663e39aaa04221ca9e995f",
"gas": "0xa9f93",
"gasUsed": "0x572e",
"input": "0xdab617590000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000066aeefc920000000000000000000000008ad599c3a0ff1de082011efddc58f1908eb6e6d80000000000000000000000000000000000000000000000000000000000000bb8",
"output": "0x00000000000000000000000000000000000000000000000095d5e0843bea29b4",
"calls": [
{
"type": "STATICCALL",
"from": "0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"to": "0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8",
"gas": "0xa6846",
"gasUsed": "0x97c",
"input": "0x1a686502",
"output": "0x000000000000000000000000000000000000000000000001f6397f4bda22e9d2"
},
{
"type": "STATICCALL",
"from": "0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"to": "0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8",
"gas": "0xa5cc0",
"gasUsed": "0xa88",
"input": "0x3850c7bd",
"output": "0x0000000000000000000000000000000000004d6d55fae0dc58b57a67bdd9ed70000000000000000000000000000000000000000000000000000000000003050c00000000000000000000000000000000000000000000000000000000000001580000000000000000000000000000000000000000000000000000000000000168000000000000000000000000000000000000000000000000000000000000016800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"
},
{
"type": "STATICCALL",
"from": "0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"to": "0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8",
"gas": "0xa4e13",
"gasUsed": "0x117",
"input": "0xd0c93a7c",
"output": "0x000000000000000000000000000000000000000000000000000000000000003c"
},
{
"type": "STATICCALL",
"from": "0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"to": "0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8",
"gas": "0xa47b4",
"gasUsed": "0x9dd",
"input": "0x5339c296000000000000000000000000000000000000000000000000000000000000000c",
"output": "0xfffffffffffffffffffffffffffffffff7ffedbfdedfcf5dff2541aeb225cebc"
}
],
"addresses": {
"0x1f4de5cc412ff43db7663e39aaa04221ca9e995f": 1,
"0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3": 1,
"0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8": 1,
"0x00004d59594796297b1b33f9dbc3fb1829ebaaf9": 0.6,
"0x0081a5107db14797df968e243e8918fec5c189ec": 0.6,
"0x41120695a494e1653b6c5fd69d8de0d301be2810": 0.75,
"0x0001ef68096b0199f8afcdd6eedbb16a461c1272": 0.6,
"0xfffd8963efd1fc6a506488495d951d5263988d26": 0.75,
"0x00004d6d099aa3197c9a709447db6b6a00000000": 0.6,
"0x0003050b85adc04db540d95779a4000000000000": 0.6,
"0x0003050b831e5bcc09c1d4fd1eb3ed5e62ffc556": 0.6,
"0x00004d6d28b4e64200d8556776f0fc20a12bc1ad": 0.6
}
},
{
"type": "DELEGATECALL",
"from": "0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"to": "0x1f4de5cc412ff43db7663e39aaa04221ca9e995f",
"gas": "0xa42c2",
"gasUsed": "0x54dc",
"input": "0xdab61759000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000095d5e0843bea295000000000000000000000000011b815efb8f581194ae79006d24e0d814b7697f600000000000000000000000000000000000000000000000000000000000001f4",
"output": "0x000000000000000000000000000000000000000000000000000000066b234162",
"calls": [
{
"type": "STATICCALL",
"from": "0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"to": "0x11b815efb8f581194ae79006d24e0d814b7697f6",
"gas": "0xa0ce9",
"gasUsed": "0x97c",
"input": "0x1a686502",
"output": "0x000000000000000000000000000000000000000000000000058ca87960e3da12"
},
{
"type": "STATICCALL",
"from": "0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"to": "0x11b815efb8f581194ae79006d24e0d814b7697f6",
"gas": "0xa0162",
"gasUsed": "0xa88",
"input": "0x3850c7bd",
"output": "0x00000000000000000000000000000000000000000003508b4c0b22de548e9dfefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfb2500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"
},
{
"type": "STATICCALL",
"from": "0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"to": "0x11b815efb8f581194ae79006d24e0d814b7697f6",
"gas": "0x9f2b5",
"gasUsed": "0x117",
"input": "0xd0c93a7c",
"output": "0x000000000000000000000000000000000000000000000000000000000000000a"
},
{
"type": "STATICCALL",
"from": "0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"to": "0x11b815efb8f581194ae79006d24e0d814b7697f6",
"gas": "0x9ec15",
"gasUsed": "0x9dd",
"input": "0x5339c296ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2",
"output": "0x8b042000000401a10080b0790000011000808804000020012088600500000000"
}
],
"addresses": {
"0x1f4de5cc412ff43db7663e39aaa04221ca9e995f": 1,
"0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3": 1,
"0x11b815efb8f581194ae79006d24e0d814b7697f6": 1,
"0x058ca87960e3da12000000000000000000000000": 0.6,
"0x0005aa065bcf8dcf069c57ed3fad1980b2a4a873": 0.6,
"0x058e98dfce0fd2a2b9373e6974cea7ffbe91decc": 0.6,
"0x0001efb93682b84a1014b9fb7941273c0ba0e9f5": 0.6,
"0xfffd8963efd1fc6a506488495d951d5263988d26": 0.75
}
},
{
"type": "STATICCALL",
"from": "0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"to": "0x3333333acdedbbc9ad7bda0876e60714195681c5",
"gas": "0x9e07f",
"gasUsed": "0x8c30",
"input": "0x5e0d443f00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000066b2340fe",
"output": "0x000000000000000000000000000000000000000000000000000000066b98c297",
"calls": [
{
"type": "DELEGATECALL",
"from": "0x3333333acdedbbc9ad7bda0876e60714195681c5",
"to": "0xbebc44782c7db0a1a60cb6fe97d0b483032ff1c7",
"gas": "0x9a597",
"gasUsed": "0x7852",
"input": "0x5e0d443f00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000066b2340fe",
"output": "0x",
"addresses": {
"0x00002af904b638ed930cddfe78cf741a9f440000": 0.6,
"0x0000334c40df9502deb37a4ac7f2d72780000000": 0.6,
"0x00002dc527a4a9017812d98e236bc2cb40000000": 0.6,
"0x0feef93405c3ca6c31df80109628d3137dcbe3b0": 0.6
}
}
],
"addresses": {
"0xbebc44782c7db0a1a60cb6fe97d0b483032ff1c7": 1
}
},
{
"type": "STATICCALL",
"from": "0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"to": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"gas": "0x94a33",
"gasUsed": "0x2657",
"input": "0x70a082310000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"output": "0x000000000000000000000000000000000000000000000000000002851d282e04",
"calls": [
{
"type": "DELEGATECALL",
"from": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"to": "0xa2327a938febf5fec13bacfb16ae10ecbc4cbdcf",
"gas": "0x90932",
"gasUsed": "0x9e1",
"input": "0x70a082310000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"output": "0x",
"addresses": {
"0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3": 1
}
}
],
"addresses": {
"0x807a96288a1a408dbc13de2b1d087d10356395d2": 1,
"0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3": 1,
"0xa2327a938febf5fec13bacfb16ae10ecbc4cbdcf": 1
}
},
{
"type": "STATICCALL",
"from": "0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
"gas": "0x918ce",
"gasUsed": "0x9e6",
"input": "0x70a082310000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"output": "0x00000000000000000000000000000000000000000000000972ca2015bb6261ee",
"addresses": {
"0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3": 1
}
},
{
"type": "CALL",
"from": "0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"to": "0xe592427a0aece92de3edee1f18e0157c05861564",
"value": "0x0",
"gas": "0x8fd90",
"gasUsed": "0x149f1",
"input": "0x414bf389000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d30000000000000000000000000000000000000000000000000000000060c1bd37000000000000000000000000000000000000000000000000000000066aeefc9200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"output": "0x00000000000000000000000000000000000000000000000095d5e0843bea29b4",
"calls": [
{
"type": "CALL",
"from": "0xe592427a0aece92de3edee1f18e0157c05861564",
"to": "0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8",
"value": "0x0",
"gas": "0x8c828",
"gasUsed": "0x136ad",
"input": "0x128acb080000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d30000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000066aeefc9200000000000000000000000000000000000000000000000000000001000276a400000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d3000000000000000000000000000000000000000000000000000000000000002ba0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000bb8c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000",
"output": "0x000000000000000000000000000000000000000000000000000000066aeefc92ffffffffffffffffffffffffffffffffffffffffffffffff6a2a1f7bc415d64c",
"calls": [
{
"type": "CALL",
"from": "0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8",
"to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
"value": "0x0",
"gas": "0x83361",
"gasUsed": "0x2a6e",
"input": "0xa9059cbb0000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d300000000000000000000000000000000000000000000000095d5e0843bea29b4",
"output": "0x",
"addresses": {
"0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3": 1,
"0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8": 1
}
},
{
"type": "STATICCALL",
"from": "0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8",
"to": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"gas": "0x80635",
"gasUsed": "0xcf3",
"input": "0x70a082310000000000000000000000008ad599c3a0ff1de082011efddc58f1908eb6e6d8",
"output": "0x",
"calls": [
{
"type": "DELEGATECALL",
"from": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"to": "0xa2327a938febf5fec13bacfb16ae10ecbc4cbdcf",
"gas": "0x7e342",
"gasUsed": "0x9e1",
"input": "0x70a082310000000000000000000000008ad599c3a0ff1de082011efddc58f1908eb6e6d8",
"output": "0x",
"addresses": {
"0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8": 1
}
}
],
"addresses": {
"0x807a96288a1a408dbc13de2b1d087d10356395d2": 1,
"0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8": 1,
"0xa2327a938febf5fec13bacfb16ae10ecbc4cbdcf": 1
}
},
{
"type": "CALL",
"from": "0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8",
"to": "0xe592427a0aece92de3edee1f18e0157c05861564",
"value": "0x0",
"gas": "0x7f660",
"gasUsed": "0x6f20",
"input": "0xfa461e33000000000000000000000000000000000000000000000000000000066aeefc92ffffffffffffffffffffffffffffffffffffffffffffffff6a2a1f7bc415d64c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d3000000000000000000000000000000000000000000000000000000000000002ba0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000bb8c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000",
"output": "0x",
"calls": [
{
"type": "CALL",
"from": "0xe592427a0aece92de3edee1f18e0157c05861564",
"to": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"value": "0x0",
"gas": "0x7c82a",
"gasUsed": "0x5f48",
"input": "0x23b872dd0000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d30000000000000000000000008ad599c3a0ff1de082011efddc58f1908eb6e6d8000000000000000000000000000000000000000000000000000000066aeefc92",
"output": "0x",
"calls": [
{
"type": "DELEGATECALL",
"from": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"to": "0xa2327a938febf5fec13bacfb16ae10ecbc4cbdcf",
"gas": "0x7a627",
"gasUsed": "0x5c2d",
"input": "0x23b872dd0000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d30000000000000000000000008ad599c3a0ff1de082011efddc58f1908eb6e6d8000000000000000000000000000000000000000000000000000000066aeefc92",
"output": "0x",
"addresses": {
"0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3": 1,
"0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8": 1,
"0xf0d160dec1749afaf5a831668093b1431f7c8527": 1,
"0xe592427a0aece92de3edee1f18e0157c05861564": 1
}
}
],
"addresses": {
"0x807a96288a1a408dbc13de2b1d087d10356395d2": 1,
"0xe592427a0aece92de3edee1f18e0157c05861564": 1,
"0xa2327a938febf5fec13bacfb16ae10ecbc4cbdcf": 1
}
}
],
"addresses": {
"0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3": 1,
"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48": 1,
"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2": 1,
"0x1f98431c8ad98523631ae4a59f267346ea31f984": 1,
"0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8": 1,
"0xe592427a0aece92de3edee1f18e0157c05861564": 1
}
},
{
"type": "STATICCALL",
"from": "0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8",
"to": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"gas": "0x78683",
"gasUsed": "0x523",
"input": "0x70a082310000000000000000000000008ad599c3a0ff1de082011efddc58f1908eb6e6d8",
"output": "0x",
"calls": [
{
"type": "DELEGATECALL",
"from": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"to": "0xa2327a938febf5fec13bacfb16ae10ecbc4cbdcf",
"gas": "0x7658f",
"gasUsed": "0x211",
"input": "0x70a082310000000000000000000000008ad599c3a0ff1de082011efddc58f1908eb6e6d8",
"output": "0x",
"addresses": {
"0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8": 1
}
}
],
"addresses": {
"0x807a96288a1a408dbc13de2b1d087d10356395d2": 1,
"0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8": 1,
"0xa2327a938febf5fec13bacfb16ae10ecbc4cbdcf": 1
}
}
],
"addresses": {
"0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3": 1,
"0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8": 1,
"0x00004d59594796297b1b33f9dbc3fb1829ebaaf9": 0.6,
"0x0081a5107db14797df968e243e8918fec5c189ec": 0.6,
"0x41120695a494e1653b6c5fd69d8de0d301be2810": 0.75,
"0x0001ef68096b0199f8afcdd6eedbb16a461c1272": 0.6,
"0xfffd8963efd1fc6a506488495d951d5263988d26": 0.75,
"0x00004d6d099aa3197c9a709447db6b6a00000000": 0.6,
"0x0003050b85adc04db540d95779a4000000000000": 0.6,
"0x0003050b831e5bcc09c1d4fd1eb3ed5e62ffc556": 0.6,
"0x00004d6d28b4e64200d8556776f0fc20a12bc1ad": 0.6,
"0xffffffff00000000000000000000000000000000": 0.75,
"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2": 1,
"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48": 1,
"0xe592427a0aece92de3edee1f18e0157c05861564": 1
}
}
],
"addresses": {
"0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3": 1,
"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48": 1,
"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2": 1,
"0x1f98431c8ad98523631ae4a59f267346ea31f984": 1,
"0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8": 1
}
},
{
"type": "CALL",
"from": "0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"to": "0xe592427a0aece92de3edee1f18e0157c05861564",
"value": "0x0",
"gas": "0x7b0d9",
"gasUsed": "0x129fb",
"input": "0x414bf389000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000000000000000000000000000000000000000001f40000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d30000000000000000000000000000000000000000000000000000000060c1bd3700000000000000000000000000000000000000000000000095d5e0843bea295000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"output": "0x000000000000000000000000000000000000000000000000000000066b234162",
"calls": [
{
"type": "CALL",
"from": "0xe592427a0aece92de3edee1f18e0157c05861564",
"to": "0x11b815efb8f581194ae79006d24e0d814b7697f6",
"value": "0x0",
"gas": "0x780a4",
"gasUsed": "0x116b7",
"input": "0x128acb080000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d3000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000095d5e0843bea295000000000000000000000000000000000000000000000000000000001000276a400000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d3000000000000000000000000000000000000000000000000000000000000002bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc20001f4dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000000000000000000000",
"output": "0x00000000000000000000000000000000000000000000000095d5e0843bea2950fffffffffffffffffffffffffffffffffffffffffffffffffffffff994dcbe9e",
"calls": [
{
"type": "CALL",
"from": "0x11b815efb8f581194ae79006d24e0d814b7697f6",
"to": "0xdac17f958d2ee523a2206206994597c13d831ec7",
"value": "0x0",
"gas": "0x70048",
"gasUsed": "0x5fb5",
"input": "0xa9059cbb0000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d3000000000000000000000000000000000000000000000000000000066b234162",
"output": "0x",
"addresses": {
"0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3": 1,
"0xc6cde7c39eb2f0f0095f41570af89efc2c1ea828": 1,
"0x11b815efb8f581194ae79006d24e0d814b7697f6": 1
}
},
{
"type": "STATICCALL",
"from": "0x11b815efb8f581194ae79006d24e0d814b7697f6",
"to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
"gas": "0x69f28",
"gasUsed": "0x9e6",
"input": "0x70a0823100000000000000000000000011b815efb8f581194ae79006d24e0d814b7697f6",
"output": "0x",
"addresses": {
"0x11b815efb8f581194ae79006d24e0d814b7697f6": 1
}
},
{
"type": "CALL",
"from": "0x11b815efb8f581194ae79006d24e0d814b7697f6",
"to": "0xe592427a0aece92de3edee1f18e0157c05861564",
"value": "0x0",
"gas": "0x69254",
"gasUsed": "0x3009",
"input": "0xfa461e3300000000000000000000000000000000000000000000000095d5e0843bea2950fffffffffffffffffffffffffffffffffffffffffffffffffffffff994dcbe9e000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d3000000000000000000000000000000000000000000000000000000000000002bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc20001f4dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000000000000000000000",
"output": "0x",
"calls": [
{
"type": "CALL",
"from": "0xe592427a0aece92de3edee1f18e0157c05861564",
"to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
"value": "0x0",
"gas": "0x6699f",
"gasUsed": "0x2021",
"input": "0x23b872dd0000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d300000000000000000000000011b815efb8f581194ae79006d24e0d814b7697f600000000000000000000000000000000000000000000000095d5e0843bea2950",
"output": "0x",
"addresses": {
"0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3": 1,
"0x11b815efb8f581194ae79006d24e0d814b7697f6": 1,
"0xe592427a0aece92de3edee1f18e0157c05861564": 1
}
}
],
"addresses": {
"0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3": 1,
"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2": 1,
"0xdac17f958d2ee523a2206206994597c13d831ec7": 1,
"0x1f98431c8ad98523631ae4a59f267346ea31f984": 1,
"0x11b815efb8f581194ae79006d24e0d814b7697f6": 1,
"0xe592427a0aece92de3edee1f18e0157c05861564": 1
}
},
{
"type": "STATICCALL",
"from": "0x11b815efb8f581194ae79006d24e0d814b7697f6",
"to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
"gas": "0x66093",
"gasUsed": "0x216",
"input": "0x70a0823100000000000000000000000011b815efb8f581194ae79006d24e0d814b7697f6",
"output": "0x",
"addresses": {
"0x11b815efb8f581194ae79006d24e0d814b7697f6": 1
}
}
],
"addresses": {
"0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3": 1,
"0x11b815efb8f581194ae79006d24e0d814b7697f6": 1,
"0x058ca87960e3da12000000000000000000000000": 0.6,
"0x0005aa065bcf8dcf069c57ed3fad1980b2a4a873": 0.6,
"0x058e98dfce0fd2a2b9373e6974cea7ffbe91decc": 0.6,
"0x0001efb93682b84a1014b9fb7941273c0ba0e9f5": 0.6,
"0xfffd8963efd1fc6a506488495d951d5263988d26": 0.75,
"0xdac17f958d2ee523a2206206994597c13d831ec7": 1,
"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2": 1,
"0xe592427a0aece92de3edee1f18e0157c05861564": 1
}
}
],
"addresses": {
"0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3": 1,
"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2": 1,
"0xdac17f958d2ee523a2206206994597c13d831ec7": 1,
"0x1f98431c8ad98523631ae4a59f267346ea31f984": 1,
"0x11b815efb8f581194ae79006d24e0d814b7697f6": 1
}
},
{
"type": "CALL",
"from": "0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"to": "0x3333333acdedbbc9ad7bda0876e60714195681c5",
"value": "0x0",
"gas": "0x686a9",
"gasUsed": "0x172d8",
"input": "0x3df0212400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000066b2340fe0000000000000000000000000000000000000000000000000000000000000001",
"output": "0x",
"calls": [
{
"type": "DELEGATECALL",
"from": "0x3333333acdedbbc9ad7bda0876e60714195681c5",
"to": "0xbebc44782c7db0a1a60cb6fe97d0b483032ff1c7",
"gas": "0x66a85",
"gasUsed": "0x170a0",
"input": "0x3df0212400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000066b2340fe0000000000000000000000000000000000000000000000000000000000000001",
"output": "0x",
"calls": [
{
"type": "STATICCALL",
"from": "0x3333333acdedbbc9ad7bda0876e60714195681c5",
"to": "0xdac17f958d2ee523a2206206994597c13d831ec7",
"gas": "0x5dfac",
"gasUsed": "0xbd7",
"input": "0x70a082310000000000000000000000003333333acdedbbc9ad7bda0876e60714195681c5",
"output": "0x000000000000000000000000000000000000000000000000000003dd578bd638",
"addresses": {
"0x3333333acdedbbc9ad7bda0876e60714195681c5": 1
}
},
{
"type": "CALL",
"from": "0x3333333acdedbbc9ad7bda0876e60714195681c5",
"to": "0xdac17f958d2ee523a2206206994597c13d831ec7",
"value": "0x0",
"gas": "0x5d120",
"gasUsed": "0x2dd2",
"input": "0x23b872dd0000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d30000000000000000000000003333333acdedbbc9ad7bda0876e60714195681c5000000000000000000000000000000000000000000000000000000066b2340fe",
"output": "0x0000000000000000000000000000000000000000000000000000000000000000",
"addresses": {
"0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3": 1,
"0x3333333acdedbbc9ad7bda0876e60714195681c5": 1,
"0xc6cde7c39eb2f0f0095f41570af89efc2c1ea828": 1
}
},
{
"type": "STATICCALL",
"from": "0x3333333acdedbbc9ad7bda0876e60714195681c5",
"to": "0xdac17f958d2ee523a2206206994597c13d831ec7",
"gas": "0x5a241",
"gasUsed": "0x407",
"input": "0x70a082310000000000000000000000003333333acdedbbc9ad7bda0876e60714195681c5",
"output": "0x000000000000000000000000000000000000000000000000000003e3c2af1736",
"addresses": {
"0x3333333acdedbbc9ad7bda0876e60714195681c5": 1
}
},
{
"type": "CALL",
"from": "0x3333333acdedbbc9ad7bda0876e60714195681c5",
"to": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"value": "0x0",
"gas": "0x51d38",
"gasUsed": "0x2d61",
"input": "0xa9059cbb0000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d3000000000000000000000000000000000000000000000000000000066b98c297",
"output": "0x0000000000000000000000000000000000000000000000000000000000000001",
"calls": [
{
"type": "DELEGATECALL",
"from": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"to": "0xa2327a938febf5fec13bacfb16ae10ecbc4cbdcf",
"gas": "0x505e6",
"gasUsed": "0x2a4c",
"input": "0xa9059cbb0000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d3000000000000000000000000000000000000000000000000000000066b98c297",
"output": "0x",
"addresses": {
"0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3": 1,
"0xf0d160dec1749afaf5a831668093b1431f7c8527": 1,
"0x3333333acdedbbc9ad7bda0876e60714195681c5": 1
}
}
],
"addresses": {
"0x807a96288a1a408dbc13de2b1d087d10356395d2": 1,
"0x3333333acdedbbc9ad7bda0876e60714195681c5": 1,
"0xa2327a938febf5fec13bacfb16ae10ecbc4cbdcf": 1
}
}
],
"addresses": {
"0x00002af904b638ed930cddfe78cf741a9f440000": 0.6,
"0x0000334c40df9502deb37a4ac7f2d72780000000": 0.6,
"0x00002dc527a4a9017812d98e236bc2cb40000000": 0.6,
"0xdac17f958d2ee523a2206206994597c13d831ec7": 1,
"0x3333333acdedbbc9ad7bda0876e60714195681c5": 1,
"0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3": 1,
"0x0feef93405c3ca6c31df80109628d3137dcbe3b0": 0.6,
"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48": 1
}
}
],
"addresses": {
"0xbebc44782c7db0a1a60cb6fe97d0b483032ff1c7": 1
}
},
{
"type": "STATICCALL",
"from": "0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"to": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"gas": "0x517ca",
"gasUsed": "0x523",
"input": "0x70a082310000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"output": "0x000000000000000000000000000000000000000000000000000002851dd1f409",
"calls": [
{
"type": "DELEGATECALL",
"from": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"to": "0xa2327a938febf5fec13bacfb16ae10ecbc4cbdcf",
"gas": "0x50091",
"gasUsed": "0x211",
"input": "0x70a082310000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"output": "0x",
"addresses": {
"0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3": 1
}
}
],
"addresses": {
"0x807a96288a1a408dbc13de2b1d087d10356395d2": 1,
"0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3": 1,
"0xa2327a938febf5fec13bacfb16ae10ecbc4cbdcf": 1
}
},
{
"type": "STATICCALL",
"from": "0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
"gas": "0x510a3",
"gasUsed": "0x216",
"input": "0x70a082310000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"output": "0x00000000000000000000000000000000000000000000000972ca2015bb626252",
"addresses": {
"0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3": 1
}
}
],
"addresses": {
"0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8": 1,
"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48": 1,
"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2": 1,
"0x1f4de5cc412ff43db7663e39aaa04221ca9e995f": 1,
"0x11b815efb8f581194ae79006d24e0d814b7697f6": 1,
"0xdac17f958d2ee523a2206206994597c13d831ec7": 1,
"0x3333333acdedbbc9ad7bda0876e60714195681c5": 1,
"0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3": 1,
"0xe592427a0aece92de3edee1f18e0157c05861564": 1
}
}
]
}

View File

@ -0,0 +1,11 @@
{
"type": "CALL",
"from": "0xdc7d7a8920c8eecc098da5b7522a5f31509b5bfc",
"to": "0x1ca7c995f8ef0a2989bbce08d5b7efe50a584aa1",
"value": "0x0",
"gas": "0xabbb",
"gasUsed": "0x3982",
"input": "0xa9059cbb000000000000000000000000ca6d29232d1435d8198e3e5302495417dd073d61000000000000000000000000000000000000000000000000000000000000000a",
"output": "0x0000000000000000000000000000000000000000000000000000000000000001",
"time": "2.893709ms"
}

View File

@ -0,0 +1,449 @@
{
"type": "CALL",
"from": "0xf94d7953d44bdcc7a5585a61ed91899ef2d39524",
"to": "0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"value": "0x0",
"gas": "0xb3237",
"gasUsed": "0x5e42a",
"input": "0x0000004d0000000000000000000000000000000000000000000000000000000000c057bd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002c40000007300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000066aeefc9200000000000000000000000000000000000000000000000000000000009896800000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000003f8ad599c3a0ff1de082011efddc58f1908eb6e6d8a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000bb800000000000000000000000000000000000000000000000000000000000000003f11b815efb8f581194ae79006d24e0d814b7697f6c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2dac17f958d2ee523a2206206994597c13d831ec70001f40000000000000000000000000000000000000000000000000000000000000000173333333acdedbbc9ad7bda0876e60714195681c502010000000000000000000000000000000000000000000000000000000000000000000000000000",
"output": "0x",
"time": "1.064843378s",
"calls": [
{
"type": "DELEGATECALL",
"from": "0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"to": "0x240c7488df044d2f69d66201ee59a296c64d714c",
"gas": "0xae6af",
"gasUsed": "0x5c47b",
"input": "0x0000007300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000066aeefc9200000000000000000000000000000000000000000000000000000000009896800000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000003f8ad599c3a0ff1de082011efddc58f1908eb6e6d8a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000bb800000000000000000000000000000000000000000000000000000000000000003f11b815efb8f581194ae79006d24e0d814b7697f6c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2dac17f958d2ee523a2206206994597c13d831ec70001f40000000000000000000000000000000000000000000000000000000000000000173333333acdedbbc9ad7bda0876e60714195681c5020100000000000000000000",
"output": "0x",
"calls": [
{
"type": "DELEGATECALL",
"from": "0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"to": "0x1f4de5cc412ff43db7663e39aaa04221ca9e995f",
"gas": "0xa9f93",
"gasUsed": "0x572e",
"input": "0xdab617590000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000066aeefc920000000000000000000000008ad599c3a0ff1de082011efddc58f1908eb6e6d80000000000000000000000000000000000000000000000000000000000000bb8",
"output": "0x00000000000000000000000000000000000000000000000095d5e0843bea29b4",
"calls": [
{
"type": "STATICCALL",
"from": "0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"to": "0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8",
"gas": "0xa6846",
"gasUsed": "0x97c",
"input": "0x1a686502",
"output": "0x000000000000000000000000000000000000000000000001f6397f4bda22e9d2"
},
{
"type": "STATICCALL",
"from": "0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"to": "0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8",
"gas": "0xa5cc0",
"gasUsed": "0xa88",
"input": "0x3850c7bd",
"output": "0x0000000000000000000000000000000000004d6d55fae0dc58b57a67bdd9ed70000000000000000000000000000000000000000000000000000000000003050c00000000000000000000000000000000000000000000000000000000000001580000000000000000000000000000000000000000000000000000000000000168000000000000000000000000000000000000000000000000000000000000016800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"
},
{
"type": "STATICCALL",
"from": "0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"to": "0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8",
"gas": "0xa4e13",
"gasUsed": "0x117",
"input": "0xd0c93a7c",
"output": "0x000000000000000000000000000000000000000000000000000000000000003c"
},
{
"type": "STATICCALL",
"from": "0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"to": "0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8",
"gas": "0xa47b4",
"gasUsed": "0x9dd",
"input": "0x5339c296000000000000000000000000000000000000000000000000000000000000000c",
"output": "0xfffffffffffffffffffffffffffffffff7ffedbfdedfcf5dff2541aeb225cebc"
}
]
},
{
"type": "DELEGATECALL",
"from": "0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"to": "0x1f4de5cc412ff43db7663e39aaa04221ca9e995f",
"gas": "0xa42c2",
"gasUsed": "0x54dc",
"input": "0xdab61759000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000095d5e0843bea295000000000000000000000000011b815efb8f581194ae79006d24e0d814b7697f600000000000000000000000000000000000000000000000000000000000001f4",
"output": "0x000000000000000000000000000000000000000000000000000000066b234162",
"calls": [
{
"type": "STATICCALL",
"from": "0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"to": "0x11b815efb8f581194ae79006d24e0d814b7697f6",
"gas": "0xa0ce9",
"gasUsed": "0x97c",
"input": "0x1a686502",
"output": "0x000000000000000000000000000000000000000000000000058ca87960e3da12"
},
{
"type": "STATICCALL",
"from": "0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"to": "0x11b815efb8f581194ae79006d24e0d814b7697f6",
"gas": "0xa0162",
"gasUsed": "0xa88",
"input": "0x3850c7bd",
"output": "0x00000000000000000000000000000000000000000003508b4c0b22de548e9dfefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfb2500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"
},
{
"type": "STATICCALL",
"from": "0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"to": "0x11b815efb8f581194ae79006d24e0d814b7697f6",
"gas": "0x9f2b5",
"gasUsed": "0x117",
"input": "0xd0c93a7c",
"output": "0x000000000000000000000000000000000000000000000000000000000000000a"
},
{
"type": "STATICCALL",
"from": "0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"to": "0x11b815efb8f581194ae79006d24e0d814b7697f6",
"gas": "0x9ec15",
"gasUsed": "0x9dd",
"input": "0x5339c296ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2",
"output": "0x8b042000000401a10080b0790000011000808804000020012088600500000000"
}
]
},
{
"type": "STATICCALL",
"from": "0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"to": "0x3333333acdedbbc9ad7bda0876e60714195681c5",
"gas": "0x9e07f",
"gasUsed": "0x8c30",
"input": "0x5e0d443f00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000066b2340fe",
"output": "0x000000000000000000000000000000000000000000000000000000066b98c297",
"calls": [
{
"type": "DELEGATECALL",
"from": "0x3333333acdedbbc9ad7bda0876e60714195681c5",
"to": "0xbebc44782c7db0a1a60cb6fe97d0b483032ff1c7",
"gas": "0x9a597",
"gasUsed": "0x7852",
"input": "0x5e0d443f00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000066b2340fe",
"output": "0x"
}
]
},
{
"type": "STATICCALL",
"from": "0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"to": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"gas": "0x94a33",
"gasUsed": "0x2657",
"input": "0x70a082310000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"output": "0x000000000000000000000000000000000000000000000000000002851d282e04",
"calls": [
{
"type": "DELEGATECALL",
"from": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"to": "0xa2327a938febf5fec13bacfb16ae10ecbc4cbdcf",
"gas": "0x90932",
"gasUsed": "0x9e1",
"input": "0x70a082310000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"output": "0x"
}
]
},
{
"type": "STATICCALL",
"from": "0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
"gas": "0x918ce",
"gasUsed": "0x9e6",
"input": "0x70a082310000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"output": "0x00000000000000000000000000000000000000000000000972ca2015bb6261ee"
},
{
"type": "CALL",
"from": "0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"to": "0xe592427a0aece92de3edee1f18e0157c05861564",
"value": "0x0",
"gas": "0x8fd90",
"gasUsed": "0x149f1",
"input": "0x414bf389000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d30000000000000000000000000000000000000000000000000000000060c1bd37000000000000000000000000000000000000000000000000000000066aeefc9200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"output": "0x00000000000000000000000000000000000000000000000095d5e0843bea29b4",
"calls": [
{
"type": "CALL",
"from": "0xe592427a0aece92de3edee1f18e0157c05861564",
"to": "0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8",
"value": "0x0",
"gas": "0x8c828",
"gasUsed": "0x136ad",
"input": "0x128acb080000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d30000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000066aeefc9200000000000000000000000000000000000000000000000000000001000276a400000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d3000000000000000000000000000000000000000000000000000000000000002ba0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000bb8c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000",
"output": "0x000000000000000000000000000000000000000000000000000000066aeefc92ffffffffffffffffffffffffffffffffffffffffffffffff6a2a1f7bc415d64c",
"calls": [
{
"type": "CALL",
"from": "0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8",
"to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
"value": "0x0",
"gas": "0x83361",
"gasUsed": "0x2a6e",
"input": "0xa9059cbb0000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d300000000000000000000000000000000000000000000000095d5e0843bea29b4",
"output": "0x"
},
{
"type": "STATICCALL",
"from": "0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8",
"to": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"gas": "0x80635",
"gasUsed": "0xcf3",
"input": "0x70a082310000000000000000000000008ad599c3a0ff1de082011efddc58f1908eb6e6d8",
"output": "0x",
"calls": [
{
"type": "DELEGATECALL",
"from": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"to": "0xa2327a938febf5fec13bacfb16ae10ecbc4cbdcf",
"gas": "0x7e342",
"gasUsed": "0x9e1",
"input": "0x70a082310000000000000000000000008ad599c3a0ff1de082011efddc58f1908eb6e6d8",
"output": "0x"
}
]
},
{
"type": "CALL",
"from": "0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8",
"to": "0xe592427a0aece92de3edee1f18e0157c05861564",
"value": "0x0",
"gas": "0x7f660",
"gasUsed": "0x6f20",
"input": "0xfa461e33000000000000000000000000000000000000000000000000000000066aeefc92ffffffffffffffffffffffffffffffffffffffffffffffff6a2a1f7bc415d64c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d3000000000000000000000000000000000000000000000000000000000000002ba0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000bb8c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000",
"output": "0x",
"calls": [
{
"type": "CALL",
"from": "0xe592427a0aece92de3edee1f18e0157c05861564",
"to": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"value": "0x0",
"gas": "0x7c82a",
"gasUsed": "0x5f48",
"input": "0x23b872dd0000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d30000000000000000000000008ad599c3a0ff1de082011efddc58f1908eb6e6d8000000000000000000000000000000000000000000000000000000066aeefc92",
"output": "0x",
"calls": [
{
"type": "DELEGATECALL",
"from": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"to": "0xa2327a938febf5fec13bacfb16ae10ecbc4cbdcf",
"gas": "0x7a627",
"gasUsed": "0x5c2d",
"input": "0x23b872dd0000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d30000000000000000000000008ad599c3a0ff1de082011efddc58f1908eb6e6d8000000000000000000000000000000000000000000000000000000066aeefc92",
"output": "0x"
}
]
}
]
},
{
"type": "STATICCALL",
"from": "0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8",
"to": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"gas": "0x78683",
"gasUsed": "0x523",
"input": "0x70a082310000000000000000000000008ad599c3a0ff1de082011efddc58f1908eb6e6d8",
"output": "0x",
"calls": [
{
"type": "DELEGATECALL",
"from": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"to": "0xa2327a938febf5fec13bacfb16ae10ecbc4cbdcf",
"gas": "0x7658f",
"gasUsed": "0x211",
"input": "0x70a082310000000000000000000000008ad599c3a0ff1de082011efddc58f1908eb6e6d8",
"output": "0x"
}
]
}
]
}
]
},
{
"type": "CALL",
"from": "0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"to": "0xe592427a0aece92de3edee1f18e0157c05861564",
"value": "0x0",
"gas": "0x7b0d9",
"gasUsed": "0x129fb",
"input": "0x414bf389000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000000000000000000000000000000000000000001f40000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d30000000000000000000000000000000000000000000000000000000060c1bd3700000000000000000000000000000000000000000000000095d5e0843bea295000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"output": "0x000000000000000000000000000000000000000000000000000000066b234162",
"calls": [
{
"type": "CALL",
"from": "0xe592427a0aece92de3edee1f18e0157c05861564",
"to": "0x11b815efb8f581194ae79006d24e0d814b7697f6",
"value": "0x0",
"gas": "0x780a4",
"gasUsed": "0x116b7",
"input": "0x128acb080000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d3000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000095d5e0843bea295000000000000000000000000000000000000000000000000000000001000276a400000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d3000000000000000000000000000000000000000000000000000000000000002bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc20001f4dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000000000000000000000",
"output": "0x00000000000000000000000000000000000000000000000095d5e0843bea2950fffffffffffffffffffffffffffffffffffffffffffffffffffffff994dcbe9e",
"calls": [
{
"type": "CALL",
"from": "0x11b815efb8f581194ae79006d24e0d814b7697f6",
"to": "0xdac17f958d2ee523a2206206994597c13d831ec7",
"value": "0x0",
"gas": "0x70048",
"gasUsed": "0x5fb5",
"input": "0xa9059cbb0000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d3000000000000000000000000000000000000000000000000000000066b234162",
"output": "0x"
},
{
"type": "STATICCALL",
"from": "0x11b815efb8f581194ae79006d24e0d814b7697f6",
"to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
"gas": "0x69f28",
"gasUsed": "0x9e6",
"input": "0x70a0823100000000000000000000000011b815efb8f581194ae79006d24e0d814b7697f6",
"output": "0x"
},
{
"type": "CALL",
"from": "0x11b815efb8f581194ae79006d24e0d814b7697f6",
"to": "0xe592427a0aece92de3edee1f18e0157c05861564",
"value": "0x0",
"gas": "0x69254",
"gasUsed": "0x3009",
"input": "0xfa461e3300000000000000000000000000000000000000000000000095d5e0843bea2950fffffffffffffffffffffffffffffffffffffffffffffffffffffff994dcbe9e000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d3000000000000000000000000000000000000000000000000000000000000002bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc20001f4dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000000000000000000000",
"output": "0x",
"calls": [
{
"type": "CALL",
"from": "0xe592427a0aece92de3edee1f18e0157c05861564",
"to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
"value": "0x0",
"gas": "0x6699f",
"gasUsed": "0x2021",
"input": "0x23b872dd0000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d300000000000000000000000011b815efb8f581194ae79006d24e0d814b7697f600000000000000000000000000000000000000000000000095d5e0843bea2950",
"output": "0x"
}
]
},
{
"type": "STATICCALL",
"from": "0x11b815efb8f581194ae79006d24e0d814b7697f6",
"to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
"gas": "0x66093",
"gasUsed": "0x216",
"input": "0x70a0823100000000000000000000000011b815efb8f581194ae79006d24e0d814b7697f6",
"output": "0x"
}
]
}
]
},
{
"type": "CALL",
"from": "0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"to": "0x3333333acdedbbc9ad7bda0876e60714195681c5",
"value": "0x0",
"gas": "0x686a9",
"gasUsed": "0x172d8",
"input": "0x3df0212400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000066b2340fe0000000000000000000000000000000000000000000000000000000000000001",
"output": "0x",
"calls": [
{
"type": "DELEGATECALL",
"from": "0x3333333acdedbbc9ad7bda0876e60714195681c5",
"to": "0xbebc44782c7db0a1a60cb6fe97d0b483032ff1c7",
"gas": "0x66a85",
"gasUsed": "0x170a0",
"input": "0x3df0212400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000066b2340fe0000000000000000000000000000000000000000000000000000000000000001",
"output": "0x",
"calls": [
{
"type": "STATICCALL",
"from": "0x3333333acdedbbc9ad7bda0876e60714195681c5",
"to": "0xdac17f958d2ee523a2206206994597c13d831ec7",
"gas": "0x5dfac",
"gasUsed": "0xbd7",
"input": "0x70a082310000000000000000000000003333333acdedbbc9ad7bda0876e60714195681c5",
"output": "0x000000000000000000000000000000000000000000000000000003dd578bd638"
},
{
"type": "CALL",
"from": "0x3333333acdedbbc9ad7bda0876e60714195681c5",
"to": "0xdac17f958d2ee523a2206206994597c13d831ec7",
"value": "0x0",
"gas": "0x5d120",
"gasUsed": "0x2dd2",
"input": "0x23b872dd0000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d30000000000000000000000003333333acdedbbc9ad7bda0876e60714195681c5000000000000000000000000000000000000000000000000000000066b2340fe",
"output": "0x0000000000000000000000000000000000000000000000000000000000000000"
},
{
"type": "STATICCALL",
"from": "0x3333333acdedbbc9ad7bda0876e60714195681c5",
"to": "0xdac17f958d2ee523a2206206994597c13d831ec7",
"gas": "0x5a241",
"gasUsed": "0x407",
"input": "0x70a082310000000000000000000000003333333acdedbbc9ad7bda0876e60714195681c5",
"output": "0x000000000000000000000000000000000000000000000000000003e3c2af1736"
},
{
"type": "CALL",
"from": "0x3333333acdedbbc9ad7bda0876e60714195681c5",
"to": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"value": "0x0",
"gas": "0x51d38",
"gasUsed": "0x2d61",
"input": "0xa9059cbb0000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d3000000000000000000000000000000000000000000000000000000066b98c297",
"output": "0x0000000000000000000000000000000000000000000000000000000000000001",
"calls": [
{
"type": "DELEGATECALL",
"from": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"to": "0xa2327a938febf5fec13bacfb16ae10ecbc4cbdcf",
"gas": "0x505e6",
"gasUsed": "0x2a4c",
"input": "0xa9059cbb0000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d3000000000000000000000000000000000000000000000000000000066b98c297",
"output": "0x"
}
]
}
]
}
]
},
{
"type": "STATICCALL",
"from": "0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"to": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"gas": "0x517ca",
"gasUsed": "0x523",
"input": "0x70a082310000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"output": "0x000000000000000000000000000000000000000000000000000002851dd1f409",
"calls": [
{
"type": "DELEGATECALL",
"from": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"to": "0xa2327a938febf5fec13bacfb16ae10ecbc4cbdcf",
"gas": "0x50091",
"gasUsed": "0x211",
"input": "0x70a082310000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"output": "0x"
}
]
},
{
"type": "STATICCALL",
"from": "0x5af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
"gas": "0x510a3",
"gasUsed": "0x216",
"input": "0x70a082310000000000000000000000005af7f71c7747fb0eceb2eef115c3fa34dd4998d3",
"output": "0x00000000000000000000000000000000000000000000000972ca2015bb626252"
}
]
}
]
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,5 @@
{
"from": "0xDC7d7A8920C8Eecc098da5B7522a5F31509b5Bfc",
"to": "0x1ca7c995f8eF0A2989BbcE08D5B7Efe50A584aa1",
"data": "0xa9059cbb000000000000000000000000ca6d29232d1435d8198e3e5302495417dd073d610000000000000000000000000000000000000000000000000de0b6b3a7640000"
}

View File

@ -0,0 +1,5 @@
{
"from": "0x66b6d6e78fbc4575f5197ae15af62f5dc7d48349",
"to": "0xBA11D00c5f74255f56a5E366F4F77f5A186d7f55",
"data": "0xa9059cbb0000000000000000000000009acbb72cf67103a30333a32cd203459c6a9c33110000000000000000000000000000000000000000000001b17762dcdde1bc1000"
}

View File

@ -0,0 +1,5 @@
{
"from": "0x633f5500a87c3dbb9c15f4d41ed5a33dacaf4184",
"to": "0x586c82144eb8c0a64c654ef30463524c759a8f30",
"data": "0xade823420000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008430783339363062396537626136316337666236623662396263616637356538613138616636306138333564326162383064623665326162346430646336393863666633323062356561353235303466323831656338313337393733353835396334313336343561633136616163613232386439343939643066623631663866326537316200000000000000000000000000000000000000000000000000000000"
}

View File

@ -0,0 +1,74 @@
{
"compilerOptions": {
/* Visit https://aka.ms/tsconfig.json to read more about this file */
/* Basic Options */
// "incremental": true, /* Enable incremental compilation */
"target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', 'ES2021', or 'ESNEXT'. */
"module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
// "lib": [], /* Specify library files to be included in the compilation. */
// "allowJs": true, /* Allow javascript files to be compiled. */
// "checkJs": true, /* Report errors in .js files. */
// "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', 'react', 'react-jsx' or 'react-jsxdev'. */
"declaration": true, /* Generates corresponding '.d.ts' file. */
// "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
// "sourceMap": true, /* Generates corresponding '.map' file. */
// "outFile": "./", /* Concatenate and emit output to single file. */
"outDir": "./dist", /* Redirect output structure to the directory. */
// "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
// "composite": true, /* Enable project compilation */
// "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */
// "removeComments": true, /* Do not emit comments to output. */
// "noEmit": true, /* Do not emit outputs. */
// "importHelpers": true, /* Import emit helpers from 'tslib'. */
// "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
// "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
/* Strict Type-Checking Options */
"strict": true, /* Enable all strict type-checking options. */
// "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
// "strictNullChecks": true, /* Enable strict null checks. */
// "strictFunctionTypes": true, /* Enable strict checking of function types. */
// "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
// "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
// "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
// "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
/* Additional Checks */
// "noUnusedLocals": true, /* Report errors on unused locals. */
// "noUnusedParameters": true, /* Report errors on unused parameters. */
// "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
// "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
// "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */
// "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an 'override' modifier. */
// "noPropertyAccessFromIndexSignature": true, /* Require undeclared properties from index signatures to use element accesses. */
/* Module Resolution Options */
"moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
// "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
// "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
// "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
// "typeRoots": [], /* List of folders to include type definitions from. */
// "types": [], /* Type declaration files to be included in compilation. */
// "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
"esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
// "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
/* Source Map Options */
// "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
// "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
// "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
/* Experimental Options */
// "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
// "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
/* Advanced Options */
"skipLibCheck": true, /* Skip type checking of declaration files. */
"forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */
},
"include": ["src/**/*"],
"exclude": ["src/**/*.test.ts"]
}

View File

@ -299,6 +299,21 @@
"@ethersproject/properties" "^5.3.0"
"@ethersproject/strings" "^5.3.0"
"@ethersproject/abi@5.3.1":
version "5.3.1"
resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.3.1.tgz#69a1a496729d3a83521675a57cbe21f3cc27241c"
integrity sha512-F98FWTJG7nWWAQ4DcV6R0cSlrj67MWK3ylahuFbzkumem5cLWg1p7fZ3vIdRoS1c7TEf55Lvyx0w7ICR47IImw==
dependencies:
"@ethersproject/address" "^5.3.0"
"@ethersproject/bignumber" "^5.3.0"
"@ethersproject/bytes" "^5.3.0"
"@ethersproject/constants" "^5.3.0"
"@ethersproject/hash" "^5.3.0"
"@ethersproject/keccak256" "^5.3.0"
"@ethersproject/logger" "^5.3.0"
"@ethersproject/properties" "^5.3.0"
"@ethersproject/strings" "^5.3.0"
"@ethersproject/abstract-provider@5.2.0":
version "5.2.0"
resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.2.0.tgz#b5c24b162f119b5d241738ded9555186013aa77d"
@ -619,6 +634,13 @@
dependencies:
"@ethersproject/logger" "^5.3.0"
"@ethersproject/networks@5.3.1":
version "5.3.1"
resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.3.1.tgz#78fe08324cee289ce239acf8c746121934b2ef61"
integrity sha512-6uQKHkYChlsfeiZhQ8IHIqGE/sQsf25o9ZxAYpMxi15dLPzz3IxOEF5KiSD32aHwsjXVBKBSlo+teAXLlYJybw==
dependencies:
"@ethersproject/logger" "^5.3.0"
"@ethersproject/pbkdf2@5.2.0":
version "5.2.0"
resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.2.0.tgz#8166a7a7238a5fd1d9bb6eb2000fea0f19fdde06"
@ -699,6 +721,31 @@
bech32 "1.1.4"
ws "7.4.6"
"@ethersproject/providers@5.3.1":
version "5.3.1"
resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.3.1.tgz#a12c6370e8cbc0968c9744641b8ef90b0dd5ec2b"
integrity sha512-HC63vENTrur6/JKEhcQbA8PRDj1FAesdpX98IW+xAAo3EAkf70ou5fMIA3KCGzJDLNTeYA4C2Bonz849tVLekg==
dependencies:
"@ethersproject/abstract-provider" "^5.3.0"
"@ethersproject/abstract-signer" "^5.3.0"
"@ethersproject/address" "^5.3.0"
"@ethersproject/basex" "^5.3.0"
"@ethersproject/bignumber" "^5.3.0"
"@ethersproject/bytes" "^5.3.0"
"@ethersproject/constants" "^5.3.0"
"@ethersproject/hash" "^5.3.0"
"@ethersproject/logger" "^5.3.0"
"@ethersproject/networks" "^5.3.0"
"@ethersproject/properties" "^5.3.0"
"@ethersproject/random" "^5.3.0"
"@ethersproject/rlp" "^5.3.0"
"@ethersproject/sha2" "^5.3.0"
"@ethersproject/strings" "^5.3.0"
"@ethersproject/transactions" "^5.3.0"
"@ethersproject/web" "^5.3.0"
bech32 "1.1.4"
ws "7.4.6"
"@ethersproject/random@5.2.0":
version "5.2.0"
resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.2.0.tgz#1d7e19f17d88eda56228a263063826829e49eebe"
@ -6078,6 +6125,42 @@ ethers@^5.2.0:
"@ethersproject/web" "5.3.0"
"@ethersproject/wordlists" "5.3.0"
ethers@^5.3.1:
version "5.3.1"
resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.3.1.tgz#1f018f0aeb651576cd84fd987a45f0b99646d761"
integrity sha512-xCKmC0gsZ9gks89ZfK3B1y6LlPdvX5fxDtu9SytnpdDJR1M7pmJI+4H0AxQPMgUYr7GtQdmECLR0gWdJQ+lZYw==
dependencies:
"@ethersproject/abi" "5.3.1"
"@ethersproject/abstract-provider" "5.3.0"
"@ethersproject/abstract-signer" "5.3.0"
"@ethersproject/address" "5.3.0"
"@ethersproject/base64" "5.3.0"
"@ethersproject/basex" "5.3.0"
"@ethersproject/bignumber" "5.3.0"
"@ethersproject/bytes" "5.3.0"
"@ethersproject/constants" "5.3.0"
"@ethersproject/contracts" "5.3.0"
"@ethersproject/hash" "5.3.0"
"@ethersproject/hdnode" "5.3.0"
"@ethersproject/json-wallets" "5.3.0"
"@ethersproject/keccak256" "5.3.0"
"@ethersproject/logger" "5.3.0"
"@ethersproject/networks" "5.3.1"
"@ethersproject/pbkdf2" "5.3.0"
"@ethersproject/properties" "5.3.0"
"@ethersproject/providers" "5.3.1"
"@ethersproject/random" "5.3.0"
"@ethersproject/rlp" "5.3.0"
"@ethersproject/sha2" "5.3.0"
"@ethersproject/signing-key" "5.3.0"
"@ethersproject/solidity" "5.3.0"
"@ethersproject/strings" "5.3.0"
"@ethersproject/transactions" "5.3.0"
"@ethersproject/units" "5.3.0"
"@ethersproject/wallet" "5.3.0"
"@ethersproject/web" "5.3.0"
"@ethersproject/wordlists" "5.3.0"
ethjs-unit@0.1.6:
version "0.1.6"
resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699"