mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-20 10:52:25 +00:00
Delete eth/tracers directory
This commit is contained in:
parent
a8a5f83c58
commit
bc955bf330
114 changed files with 0 additions and 20254 deletions
1040
eth/tracers/api.go
1040
eth/tracers/api.go
File diff suppressed because it is too large
Load diff
|
|
@ -1,997 +0,0 @@
|
||||||
// Copyright 2021 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/>.
|
|
||||||
|
|
||||||
package tracers
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"crypto/ecdsa"
|
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"math/big"
|
|
||||||
"reflect"
|
|
||||||
"sync/atomic"
|
|
||||||
"testing"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
|
||||||
"github.com/ethereum/go-ethereum/common/hexutil"
|
|
||||||
"github.com/ethereum/go-ethereum/consensus"
|
|
||||||
"github.com/ethereum/go-ethereum/consensus/ethash"
|
|
||||||
"github.com/ethereum/go-ethereum/core"
|
|
||||||
"github.com/ethereum/go-ethereum/core/rawdb"
|
|
||||||
"github.com/ethereum/go-ethereum/core/state"
|
|
||||||
"github.com/ethereum/go-ethereum/core/types"
|
|
||||||
"github.com/ethereum/go-ethereum/core/vm"
|
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
|
||||||
"github.com/ethereum/go-ethereum/eth/tracers/logger"
|
|
||||||
"github.com/ethereum/go-ethereum/ethdb"
|
|
||||||
"github.com/ethereum/go-ethereum/internal/ethapi"
|
|
||||||
"github.com/ethereum/go-ethereum/params"
|
|
||||||
"github.com/ethereum/go-ethereum/rpc"
|
|
||||||
"golang.org/x/exp/slices"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
errStateNotFound = errors.New("state not found")
|
|
||||||
errBlockNotFound = errors.New("block not found")
|
|
||||||
)
|
|
||||||
|
|
||||||
type testBackend struct {
|
|
||||||
chainConfig *params.ChainConfig
|
|
||||||
engine consensus.Engine
|
|
||||||
chaindb ethdb.Database
|
|
||||||
chain *core.BlockChain
|
|
||||||
|
|
||||||
refHook func() // Hook is invoked when the requested state is referenced
|
|
||||||
relHook func() // Hook is invoked when the requested state is released
|
|
||||||
}
|
|
||||||
|
|
||||||
// testBackend creates a new test backend. OBS: After test is done, teardown must be
|
|
||||||
// invoked in order to release associated resources.
|
|
||||||
func newTestBackend(t *testing.T, n int, gspec *core.Genesis, generator func(i int, b *core.BlockGen)) *testBackend {
|
|
||||||
backend := &testBackend{
|
|
||||||
chainConfig: gspec.Config,
|
|
||||||
engine: ethash.NewFaker(),
|
|
||||||
chaindb: rawdb.NewMemoryDatabase(),
|
|
||||||
}
|
|
||||||
// Generate blocks for testing
|
|
||||||
_, blocks, _ := core.GenerateChainWithGenesis(gspec, backend.engine, n, generator)
|
|
||||||
|
|
||||||
// Import the canonical chain
|
|
||||||
cacheConfig := &core.CacheConfig{
|
|
||||||
TrieCleanLimit: 256,
|
|
||||||
TrieDirtyLimit: 256,
|
|
||||||
TrieTimeLimit: 5 * time.Minute,
|
|
||||||
SnapshotLimit: 0,
|
|
||||||
TrieDirtyDisabled: true, // Archive mode
|
|
||||||
}
|
|
||||||
chain, err := core.NewBlockChain(backend.chaindb, cacheConfig, gspec, nil, backend.engine, vm.Config{}, nil, nil)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to create tester chain: %v", err)
|
|
||||||
}
|
|
||||||
if n, err := chain.InsertChain(blocks); err != nil {
|
|
||||||
t.Fatalf("block %d: failed to insert into chain: %v", n, err)
|
|
||||||
}
|
|
||||||
backend.chain = chain
|
|
||||||
return backend
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *testBackend) HeaderByHash(ctx context.Context, hash common.Hash) (*types.Header, error) {
|
|
||||||
return b.chain.GetHeaderByHash(hash), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *testBackend) HeaderByNumber(ctx context.Context, number rpc.BlockNumber) (*types.Header, error) {
|
|
||||||
if number == rpc.PendingBlockNumber || number == rpc.LatestBlockNumber {
|
|
||||||
return b.chain.CurrentHeader(), nil
|
|
||||||
}
|
|
||||||
return b.chain.GetHeaderByNumber(uint64(number)), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *testBackend) BlockByHash(ctx context.Context, hash common.Hash) (*types.Block, error) {
|
|
||||||
return b.chain.GetBlockByHash(hash), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *testBackend) BlockByNumber(ctx context.Context, number rpc.BlockNumber) (*types.Block, error) {
|
|
||||||
if number == rpc.PendingBlockNumber || number == rpc.LatestBlockNumber {
|
|
||||||
return b.chain.GetBlockByNumber(b.chain.CurrentBlock().Number.Uint64()), nil
|
|
||||||
}
|
|
||||||
return b.chain.GetBlockByNumber(uint64(number)), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *testBackend) GetTransaction(ctx context.Context, txHash common.Hash) (*types.Transaction, common.Hash, uint64, uint64, error) {
|
|
||||||
tx, hash, blockNumber, index := rawdb.ReadTransaction(b.chaindb, txHash)
|
|
||||||
return tx, hash, blockNumber, index, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *testBackend) RPCGasCap() uint64 {
|
|
||||||
return 25000000
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *testBackend) ChainConfig() *params.ChainConfig {
|
|
||||||
return b.chainConfig
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *testBackend) Engine() consensus.Engine {
|
|
||||||
return b.engine
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *testBackend) ChainDb() ethdb.Database {
|
|
||||||
return b.chaindb
|
|
||||||
}
|
|
||||||
|
|
||||||
// teardown releases the associated resources.
|
|
||||||
func (b *testBackend) teardown() {
|
|
||||||
b.chain.Stop()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *testBackend) StateAtBlock(ctx context.Context, block *types.Block, reexec uint64, base *state.StateDB, readOnly bool, preferDisk bool) (*state.StateDB, StateReleaseFunc, error) {
|
|
||||||
statedb, err := b.chain.StateAt(block.Root())
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, errStateNotFound
|
|
||||||
}
|
|
||||||
if b.refHook != nil {
|
|
||||||
b.refHook()
|
|
||||||
}
|
|
||||||
release := func() {
|
|
||||||
if b.relHook != nil {
|
|
||||||
b.relHook()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return statedb, release, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *testBackend) StateAtTransaction(ctx context.Context, block *types.Block, txIndex int, reexec uint64) (*core.Message, vm.BlockContext, *state.StateDB, StateReleaseFunc, error) {
|
|
||||||
parent := b.chain.GetBlock(block.ParentHash(), block.NumberU64()-1)
|
|
||||||
if parent == nil {
|
|
||||||
return nil, vm.BlockContext{}, nil, nil, errBlockNotFound
|
|
||||||
}
|
|
||||||
statedb, release, err := b.StateAtBlock(ctx, parent, reexec, nil, true, false)
|
|
||||||
if err != nil {
|
|
||||||
return nil, vm.BlockContext{}, nil, nil, errStateNotFound
|
|
||||||
}
|
|
||||||
if txIndex == 0 && len(block.Transactions()) == 0 {
|
|
||||||
return nil, vm.BlockContext{}, statedb, release, nil
|
|
||||||
}
|
|
||||||
// Recompute transactions up to the target index.
|
|
||||||
signer := types.MakeSigner(b.chainConfig, block.Number(), block.Time())
|
|
||||||
for idx, tx := range block.Transactions() {
|
|
||||||
msg, _ := core.TransactionToMessage(tx, signer, block.BaseFee())
|
|
||||||
txContext := core.NewEVMTxContext(msg)
|
|
||||||
context := core.NewEVMBlockContext(block.Header(), b.chain, nil)
|
|
||||||
if idx == txIndex {
|
|
||||||
return msg, context, statedb, release, nil
|
|
||||||
}
|
|
||||||
vmenv := vm.NewEVM(context, txContext, statedb, b.chainConfig, vm.Config{})
|
|
||||||
if _, err := core.ApplyMessage(vmenv, msg, new(core.GasPool).AddGas(tx.Gas())); err != nil {
|
|
||||||
return nil, vm.BlockContext{}, nil, nil, fmt.Errorf("transaction %#x failed: %v", tx.Hash(), err)
|
|
||||||
}
|
|
||||||
statedb.Finalise(vmenv.ChainConfig().IsEIP158(block.Number()))
|
|
||||||
}
|
|
||||||
return nil, vm.BlockContext{}, nil, nil, fmt.Errorf("transaction index %d out of range for block %#x", txIndex, block.Hash())
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestTraceCall(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
// Initialize test accounts
|
|
||||||
accounts := newAccounts(3)
|
|
||||||
genesis := &core.Genesis{
|
|
||||||
Config: params.TestChainConfig,
|
|
||||||
Alloc: core.GenesisAlloc{
|
|
||||||
accounts[0].addr: {Balance: big.NewInt(params.Ether)},
|
|
||||||
accounts[1].addr: {Balance: big.NewInt(params.Ether)},
|
|
||||||
accounts[2].addr: {Balance: big.NewInt(params.Ether)},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
genBlocks := 10
|
|
||||||
signer := types.HomesteadSigner{}
|
|
||||||
nonce := uint64(0)
|
|
||||||
backend := newTestBackend(t, genBlocks, genesis, func(i int, b *core.BlockGen) {
|
|
||||||
// Transfer from account[0] to account[1]
|
|
||||||
// value: 1000 wei
|
|
||||||
// fee: 0 wei
|
|
||||||
tx, _ := types.SignTx(types.NewTx(&types.LegacyTx{
|
|
||||||
Nonce: nonce,
|
|
||||||
To: &accounts[1].addr,
|
|
||||||
Value: big.NewInt(1000),
|
|
||||||
Gas: params.TxGas,
|
|
||||||
GasPrice: b.BaseFee(),
|
|
||||||
Data: nil}),
|
|
||||||
signer, accounts[0].key)
|
|
||||||
b.AddTx(tx)
|
|
||||||
nonce++
|
|
||||||
|
|
||||||
if i == genBlocks-2 {
|
|
||||||
// Transfer from account[0] to account[2]
|
|
||||||
tx, _ = types.SignTx(types.NewTx(&types.LegacyTx{
|
|
||||||
Nonce: nonce,
|
|
||||||
To: &accounts[2].addr,
|
|
||||||
Value: big.NewInt(1000),
|
|
||||||
Gas: params.TxGas,
|
|
||||||
GasPrice: b.BaseFee(),
|
|
||||||
Data: nil}),
|
|
||||||
signer, accounts[0].key)
|
|
||||||
b.AddTx(tx)
|
|
||||||
nonce++
|
|
||||||
|
|
||||||
// Transfer from account[0] to account[1] again
|
|
||||||
tx, _ = types.SignTx(types.NewTx(&types.LegacyTx{
|
|
||||||
Nonce: nonce,
|
|
||||||
To: &accounts[1].addr,
|
|
||||||
Value: big.NewInt(1000),
|
|
||||||
Gas: params.TxGas,
|
|
||||||
GasPrice: b.BaseFee(),
|
|
||||||
Data: nil}),
|
|
||||||
signer, accounts[0].key)
|
|
||||||
b.AddTx(tx)
|
|
||||||
nonce++
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
uintPtr := func(i int) *hexutil.Uint { x := hexutil.Uint(i); return &x }
|
|
||||||
|
|
||||||
defer backend.teardown()
|
|
||||||
api := NewAPI(backend)
|
|
||||||
var testSuite = []struct {
|
|
||||||
blockNumber rpc.BlockNumber
|
|
||||||
call ethapi.TransactionArgs
|
|
||||||
config *TraceCallConfig
|
|
||||||
expectErr error
|
|
||||||
expect string
|
|
||||||
}{
|
|
||||||
// Standard JSON trace upon the genesis, plain transfer.
|
|
||||||
{
|
|
||||||
blockNumber: rpc.BlockNumber(0),
|
|
||||||
call: ethapi.TransactionArgs{
|
|
||||||
From: &accounts[0].addr,
|
|
||||||
To: &accounts[1].addr,
|
|
||||||
Value: (*hexutil.Big)(big.NewInt(1000)),
|
|
||||||
},
|
|
||||||
config: nil,
|
|
||||||
expectErr: nil,
|
|
||||||
expect: `{"gas":21000,"failed":false,"returnValue":"","structLogs":[]}`,
|
|
||||||
},
|
|
||||||
// Standard JSON trace upon the head, plain transfer.
|
|
||||||
{
|
|
||||||
blockNumber: rpc.BlockNumber(genBlocks),
|
|
||||||
call: ethapi.TransactionArgs{
|
|
||||||
From: &accounts[0].addr,
|
|
||||||
To: &accounts[1].addr,
|
|
||||||
Value: (*hexutil.Big)(big.NewInt(1000)),
|
|
||||||
},
|
|
||||||
config: nil,
|
|
||||||
expectErr: nil,
|
|
||||||
expect: `{"gas":21000,"failed":false,"returnValue":"","structLogs":[]}`,
|
|
||||||
},
|
|
||||||
// Upon the last state, default to the post block's state
|
|
||||||
{
|
|
||||||
blockNumber: rpc.BlockNumber(genBlocks - 1),
|
|
||||||
call: ethapi.TransactionArgs{
|
|
||||||
From: &accounts[2].addr,
|
|
||||||
To: &accounts[0].addr,
|
|
||||||
Value: (*hexutil.Big)(new(big.Int).Add(big.NewInt(params.Ether), big.NewInt(100))),
|
|
||||||
},
|
|
||||||
config: nil,
|
|
||||||
expect: `{"gas":21000,"failed":false,"returnValue":"","structLogs":[]}`,
|
|
||||||
},
|
|
||||||
// Before the first transaction, should be failed
|
|
||||||
{
|
|
||||||
blockNumber: rpc.BlockNumber(genBlocks - 1),
|
|
||||||
call: ethapi.TransactionArgs{
|
|
||||||
From: &accounts[2].addr,
|
|
||||||
To: &accounts[0].addr,
|
|
||||||
Value: (*hexutil.Big)(new(big.Int).Add(big.NewInt(params.Ether), big.NewInt(100))),
|
|
||||||
},
|
|
||||||
config: &TraceCallConfig{TxIndex: uintPtr(0)},
|
|
||||||
expectErr: fmt.Errorf("tracing failed: insufficient funds for gas * price + value: address %s have 1000000000000000000 want 1000000000000000100", accounts[2].addr),
|
|
||||||
},
|
|
||||||
// Before the target transaction, should be failed
|
|
||||||
{
|
|
||||||
blockNumber: rpc.BlockNumber(genBlocks - 1),
|
|
||||||
call: ethapi.TransactionArgs{
|
|
||||||
From: &accounts[2].addr,
|
|
||||||
To: &accounts[0].addr,
|
|
||||||
Value: (*hexutil.Big)(new(big.Int).Add(big.NewInt(params.Ether), big.NewInt(100))),
|
|
||||||
},
|
|
||||||
config: &TraceCallConfig{TxIndex: uintPtr(1)},
|
|
||||||
expectErr: fmt.Errorf("tracing failed: insufficient funds for gas * price + value: address %s have 1000000000000000000 want 1000000000000000100", accounts[2].addr),
|
|
||||||
},
|
|
||||||
// After the target transaction, should be succeed
|
|
||||||
{
|
|
||||||
blockNumber: rpc.BlockNumber(genBlocks - 1),
|
|
||||||
call: ethapi.TransactionArgs{
|
|
||||||
From: &accounts[2].addr,
|
|
||||||
To: &accounts[0].addr,
|
|
||||||
Value: (*hexutil.Big)(new(big.Int).Add(big.NewInt(params.Ether), big.NewInt(100))),
|
|
||||||
},
|
|
||||||
config: &TraceCallConfig{TxIndex: uintPtr(2)},
|
|
||||||
expectErr: nil,
|
|
||||||
expect: `{"gas":21000,"failed":false,"returnValue":"","structLogs":[]}`,
|
|
||||||
},
|
|
||||||
// Standard JSON trace upon the non-existent block, error expects
|
|
||||||
{
|
|
||||||
blockNumber: rpc.BlockNumber(genBlocks + 1),
|
|
||||||
call: ethapi.TransactionArgs{
|
|
||||||
From: &accounts[0].addr,
|
|
||||||
To: &accounts[1].addr,
|
|
||||||
Value: (*hexutil.Big)(big.NewInt(1000)),
|
|
||||||
},
|
|
||||||
config: nil,
|
|
||||||
expectErr: fmt.Errorf("block #%d not found", genBlocks+1),
|
|
||||||
//expect: nil,
|
|
||||||
},
|
|
||||||
// Standard JSON trace upon the latest block
|
|
||||||
{
|
|
||||||
blockNumber: rpc.LatestBlockNumber,
|
|
||||||
call: ethapi.TransactionArgs{
|
|
||||||
From: &accounts[0].addr,
|
|
||||||
To: &accounts[1].addr,
|
|
||||||
Value: (*hexutil.Big)(big.NewInt(1000)),
|
|
||||||
},
|
|
||||||
config: nil,
|
|
||||||
expectErr: nil,
|
|
||||||
expect: `{"gas":21000,"failed":false,"returnValue":"","structLogs":[]}`,
|
|
||||||
},
|
|
||||||
// Tracing on 'pending' should fail:
|
|
||||||
{
|
|
||||||
blockNumber: rpc.PendingBlockNumber,
|
|
||||||
call: ethapi.TransactionArgs{
|
|
||||||
From: &accounts[0].addr,
|
|
||||||
To: &accounts[1].addr,
|
|
||||||
Value: (*hexutil.Big)(big.NewInt(1000)),
|
|
||||||
},
|
|
||||||
config: nil,
|
|
||||||
expectErr: errors.New("tracing on top of pending is not supported"),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
blockNumber: rpc.LatestBlockNumber,
|
|
||||||
call: ethapi.TransactionArgs{
|
|
||||||
From: &accounts[0].addr,
|
|
||||||
Input: &hexutil.Bytes{0x43}, // blocknumber
|
|
||||||
},
|
|
||||||
config: &TraceCallConfig{
|
|
||||||
BlockOverrides: ðapi.BlockOverrides{Number: (*hexutil.Big)(big.NewInt(0x1337))},
|
|
||||||
},
|
|
||||||
expectErr: nil,
|
|
||||||
expect: ` {"gas":53018,"failed":false,"returnValue":"","structLogs":[
|
|
||||||
{"pc":0,"op":"NUMBER","gas":24946984,"gasCost":2,"depth":1,"stack":[]},
|
|
||||||
{"pc":1,"op":"STOP","gas":24946982,"gasCost":0,"depth":1,"stack":["0x1337"]}]}`,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
for i, testspec := range testSuite {
|
|
||||||
result, err := api.TraceCall(context.Background(), testspec.call, rpc.BlockNumberOrHash{BlockNumber: &testspec.blockNumber}, testspec.config)
|
|
||||||
if testspec.expectErr != nil {
|
|
||||||
if err == nil {
|
|
||||||
t.Errorf("test %d: expect error %v, got nothing", i, testspec.expectErr)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if !reflect.DeepEqual(err.Error(), testspec.expectErr.Error()) {
|
|
||||||
t.Errorf("test %d: error mismatch, want '%v', got '%v'", i, testspec.expectErr, err)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("test %d: expect no error, got %v", i, err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
var have *logger.ExecutionResult
|
|
||||||
if err := json.Unmarshal(result.(json.RawMessage), &have); err != nil {
|
|
||||||
t.Errorf("test %d: failed to unmarshal result %v", i, err)
|
|
||||||
}
|
|
||||||
var want *logger.ExecutionResult
|
|
||||||
if err := json.Unmarshal([]byte(testspec.expect), &want); err != nil {
|
|
||||||
t.Errorf("test %d: failed to unmarshal result %v", i, err)
|
|
||||||
}
|
|
||||||
if !reflect.DeepEqual(have, want) {
|
|
||||||
t.Errorf("test %d: result mismatch, want %v, got %v", i, testspec.expect, string(result.(json.RawMessage)))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestTraceTransaction(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
// Initialize test accounts
|
|
||||||
accounts := newAccounts(2)
|
|
||||||
genesis := &core.Genesis{
|
|
||||||
Config: params.TestChainConfig,
|
|
||||||
Alloc: core.GenesisAlloc{
|
|
||||||
accounts[0].addr: {Balance: big.NewInt(params.Ether)},
|
|
||||||
accounts[1].addr: {Balance: big.NewInt(params.Ether)},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
target := common.Hash{}
|
|
||||||
signer := types.HomesteadSigner{}
|
|
||||||
backend := newTestBackend(t, 1, genesis, func(i int, b *core.BlockGen) {
|
|
||||||
// Transfer from account[0] to account[1]
|
|
||||||
// value: 1000 wei
|
|
||||||
// fee: 0 wei
|
|
||||||
tx, _ := types.SignTx(types.NewTx(&types.LegacyTx{
|
|
||||||
Nonce: uint64(i),
|
|
||||||
To: &accounts[1].addr,
|
|
||||||
Value: big.NewInt(1000),
|
|
||||||
Gas: params.TxGas,
|
|
||||||
GasPrice: b.BaseFee(),
|
|
||||||
Data: nil}),
|
|
||||||
signer, accounts[0].key)
|
|
||||||
b.AddTx(tx)
|
|
||||||
target = tx.Hash()
|
|
||||||
})
|
|
||||||
defer backend.chain.Stop()
|
|
||||||
api := NewAPI(backend)
|
|
||||||
result, err := api.TraceTransaction(context.Background(), target, nil)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("Failed to trace transaction %v", err)
|
|
||||||
}
|
|
||||||
var have *logger.ExecutionResult
|
|
||||||
if err := json.Unmarshal(result.(json.RawMessage), &have); err != nil {
|
|
||||||
t.Errorf("failed to unmarshal result %v", err)
|
|
||||||
}
|
|
||||||
if !reflect.DeepEqual(have, &logger.ExecutionResult{
|
|
||||||
Gas: params.TxGas,
|
|
||||||
Failed: false,
|
|
||||||
ReturnValue: "",
|
|
||||||
StructLogs: []logger.StructLogRes{},
|
|
||||||
}) {
|
|
||||||
t.Error("Transaction tracing result is different")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Test non-existent transaction
|
|
||||||
_, err = api.TraceTransaction(context.Background(), common.Hash{42}, nil)
|
|
||||||
if !errors.Is(err, errTxNotFound) {
|
|
||||||
t.Fatalf("want %v, have %v", errTxNotFound, err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestTraceBlock(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
// Initialize test accounts
|
|
||||||
accounts := newAccounts(3)
|
|
||||||
genesis := &core.Genesis{
|
|
||||||
Config: params.TestChainConfig,
|
|
||||||
Alloc: core.GenesisAlloc{
|
|
||||||
accounts[0].addr: {Balance: big.NewInt(params.Ether)},
|
|
||||||
accounts[1].addr: {Balance: big.NewInt(params.Ether)},
|
|
||||||
accounts[2].addr: {Balance: big.NewInt(params.Ether)},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
genBlocks := 10
|
|
||||||
signer := types.HomesteadSigner{}
|
|
||||||
var txHash common.Hash
|
|
||||||
backend := newTestBackend(t, genBlocks, genesis, func(i int, b *core.BlockGen) {
|
|
||||||
// Transfer from account[0] to account[1]
|
|
||||||
// value: 1000 wei
|
|
||||||
// fee: 0 wei
|
|
||||||
tx, _ := types.SignTx(types.NewTx(&types.LegacyTx{
|
|
||||||
Nonce: uint64(i),
|
|
||||||
To: &accounts[1].addr,
|
|
||||||
Value: big.NewInt(1000),
|
|
||||||
Gas: params.TxGas,
|
|
||||||
GasPrice: b.BaseFee(),
|
|
||||||
Data: nil}),
|
|
||||||
signer, accounts[0].key)
|
|
||||||
b.AddTx(tx)
|
|
||||||
txHash = tx.Hash()
|
|
||||||
})
|
|
||||||
defer backend.chain.Stop()
|
|
||||||
api := NewAPI(backend)
|
|
||||||
|
|
||||||
var testSuite = []struct {
|
|
||||||
blockNumber rpc.BlockNumber
|
|
||||||
config *TraceConfig
|
|
||||||
want string
|
|
||||||
expectErr error
|
|
||||||
}{
|
|
||||||
// Trace genesis block, expect error
|
|
||||||
{
|
|
||||||
blockNumber: rpc.BlockNumber(0),
|
|
||||||
expectErr: errors.New("genesis is not traceable"),
|
|
||||||
},
|
|
||||||
// Trace head block
|
|
||||||
{
|
|
||||||
blockNumber: rpc.BlockNumber(genBlocks),
|
|
||||||
want: fmt.Sprintf(`[{"txHash":"%v","result":{"gas":21000,"failed":false,"returnValue":"","structLogs":[]}}]`, txHash),
|
|
||||||
},
|
|
||||||
// Trace non-existent block
|
|
||||||
{
|
|
||||||
blockNumber: rpc.BlockNumber(genBlocks + 1),
|
|
||||||
expectErr: fmt.Errorf("block #%d not found", genBlocks+1),
|
|
||||||
},
|
|
||||||
// Trace latest block
|
|
||||||
{
|
|
||||||
blockNumber: rpc.LatestBlockNumber,
|
|
||||||
want: fmt.Sprintf(`[{"txHash":"%v","result":{"gas":21000,"failed":false,"returnValue":"","structLogs":[]}}]`, txHash),
|
|
||||||
},
|
|
||||||
// Trace pending block
|
|
||||||
{
|
|
||||||
blockNumber: rpc.PendingBlockNumber,
|
|
||||||
want: fmt.Sprintf(`[{"txHash":"%v","result":{"gas":21000,"failed":false,"returnValue":"","structLogs":[]}}]`, txHash),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
for i, tc := range testSuite {
|
|
||||||
result, err := api.TraceBlockByNumber(context.Background(), tc.blockNumber, tc.config)
|
|
||||||
if tc.expectErr != nil {
|
|
||||||
if err == nil {
|
|
||||||
t.Errorf("test %d, want error %v", i, tc.expectErr)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if !reflect.DeepEqual(err, tc.expectErr) {
|
|
||||||
t.Errorf("test %d: error mismatch, want %v, get %v", i, tc.expectErr, err)
|
|
||||||
}
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("test %d, want no error, have %v", i, err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
have, _ := json.Marshal(result)
|
|
||||||
want := tc.want
|
|
||||||
if string(have) != want {
|
|
||||||
t.Errorf("test %d, result mismatch, have\n%v\n, want\n%v\n", i, string(have), want)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestTracingWithOverrides(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
// Initialize test accounts
|
|
||||||
accounts := newAccounts(3)
|
|
||||||
storageAccount := common.Address{0x13, 37}
|
|
||||||
genesis := &core.Genesis{
|
|
||||||
Config: params.TestChainConfig,
|
|
||||||
Alloc: core.GenesisAlloc{
|
|
||||||
accounts[0].addr: {Balance: big.NewInt(params.Ether)},
|
|
||||||
accounts[1].addr: {Balance: big.NewInt(params.Ether)},
|
|
||||||
accounts[2].addr: {Balance: big.NewInt(params.Ether)},
|
|
||||||
// An account with existing storage
|
|
||||||
storageAccount: {
|
|
||||||
Balance: new(big.Int),
|
|
||||||
Storage: map[common.Hash]common.Hash{
|
|
||||||
common.HexToHash("0x03"): common.HexToHash("0x33"),
|
|
||||||
common.HexToHash("0x04"): common.HexToHash("0x44"),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
genBlocks := 10
|
|
||||||
signer := types.HomesteadSigner{}
|
|
||||||
backend := newTestBackend(t, genBlocks, genesis, func(i int, b *core.BlockGen) {
|
|
||||||
// Transfer from account[0] to account[1]
|
|
||||||
// value: 1000 wei
|
|
||||||
// fee: 0 wei
|
|
||||||
tx, _ := types.SignTx(types.NewTx(&types.LegacyTx{
|
|
||||||
Nonce: uint64(i),
|
|
||||||
To: &accounts[1].addr,
|
|
||||||
Value: big.NewInt(1000),
|
|
||||||
Gas: params.TxGas,
|
|
||||||
GasPrice: b.BaseFee(),
|
|
||||||
Data: nil}),
|
|
||||||
signer, accounts[0].key)
|
|
||||||
b.AddTx(tx)
|
|
||||||
})
|
|
||||||
defer backend.chain.Stop()
|
|
||||||
api := NewAPI(backend)
|
|
||||||
randomAccounts := newAccounts(3)
|
|
||||||
type res struct {
|
|
||||||
Gas int
|
|
||||||
Failed bool
|
|
||||||
ReturnValue string
|
|
||||||
}
|
|
||||||
var testSuite = []struct {
|
|
||||||
blockNumber rpc.BlockNumber
|
|
||||||
call ethapi.TransactionArgs
|
|
||||||
config *TraceCallConfig
|
|
||||||
expectErr error
|
|
||||||
want string
|
|
||||||
}{
|
|
||||||
// Call which can only succeed if state is state overridden
|
|
||||||
{
|
|
||||||
blockNumber: rpc.LatestBlockNumber,
|
|
||||||
call: ethapi.TransactionArgs{
|
|
||||||
From: &randomAccounts[0].addr,
|
|
||||||
To: &randomAccounts[1].addr,
|
|
||||||
Value: (*hexutil.Big)(big.NewInt(1000)),
|
|
||||||
},
|
|
||||||
config: &TraceCallConfig{
|
|
||||||
StateOverrides: ðapi.StateOverride{
|
|
||||||
randomAccounts[0].addr: ethapi.OverrideAccount{Balance: newRPCBalance(new(big.Int).Mul(big.NewInt(1), big.NewInt(params.Ether)))},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
want: `{"gas":21000,"failed":false,"returnValue":""}`,
|
|
||||||
},
|
|
||||||
// Invalid call without state overriding
|
|
||||||
{
|
|
||||||
blockNumber: rpc.LatestBlockNumber,
|
|
||||||
call: ethapi.TransactionArgs{
|
|
||||||
From: &randomAccounts[0].addr,
|
|
||||||
To: &randomAccounts[1].addr,
|
|
||||||
Value: (*hexutil.Big)(big.NewInt(1000)),
|
|
||||||
},
|
|
||||||
config: &TraceCallConfig{},
|
|
||||||
expectErr: core.ErrInsufficientFunds,
|
|
||||||
},
|
|
||||||
// Successful simple contract call
|
|
||||||
//
|
|
||||||
// // SPDX-License-Identifier: GPL-3.0
|
|
||||||
//
|
|
||||||
// pragma solidity >=0.7.0 <0.8.0;
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * @title Storage
|
|
||||||
// * @dev Store & retrieve value in a variable
|
|
||||||
// */
|
|
||||||
// contract Storage {
|
|
||||||
// uint256 public number;
|
|
||||||
// constructor() {
|
|
||||||
// number = block.number;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
{
|
|
||||||
blockNumber: rpc.LatestBlockNumber,
|
|
||||||
call: ethapi.TransactionArgs{
|
|
||||||
From: &randomAccounts[0].addr,
|
|
||||||
To: &randomAccounts[2].addr,
|
|
||||||
Data: newRPCBytes(common.Hex2Bytes("8381f58a")), // call number()
|
|
||||||
},
|
|
||||||
config: &TraceCallConfig{
|
|
||||||
//Tracer: &tracer,
|
|
||||||
StateOverrides: ðapi.StateOverride{
|
|
||||||
randomAccounts[2].addr: ethapi.OverrideAccount{
|
|
||||||
Code: newRPCBytes(common.Hex2Bytes("6080604052348015600f57600080fd5b506004361060285760003560e01c80638381f58a14602d575b600080fd5b60336049565b6040518082815260200191505060405180910390f35b6000548156fea2646970667358221220eab35ffa6ab2adfe380772a48b8ba78e82a1b820a18fcb6f59aa4efb20a5f60064736f6c63430007040033")),
|
|
||||||
StateDiff: newStates([]common.Hash{{}}, []common.Hash{common.BigToHash(big.NewInt(123))}),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
want: `{"gas":23347,"failed":false,"returnValue":"000000000000000000000000000000000000000000000000000000000000007b"}`,
|
|
||||||
},
|
|
||||||
{ // Override blocknumber
|
|
||||||
blockNumber: rpc.LatestBlockNumber,
|
|
||||||
call: ethapi.TransactionArgs{
|
|
||||||
From: &accounts[0].addr,
|
|
||||||
// BLOCKNUMBER PUSH1 MSTORE
|
|
||||||
Input: newRPCBytes(common.Hex2Bytes("4360005260206000f3")),
|
|
||||||
//&hexutil.Bytes{0x43}, // blocknumber
|
|
||||||
},
|
|
||||||
config: &TraceCallConfig{
|
|
||||||
BlockOverrides: ðapi.BlockOverrides{Number: (*hexutil.Big)(big.NewInt(0x1337))},
|
|
||||||
},
|
|
||||||
want: `{"gas":59537,"failed":false,"returnValue":"0000000000000000000000000000000000000000000000000000000000001337"}`,
|
|
||||||
},
|
|
||||||
{ // Override blocknumber, and query a blockhash
|
|
||||||
blockNumber: rpc.LatestBlockNumber,
|
|
||||||
call: ethapi.TransactionArgs{
|
|
||||||
From: &accounts[0].addr,
|
|
||||||
Input: &hexutil.Bytes{
|
|
||||||
0x60, 0x00, 0x40, // BLOCKHASH(0)
|
|
||||||
0x60, 0x00, 0x52, // STORE memory offset 0
|
|
||||||
0x61, 0x13, 0x36, 0x40, // BLOCKHASH(0x1336)
|
|
||||||
0x60, 0x20, 0x52, // STORE memory offset 32
|
|
||||||
0x61, 0x13, 0x37, 0x40, // BLOCKHASH(0x1337)
|
|
||||||
0x60, 0x40, 0x52, // STORE memory offset 64
|
|
||||||
0x60, 0x60, 0x60, 0x00, 0xf3, // RETURN (0-96)
|
|
||||||
|
|
||||||
}, // blocknumber
|
|
||||||
},
|
|
||||||
config: &TraceCallConfig{
|
|
||||||
BlockOverrides: ðapi.BlockOverrides{Number: (*hexutil.Big)(big.NewInt(0x1337))},
|
|
||||||
},
|
|
||||||
want: `{"gas":72666,"failed":false,"returnValue":"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}`,
|
|
||||||
},
|
|
||||||
/*
|
|
||||||
pragma solidity =0.8.12;
|
|
||||||
|
|
||||||
contract Test {
|
|
||||||
uint private x;
|
|
||||||
|
|
||||||
function test2() external {
|
|
||||||
x = 1337;
|
|
||||||
revert();
|
|
||||||
}
|
|
||||||
|
|
||||||
function test() external returns (uint) {
|
|
||||||
x = 1;
|
|
||||||
try this.test2() {} catch (bytes memory) {}
|
|
||||||
return x;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
{ // First with only code override, not storage override
|
|
||||||
blockNumber: rpc.LatestBlockNumber,
|
|
||||||
call: ethapi.TransactionArgs{
|
|
||||||
From: &randomAccounts[0].addr,
|
|
||||||
To: &randomAccounts[2].addr,
|
|
||||||
Data: newRPCBytes(common.Hex2Bytes("f8a8fd6d")), //
|
|
||||||
},
|
|
||||||
config: &TraceCallConfig{
|
|
||||||
StateOverrides: ðapi.StateOverride{
|
|
||||||
randomAccounts[2].addr: ethapi.OverrideAccount{
|
|
||||||
Code: newRPCBytes(common.Hex2Bytes("6080604052348015600f57600080fd5b506004361060325760003560e01c806366e41cb7146037578063f8a8fd6d14603f575b600080fd5b603d6057565b005b60456062565b60405190815260200160405180910390f35b610539600090815580fd5b60006001600081905550306001600160a01b03166366e41cb76040518163ffffffff1660e01b8152600401600060405180830381600087803b15801560a657600080fd5b505af192505050801560b6575060015b60e9573d80801560e1576040519150601f19603f3d011682016040523d82523d6000602084013e60e6565b606091505b50505b506000549056fea26469706673582212205ce45de745a5308f713cb2f448589177ba5a442d1a2eff945afaa8915961b4d064736f6c634300080c0033")),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
want: `{"gas":44100,"failed":false,"returnValue":"0000000000000000000000000000000000000000000000000000000000000001"}`,
|
|
||||||
},
|
|
||||||
{ // Same again, this time with storage override
|
|
||||||
blockNumber: rpc.LatestBlockNumber,
|
|
||||||
call: ethapi.TransactionArgs{
|
|
||||||
From: &randomAccounts[0].addr,
|
|
||||||
To: &randomAccounts[2].addr,
|
|
||||||
Data: newRPCBytes(common.Hex2Bytes("f8a8fd6d")), //
|
|
||||||
},
|
|
||||||
config: &TraceCallConfig{
|
|
||||||
StateOverrides: ðapi.StateOverride{
|
|
||||||
randomAccounts[2].addr: ethapi.OverrideAccount{
|
|
||||||
Code: newRPCBytes(common.Hex2Bytes("6080604052348015600f57600080fd5b506004361060325760003560e01c806366e41cb7146037578063f8a8fd6d14603f575b600080fd5b603d6057565b005b60456062565b60405190815260200160405180910390f35b610539600090815580fd5b60006001600081905550306001600160a01b03166366e41cb76040518163ffffffff1660e01b8152600401600060405180830381600087803b15801560a657600080fd5b505af192505050801560b6575060015b60e9573d80801560e1576040519150601f19603f3d011682016040523d82523d6000602084013e60e6565b606091505b50505b506000549056fea26469706673582212205ce45de745a5308f713cb2f448589177ba5a442d1a2eff945afaa8915961b4d064736f6c634300080c0033")),
|
|
||||||
State: newStates([]common.Hash{{}}, []common.Hash{{}}),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
//want: `{"gas":46900,"failed":false,"returnValue":"0000000000000000000000000000000000000000000000000000000000000539"}`,
|
|
||||||
want: `{"gas":44100,"failed":false,"returnValue":"0000000000000000000000000000000000000000000000000000000000000001"}`,
|
|
||||||
},
|
|
||||||
{ // No state override
|
|
||||||
blockNumber: rpc.LatestBlockNumber,
|
|
||||||
call: ethapi.TransactionArgs{
|
|
||||||
From: &randomAccounts[0].addr,
|
|
||||||
To: &storageAccount,
|
|
||||||
Data: newRPCBytes(common.Hex2Bytes("f8a8fd6d")), //
|
|
||||||
},
|
|
||||||
config: &TraceCallConfig{
|
|
||||||
StateOverrides: ðapi.StateOverride{
|
|
||||||
storageAccount: ethapi.OverrideAccount{
|
|
||||||
Code: newRPCBytes([]byte{
|
|
||||||
// SLOAD(3) + SLOAD(4) (which is 0x77)
|
|
||||||
byte(vm.PUSH1), 0x04,
|
|
||||||
byte(vm.SLOAD),
|
|
||||||
byte(vm.PUSH1), 0x03,
|
|
||||||
byte(vm.SLOAD),
|
|
||||||
byte(vm.ADD),
|
|
||||||
// 0x77 -> MSTORE(0)
|
|
||||||
byte(vm.PUSH1), 0x00,
|
|
||||||
byte(vm.MSTORE),
|
|
||||||
// RETURN (0, 32)
|
|
||||||
byte(vm.PUSH1), 32,
|
|
||||||
byte(vm.PUSH1), 00,
|
|
||||||
byte(vm.RETURN),
|
|
||||||
}),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
want: `{"gas":25288,"failed":false,"returnValue":"0000000000000000000000000000000000000000000000000000000000000077"}`,
|
|
||||||
},
|
|
||||||
{ // Full state override
|
|
||||||
// The original storage is
|
|
||||||
// 3: 0x33
|
|
||||||
// 4: 0x44
|
|
||||||
// With a full override, where we set 3:0x11, the slot 4 should be
|
|
||||||
// removed. So SLOT(3)+SLOT(4) should be 0x11.
|
|
||||||
blockNumber: rpc.LatestBlockNumber,
|
|
||||||
call: ethapi.TransactionArgs{
|
|
||||||
From: &randomAccounts[0].addr,
|
|
||||||
To: &storageAccount,
|
|
||||||
Data: newRPCBytes(common.Hex2Bytes("f8a8fd6d")), //
|
|
||||||
},
|
|
||||||
config: &TraceCallConfig{
|
|
||||||
StateOverrides: ðapi.StateOverride{
|
|
||||||
storageAccount: ethapi.OverrideAccount{
|
|
||||||
Code: newRPCBytes([]byte{
|
|
||||||
// SLOAD(3) + SLOAD(4) (which is now 0x11 + 0x00)
|
|
||||||
byte(vm.PUSH1), 0x04,
|
|
||||||
byte(vm.SLOAD),
|
|
||||||
byte(vm.PUSH1), 0x03,
|
|
||||||
byte(vm.SLOAD),
|
|
||||||
byte(vm.ADD),
|
|
||||||
// 0x11 -> MSTORE(0)
|
|
||||||
byte(vm.PUSH1), 0x00,
|
|
||||||
byte(vm.MSTORE),
|
|
||||||
// RETURN (0, 32)
|
|
||||||
byte(vm.PUSH1), 32,
|
|
||||||
byte(vm.PUSH1), 00,
|
|
||||||
byte(vm.RETURN),
|
|
||||||
}),
|
|
||||||
State: newStates(
|
|
||||||
[]common.Hash{common.HexToHash("0x03")},
|
|
||||||
[]common.Hash{common.HexToHash("0x11")}),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
want: `{"gas":25288,"failed":false,"returnValue":"0000000000000000000000000000000000000000000000000000000000000011"}`,
|
|
||||||
},
|
|
||||||
{ // Partial state override
|
|
||||||
// The original storage is
|
|
||||||
// 3: 0x33
|
|
||||||
// 4: 0x44
|
|
||||||
// With a partial override, where we set 3:0x11, the slot 4 as before.
|
|
||||||
// So SLOT(3)+SLOT(4) should be 0x55.
|
|
||||||
blockNumber: rpc.LatestBlockNumber,
|
|
||||||
call: ethapi.TransactionArgs{
|
|
||||||
From: &randomAccounts[0].addr,
|
|
||||||
To: &storageAccount,
|
|
||||||
Data: newRPCBytes(common.Hex2Bytes("f8a8fd6d")), //
|
|
||||||
},
|
|
||||||
config: &TraceCallConfig{
|
|
||||||
StateOverrides: ðapi.StateOverride{
|
|
||||||
storageAccount: ethapi.OverrideAccount{
|
|
||||||
Code: newRPCBytes([]byte{
|
|
||||||
// SLOAD(3) + SLOAD(4) (which is now 0x11 + 0x44)
|
|
||||||
byte(vm.PUSH1), 0x04,
|
|
||||||
byte(vm.SLOAD),
|
|
||||||
byte(vm.PUSH1), 0x03,
|
|
||||||
byte(vm.SLOAD),
|
|
||||||
byte(vm.ADD),
|
|
||||||
// 0x55 -> MSTORE(0)
|
|
||||||
byte(vm.PUSH1), 0x00,
|
|
||||||
byte(vm.MSTORE),
|
|
||||||
// RETURN (0, 32)
|
|
||||||
byte(vm.PUSH1), 32,
|
|
||||||
byte(vm.PUSH1), 00,
|
|
||||||
byte(vm.RETURN),
|
|
||||||
}),
|
|
||||||
StateDiff: &map[common.Hash]common.Hash{
|
|
||||||
common.HexToHash("0x03"): common.HexToHash("0x11"),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
want: `{"gas":25288,"failed":false,"returnValue":"0000000000000000000000000000000000000000000000000000000000000055"}`,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
for i, tc := range testSuite {
|
|
||||||
result, err := api.TraceCall(context.Background(), tc.call, rpc.BlockNumberOrHash{BlockNumber: &tc.blockNumber}, tc.config)
|
|
||||||
if tc.expectErr != nil {
|
|
||||||
if err == nil {
|
|
||||||
t.Errorf("test %d: want error %v, have nothing", i, tc.expectErr)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if !errors.Is(err, tc.expectErr) {
|
|
||||||
t.Errorf("test %d: error mismatch, want %v, have %v", i, tc.expectErr, err)
|
|
||||||
}
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("test %d: want no error, have %v", i, err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
// Turn result into res-struct
|
|
||||||
var (
|
|
||||||
have res
|
|
||||||
want res
|
|
||||||
)
|
|
||||||
resBytes, _ := json.Marshal(result)
|
|
||||||
json.Unmarshal(resBytes, &have)
|
|
||||||
json.Unmarshal([]byte(tc.want), &want)
|
|
||||||
if !reflect.DeepEqual(have, want) {
|
|
||||||
t.Logf("result: %v\n", string(resBytes))
|
|
||||||
t.Errorf("test %d, result mismatch, have\n%v\n, want\n%v\n", i, have, want)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type Account struct {
|
|
||||||
key *ecdsa.PrivateKey
|
|
||||||
addr common.Address
|
|
||||||
}
|
|
||||||
|
|
||||||
func newAccounts(n int) (accounts []Account) {
|
|
||||||
for i := 0; i < n; i++ {
|
|
||||||
key, _ := crypto.GenerateKey()
|
|
||||||
addr := crypto.PubkeyToAddress(key.PublicKey)
|
|
||||||
accounts = append(accounts, Account{key: key, addr: addr})
|
|
||||||
}
|
|
||||||
slices.SortFunc(accounts, func(a, b Account) int { return a.addr.Cmp(b.addr) })
|
|
||||||
return accounts
|
|
||||||
}
|
|
||||||
|
|
||||||
func newRPCBalance(balance *big.Int) **hexutil.Big {
|
|
||||||
rpcBalance := (*hexutil.Big)(balance)
|
|
||||||
return &rpcBalance
|
|
||||||
}
|
|
||||||
|
|
||||||
func newRPCBytes(bytes []byte) *hexutil.Bytes {
|
|
||||||
rpcBytes := hexutil.Bytes(bytes)
|
|
||||||
return &rpcBytes
|
|
||||||
}
|
|
||||||
|
|
||||||
func newStates(keys []common.Hash, vals []common.Hash) *map[common.Hash]common.Hash {
|
|
||||||
if len(keys) != len(vals) {
|
|
||||||
panic("invalid input")
|
|
||||||
}
|
|
||||||
m := make(map[common.Hash]common.Hash)
|
|
||||||
for i := 0; i < len(keys); i++ {
|
|
||||||
m[keys[i]] = vals[i]
|
|
||||||
}
|
|
||||||
return &m
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestTraceChain(t *testing.T) {
|
|
||||||
// Initialize test accounts
|
|
||||||
accounts := newAccounts(3)
|
|
||||||
genesis := &core.Genesis{
|
|
||||||
Config: params.TestChainConfig,
|
|
||||||
Alloc: core.GenesisAlloc{
|
|
||||||
accounts[0].addr: {Balance: big.NewInt(params.Ether)},
|
|
||||||
accounts[1].addr: {Balance: big.NewInt(params.Ether)},
|
|
||||||
accounts[2].addr: {Balance: big.NewInt(params.Ether)},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
genBlocks := 50
|
|
||||||
signer := types.HomesteadSigner{}
|
|
||||||
|
|
||||||
var (
|
|
||||||
ref atomic.Uint32 // total refs has made
|
|
||||||
rel atomic.Uint32 // total rels has made
|
|
||||||
nonce uint64
|
|
||||||
)
|
|
||||||
backend := newTestBackend(t, genBlocks, genesis, func(i int, b *core.BlockGen) {
|
|
||||||
// Transfer from account[0] to account[1]
|
|
||||||
// value: 1000 wei
|
|
||||||
// fee: 0 wei
|
|
||||||
for j := 0; j < i+1; j++ {
|
|
||||||
tx, _ := types.SignTx(types.NewTransaction(nonce, accounts[1].addr, big.NewInt(1000), params.TxGas, b.BaseFee(), nil), signer, accounts[0].key)
|
|
||||||
b.AddTx(tx)
|
|
||||||
nonce += 1
|
|
||||||
}
|
|
||||||
})
|
|
||||||
backend.refHook = func() { ref.Add(1) }
|
|
||||||
backend.relHook = func() { rel.Add(1) }
|
|
||||||
api := NewAPI(backend)
|
|
||||||
|
|
||||||
single := `{"txHash":"0x0000000000000000000000000000000000000000000000000000000000000000","result":{"gas":21000,"failed":false,"returnValue":"","structLogs":[]}}`
|
|
||||||
var cases = []struct {
|
|
||||||
start uint64
|
|
||||||
end uint64
|
|
||||||
config *TraceConfig
|
|
||||||
}{
|
|
||||||
{0, 50, nil}, // the entire chain range, blocks [1, 50]
|
|
||||||
{10, 20, nil}, // the middle chain range, blocks [11, 20]
|
|
||||||
}
|
|
||||||
for _, c := range cases {
|
|
||||||
ref.Store(0)
|
|
||||||
rel.Store(0)
|
|
||||||
|
|
||||||
from, _ := api.blockByNumber(context.Background(), rpc.BlockNumber(c.start))
|
|
||||||
to, _ := api.blockByNumber(context.Background(), rpc.BlockNumber(c.end))
|
|
||||||
resCh := api.traceChain(from, to, c.config, nil)
|
|
||||||
|
|
||||||
next := c.start + 1
|
|
||||||
for result := range resCh {
|
|
||||||
if have, want := uint64(result.Block), next; have != want {
|
|
||||||
t.Fatalf("unexpected tracing block, have %d want %d", have, want)
|
|
||||||
}
|
|
||||||
if have, want := len(result.Traces), int(next); have != want {
|
|
||||||
t.Fatalf("unexpected result length, have %d want %d", have, want)
|
|
||||||
}
|
|
||||||
for _, trace := range result.Traces {
|
|
||||||
trace.TxHash = common.Hash{}
|
|
||||||
blob, _ := json.Marshal(trace)
|
|
||||||
if have, want := string(blob), single; have != want {
|
|
||||||
t.Fatalf("unexpected tracing result, have\n%v\nwant:\n%v", have, want)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
next += 1
|
|
||||||
}
|
|
||||||
if next != c.end+1 {
|
|
||||||
t.Error("Missing tracing block")
|
|
||||||
}
|
|
||||||
|
|
||||||
if nref, nrel := ref.Load(), rel.Load(); nref != nrel {
|
|
||||||
t.Errorf("Ref and deref actions are not equal, ref %d rel %d", nref, nrel)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,406 +0,0 @@
|
||||||
// Copyright 2021 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/>.
|
|
||||||
|
|
||||||
package tracetest
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"math/big"
|
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
"strings"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
|
||||||
"github.com/ethereum/go-ethereum/common/hexutil"
|
|
||||||
"github.com/ethereum/go-ethereum/common/math"
|
|
||||||
"github.com/ethereum/go-ethereum/core"
|
|
||||||
"github.com/ethereum/go-ethereum/core/rawdb"
|
|
||||||
"github.com/ethereum/go-ethereum/core/types"
|
|
||||||
"github.com/ethereum/go-ethereum/core/vm"
|
|
||||||
"github.com/ethereum/go-ethereum/eth/tracers"
|
|
||||||
"github.com/ethereum/go-ethereum/params"
|
|
||||||
"github.com/ethereum/go-ethereum/rlp"
|
|
||||||
"github.com/ethereum/go-ethereum/tests"
|
|
||||||
)
|
|
||||||
|
|
||||||
type callContext struct {
|
|
||||||
Number math.HexOrDecimal64 `json:"number"`
|
|
||||||
Difficulty *math.HexOrDecimal256 `json:"difficulty"`
|
|
||||||
Time math.HexOrDecimal64 `json:"timestamp"`
|
|
||||||
GasLimit math.HexOrDecimal64 `json:"gasLimit"`
|
|
||||||
Miner common.Address `json:"miner"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// callLog is the result of LOG opCode
|
|
||||||
type callLog struct {
|
|
||||||
Address common.Address `json:"address"`
|
|
||||||
Topics []common.Hash `json:"topics"`
|
|
||||||
Data hexutil.Bytes `json:"data"`
|
|
||||||
Position hexutil.Uint `json:"position"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// callTrace is the result of a callTracer run.
|
|
||||||
type callTrace struct {
|
|
||||||
From common.Address `json:"from"`
|
|
||||||
Gas *hexutil.Uint64 `json:"gas"`
|
|
||||||
GasUsed *hexutil.Uint64 `json:"gasUsed"`
|
|
||||||
To *common.Address `json:"to,omitempty"`
|
|
||||||
Input hexutil.Bytes `json:"input"`
|
|
||||||
Output hexutil.Bytes `json:"output,omitempty"`
|
|
||||||
Error string `json:"error,omitempty"`
|
|
||||||
RevertReason string `json:"revertReason,omitempty"`
|
|
||||||
Calls []callTrace `json:"calls,omitempty"`
|
|
||||||
Logs []callLog `json:"logs,omitempty"`
|
|
||||||
Value *hexutil.Big `json:"value,omitempty"`
|
|
||||||
// Gencodec adds overridden fields at the end
|
|
||||||
Type string `json:"type"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// callTracerTest defines a single test to check the call tracer against.
|
|
||||||
type callTracerTest struct {
|
|
||||||
Genesis *core.Genesis `json:"genesis"`
|
|
||||||
Context *callContext `json:"context"`
|
|
||||||
Input string `json:"input"`
|
|
||||||
TracerConfig json.RawMessage `json:"tracerConfig"`
|
|
||||||
Result *callTrace `json:"result"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Iterates over all the input-output datasets in the tracer test harness and
|
|
||||||
// runs the JavaScript tracers against them.
|
|
||||||
func TestCallTracerLegacy(t *testing.T) {
|
|
||||||
testCallTracer("callTracerLegacy", "call_tracer_legacy", t)
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestCallTracerNative(t *testing.T) {
|
|
||||||
testCallTracer("callTracer", "call_tracer", t)
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestCallTracerNativeWithLog(t *testing.T) {
|
|
||||||
testCallTracer("callTracer", "call_tracer_withLog", t)
|
|
||||||
}
|
|
||||||
|
|
||||||
func testCallTracer(tracerName string, dirPath string, t *testing.T) {
|
|
||||||
isLegacy := strings.HasSuffix(dirPath, "_legacy")
|
|
||||||
files, err := os.ReadDir(filepath.Join("testdata", dirPath))
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to retrieve tracer test suite: %v", err)
|
|
||||||
}
|
|
||||||
for _, file := range files {
|
|
||||||
if !strings.HasSuffix(file.Name(), ".json") {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
file := file // capture range variable
|
|
||||||
t.Run(camel(strings.TrimSuffix(file.Name(), ".json")), func(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
var (
|
|
||||||
test = new(callTracerTest)
|
|
||||||
tx = new(types.Transaction)
|
|
||||||
)
|
|
||||||
// Call tracer test found, read if from disk
|
|
||||||
if blob, err := os.ReadFile(filepath.Join("testdata", dirPath, file.Name())); err != nil {
|
|
||||||
t.Fatalf("failed to read testcase: %v", err)
|
|
||||||
} else if err := json.Unmarshal(blob, test); err != nil {
|
|
||||||
t.Fatalf("failed to parse testcase: %v", err)
|
|
||||||
}
|
|
||||||
if err := tx.UnmarshalBinary(common.FromHex(test.Input)); err != nil {
|
|
||||||
t.Fatalf("failed to parse testcase input: %v", err)
|
|
||||||
}
|
|
||||||
// Configure a blockchain with the given prestate
|
|
||||||
var (
|
|
||||||
signer = types.MakeSigner(test.Genesis.Config, new(big.Int).SetUint64(uint64(test.Context.Number)), uint64(test.Context.Time))
|
|
||||||
origin, _ = signer.Sender(tx)
|
|
||||||
txContext = vm.TxContext{
|
|
||||||
Origin: origin,
|
|
||||||
GasPrice: tx.GasPrice(),
|
|
||||||
}
|
|
||||||
context = vm.BlockContext{
|
|
||||||
CanTransfer: core.CanTransfer,
|
|
||||||
Transfer: core.Transfer,
|
|
||||||
Coinbase: test.Context.Miner,
|
|
||||||
BlockNumber: new(big.Int).SetUint64(uint64(test.Context.Number)),
|
|
||||||
Time: uint64(test.Context.Time),
|
|
||||||
Difficulty: (*big.Int)(test.Context.Difficulty),
|
|
||||||
GasLimit: uint64(test.Context.GasLimit),
|
|
||||||
BaseFee: test.Genesis.BaseFee,
|
|
||||||
}
|
|
||||||
triedb, _, statedb = tests.MakePreState(rawdb.NewMemoryDatabase(), test.Genesis.Alloc, false, rawdb.HashScheme)
|
|
||||||
)
|
|
||||||
triedb.Close()
|
|
||||||
|
|
||||||
tracer, err := tracers.DefaultDirectory.New(tracerName, new(tracers.Context), test.TracerConfig)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to create call tracer: %v", err)
|
|
||||||
}
|
|
||||||
evm := vm.NewEVM(context, txContext, statedb, test.Genesis.Config, vm.Config{Tracer: tracer})
|
|
||||||
msg, err := core.TransactionToMessage(tx, signer, nil)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to prepare transaction for tracing: %v", err)
|
|
||||||
}
|
|
||||||
vmRet, err := core.ApplyMessage(evm, msg, new(core.GasPool).AddGas(tx.Gas()))
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to execute transaction: %v", err)
|
|
||||||
}
|
|
||||||
// Retrieve the trace result and compare against the expected.
|
|
||||||
res, err := tracer.GetResult()
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to retrieve trace result: %v", err)
|
|
||||||
}
|
|
||||||
// The legacy javascript calltracer marshals json in js, which
|
|
||||||
// is not deterministic (as opposed to the golang json encoder).
|
|
||||||
if isLegacy {
|
|
||||||
// This is a tweak to make it deterministic. Can be removed when
|
|
||||||
// we remove the legacy tracer.
|
|
||||||
var x callTrace
|
|
||||||
json.Unmarshal(res, &x)
|
|
||||||
res, _ = json.Marshal(x)
|
|
||||||
}
|
|
||||||
want, err := json.Marshal(test.Result)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal test: %v", err)
|
|
||||||
}
|
|
||||||
if string(want) != string(res) {
|
|
||||||
t.Fatalf("trace mismatch\n have: %v\n want: %v\n", string(res), string(want))
|
|
||||||
}
|
|
||||||
// Sanity check: compare top call's gas used against vm result
|
|
||||||
type simpleResult struct {
|
|
||||||
GasUsed hexutil.Uint64
|
|
||||||
}
|
|
||||||
var topCall simpleResult
|
|
||||||
if err := json.Unmarshal(res, &topCall); err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal top calls gasUsed: %v", err)
|
|
||||||
}
|
|
||||||
if uint64(topCall.GasUsed) != vmRet.UsedGas {
|
|
||||||
t.Fatalf("top call has invalid gasUsed. have: %d want: %d", topCall.GasUsed, vmRet.UsedGas)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkTracers(b *testing.B) {
|
|
||||||
files, err := os.ReadDir(filepath.Join("testdata", "call_tracer"))
|
|
||||||
if err != nil {
|
|
||||||
b.Fatalf("failed to retrieve tracer test suite: %v", err)
|
|
||||||
}
|
|
||||||
for _, file := range files {
|
|
||||||
if !strings.HasSuffix(file.Name(), ".json") {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
file := file // capture range variable
|
|
||||||
b.Run(camel(strings.TrimSuffix(file.Name(), ".json")), func(b *testing.B) {
|
|
||||||
blob, err := os.ReadFile(filepath.Join("testdata", "call_tracer", file.Name()))
|
|
||||||
if err != nil {
|
|
||||||
b.Fatalf("failed to read testcase: %v", err)
|
|
||||||
}
|
|
||||||
test := new(callTracerTest)
|
|
||||||
if err := json.Unmarshal(blob, test); err != nil {
|
|
||||||
b.Fatalf("failed to parse testcase: %v", err)
|
|
||||||
}
|
|
||||||
benchTracer("callTracer", test, b)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func benchTracer(tracerName string, test *callTracerTest, b *testing.B) {
|
|
||||||
// Configure a blockchain with the given prestate
|
|
||||||
tx := new(types.Transaction)
|
|
||||||
if err := rlp.DecodeBytes(common.FromHex(test.Input), tx); err != nil {
|
|
||||||
b.Fatalf("failed to parse testcase input: %v", err)
|
|
||||||
}
|
|
||||||
signer := types.MakeSigner(test.Genesis.Config, new(big.Int).SetUint64(uint64(test.Context.Number)), uint64(test.Context.Time))
|
|
||||||
msg, err := core.TransactionToMessage(tx, signer, nil)
|
|
||||||
if err != nil {
|
|
||||||
b.Fatalf("failed to prepare transaction for tracing: %v", err)
|
|
||||||
}
|
|
||||||
origin, _ := signer.Sender(tx)
|
|
||||||
txContext := vm.TxContext{
|
|
||||||
Origin: origin,
|
|
||||||
GasPrice: tx.GasPrice(),
|
|
||||||
}
|
|
||||||
context := vm.BlockContext{
|
|
||||||
CanTransfer: core.CanTransfer,
|
|
||||||
Transfer: core.Transfer,
|
|
||||||
Coinbase: test.Context.Miner,
|
|
||||||
BlockNumber: new(big.Int).SetUint64(uint64(test.Context.Number)),
|
|
||||||
Time: uint64(test.Context.Time),
|
|
||||||
Difficulty: (*big.Int)(test.Context.Difficulty),
|
|
||||||
GasLimit: uint64(test.Context.GasLimit),
|
|
||||||
}
|
|
||||||
triedb, _, statedb := tests.MakePreState(rawdb.NewMemoryDatabase(), test.Genesis.Alloc, false, rawdb.HashScheme)
|
|
||||||
defer triedb.Close()
|
|
||||||
|
|
||||||
b.ReportAllocs()
|
|
||||||
b.ResetTimer()
|
|
||||||
for i := 0; i < b.N; i++ {
|
|
||||||
tracer, err := tracers.DefaultDirectory.New(tracerName, new(tracers.Context), nil)
|
|
||||||
if err != nil {
|
|
||||||
b.Fatalf("failed to create call tracer: %v", err)
|
|
||||||
}
|
|
||||||
evm := vm.NewEVM(context, txContext, statedb, test.Genesis.Config, vm.Config{Tracer: tracer})
|
|
||||||
snap := statedb.Snapshot()
|
|
||||||
st := core.NewStateTransition(evm, msg, new(core.GasPool).AddGas(tx.Gas()))
|
|
||||||
if _, err = st.TransitionDb(); err != nil {
|
|
||||||
b.Fatalf("failed to execute transaction: %v", err)
|
|
||||||
}
|
|
||||||
if _, err = tracer.GetResult(); err != nil {
|
|
||||||
b.Fatal(err)
|
|
||||||
}
|
|
||||||
statedb.RevertToSnapshot(snap)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestInternals(t *testing.T) {
|
|
||||||
var (
|
|
||||||
to = common.HexToAddress("0x00000000000000000000000000000000deadbeef")
|
|
||||||
origin = common.HexToAddress("0x00000000000000000000000000000000feed")
|
|
||||||
txContext = vm.TxContext{
|
|
||||||
Origin: origin,
|
|
||||||
GasPrice: big.NewInt(1),
|
|
||||||
}
|
|
||||||
context = vm.BlockContext{
|
|
||||||
CanTransfer: core.CanTransfer,
|
|
||||||
Transfer: core.Transfer,
|
|
||||||
Coinbase: common.Address{},
|
|
||||||
BlockNumber: new(big.Int).SetUint64(8000000),
|
|
||||||
Time: 5,
|
|
||||||
Difficulty: big.NewInt(0x30000),
|
|
||||||
GasLimit: uint64(6000000),
|
|
||||||
}
|
|
||||||
)
|
|
||||||
mkTracer := func(name string, cfg json.RawMessage) tracers.Tracer {
|
|
||||||
tr, err := tracers.DefaultDirectory.New(name, nil, cfg)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to create call tracer: %v", err)
|
|
||||||
}
|
|
||||||
return tr
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, tc := range []struct {
|
|
||||||
name string
|
|
||||||
code []byte
|
|
||||||
tracer tracers.Tracer
|
|
||||||
want string
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
// TestZeroValueToNotExitCall tests the calltracer(s) on the following:
|
|
||||||
// Tx to A, A calls B with zero value. B does not already exist.
|
|
||||||
// Expected: that enter/exit is invoked and the inner call is shown in the result
|
|
||||||
name: "ZeroValueToNotExitCall",
|
|
||||||
code: []byte{
|
|
||||||
byte(vm.PUSH1), 0x0, byte(vm.DUP1), byte(vm.DUP1), byte(vm.DUP1), // in and outs zero
|
|
||||||
byte(vm.DUP1), byte(vm.PUSH1), 0xff, byte(vm.GAS), // value=0,address=0xff, gas=GAS
|
|
||||||
byte(vm.CALL),
|
|
||||||
},
|
|
||||||
tracer: mkTracer("callTracer", nil),
|
|
||||||
want: `{"from":"0x000000000000000000000000000000000000feed","gas":"0x13880","gasUsed":"0x54d8","to":"0x00000000000000000000000000000000deadbeef","input":"0x","calls":[{"from":"0x00000000000000000000000000000000deadbeef","gas":"0xe01a","gasUsed":"0x0","to":"0x00000000000000000000000000000000000000ff","input":"0x","value":"0x0","type":"CALL"}],"value":"0x0","type":"CALL"}`,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Stack depletion in LOG0",
|
|
||||||
code: []byte{byte(vm.LOG3)},
|
|
||||||
tracer: mkTracer("callTracer", json.RawMessage(`{ "withLog": true }`)),
|
|
||||||
want: `{"from":"0x000000000000000000000000000000000000feed","gas":"0x13880","gasUsed":"0x13880","to":"0x00000000000000000000000000000000deadbeef","input":"0x","error":"stack underflow (0 \u003c=\u003e 5)","value":"0x0","type":"CALL"}`,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Mem expansion in LOG0",
|
|
||||||
code: []byte{
|
|
||||||
byte(vm.PUSH1), 0x1,
|
|
||||||
byte(vm.PUSH1), 0x0,
|
|
||||||
byte(vm.MSTORE),
|
|
||||||
byte(vm.PUSH1), 0xff,
|
|
||||||
byte(vm.PUSH1), 0x0,
|
|
||||||
byte(vm.LOG0),
|
|
||||||
},
|
|
||||||
tracer: mkTracer("callTracer", json.RawMessage(`{ "withLog": true }`)),
|
|
||||||
want: `{"from":"0x000000000000000000000000000000000000feed","gas":"0x13880","gasUsed":"0x5b9e","to":"0x00000000000000000000000000000000deadbeef","input":"0x","logs":[{"address":"0x00000000000000000000000000000000deadbeef","topics":[],"data":"0x000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","position":"0x0"}],"value":"0x0","type":"CALL"}`,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
// Leads to OOM on the prestate tracer
|
|
||||||
name: "Prestate-tracer - CREATE2 OOM",
|
|
||||||
code: []byte{
|
|
||||||
byte(vm.PUSH1), 0x1,
|
|
||||||
byte(vm.PUSH1), 0x0,
|
|
||||||
byte(vm.MSTORE),
|
|
||||||
byte(vm.PUSH1), 0x1,
|
|
||||||
byte(vm.PUSH5), 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
byte(vm.PUSH1), 0x1,
|
|
||||||
byte(vm.PUSH1), 0x0,
|
|
||||||
byte(vm.CREATE2),
|
|
||||||
byte(vm.PUSH1), 0xff,
|
|
||||||
byte(vm.PUSH1), 0x0,
|
|
||||||
byte(vm.LOG0),
|
|
||||||
},
|
|
||||||
tracer: mkTracer("prestateTracer", nil),
|
|
||||||
want: `{"0x0000000000000000000000000000000000000000":{"balance":"0x0"},"0x000000000000000000000000000000000000feed":{"balance":"0x1c6bf52647880"},"0x00000000000000000000000000000000deadbeef":{"balance":"0x0","code":"0x6001600052600164ffffffffff60016000f560ff6000a0"}}`,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
// CREATE2 which requires padding memory by prestate tracer
|
|
||||||
name: "Prestate-tracer - CREATE2 Memory padding",
|
|
||||||
code: []byte{
|
|
||||||
byte(vm.PUSH1), 0x1,
|
|
||||||
byte(vm.PUSH1), 0x0,
|
|
||||||
byte(vm.MSTORE),
|
|
||||||
byte(vm.PUSH1), 0x1,
|
|
||||||
byte(vm.PUSH1), 0xff,
|
|
||||||
byte(vm.PUSH1), 0x1,
|
|
||||||
byte(vm.PUSH1), 0x0,
|
|
||||||
byte(vm.CREATE2),
|
|
||||||
byte(vm.PUSH1), 0xff,
|
|
||||||
byte(vm.PUSH1), 0x0,
|
|
||||||
byte(vm.LOG0),
|
|
||||||
},
|
|
||||||
tracer: mkTracer("prestateTracer", nil),
|
|
||||||
want: `{"0x0000000000000000000000000000000000000000":{"balance":"0x0"},"0x000000000000000000000000000000000000feed":{"balance":"0x1c6bf52647880"},"0x00000000000000000000000000000000deadbeef":{"balance":"0x0","code":"0x6001600052600160ff60016000f560ff6000a0"},"0x91ff9a805d36f54e3e272e230f3e3f5c1b330804":{"balance":"0x0"}}`,
|
|
||||||
},
|
|
||||||
} {
|
|
||||||
t.Run(tc.name, func(t *testing.T) {
|
|
||||||
triedb, _, statedb := tests.MakePreState(rawdb.NewMemoryDatabase(),
|
|
||||||
core.GenesisAlloc{
|
|
||||||
to: core.GenesisAccount{
|
|
||||||
Code: tc.code,
|
|
||||||
},
|
|
||||||
origin: core.GenesisAccount{
|
|
||||||
Balance: big.NewInt(500000000000000),
|
|
||||||
},
|
|
||||||
}, false, rawdb.HashScheme)
|
|
||||||
defer triedb.Close()
|
|
||||||
|
|
||||||
evm := vm.NewEVM(context, txContext, statedb, params.MainnetChainConfig, vm.Config{Tracer: tc.tracer})
|
|
||||||
msg := &core.Message{
|
|
||||||
To: &to,
|
|
||||||
From: origin,
|
|
||||||
Value: big.NewInt(0),
|
|
||||||
GasLimit: 80000,
|
|
||||||
GasPrice: big.NewInt(0),
|
|
||||||
GasFeeCap: big.NewInt(0),
|
|
||||||
GasTipCap: big.NewInt(0),
|
|
||||||
SkipAccountChecks: false,
|
|
||||||
}
|
|
||||||
st := core.NewStateTransition(evm, msg, new(core.GasPool).AddGas(msg.GasLimit))
|
|
||||||
if _, err := st.TransitionDb(); err != nil {
|
|
||||||
t.Fatalf("test %v: failed to execute transaction: %v", tc.name, err)
|
|
||||||
}
|
|
||||||
// Retrieve the trace result and compare against the expected
|
|
||||||
res, err := tc.tracer.GetResult()
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("test %v: failed to retrieve trace result: %v", tc.name, err)
|
|
||||||
}
|
|
||||||
if string(res) != tc.want {
|
|
||||||
t.Errorf("test %v: trace mismatch\n have: %v\n want: %v\n", tc.name, string(res), tc.want)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,214 +0,0 @@
|
||||||
package tracetest
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"math/big"
|
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
"reflect"
|
|
||||||
"strings"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
|
||||||
"github.com/ethereum/go-ethereum/common/hexutil"
|
|
||||||
"github.com/ethereum/go-ethereum/core"
|
|
||||||
"github.com/ethereum/go-ethereum/core/rawdb"
|
|
||||||
"github.com/ethereum/go-ethereum/core/types"
|
|
||||||
"github.com/ethereum/go-ethereum/core/vm"
|
|
||||||
"github.com/ethereum/go-ethereum/rlp"
|
|
||||||
"github.com/ethereum/go-ethereum/tests"
|
|
||||||
|
|
||||||
// Force-load the native, to trigger registration
|
|
||||||
"github.com/ethereum/go-ethereum/eth/tracers"
|
|
||||||
)
|
|
||||||
|
|
||||||
// flatCallTrace is the result of a callTracerParity run.
|
|
||||||
type flatCallTrace struct {
|
|
||||||
Action flatCallTraceAction `json:"action"`
|
|
||||||
BlockHash common.Hash `json:"-"`
|
|
||||||
BlockNumber uint64 `json:"-"`
|
|
||||||
Error string `json:"error,omitempty"`
|
|
||||||
Result flatCallTraceResult `json:"result,omitempty"`
|
|
||||||
Subtraces int `json:"subtraces"`
|
|
||||||
TraceAddress []int `json:"traceAddress"`
|
|
||||||
TransactionHash common.Hash `json:"-"`
|
|
||||||
TransactionPosition uint64 `json:"-"`
|
|
||||||
Type string `json:"type"`
|
|
||||||
Time string `json:"-"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type flatCallTraceAction struct {
|
|
||||||
Author common.Address `json:"author,omitempty"`
|
|
||||||
RewardType string `json:"rewardType,omitempty"`
|
|
||||||
SelfDestructed common.Address `json:"address,omitempty"`
|
|
||||||
Balance hexutil.Big `json:"balance,omitempty"`
|
|
||||||
CallType string `json:"callType,omitempty"`
|
|
||||||
CreationMethod string `json:"creationMethod,omitempty"`
|
|
||||||
From common.Address `json:"from,omitempty"`
|
|
||||||
Gas hexutil.Uint64 `json:"gas,omitempty"`
|
|
||||||
Init hexutil.Bytes `json:"init,omitempty"`
|
|
||||||
Input hexutil.Bytes `json:"input,omitempty"`
|
|
||||||
RefundAddress common.Address `json:"refundAddress,omitempty"`
|
|
||||||
To common.Address `json:"to,omitempty"`
|
|
||||||
Value hexutil.Big `json:"value,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type flatCallTraceResult struct {
|
|
||||||
Address common.Address `json:"address,omitempty"`
|
|
||||||
Code hexutil.Bytes `json:"code,omitempty"`
|
|
||||||
GasUsed hexutil.Uint64 `json:"gasUsed,omitempty"`
|
|
||||||
Output hexutil.Bytes `json:"output,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// flatCallTracerTest defines a single test to check the call tracer against.
|
|
||||||
type flatCallTracerTest struct {
|
|
||||||
Genesis core.Genesis `json:"genesis"`
|
|
||||||
Context callContext `json:"context"`
|
|
||||||
Input string `json:"input"`
|
|
||||||
TracerConfig json.RawMessage `json:"tracerConfig"`
|
|
||||||
Result []flatCallTrace `json:"result"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func flatCallTracerTestRunner(tracerName string, filename string, dirPath string, t testing.TB) error {
|
|
||||||
// Call tracer test found, read if from disk
|
|
||||||
blob, err := os.ReadFile(filepath.Join("testdata", dirPath, filename))
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("failed to read testcase: %v", err)
|
|
||||||
}
|
|
||||||
test := new(flatCallTracerTest)
|
|
||||||
if err := json.Unmarshal(blob, test); err != nil {
|
|
||||||
return fmt.Errorf("failed to parse testcase: %v", err)
|
|
||||||
}
|
|
||||||
// Configure a blockchain with the given prestate
|
|
||||||
tx := new(types.Transaction)
|
|
||||||
if err := rlp.DecodeBytes(common.FromHex(test.Input), tx); err != nil {
|
|
||||||
return fmt.Errorf("failed to parse testcase input: %v", err)
|
|
||||||
}
|
|
||||||
signer := types.MakeSigner(test.Genesis.Config, new(big.Int).SetUint64(uint64(test.Context.Number)), uint64(test.Context.Time))
|
|
||||||
origin, _ := signer.Sender(tx)
|
|
||||||
txContext := vm.TxContext{
|
|
||||||
Origin: origin,
|
|
||||||
GasPrice: tx.GasPrice(),
|
|
||||||
}
|
|
||||||
context := vm.BlockContext{
|
|
||||||
CanTransfer: core.CanTransfer,
|
|
||||||
Transfer: core.Transfer,
|
|
||||||
Coinbase: test.Context.Miner,
|
|
||||||
BlockNumber: new(big.Int).SetUint64(uint64(test.Context.Number)),
|
|
||||||
Time: uint64(test.Context.Time),
|
|
||||||
Difficulty: (*big.Int)(test.Context.Difficulty),
|
|
||||||
GasLimit: uint64(test.Context.GasLimit),
|
|
||||||
}
|
|
||||||
triedb, _, statedb := tests.MakePreState(rawdb.NewMemoryDatabase(), test.Genesis.Alloc, false, rawdb.HashScheme)
|
|
||||||
defer triedb.Close()
|
|
||||||
|
|
||||||
// Create the tracer, the EVM environment and run it
|
|
||||||
tracer, err := tracers.DefaultDirectory.New(tracerName, new(tracers.Context), test.TracerConfig)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("failed to create call tracer: %v", err)
|
|
||||||
}
|
|
||||||
evm := vm.NewEVM(context, txContext, statedb, test.Genesis.Config, vm.Config{Tracer: tracer})
|
|
||||||
|
|
||||||
msg, err := core.TransactionToMessage(tx, signer, nil)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("failed to prepare transaction for tracing: %v", err)
|
|
||||||
}
|
|
||||||
st := core.NewStateTransition(evm, msg, new(core.GasPool).AddGas(tx.Gas()))
|
|
||||||
|
|
||||||
if _, err = st.TransitionDb(); err != nil {
|
|
||||||
return fmt.Errorf("failed to execute transaction: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Retrieve the trace result and compare against the etalon
|
|
||||||
res, err := tracer.GetResult()
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("failed to retrieve trace result: %v", err)
|
|
||||||
}
|
|
||||||
ret := make([]flatCallTrace, 0)
|
|
||||||
if err := json.Unmarshal(res, &ret); err != nil {
|
|
||||||
return fmt.Errorf("failed to unmarshal trace result: %v", err)
|
|
||||||
}
|
|
||||||
if !jsonEqualFlat(ret, test.Result) {
|
|
||||||
t.Logf("tracer name: %s", tracerName)
|
|
||||||
|
|
||||||
// uncomment this for easier debugging
|
|
||||||
// have, _ := json.MarshalIndent(ret, "", " ")
|
|
||||||
// want, _ := json.MarshalIndent(test.Result, "", " ")
|
|
||||||
// t.Logf("trace mismatch: \nhave %+v\nwant %+v", string(have), string(want))
|
|
||||||
|
|
||||||
// uncomment this for harder debugging <3 meowsbits
|
|
||||||
// lines := deep.Equal(ret, test.Result)
|
|
||||||
// for _, l := range lines {
|
|
||||||
// t.Logf("%s", l)
|
|
||||||
// t.FailNow()
|
|
||||||
// }
|
|
||||||
|
|
||||||
t.Fatalf("trace mismatch: \nhave %+v\nwant %+v", ret, test.Result)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Iterates over all the input-output datasets in the tracer parity test harness and
|
|
||||||
// runs the Native tracer against them.
|
|
||||||
func TestFlatCallTracerNative(t *testing.T) {
|
|
||||||
testFlatCallTracer("flatCallTracer", "call_tracer_flat", t)
|
|
||||||
}
|
|
||||||
|
|
||||||
func testFlatCallTracer(tracerName string, dirPath string, t *testing.T) {
|
|
||||||
files, err := os.ReadDir(filepath.Join("testdata", dirPath))
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to retrieve tracer test suite: %v", err)
|
|
||||||
}
|
|
||||||
for _, file := range files {
|
|
||||||
if !strings.HasSuffix(file.Name(), ".json") {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
file := file // capture range variable
|
|
||||||
t.Run(camel(strings.TrimSuffix(file.Name(), ".json")), func(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
err := flatCallTracerTestRunner(tracerName, file.Name(), dirPath, t)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// jsonEqual is similar to reflect.DeepEqual, but does a 'bounce' via json prior to
|
|
||||||
// comparison
|
|
||||||
func jsonEqualFlat(x, y interface{}) bool {
|
|
||||||
xTrace := new([]flatCallTrace)
|
|
||||||
yTrace := new([]flatCallTrace)
|
|
||||||
if xj, err := json.Marshal(x); err == nil {
|
|
||||||
json.Unmarshal(xj, xTrace)
|
|
||||||
} else {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if yj, err := json.Marshal(y); err == nil {
|
|
||||||
json.Unmarshal(yj, yTrace)
|
|
||||||
} else {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return reflect.DeepEqual(xTrace, yTrace)
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkFlatCallTracer(b *testing.B) {
|
|
||||||
files, err := filepath.Glob("testdata/call_tracer_flat/*.json")
|
|
||||||
if err != nil {
|
|
||||||
b.Fatalf("failed to read testdata: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, file := range files {
|
|
||||||
filename := strings.TrimPrefix(file, "testdata/call_tracer_flat/")
|
|
||||||
b.Run(camel(strings.TrimSuffix(filename, ".json")), func(b *testing.B) {
|
|
||||||
for n := 0; n < b.N; n++ {
|
|
||||||
err := flatCallTracerTestRunner("flatCallTracer", filename, "call_tracer_flat", b)
|
|
||||||
if err != nil {
|
|
||||||
b.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,151 +0,0 @@
|
||||||
// Copyright 2021 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/>.
|
|
||||||
|
|
||||||
package tracetest
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"math/big"
|
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
"strings"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
|
||||||
"github.com/ethereum/go-ethereum/core"
|
|
||||||
"github.com/ethereum/go-ethereum/core/rawdb"
|
|
||||||
"github.com/ethereum/go-ethereum/core/types"
|
|
||||||
"github.com/ethereum/go-ethereum/core/vm"
|
|
||||||
"github.com/ethereum/go-ethereum/eth/tracers"
|
|
||||||
"github.com/ethereum/go-ethereum/tests"
|
|
||||||
)
|
|
||||||
|
|
||||||
// prestateTrace is the result of a prestateTrace run.
|
|
||||||
type prestateTrace = map[common.Address]*account
|
|
||||||
|
|
||||||
type account struct {
|
|
||||||
Balance string `json:"balance"`
|
|
||||||
Code string `json:"code"`
|
|
||||||
Nonce uint64 `json:"nonce"`
|
|
||||||
Storage map[common.Hash]common.Hash `json:"storage"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// testcase defines a single test to check the stateDiff tracer against.
|
|
||||||
type testcase struct {
|
|
||||||
Genesis *core.Genesis `json:"genesis"`
|
|
||||||
Context *callContext `json:"context"`
|
|
||||||
Input string `json:"input"`
|
|
||||||
TracerConfig json.RawMessage `json:"tracerConfig"`
|
|
||||||
Result interface{} `json:"result"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestPrestateTracerLegacy(t *testing.T) {
|
|
||||||
testPrestateDiffTracer("prestateTracerLegacy", "prestate_tracer_legacy", t)
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestPrestateTracer(t *testing.T) {
|
|
||||||
testPrestateDiffTracer("prestateTracer", "prestate_tracer", t)
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestPrestateWithDiffModeTracer(t *testing.T) {
|
|
||||||
testPrestateDiffTracer("prestateTracer", "prestate_tracer_with_diff_mode", t)
|
|
||||||
}
|
|
||||||
|
|
||||||
func testPrestateDiffTracer(tracerName string, dirPath string, t *testing.T) {
|
|
||||||
files, err := os.ReadDir(filepath.Join("testdata", dirPath))
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to retrieve tracer test suite: %v", err)
|
|
||||||
}
|
|
||||||
for _, file := range files {
|
|
||||||
if !strings.HasSuffix(file.Name(), ".json") {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
file := file // capture range variable
|
|
||||||
t.Run(camel(strings.TrimSuffix(file.Name(), ".json")), func(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
var (
|
|
||||||
test = new(testcase)
|
|
||||||
tx = new(types.Transaction)
|
|
||||||
)
|
|
||||||
// Call tracer test found, read if from disk
|
|
||||||
if blob, err := os.ReadFile(filepath.Join("testdata", dirPath, file.Name())); err != nil {
|
|
||||||
t.Fatalf("failed to read testcase: %v", err)
|
|
||||||
} else if err := json.Unmarshal(blob, test); err != nil {
|
|
||||||
t.Fatalf("failed to parse testcase: %v", err)
|
|
||||||
}
|
|
||||||
if err := tx.UnmarshalBinary(common.FromHex(test.Input)); err != nil {
|
|
||||||
t.Fatalf("failed to parse testcase input: %v", err)
|
|
||||||
}
|
|
||||||
// Configure a blockchain with the given prestate
|
|
||||||
var (
|
|
||||||
signer = types.MakeSigner(test.Genesis.Config, new(big.Int).SetUint64(uint64(test.Context.Number)), uint64(test.Context.Time))
|
|
||||||
origin, _ = signer.Sender(tx)
|
|
||||||
txContext = vm.TxContext{
|
|
||||||
Origin: origin,
|
|
||||||
GasPrice: tx.GasPrice(),
|
|
||||||
}
|
|
||||||
context = vm.BlockContext{
|
|
||||||
CanTransfer: core.CanTransfer,
|
|
||||||
Transfer: core.Transfer,
|
|
||||||
Coinbase: test.Context.Miner,
|
|
||||||
BlockNumber: new(big.Int).SetUint64(uint64(test.Context.Number)),
|
|
||||||
Time: uint64(test.Context.Time),
|
|
||||||
Difficulty: (*big.Int)(test.Context.Difficulty),
|
|
||||||
GasLimit: uint64(test.Context.GasLimit),
|
|
||||||
BaseFee: test.Genesis.BaseFee,
|
|
||||||
}
|
|
||||||
triedb, _, statedb = tests.MakePreState(rawdb.NewMemoryDatabase(), test.Genesis.Alloc, false, rawdb.HashScheme)
|
|
||||||
)
|
|
||||||
defer triedb.Close()
|
|
||||||
|
|
||||||
tracer, err := tracers.DefaultDirectory.New(tracerName, new(tracers.Context), test.TracerConfig)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to create call tracer: %v", err)
|
|
||||||
}
|
|
||||||
evm := vm.NewEVM(context, txContext, statedb, test.Genesis.Config, vm.Config{Tracer: tracer})
|
|
||||||
msg, err := core.TransactionToMessage(tx, signer, nil)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to prepare transaction for tracing: %v", err)
|
|
||||||
}
|
|
||||||
st := core.NewStateTransition(evm, msg, new(core.GasPool).AddGas(tx.Gas()))
|
|
||||||
if _, err = st.TransitionDb(); err != nil {
|
|
||||||
t.Fatalf("failed to execute transaction: %v", err)
|
|
||||||
}
|
|
||||||
// Retrieve the trace result and compare against the expected
|
|
||||||
res, err := tracer.GetResult()
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to retrieve trace result: %v", err)
|
|
||||||
}
|
|
||||||
// The legacy javascript calltracer marshals json in js, which
|
|
||||||
// is not deterministic (as opposed to the golang json encoder).
|
|
||||||
if strings.HasSuffix(dirPath, "_legacy") {
|
|
||||||
// This is a tweak to make it deterministic. Can be removed when
|
|
||||||
// we remove the legacy tracer.
|
|
||||||
var x prestateTrace
|
|
||||||
json.Unmarshal(res, &x)
|
|
||||||
res, _ = json.Marshal(x)
|
|
||||||
}
|
|
||||||
want, err := json.Marshal(test.Result)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal test: %v", err)
|
|
||||||
}
|
|
||||||
if string(want) != string(res) {
|
|
||||||
t.Fatalf("trace mismatch\n have: %v\n want: %v\n", string(res), string(want))
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,58 +0,0 @@
|
||||||
{
|
|
||||||
"context": {
|
|
||||||
"difficulty": "3755480783",
|
|
||||||
"gasLimit": "5401723",
|
|
||||||
"miner": "0xd049bfd667cb46aa3ef5df0da3e57db3be39e511",
|
|
||||||
"number": "2294702",
|
|
||||||
"timestamp": "1513676146"
|
|
||||||
},
|
|
||||||
"genesis": {
|
|
||||||
"alloc": {
|
|
||||||
"0x13e4acefe6a6700604929946e70e6443e4e73447": {
|
|
||||||
"balance": "0xcf3e0938579f000",
|
|
||||||
"code": "0x",
|
|
||||||
"nonce": "9",
|
|
||||||
"storage": {}
|
|
||||||
},
|
|
||||||
"0x7dc9c9730689ff0b0fd506c67db815f12d90a448": {
|
|
||||||
"balance": "0x0",
|
|
||||||
"code": "0x",
|
|
||||||
"nonce": "0",
|
|
||||||
"storage": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"byzantiumBlock": 1700000,
|
|
||||||
"chainId": 3,
|
|
||||||
"daoForkSupport": true,
|
|
||||||
"eip150Block": 0,
|
|
||||||
"eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
|
|
||||||
"eip155Block": 10,
|
|
||||||
"eip158Block": 10,
|
|
||||||
"ethash": {},
|
|
||||||
"homesteadBlock": 0
|
|
||||||
},
|
|
||||||
"difficulty": "3757315409",
|
|
||||||
"extraData": "0x566961425443",
|
|
||||||
"gasLimit": "5406414",
|
|
||||||
"hash": "0xae107f592eebdd9ff8d6ba00363676096e6afb0e1007a7d3d0af88173077378d",
|
|
||||||
"miner": "0xd049bfd667cb46aa3ef5df0da3e57db3be39e511",
|
|
||||||
"mixHash": "0xc927aa05a38bc3de864e95c33b3ae559d3f39c4ccd51cef6f113f9c50ba0caf1",
|
|
||||||
"nonce": "0x93363bbd2c95f410",
|
|
||||||
"number": "2294701",
|
|
||||||
"stateRoot": "0x6b6737d5bde8058990483e915866bd1578014baeff57bd5e4ed228a2bfad635c",
|
|
||||||
"timestamp": "1513676127",
|
|
||||||
"totalDifficulty": "7160808139332585"
|
|
||||||
},
|
|
||||||
"input": "0xf907ef098504e3b29200830897be8080b9079c606060405260405160208061077c83398101604052808051906020019091905050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415151561007d57600080fd5b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600460006101000a81548160ff02191690831515021790555050610653806101296000396000f300606060405260043610610083576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806305e4382a146100855780631c02708d146100ae5780632e1a7d4d146100c35780635114cb52146100e6578063a37dda2c146100fe578063ae200e7914610153578063b5769f70146101a8575b005b341561009057600080fd5b6100986101d1565b6040518082815260200191505060405180910390f35b34156100b957600080fd5b6100c16101d7565b005b34156100ce57600080fd5b6100e460048080359060200190919050506102eb565b005b6100fc6004808035906020019091905050610513565b005b341561010957600080fd5b6101116105d6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015e57600080fd5b6101666105fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101b357600080fd5b6101bb610621565b6040518082815260200191505060405180910390f35b60025481565b60011515600460009054906101000a900460ff1615151415156101f957600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102a15750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156102ac57600080fd5b6000600460006101000a81548160ff0219169083151502179055506003543073ffffffffffffffffffffffffffffffffffffffff163103600281905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806103935750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561039e57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561048357600060025411801561040757506002548111155b151561041257600080fd5b80600254036002819055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561047e57600080fd5b610510565b600060035411801561049757506003548111155b15156104a257600080fd5b8060035403600381905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561050f57600080fd5b5b50565b60011515600460009054906101000a900460ff16151514151561053557600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614801561059657506003548160035401115b80156105bd575080600354013073ffffffffffffffffffffffffffffffffffffffff163110155b15156105c857600080fd5b806003540160038190555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600354815600a165627a7a72305820c3b849e8440987ce43eae3097b77672a69234d516351368b03fe5b7de03807910029000000000000000000000000c65e620a3a55451316168d57e268f5702ef56a1129a01060f46676a5dff6f407f0f51eb6f37f5c8c54e238c70221e18e65fc29d3ea65a0557b01c50ff4ffaac8ed6e5d31237a4ecbac843ab1bfe8bb0165a0060df7c54f",
|
|
||||||
"result": {
|
|
||||||
"from": "0x13e4acefe6a6700604929946e70e6443e4e73447",
|
|
||||||
"gas": "0x897be",
|
|
||||||
"gasUsed": "0x897be",
|
|
||||||
"input": "0x606060405260405160208061077c83398101604052808051906020019091905050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415151561007d57600080fd5b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600460006101000a81548160ff02191690831515021790555050610653806101296000396000f300606060405260043610610083576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806305e4382a146100855780631c02708d146100ae5780632e1a7d4d146100c35780635114cb52146100e6578063a37dda2c146100fe578063ae200e7914610153578063b5769f70146101a8575b005b341561009057600080fd5b6100986101d1565b6040518082815260200191505060405180910390f35b34156100b957600080fd5b6100c16101d7565b005b34156100ce57600080fd5b6100e460048080359060200190919050506102eb565b005b6100fc6004808035906020019091905050610513565b005b341561010957600080fd5b6101116105d6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015e57600080fd5b6101666105fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101b357600080fd5b6101bb610621565b6040518082815260200191505060405180910390f35b60025481565b60011515600460009054906101000a900460ff1615151415156101f957600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102a15750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156102ac57600080fd5b6000600460006101000a81548160ff0219169083151502179055506003543073ffffffffffffffffffffffffffffffffffffffff163103600281905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806103935750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561039e57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561048357600060025411801561040757506002548111155b151561041257600080fd5b80600254036002819055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561047e57600080fd5b610510565b600060035411801561049757506003548111155b15156104a257600080fd5b8060035403600381905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561050f57600080fd5b5b50565b60011515600460009054906101000a900460ff16151514151561053557600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614801561059657506003548160035401115b80156105bd575080600354013073ffffffffffffffffffffffffffffffffffffffff163110155b15156105c857600080fd5b806003540160038190555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600354815600a165627a7a72305820c3b849e8440987ce43eae3097b77672a69234d516351368b03fe5b7de03807910029000000000000000000000000c65e620a3a55451316168d57e268f5702ef56a11",
|
|
||||||
"output": "0x606060405260043610610083576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806305e4382a146100855780631c02708d146100ae5780632e1a7d4d146100c35780635114cb52146100e6578063a37dda2c146100fe578063ae200e7914610153578063b5769f70146101a8575b005b341561009057600080fd5b6100986101d1565b6040518082815260200191505060405180910390f35b34156100b957600080fd5b6100c16101d7565b005b34156100ce57600080fd5b6100e460048080359060200190919050506102eb565b005b6100fc6004808035906020019091905050610513565b005b341561010957600080fd5b6101116105d6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015e57600080fd5b6101666105fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101b357600080fd5b6101bb610621565b6040518082815260200191505060405180910390f35b60025481565b60011515600460009054906101000a900460ff1615151415156101f957600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102a15750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156102ac57600080fd5b6000600460006101000a81548160ff0219169083151502179055506003543073ffffffffffffffffffffffffffffffffffffffff163103600281905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806103935750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561039e57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561048357600060025411801561040757506002548111155b151561041257600080fd5b80600254036002819055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561047e57600080fd5b610510565b600060035411801561049757506003548111155b15156104a257600080fd5b8060035403600381905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561050f57600080fd5b5b50565b60011515600460009054906101000a900460ff16151514151561053557600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614801561059657506003548160035401115b80156105bd575080600354013073ffffffffffffffffffffffffffffffffffffffff163110155b15156105c857600080fd5b806003540160038190555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600354815600a165627a7a72305820c3b849e8440987ce43eae3097b77672a69234d516351368b03fe5b7de03807910029",
|
|
||||||
"to": "0x7dc9c9730689ff0b0fd506c67db815f12d90a448",
|
|
||||||
"type": "CREATE",
|
|
||||||
"value": "0x0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -1,61 +0,0 @@
|
||||||
{
|
|
||||||
"genesis": {
|
|
||||||
"difficulty": "117067574",
|
|
||||||
"extraData": "0xd783010502846765746887676f312e372e33856c696e7578",
|
|
||||||
"gasLimit": "4712380",
|
|
||||||
"hash": "0xe05db05eeb3f288041ecb10a787df121c0ed69499355716e17c307de313a4486",
|
|
||||||
"miner": "0x0c062b329265c965deef1eede55183b3acb8f611",
|
|
||||||
"mixHash": "0xb669ae39118a53d2c65fd3b1e1d3850dd3f8c6842030698ed846a2762d68b61d",
|
|
||||||
"nonce": "0x2b469722b8e28c45",
|
|
||||||
"number": "24973",
|
|
||||||
"stateRoot": "0x532a5c3f75453a696428db078e32ae283c85cb97e4d8560dbdf022adac6df369",
|
|
||||||
"timestamp": "1479891145",
|
|
||||||
"totalDifficulty": "1892250259406",
|
|
||||||
"alloc": {
|
|
||||||
"0x6c06b16512b332e6cd8293a2974872674716ce18": {
|
|
||||||
"balance": "0x0",
|
|
||||||
"nonce": "1",
|
|
||||||
"code": "0x60606040526000357c0100000000000000000000000000000000000000000000000000000000900480632e1a7d4d146036575b6000565b34600057604e60048080359060200190919050506050565b005b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051809050600060405180830381858888f19350505050505b5056",
|
|
||||||
"storage": {}
|
|
||||||
},
|
|
||||||
"0x66fdfd05e46126a07465ad24e40cc0597bc1ef31": {
|
|
||||||
"balance": "0x229ebbb36c3e0f20",
|
|
||||||
"nonce": "3",
|
|
||||||
"code": "0x",
|
|
||||||
"storage": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"chainId": 3,
|
|
||||||
"homesteadBlock": 0,
|
|
||||||
"daoForkSupport": true,
|
|
||||||
"eip150Block": 0,
|
|
||||||
"eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
|
|
||||||
"eip155Block": 10,
|
|
||||||
"eip158Block": 10,
|
|
||||||
"byzantiumBlock": 1700000,
|
|
||||||
"constantinopleBlock": 4230000,
|
|
||||||
"petersburgBlock": 4939394,
|
|
||||||
"istanbulBlock": 6485846,
|
|
||||||
"muirGlacierBlock": 7117117,
|
|
||||||
"ethash": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"context": {
|
|
||||||
"number": "24974",
|
|
||||||
"difficulty": "117067574",
|
|
||||||
"timestamp": "1479891162",
|
|
||||||
"gasLimit": "4712388",
|
|
||||||
"miner": "0xc822ef32e6d26e170b70cf761e204c1806265914"
|
|
||||||
},
|
|
||||||
"input": "0xf889038504a81557008301f97e946c06b16512b332e6cd8293a2974872674716ce1880a42e1a7d4d00000000000000000000000000000000000000000000000014d1120d7b1600002aa0e2a6558040c5d72bc59f2fb62a38993a314c849cd22fb393018d2c5af3112095a01bdb6d7ba32263ccc2ecc880d38c49d9f0c5a72d8b7908e3122b31356d349745",
|
|
||||||
"result": {
|
|
||||||
"type": "CALL",
|
|
||||||
"from": "0x66fdfd05e46126a07465ad24e40cc0597bc1ef31",
|
|
||||||
"to": "0x6c06b16512b332e6cd8293a2974872674716ce18",
|
|
||||||
"value": "0x0",
|
|
||||||
"gas": "0x1f97e",
|
|
||||||
"gasUsed": "0x72de",
|
|
||||||
"input": "0x2e1a7d4d00000000000000000000000000000000000000000000000014d1120d7b160000"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,85 +0,0 @@
|
||||||
{
|
|
||||||
"genesis": {
|
|
||||||
"baseFeePerGas": "1000000000",
|
|
||||||
"difficulty": "1",
|
|
||||||
"extraData": "0x00000000000000000000000000000000000000000000000000000000000000003623191d4ccfbbdf09e8ebf6382a1f8257417bc10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
|
||||||
"gasLimit": "11500000",
|
|
||||||
"hash": "0x2af138b8a06e65b8dd0999df70b9e87609e9fc91ea201f08b1cc4f25ef01fcf6",
|
|
||||||
"miner": "0x0000000000000000000000000000000000000000",
|
|
||||||
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
|
||||||
"nonce": "0x0000000000000000",
|
|
||||||
"number": "0",
|
|
||||||
"stateRoot": "0xa775801d572e9b79585eb131d18d79f8a0f71895455ab9a5b656911428e11708",
|
|
||||||
"timestamp": "0",
|
|
||||||
"totalDifficulty": "1",
|
|
||||||
"alloc": {
|
|
||||||
"0x3623191d4ccfbbdf09e8ebf6382a1f8257417bc1": {
|
|
||||||
"balance": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7"
|
|
||||||
},
|
|
||||||
"0xd15abca351f79181dedfb6d019e382db90f3628a": {
|
|
||||||
"balance": "0x0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"chainId": 1337,
|
|
||||||
"homesteadBlock": 0,
|
|
||||||
"eip150Block": 0,
|
|
||||||
"eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
|
||||||
"eip155Block": 0,
|
|
||||||
"eip158Block": 0,
|
|
||||||
"byzantiumBlock": 0,
|
|
||||||
"constantinopleBlock": 0,
|
|
||||||
"petersburgBlock": 0,
|
|
||||||
"istanbulBlock": 0,
|
|
||||||
"muirGlacierBlock": 0,
|
|
||||||
"berlinBlock": 0,
|
|
||||||
"londonBlock": 0,
|
|
||||||
"clique": {
|
|
||||||
"period": 0,
|
|
||||||
"epoch": 30000
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"context": {
|
|
||||||
"number": "1",
|
|
||||||
"difficulty": "2",
|
|
||||||
"timestamp": "1665537018",
|
|
||||||
"gasLimit": "11511229",
|
|
||||||
"miner": "0x0000000000000000000000000000000000000000"
|
|
||||||
},
|
|
||||||
"input": "0x02f9029d82053980849502f90085010c388d00832dc6c08080b90241608060405234801561001057600080fd5b50600060405161001f906100a2565b604051809103906000f08015801561003b573d6000803e3d6000fd5b5090508073ffffffffffffffffffffffffffffffffffffffff1663c04062266040518163ffffffff1660e01b815260040160006040518083038186803b15801561008457600080fd5b505afa158015610098573d6000803e3d6000fd5b50505050506100af565b610145806100fc83390190565b603f806100bd6000396000f3fe6080604052600080fdfea264697066735822122077f7dbd3450d6e817079cf3fe27107de5768bb3163a402b94e2206b468eb025664736f6c63430008070033608060405234801561001057600080fd5b50610125806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063c040622614602d575b600080fd5b60336035565b005b60036002116076576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401606d906097565b60405180910390fd5b565b6000608360128360b5565b9150608c8260c6565b602082019050919050565b6000602082019050818103600083015260ae816078565b9050919050565b600082825260208201905092915050565b7f546869732063616c6c6564206661696c6564000000000000000000000000000060008201525056fea264697066735822122033f8d92e29d467e5ea08d0024eab0b36b86b8cdb3542c6e89dbaabeb8ffaa42064736f6c63430008070033c001a07566181071cabaf58b70fc41557eb813bfc7a24f5c58554e7fed0bf7c031f169a0420af50b5fe791a4d839e181a676db5250b415dfb35cb85d544db7a1475ae2cc",
|
|
||||||
"result": {
|
|
||||||
"from": "0x3623191d4ccfbbdf09e8ebf6382a1f8257417bc1",
|
|
||||||
"gas": "0x2dc6c0",
|
|
||||||
"gasUsed": "0x25590",
|
|
||||||
"input": "0x608060405234801561001057600080fd5b50600060405161001f906100a2565b604051809103906000f08015801561003b573d6000803e3d6000fd5b5090508073ffffffffffffffffffffffffffffffffffffffff1663c04062266040518163ffffffff1660e01b815260040160006040518083038186803b15801561008457600080fd5b505afa158015610098573d6000803e3d6000fd5b50505050506100af565b610145806100fc83390190565b603f806100bd6000396000f3fe6080604052600080fdfea264697066735822122077f7dbd3450d6e817079cf3fe27107de5768bb3163a402b94e2206b468eb025664736f6c63430008070033608060405234801561001057600080fd5b50610125806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063c040622614602d575b600080fd5b60336035565b005b60036002116076576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401606d906097565b60405180910390fd5b565b6000608360128360b5565b9150608c8260c6565b602082019050919050565b6000602082019050818103600083015260ae816078565b9050919050565b600082825260208201905092915050565b7f546869732063616c6c6564206661696c6564000000000000000000000000000060008201525056fea264697066735822122033f8d92e29d467e5ea08d0024eab0b36b86b8cdb3542c6e89dbaabeb8ffaa42064736f6c63430008070033",
|
|
||||||
"output": "0x08c379a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000012546869732063616c6c6564206661696c65640000000000000000000000000000",
|
|
||||||
"error": "execution reverted",
|
|
||||||
"revertReason": "This called failed",
|
|
||||||
"calls": [
|
|
||||||
{
|
|
||||||
"from": "0xdebfb4b387033eac57af7b3de5116dd60056803b",
|
|
||||||
"gas": "0x2ba851",
|
|
||||||
"gasUsed": "0xe557",
|
|
||||||
"to": "0xd15abca351f79181dedfb6d019e382db90f3628a",
|
|
||||||
"input": "0x608060405234801561001057600080fd5b50610125806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063c040622614602d575b600080fd5b60336035565b005b60036002116076576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401606d906097565b60405180910390fd5b565b6000608360128360b5565b9150608c8260c6565b602082019050919050565b6000602082019050818103600083015260ae816078565b9050919050565b600082825260208201905092915050565b7f546869732063616c6c6564206661696c6564000000000000000000000000000060008201525056fea264697066735822122033f8d92e29d467e5ea08d0024eab0b36b86b8cdb3542c6e89dbaabeb8ffaa42064736f6c63430008070033",
|
|
||||||
"output": "0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063c040622614602d575b600080fd5b60336035565b005b60036002116076576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401606d906097565b60405180910390fd5b565b6000608360128360b5565b9150608c8260c6565b602082019050919050565b6000602082019050818103600083015260ae816078565b9050919050565b600082825260208201905092915050565b7f546869732063616c6c6564206661696c6564000000000000000000000000000060008201525056fea264697066735822122033f8d92e29d467e5ea08d0024eab0b36b86b8cdb3542c6e89dbaabeb8ffaa42064736f6c63430008070033",
|
|
||||||
"value": "0x0",
|
|
||||||
"type": "CREATE"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"from": "0xdebfb4b387033eac57af7b3de5116dd60056803b",
|
|
||||||
"gas": "0x2ac548",
|
|
||||||
"gasUsed": "0x1b2",
|
|
||||||
"to": "0xd15abca351f79181dedfb6d019e382db90f3628a",
|
|
||||||
"input": "0xc0406226",
|
|
||||||
"output": "0x08c379a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000012546869732063616c6c6564206661696c65640000000000000000000000000000",
|
|
||||||
"error": "execution reverted",
|
|
||||||
"revertReason": "This called failed",
|
|
||||||
"type": "STATICCALL"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"value": "0x0",
|
|
||||||
"type": "CREATE"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -1,19 +0,0 @@
|
||||||
This test tests out the trace generated by the deployment of this contract:
|
|
||||||
|
|
||||||
```solidity
|
|
||||||
contract Revertor {
|
|
||||||
function run() public pure {
|
|
||||||
require(2 > 3, "This called failed");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
contract Contract {
|
|
||||||
constructor() {
|
|
||||||
Revertor r = new Revertor();
|
|
||||||
r.run();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
The trace should show a revert, with the revert reason for both the top-call as well
|
|
||||||
as the inner call.
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -1,58 +0,0 @@
|
||||||
{
|
|
||||||
"context": {
|
|
||||||
"difficulty": "3665057456",
|
|
||||||
"gasLimit": "5232723",
|
|
||||||
"miner": "0xf4d8e706cfb25c0decbbdd4d2e2cc10c66376a3f",
|
|
||||||
"number": "2294501",
|
|
||||||
"timestamp": "1513673601"
|
|
||||||
},
|
|
||||||
"genesis": {
|
|
||||||
"alloc": {
|
|
||||||
"0x0f6cef2b7fbb504782e35aa82a2207e816a2b7a9": {
|
|
||||||
"balance": "0x2a3fc32bcc019283",
|
|
||||||
"code": "0x",
|
|
||||||
"nonce": "10",
|
|
||||||
"storage": {}
|
|
||||||
},
|
|
||||||
"0xabbcd5b340c80b5f1c0545c04c987b87310296ae": {
|
|
||||||
"balance": "0x0",
|
|
||||||
"code": "0x606060405236156100755763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416632d0335ab811461007a578063548db174146100ab5780637f649783146100fc578063b092145e1461014d578063c3f44c0a14610186578063c47cf5de14610203575b600080fd5b341561008557600080fd5b610099600160a060020a0360043516610270565b60405190815260200160405180910390f35b34156100b657600080fd5b6100fa600460248135818101908301358060208181020160405190810160405280939291908181526020018383602002808284375094965061028f95505050505050565b005b341561010757600080fd5b6100fa600460248135818101908301358060208181020160405190810160405280939291908181526020018383602002808284375094965061029e95505050505050565b005b341561015857600080fd5b610172600160a060020a03600435811690602435166102ad565b604051901515815260200160405180910390f35b341561019157600080fd5b6100fa6004803560ff1690602480359160443591606435600160a060020a0316919060a49060843590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965050509235600160a060020a031692506102cd915050565b005b341561020e57600080fd5b61025460046024813581810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965061056a95505050505050565b604051600160a060020a03909116815260200160405180910390f35b600160a060020a0381166000908152602081905260409020545b919050565b61029a816000610594565b5b50565b61029a816001610594565b5b50565b600160209081526000928352604080842090915290825290205460ff1681565b60008080600160a060020a038416158061030d5750600160a060020a038085166000908152600160209081526040808320339094168352929052205460ff165b151561031857600080fd5b6103218561056a565b600160a060020a038116600090815260208190526040808220549295507f19000000000000000000000000000000000000000000000000000000000000009230918891908b908b90517fff000000000000000000000000000000000000000000000000000000000000008089168252871660018201526c01000000000000000000000000600160a060020a038088168202600284015286811682026016840152602a8301869052841602604a820152605e810182805190602001908083835b6020831061040057805182525b601f1990920191602091820191016103e0565b6001836020036101000a0380198251168184511617909252505050919091019850604097505050505050505051809103902091506001828a8a8a6040516000815260200160405260006040516020015260405193845260ff90921660208085019190915260408085019290925260608401929092526080909201915160208103908084039060008661646e5a03f1151561049957600080fd5b5050602060405103519050600160a060020a03838116908216146104bc57600080fd5b600160a060020a0380841660009081526020819052604090819020805460010190559087169086905180828051906020019080838360005b8381101561050d5780820151818401525b6020016104f4565b50505050905090810190601f16801561053a5780820380516001836020036101000a031916815260200191505b5091505060006040518083038160008661646e5a03f1915050151561055e57600080fd5b5b505050505050505050565b600060248251101561057e5750600061028a565b600160a060020a0360248301511690505b919050565b60005b825181101561060157600160a060020a033316600090815260016020526040812083918584815181106105c657fe5b90602001906020020151600160a060020a031681526020810191909152604001600020805460ff19169115159190911790555b600101610597565b5b5050505600a165627a7a723058200027e8b695e9d2dea9f3629519022a69f3a1d23055ce86406e686ea54f31ee9c0029",
|
|
||||||
"nonce": "1",
|
|
||||||
"storage": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"byzantiumBlock": 1700000,
|
|
||||||
"chainId": 3,
|
|
||||||
"daoForkSupport": true,
|
|
||||||
"eip150Block": 0,
|
|
||||||
"eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
|
|
||||||
"eip155Block": 10,
|
|
||||||
"eip158Block": 10,
|
|
||||||
"ethash": {},
|
|
||||||
"homesteadBlock": 0
|
|
||||||
},
|
|
||||||
"difficulty": "3672229776",
|
|
||||||
"extraData": "0x4554482e45544846414e532e4f52472d4641313738394444",
|
|
||||||
"gasLimit": "5227619",
|
|
||||||
"hash": "0xa07b3d6c6bf63f5f981016db9f2d1d93033833f2c17e8bf7209e85f1faf08076",
|
|
||||||
"miner": "0xbbf5029fd710d227630c8b7d338051b8e76d50b3",
|
|
||||||
"mixHash": "0x806e151ce2817be922e93e8d5921fa0f0d0fd213d6b2b9a3fa17458e74a163d0",
|
|
||||||
"nonce": "0xbc5d43adc2c30c7d",
|
|
||||||
"number": "2294500",
|
|
||||||
"stateRoot": "0xca645b335888352ef9d8b1ef083e9019648180b259026572e3139717270de97d",
|
|
||||||
"timestamp": "1513673552",
|
|
||||||
"totalDifficulty": "7160066586979149"
|
|
||||||
},
|
|
||||||
"input": "0xf9018b0a8505d21dba00832dc6c094abbcd5b340c80b5f1c0545c04c987b87310296ae80b9012473b40a5c000000000000000000000000400de2e016bda6577407dfc379faba9899bc73ef0000000000000000000000002cc31912b2b0f3075a87b3640923d45a26cef3ee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000064d79d8e6c7265636f76657279416464726573730000000000000000000000000000000000000000000000000000000000383e3ec32dc0f66d8fe60dbdc2f6815bdf73a988383e3ec32dc0f66d8fe60dbdc2f6815bdf73a988000000000000000000000000000000000000000000000000000000000000000000000000000000001ba0fd659d76a4edbd2a823e324c93f78ad6803b30ff4a9c8bce71ba82798975c70ca06571eecc0b765688ec6c78942c5ee8b585e00988c0141b518287e9be919bc48a",
|
|
||||||
"result": {
|
|
||||||
"error": "execution reverted",
|
|
||||||
"from": "0x0f6cef2b7fbb504782e35aa82a2207e816a2b7a9",
|
|
||||||
"gas": "0x2dc6c0",
|
|
||||||
"gasUsed": "0x719b",
|
|
||||||
"input": "0x73b40a5c000000000000000000000000400de2e016bda6577407dfc379faba9899bc73ef0000000000000000000000002cc31912b2b0f3075a87b3640923d45a26cef3ee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000064d79d8e6c7265636f76657279416464726573730000000000000000000000000000000000000000000000000000000000383e3ec32dc0f66d8fe60dbdc2f6815bdf73a988383e3ec32dc0f66d8fe60dbdc2f6815bdf73a98800000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
|
||||||
"to": "0xabbcd5b340c80b5f1c0545c04c987b87310296ae",
|
|
||||||
"type": "CALL",
|
|
||||||
"value": "0x0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -1,74 +0,0 @@
|
||||||
{
|
|
||||||
"context": {
|
|
||||||
"difficulty": "3502894804",
|
|
||||||
"gasLimit": "4722976",
|
|
||||||
"miner": "0x1585936b53834b021f68cc13eeefdec2efc8e724",
|
|
||||||
"number": "2289806",
|
|
||||||
"timestamp": "1513601314"
|
|
||||||
},
|
|
||||||
"genesis": {
|
|
||||||
"alloc": {
|
|
||||||
"0x0024f658a46fbb89d8ac105e98d7ac7cbbaf27c5": {
|
|
||||||
"balance": "0x0",
|
|
||||||
"code": "0x",
|
|
||||||
"nonce": "22",
|
|
||||||
"storage": {}
|
|
||||||
},
|
|
||||||
"0x3b873a919aa0512d5a0f09e6dcceaa4a6727fafe": {
|
|
||||||
"balance": "0x4d87094125a369d9bd5",
|
|
||||||
"code": "0x61deadff",
|
|
||||||
"nonce": "1",
|
|
||||||
"storage": {}
|
|
||||||
},
|
|
||||||
"0xb436ba50d378d4bbc8660d312a13df6af6e89dfb": {
|
|
||||||
"balance": "0x1780d77678137ac1b775",
|
|
||||||
"code": "0x",
|
|
||||||
"nonce": "29072",
|
|
||||||
"storage": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"byzantiumBlock": 1700000,
|
|
||||||
"chainId": 3,
|
|
||||||
"daoForkSupport": true,
|
|
||||||
"eip150Block": 0,
|
|
||||||
"eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
|
|
||||||
"eip155Block": 10,
|
|
||||||
"eip158Block": 10,
|
|
||||||
"ethash": {},
|
|
||||||
"homesteadBlock": 0
|
|
||||||
},
|
|
||||||
"difficulty": "3509749784",
|
|
||||||
"extraData": "0x4554482e45544846414e532e4f52472d4641313738394444",
|
|
||||||
"gasLimit": "4727564",
|
|
||||||
"hash": "0x609948ac3bd3c00b7736b933248891d6c901ee28f066241bddb28f4e00a9f440",
|
|
||||||
"miner": "0xbbf5029fd710d227630c8b7d338051b8e76d50b3",
|
|
||||||
"mixHash": "0xb131e4507c93c7377de00e7c271bf409ec7492767142ff0f45c882f8068c2ada",
|
|
||||||
"nonce": "0x4eb12e19c16d43da",
|
|
||||||
"number": "2289805",
|
|
||||||
"stateRoot": "0xc7f10f352bff82fac3c2999d3085093d12652e19c7fd32591de49dc5d91b4f1f",
|
|
||||||
"timestamp": "1513601261",
|
|
||||||
"totalDifficulty": "7143276353481064"
|
|
||||||
},
|
|
||||||
"input": "0xf88b8271908506fc23ac0083015f90943b873a919aa0512d5a0f09e6dcceaa4a6727fafe80a463e4bff40000000000000000000000000024f658a46fbb89d8ac105e98d7ac7cbbaf27c52aa0bdce0b59e8761854e857fe64015f06dd08a4fbb7624f6094893a79a72e6ad6bea01d9dde033cff7bb235a3163f348a6d7ab8d6b52bc0963a95b91612e40ca766a4",
|
|
||||||
"result": {
|
|
||||||
"calls": [
|
|
||||||
{
|
|
||||||
"from": "0x3b873a919aa0512d5a0f09e6dcceaa4a6727fafe",
|
|
||||||
"gas": "0x0",
|
|
||||||
"gasUsed": "0x0",
|
|
||||||
"input": "0x",
|
|
||||||
"to": "0x000000000000000000000000000000000000dead",
|
|
||||||
"type": "SELFDESTRUCT",
|
|
||||||
"value": "0x4d87094125a369d9bd5"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"from": "0xb436ba50d378d4bbc8660d312a13df6af6e89dfb",
|
|
||||||
"gas": "0x15f90",
|
|
||||||
"gasUsed": "0x6fcb",
|
|
||||||
"input": "0x63e4bff40000000000000000000000000024f658a46fbb89d8ac105e98d7ac7cbbaf27c5",
|
|
||||||
"to": "0x3b873a919aa0512d5a0f09e6dcceaa4a6727fafe",
|
|
||||||
"type": "CALL",
|
|
||||||
"value": "0x0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,80 +0,0 @@
|
||||||
{
|
|
||||||
"context": {
|
|
||||||
"difficulty": "3502894804",
|
|
||||||
"gasLimit": "4722976",
|
|
||||||
"miner": "0x1585936b53834b021f68cc13eeefdec2efc8e724",
|
|
||||||
"number": "2289806",
|
|
||||||
"timestamp": "1513601314"
|
|
||||||
},
|
|
||||||
"genesis": {
|
|
||||||
"alloc": {
|
|
||||||
"0x0024f658a46fbb89d8ac105e98d7ac7cbbaf27c5": {
|
|
||||||
"balance": "0x0",
|
|
||||||
"code": "0x",
|
|
||||||
"nonce": "22",
|
|
||||||
"storage": {}
|
|
||||||
},
|
|
||||||
"0x3b873a919aa0512d5a0f09e6dcceaa4a6727fafe": {
|
|
||||||
"balance": "0x4d87094125a369d9bd5",
|
|
||||||
"code": "0x606060405236156100935763ffffffff60e060020a60003504166311ee8382811461009c57806313af4035146100be5780631f5e8f4c146100ee57806324daddc5146101125780634921a91a1461013b57806363e4bff414610157578063764978f91461017f578063893d20e8146101a1578063ba40aaa1146101cd578063cebc9a82146101f4578063e177246e14610216575b61009a5b5b565b005b34156100a457fe5b6100ac61023d565b60408051918252519081900360200190f35b34156100c657fe5b6100da600160a060020a0360043516610244565b604080519115158252519081900360200190f35b34156100f657fe5b6100da610307565b604080519115158252519081900360200190f35b341561011a57fe5b6100da6004351515610318565b604080519115158252519081900360200190f35b6100da6103d6565b604080519115158252519081900360200190f35b6100da600160a060020a0360043516610420565b604080519115158252519081900360200190f35b341561018757fe5b6100ac61046c565b60408051918252519081900360200190f35b34156101a957fe5b6101b1610473565b60408051600160a060020a039092168252519081900360200190f35b34156101d557fe5b6100da600435610483565b604080519115158252519081900360200190f35b34156101fc57fe5b6100ac61050d565b60408051918252519081900360200190f35b341561021e57fe5b6100da600435610514565b604080519115158252519081900360200190f35b6003545b90565b60006000610250610473565b600160a060020a031633600160a060020a03161415156102705760006000fd5b600160a060020a03831615156102865760006000fd5b50600054600160a060020a0390811690831681146102fb57604051600160a060020a0380851691908316907ffcf23a92150d56e85e3a3d33b357493246e55783095eb6a733eb8439ffc752c890600090a360008054600160a060020a031916600160a060020a03851617905560019150610300565b600091505b5b50919050565b60005460a060020a900460ff165b90565b60006000610324610473565b600160a060020a031633600160a060020a03161415156103445760006000fd5b5060005460a060020a900460ff16801515831515146102fb576000546040805160a060020a90920460ff1615158252841515602083015280517fe6cd46a119083b86efc6884b970bfa30c1708f53ba57b86716f15b2f4551a9539281900390910190a16000805460a060020a60ff02191660a060020a8515150217905560019150610300565b600091505b5b50919050565b60006103e0610307565b801561040557506103ef610473565b600160a060020a031633600160a060020a031614155b156104105760006000fd5b610419336105a0565b90505b5b90565b600061042a610307565b801561044f5750610439610473565b600160a060020a031633600160a060020a031614155b1561045a5760006000fd5b610463826105a0565b90505b5b919050565b6001545b90565b600054600160a060020a03165b90565b6000600061048f610473565b600160a060020a031633600160a060020a03161415156104af5760006000fd5b506001548281146102fb57604080518281526020810185905281517f79a3746dde45672c9e8ab3644b8bb9c399a103da2dc94b56ba09777330a83509929181900390910190a160018381559150610300565b600091505b5b50919050565b6002545b90565b60006000610520610473565b600160a060020a031633600160a060020a03161415156105405760006000fd5b506002548281146102fb57604080518281526020810185905281517ff6991a728965fedd6e927fdf16bdad42d8995970b4b31b8a2bf88767516e2494929181900390910190a1600283905560019150610300565b600091505b5b50919050565b60006000426105ad61023d565b116102fb576105c46105bd61050d565b4201610652565b6105cc61046c565b604051909150600160a060020a038416908290600081818185876187965a03f1925050501561063d57604080518281529051600160a060020a038516917f9bca65ce52fdef8a470977b51f247a2295123a4807dfa9e502edf0d30722da3b919081900360200190a260019150610300565b6102fb42610652565b5b600091505b50919050565b60038190555b505600a165627a7a72305820f3c973c8b7ed1f62000b6701bd5b708469e19d0f1d73fde378a56c07fd0b19090029",
|
|
||||||
"nonce": "1",
|
|
||||||
"storage": {
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000001b436ba50d378d4bbc8660d312a13df6af6e89dfb",
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000001": "0x00000000000000000000000000000000000000000000000006f05b59d3b20000",
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000002": "0x000000000000000000000000000000000000000000000000000000000000003c",
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000003": "0x000000000000000000000000000000000000000000000000000000005a37b834"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"0xb436ba50d378d4bbc8660d312a13df6af6e89dfb": {
|
|
||||||
"balance": "0x1780d77678137ac1b775",
|
|
||||||
"code": "0x",
|
|
||||||
"nonce": "29072",
|
|
||||||
"storage": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"byzantiumBlock": 1700000,
|
|
||||||
"chainId": 3,
|
|
||||||
"daoForkSupport": true,
|
|
||||||
"eip150Block": 0,
|
|
||||||
"eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
|
|
||||||
"eip155Block": 10,
|
|
||||||
"eip158Block": 10,
|
|
||||||
"ethash": {},
|
|
||||||
"homesteadBlock": 0
|
|
||||||
},
|
|
||||||
"difficulty": "3509749784",
|
|
||||||
"extraData": "0x4554482e45544846414e532e4f52472d4641313738394444",
|
|
||||||
"gasLimit": "4727564",
|
|
||||||
"hash": "0x609948ac3bd3c00b7736b933248891d6c901ee28f066241bddb28f4e00a9f440",
|
|
||||||
"miner": "0xbbf5029fd710d227630c8b7d338051b8e76d50b3",
|
|
||||||
"mixHash": "0xb131e4507c93c7377de00e7c271bf409ec7492767142ff0f45c882f8068c2ada",
|
|
||||||
"nonce": "0x4eb12e19c16d43da",
|
|
||||||
"number": "2289805",
|
|
||||||
"stateRoot": "0xc7f10f352bff82fac3c2999d3085093d12652e19c7fd32591de49dc5d91b4f1f",
|
|
||||||
"timestamp": "1513601261",
|
|
||||||
"totalDifficulty": "7143276353481064"
|
|
||||||
},
|
|
||||||
"input": "0xf88b8271908506fc23ac0083015f90943b873a919aa0512d5a0f09e6dcceaa4a6727fafe80a463e4bff40000000000000000000000000024f658a46fbb89d8ac105e98d7ac7cbbaf27c52aa0bdce0b59e8761854e857fe64015f06dd08a4fbb7624f6094893a79a72e6ad6bea01d9dde033cff7bb235a3163f348a6d7ab8d6b52bc0963a95b91612e40ca766a4",
|
|
||||||
"result": {
|
|
||||||
"calls": [
|
|
||||||
{
|
|
||||||
"from": "0x3b873a919aa0512d5a0f09e6dcceaa4a6727fafe",
|
|
||||||
"gas": "0x6d05",
|
|
||||||
"gasUsed": "0x0",
|
|
||||||
"input": "0x",
|
|
||||||
"to": "0x0024f658a46fbb89d8ac105e98d7ac7cbbaf27c5",
|
|
||||||
"type": "CALL",
|
|
||||||
"value": "0x6f05b59d3b20000"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"from": "0xb436ba50d378d4bbc8660d312a13df6af6e89dfb",
|
|
||||||
"gas": "0x15f90",
|
|
||||||
"gasUsed": "0x9751",
|
|
||||||
"input": "0x63e4bff40000000000000000000000000024f658a46fbb89d8ac105e98d7ac7cbbaf27c5",
|
|
||||||
"output": "0x0000000000000000000000000000000000000000000000000000000000000001",
|
|
||||||
"to": "0x3b873a919aa0512d5a0f09e6dcceaa4a6727fafe",
|
|
||||||
"type": "CALL",
|
|
||||||
"value": "0x0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,72 +0,0 @@
|
||||||
{
|
|
||||||
"context": {
|
|
||||||
"difficulty": "3502894804",
|
|
||||||
"gasLimit": "4722976",
|
|
||||||
"miner": "0x1585936b53834b021f68cc13eeefdec2efc8e724",
|
|
||||||
"number": "2289806",
|
|
||||||
"timestamp": "1513601314"
|
|
||||||
},
|
|
||||||
"genesis": {
|
|
||||||
"alloc": {
|
|
||||||
"0x0024f658a46fbb89d8ac105e98d7ac7cbbaf27c5": {
|
|
||||||
"balance": "0x0",
|
|
||||||
"code": "0x",
|
|
||||||
"nonce": "22",
|
|
||||||
"storage": {}
|
|
||||||
},
|
|
||||||
"0x3b873a919aa0512d5a0f09e6dcceaa4a6727fafe": {
|
|
||||||
"balance": "0x4d87094125a369d9bd5",
|
|
||||||
"code": "0x606060405236156100935763ffffffff60e060020a60003504166311ee8382811461009c57806313af4035146100be5780631f5e8f4c146100ee57806324daddc5146101125780634921a91a1461013b57806363e4bff414610157578063764978f91461017f578063893d20e8146101a1578063ba40aaa1146101cd578063cebc9a82146101f4578063e177246e14610216575b61009a5b5b565b005b34156100a457fe5b6100ac61023d565b60408051918252519081900360200190f35b34156100c657fe5b6100da600160a060020a0360043516610244565b604080519115158252519081900360200190f35b34156100f657fe5b6100da610307565b604080519115158252519081900360200190f35b341561011a57fe5b6100da6004351515610318565b604080519115158252519081900360200190f35b6100da6103d6565b604080519115158252519081900360200190f35b6100da600160a060020a0360043516610420565b604080519115158252519081900360200190f35b341561018757fe5b6100ac61046c565b60408051918252519081900360200190f35b34156101a957fe5b6101b1610473565b60408051600160a060020a039092168252519081900360200190f35b34156101d557fe5b6100da600435610483565b604080519115158252519081900360200190f35b34156101fc57fe5b6100ac61050d565b60408051918252519081900360200190f35b341561021e57fe5b6100da600435610514565b604080519115158252519081900360200190f35b6003545b90565b60006000610250610473565b600160a060020a031633600160a060020a03161415156102705760006000fd5b600160a060020a03831615156102865760006000fd5b50600054600160a060020a0390811690831681146102fb57604051600160a060020a0380851691908316907ffcf23a92150d56e85e3a3d33b357493246e55783095eb6a733eb8439ffc752c890600090a360008054600160a060020a031916600160a060020a03851617905560019150610300565b600091505b5b50919050565b60005460a060020a900460ff165b90565b60006000610324610473565b600160a060020a031633600160a060020a03161415156103445760006000fd5b5060005460a060020a900460ff16801515831515146102fb576000546040805160a060020a90920460ff1615158252841515602083015280517fe6cd46a119083b86efc6884b970bfa30c1708f53ba57b86716f15b2f4551a9539281900390910190a16000805460a060020a60ff02191660a060020a8515150217905560019150610300565b600091505b5b50919050565b60006103e0610307565b801561040557506103ef610473565b600160a060020a031633600160a060020a031614155b156104105760006000fd5b610419336105a0565b90505b5b90565b600061042a610307565b801561044f5750610439610473565b600160a060020a031633600160a060020a031614155b1561045a5760006000fd5b610463826105a0565b90505b5b919050565b6001545b90565b600054600160a060020a03165b90565b6000600061048f610473565b600160a060020a031633600160a060020a03161415156104af5760006000fd5b506001548281146102fb57604080518281526020810185905281517f79a3746dde45672c9e8ab3644b8bb9c399a103da2dc94b56ba09777330a83509929181900390910190a160018381559150610300565b600091505b5b50919050565b6002545b90565b60006000610520610473565b600160a060020a031633600160a060020a03161415156105405760006000fd5b506002548281146102fb57604080518281526020810185905281517ff6991a728965fedd6e927fdf16bdad42d8995970b4b31b8a2bf88767516e2494929181900390910190a1600283905560019150610300565b600091505b5b50919050565b60006000426105ad61023d565b116102fb576105c46105bd61050d565b4201610652565b6105cc61046c565b604051909150600160a060020a038416908290600081818185876187965a03f1925050501561063d57604080518281529051600160a060020a038516917f9bca65ce52fdef8a470977b51f247a2295123a4807dfa9e502edf0d30722da3b919081900360200190a260019150610300565b6102fb42610652565b5b600091505b50919050565b60038190555b505600a165627a7a72305820f3c973c8b7ed1f62000b6701bd5b708469e19d0f1d73fde378a56c07fd0b19090029",
|
|
||||||
"nonce": "1",
|
|
||||||
"storage": {
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000001b436ba50d378d4bbc8660d312a13df6af6e89dfb",
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000001": "0x00000000000000000000000000000000000000000000000006f05b59d3b20000",
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000002": "0x000000000000000000000000000000000000000000000000000000000000003c",
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000003": "0x000000000000000000000000000000000000000000000000000000005a37b834"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"0xb436ba50d378d4bbc8660d312a13df6af6e89dfb": {
|
|
||||||
"balance": "0x1780d77678137ac1b775",
|
|
||||||
"code": "0x",
|
|
||||||
"nonce": "29072",
|
|
||||||
"storage": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"byzantiumBlock": 1700000,
|
|
||||||
"chainId": 3,
|
|
||||||
"daoForkSupport": true,
|
|
||||||
"eip150Block": 0,
|
|
||||||
"eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
|
|
||||||
"eip155Block": 10,
|
|
||||||
"eip158Block": 10,
|
|
||||||
"ethash": {},
|
|
||||||
"homesteadBlock": 0
|
|
||||||
},
|
|
||||||
"difficulty": "3509749784",
|
|
||||||
"extraData": "0x4554482e45544846414e532e4f52472d4641313738394444",
|
|
||||||
"gasLimit": "4727564",
|
|
||||||
"hash": "0x609948ac3bd3c00b7736b933248891d6c901ee28f066241bddb28f4e00a9f440",
|
|
||||||
"miner": "0xbbf5029fd710d227630c8b7d338051b8e76d50b3",
|
|
||||||
"mixHash": "0xb131e4507c93c7377de00e7c271bf409ec7492767142ff0f45c882f8068c2ada",
|
|
||||||
"nonce": "0x4eb12e19c16d43da",
|
|
||||||
"number": "2289805",
|
|
||||||
"stateRoot": "0xc7f10f352bff82fac3c2999d3085093d12652e19c7fd32591de49dc5d91b4f1f",
|
|
||||||
"timestamp": "1513601261",
|
|
||||||
"totalDifficulty": "7143276353481064"
|
|
||||||
},
|
|
||||||
"input": "0xf88b8271908506fc23ac0083015f90943b873a919aa0512d5a0f09e6dcceaa4a6727fafe80a463e4bff40000000000000000000000000024f658a46fbb89d8ac105e98d7ac7cbbaf27c52aa0bdce0b59e8761854e857fe64015f06dd08a4fbb7624f6094893a79a72e6ad6bea01d9dde033cff7bb235a3163f348a6d7ab8d6b52bc0963a95b91612e40ca766a4",
|
|
||||||
"tracerConfig": {
|
|
||||||
"onlyTopCall": true
|
|
||||||
},
|
|
||||||
"result": {
|
|
||||||
"from": "0xb436ba50d378d4bbc8660d312a13df6af6e89dfb",
|
|
||||||
"gas": "0x15f90",
|
|
||||||
"gasUsed": "0x9751",
|
|
||||||
"input": "0x63e4bff40000000000000000000000000024f658a46fbb89d8ac105e98d7ac7cbbaf27c5",
|
|
||||||
"output": "0x0000000000000000000000000000000000000000000000000000000000000001",
|
|
||||||
"to": "0x3b873a919aa0512d5a0f09e6dcceaa4a6727fafe",
|
|
||||||
"type": "CALL",
|
|
||||||
"value": "0x0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -1,64 +0,0 @@
|
||||||
{
|
|
||||||
"genesis": {
|
|
||||||
"difficulty": "50486697699375",
|
|
||||||
"extraData": "0xd783010406844765746887676f312e362e32856c696e7578",
|
|
||||||
"gasLimit": "4788482",
|
|
||||||
"hash": "0xf6bbc5bbe34d5c93fd5b4712cd498d1026b8b0f586efefe7fe30231ed6b8a1a5",
|
|
||||||
"miner": "0xbcdfc35b86bedf72f0cda046a3c16829a2ef41d1",
|
|
||||||
"mixHash": "0xabca93555584c0463ee5c212251dd002bb3a93a157e06614276f93de53d4fdb8",
|
|
||||||
"nonce": "0xa64136fcb9c2d4ca",
|
|
||||||
"number": "1719576",
|
|
||||||
"stateRoot": "0xab5eec2177a92d633e282936af66c46e24cfa8f2fdc2b8155f33885f483d06f3",
|
|
||||||
"timestamp": "1466150166",
|
|
||||||
"totalDifficulty": "28295412423546970038",
|
|
||||||
"alloc": {
|
|
||||||
"0xf8bda96b67036ee48107f2a0695ea673479dda56": {
|
|
||||||
"balance": "0x1529e844f9ecdeec",
|
|
||||||
"nonce": "33",
|
|
||||||
"code": "0x",
|
|
||||||
"storage": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"chainId": 1,
|
|
||||||
"daoForkSupport": true,
|
|
||||||
"eip150Block": 0,
|
|
||||||
"eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
|
|
||||||
"eip155Block": 3000000,
|
|
||||||
"eip158Block": 0,
|
|
||||||
"ethash": {},
|
|
||||||
"homesteadBlock": 1150000,
|
|
||||||
"byzantiumBlock": 8772000,
|
|
||||||
"constantinopleBlock": 9573000,
|
|
||||||
"petersburgBlock": 10500839,
|
|
||||||
"istanbulBlock": 10500839
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"context": {
|
|
||||||
"number": "1719577",
|
|
||||||
"difficulty": "50486697732143",
|
|
||||||
"timestamp": "1466150178",
|
|
||||||
"gasLimit": "4788484",
|
|
||||||
"miner": "0x2a65aca4d5fc5b5c859090a6c34d164135398226"
|
|
||||||
},
|
|
||||||
"input": "0xf874218504a817c800832318608080a35b620186a05a131560135760016020526000565b600080601f600039601f565b6000f31ba0575fa000a1f06659a7b6d3c7877601519a4997f04293f0dfa0eee6d8cd840c77a04c52ce50719ee2ff7a0c5753f4ee69c0340666f582dbb5148845a354ca726e4a",
|
|
||||||
"result": [
|
|
||||||
{
|
|
||||||
"action": {
|
|
||||||
"from": "0xf8bda96b67036ee48107f2a0695ea673479dda56",
|
|
||||||
"gas": "0x231860",
|
|
||||||
"init": "0x5b620186a05a131560135760016020526000565b600080601f600039601f565b6000f3",
|
|
||||||
"value": "0x0"
|
|
||||||
},
|
|
||||||
"blockNumber": 1719577,
|
|
||||||
"result": {
|
|
||||||
"address": "0xb2e6a2546c45889427757171ab05b8b438525b42",
|
|
||||||
"code": "0x",
|
|
||||||
"gasUsed": "0x219202"
|
|
||||||
},
|
|
||||||
"subtraces": 0,
|
|
||||||
"traceAddress": [],
|
|
||||||
"type": "create"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,74 +0,0 @@
|
||||||
{
|
|
||||||
"genesis": {
|
|
||||||
"difficulty": "4671584",
|
|
||||||
"extraData": "0xd683010b05846765746886676f312e3133856c696e7578",
|
|
||||||
"gasLimit": "9435026",
|
|
||||||
"hash": "0x755bd54de4b2f5a7a589a10d69888b4ead48a6311d5d69f2f69ca85ec35fbe0b",
|
|
||||||
"miner": "0x877bd459c9b7d8576b44e59e09d076c25946f443",
|
|
||||||
"mixHash": "0x3a44525624571c31344ba57780f7664098fe7cbeafe532bcdee76a23fc474ba0",
|
|
||||||
"nonce": "0x6dca647c00c72bbf",
|
|
||||||
"number": "1555278",
|
|
||||||
"stateRoot": "0x5f56d8323ee384b0c8d1de49d63e150e17283eea813483698362bc0ec9e0242a",
|
|
||||||
"timestamp": "1590795319",
|
|
||||||
"totalDifficulty": "2242614315030",
|
|
||||||
"alloc": {
|
|
||||||
"0x0000000000000000000000000000000000000004": {
|
|
||||||
"balance": "0x0",
|
|
||||||
"nonce": "0",
|
|
||||||
"code": "0x",
|
|
||||||
"storage": {}
|
|
||||||
},
|
|
||||||
"0x877bd459c9b7d8576b44e59e09d076c25946f443": {
|
|
||||||
"balance": "0x62436e941792f02a5fb1",
|
|
||||||
"nonce": "265356",
|
|
||||||
"code": "0x",
|
|
||||||
"storage": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"chainId": 63,
|
|
||||||
"daoForkSupport": true,
|
|
||||||
"eip150Block": 0,
|
|
||||||
"eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
|
|
||||||
"eip155Block": 0,
|
|
||||||
"eip158Block": 0,
|
|
||||||
"ethash": {},
|
|
||||||
"homesteadBlock": 0,
|
|
||||||
"byzantiumBlock": 0,
|
|
||||||
"constantinopleBlock": 301243,
|
|
||||||
"petersburgBlock": 999983,
|
|
||||||
"istanbulBlock": 999983
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"context": {
|
|
||||||
"number": "1555279",
|
|
||||||
"difficulty": "4669303",
|
|
||||||
"timestamp": "1590795340",
|
|
||||||
"gasLimit": "9444238",
|
|
||||||
"miner": "0x877bd459c9b7d8576b44e59e09d076c25946f443"
|
|
||||||
},
|
|
||||||
"input": "0xf86f83040c8c843b9aca0083019f7880809b60206000600060006013600462030d40f26002556000516000550081a2a086ad228c89ad9664287b12a5602a635a803506904f4ce39795990ac4f945cd57a025b30ea8042d773f6c5b13d7cc1b3979f9f10ee674410b6a2112ce840d0302dc",
|
|
||||||
"result": [
|
|
||||||
{
|
|
||||||
"type": "create",
|
|
||||||
"action": {
|
|
||||||
"from": "0x877bd459c9b7d8576b44e59e09d076c25946f443",
|
|
||||||
"value": "0x0",
|
|
||||||
"gas": "0x19f78",
|
|
||||||
"init": "0x60206000600060006013600462030d40f260025560005160005500"
|
|
||||||
},
|
|
||||||
"result": {
|
|
||||||
"gasUsed": "0xf3bc",
|
|
||||||
"code": "0x",
|
|
||||||
"address": "0x5f8a7e007172ba80afbff1b15f800eb0b260f224"
|
|
||||||
},
|
|
||||||
"traceAddress": [],
|
|
||||||
"subtraces": 0,
|
|
||||||
"transactionPosition": 74,
|
|
||||||
"transactionHash": "0x5ef60b27ac971c22a7d484e546e50093ca62300c8986d165154e47773764b6a4",
|
|
||||||
"blockNumber": 1555279,
|
|
||||||
"blockHash": "0xd6c98d1b87dfa92a210d99bad2873adaf0c9e51fe43addc63fd9cca03a5c6f46",
|
|
||||||
"time": "209.346µs"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,94 +0,0 @@
|
||||||
{
|
|
||||||
"genesis": {
|
|
||||||
"difficulty": "4671584",
|
|
||||||
"extraData": "0xd883010b05846765746888676f312e31342e33856c696e7578",
|
|
||||||
"gasLimit": "9425823",
|
|
||||||
"hash": "0x27dd7d052dbc8a29cc5b9487e1e41d842e7a643fcaea4964caa22b834964acaf",
|
|
||||||
"miner": "0x73f26d124436b0791169d63a3af29c2ae47765a3",
|
|
||||||
"mixHash": "0xb4a050624f5d147fdf02857cbfd55da3ddc1451743acc5c163861584589c3034",
|
|
||||||
"nonce": "0x3c255875b17e0573",
|
|
||||||
"number": "1555277",
|
|
||||||
"stateRoot": "0x6290d79215a2eebc25d5e456b35876c6d78ffc1ea47bdd70e375ebb3cf325620",
|
|
||||||
"timestamp": "1590795308",
|
|
||||||
"totalDifficulty": "2242609643446",
|
|
||||||
"alloc": {
|
|
||||||
"0x0000000000000000000000000000000000000001": {
|
|
||||||
"balance": "0x0",
|
|
||||||
"nonce": "0",
|
|
||||||
"code": "0x",
|
|
||||||
"storage": {}
|
|
||||||
},
|
|
||||||
"0x877bd459c9b7d8576b44e59e09d076c25946f443": {
|
|
||||||
"balance": "0x624329308610ab365fb1",
|
|
||||||
"nonce": "265194",
|
|
||||||
"code": "0x",
|
|
||||||
"storage": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"chainId": 63,
|
|
||||||
"daoForkSupport": true,
|
|
||||||
"eip150Block": 0,
|
|
||||||
"eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
|
|
||||||
"eip155Block": 0,
|
|
||||||
"eip158Block": 0,
|
|
||||||
"ethash": {},
|
|
||||||
"homesteadBlock": 0,
|
|
||||||
"byzantiumBlock": 0,
|
|
||||||
"constantinopleBlock": 301243,
|
|
||||||
"petersburgBlock": 999983,
|
|
||||||
"istanbulBlock": 999983
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"context": {
|
|
||||||
"number": "1555278",
|
|
||||||
"difficulty": "4671584",
|
|
||||||
"timestamp": "1590795319",
|
|
||||||
"gasLimit": "9435026",
|
|
||||||
"miner": "0x877bd459c9b7d8576b44e59e09d076c25946f443"
|
|
||||||
},
|
|
||||||
"input": "0xf8ee83040bea843b9aca008301a7588080b8997f18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c600052601c6020527f73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f6040527feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549606052602060806080600060006001610bb7f260025560a060020a6080510660005560005432146001550081a1a05b9a162d84bfe84faa7c176e21c26c0083645d4dd0d566547b7be2c2da0b4259a05b37ff12a4c27634cb0da6008d9b69726d415ff4694f9bc38c7806eb1fb60ae9",
|
|
||||||
"result": [
|
|
||||||
{
|
|
||||||
"type": "create",
|
|
||||||
"action": {
|
|
||||||
"from": "0x877bd459c9b7d8576b44e59e09d076c25946f443",
|
|
||||||
"value": "0x0",
|
|
||||||
"gas": "0x1a758",
|
|
||||||
"init": "0x7f18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c600052601c6020527f73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f6040527feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549606052602060806080600060006001610bb7f260025560a060020a60805106600055600054321460015500"
|
|
||||||
},
|
|
||||||
"result": {
|
|
||||||
"gasUsed": "0xf3e9",
|
|
||||||
"code": "0x",
|
|
||||||
"address": "0x568c19ecb14b87e4aec29b4d2d700a3ad3fd0613"
|
|
||||||
},
|
|
||||||
"traceAddress": [],
|
|
||||||
"subtraces": 1,
|
|
||||||
"transactionPosition": 141,
|
|
||||||
"transactionHash": "0x1592cbda0d928b8d18eed98857942b91ade32d088e55b8bf63418917cb0231f1",
|
|
||||||
"blockNumber": 1555278,
|
|
||||||
"blockHash": "0x755bd54de4b2f5a7a589a10d69888b4ead48a6311d5d69f2f69ca85ec35fbe0b",
|
|
||||||
"time": "300.9µs"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "call",
|
|
||||||
"action": {
|
|
||||||
"from": "0x568c19ecb14b87e4aec29b4d2d700a3ad3fd0613",
|
|
||||||
"to": "0x0000000000000000000000000000000000000001",
|
|
||||||
"value": "0x0",
|
|
||||||
"gas": "0xbb7",
|
|
||||||
"input": "0x18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c000000000000000000000000000000000000000000000000000000000000001c73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549",
|
|
||||||
"callType": "callcode"
|
|
||||||
},
|
|
||||||
"error": "out of gas",
|
|
||||||
"traceAddress": [
|
|
||||||
0
|
|
||||||
],
|
|
||||||
"subtraces": 0,
|
|
||||||
"transactionPosition": 141,
|
|
||||||
"transactionHash": "0x1592cbda0d928b8d18eed98857942b91ade32d088e55b8bf63418917cb0231f1",
|
|
||||||
"blockNumber": 1555278,
|
|
||||||
"blockHash": "0x755bd54de4b2f5a7a589a10d69888b4ead48a6311d5d69f2f69ca85ec35fbe0b"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,90 +0,0 @@
|
||||||
{
|
|
||||||
"genesis": {
|
|
||||||
"difficulty": "4683014",
|
|
||||||
"extraData": "0x537465762d63676574682d76312e31312e34",
|
|
||||||
"gasLimit": "9435044",
|
|
||||||
"hash": "0x3452ca5005cb73cd60dfa488a7b124251168e564491f80eb66765e79d78cfd95",
|
|
||||||
"miner": "0x415aa6292d1db797a467b22139704956c030e62f",
|
|
||||||
"mixHash": "0x6037612618507ae70c74a72bc2580253662971db959cfbc06d3f8527d4d01575",
|
|
||||||
"nonce": "0x314fc90dee5e39a2",
|
|
||||||
"number": "1555274",
|
|
||||||
"stateRoot": "0x795751f3f96a5de1fd3944ddd78cbfe4ef10491e1086be47609869a30929d0e5",
|
|
||||||
"timestamp": "1590795228",
|
|
||||||
"totalDifficulty": "2242595605834",
|
|
||||||
"alloc": {
|
|
||||||
"0x0000000000000000000000000000000000000009": {
|
|
||||||
"balance": "0x0",
|
|
||||||
"nonce": "0",
|
|
||||||
"code": "0x",
|
|
||||||
"storage": {}
|
|
||||||
},
|
|
||||||
"0x877bd459c9b7d8576b44e59e09d076c25946f443": {
|
|
||||||
"balance": "0x6242e3ccf48e66425fb1",
|
|
||||||
"nonce": "264981",
|
|
||||||
"code": "0x",
|
|
||||||
"storage": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"chainId": 63,
|
|
||||||
"daoForkSupport": true,
|
|
||||||
"eip150Block": 0,
|
|
||||||
"eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
|
|
||||||
"eip155Block": 0,
|
|
||||||
"eip158Block": 0,
|
|
||||||
"ethash": {},
|
|
||||||
"homesteadBlock": 0,
|
|
||||||
"byzantiumBlock": 0,
|
|
||||||
"constantinopleBlock": 301243,
|
|
||||||
"petersburgBlock": 999983,
|
|
||||||
"istanbulBlock": 999983
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"context": {
|
|
||||||
"number": "1555275",
|
|
||||||
"difficulty": "4683014",
|
|
||||||
"timestamp": "1590795244",
|
|
||||||
"gasLimit": "9444256",
|
|
||||||
"miner": "0x877bd459c9b7d8576b44e59e09d076c25946f443"
|
|
||||||
},
|
|
||||||
"input": "0xf87a83040b15843b9aca008301a0348080a636600060003760406103e8366000600060095af26001556103e851600255610408516003550081a1a0dd883fbbb489b640dadc8c1bf151767155228d0a1321f687f070f35f14374b05a02dd0ccb16a8de39bc8ee61381bbbbb54f0ab18422afd7b03c6163da1f5023934",
|
|
||||||
"result": [
|
|
||||||
{
|
|
||||||
"type": "create",
|
|
||||||
"action": {
|
|
||||||
"from": "0x877bd459c9b7d8576b44e59e09d076c25946f443",
|
|
||||||
"value": "0x0",
|
|
||||||
"gas": "0x1a034",
|
|
||||||
"init": "0x36600060003760406103e8366000600060095af26001556103e8516002556104085160035500"
|
|
||||||
},
|
|
||||||
"error": "out of gas",
|
|
||||||
"traceAddress": [],
|
|
||||||
"subtraces": 1,
|
|
||||||
"transactionPosition": 117,
|
|
||||||
"transactionHash": "0x7fe4dec901e1a62c1a1d96b8267bb9ff9dc1f75def43aa45b998743455eff8f9",
|
|
||||||
"blockNumber": 1555275,
|
|
||||||
"blockHash": "0x80945caaff2fc67253cbb0217d2e5a307afde943929e97d8b36e58b88cbb02fd",
|
|
||||||
"time": "332.877µs"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "call",
|
|
||||||
"action": {
|
|
||||||
"from": "0x8832ef498070145c3a5b30f47fbca71fd7b1de9f",
|
|
||||||
"to": "0x0000000000000000000000000000000000000009",
|
|
||||||
"value": "0x0",
|
|
||||||
"gas": "0xc897",
|
|
||||||
"input": "0x",
|
|
||||||
"callType": "callcode"
|
|
||||||
},
|
|
||||||
"error": "invalid input length",
|
|
||||||
"traceAddress": [
|
|
||||||
0
|
|
||||||
],
|
|
||||||
"subtraces": 0,
|
|
||||||
"transactionPosition": 117,
|
|
||||||
"transactionHash": "0x7fe4dec901e1a62c1a1d96b8267bb9ff9dc1f75def43aa45b998743455eff8f9",
|
|
||||||
"blockNumber": 1555275,
|
|
||||||
"blockHash": "0x80945caaff2fc67253cbb0217d2e5a307afde943929e97d8b36e58b88cbb02fd"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,67 +0,0 @@
|
||||||
{
|
|
||||||
"context": {
|
|
||||||
"difficulty": "3755480783",
|
|
||||||
"gasLimit": "5401723",
|
|
||||||
"miner": "0xd049bfd667cb46aa3ef5df0da3e57db3be39e511",
|
|
||||||
"number": "2294702",
|
|
||||||
"timestamp": "1513676146"
|
|
||||||
},
|
|
||||||
"genesis": {
|
|
||||||
"alloc": {
|
|
||||||
"0x13e4acefe6a6700604929946e70e6443e4e73447": {
|
|
||||||
"balance": "0xcf3e0938579f000",
|
|
||||||
"code": "0x",
|
|
||||||
"nonce": "9",
|
|
||||||
"storage": {}
|
|
||||||
},
|
|
||||||
"0x7dc9c9730689ff0b0fd506c67db815f12d90a448": {
|
|
||||||
"balance": "0x0",
|
|
||||||
"code": "0x",
|
|
||||||
"nonce": "0",
|
|
||||||
"storage": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"byzantiumBlock": 1700000,
|
|
||||||
"chainId": 3,
|
|
||||||
"daoForkSupport": true,
|
|
||||||
"eip150Block": 0,
|
|
||||||
"eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
|
|
||||||
"eip155Block": 10,
|
|
||||||
"eip158Block": 10,
|
|
||||||
"ethash": {},
|
|
||||||
"homesteadBlock": 0
|
|
||||||
},
|
|
||||||
"difficulty": "3757315409",
|
|
||||||
"extraData": "0x566961425443",
|
|
||||||
"gasLimit": "5406414",
|
|
||||||
"hash": "0xae107f592eebdd9ff8d6ba00363676096e6afb0e1007a7d3d0af88173077378d",
|
|
||||||
"miner": "0xd049bfd667cb46aa3ef5df0da3e57db3be39e511",
|
|
||||||
"mixHash": "0xc927aa05a38bc3de864e95c33b3ae559d3f39c4ccd51cef6f113f9c50ba0caf1",
|
|
||||||
"nonce": "0x93363bbd2c95f410",
|
|
||||||
"number": "2294701",
|
|
||||||
"stateRoot": "0x6b6737d5bde8058990483e915866bd1578014baeff57bd5e4ed228a2bfad635c",
|
|
||||||
"timestamp": "1513676127",
|
|
||||||
"totalDifficulty": "7160808139332585"
|
|
||||||
},
|
|
||||||
"input": "0xf907ef098504e3b29200830897be8080b9079c606060405260405160208061077c83398101604052808051906020019091905050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415151561007d57600080fd5b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600460006101000a81548160ff02191690831515021790555050610653806101296000396000f300606060405260043610610083576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806305e4382a146100855780631c02708d146100ae5780632e1a7d4d146100c35780635114cb52146100e6578063a37dda2c146100fe578063ae200e7914610153578063b5769f70146101a8575b005b341561009057600080fd5b6100986101d1565b6040518082815260200191505060405180910390f35b34156100b957600080fd5b6100c16101d7565b005b34156100ce57600080fd5b6100e460048080359060200190919050506102eb565b005b6100fc6004808035906020019091905050610513565b005b341561010957600080fd5b6101116105d6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015e57600080fd5b6101666105fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101b357600080fd5b6101bb610621565b6040518082815260200191505060405180910390f35b60025481565b60011515600460009054906101000a900460ff1615151415156101f957600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102a15750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156102ac57600080fd5b6000600460006101000a81548160ff0219169083151502179055506003543073ffffffffffffffffffffffffffffffffffffffff163103600281905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806103935750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561039e57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561048357600060025411801561040757506002548111155b151561041257600080fd5b80600254036002819055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561047e57600080fd5b610510565b600060035411801561049757506003548111155b15156104a257600080fd5b8060035403600381905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561050f57600080fd5b5b50565b60011515600460009054906101000a900460ff16151514151561053557600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614801561059657506003548160035401115b80156105bd575080600354013073ffffffffffffffffffffffffffffffffffffffff163110155b15156105c857600080fd5b806003540160038190555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600354815600a165627a7a72305820c3b849e8440987ce43eae3097b77672a69234d516351368b03fe5b7de03807910029000000000000000000000000c65e620a3a55451316168d57e268f5702ef56a1129a01060f46676a5dff6f407f0f51eb6f37f5c8c54e238c70221e18e65fc29d3ea65a0557b01c50ff4ffaac8ed6e5d31237a4ecbac843ab1bfe8bb0165a0060df7c54f",
|
|
||||||
"result": [
|
|
||||||
{
|
|
||||||
"action": {
|
|
||||||
"from": "0x13e4acefe6a6700604929946e70e6443e4e73447",
|
|
||||||
"gas": "0x897be",
|
|
||||||
"init": "0x606060405260405160208061077c83398101604052808051906020019091905050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415151561007d57600080fd5b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600460006101000a81548160ff02191690831515021790555050610653806101296000396000f300606060405260043610610083576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806305e4382a146100855780631c02708d146100ae5780632e1a7d4d146100c35780635114cb52146100e6578063a37dda2c146100fe578063ae200e7914610153578063b5769f70146101a8575b005b341561009057600080fd5b6100986101d1565b6040518082815260200191505060405180910390f35b34156100b957600080fd5b6100c16101d7565b005b34156100ce57600080fd5b6100e460048080359060200190919050506102eb565b005b6100fc6004808035906020019091905050610513565b005b341561010957600080fd5b6101116105d6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015e57600080fd5b6101666105fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101b357600080fd5b6101bb610621565b6040518082815260200191505060405180910390f35b60025481565b60011515600460009054906101000a900460ff1615151415156101f957600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102a15750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156102ac57600080fd5b6000600460006101000a81548160ff0219169083151502179055506003543073ffffffffffffffffffffffffffffffffffffffff163103600281905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806103935750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561039e57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561048357600060025411801561040757506002548111155b151561041257600080fd5b80600254036002819055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561047e57600080fd5b610510565b600060035411801561049757506003548111155b15156104a257600080fd5b8060035403600381905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561050f57600080fd5b5b50565b60011515600460009054906101000a900460ff16151514151561053557600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614801561059657506003548160035401115b80156105bd575080600354013073ffffffffffffffffffffffffffffffffffffffff163110155b15156105c857600080fd5b806003540160038190555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600354815600a165627a7a72305820c3b849e8440987ce43eae3097b77672a69234d516351368b03fe5b7de03807910029000000000000000000000000c65e620a3a55451316168d57e268f5702ef56a11",
|
|
||||||
"value": "0x0"
|
|
||||||
},
|
|
||||||
"blockNumber": 2294702,
|
|
||||||
"result": {
|
|
||||||
"address": "0x7dc9c9730689ff0b0fd506c67db815f12d90a448",
|
|
||||||
"code": "0x606060405260043610610083576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806305e4382a146100855780631c02708d146100ae5780632e1a7d4d146100c35780635114cb52146100e6578063a37dda2c146100fe578063ae200e7914610153578063b5769f70146101a8575b005b341561009057600080fd5b6100986101d1565b6040518082815260200191505060405180910390f35b34156100b957600080fd5b6100c16101d7565b005b34156100ce57600080fd5b6100e460048080359060200190919050506102eb565b005b6100fc6004808035906020019091905050610513565b005b341561010957600080fd5b6101116105d6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015e57600080fd5b6101666105fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101b357600080fd5b6101bb610621565b6040518082815260200191505060405180910390f35b60025481565b60011515600460009054906101000a900460ff1615151415156101f957600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102a15750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156102ac57600080fd5b6000600460006101000a81548160ff0219169083151502179055506003543073ffffffffffffffffffffffffffffffffffffffff163103600281905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806103935750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561039e57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561048357600060025411801561040757506002548111155b151561041257600080fd5b80600254036002819055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561047e57600080fd5b610510565b600060035411801561049757506003548111155b15156104a257600080fd5b8060035403600381905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561050f57600080fd5b5b50565b60011515600460009054906101000a900460ff16151514151561053557600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614801561059657506003548160035401115b80156105bd575080600354013073ffffffffffffffffffffffffffffffffffffffff163110155b15156105c857600080fd5b806003540160038190555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600354815600a165627a7a72305820c3b849e8440987ce43eae3097b77672a69234d516351368b03fe5b7de03807910029",
|
|
||||||
"gasUsed": "0x897be"
|
|
||||||
},
|
|
||||||
"subtraces": 0,
|
|
||||||
"traceAddress": [],
|
|
||||||
"type": "create"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -1,103 +0,0 @@
|
||||||
{
|
|
||||||
"genesis": {
|
|
||||||
"number": "566098",
|
|
||||||
"hash": "0xba134562590a59291892395a29c5088899c2c64d720135dad88f7f076cf55f5f",
|
|
||||||
"nonce": "0x4b281be9594e3eb3",
|
|
||||||
"mixHash": "0xdb4ec386166d9c0dc9ba147755ecbb87af9f0a22563cbda02c799efa4e29db6e",
|
|
||||||
"stateRoot": "0xfc01993ad96a8fb8790a093cea4f505f8db1b0e1143c5f57bb1d173db0baa9e3",
|
|
||||||
"miner": "0x877bd459c9b7d8576b44e59e09d076c25946f443",
|
|
||||||
"difficulty": "1926740",
|
|
||||||
"totalDifficulty": "482216286599",
|
|
||||||
"extraData": "0xd883010906846765746888676f312e31332e35856c696e7578",
|
|
||||||
"gasLimit": "19388354",
|
|
||||||
"timestamp": "1577558314",
|
|
||||||
"alloc": {
|
|
||||||
"0x6ab9dd83108698b9ca8d03af3c7eb91c0e54c3fc": {
|
|
||||||
"balance": "0x0",
|
|
||||||
"nonce": "0",
|
|
||||||
"code": "0x",
|
|
||||||
"storage": {}
|
|
||||||
},
|
|
||||||
"0x877bd459c9b7d8576b44e59e09d076c25946f443": {
|
|
||||||
"balance": "0xcbd5b9b25d1c38c2aad",
|
|
||||||
"nonce": "134969",
|
|
||||||
"code": "0x",
|
|
||||||
"storage": {}
|
|
||||||
},
|
|
||||||
"0x91765918420bcb5ad22ee0997abed04056705798": {
|
|
||||||
"balance": "0x0",
|
|
||||||
"nonce": "1",
|
|
||||||
"code": "0x366000803760206000366000736ab9dd83108698b9ca8d03af3c7eb91c0e54c3fc60325a03f41560015760206000f3",
|
|
||||||
"storage": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"chainId": 63,
|
|
||||||
"daoForkSupport": true,
|
|
||||||
"eip150Block": 0,
|
|
||||||
"eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
|
|
||||||
"eip155Block": 0,
|
|
||||||
"eip158Block": 0,
|
|
||||||
"ethash": {},
|
|
||||||
"homesteadBlock": 0,
|
|
||||||
"byzantiumBlock": 0,
|
|
||||||
"constantinopleBlock": 301243,
|
|
||||||
"petersburgBlock": 999983,
|
|
||||||
"istanbulBlock": 999983
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"context": {
|
|
||||||
"number": "566099",
|
|
||||||
"difficulty": "1927680",
|
|
||||||
"timestamp": "1577558317",
|
|
||||||
"gasLimit": "19369422",
|
|
||||||
"miner": "0x774c398d763161f55b66a646f17edda4addad2ca"
|
|
||||||
},
|
|
||||||
"input": "0xf87983020f3985746a52880083015f909491765918420bcb5ad22ee0997abed04056705798888ac7230489e80000884e45375a4741394181a1a04b7260723fd02830754916b3bdf1537b6a851a7ae27c7e9296cfe1fc8275ec08a049d32158988eb717d61b4503b27c7583037c067daba1eb56f4bdfafc1b0045f6",
|
|
||||||
"result": [
|
|
||||||
{
|
|
||||||
"action": {
|
|
||||||
"callType": "call",
|
|
||||||
"from": "0x877bd459c9b7d8576b44e59e09d076c25946f443",
|
|
||||||
"gas": "0x15f90",
|
|
||||||
"input": "0x4e45375a47413941",
|
|
||||||
"to": "0x91765918420bcb5ad22ee0997abed04056705798",
|
|
||||||
"value": "0x8ac7230489e80000"
|
|
||||||
},
|
|
||||||
"blockHash": "0xb05cc5c8f11df2b5d53ced342ee79e2805785f04c2f40add4539f27bd349f74e",
|
|
||||||
"blockNumber": 566099,
|
|
||||||
"result": {
|
|
||||||
"gasUsed": "0x5721",
|
|
||||||
"output": "0x4e45375a47413941000000000000000000000000000000000000000000000000"
|
|
||||||
},
|
|
||||||
"subtraces": 1,
|
|
||||||
"traceAddress": [],
|
|
||||||
"transactionHash": "0x6e26dffe2f66186f03a2c36a16a4cd9724d07622c83746f1e35f988515713d4b",
|
|
||||||
"transactionPosition": 10,
|
|
||||||
"type": "call"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"action": {
|
|
||||||
"callType": "delegatecall",
|
|
||||||
"from": "0x91765918420bcb5ad22ee0997abed04056705798",
|
|
||||||
"gas": "0x10463",
|
|
||||||
"input": "0x4e45375a47413941",
|
|
||||||
"to": "0x6ab9dd83108698b9ca8d03af3c7eb91c0e54c3fc",
|
|
||||||
"value": "0x8ac7230489e80000"
|
|
||||||
},
|
|
||||||
"blockHash": "0xb05cc5c8f11df2b5d53ced342ee79e2805785f04c2f40add4539f27bd349f74e",
|
|
||||||
"blockNumber": 566099,
|
|
||||||
"result": {
|
|
||||||
"gasUsed": "0x0",
|
|
||||||
"output": "0x"
|
|
||||||
},
|
|
||||||
"subtraces": 0,
|
|
||||||
"traceAddress": [
|
|
||||||
0
|
|
||||||
],
|
|
||||||
"transactionHash": "0x6e26dffe2f66186f03a2c36a16a4cd9724d07622c83746f1e35f988515713d4b",
|
|
||||||
"transactionPosition": 10,
|
|
||||||
"type": "call"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,95 +0,0 @@
|
||||||
{
|
|
||||||
"genesis": {
|
|
||||||
"difficulty": "4683014",
|
|
||||||
"extraData": "0x537465762d63676574682d76312e31312e34",
|
|
||||||
"gasLimit": "9435044",
|
|
||||||
"hash": "0x3452ca5005cb73cd60dfa488a7b124251168e564491f80eb66765e79d78cfd95",
|
|
||||||
"miner": "0x415aa6292d1db797a467b22139704956c030e62f",
|
|
||||||
"mixHash": "0x6037612618507ae70c74a72bc2580253662971db959cfbc06d3f8527d4d01575",
|
|
||||||
"nonce": "0x314fc90dee5e39a2",
|
|
||||||
"number": "1555274",
|
|
||||||
"stateRoot": "0x795751f3f96a5de1fd3944ddd78cbfe4ef10491e1086be47609869a30929d0e5",
|
|
||||||
"timestamp": "1590795228",
|
|
||||||
"totalDifficulty": "2242595605834",
|
|
||||||
"alloc": {
|
|
||||||
"0x0000000000000000000000000000000000000001": {
|
|
||||||
"balance": "0x0",
|
|
||||||
"nonce": "0",
|
|
||||||
"code": "0x",
|
|
||||||
"storage": {}
|
|
||||||
},
|
|
||||||
"0x877bd459c9b7d8576b44e59e09d076c25946f443": {
|
|
||||||
"balance": "0x6242e3ccf48e66425fb1",
|
|
||||||
"nonce": "264882",
|
|
||||||
"code": "0x",
|
|
||||||
"storage": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"chainId": 63,
|
|
||||||
"daoForkSupport": true,
|
|
||||||
"eip150Block": 0,
|
|
||||||
"eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
|
|
||||||
"eip155Block": 0,
|
|
||||||
"eip158Block": 0,
|
|
||||||
"ethash": {},
|
|
||||||
"homesteadBlock": 0,
|
|
||||||
"byzantiumBlock": 0,
|
|
||||||
"constantinopleBlock": 301243,
|
|
||||||
"petersburgBlock": 999983,
|
|
||||||
"istanbulBlock": 999983
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"context": {
|
|
||||||
"number": "1555275",
|
|
||||||
"difficulty": "4683014",
|
|
||||||
"timestamp": "1590795244",
|
|
||||||
"gasLimit": "9444256",
|
|
||||||
"miner": "0x877bd459c9b7d8576b44e59e09d076c25946f443"
|
|
||||||
},
|
|
||||||
"input": "0xf9011583040ab2843b9aca008301a9c88080b8c0601b565b6000555b005b630badf00d6003565b63c001f00d6003565b7319e7e376e7c213b7e7e7e46cc70a5dd086daff2a7f22ae6da6b482f9b1b19b0b897c3fd43884180a1c5ee361e1107a1bc635649dda600052601b603f537f16433dce375ce6dc8151d3f0a22728bc4a1d9fd6ed39dfd18b4609331937367f6040527f306964c0cf5d74f04129fdc60b54d35b596dde1bf89ad92cb4123318f4c0e40060605260206080607f60006000600161fffff2156007576080511460125760095681a1a07682fc43dbe1fb13c6474f5e70e121c826dd996168d8bb1d8ca7a63470127b46a00a25b308ba417b7770899e8f98a3f0c14aa9bf7db0edacfe4e78d00dbbd3c31e",
|
|
||||||
"result": [
|
|
||||||
{
|
|
||||||
"type": "create",
|
|
||||||
"action": {
|
|
||||||
"from": "0x877bd459c9b7d8576b44e59e09d076c25946f443",
|
|
||||||
"value": "0x0",
|
|
||||||
"gas": "0x1a9c8",
|
|
||||||
"init": "0x601b565b6000555b005b630badf00d6003565b63c001f00d6003565b7319e7e376e7c213b7e7e7e46cc70a5dd086daff2a7f22ae6da6b482f9b1b19b0b897c3fd43884180a1c5ee361e1107a1bc635649dda600052601b603f537f16433dce375ce6dc8151d3f0a22728bc4a1d9fd6ed39dfd18b4609331937367f6040527f306964c0cf5d74f04129fdc60b54d35b596dde1bf89ad92cb4123318f4c0e40060605260206080607f60006000600161fffff21560075760805114601257600956"
|
|
||||||
},
|
|
||||||
"result": {
|
|
||||||
"gasUsed": "0x137e5",
|
|
||||||
"code": "0x",
|
|
||||||
"address": "0x1a05d76017ca02010533a470e05e8925a0380d8f"
|
|
||||||
},
|
|
||||||
"traceAddress": [],
|
|
||||||
"subtraces": 1,
|
|
||||||
"transactionPosition": 18,
|
|
||||||
"transactionHash": "0xc1c42a325856d513523aec464811923b2e2926f54015c7ba37877064cf889803",
|
|
||||||
"blockNumber": 1555275,
|
|
||||||
"blockHash": "0x80945caaff2fc67253cbb0217d2e5a307afde943929e97d8b36e58b88cbb02fd",
|
|
||||||
"time": "453.925µs"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "call",
|
|
||||||
"action": {
|
|
||||||
"from": "0x1a05d76017ca02010533a470e05e8925a0380d8f",
|
|
||||||
"to": "0x0000000000000000000000000000000000000001",
|
|
||||||
"value": "0x0",
|
|
||||||
"gas": "0xc8c6",
|
|
||||||
"input": "0x22ae6da6b482f9b1b19b0b897c3fd43884180a1c5ee361e1107a1bc635649dda000000000000000000000000000000000000000000000000000000000000001b16433dce375ce6dc8151d3f0a22728bc4a1d9fd6ed39dfd18b4609331937367f306964c0cf5d74f04129fdc60b54d35b596dde1bf89ad92cb4123318f4c0e4",
|
|
||||||
"callType": "callcode"
|
|
||||||
},
|
|
||||||
"result": {
|
|
||||||
"gasUsed": "0xbb8",
|
|
||||||
"output": "0x00000000000000000000000019e7e376e7c213b7e7e7e46cc70a5dd086daff2a"
|
|
||||||
},
|
|
||||||
"traceAddress": [0],
|
|
||||||
"subtraces": 0,
|
|
||||||
"transactionPosition": 18,
|
|
||||||
"transactionHash": "0xc1c42a325856d513523aec464811923b2e2926f54015c7ba37877064cf889803",
|
|
||||||
"blockNumber": 1555275,
|
|
||||||
"blockHash": "0x80945caaff2fc67253cbb0217d2e5a307afde943929e97d8b36e58b88cbb02fd"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -1,72 +0,0 @@
|
||||||
{
|
|
||||||
"genesis": {
|
|
||||||
"difficulty": "117067574",
|
|
||||||
"extraData": "0xd783010502846765746887676f312e372e33856c696e7578",
|
|
||||||
"gasLimit": "4712380",
|
|
||||||
"hash": "0xe05db05eeb3f288041ecb10a787df121c0ed69499355716e17c307de313a4486",
|
|
||||||
"miner": "0x0c062b329265c965deef1eede55183b3acb8f611",
|
|
||||||
"mixHash": "0xb669ae39118a53d2c65fd3b1e1d3850dd3f8c6842030698ed846a2762d68b61d",
|
|
||||||
"nonce": "0x2b469722b8e28c45",
|
|
||||||
"number": "24973",
|
|
||||||
"stateRoot": "0x532a5c3f75453a696428db078e32ae283c85cb97e4d8560dbdf022adac6df369",
|
|
||||||
"timestamp": "1479891145",
|
|
||||||
"totalDifficulty": "1892250259406",
|
|
||||||
"alloc": {
|
|
||||||
"0x6c06b16512b332e6cd8293a2974872674716ce18": {
|
|
||||||
"balance": "0x0",
|
|
||||||
"nonce": "1",
|
|
||||||
"code": "0x60606040526000357c0100000000000000000000000000000000000000000000000000000000900480632e1a7d4d146036575b6000565b34600057604e60048080359060200190919050506050565b005b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051809050600060405180830381858888f19350505050505b5056",
|
|
||||||
"storage": {}
|
|
||||||
},
|
|
||||||
"0x66fdfd05e46126a07465ad24e40cc0597bc1ef31": {
|
|
||||||
"balance": "0x229ebbb36c3e0f20",
|
|
||||||
"nonce": "3",
|
|
||||||
"code": "0x",
|
|
||||||
"storage": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"chainId": 3,
|
|
||||||
"homesteadBlock": 0,
|
|
||||||
"daoForkSupport": true,
|
|
||||||
"eip150Block": 0,
|
|
||||||
"eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
|
|
||||||
"eip155Block": 10,
|
|
||||||
"eip158Block": 10,
|
|
||||||
"byzantiumBlock": 1700000,
|
|
||||||
"constantinopleBlock": 4230000,
|
|
||||||
"petersburgBlock": 4939394,
|
|
||||||
"istanbulBlock": 6485846,
|
|
||||||
"muirGlacierBlock": 7117117,
|
|
||||||
"ethash": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"context": {
|
|
||||||
"number": "24974",
|
|
||||||
"difficulty": "117067574",
|
|
||||||
"timestamp": "1479891162",
|
|
||||||
"gasLimit": "4712388",
|
|
||||||
"miner": "0xc822ef32e6d26e170b70cf761e204c1806265914"
|
|
||||||
},
|
|
||||||
"input": "0xf889038504a81557008301f97e946c06b16512b332e6cd8293a2974872674716ce1880a42e1a7d4d00000000000000000000000000000000000000000000000014d1120d7b1600002aa0e2a6558040c5d72bc59f2fb62a38993a314c849cd22fb393018d2c5af3112095a01bdb6d7ba32263ccc2ecc880d38c49d9f0c5a72d8b7908e3122b31356d349745",
|
|
||||||
"result": [
|
|
||||||
{
|
|
||||||
"action": {
|
|
||||||
"callType": "call",
|
|
||||||
"from": "0x66fdfd05e46126a07465ad24e40cc0597bc1ef31",
|
|
||||||
"gas": "0x1f97e",
|
|
||||||
"input": "0x2e1a7d4d00000000000000000000000000000000000000000000000014d1120d7b160000",
|
|
||||||
"to": "0x6c06b16512b332e6cd8293a2974872674716ce18",
|
|
||||||
"value": "0x0"
|
|
||||||
},
|
|
||||||
"blockNumber": 24974,
|
|
||||||
"result": {
|
|
||||||
"gasUsed": "0x72de",
|
|
||||||
"output": "0x"
|
|
||||||
},
|
|
||||||
"subtraces": 0,
|
|
||||||
"traceAddress": [],
|
|
||||||
"type": "call"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -1,94 +0,0 @@
|
||||||
{
|
|
||||||
"genesis": {
|
|
||||||
"difficulty": "1808543",
|
|
||||||
"extraData": "0xd883010906846765746888676f312e31332e35856c696e7578",
|
|
||||||
"gasLimit": "4875092",
|
|
||||||
"hash": "0x3851fdc18bd5f2314cf0c90439356f9a1fe157d7fb06c20e20b77954da903671",
|
|
||||||
"miner": "0x877bd459c9b7d8576b44e59e09d076c25946f443",
|
|
||||||
"mixHash": "0x3d4e702d6058acf94c9547560f05536d45d515bd4f9014564ec41b5b4ff9578b",
|
|
||||||
"nonce": "0x1695153e7b16c1e7",
|
|
||||||
"number": "555461",
|
|
||||||
"stateRoot": "0xba8272acd0dfeb5f04376328e8bfc5b276b177697000c204a060f6f7b629ae32",
|
|
||||||
"timestamp": "1577423350",
|
|
||||||
"totalDifficulty": "462222992438",
|
|
||||||
"alloc": {
|
|
||||||
"0xcf5b3467dfa45cdc8e5358a7a1ba4deb02e5faed": {
|
|
||||||
"balance": "0x0",
|
|
||||||
"nonce": "0",
|
|
||||||
"code": "0x",
|
|
||||||
"storage": {}
|
|
||||||
},
|
|
||||||
"0x877bd459c9b7d8576b44e59e09d076c25946f443": {
|
|
||||||
"balance": "0x16c102a3b09c02abdace",
|
|
||||||
"nonce": "19049",
|
|
||||||
"code": "0x",
|
|
||||||
"storage": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"chainId": 63,
|
|
||||||
"daoForkSupport": true,
|
|
||||||
"eip150Block": 0,
|
|
||||||
"eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
|
|
||||||
"eip155Block": 0,
|
|
||||||
"eip158Block": 0,
|
|
||||||
"ethash": {},
|
|
||||||
"homesteadBlock": 0,
|
|
||||||
"byzantiumBlock": 0,
|
|
||||||
"constantinopleBlock": 301243,
|
|
||||||
"petersburgBlock": 999983,
|
|
||||||
"istanbulBlock": 999983
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"context": {
|
|
||||||
"number": "555462",
|
|
||||||
"difficulty": "1808543",
|
|
||||||
"timestamp": "1577423360",
|
|
||||||
"gasLimit": "4873701",
|
|
||||||
"miner": "0x877bd459c9b7d8576b44e59e09d076c25946f443"
|
|
||||||
},
|
|
||||||
"input": "0xf90451824a6985746a52880083053e908080b903fb60606040525b60405161015b806102a0833901809050604051809103906000f0600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908302179055505b610247806100596000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900480632ef9db1314610044578063e37678761461007157610042565b005b61005b6004803590602001803590602001506100ad565b6040518082815260200191505060405180910390f35b61008860048035906020018035906020015061008a565b005b8060006000506000848152602001908152602001600020600050819055505b5050565b6000600060008484604051808381526020018281526020019250505060405180910390209150610120600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167f6164640000000000000000000000000000000000000000000000000000000000846101e3565b9050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681868660405180807f616464000000000000000000000000000000000000000000000000000000000081526020015060200184815260200183815260200182815260200193505050506000604051808303816000866161da5a03f191505050600060005060008281526020019081526020016000206000505492506101db565b505092915050565b60004340848484604051808581526020018473ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140183815260200182815260200194505050505060405180910390209050610240565b9392505050566060604052610148806100136000396000f30060606040526000357c010000000000000000000000000000000000000000000000000000000090048063471407e614610044578063e37678761461007757610042565b005b6100616004803590602001803590602001803590602001506100b3565b6040518082815260200191505060405180910390f35b61008e600480359060200180359060200150610090565b005b8060006000506000848152602001908152602001600020600050819055505b5050565b6000818301905080506100c684826100d5565b8090506100ce565b9392505050565b3373ffffffffffffffffffffffffffffffffffffffff16828260405180807f7265676973746572496e74000000000000000000000000000000000000000000815260200150602001838152602001828152602001925050506000604051808303816000866161da5a03f1915050505b50505681a1a0b9a85df655d3b6aa081e52d8c3db52c50c2bf97d9d993a980113b2262649c125a00d51e63880ca8ef4705914a71e7ff906834a9cdcff0cbd063ff4e43a5905890d",
|
|
||||||
"result": [
|
|
||||||
{
|
|
||||||
"type": "create",
|
|
||||||
"action": {
|
|
||||||
"from": "0x877bd459c9b7d8576b44e59e09d076c25946f443",
|
|
||||||
"value": "0x0",
|
|
||||||
"gas": "0x53e90",
|
|
||||||
"init": "0x60606040525b60405161015b806102a0833901809050604051809103906000f0600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908302179055505b610247806100596000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900480632ef9db1314610044578063e37678761461007157610042565b005b61005b6004803590602001803590602001506100ad565b6040518082815260200191505060405180910390f35b61008860048035906020018035906020015061008a565b005b8060006000506000848152602001908152602001600020600050819055505b5050565b6000600060008484604051808381526020018281526020019250505060405180910390209150610120600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167f6164640000000000000000000000000000000000000000000000000000000000846101e3565b9050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681868660405180807f616464000000000000000000000000000000000000000000000000000000000081526020015060200184815260200183815260200182815260200193505050506000604051808303816000866161da5a03f191505050600060005060008281526020019081526020016000206000505492506101db565b505092915050565b60004340848484604051808581526020018473ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140183815260200182815260200194505050505060405180910390209050610240565b9392505050566060604052610148806100136000396000f30060606040526000357c010000000000000000000000000000000000000000000000000000000090048063471407e614610044578063e37678761461007757610042565b005b6100616004803590602001803590602001803590602001506100b3565b6040518082815260200191505060405180910390f35b61008e600480359060200180359060200150610090565b005b8060006000506000848152602001908152602001600020600050819055505b5050565b6000818301905080506100c684826100d5565b8090506100ce565b9392505050565b3373ffffffffffffffffffffffffffffffffffffffff16828260405180807f7265676973746572496e74000000000000000000000000000000000000000000815260200150602001838152602001828152602001925050506000604051808303816000866161da5a03f1915050505b505056"
|
|
||||||
},
|
|
||||||
"result": {
|
|
||||||
"gasUsed": "0x53e90",
|
|
||||||
"code": "0x60606040526000357c0100000000000000000000000000000000000000000000000000000000900480632ef9db1314610044578063e37678761461007157610042565b005b61005b6004803590602001803590602001506100ad565b6040518082815260200191505060405180910390f35b61008860048035906020018035906020015061008a565b005b8060006000506000848152602001908152602001600020600050819055505b5050565b6000600060008484604051808381526020018281526020019250505060405180910390209150610120600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167f6164640000000000000000000000000000000000000000000000000000000000846101e3565b9050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681868660405180807f616464000000000000000000000000000000000000000000000000000000000081526020015060200184815260200183815260200182815260200193505050506000604051808303816000866161da5a03f191505050600060005060008281526020019081526020016000206000505492506101db565b505092915050565b60004340848484604051808581526020018473ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140183815260200182815260200194505050505060405180910390209050610240565b939250505056",
|
|
||||||
"address": "0x9db7a1baf185a865ffee3824946ccd8958191e5e"
|
|
||||||
},
|
|
||||||
"traceAddress": [],
|
|
||||||
"subtraces": 1,
|
|
||||||
"transactionPosition": 23,
|
|
||||||
"transactionHash": "0xe267552ce8437a5bc7081385c99f912de5723ad34b958db215dbc41abd5f6c03",
|
|
||||||
"blockNumber": 555462,
|
|
||||||
"blockHash": "0x38bba9e3965b57205097ea5ec53fc403cf3941bec2e4c933faae244de5ca4ba1",
|
|
||||||
"time": "1.147715ms"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "create",
|
|
||||||
"action": {
|
|
||||||
"from": "0x9db7a1baf185a865ffee3824946ccd8958191e5e",
|
|
||||||
"value": "0x0",
|
|
||||||
"gas": "0x30b34",
|
|
||||||
"init": "0x6060604052610148806100136000396000f30060606040526000357c010000000000000000000000000000000000000000000000000000000090048063471407e614610044578063e37678761461007757610042565b005b6100616004803590602001803590602001803590602001506100b3565b6040518082815260200191505060405180910390f35b61008e600480359060200180359060200150610090565b005b8060006000506000848152602001908152602001600020600050819055505b5050565b6000818301905080506100c684826100d5565b8090506100ce565b9392505050565b3373ffffffffffffffffffffffffffffffffffffffff16828260405180807f7265676973746572496e74000000000000000000000000000000000000000000815260200150602001838152602001828152602001925050506000604051808303816000866161da5a03f1915050505b505056"
|
|
||||||
},
|
|
||||||
"result": {
|
|
||||||
"gasUsed": "0x1009d",
|
|
||||||
"code": "0x60606040526000357c010000000000000000000000000000000000000000000000000000000090048063471407e614610044578063e37678761461007757610042565b005b6100616004803590602001803590602001803590602001506100b3565b6040518082815260200191505060405180910390f35b61008e600480359060200180359060200150610090565b005b8060006000506000848152602001908152602001600020600050819055505b5050565b6000818301905080506100c684826100d5565b8090506100ce565b9392505050565b3373ffffffffffffffffffffffffffffffffffffffff16828260405180807f7265676973746572496e74000000000000000000000000000000000000000000815260200150602001838152602001828152602001925050506000604051808303816000866161da5a03f1915050505b505056",
|
|
||||||
"address": "0xcf5b3467dfa45cdc8e5358a7a1ba4deb02e5faed"
|
|
||||||
},
|
|
||||||
"traceAddress": [0],
|
|
||||||
"subtraces": 0,
|
|
||||||
"transactionPosition": 23,
|
|
||||||
"transactionHash": "0xe267552ce8437a5bc7081385c99f912de5723ad34b958db215dbc41abd5f6c03",
|
|
||||||
"blockNumber": 555462,
|
|
||||||
"blockHash": "0x38bba9e3965b57205097ea5ec53fc403cf3941bec2e4c933faae244de5ca4ba1"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,94 +0,0 @@
|
||||||
{
|
|
||||||
"genesis": {
|
|
||||||
"difficulty": "4635413",
|
|
||||||
"extraData": "0xd683010b05846765746886676f312e3133856c696e7578",
|
|
||||||
"gasLimit": "9289294",
|
|
||||||
"hash": "0x359775cf1a2ae2400e26ec68bf33bcfe38b7979c76b7e616f42c4ca7e7605e39",
|
|
||||||
"miner": "0x877bd459c9b7d8576b44e59e09d076c25946f443",
|
|
||||||
"mixHash": "0x4b2a0ef121a9c7d732fa0fbd4166a0e1041d2da2b8cb677c61edabf8b7183b64",
|
|
||||||
"nonce": "0x2a8a64ad9757be55",
|
|
||||||
"number": "1555160",
|
|
||||||
"stateRoot": "0x95067c12148e2362fcd4a89df286ff0b1739ef097a40ca42ae7f698af9a9d913",
|
|
||||||
"timestamp": "1590793999",
|
|
||||||
"totalDifficulty": "2242063623471",
|
|
||||||
"alloc": {
|
|
||||||
"0x8785e369f0ef0a4e5c5a5f929680427dc75273a5": {
|
|
||||||
"balance": "0x0",
|
|
||||||
"nonce": "0",
|
|
||||||
"code": "0x",
|
|
||||||
"storage": {}
|
|
||||||
},
|
|
||||||
"0x877bd459c9b7d8576b44e59e09d076c25946f443": {
|
|
||||||
"balance": "0x623145b285b3f551fa3f",
|
|
||||||
"nonce": "260617",
|
|
||||||
"code": "0x",
|
|
||||||
"storage": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"chainId": 63,
|
|
||||||
"daoForkSupport": true,
|
|
||||||
"eip150Block": 0,
|
|
||||||
"eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
|
|
||||||
"eip155Block": 0,
|
|
||||||
"eip158Block": 0,
|
|
||||||
"ethash": {},
|
|
||||||
"homesteadBlock": 0,
|
|
||||||
"byzantiumBlock": 0,
|
|
||||||
"constantinopleBlock": 301243,
|
|
||||||
"petersburgBlock": 999983,
|
|
||||||
"istanbulBlock": 999983
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"context": {
|
|
||||||
"number": "1555161",
|
|
||||||
"difficulty": "4633150",
|
|
||||||
"timestamp": "1590794020",
|
|
||||||
"gasLimit": "9298364",
|
|
||||||
"miner": "0x877bd459c9b7d8576b44e59e09d076c25946f443"
|
|
||||||
},
|
|
||||||
"input": "0xf85e8303fa09843b9aca0083019ed880808a6000600060006000f50081a2a0485ea410e210740eef8e6f6de11c530f46f8da80eecb02afbb6c5f61749ac015a068d72f1b0f1d3cb4e214d5def79b49a73e6ee91db2df83499a54c656c144600f",
|
|
||||||
"result": [
|
|
||||||
{
|
|
||||||
"type": "create",
|
|
||||||
"action": {
|
|
||||||
"from": "0x877bd459c9b7d8576b44e59e09d076c25946f443",
|
|
||||||
"value": "0x0",
|
|
||||||
"gas": "0x19ed8",
|
|
||||||
"init": "0x6000600060006000f500"
|
|
||||||
},
|
|
||||||
"result": {
|
|
||||||
"gasUsed": "0x14c78",
|
|
||||||
"code": "0x",
|
|
||||||
"address": "0x2e8eded627eead210cb6143eb39ef7a3e44e4f00"
|
|
||||||
},
|
|
||||||
"traceAddress": [],
|
|
||||||
"subtraces": 1,
|
|
||||||
"transactionPosition": 31,
|
|
||||||
"transactionHash": "0x1257b698c5833c54ce786734087002b097275abc3877af082b5c2a538e894a41",
|
|
||||||
"blockNumber": 1555161,
|
|
||||||
"blockHash": "0xb0793dd508dd106a19794b8ce1dfc0ff8d98c76aab61bf32a11799854149a171",
|
|
||||||
"time": "889.048µs"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "create",
|
|
||||||
"action": {
|
|
||||||
"from": "0x2e8eded627eead210cb6143eb39ef7a3e44e4f00",
|
|
||||||
"value": "0x0",
|
|
||||||
"gas": "0x5117",
|
|
||||||
"init": "0x"
|
|
||||||
},
|
|
||||||
"result": {
|
|
||||||
"gasUsed": "0x0",
|
|
||||||
"code": "0x",
|
|
||||||
"address": "0x8785e369f0ef0a4e5c5a5f929680427dc75273a5"
|
|
||||||
},
|
|
||||||
"traceAddress": [0],
|
|
||||||
"subtraces": 0,
|
|
||||||
"transactionPosition": 31,
|
|
||||||
"transactionHash": "0x1257b698c5833c54ce786734087002b097275abc3877af082b5c2a538e894a41",
|
|
||||||
"blockNumber": 1555161,
|
|
||||||
"blockHash": "0xb0793dd508dd106a19794b8ce1dfc0ff8d98c76aab61bf32a11799854149a171"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,90 +0,0 @@
|
||||||
{
|
|
||||||
"genesis": {
|
|
||||||
"difficulty": "4639933",
|
|
||||||
"extraData": "0xd883010b05846765746888676f312e31342e33856c696e7578",
|
|
||||||
"gasLimit": "9280188",
|
|
||||||
"hash": "0x9a5f3a98eb1c60f6e3f450658a9cea190157e7021d04f927b752ad6482cf9194",
|
|
||||||
"miner": "0x73f26d124436b0791169d63a3af29c2ae47765a3",
|
|
||||||
"mixHash": "0x6b6f8fcaa54b8565c4c1ae7cf0a020e938a53007f4561e758b17bc05c9044d78",
|
|
||||||
"nonce": "0x773aba50dc51b462",
|
|
||||||
"number": "1555169",
|
|
||||||
"stateRoot": "0xc4b9703de3e59ff795baae2c3afa010cf039c37244a7a6af7f3f491a10601348",
|
|
||||||
"timestamp": "1590794111",
|
|
||||||
"totalDifficulty": "2242105342155",
|
|
||||||
"alloc": {
|
|
||||||
"0x5ac5599fc9df172c89ee7ec55ad9104ccbfed40d": {
|
|
||||||
"balance": "0x0",
|
|
||||||
"nonce": "0",
|
|
||||||
"code": "0x",
|
|
||||||
"storage": {}
|
|
||||||
},
|
|
||||||
"0x877bd459c9b7d8576b44e59e09d076c25946f443": {
|
|
||||||
"balance": "0x62325b40cbbd0915c4b9",
|
|
||||||
"nonce": "260875",
|
|
||||||
"code": "0x",
|
|
||||||
"storage": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"chainId": 63,
|
|
||||||
"daoForkSupport": true,
|
|
||||||
"eip150Block": 0,
|
|
||||||
"eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
|
|
||||||
"eip155Block": 0,
|
|
||||||
"eip158Block": 0,
|
|
||||||
"ethash": {},
|
|
||||||
"homesteadBlock": 0,
|
|
||||||
"byzantiumBlock": 0,
|
|
||||||
"constantinopleBlock": 301243,
|
|
||||||
"petersburgBlock": 999983,
|
|
||||||
"istanbulBlock": 999983
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"context": {
|
|
||||||
"number": "1555170",
|
|
||||||
"difficulty": "4642198",
|
|
||||||
"timestamp": "1590794112",
|
|
||||||
"gasLimit": "9289249",
|
|
||||||
"miner": "0x877bd459c9b7d8576b44e59e09d076c25946f443"
|
|
||||||
},
|
|
||||||
"input": "0xf8658303fb0b843b9aca0083019ee48080915a600055600060006000f0505a6001550081a2a01a7deb3a16d967b766459ef486b00656c6581e5ad58968184a33701e27e0eb8aa07162ccdfe2018d64360a605310a62c399dd586c7282dd42a88c54f02f51d451f",
|
|
||||||
"result": [
|
|
||||||
{
|
|
||||||
"type": "create",
|
|
||||||
"action": {
|
|
||||||
"from": "0x877bd459c9b7d8576b44e59e09d076c25946f443",
|
|
||||||
"value": "0x0",
|
|
||||||
"gas": "0x19ee4",
|
|
||||||
"init": "0x5a600055600060006000f0505a60015500"
|
|
||||||
},
|
|
||||||
"error": "out of gas",
|
|
||||||
"traceAddress": [],
|
|
||||||
"subtraces": 1,
|
|
||||||
"transactionPosition": 63,
|
|
||||||
"transactionHash": "0x60e881fae3884657b5430925c5d0053535b45cce0b8188f2a6be1feee8bcc650",
|
|
||||||
"blockNumber": 1555170,
|
|
||||||
"blockHash": "0xea46fbf941d51bf1e4180fbf26d22fda3896f49c7f371d109c226de95dd7b02e",
|
|
||||||
"time": "952.736µs"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "create",
|
|
||||||
"action": {
|
|
||||||
"from": "0x9c5cfe45b15eaff4ad617af4250189e26024a4f8",
|
|
||||||
"value": "0x0",
|
|
||||||
"gas": "0x3cb",
|
|
||||||
"init": "0x"
|
|
||||||
},
|
|
||||||
"result": {
|
|
||||||
"gasUsed": "0x0",
|
|
||||||
"code": "0x",
|
|
||||||
"address": "0x5ac5599fc9df172c89ee7ec55ad9104ccbfed40d"
|
|
||||||
},
|
|
||||||
"traceAddress": [0],
|
|
||||||
"subtraces": 0,
|
|
||||||
"transactionPosition": 63,
|
|
||||||
"transactionHash": "0x60e881fae3884657b5430925c5d0053535b45cce0b8188f2a6be1feee8bcc650",
|
|
||||||
"blockNumber": 1555170,
|
|
||||||
"blockHash": "0xea46fbf941d51bf1e4180fbf26d22fda3896f49c7f371d109c226de95dd7b02e"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,81 +0,0 @@
|
||||||
{
|
|
||||||
"genesis": {
|
|
||||||
"difficulty": "3244991",
|
|
||||||
"extraData": "0x",
|
|
||||||
"gasLimit": "7968787",
|
|
||||||
"hash": "0x62bbf18c203068a8793af8d8360d054f95a63bc62b87ade550861ed490af3f15",
|
|
||||||
"miner": "0x9f2659ffe7b3b467e46dcec3623392cf51635079",
|
|
||||||
"mixHash": "0xc8dec711fd1e03972b6a279a09dc0cd29c5171b60f42c4ce37c7c51ff445f776",
|
|
||||||
"nonce": "0x40b1bbcc25ddb804",
|
|
||||||
"number": "839246",
|
|
||||||
"stateRoot": "0x4bb3b02ec70b837651233957fb61a6ea3fc6a4244c1f55df7a713c154829ec0a",
|
|
||||||
"timestamp": "1581179375",
|
|
||||||
"totalDifficulty": "1023985623933",
|
|
||||||
"alloc": {
|
|
||||||
"0x76554b33410b6d90b7dc889bfed0451ad195f27e": {
|
|
||||||
"balance": "0x0",
|
|
||||||
"nonce": "1",
|
|
||||||
"code": "0x6080604052348015600f57600080fd5b506004361060505760003560e01c8063391521f414605557806355313dea14605d5780636d3d14161460655780638da5cb5b14606d578063b9d1e5aa1460b5575b600080fd5b605b60bd565b005b606360c8565b005b606b60ca565b005b607360cf565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60bb60f4565b005b6020610123600af050565b005b600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565bfefea165627a7a723058202094d5aa5dbbd493e9a2c64c50b62eba4b109b2a12d2bb73a5d0d54982651fc80029",
|
|
||||||
"storage": {}
|
|
||||||
},
|
|
||||||
"0xed69ab7145a9bae7152406d062c077c6ecc6ae18": {
|
|
||||||
"balance": "0x0",
|
|
||||||
"nonce": "0",
|
|
||||||
"code": "0x",
|
|
||||||
"storage": {}
|
|
||||||
},
|
|
||||||
"0xa3b31cbd5168d3c99756660d4b7625d679e12573": {
|
|
||||||
"balance": "0x569bc6535d3083fce",
|
|
||||||
"nonce": "26",
|
|
||||||
"code": "0x",
|
|
||||||
"storage": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"chainId": 63,
|
|
||||||
"daoForkSupport": true,
|
|
||||||
"eip150Block": 0,
|
|
||||||
"eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
|
|
||||||
"eip155Block": 0,
|
|
||||||
"eip158Block": 0,
|
|
||||||
"ethash": {},
|
|
||||||
"homesteadBlock": 0,
|
|
||||||
"byzantiumBlock": 0,
|
|
||||||
"constantinopleBlock": 301243,
|
|
||||||
"petersburgBlock": 999983,
|
|
||||||
"istanbulBlock": 999983
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"context": {
|
|
||||||
"number": "839247",
|
|
||||||
"difficulty": "3213311",
|
|
||||||
"timestamp": "1581179571",
|
|
||||||
"gasLimit": "7961006",
|
|
||||||
"miner": "0x9f2659ffe7b3b467e46dcec3623392cf51635079"
|
|
||||||
},
|
|
||||||
"input": "0xf86a1a8509502f9000830334509476554b33410b6d90b7dc889bfed0451ad195f27e8084391521f481a2a02e4ff0d171a860c8c7de2283978e2f225f9ba3ed4dec446b773c6b2d73ef22dea02a6a517528b491cb71b204f534db11a1c8059035f54d5bae347d1cab536bde2c",
|
|
||||||
"result": [
|
|
||||||
{
|
|
||||||
"type": "call",
|
|
||||||
"action": {
|
|
||||||
"from": "0xa3b31cbd5168d3c99756660d4b7625d679e12573",
|
|
||||||
"to": "0x76554b33410b6d90b7dc889bfed0451ad195f27e",
|
|
||||||
"value": "0x0",
|
|
||||||
"gas": "0x33450",
|
|
||||||
"input": "0x391521f4",
|
|
||||||
"callType": "call"
|
|
||||||
},
|
|
||||||
"result": {
|
|
||||||
"gasUsed": "0xd0b5",
|
|
||||||
"output": "0x"
|
|
||||||
},
|
|
||||||
"traceAddress": [],
|
|
||||||
"subtraces": 0,
|
|
||||||
"transactionPosition": 26,
|
|
||||||
"transactionHash": "0xcb1090fa85d2a3da8326b75333e92b3dca89963c895d9c981bfdaa64643135e4",
|
|
||||||
"blockNumber": 839247,
|
|
||||||
"blockHash": "0xce7ff7d84ca97f0f89d6065e2c12409a795c9f607cdb14aef0713cad5d7e311c",
|
|
||||||
"time": "182.267µs"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -1,111 +0,0 @@
|
||||||
{
|
|
||||||
"genesis": {
|
|
||||||
"difficulty": "1911202",
|
|
||||||
"extraData": "0xd883010906846765746888676f312e31332e35856c696e7578",
|
|
||||||
"gasLimit": "7842876",
|
|
||||||
"hash": "0x4d7bc82e0d56307094378e1a8fbfa6260986f621de95b5fe68a95248b3ba8efe",
|
|
||||||
"miner": "0x877bd459c9b7d8576b44e59e09d076c25946f443",
|
|
||||||
"mixHash": "0xc102ad52677c391edab82cc895ca7a7e9fff3eed4fa966ecf7fb61ec1e84bb6b",
|
|
||||||
"nonce": "0x39f5b074e3437f3f",
|
|
||||||
"number": "553415",
|
|
||||||
"stateRoot": "0x8f89e79109c19fa00e72b400502448540dc4773ad92dddd341dbba20c710a3b5",
|
|
||||||
"timestamp": "1577396195",
|
|
||||||
"totalDifficulty": "458361299240",
|
|
||||||
"alloc": {
|
|
||||||
"0x531f76bad925f6a925474996c7d738c1008045f6": {
|
|
||||||
"balance": "0x0",
|
|
||||||
"nonce": "1",
|
|
||||||
"code": "0x6060604052361561008a576000357c01000000000000000000000000000000000000000000000000000000009004806301cb3b20146102bf57806329dcb0cf146102cc57806338af3eed146102ed5780636e66f6e9146103245780637a3a0e841461035b5780637b3e5e7b1461037c578063a035b1fe1461039d578063dc0d3dff146103be5761008a565b6102bd5b60003490506040604051908101604052803381526020018281526020015060066000506006600050805480919060010190908154818355818115116101365760020281600202836000526020600020918201910161013591906100ec565b808211156101315760006000820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160005060009055506001016100ec565b5090565b5b505050815481101561000257906000526020600020906002020160005060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff0219169083021790555060208201518160010160005055905050806002600082828250540192505081905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166390b98a11336004600050548404604051837c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506020604051808303816000876161da5a03f1156100025750505060405151507fe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf633826001604051808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a15b50565b005b6102ca6004506104c8565b005b6102d760045061043a565b6040518082815260200191505060405180910390f35b6102f8600450610402565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61032f60045061044c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610366600450610428565b6040518082815260200191505060405180910390f35b610387600450610431565b6040518082815260200191505060405180910390f35b6103a8600450610443565b6040518082815260200191505060405180910390f35b6103cf600480359060200150610472565b604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390f35b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60016000505481565b60026000505481565b60036000505481565b60046000505481565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60066000508181548110156100025790600052602060002090600202016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160005054905082565b6000600360005054421015156107d8576001600050546002600050541015156105cf57600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166000600260005054604051809050600060405180830381858888f19350505050507fe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf6600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166002600050546000604051808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a161079d565b7fe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf66000600b600060405180848152602001838152602001828152602001935050505060405180910390a1600090505b60066000505481101561079c57600660005081815481101561000257906000526020600020906002020160005060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166000600660005083815481101561000257906000526020600020906002020160005060010160005054604051809050600060405180830381858888f19350505050507fe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf6600660005082815481101561000257906000526020600020906002020160005060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166006600050838154811015610002579060005260206000209060020201600050600101600050546000604051808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a15b806001019050805061061e565b5b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b5b5056",
|
|
||||||
"storage": {
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000006": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
|
||||||
"0xf652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
|
||||||
"0xf652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d40": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000005": "0x000000000000000000000000b49180d443dc4ca6028de0031ac09337891fd8ce",
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000004": "0x0000000000000000000000000000000000000000000000000de0b6b3a7640000"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"0xb49180d443dc4ca6028de0031ac09337891fd8ce": {
|
|
||||||
"balance": "0x0",
|
|
||||||
"nonce": "0",
|
|
||||||
"code": "0x",
|
|
||||||
"storage": {}
|
|
||||||
},
|
|
||||||
"0x877bd459c9b7d8576b44e59e09d076c25946f443": {
|
|
||||||
"balance": "0x193e9986e2e3f0c58988",
|
|
||||||
"nonce": "2585",
|
|
||||||
"code": "0x",
|
|
||||||
"storage": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"chainId": 63,
|
|
||||||
"daoForkSupport": true,
|
|
||||||
"eip150Block": 0,
|
|
||||||
"eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
|
|
||||||
"eip155Block": 0,
|
|
||||||
"eip158Block": 0,
|
|
||||||
"ethash": {},
|
|
||||||
"homesteadBlock": 0,
|
|
||||||
"byzantiumBlock": 0,
|
|
||||||
"constantinopleBlock": 301243,
|
|
||||||
"petersburgBlock": 999983,
|
|
||||||
"istanbulBlock": 999983
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"context": {
|
|
||||||
"number": "553416",
|
|
||||||
"difficulty": "1909336",
|
|
||||||
"timestamp": "1577396224",
|
|
||||||
"gasLimit": "7835218",
|
|
||||||
"miner": "0x877bd459c9b7d8576b44e59e09d076c25946f443"
|
|
||||||
},
|
|
||||||
"input": "0xf870820a1985e8d4a5100083040b2894531f76bad925f6a925474996c7d738c1008045f6880de0b6b3a76400008081a2a08693170f040d9501b831b404d9e40fba040c5aef4b8974aedc20b3844aea7c32a0476861058ff9b8030c58bcba8be320acc855e4694a633c493fb50fbdb9455489",
|
|
||||||
"result": [
|
|
||||||
{
|
|
||||||
"type": "call",
|
|
||||||
"action": {
|
|
||||||
"from": "0x877bd459c9b7d8576b44e59e09d076c25946f443",
|
|
||||||
"to": "0x531f76bad925f6a925474996c7d738c1008045f6",
|
|
||||||
"value": "0xde0b6b3a7640000",
|
|
||||||
"gas": "0x40b28",
|
|
||||||
"input": "0x",
|
|
||||||
"callType": "call"
|
|
||||||
},
|
|
||||||
"result": {
|
|
||||||
"gasUsed": "0x19c3e",
|
|
||||||
"output": "0x"
|
|
||||||
},
|
|
||||||
"traceAddress": [],
|
|
||||||
"subtraces": 1,
|
|
||||||
"transactionPosition": 5,
|
|
||||||
"transactionHash": "0x04d2029a5cbbed30969cdc0a2ca9e9fc6b719e323af0802b52466f07ee0ecada",
|
|
||||||
"blockNumber": 553416,
|
|
||||||
"blockHash": "0x8df024322173d225a09681d35edeaa528aca60743a11a70f854c158862bf5282",
|
|
||||||
"time": "617.42µs"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "call",
|
|
||||||
"action": {
|
|
||||||
"from": "0x531f76bad925f6a925474996c7d738c1008045f6",
|
|
||||||
"to": "0xb49180d443dc4ca6028de0031ac09337891fd8ce",
|
|
||||||
"value": "0x0",
|
|
||||||
"gas": "0x2164e",
|
|
||||||
"input": "0x90b98a11000000000000000000000000877bd459c9b7d8576b44e59e09d076c25946f4430000000000000000000000000000000000000000000000000000000000000001",
|
|
||||||
"callType": "call"
|
|
||||||
},
|
|
||||||
"result": {
|
|
||||||
"gasUsed": "0x0",
|
|
||||||
"output": "0x"
|
|
||||||
},
|
|
||||||
"traceAddress": [
|
|
||||||
0
|
|
||||||
],
|
|
||||||
"subtraces": 0,
|
|
||||||
"transactionPosition": 5,
|
|
||||||
"transactionHash": "0x04d2029a5cbbed30969cdc0a2ca9e9fc6b719e323af0802b52466f07ee0ecada",
|
|
||||||
"blockNumber": 553416,
|
|
||||||
"blockHash": "0x8df024322173d225a09681d35edeaa528aca60743a11a70f854c158862bf5282"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,68 +0,0 @@
|
||||||
{
|
|
||||||
"context": {
|
|
||||||
"difficulty": "3665057456",
|
|
||||||
"gasLimit": "5232723",
|
|
||||||
"miner": "0xf4d8e706cfb25c0decbbdd4d2e2cc10c66376a3f",
|
|
||||||
"number": "2294501",
|
|
||||||
"timestamp": "1513673601"
|
|
||||||
},
|
|
||||||
"genesis": {
|
|
||||||
"alloc": {
|
|
||||||
"0x0f6cef2b7fbb504782e35aa82a2207e816a2b7a9": {
|
|
||||||
"balance": "0x2a3fc32bcc019283",
|
|
||||||
"code": "0x",
|
|
||||||
"nonce": "10",
|
|
||||||
"storage": {}
|
|
||||||
},
|
|
||||||
"0xabbcd5b340c80b5f1c0545c04c987b87310296ae": {
|
|
||||||
"balance": "0x0",
|
|
||||||
"code": "0x606060405236156100755763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416632d0335ab811461007a578063548db174146100ab5780637f649783146100fc578063b092145e1461014d578063c3f44c0a14610186578063c47cf5de14610203575b600080fd5b341561008557600080fd5b610099600160a060020a0360043516610270565b60405190815260200160405180910390f35b34156100b657600080fd5b6100fa600460248135818101908301358060208181020160405190810160405280939291908181526020018383602002808284375094965061028f95505050505050565b005b341561010757600080fd5b6100fa600460248135818101908301358060208181020160405190810160405280939291908181526020018383602002808284375094965061029e95505050505050565b005b341561015857600080fd5b610172600160a060020a03600435811690602435166102ad565b604051901515815260200160405180910390f35b341561019157600080fd5b6100fa6004803560ff1690602480359160443591606435600160a060020a0316919060a49060843590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965050509235600160a060020a031692506102cd915050565b005b341561020e57600080fd5b61025460046024813581810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965061056a95505050505050565b604051600160a060020a03909116815260200160405180910390f35b600160a060020a0381166000908152602081905260409020545b919050565b61029a816000610594565b5b50565b61029a816001610594565b5b50565b600160209081526000928352604080842090915290825290205460ff1681565b60008080600160a060020a038416158061030d5750600160a060020a038085166000908152600160209081526040808320339094168352929052205460ff165b151561031857600080fd5b6103218561056a565b600160a060020a038116600090815260208190526040808220549295507f19000000000000000000000000000000000000000000000000000000000000009230918891908b908b90517fff000000000000000000000000000000000000000000000000000000000000008089168252871660018201526c01000000000000000000000000600160a060020a038088168202600284015286811682026016840152602a8301869052841602604a820152605e810182805190602001908083835b6020831061040057805182525b601f1990920191602091820191016103e0565b6001836020036101000a0380198251168184511617909252505050919091019850604097505050505050505051809103902091506001828a8a8a6040516000815260200160405260006040516020015260405193845260ff90921660208085019190915260408085019290925260608401929092526080909201915160208103908084039060008661646e5a03f1151561049957600080fd5b5050602060405103519050600160a060020a03838116908216146104bc57600080fd5b600160a060020a0380841660009081526020819052604090819020805460010190559087169086905180828051906020019080838360005b8381101561050d5780820151818401525b6020016104f4565b50505050905090810190601f16801561053a5780820380516001836020036101000a031916815260200191505b5091505060006040518083038160008661646e5a03f1915050151561055e57600080fd5b5b505050505050505050565b600060248251101561057e5750600061028a565b600160a060020a0360248301511690505b919050565b60005b825181101561060157600160a060020a033316600090815260016020526040812083918584815181106105c657fe5b90602001906020020151600160a060020a031681526020810191909152604001600020805460ff19169115159190911790555b600101610597565b5b5050505600a165627a7a723058200027e8b695e9d2dea9f3629519022a69f3a1d23055ce86406e686ea54f31ee9c0029",
|
|
||||||
"nonce": "1",
|
|
||||||
"storage": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"byzantiumBlock": 1700000,
|
|
||||||
"chainId": 3,
|
|
||||||
"daoForkSupport": true,
|
|
||||||
"eip150Block": 0,
|
|
||||||
"eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
|
|
||||||
"eip155Block": 10,
|
|
||||||
"eip158Block": 10,
|
|
||||||
"ethash": {},
|
|
||||||
"homesteadBlock": 0
|
|
||||||
},
|
|
||||||
"difficulty": "3672229776",
|
|
||||||
"extraData": "0x4554482e45544846414e532e4f52472d4641313738394444",
|
|
||||||
"gasLimit": "5227619",
|
|
||||||
"hash": "0xa07b3d6c6bf63f5f981016db9f2d1d93033833f2c17e8bf7209e85f1faf08076",
|
|
||||||
"miner": "0xbbf5029fd710d227630c8b7d338051b8e76d50b3",
|
|
||||||
"mixHash": "0x806e151ce2817be922e93e8d5921fa0f0d0fd213d6b2b9a3fa17458e74a163d0",
|
|
||||||
"nonce": "0xbc5d43adc2c30c7d",
|
|
||||||
"number": "2294500",
|
|
||||||
"stateRoot": "0xca645b335888352ef9d8b1ef083e9019648180b259026572e3139717270de97d",
|
|
||||||
"timestamp": "1513673552",
|
|
||||||
"totalDifficulty": "7160066586979149"
|
|
||||||
},
|
|
||||||
"input": "0xf9018b0a8505d21dba00832dc6c094abbcd5b340c80b5f1c0545c04c987b87310296ae80b9012473b40a5c000000000000000000000000400de2e016bda6577407dfc379faba9899bc73ef0000000000000000000000002cc31912b2b0f3075a87b3640923d45a26cef3ee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000064d79d8e6c7265636f76657279416464726573730000000000000000000000000000000000000000000000000000000000383e3ec32dc0f66d8fe60dbdc2f6815bdf73a988383e3ec32dc0f66d8fe60dbdc2f6815bdf73a988000000000000000000000000000000000000000000000000000000000000000000000000000000001ba0fd659d76a4edbd2a823e324c93f78ad6803b30ff4a9c8bce71ba82798975c70ca06571eecc0b765688ec6c78942c5ee8b585e00988c0141b518287e9be919bc48a",
|
|
||||||
"result": [
|
|
||||||
{
|
|
||||||
"action": {
|
|
||||||
"callType": "call",
|
|
||||||
"from": "0x0f6cef2b7fbb504782e35aa82a2207e816a2b7a9",
|
|
||||||
"gas": "0x2dc6c0",
|
|
||||||
"input": "0x73b40a5c000000000000000000000000400de2e016bda6577407dfc379faba9899bc73ef0000000000000000000000002cc31912b2b0f3075a87b3640923d45a26cef3ee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000064d79d8e6c7265636f76657279416464726573730000000000000000000000000000000000000000000000000000000000383e3ec32dc0f66d8fe60dbdc2f6815bdf73a988383e3ec32dc0f66d8fe60dbdc2f6815bdf73a98800000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
|
||||||
"to": "0xabbcd5b340c80b5f1c0545c04c987b87310296ae",
|
|
||||||
"value": "0x0"
|
|
||||||
},
|
|
||||||
"blockNumber": 2294501,
|
|
||||||
"error": "execution reverted",
|
|
||||||
"result": {
|
|
||||||
"gasUsed": "0x719b"
|
|
||||||
},
|
|
||||||
"subtraces": 0,
|
|
||||||
"traceAddress": [],
|
|
||||||
"type": "call"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -1,91 +0,0 @@
|
||||||
{
|
|
||||||
"genesis": {
|
|
||||||
"difficulty": "4628640",
|
|
||||||
"extraData": "0xd883010b05846765746888676f312e31342e33856c696e7578",
|
|
||||||
"gasLimit": "9244120",
|
|
||||||
"hash": "0x5a1f551897cc91265225b0453136ad8c7eef1c1c8b06139da4f2e6e710c1f4df",
|
|
||||||
"miner": "0x73f26d124436b0791169d63a3af29c2ae47765a3",
|
|
||||||
"mixHash": "0xd6735e63f8937fe0c5491e0d5836ec28467363be7ada5a2f979f9d107e2c831e",
|
|
||||||
"nonce": "0x7c35e34d2e328d7d",
|
|
||||||
"number": "1555145",
|
|
||||||
"stateRoot": "0x565873b05f71b98595133e37a52d79c3476ce820c05ebedaddd35541b0e894a3",
|
|
||||||
"timestamp": "1590793819",
|
|
||||||
"totalDifficulty": "2241994078605",
|
|
||||||
"alloc": {
|
|
||||||
"0x119f569a45e9d0089d51d7f9529f5ea9bf5785e2": {
|
|
||||||
"balance": "0x0",
|
|
||||||
"nonce": "0",
|
|
||||||
"code": "0x",
|
|
||||||
"storage": {}
|
|
||||||
},
|
|
||||||
"0x877bd459c9b7d8576b44e59e09d076c25946f443": {
|
|
||||||
"balance": "0x622e8fced69d43eb8d97",
|
|
||||||
"nonce": "260140",
|
|
||||||
"code": "0x",
|
|
||||||
"storage": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"chainId": 63,
|
|
||||||
"daoForkSupport": true,
|
|
||||||
"eip150Block": 0,
|
|
||||||
"eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
|
|
||||||
"eip155Block": 0,
|
|
||||||
"eip158Block": 0,
|
|
||||||
"ethash": {},
|
|
||||||
"homesteadBlock": 0,
|
|
||||||
"byzantiumBlock": 0,
|
|
||||||
"constantinopleBlock": 301243,
|
|
||||||
"petersburgBlock": 999983,
|
|
||||||
"istanbulBlock": 999983
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"context": {
|
|
||||||
"number": "1555146",
|
|
||||||
"difficulty": "4630900",
|
|
||||||
"timestamp": "1590793820",
|
|
||||||
"gasLimit": "9253146",
|
|
||||||
"miner": "0x877bd459c9b7d8576b44e59e09d076c25946f443"
|
|
||||||
},
|
|
||||||
"input": "0xf8628303f82c843b9aca0083019ecc80808e605a600053600160006001f0ff0081a2a077f539ae2a58746bbfa6370fc423f946870efa32753d697d3729d361a428623aa0384ef9a5650d6630f5c1ddef616bffa5fc72a95a9314361d0918de066aa4475a",
|
|
||||||
"result": [
|
|
||||||
{
|
|
||||||
"type": "create",
|
|
||||||
"action": {
|
|
||||||
"from": "0x877bd459c9b7d8576b44e59e09d076c25946f443",
|
|
||||||
"value": "0x0",
|
|
||||||
"gas": "0x19ecc",
|
|
||||||
"init": "0x605a600053600160006001f0ff00"
|
|
||||||
},
|
|
||||||
"result": {
|
|
||||||
"gasUsed": "0x102a1",
|
|
||||||
"code": "0x",
|
|
||||||
"address": "0x1d99a1a3efa9181f540f9e24fa6e4e08eb7844ca"
|
|
||||||
},
|
|
||||||
"traceAddress": [],
|
|
||||||
"subtraces": 1,
|
|
||||||
"transactionPosition": 14,
|
|
||||||
"transactionHash": "0xdd76f02407e2f8329303ba688e111cae4f7008ad0d14d6e42c5698424ea36d79",
|
|
||||||
"blockNumber": 1555146,
|
|
||||||
"blockHash": "0xafb4f1dd27b9054c805acb81a88ed04384788cb31d84164c21874935c81e5c7e",
|
|
||||||
"time": "187.145µs"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "suicide",
|
|
||||||
"action": {
|
|
||||||
"address": "0x1d99a1a3efa9181f540f9e24fa6e4e08eb7844ca",
|
|
||||||
"refundAddress": "0x0000000000000000000000000000000000000000",
|
|
||||||
"balance": "0x0"
|
|
||||||
},
|
|
||||||
"result": null,
|
|
||||||
"traceAddress": [
|
|
||||||
0
|
|
||||||
],
|
|
||||||
"subtraces": 0,
|
|
||||||
"transactionPosition": 14,
|
|
||||||
"transactionHash": "0xdd76f02407e2f8329303ba688e111cae4f7008ad0d14d6e42c5698424ea36d79",
|
|
||||||
"blockNumber": 1555146,
|
|
||||||
"blockHash": "0xafb4f1dd27b9054c805acb81a88ed04384788cb31d84164c21874935c81e5c7e"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,97 +0,0 @@
|
||||||
{
|
|
||||||
"context": {
|
|
||||||
"difficulty": "3502894804",
|
|
||||||
"gasLimit": "4722976",
|
|
||||||
"miner": "0x1585936b53834b021f68cc13eeefdec2efc8e724",
|
|
||||||
"number": "2289806",
|
|
||||||
"timestamp": "1513601314"
|
|
||||||
},
|
|
||||||
"genesis": {
|
|
||||||
"alloc": {
|
|
||||||
"0x0024f658a46fbb89d8ac105e98d7ac7cbbaf27c5": {
|
|
||||||
"balance": "0x0",
|
|
||||||
"code": "0x",
|
|
||||||
"nonce": "22",
|
|
||||||
"storage": {}
|
|
||||||
},
|
|
||||||
"0x3b873a919aa0512d5a0f09e6dcceaa4a6727fafe": {
|
|
||||||
"balance": "0x4d87094125a369d9bd5",
|
|
||||||
"code": "0x606060405236156100935763ffffffff60e060020a60003504166311ee8382811461009c57806313af4035146100be5780631f5e8f4c146100ee57806324daddc5146101125780634921a91a1461013b57806363e4bff414610157578063764978f91461017f578063893d20e8146101a1578063ba40aaa1146101cd578063cebc9a82146101f4578063e177246e14610216575b61009a5b5b565b005b34156100a457fe5b6100ac61023d565b60408051918252519081900360200190f35b34156100c657fe5b6100da600160a060020a0360043516610244565b604080519115158252519081900360200190f35b34156100f657fe5b6100da610307565b604080519115158252519081900360200190f35b341561011a57fe5b6100da6004351515610318565b604080519115158252519081900360200190f35b6100da6103d6565b604080519115158252519081900360200190f35b6100da600160a060020a0360043516610420565b604080519115158252519081900360200190f35b341561018757fe5b6100ac61046c565b60408051918252519081900360200190f35b34156101a957fe5b6101b1610473565b60408051600160a060020a039092168252519081900360200190f35b34156101d557fe5b6100da600435610483565b604080519115158252519081900360200190f35b34156101fc57fe5b6100ac61050d565b60408051918252519081900360200190f35b341561021e57fe5b6100da600435610514565b604080519115158252519081900360200190f35b6003545b90565b60006000610250610473565b600160a060020a031633600160a060020a03161415156102705760006000fd5b600160a060020a03831615156102865760006000fd5b50600054600160a060020a0390811690831681146102fb57604051600160a060020a0380851691908316907ffcf23a92150d56e85e3a3d33b357493246e55783095eb6a733eb8439ffc752c890600090a360008054600160a060020a031916600160a060020a03851617905560019150610300565b600091505b5b50919050565b60005460a060020a900460ff165b90565b60006000610324610473565b600160a060020a031633600160a060020a03161415156103445760006000fd5b5060005460a060020a900460ff16801515831515146102fb576000546040805160a060020a90920460ff1615158252841515602083015280517fe6cd46a119083b86efc6884b970bfa30c1708f53ba57b86716f15b2f4551a9539281900390910190a16000805460a060020a60ff02191660a060020a8515150217905560019150610300565b600091505b5b50919050565b60006103e0610307565b801561040557506103ef610473565b600160a060020a031633600160a060020a031614155b156104105760006000fd5b610419336105a0565b90505b5b90565b600061042a610307565b801561044f5750610439610473565b600160a060020a031633600160a060020a031614155b1561045a5760006000fd5b610463826105a0565b90505b5b919050565b6001545b90565b600054600160a060020a03165b90565b6000600061048f610473565b600160a060020a031633600160a060020a03161415156104af5760006000fd5b506001548281146102fb57604080518281526020810185905281517f79a3746dde45672c9e8ab3644b8bb9c399a103da2dc94b56ba09777330a83509929181900390910190a160018381559150610300565b600091505b5b50919050565b6002545b90565b60006000610520610473565b600160a060020a031633600160a060020a03161415156105405760006000fd5b506002548281146102fb57604080518281526020810185905281517ff6991a728965fedd6e927fdf16bdad42d8995970b4b31b8a2bf88767516e2494929181900390910190a1600283905560019150610300565b600091505b5b50919050565b60006000426105ad61023d565b116102fb576105c46105bd61050d565b4201610652565b6105cc61046c565b604051909150600160a060020a038416908290600081818185876187965a03f1925050501561063d57604080518281529051600160a060020a038516917f9bca65ce52fdef8a470977b51f247a2295123a4807dfa9e502edf0d30722da3b919081900360200190a260019150610300565b6102fb42610652565b5b600091505b50919050565b60038190555b505600a165627a7a72305820f3c973c8b7ed1f62000b6701bd5b708469e19d0f1d73fde378a56c07fd0b19090029",
|
|
||||||
"nonce": "1",
|
|
||||||
"storage": {
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000001b436ba50d378d4bbc8660d312a13df6af6e89dfb",
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000001": "0x00000000000000000000000000000000000000000000000006f05b59d3b20000",
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000002": "0x000000000000000000000000000000000000000000000000000000000000003c",
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000003": "0x000000000000000000000000000000000000000000000000000000005a37b834"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"0xb436ba50d378d4bbc8660d312a13df6af6e89dfb": {
|
|
||||||
"balance": "0x1780d77678137ac1b775",
|
|
||||||
"code": "0x",
|
|
||||||
"nonce": "29072",
|
|
||||||
"storage": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"byzantiumBlock": 1700000,
|
|
||||||
"chainId": 3,
|
|
||||||
"daoForkSupport": true,
|
|
||||||
"eip150Block": 0,
|
|
||||||
"eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
|
|
||||||
"eip155Block": 10,
|
|
||||||
"eip158Block": 10,
|
|
||||||
"ethash": {},
|
|
||||||
"homesteadBlock": 0
|
|
||||||
},
|
|
||||||
"difficulty": "3509749784",
|
|
||||||
"extraData": "0x4554482e45544846414e532e4f52472d4641313738394444",
|
|
||||||
"gasLimit": "4727564",
|
|
||||||
"hash": "0x609948ac3bd3c00b7736b933248891d6c901ee28f066241bddb28f4e00a9f440",
|
|
||||||
"miner": "0xbbf5029fd710d227630c8b7d338051b8e76d50b3",
|
|
||||||
"mixHash": "0xb131e4507c93c7377de00e7c271bf409ec7492767142ff0f45c882f8068c2ada",
|
|
||||||
"nonce": "0x4eb12e19c16d43da",
|
|
||||||
"number": "2289805",
|
|
||||||
"stateRoot": "0xc7f10f352bff82fac3c2999d3085093d12652e19c7fd32591de49dc5d91b4f1f",
|
|
||||||
"timestamp": "1513601261",
|
|
||||||
"totalDifficulty": "7143276353481064"
|
|
||||||
},
|
|
||||||
"input": "0xf88b8271908506fc23ac0083015f90943b873a919aa0512d5a0f09e6dcceaa4a6727fafe80a463e4bff40000000000000000000000000024f658a46fbb89d8ac105e98d7ac7cbbaf27c52aa0bdce0b59e8761854e857fe64015f06dd08a4fbb7624f6094893a79a72e6ad6bea01d9dde033cff7bb235a3163f348a6d7ab8d6b52bc0963a95b91612e40ca766a4",
|
|
||||||
"result": [
|
|
||||||
{
|
|
||||||
"action": {
|
|
||||||
"callType": "call",
|
|
||||||
"from": "0xb436ba50d378d4bbc8660d312a13df6af6e89dfb",
|
|
||||||
"gas": "0x15f90",
|
|
||||||
"input": "0x63e4bff40000000000000000000000000024f658a46fbb89d8ac105e98d7ac7cbbaf27c5",
|
|
||||||
"to": "0x3b873a919aa0512d5a0f09e6dcceaa4a6727fafe",
|
|
||||||
"value": "0x0"
|
|
||||||
},
|
|
||||||
"blockNumber": 2289806,
|
|
||||||
"result": {
|
|
||||||
"gasUsed": "0x9751",
|
|
||||||
"output": "0x0000000000000000000000000000000000000000000000000000000000000001"
|
|
||||||
},
|
|
||||||
"subtraces": 1,
|
|
||||||
"traceAddress": [],
|
|
||||||
"type": "call"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"action": {
|
|
||||||
"callType": "call",
|
|
||||||
"from": "0x3b873a919aa0512d5a0f09e6dcceaa4a6727fafe",
|
|
||||||
"gas": "0x6d05",
|
|
||||||
"input": "0x",
|
|
||||||
"to": "0x0024f658a46fbb89d8ac105e98d7ac7cbbaf27c5",
|
|
||||||
"value": "0x6f05b59d3b20000"
|
|
||||||
},
|
|
||||||
"blockNumber": 0,
|
|
||||||
"result": {
|
|
||||||
"gasUsed": "0x0",
|
|
||||||
"output": "0x"
|
|
||||||
},
|
|
||||||
"subtraces": 0,
|
|
||||||
"traceAddress": [0],
|
|
||||||
"type": "call"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,100 +0,0 @@
|
||||||
{
|
|
||||||
"context": {
|
|
||||||
"difficulty": "3502894804",
|
|
||||||
"gasLimit": "4722976",
|
|
||||||
"miner": "0x1585936b53834b021f68cc13eeefdec2efc8e724",
|
|
||||||
"number": "2289806",
|
|
||||||
"timestamp": "1513601314"
|
|
||||||
},
|
|
||||||
"genesis": {
|
|
||||||
"alloc": {
|
|
||||||
"0x0024f658a46fbb89d8ac105e98d7ac7cbbaf27c5": {
|
|
||||||
"balance": "0x0",
|
|
||||||
"code": "0x",
|
|
||||||
"nonce": "22",
|
|
||||||
"storage": {}
|
|
||||||
},
|
|
||||||
"0x3b873a919aa0512d5a0f09e6dcceaa4a6727fafe": {
|
|
||||||
"balance": "0x4d87094125a369d9bd5",
|
|
||||||
"code": "0x606060405236156100935763ffffffff60e060020a60003504166311ee8382811461009c57806313af4035146100be5780631f5e8f4c146100ee57806324daddc5146101125780634921a91a1461013b57806363e4bff414610157578063764978f91461017f578063893d20e8146101a1578063ba40aaa1146101cd578063cebc9a82146101f4578063e177246e14610216575b61009a5b5b565b005b34156100a457fe5b6100ac61023d565b60408051918252519081900360200190f35b34156100c657fe5b6100da600160a060020a0360043516610244565b604080519115158252519081900360200190f35b34156100f657fe5b6100da610307565b604080519115158252519081900360200190f35b341561011a57fe5b6100da6004351515610318565b604080519115158252519081900360200190f35b6100da6103d6565b604080519115158252519081900360200190f35b6100da600160a060020a0360043516610420565b604080519115158252519081900360200190f35b341561018757fe5b6100ac61046c565b60408051918252519081900360200190f35b34156101a957fe5b6101b1610473565b60408051600160a060020a039092168252519081900360200190f35b34156101d557fe5b6100da600435610483565b604080519115158252519081900360200190f35b34156101fc57fe5b6100ac61050d565b60408051918252519081900360200190f35b341561021e57fe5b6100da600435610514565b604080519115158252519081900360200190f35b6003545b90565b60006000610250610473565b600160a060020a031633600160a060020a03161415156102705760006000fd5b600160a060020a03831615156102865760006000fd5b50600054600160a060020a0390811690831681146102fb57604051600160a060020a0380851691908316907ffcf23a92150d56e85e3a3d33b357493246e55783095eb6a733eb8439ffc752c890600090a360008054600160a060020a031916600160a060020a03851617905560019150610300565b600091505b5b50919050565b60005460a060020a900460ff165b90565b60006000610324610473565b600160a060020a031633600160a060020a03161415156103445760006000fd5b5060005460a060020a900460ff16801515831515146102fb576000546040805160a060020a90920460ff1615158252841515602083015280517fe6cd46a119083b86efc6884b970bfa30c1708f53ba57b86716f15b2f4551a9539281900390910190a16000805460a060020a60ff02191660a060020a8515150217905560019150610300565b600091505b5b50919050565b60006103e0610307565b801561040557506103ef610473565b600160a060020a031633600160a060020a031614155b156104105760006000fd5b610419336105a0565b90505b5b90565b600061042a610307565b801561044f5750610439610473565b600160a060020a031633600160a060020a031614155b1561045a5760006000fd5b610463826105a0565b90505b5b919050565b6001545b90565b600054600160a060020a03165b90565b6000600061048f610473565b600160a060020a031633600160a060020a03161415156104af5760006000fd5b506001548281146102fb57604080518281526020810185905281517f79a3746dde45672c9e8ab3644b8bb9c399a103da2dc94b56ba09777330a83509929181900390910190a160018381559150610300565b600091505b5b50919050565b6002545b90565b60006000610520610473565b600160a060020a031633600160a060020a03161415156105405760006000fd5b506002548281146102fb57604080518281526020810185905281517ff6991a728965fedd6e927fdf16bdad42d8995970b4b31b8a2bf88767516e2494929181900390910190a1600283905560019150610300565b600091505b5b50919050565b60006000426105ad61023d565b116102fb576105c46105bd61050d565b4201610652565b6105cc61046c565b604051909150600160a060020a038416908290600081818185876187965a03f1925050501561063d57604080518281529051600160a060020a038516917f9bca65ce52fdef8a470977b51f247a2295123a4807dfa9e502edf0d30722da3b919081900360200190a260019150610300565b6102fb42610652565b5b600091505b50919050565b60038190555b505600a165627a7a72305820f3c973c8b7ed1f62000b6701bd5b708469e19d0f1d73fde378a56c07fd0b19090029",
|
|
||||||
"nonce": "1",
|
|
||||||
"storage": {
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000001b436ba50d378d4bbc8660d312a13df6af6e89dfb",
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000001": "0x00000000000000000000000000000000000000000000000006f05b59d3b20000",
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000002": "0x000000000000000000000000000000000000000000000000000000000000003c",
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000003": "0x000000000000000000000000000000000000000000000000000000005a37b834"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"0xb436ba50d378d4bbc8660d312a13df6af6e89dfb": {
|
|
||||||
"balance": "0x1780d77678137ac1b775",
|
|
||||||
"code": "0x",
|
|
||||||
"nonce": "29072",
|
|
||||||
"storage": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"byzantiumBlock": 1700000,
|
|
||||||
"chainId": 3,
|
|
||||||
"daoForkSupport": true,
|
|
||||||
"eip150Block": 0,
|
|
||||||
"eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
|
|
||||||
"eip155Block": 10,
|
|
||||||
"eip158Block": 10,
|
|
||||||
"ethash": {},
|
|
||||||
"homesteadBlock": 0
|
|
||||||
},
|
|
||||||
"difficulty": "3509749784",
|
|
||||||
"extraData": "0x4554482e45544846414e532e4f52472d4641313738394444",
|
|
||||||
"gasLimit": "4727564",
|
|
||||||
"hash": "0x609948ac3bd3c00b7736b933248891d6c901ee28f066241bddb28f4e00a9f440",
|
|
||||||
"miner": "0xbbf5029fd710d227630c8b7d338051b8e76d50b3",
|
|
||||||
"mixHash": "0xb131e4507c93c7377de00e7c271bf409ec7492767142ff0f45c882f8068c2ada",
|
|
||||||
"nonce": "0x4eb12e19c16d43da",
|
|
||||||
"number": "2289805",
|
|
||||||
"stateRoot": "0xc7f10f352bff82fac3c2999d3085093d12652e19c7fd32591de49dc5d91b4f1f",
|
|
||||||
"timestamp": "1513601261",
|
|
||||||
"totalDifficulty": "7143276353481064"
|
|
||||||
},
|
|
||||||
"input": "0xf88b8271908506fc23ac0083015f90943b873a919aa0512d5a0f09e6dcceaa4a6727fafe80a463e4bff40000000000000000000000000024f658a46fbb89d8ac105e98d7ac7cbbaf27c52aa0bdce0b59e8761854e857fe64015f06dd08a4fbb7624f6094893a79a72e6ad6bea01d9dde033cff7bb235a3163f348a6d7ab8d6b52bc0963a95b91612e40ca766a4",
|
|
||||||
"tracerConfig": {
|
|
||||||
"onlyTopCall": true
|
|
||||||
},
|
|
||||||
"result": [
|
|
||||||
{
|
|
||||||
"action": {
|
|
||||||
"callType": "call",
|
|
||||||
"from": "0xb436ba50d378d4bbc8660d312a13df6af6e89dfb",
|
|
||||||
"gas": "0x15f90",
|
|
||||||
"input": "0x63e4bff40000000000000000000000000024f658a46fbb89d8ac105e98d7ac7cbbaf27c5",
|
|
||||||
"to": "0x3b873a919aa0512d5a0f09e6dcceaa4a6727fafe",
|
|
||||||
"value": "0x0"
|
|
||||||
},
|
|
||||||
"blockNumber": 2289806,
|
|
||||||
"result": {
|
|
||||||
"gasUsed": "0x9751",
|
|
||||||
"output": "0x0000000000000000000000000000000000000000000000000000000000000001"
|
|
||||||
},
|
|
||||||
"subtraces": 1,
|
|
||||||
"traceAddress": [],
|
|
||||||
"type": "call"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"action": {
|
|
||||||
"callType": "call",
|
|
||||||
"from": "0x3b873a919aa0512d5a0f09e6dcceaa4a6727fafe",
|
|
||||||
"gas": "0x6d05",
|
|
||||||
"input": "0x",
|
|
||||||
"to": "0x0024f658a46fbb89d8ac105e98d7ac7cbbaf27c5",
|
|
||||||
"value": "0x6f05b59d3b20000"
|
|
||||||
},
|
|
||||||
"blockNumber": 0,
|
|
||||||
"result": {
|
|
||||||
"gasUsed": "0x0",
|
|
||||||
"output": "0x"
|
|
||||||
},
|
|
||||||
"subtraces": 0,
|
|
||||||
"traceAddress": [0],
|
|
||||||
"type": "call"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,70 +0,0 @@
|
||||||
{
|
|
||||||
"genesis": {
|
|
||||||
"difficulty": "4673862",
|
|
||||||
"extraData": "0xd683010b05846765746886676f312e3133856c696e7578",
|
|
||||||
"gasLimit": "9471919",
|
|
||||||
"hash": "0x7f072150c5905c214966e3432d418910badcdbe510aceaac295b1d7059cc0ffc",
|
|
||||||
"miner": "0x877bd459c9b7d8576b44e59e09d076c25946f443",
|
|
||||||
"mixHash": "0x113ced8fedb939fdc862008da7bdddde726f997c0e6dfba0e55613994757b489",
|
|
||||||
"nonce": "0x0f411a2e5552c5b7",
|
|
||||||
"number": "1555284",
|
|
||||||
"stateRoot": "0x9fe125b361b72d5479b24ad9be9964b74228c73a2dfb0065060a79b4a6dfaa1e",
|
|
||||||
"timestamp": "1590795374",
|
|
||||||
"totalDifficulty": "2242642335405",
|
|
||||||
"alloc": {
|
|
||||||
"0xe85df1413eebe1b191c26260e19783a274a6b041": {
|
|
||||||
"balance": "0x0",
|
|
||||||
"nonce": "0",
|
|
||||||
"code": "0x",
|
|
||||||
"storage": {}
|
|
||||||
},
|
|
||||||
"0x877bd459c9b7d8576b44e59e09d076c25946f443": {
|
|
||||||
"balance": "0x6244c985ef1e48e84531",
|
|
||||||
"nonce": "265775",
|
|
||||||
"code": "0x",
|
|
||||||
"storage": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"chainId": 63,
|
|
||||||
"daoForkSupport": true,
|
|
||||||
"eip150Block": 0,
|
|
||||||
"eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
|
|
||||||
"eip155Block": 0,
|
|
||||||
"eip158Block": 0,
|
|
||||||
"ethash": {},
|
|
||||||
"homesteadBlock": 0,
|
|
||||||
"byzantiumBlock": 0,
|
|
||||||
"constantinopleBlock": 301243,
|
|
||||||
"petersburgBlock": 999983,
|
|
||||||
"istanbulBlock": 999983
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"context": {
|
|
||||||
"number": "1555285",
|
|
||||||
"difficulty": "4676144",
|
|
||||||
"timestamp": "1590795378",
|
|
||||||
"gasLimit": "9481167",
|
|
||||||
"miner": "0x877bd459c9b7d8576b44e59e09d076c25946f443"
|
|
||||||
},
|
|
||||||
"input": "0xf9014083040e2f843b9aca008301aab08080b8eb7f000000000000000000000000945304eb96065b2a98b57a48a06ae28d285a71b57f000000000000000000000000000000000000000000000000000000000000c3507f000000000000000000000000945304eb96065b2a98b57a48a06ae28d285a71b5547f000000000000000000000000000000000000000000000000000000000000c3507f000000000000000000000000000000000000000000000000000000000000c3507f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000037f05581a2a09db45e7846f193471f6d897fb6ff58b7ec41a9c6f63d10aca47d821c365981cba052ec320875625e16141a1a9e8b7993de863698fb699f93ae2cab26149bbb144f",
|
|
||||||
"result": [
|
|
||||||
{
|
|
||||||
"type": "create",
|
|
||||||
"action": {
|
|
||||||
"from": "0x877bd459c9b7d8576b44e59e09d076c25946f443",
|
|
||||||
"value": "0x0",
|
|
||||||
"gas": "0x1aab0",
|
|
||||||
"init": "0x7f000000000000000000000000945304eb96065b2a98b57a48a06ae28d285a71b57f000000000000000000000000000000000000000000000000000000000000c3507f000000000000000000000000945304eb96065b2a98b57a48a06ae28d285a71b5547f000000000000000000000000000000000000000000000000000000000000c3507f000000000000000000000000000000000000000000000000000000000000c3507f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000037f055"
|
|
||||||
},
|
|
||||||
"error": "out of gas",
|
|
||||||
"traceAddress": [],
|
|
||||||
"subtraces": 0,
|
|
||||||
"transactionPosition": 16,
|
|
||||||
"transactionHash": "0x384487e5ae8d2997aece8e28403d393cb9752425e6de358891bed981c5af1c05",
|
|
||||||
"blockNumber": 1555285,
|
|
||||||
"blockHash": "0x93231d8e9662adb4c5c703583a92c7b3112cd5448f43ab4fa1f0f00a0183ed3f",
|
|
||||||
"time": "665.278µs"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -1,92 +0,0 @@
|
||||||
{
|
|
||||||
"genesis": {
|
|
||||||
"number": "553153",
|
|
||||||
"hash": "0x88bde20840880a1f3fba92121912a3cc0d3b26d76e4d914fbd85fc2e43da3b3f",
|
|
||||||
"nonce": "0x7be554ffe4b82fc2",
|
|
||||||
"mixHash": "0xf73d2ff3c16599c3b8a24b9ebde6c09583b5ee3f747d3cd37845d564f4c8d87a",
|
|
||||||
"stateRoot": "0x40b5f53d610108947688a04fb68838ff9c0aa0dd6e54156b682537192171ff5c",
|
|
||||||
"miner": "0x774c398d763161f55b66a646f17edda4addad2ca",
|
|
||||||
"difficulty": "1928226",
|
|
||||||
"totalDifficulty": "457857582215",
|
|
||||||
"extraData": "0xd983010907846765746888676f312e31332e358664617277696e",
|
|
||||||
"gasLimit": "7999473",
|
|
||||||
"timestamp": "1577392669",
|
|
||||||
"alloc": {
|
|
||||||
"0x877bd459c9b7d8576b44e59e09d076c25946f443": {
|
|
||||||
"balance": "0x19bb4ac611ca7a1fc881",
|
|
||||||
"nonce": "701",
|
|
||||||
"code": "0x",
|
|
||||||
"storage": {}
|
|
||||||
},
|
|
||||||
"0x8ee79c5b3f6e1d214d2c4fcf7ea4092a32e26e91": {
|
|
||||||
"balance": "0x0",
|
|
||||||
"nonce": "1",
|
|
||||||
"code": "0x60606040526000357c01000000000000000000000000000000000000000000000000000000009004806341c0e1b514610044578063cfae32171461005157610042565b005b61004f6004506100ca565b005b61005c60045061015e565b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600302600f01f150905090810190601f1680156100bc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561015b57600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b5b565b60206040519081016040528060008152602001506001600050805480601f016020809104026020016040519081016040528092919081815260200182805480156101cd57820191906000526020600020905b8154815290600101906020018083116101b057829003601f168201915b505050505090506101d9565b9056",
|
|
||||||
"storage": {
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000877bd459c9b7d8576b44e59e09d076c25946f443"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"chainId": 63,
|
|
||||||
"daoForkSupport": true,
|
|
||||||
"eip150Block": 0,
|
|
||||||
"eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
|
|
||||||
"eip155Block": 0,
|
|
||||||
"eip158Block": 0,
|
|
||||||
"ethash": {},
|
|
||||||
"homesteadBlock": 0,
|
|
||||||
"byzantiumBlock": 0,
|
|
||||||
"constantinopleBlock": 301243,
|
|
||||||
"petersburgBlock": 999983,
|
|
||||||
"istanbulBlock": 999983
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"context": {
|
|
||||||
"number": "553154",
|
|
||||||
"difficulty": "1929167",
|
|
||||||
"timestamp": "1577392670",
|
|
||||||
"gasLimit": "8000000",
|
|
||||||
"miner": "0x877bd459c9b7d8576b44e59e09d076c25946f443"
|
|
||||||
},
|
|
||||||
"input": "0xf86c8202bd850ee6b280008344aa20948ee79c5b3f6e1d214d2c4fcf7ea4092a32e26e91808441c0e1b581a2a03f95ca5cdf7fd727630341c4c6aa1b64ccd9949bd9ecc72cfdd7ce17a2013a69a06d34795ef7fb0108a6dbee4ae0a1bdc48dcd2a4ee53bb6a33d45515af07bb9a8",
|
|
||||||
"result": [
|
|
||||||
{
|
|
||||||
"action": {
|
|
||||||
"callType": "call",
|
|
||||||
"from": "0x877bd459c9b7d8576b44e59e09d076c25946f443",
|
|
||||||
"gas": "0x44aa20",
|
|
||||||
"input": "0x41c0e1b5",
|
|
||||||
"to": "0x8ee79c5b3f6e1d214d2c4fcf7ea4092a32e26e91",
|
|
||||||
"value": "0x0"
|
|
||||||
},
|
|
||||||
"blockHash": "0xf641c3b0f82b07cd3a528adb9927dd83eeb4f1682e2bd523ed36888e0d82c9a9",
|
|
||||||
"blockNumber": 553154,
|
|
||||||
"result": {
|
|
||||||
"gasUsed": "0x347a",
|
|
||||||
"output": "0x"
|
|
||||||
},
|
|
||||||
"subtraces": 1,
|
|
||||||
"traceAddress": [],
|
|
||||||
"transactionHash": "0x6af0a5c3188ffacae4d340d4a17e14fdb5a54187683a80ef241bde248189882b",
|
|
||||||
"transactionPosition": 15,
|
|
||||||
"type": "call"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"action": {
|
|
||||||
"address": "0x8ee79c5b3f6e1d214d2c4fcf7ea4092a32e26e91",
|
|
||||||
"balance": "0x0",
|
|
||||||
"refundAddress": "0x877bd459c9b7d8576b44e59e09d076c25946f443"
|
|
||||||
},
|
|
||||||
"blockHash": "0xf641c3b0f82b07cd3a528adb9927dd83eeb4f1682e2bd523ed36888e0d82c9a9",
|
|
||||||
"blockNumber": 553154,
|
|
||||||
"subtraces": 0,
|
|
||||||
"traceAddress": [
|
|
||||||
0
|
|
||||||
],
|
|
||||||
"transactionHash": "0x6af0a5c3188ffacae4d340d4a17e14fdb5a54187683a80ef241bde248189882b",
|
|
||||||
"transactionPosition": 15,
|
|
||||||
"type": "suicide"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -1,58 +0,0 @@
|
||||||
{
|
|
||||||
"context": {
|
|
||||||
"difficulty": "3755480783",
|
|
||||||
"gasLimit": "5401723",
|
|
||||||
"miner": "0xd049bfd667cb46aa3ef5df0da3e57db3be39e511",
|
|
||||||
"number": "2294702",
|
|
||||||
"timestamp": "1513676146"
|
|
||||||
},
|
|
||||||
"genesis": {
|
|
||||||
"alloc": {
|
|
||||||
"0x13e4acefe6a6700604929946e70e6443e4e73447": {
|
|
||||||
"balance": "0xcf3e0938579f000",
|
|
||||||
"code": "0x",
|
|
||||||
"nonce": "9",
|
|
||||||
"storage": {}
|
|
||||||
},
|
|
||||||
"0x7dc9c9730689ff0b0fd506c67db815f12d90a448": {
|
|
||||||
"balance": "0x0",
|
|
||||||
"code": "0x",
|
|
||||||
"nonce": "0",
|
|
||||||
"storage": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"byzantiumBlock": 1700000,
|
|
||||||
"chainId": 3,
|
|
||||||
"daoForkSupport": true,
|
|
||||||
"eip150Block": 0,
|
|
||||||
"eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
|
|
||||||
"eip155Block": 10,
|
|
||||||
"eip158Block": 10,
|
|
||||||
"ethash": {},
|
|
||||||
"homesteadBlock": 0
|
|
||||||
},
|
|
||||||
"difficulty": "3757315409",
|
|
||||||
"extraData": "0x566961425443",
|
|
||||||
"gasLimit": "5406414",
|
|
||||||
"hash": "0xae107f592eebdd9ff8d6ba00363676096e6afb0e1007a7d3d0af88173077378d",
|
|
||||||
"miner": "0xd049bfd667cb46aa3ef5df0da3e57db3be39e511",
|
|
||||||
"mixHash": "0xc927aa05a38bc3de864e95c33b3ae559d3f39c4ccd51cef6f113f9c50ba0caf1",
|
|
||||||
"nonce": "0x93363bbd2c95f410",
|
|
||||||
"number": "2294701",
|
|
||||||
"stateRoot": "0x6b6737d5bde8058990483e915866bd1578014baeff57bd5e4ed228a2bfad635c",
|
|
||||||
"timestamp": "1513676127",
|
|
||||||
"totalDifficulty": "7160808139332585"
|
|
||||||
},
|
|
||||||
"input": "0xf907ef098504e3b29200830897be8080b9079c606060405260405160208061077c83398101604052808051906020019091905050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415151561007d57600080fd5b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600460006101000a81548160ff02191690831515021790555050610653806101296000396000f300606060405260043610610083576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806305e4382a146100855780631c02708d146100ae5780632e1a7d4d146100c35780635114cb52146100e6578063a37dda2c146100fe578063ae200e7914610153578063b5769f70146101a8575b005b341561009057600080fd5b6100986101d1565b6040518082815260200191505060405180910390f35b34156100b957600080fd5b6100c16101d7565b005b34156100ce57600080fd5b6100e460048080359060200190919050506102eb565b005b6100fc6004808035906020019091905050610513565b005b341561010957600080fd5b6101116105d6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015e57600080fd5b6101666105fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101b357600080fd5b6101bb610621565b6040518082815260200191505060405180910390f35b60025481565b60011515600460009054906101000a900460ff1615151415156101f957600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102a15750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156102ac57600080fd5b6000600460006101000a81548160ff0219169083151502179055506003543073ffffffffffffffffffffffffffffffffffffffff163103600281905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806103935750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561039e57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561048357600060025411801561040757506002548111155b151561041257600080fd5b80600254036002819055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561047e57600080fd5b610510565b600060035411801561049757506003548111155b15156104a257600080fd5b8060035403600381905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561050f57600080fd5b5b50565b60011515600460009054906101000a900460ff16151514151561053557600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614801561059657506003548160035401115b80156105bd575080600354013073ffffffffffffffffffffffffffffffffffffffff163110155b15156105c857600080fd5b806003540160038190555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600354815600a165627a7a72305820c3b849e8440987ce43eae3097b77672a69234d516351368b03fe5b7de03807910029000000000000000000000000c65e620a3a55451316168d57e268f5702ef56a1129a01060f46676a5dff6f407f0f51eb6f37f5c8c54e238c70221e18e65fc29d3ea65a0557b01c50ff4ffaac8ed6e5d31237a4ecbac843ab1bfe8bb0165a0060df7c54f",
|
|
||||||
"result": {
|
|
||||||
"from": "0x13e4acefe6a6700604929946e70e6443e4e73447",
|
|
||||||
"gas": "0x897be",
|
|
||||||
"gasUsed": "0x897be",
|
|
||||||
"input": "0x606060405260405160208061077c83398101604052808051906020019091905050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415151561007d57600080fd5b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600460006101000a81548160ff02191690831515021790555050610653806101296000396000f300606060405260043610610083576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806305e4382a146100855780631c02708d146100ae5780632e1a7d4d146100c35780635114cb52146100e6578063a37dda2c146100fe578063ae200e7914610153578063b5769f70146101a8575b005b341561009057600080fd5b6100986101d1565b6040518082815260200191505060405180910390f35b34156100b957600080fd5b6100c16101d7565b005b34156100ce57600080fd5b6100e460048080359060200190919050506102eb565b005b6100fc6004808035906020019091905050610513565b005b341561010957600080fd5b6101116105d6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015e57600080fd5b6101666105fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101b357600080fd5b6101bb610621565b6040518082815260200191505060405180910390f35b60025481565b60011515600460009054906101000a900460ff1615151415156101f957600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102a15750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156102ac57600080fd5b6000600460006101000a81548160ff0219169083151502179055506003543073ffffffffffffffffffffffffffffffffffffffff163103600281905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806103935750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561039e57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561048357600060025411801561040757506002548111155b151561041257600080fd5b80600254036002819055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561047e57600080fd5b610510565b600060035411801561049757506003548111155b15156104a257600080fd5b8060035403600381905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561050f57600080fd5b5b50565b60011515600460009054906101000a900460ff16151514151561053557600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614801561059657506003548160035401115b80156105bd575080600354013073ffffffffffffffffffffffffffffffffffffffff163110155b15156105c857600080fd5b806003540160038190555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600354815600a165627a7a72305820c3b849e8440987ce43eae3097b77672a69234d516351368b03fe5b7de03807910029000000000000000000000000c65e620a3a55451316168d57e268f5702ef56a11",
|
|
||||||
"output": "0x606060405260043610610083576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806305e4382a146100855780631c02708d146100ae5780632e1a7d4d146100c35780635114cb52146100e6578063a37dda2c146100fe578063ae200e7914610153578063b5769f70146101a8575b005b341561009057600080fd5b6100986101d1565b6040518082815260200191505060405180910390f35b34156100b957600080fd5b6100c16101d7565b005b34156100ce57600080fd5b6100e460048080359060200190919050506102eb565b005b6100fc6004808035906020019091905050610513565b005b341561010957600080fd5b6101116105d6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015e57600080fd5b6101666105fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101b357600080fd5b6101bb610621565b6040518082815260200191505060405180910390f35b60025481565b60011515600460009054906101000a900460ff1615151415156101f957600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102a15750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156102ac57600080fd5b6000600460006101000a81548160ff0219169083151502179055506003543073ffffffffffffffffffffffffffffffffffffffff163103600281905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806103935750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561039e57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561048357600060025411801561040757506002548111155b151561041257600080fd5b80600254036002819055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561047e57600080fd5b610510565b600060035411801561049757506003548111155b15156104a257600080fd5b8060035403600381905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561050f57600080fd5b5b50565b60011515600460009054906101000a900460ff16151514151561053557600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614801561059657506003548160035401115b80156105bd575080600354013073ffffffffffffffffffffffffffffffffffffffff163110155b15156105c857600080fd5b806003540160038190555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600354815600a165627a7a72305820c3b849e8440987ce43eae3097b77672a69234d516351368b03fe5b7de03807910029",
|
|
||||||
"to": "0x7dc9c9730689ff0b0fd506c67db815f12d90a448",
|
|
||||||
"type": "CREATE",
|
|
||||||
"value": "0x0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -1,72 +0,0 @@
|
||||||
{
|
|
||||||
"genesis": {
|
|
||||||
"difficulty": "117067574",
|
|
||||||
"extraData": "0xd783010502846765746887676f312e372e33856c696e7578",
|
|
||||||
"gasLimit": "4712380",
|
|
||||||
"hash": "0xe05db05eeb3f288041ecb10a787df121c0ed69499355716e17c307de313a4486",
|
|
||||||
"miner": "0x0c062b329265c965deef1eede55183b3acb8f611",
|
|
||||||
"mixHash": "0xb669ae39118a53d2c65fd3b1e1d3850dd3f8c6842030698ed846a2762d68b61d",
|
|
||||||
"nonce": "0x2b469722b8e28c45",
|
|
||||||
"number": "24973",
|
|
||||||
"stateRoot": "0x532a5c3f75453a696428db078e32ae283c85cb97e4d8560dbdf022adac6df369",
|
|
||||||
"timestamp": "1479891145",
|
|
||||||
"totalDifficulty": "1892250259406",
|
|
||||||
"alloc": {
|
|
||||||
"0x6c06b16512b332e6cd8293a2974872674716ce18": {
|
|
||||||
"balance": "0x0",
|
|
||||||
"nonce": "1",
|
|
||||||
"code": "0x60606040526000357c0100000000000000000000000000000000000000000000000000000000900480632e1a7d4d146036575b6000565b34600057604e60048080359060200190919050506050565b005b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051809050600060405180830381858888f19350505050505b5056",
|
|
||||||
"storage": {}
|
|
||||||
},
|
|
||||||
"0x66fdfd05e46126a07465ad24e40cc0597bc1ef31": {
|
|
||||||
"balance": "0x229ebbb36c3e0f20",
|
|
||||||
"nonce": "3",
|
|
||||||
"code": "0x",
|
|
||||||
"storage": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"chainId": 3,
|
|
||||||
"homesteadBlock": 0,
|
|
||||||
"daoForkSupport": true,
|
|
||||||
"eip150Block": 0,
|
|
||||||
"eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
|
|
||||||
"eip155Block": 10,
|
|
||||||
"eip158Block": 10,
|
|
||||||
"byzantiumBlock": 1700000,
|
|
||||||
"constantinopleBlock": 4230000,
|
|
||||||
"petersburgBlock": 4939394,
|
|
||||||
"istanbulBlock": 6485846,
|
|
||||||
"muirGlacierBlock": 7117117,
|
|
||||||
"ethash": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"context": {
|
|
||||||
"number": "24974",
|
|
||||||
"difficulty": "117067574",
|
|
||||||
"timestamp": "1479891162",
|
|
||||||
"gasLimit": "4712388",
|
|
||||||
"miner": "0xc822ef32e6d26e170b70cf761e204c1806265914"
|
|
||||||
},
|
|
||||||
"input": "0xf889038504a81557008301f97e946c06b16512b332e6cd8293a2974872674716ce1880a42e1a7d4d00000000000000000000000000000000000000000000000014d1120d7b1600002aa0e2a6558040c5d72bc59f2fb62a38993a314c849cd22fb393018d2c5af3112095a01bdb6d7ba32263ccc2ecc880d38c49d9f0c5a72d8b7908e3122b31356d349745",
|
|
||||||
"result": {
|
|
||||||
"type": "CALL",
|
|
||||||
"from": "0x66fdfd05e46126a07465ad24e40cc0597bc1ef31",
|
|
||||||
"to": "0x6c06b16512b332e6cd8293a2974872674716ce18",
|
|
||||||
"value": "0x0",
|
|
||||||
"gas": "0x1f97e",
|
|
||||||
"gasUsed": "0x72de",
|
|
||||||
"input": "0x2e1a7d4d00000000000000000000000000000000000000000000000014d1120d7b160000",
|
|
||||||
"output": "0x",
|
|
||||||
"calls": [
|
|
||||||
{
|
|
||||||
"type": "CALL",
|
|
||||||
"from": "0x6c06b16512b332e6cd8293a2974872674716ce18",
|
|
||||||
"to": "0x66fdfd05e46126a07465ad24e40cc0597bc1ef31",
|
|
||||||
"value": "0x14d1120d7b160000",
|
|
||||||
"error": "internal failure",
|
|
||||||
"input": "0x"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -1,58 +0,0 @@
|
||||||
{
|
|
||||||
"context": {
|
|
||||||
"difficulty": "3665057456",
|
|
||||||
"gasLimit": "5232723",
|
|
||||||
"miner": "0xf4d8e706cfb25c0decbbdd4d2e2cc10c66376a3f",
|
|
||||||
"number": "2294501",
|
|
||||||
"timestamp": "1513673601"
|
|
||||||
},
|
|
||||||
"genesis": {
|
|
||||||
"alloc": {
|
|
||||||
"0x0f6cef2b7fbb504782e35aa82a2207e816a2b7a9": {
|
|
||||||
"balance": "0x2a3fc32bcc019283",
|
|
||||||
"code": "0x",
|
|
||||||
"nonce": "10",
|
|
||||||
"storage": {}
|
|
||||||
},
|
|
||||||
"0xabbcd5b340c80b5f1c0545c04c987b87310296ae": {
|
|
||||||
"balance": "0x0",
|
|
||||||
"code": "0x606060405236156100755763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416632d0335ab811461007a578063548db174146100ab5780637f649783146100fc578063b092145e1461014d578063c3f44c0a14610186578063c47cf5de14610203575b600080fd5b341561008557600080fd5b610099600160a060020a0360043516610270565b60405190815260200160405180910390f35b34156100b657600080fd5b6100fa600460248135818101908301358060208181020160405190810160405280939291908181526020018383602002808284375094965061028f95505050505050565b005b341561010757600080fd5b6100fa600460248135818101908301358060208181020160405190810160405280939291908181526020018383602002808284375094965061029e95505050505050565b005b341561015857600080fd5b610172600160a060020a03600435811690602435166102ad565b604051901515815260200160405180910390f35b341561019157600080fd5b6100fa6004803560ff1690602480359160443591606435600160a060020a0316919060a49060843590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965050509235600160a060020a031692506102cd915050565b005b341561020e57600080fd5b61025460046024813581810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965061056a95505050505050565b604051600160a060020a03909116815260200160405180910390f35b600160a060020a0381166000908152602081905260409020545b919050565b61029a816000610594565b5b50565b61029a816001610594565b5b50565b600160209081526000928352604080842090915290825290205460ff1681565b60008080600160a060020a038416158061030d5750600160a060020a038085166000908152600160209081526040808320339094168352929052205460ff165b151561031857600080fd5b6103218561056a565b600160a060020a038116600090815260208190526040808220549295507f19000000000000000000000000000000000000000000000000000000000000009230918891908b908b90517fff000000000000000000000000000000000000000000000000000000000000008089168252871660018201526c01000000000000000000000000600160a060020a038088168202600284015286811682026016840152602a8301869052841602604a820152605e810182805190602001908083835b6020831061040057805182525b601f1990920191602091820191016103e0565b6001836020036101000a0380198251168184511617909252505050919091019850604097505050505050505051809103902091506001828a8a8a6040516000815260200160405260006040516020015260405193845260ff90921660208085019190915260408085019290925260608401929092526080909201915160208103908084039060008661646e5a03f1151561049957600080fd5b5050602060405103519050600160a060020a03838116908216146104bc57600080fd5b600160a060020a0380841660009081526020819052604090819020805460010190559087169086905180828051906020019080838360005b8381101561050d5780820151818401525b6020016104f4565b50505050905090810190601f16801561053a5780820380516001836020036101000a031916815260200191505b5091505060006040518083038160008661646e5a03f1915050151561055e57600080fd5b5b505050505050505050565b600060248251101561057e5750600061028a565b600160a060020a0360248301511690505b919050565b60005b825181101561060157600160a060020a033316600090815260016020526040812083918584815181106105c657fe5b90602001906020020151600160a060020a031681526020810191909152604001600020805460ff19169115159190911790555b600101610597565b5b5050505600a165627a7a723058200027e8b695e9d2dea9f3629519022a69f3a1d23055ce86406e686ea54f31ee9c0029",
|
|
||||||
"nonce": "1",
|
|
||||||
"storage": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"byzantiumBlock": 1700000,
|
|
||||||
"chainId": 3,
|
|
||||||
"daoForkSupport": true,
|
|
||||||
"eip150Block": 0,
|
|
||||||
"eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
|
|
||||||
"eip155Block": 10,
|
|
||||||
"eip158Block": 10,
|
|
||||||
"ethash": {},
|
|
||||||
"homesteadBlock": 0
|
|
||||||
},
|
|
||||||
"difficulty": "3672229776",
|
|
||||||
"extraData": "0x4554482e45544846414e532e4f52472d4641313738394444",
|
|
||||||
"gasLimit": "5227619",
|
|
||||||
"hash": "0xa07b3d6c6bf63f5f981016db9f2d1d93033833f2c17e8bf7209e85f1faf08076",
|
|
||||||
"miner": "0xbbf5029fd710d227630c8b7d338051b8e76d50b3",
|
|
||||||
"mixHash": "0x806e151ce2817be922e93e8d5921fa0f0d0fd213d6b2b9a3fa17458e74a163d0",
|
|
||||||
"nonce": "0xbc5d43adc2c30c7d",
|
|
||||||
"number": "2294500",
|
|
||||||
"stateRoot": "0xca645b335888352ef9d8b1ef083e9019648180b259026572e3139717270de97d",
|
|
||||||
"timestamp": "1513673552",
|
|
||||||
"totalDifficulty": "7160066586979149"
|
|
||||||
},
|
|
||||||
"input": "0xf9018b0a8505d21dba00832dc6c094abbcd5b340c80b5f1c0545c04c987b87310296ae80b9012473b40a5c000000000000000000000000400de2e016bda6577407dfc379faba9899bc73ef0000000000000000000000002cc31912b2b0f3075a87b3640923d45a26cef3ee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000064d79d8e6c7265636f76657279416464726573730000000000000000000000000000000000000000000000000000000000383e3ec32dc0f66d8fe60dbdc2f6815bdf73a988383e3ec32dc0f66d8fe60dbdc2f6815bdf73a988000000000000000000000000000000000000000000000000000000000000000000000000000000001ba0fd659d76a4edbd2a823e324c93f78ad6803b30ff4a9c8bce71ba82798975c70ca06571eecc0b765688ec6c78942c5ee8b585e00988c0141b518287e9be919bc48a",
|
|
||||||
"result": {
|
|
||||||
"error": "execution reverted",
|
|
||||||
"from": "0x0f6cef2b7fbb504782e35aa82a2207e816a2b7a9",
|
|
||||||
"gas": "0x2dc6c0",
|
|
||||||
"gasUsed": "0x719b",
|
|
||||||
"input": "0x73b40a5c000000000000000000000000400de2e016bda6577407dfc379faba9899bc73ef0000000000000000000000002cc31912b2b0f3075a87b3640923d45a26cef3ee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000064d79d8e6c7265636f76657279416464726573730000000000000000000000000000000000000000000000000000000000383e3ec32dc0f66d8fe60dbdc2f6815bdf73a988383e3ec32dc0f66d8fe60dbdc2f6815bdf73a98800000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
|
||||||
"to": "0xabbcd5b340c80b5f1c0545c04c987b87310296ae",
|
|
||||||
"type": "CALL",
|
|
||||||
"value": "0x0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -1,73 +0,0 @@
|
||||||
{
|
|
||||||
"context": {
|
|
||||||
"difficulty": "3502894804",
|
|
||||||
"gasLimit": "4722976",
|
|
||||||
"miner": "0x1585936b53834b021f68cc13eeefdec2efc8e724",
|
|
||||||
"number": "2289806",
|
|
||||||
"timestamp": "1513601314"
|
|
||||||
},
|
|
||||||
"genesis": {
|
|
||||||
"alloc": {
|
|
||||||
"0x0024f658a46fbb89d8ac105e98d7ac7cbbaf27c5": {
|
|
||||||
"balance": "0x0",
|
|
||||||
"code": "0x",
|
|
||||||
"nonce": "22",
|
|
||||||
"storage": {}
|
|
||||||
},
|
|
||||||
"0x3b873a919aa0512d5a0f09e6dcceaa4a6727fafe": {
|
|
||||||
"balance": "0x4d87094125a369d9bd5",
|
|
||||||
"code": "0x61deadff",
|
|
||||||
"nonce": "1",
|
|
||||||
"storage": {}
|
|
||||||
},
|
|
||||||
"0xb436ba50d378d4bbc8660d312a13df6af6e89dfb": {
|
|
||||||
"balance": "0x1780d77678137ac1b775",
|
|
||||||
"code": "0x",
|
|
||||||
"nonce": "29072",
|
|
||||||
"storage": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"byzantiumBlock": 1700000,
|
|
||||||
"chainId": 3,
|
|
||||||
"daoForkSupport": true,
|
|
||||||
"eip150Block": 0,
|
|
||||||
"eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
|
|
||||||
"eip155Block": 10,
|
|
||||||
"eip158Block": 10,
|
|
||||||
"ethash": {},
|
|
||||||
"homesteadBlock": 0
|
|
||||||
},
|
|
||||||
"difficulty": "3509749784",
|
|
||||||
"extraData": "0x4554482e45544846414e532e4f52472d4641313738394444",
|
|
||||||
"gasLimit": "4727564",
|
|
||||||
"hash": "0x609948ac3bd3c00b7736b933248891d6c901ee28f066241bddb28f4e00a9f440",
|
|
||||||
"miner": "0xbbf5029fd710d227630c8b7d338051b8e76d50b3",
|
|
||||||
"mixHash": "0xb131e4507c93c7377de00e7c271bf409ec7492767142ff0f45c882f8068c2ada",
|
|
||||||
"nonce": "0x4eb12e19c16d43da",
|
|
||||||
"number": "2289805",
|
|
||||||
"stateRoot": "0xc7f10f352bff82fac3c2999d3085093d12652e19c7fd32591de49dc5d91b4f1f",
|
|
||||||
"timestamp": "1513601261",
|
|
||||||
"totalDifficulty": "7143276353481064"
|
|
||||||
},
|
|
||||||
"input": "0xf88b8271908506fc23ac0083015f90943b873a919aa0512d5a0f09e6dcceaa4a6727fafe80a463e4bff40000000000000000000000000024f658a46fbb89d8ac105e98d7ac7cbbaf27c52aa0bdce0b59e8761854e857fe64015f06dd08a4fbb7624f6094893a79a72e6ad6bea01d9dde033cff7bb235a3163f348a6d7ab8d6b52bc0963a95b91612e40ca766a4",
|
|
||||||
"result": {
|
|
||||||
"calls": [
|
|
||||||
{
|
|
||||||
"from": "0x3b873a919aa0512d5a0f09e6dcceaa4a6727fafe",
|
|
||||||
"input": "0x",
|
|
||||||
"to": "0x000000000000000000000000000000000000dEaD",
|
|
||||||
"type": "SELFDESTRUCT",
|
|
||||||
"value": "0x4d87094125a369d9bd5"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"from": "0xb436ba50d378d4bbc8660d312a13df6af6e89dfb",
|
|
||||||
"gas": "0x15f90",
|
|
||||||
"gasUsed": "0x6fcb",
|
|
||||||
"input": "0x63e4bff40000000000000000000000000024f658a46fbb89d8ac105e98d7ac7cbbaf27c5",
|
|
||||||
"output": "0x",
|
|
||||||
"to": "0x3b873a919aa0512d5a0f09e6dcceaa4a6727fafe",
|
|
||||||
"type": "CALL",
|
|
||||||
"value": "0x0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,78 +0,0 @@
|
||||||
{
|
|
||||||
"context": {
|
|
||||||
"difficulty": "3502894804",
|
|
||||||
"gasLimit": "4722976",
|
|
||||||
"miner": "0x1585936b53834b021f68cc13eeefdec2efc8e724",
|
|
||||||
"number": "2289806",
|
|
||||||
"timestamp": "1513601314"
|
|
||||||
},
|
|
||||||
"genesis": {
|
|
||||||
"alloc": {
|
|
||||||
"0x0024f658a46fbb89d8ac105e98d7ac7cbbaf27c5": {
|
|
||||||
"balance": "0x0",
|
|
||||||
"code": "0x",
|
|
||||||
"nonce": "22",
|
|
||||||
"storage": {}
|
|
||||||
},
|
|
||||||
"0x3b873a919aa0512d5a0f09e6dcceaa4a6727fafe": {
|
|
||||||
"balance": "0x4d87094125a369d9bd5",
|
|
||||||
"code": "0x606060405236156100935763ffffffff60e060020a60003504166311ee8382811461009c57806313af4035146100be5780631f5e8f4c146100ee57806324daddc5146101125780634921a91a1461013b57806363e4bff414610157578063764978f91461017f578063893d20e8146101a1578063ba40aaa1146101cd578063cebc9a82146101f4578063e177246e14610216575b61009a5b5b565b005b34156100a457fe5b6100ac61023d565b60408051918252519081900360200190f35b34156100c657fe5b6100da600160a060020a0360043516610244565b604080519115158252519081900360200190f35b34156100f657fe5b6100da610307565b604080519115158252519081900360200190f35b341561011a57fe5b6100da6004351515610318565b604080519115158252519081900360200190f35b6100da6103d6565b604080519115158252519081900360200190f35b6100da600160a060020a0360043516610420565b604080519115158252519081900360200190f35b341561018757fe5b6100ac61046c565b60408051918252519081900360200190f35b34156101a957fe5b6101b1610473565b60408051600160a060020a039092168252519081900360200190f35b34156101d557fe5b6100da600435610483565b604080519115158252519081900360200190f35b34156101fc57fe5b6100ac61050d565b60408051918252519081900360200190f35b341561021e57fe5b6100da600435610514565b604080519115158252519081900360200190f35b6003545b90565b60006000610250610473565b600160a060020a031633600160a060020a03161415156102705760006000fd5b600160a060020a03831615156102865760006000fd5b50600054600160a060020a0390811690831681146102fb57604051600160a060020a0380851691908316907ffcf23a92150d56e85e3a3d33b357493246e55783095eb6a733eb8439ffc752c890600090a360008054600160a060020a031916600160a060020a03851617905560019150610300565b600091505b5b50919050565b60005460a060020a900460ff165b90565b60006000610324610473565b600160a060020a031633600160a060020a03161415156103445760006000fd5b5060005460a060020a900460ff16801515831515146102fb576000546040805160a060020a90920460ff1615158252841515602083015280517fe6cd46a119083b86efc6884b970bfa30c1708f53ba57b86716f15b2f4551a9539281900390910190a16000805460a060020a60ff02191660a060020a8515150217905560019150610300565b600091505b5b50919050565b60006103e0610307565b801561040557506103ef610473565b600160a060020a031633600160a060020a031614155b156104105760006000fd5b610419336105a0565b90505b5b90565b600061042a610307565b801561044f5750610439610473565b600160a060020a031633600160a060020a031614155b1561045a5760006000fd5b610463826105a0565b90505b5b919050565b6001545b90565b600054600160a060020a03165b90565b6000600061048f610473565b600160a060020a031633600160a060020a03161415156104af5760006000fd5b506001548281146102fb57604080518281526020810185905281517f79a3746dde45672c9e8ab3644b8bb9c399a103da2dc94b56ba09777330a83509929181900390910190a160018381559150610300565b600091505b5b50919050565b6002545b90565b60006000610520610473565b600160a060020a031633600160a060020a03161415156105405760006000fd5b506002548281146102fb57604080518281526020810185905281517ff6991a728965fedd6e927fdf16bdad42d8995970b4b31b8a2bf88767516e2494929181900390910190a1600283905560019150610300565b600091505b5b50919050565b60006000426105ad61023d565b116102fb576105c46105bd61050d565b4201610652565b6105cc61046c565b604051909150600160a060020a038416908290600081818185876187965a03f1925050501561063d57604080518281529051600160a060020a038516917f9bca65ce52fdef8a470977b51f247a2295123a4807dfa9e502edf0d30722da3b919081900360200190a260019150610300565b6102fb42610652565b5b600091505b50919050565b60038190555b505600a165627a7a72305820f3c973c8b7ed1f62000b6701bd5b708469e19d0f1d73fde378a56c07fd0b19090029",
|
|
||||||
"nonce": "1",
|
|
||||||
"storage": {
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000001b436ba50d378d4bbc8660d312a13df6af6e89dfb",
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000001": "0x00000000000000000000000000000000000000000000000006f05b59d3b20000",
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000002": "0x000000000000000000000000000000000000000000000000000000000000003c",
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000003": "0x000000000000000000000000000000000000000000000000000000005a37b834"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"0xb436ba50d378d4bbc8660d312a13df6af6e89dfb": {
|
|
||||||
"balance": "0x1780d77678137ac1b775",
|
|
||||||
"code": "0x",
|
|
||||||
"nonce": "29072",
|
|
||||||
"storage": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"byzantiumBlock": 1700000,
|
|
||||||
"chainId": 3,
|
|
||||||
"daoForkSupport": true,
|
|
||||||
"eip150Block": 0,
|
|
||||||
"eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
|
|
||||||
"eip155Block": 10,
|
|
||||||
"eip158Block": 10,
|
|
||||||
"ethash": {},
|
|
||||||
"homesteadBlock": 0
|
|
||||||
},
|
|
||||||
"difficulty": "3509749784",
|
|
||||||
"extraData": "0x4554482e45544846414e532e4f52472d4641313738394444",
|
|
||||||
"gasLimit": "4727564",
|
|
||||||
"hash": "0x609948ac3bd3c00b7736b933248891d6c901ee28f066241bddb28f4e00a9f440",
|
|
||||||
"miner": "0xbbf5029fd710d227630c8b7d338051b8e76d50b3",
|
|
||||||
"mixHash": "0xb131e4507c93c7377de00e7c271bf409ec7492767142ff0f45c882f8068c2ada",
|
|
||||||
"nonce": "0x4eb12e19c16d43da",
|
|
||||||
"number": "2289805",
|
|
||||||
"stateRoot": "0xc7f10f352bff82fac3c2999d3085093d12652e19c7fd32591de49dc5d91b4f1f",
|
|
||||||
"timestamp": "1513601261",
|
|
||||||
"totalDifficulty": "7143276353481064"
|
|
||||||
},
|
|
||||||
"input": "0xf88b8271908506fc23ac0083015f90943b873a919aa0512d5a0f09e6dcceaa4a6727fafe80a463e4bff40000000000000000000000000024f658a46fbb89d8ac105e98d7ac7cbbaf27c52aa0bdce0b59e8761854e857fe64015f06dd08a4fbb7624f6094893a79a72e6ad6bea01d9dde033cff7bb235a3163f348a6d7ab8d6b52bc0963a95b91612e40ca766a4",
|
|
||||||
"result": {
|
|
||||||
"calls": [
|
|
||||||
{
|
|
||||||
"from": "0x3b873a919aa0512d5a0f09e6dcceaa4a6727fafe",
|
|
||||||
"input": "0x",
|
|
||||||
"to": "0x0024f658a46fbb89d8ac105e98d7ac7cbbaf27c5",
|
|
||||||
"type": "CALL",
|
|
||||||
"value": "0x6f05b59d3b20000"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"from": "0xb436ba50d378d4bbc8660d312a13df6af6e89dfb",
|
|
||||||
"gas": "0x15f90",
|
|
||||||
"gasUsed": "0x9751",
|
|
||||||
"input": "0x63e4bff40000000000000000000000000024f658a46fbb89d8ac105e98d7ac7cbbaf27c5",
|
|
||||||
"output": "0x0000000000000000000000000000000000000000000000000000000000000001",
|
|
||||||
"to": "0x3b873a919aa0512d5a0f09e6dcceaa4a6727fafe",
|
|
||||||
"type": "CALL",
|
|
||||||
"value": "0x0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -1,85 +0,0 @@
|
||||||
{
|
|
||||||
"genesis": {
|
|
||||||
"difficulty": "8430028481555",
|
|
||||||
"extraData": "0xd783010302844765746887676f312e352e31856c696e7578",
|
|
||||||
"gasLimit": "3141592",
|
|
||||||
"hash": "0xde66937783697293f2e529d2034887c531535d78afa8c9051511ae12ba48fbea",
|
|
||||||
"miner": "0x2a65aca4d5fc5b5c859090a6c34d164135398226",
|
|
||||||
"mixHash": "0xba28a43bfbca4a2effbb76bb70d03482a8a0c92e2883ff36cbac3d7c6dbb7df5",
|
|
||||||
"nonce": "0xa3827ec0a82fe823",
|
|
||||||
"number": "765824",
|
|
||||||
"stateRoot": "0x8d96cb027a29f8ca0ccd6d31f9ea0656136ec8030ecda70bb9231849ed6f41a2",
|
|
||||||
"timestamp": "1451389443",
|
|
||||||
"totalDifficulty": "4838314986494741271",
|
|
||||||
"alloc": {
|
|
||||||
"0xd1220a0cf47c7b9be7a2e6ba89f429762e7b9adb": {
|
|
||||||
"balance": "0x14203bee2ea6fbe8c",
|
|
||||||
"nonce": "34"
|
|
||||||
},
|
|
||||||
"0xe2fe6b13287f28e193333fdfe7fedf2f6df6124a": {
|
|
||||||
"balance": "0x2717a9c870a286f4350"
|
|
||||||
},
|
|
||||||
"0xf4eced2f682ce333f96f2d8966c613ded8fc95dd": {
|
|
||||||
"balance": "0x0",
|
|
||||||
"code": "0x606060405260e060020a600035046306fdde038114610047578063313ce567146100a457806370a08231146100b057806395d89b41146100c8578063a9059cbb14610123575b005b61015260008054602060026001831615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156101f55780601f106101ca576101008083540402835291602001916101f5565b6101c060025460ff1681565b6101c060043560036020526000908152604090205481565b610152600180546020601f6002600019610100858716150201909316929092049182018190040260809081016040526060828152929190828280156101f55780601f106101ca576101008083540402835291602001916101f5565b610045600435602435600160a060020a033316600090815260036020526040902054819010156101fd57610002565b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600302600f01f150905090810190601f1680156101b25780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6060908152602090f35b820191906000526020600020905b8154815290600101906020018083116101d857829003601f168201915b505050505081565b600160a060020a03821660009081526040902054808201101561021f57610002565b806003600050600033600160a060020a03168152602001908152602001600020600082828250540392505081905550806003600050600084600160a060020a0316815260200190815260200160002060008282825054019250508190555081600160a060020a031633600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505056",
|
|
||||||
"storage": {
|
|
||||||
"0x1dae8253445d3a5edbe8200da9fc39bc4f11db9362181dc1b640d08c3c2fb4d6": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
|
||||||
"0x8ba52aac7f255d80a49abcf003d6af4752aba5a9531cae94fde7ac8d72191d67": "0x000000000000000000000000000000000000000000000000000000000178e460"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"chainId": 1,
|
|
||||||
"homesteadBlock": 1150000,
|
|
||||||
"daoForkBlock": 1920000,
|
|
||||||
"daoForkSupport": true,
|
|
||||||
"eip150Block": 2463000,
|
|
||||||
"eip150Hash": "0x2086799aeebeae135c246c65021c82b4e15a2c451340993aacfd2751886514f0",
|
|
||||||
"eip155Block": 2675000,
|
|
||||||
"eip158Block": 2675000,
|
|
||||||
"byzantiumBlock": 4370000,
|
|
||||||
"constantinopleBlock": 7280000,
|
|
||||||
"petersburgBlock": 7280000,
|
|
||||||
"istanbulBlock": 9069000,
|
|
||||||
"muirGlacierBlock": 9200000,
|
|
||||||
"berlinBlock": 12244000,
|
|
||||||
"londonBlock": 12965000,
|
|
||||||
"arrowGlacierBlock": 13773000,
|
|
||||||
"grayGlacierBlock": 15050000,
|
|
||||||
"terminalTotalDifficultyPassed": true,
|
|
||||||
"ethash": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"context": {
|
|
||||||
"number": "765825",
|
|
||||||
"difficulty": "8425912256743",
|
|
||||||
"timestamp": "1451389488",
|
|
||||||
"gasLimit": "3141592",
|
|
||||||
"miner": "0xe2fe6b13287f28e193333fdfe7fedf2f6df6124a"
|
|
||||||
},
|
|
||||||
"input": "0xf8aa22850ba43b740083024d4594f4eced2f682ce333f96f2d8966c613ded8fc95dd80b844a9059cbb000000000000000000000000dbf03b407c01e7cd3cbea99509d93f8dddc8c6fb00000000000000000000000000000000000000000000000000000000009896801ca067da548a2e0f381a957b9b51f086073375d6bfc7312cbc9540b3647ccab7db11a042c6e5b34bc7ba821e9c25b166fa13d82ad4b0d044d16174d5587d4f04ecfcd1",
|
|
||||||
"tracerConfig": {
|
|
||||||
"withLog": true
|
|
||||||
},
|
|
||||||
"result": {
|
|
||||||
"from": "0xd1220a0cf47c7b9be7a2e6ba89f429762e7b9adb",
|
|
||||||
"gas": "0x24d45",
|
|
||||||
"gasUsed": "0xc6a5",
|
|
||||||
"to": "0xf4eced2f682ce333f96f2d8966c613ded8fc95dd",
|
|
||||||
"input": "0xa9059cbb000000000000000000000000dbf03b407c01e7cd3cbea99509d93f8dddc8c6fb0000000000000000000000000000000000000000000000000000000000989680",
|
|
||||||
"logs": [
|
|
||||||
{
|
|
||||||
"address": "0xf4eced2f682ce333f96f2d8966c613ded8fc95dd",
|
|
||||||
"topics": [
|
|
||||||
"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
|
|
||||||
"0x000000000000000000000000d1220a0cf47c7b9be7a2e6ba89f429762e7b9adb",
|
|
||||||
"0x000000000000000000000000dbf03b407c01e7cd3cbea99509d93f8dddc8c6fb"
|
|
||||||
],
|
|
||||||
"data": "0x0000000000000000000000000000000000000000000000000000000000989680",
|
|
||||||
"position": "0x0"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"value": "0x0",
|
|
||||||
"type": "CALL"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -1,85 +0,0 @@
|
||||||
{
|
|
||||||
"genesis": {
|
|
||||||
"difficulty": "6217248151198",
|
|
||||||
"extraData": "0xd783010103844765746887676f312e342e32856c696e7578",
|
|
||||||
"gasLimit": "3141592",
|
|
||||||
"hash": "0xe8bff55fe3e61936ef321cf3afaeb1ba2f7234e1e89535fa8ae39963caebe9c3",
|
|
||||||
"miner": "0x52bc44d5378309ee2abf1539bf71de1b7d7be3b5",
|
|
||||||
"mixHash": "0x03da00d5a15a064e5ebddf53cd0aaeb9a8aff0f40c0fb031a74f463d11ec83b8",
|
|
||||||
"nonce": "0x6575fe08c4167044",
|
|
||||||
"number": "243825",
|
|
||||||
"stateRoot": "0x47182fe2e6e740b8a76f82fe5c527d6ad548f805274f21792cf4047235b24fbf",
|
|
||||||
"timestamp": "1442424328",
|
|
||||||
"totalDifficulty": "1035061827427752845",
|
|
||||||
"alloc": {
|
|
||||||
"0x082d4cdf07f386ffa9258f52a5c49db4ac321ec6": {
|
|
||||||
"balance": "0xc820f93200f4000",
|
|
||||||
"nonce": "0x5E",
|
|
||||||
"code": "0x"
|
|
||||||
},
|
|
||||||
"0x332b656504f4eabb44c8617a42af37461a34e9dc": {
|
|
||||||
"balance": "0x11faea4f35e5af80000",
|
|
||||||
"code": "0x"
|
|
||||||
},
|
|
||||||
"0x52bc44d5378309ee2abf1539bf71de1b7d7be3b5": {
|
|
||||||
"balance": "0xbf681825be002ac452",
|
|
||||||
"nonce": "0x70FA",
|
|
||||||
"code": "0x"
|
|
||||||
},
|
|
||||||
"0x82effbaaaf28614e55b2ba440fb198e0e5789b0f": {
|
|
||||||
"balance": "0xb3d0ac5cb94df6f6b0",
|
|
||||||
"nonce": "0x1",
|
|
||||||
"code": "0x"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"chainId": 1,
|
|
||||||
"homesteadBlock": 1150000,
|
|
||||||
"daoForkBlock": 1920000,
|
|
||||||
"daoForkSupport": true,
|
|
||||||
"eip150Block": 2463000,
|
|
||||||
"eip150Hash": "0x2086799aeebeae135c246c65021c82b4e15a2c451340993aacfd2751886514f0",
|
|
||||||
"eip155Block": 2675000,
|
|
||||||
"eip158Block": 2675000,
|
|
||||||
"byzantiumBlock": 4370000,
|
|
||||||
"constantinopleBlock": 7280000,
|
|
||||||
"petersburgBlock": 7280000,
|
|
||||||
"istanbulBlock": 9069000,
|
|
||||||
"muirGlacierBlock": 9200000,
|
|
||||||
"berlinBlock": 12244000,
|
|
||||||
"londonBlock": 12965000,
|
|
||||||
"arrowGlacierBlock": 13773000,
|
|
||||||
"grayGlacierBlock": 15050000,
|
|
||||||
"terminalTotalDifficultyPassed": true,
|
|
||||||
"ethash": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"context": {
|
|
||||||
"number": "243826",
|
|
||||||
"difficulty": "6214212385501",
|
|
||||||
"timestamp": "1442424353",
|
|
||||||
"gasLimit": "3141592",
|
|
||||||
"miner": "0x52bc44d5378309ee2abf1539bf71de1b7d7be3b5"
|
|
||||||
},
|
|
||||||
"input": "0xf8e85e850ba43b7400830f42408080b89660606040527382effbaaaf28614e55b2ba440fb198e0e5789b0f600060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908302179055505b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b600a80608c6000396000f30060606040526008565b001ca0340b21661e5bb85a46319a15f33a362e5c0f02faa7cdbf9c5808b2134da968eaa0226e6788f8c20e211d436ab7f6298ef32fa4c23a509eeeaac0880d115c17bc3f",
|
|
||||||
"result": {
|
|
||||||
"0x082d4cdf07f386ffa9258f52a5c49db4ac321ec6": {
|
|
||||||
"balance": "0xc820f93200f4000",
|
|
||||||
"nonce": 94
|
|
||||||
},
|
|
||||||
"0x332b656504f4eabb44c8617a42af37461a34e9dc": {
|
|
||||||
"balance": "0x11faea4f35e5af80000",
|
|
||||||
"storage": {
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000000000"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"0x52bc44d5378309ee2abf1539bf71de1b7d7be3b5": {
|
|
||||||
"balance": "0xbf681825be002ac452",
|
|
||||||
"nonce": 28922
|
|
||||||
},
|
|
||||||
"0x82effbaaaf28614e55b2ba440fb198e0e5789b0f": {
|
|
||||||
"balance": "0xb3d0ac5cb94df6f6b0",
|
|
||||||
"nonce": 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,83 +0,0 @@
|
||||||
{
|
|
||||||
"context": {
|
|
||||||
"difficulty": "3502894804",
|
|
||||||
"gasLimit": "4722976",
|
|
||||||
"miner": "0x1585936b53834b021f68cc13eeefdec2efc8e724",
|
|
||||||
"number": "2289806",
|
|
||||||
"timestamp": "1513601314"
|
|
||||||
},
|
|
||||||
"genesis": {
|
|
||||||
"alloc": {
|
|
||||||
"0x0024f658a46fbb89d8ac105e98d7ac7cbbaf27c5": {
|
|
||||||
"balance": "0x0",
|
|
||||||
"code": "0x",
|
|
||||||
"nonce": "22",
|
|
||||||
"storage": {}
|
|
||||||
},
|
|
||||||
"0x3b873a919aa0512d5a0f09e6dcceaa4a6727fafe": {
|
|
||||||
"balance": "0x4d87094125a369d9bd5",
|
|
||||||
"code": "0x606060405236156100935763ffffffff60e060020a60003504166311ee8382811461009c57806313af4035146100be5780631f5e8f4c146100ee57806324daddc5146101125780634921a91a1461013b57806363e4bff414610157578063764978f91461017f578063893d20e8146101a1578063ba40aaa1146101cd578063cebc9a82146101f4578063e177246e14610216575b61009a5b5b565b005b34156100a457fe5b6100ac61023d565b60408051918252519081900360200190f35b34156100c657fe5b6100da600160a060020a0360043516610244565b604080519115158252519081900360200190f35b34156100f657fe5b6100da610307565b604080519115158252519081900360200190f35b341561011a57fe5b6100da6004351515610318565b604080519115158252519081900360200190f35b6100da6103d6565b604080519115158252519081900360200190f35b6100da600160a060020a0360043516610420565b604080519115158252519081900360200190f35b341561018757fe5b6100ac61046c565b60408051918252519081900360200190f35b34156101a957fe5b6101b1610473565b60408051600160a060020a039092168252519081900360200190f35b34156101d557fe5b6100da600435610483565b604080519115158252519081900360200190f35b34156101fc57fe5b6100ac61050d565b60408051918252519081900360200190f35b341561021e57fe5b6100da600435610514565b604080519115158252519081900360200190f35b6003545b90565b60006000610250610473565b600160a060020a031633600160a060020a03161415156102705760006000fd5b600160a060020a03831615156102865760006000fd5b50600054600160a060020a0390811690831681146102fb57604051600160a060020a0380851691908316907ffcf23a92150d56e85e3a3d33b357493246e55783095eb6a733eb8439ffc752c890600090a360008054600160a060020a031916600160a060020a03851617905560019150610300565b600091505b5b50919050565b60005460a060020a900460ff165b90565b60006000610324610473565b600160a060020a031633600160a060020a03161415156103445760006000fd5b5060005460a060020a900460ff16801515831515146102fb576000546040805160a060020a90920460ff1615158252841515602083015280517fe6cd46a119083b86efc6884b970bfa30c1708f53ba57b86716f15b2f4551a9539281900390910190a16000805460a060020a60ff02191660a060020a8515150217905560019150610300565b600091505b5b50919050565b60006103e0610307565b801561040557506103ef610473565b600160a060020a031633600160a060020a031614155b156104105760006000fd5b610419336105a0565b90505b5b90565b600061042a610307565b801561044f5750610439610473565b600160a060020a031633600160a060020a031614155b1561045a5760006000fd5b610463826105a0565b90505b5b919050565b6001545b90565b600054600160a060020a03165b90565b6000600061048f610473565b600160a060020a031633600160a060020a03161415156104af5760006000fd5b506001548281146102fb57604080518281526020810185905281517f79a3746dde45672c9e8ab3644b8bb9c399a103da2dc94b56ba09777330a83509929181900390910190a160018381559150610300565b600091505b5b50919050565b6002545b90565b60006000610520610473565b600160a060020a031633600160a060020a03161415156105405760006000fd5b506002548281146102fb57604080518281526020810185905281517ff6991a728965fedd6e927fdf16bdad42d8995970b4b31b8a2bf88767516e2494929181900390910190a1600283905560019150610300565b600091505b5b50919050565b60006000426105ad61023d565b116102fb576105c46105bd61050d565b4201610652565b6105cc61046c565b604051909150600160a060020a038416908290600081818185876187965a03f1925050501561063d57604080518281529051600160a060020a038516917f9bca65ce52fdef8a470977b51f247a2295123a4807dfa9e502edf0d30722da3b919081900360200190a260019150610300565b6102fb42610652565b5b600091505b50919050565b60038190555b505600a165627a7a72305820f3c973c8b7ed1f62000b6701bd5b708469e19d0f1d73fde378a56c07fd0b19090029",
|
|
||||||
"nonce": "1",
|
|
||||||
"storage": {
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000001b436ba50d378d4bbc8660d312a13df6af6e89dfb",
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000001": "0x00000000000000000000000000000000000000000000000006f05b59d3b20000",
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000002": "0x000000000000000000000000000000000000000000000000000000000000003c",
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000003": "0x000000000000000000000000000000000000000000000000000000005a37b834"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"0xb436ba50d378d4bbc8660d312a13df6af6e89dfb": {
|
|
||||||
"balance": "0x1780d77678137ac1b775",
|
|
||||||
"code": "0x",
|
|
||||||
"nonce": "29072",
|
|
||||||
"storage": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"byzantiumBlock": 1700000,
|
|
||||||
"chainId": 3,
|
|
||||||
"daoForkSupport": true,
|
|
||||||
"eip150Block": 0,
|
|
||||||
"eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
|
|
||||||
"eip155Block": 10,
|
|
||||||
"eip158Block": 10,
|
|
||||||
"ethash": {},
|
|
||||||
"homesteadBlock": 0
|
|
||||||
},
|
|
||||||
"difficulty": "3509749784",
|
|
||||||
"extraData": "0x4554482e45544846414e532e4f52472d4641313738394444",
|
|
||||||
"gasLimit": "4727564",
|
|
||||||
"hash": "0x609948ac3bd3c00b7736b933248891d6c901ee28f066241bddb28f4e00a9f440",
|
|
||||||
"miner": "0xbbf5029fd710d227630c8b7d338051b8e76d50b3",
|
|
||||||
"mixHash": "0xb131e4507c93c7377de00e7c271bf409ec7492767142ff0f45c882f8068c2ada",
|
|
||||||
"nonce": "0x4eb12e19c16d43da",
|
|
||||||
"number": "2289805",
|
|
||||||
"stateRoot": "0xc7f10f352bff82fac3c2999d3085093d12652e19c7fd32591de49dc5d91b4f1f",
|
|
||||||
"timestamp": "1513601261",
|
|
||||||
"totalDifficulty": "7143276353481064"
|
|
||||||
},
|
|
||||||
"input": "0xf88b8271908506fc23ac0083015f90943b873a919aa0512d5a0f09e6dcceaa4a6727fafe80a463e4bff40000000000000000000000000024f658a46fbb89d8ac105e98d7ac7cbbaf27c52aa0bdce0b59e8761854e857fe64015f06dd08a4fbb7624f6094893a79a72e6ad6bea01d9dde033cff7bb235a3163f348a6d7ab8d6b52bc0963a95b91612e40ca766a4",
|
|
||||||
"result": {
|
|
||||||
"0x0024f658a46fbb89d8ac105e98d7ac7cbbaf27c5": {
|
|
||||||
"balance": "0x0",
|
|
||||||
"nonce": 22
|
|
||||||
},
|
|
||||||
"0x3b873a919aa0512d5a0f09e6dcceaa4a6727fafe": {
|
|
||||||
"balance": "0x4d87094125a369d9bd5",
|
|
||||||
"nonce": 1,
|
|
||||||
"code": "0x606060405236156100935763ffffffff60e060020a60003504166311ee8382811461009c57806313af4035146100be5780631f5e8f4c146100ee57806324daddc5146101125780634921a91a1461013b57806363e4bff414610157578063764978f91461017f578063893d20e8146101a1578063ba40aaa1146101cd578063cebc9a82146101f4578063e177246e14610216575b61009a5b5b565b005b34156100a457fe5b6100ac61023d565b60408051918252519081900360200190f35b34156100c657fe5b6100da600160a060020a0360043516610244565b604080519115158252519081900360200190f35b34156100f657fe5b6100da610307565b604080519115158252519081900360200190f35b341561011a57fe5b6100da6004351515610318565b604080519115158252519081900360200190f35b6100da6103d6565b604080519115158252519081900360200190f35b6100da600160a060020a0360043516610420565b604080519115158252519081900360200190f35b341561018757fe5b6100ac61046c565b60408051918252519081900360200190f35b34156101a957fe5b6101b1610473565b60408051600160a060020a039092168252519081900360200190f35b34156101d557fe5b6100da600435610483565b604080519115158252519081900360200190f35b34156101fc57fe5b6100ac61050d565b60408051918252519081900360200190f35b341561021e57fe5b6100da600435610514565b604080519115158252519081900360200190f35b6003545b90565b60006000610250610473565b600160a060020a031633600160a060020a03161415156102705760006000fd5b600160a060020a03831615156102865760006000fd5b50600054600160a060020a0390811690831681146102fb57604051600160a060020a0380851691908316907ffcf23a92150d56e85e3a3d33b357493246e55783095eb6a733eb8439ffc752c890600090a360008054600160a060020a031916600160a060020a03851617905560019150610300565b600091505b5b50919050565b60005460a060020a900460ff165b90565b60006000610324610473565b600160a060020a031633600160a060020a03161415156103445760006000fd5b5060005460a060020a900460ff16801515831515146102fb576000546040805160a060020a90920460ff1615158252841515602083015280517fe6cd46a119083b86efc6884b970bfa30c1708f53ba57b86716f15b2f4551a9539281900390910190a16000805460a060020a60ff02191660a060020a8515150217905560019150610300565b600091505b5b50919050565b60006103e0610307565b801561040557506103ef610473565b600160a060020a031633600160a060020a031614155b156104105760006000fd5b610419336105a0565b90505b5b90565b600061042a610307565b801561044f5750610439610473565b600160a060020a031633600160a060020a031614155b1561045a5760006000fd5b610463826105a0565b90505b5b919050565b6001545b90565b600054600160a060020a03165b90565b6000600061048f610473565b600160a060020a031633600160a060020a03161415156104af5760006000fd5b506001548281146102fb57604080518281526020810185905281517f79a3746dde45672c9e8ab3644b8bb9c399a103da2dc94b56ba09777330a83509929181900390910190a160018381559150610300565b600091505b5b50919050565b6002545b90565b60006000610520610473565b600160a060020a031633600160a060020a03161415156105405760006000fd5b506002548281146102fb57604080518281526020810185905281517ff6991a728965fedd6e927fdf16bdad42d8995970b4b31b8a2bf88767516e2494929181900390910190a1600283905560019150610300565b600091505b5b50919050565b60006000426105ad61023d565b116102fb576105c46105bd61050d565b4201610652565b6105cc61046c565b604051909150600160a060020a038416908290600081818185876187965a03f1925050501561063d57604080518281529051600160a060020a038516917f9bca65ce52fdef8a470977b51f247a2295123a4807dfa9e502edf0d30722da3b919081900360200190a260019150610300565b6102fb42610652565b5b600091505b50919050565b60038190555b505600a165627a7a72305820f3c973c8b7ed1f62000b6701bd5b708469e19d0f1d73fde378a56c07fd0b19090029",
|
|
||||||
"storage": {
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000001b436ba50d378d4bbc8660d312a13df6af6e89dfb",
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000001": "0x00000000000000000000000000000000000000000000000006f05b59d3b20000",
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000002": "0x000000000000000000000000000000000000000000000000000000000000003c",
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000003": "0x000000000000000000000000000000000000000000000000000000005a37b834"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"0xb436ba50d378d4bbc8660d312a13df6af6e89dfb": {
|
|
||||||
"balance": "0x1780d77678137ac1b775",
|
|
||||||
"nonce": 29072
|
|
||||||
},
|
|
||||||
"0x1585936b53834b021f68cc13eeefdec2efc8e724": {
|
|
||||||
"balance": "0x0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,84 +0,0 @@
|
||||||
{
|
|
||||||
"context": {
|
|
||||||
"difficulty": "3502894804",
|
|
||||||
"gasLimit": "4722976",
|
|
||||||
"miner": "0x1585936b53834b021f68cc13eeefdec2efc8e724",
|
|
||||||
"number": "2289806",
|
|
||||||
"timestamp": "1513601314"
|
|
||||||
},
|
|
||||||
"genesis": {
|
|
||||||
"alloc": {
|
|
||||||
"0x0024f658a46fbb89d8ac105e98d7ac7cbbaf27c5": {
|
|
||||||
"balance": "0x0",
|
|
||||||
"code": "0x",
|
|
||||||
"nonce": "22",
|
|
||||||
"storage": {}
|
|
||||||
},
|
|
||||||
"0x3b873a919aa0512d5a0f09e6dcceaa4a6727fafe": {
|
|
||||||
"balance": "0x4d87094125a369d9bd5",
|
|
||||||
"code": "0x606060405236156100935763ffffffff60e060020a60003504166311ee8382811461009c57806313af4035146100be5780631f5e8f4c146100ee57806324daddc5146101125780634921a91a1461013b57806363e4bff414610157578063764978f91461017f578063893d20e8146101a1578063ba40aaa1146101cd578063cebc9a82146101f4578063e177246e14610216575b61009a5b5b565b005b34156100a457fe5b6100ac61023d565b60408051918252519081900360200190f35b34156100c657fe5b6100da600160a060020a0360043516610244565b604080519115158252519081900360200190f35b34156100f657fe5b6100da610307565b604080519115158252519081900360200190f35b341561011a57fe5b6100da6004351515610318565b604080519115158252519081900360200190f35b6100da6103d6565b604080519115158252519081900360200190f35b6100da600160a060020a0360043516610420565b604080519115158252519081900360200190f35b341561018757fe5b6100ac61046c565b60408051918252519081900360200190f35b34156101a957fe5b6101b1610473565b60408051600160a060020a039092168252519081900360200190f35b34156101d557fe5b6100da600435610483565b604080519115158252519081900360200190f35b34156101fc57fe5b6100ac61050d565b60408051918252519081900360200190f35b341561021e57fe5b6100da600435610514565b604080519115158252519081900360200190f35b6003545b90565b60006000610250610473565b600160a060020a031633600160a060020a03161415156102705760006000fd5b600160a060020a03831615156102865760006000fd5b50600054600160a060020a0390811690831681146102fb57604051600160a060020a0380851691908316907ffcf23a92150d56e85e3a3d33b357493246e55783095eb6a733eb8439ffc752c890600090a360008054600160a060020a031916600160a060020a03851617905560019150610300565b600091505b5b50919050565b60005460a060020a900460ff165b90565b60006000610324610473565b600160a060020a031633600160a060020a03161415156103445760006000fd5b5060005460a060020a900460ff16801515831515146102fb576000546040805160a060020a90920460ff1615158252841515602083015280517fe6cd46a119083b86efc6884b970bfa30c1708f53ba57b86716f15b2f4551a9539281900390910190a16000805460a060020a60ff02191660a060020a8515150217905560019150610300565b600091505b5b50919050565b60006103e0610307565b801561040557506103ef610473565b600160a060020a031633600160a060020a031614155b156104105760006000fd5b610419336105a0565b90505b5b90565b600061042a610307565b801561044f5750610439610473565b600160a060020a031633600160a060020a031614155b1561045a5760006000fd5b610463826105a0565b90505b5b919050565b6001545b90565b600054600160a060020a03165b90565b6000600061048f610473565b600160a060020a031633600160a060020a03161415156104af5760006000fd5b506001548281146102fb57604080518281526020810185905281517f79a3746dde45672c9e8ab3644b8bb9c399a103da2dc94b56ba09777330a83509929181900390910190a160018381559150610300565b600091505b5b50919050565b6002545b90565b60006000610520610473565b600160a060020a031633600160a060020a03161415156105405760006000fd5b506002548281146102fb57604080518281526020810185905281517ff6991a728965fedd6e927fdf16bdad42d8995970b4b31b8a2bf88767516e2494929181900390910190a1600283905560019150610300565b600091505b5b50919050565b60006000426105ad61023d565b116102fb576105c46105bd61050d565b4201610652565b6105cc61046c565b604051909150600160a060020a038416908290600081818185876187965a03f1925050501561063d57604080518281529051600160a060020a038516917f9bca65ce52fdef8a470977b51f247a2295123a4807dfa9e502edf0d30722da3b919081900360200190a260019150610300565b6102fb42610652565b5b600091505b50919050565b60038190555b505600a165627a7a72305820f3c973c8b7ed1f62000b6701bd5b708469e19d0f1d73fde378a56c07fd0b19090029",
|
|
||||||
"nonce": "1",
|
|
||||||
"storage": {
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000001b436ba50d378d4bbc8660d312a13df6af6e89dfb",
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000001": "0x00000000000000000000000000000000000000000000000006f05b59d3b20000",
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000002": "0x000000000000000000000000000000000000000000000000000000000000003c",
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000003": "0x000000000000000000000000000000000000000000000000000000005a37b834"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"0xb436ba50d378d4bbc8660d312a13df6af6e89dfb": {
|
|
||||||
"balance": "0x1780d77678137ac1b775",
|
|
||||||
"code": "0x",
|
|
||||||
"nonce": "29072",
|
|
||||||
"storage": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"byzantiumBlock": 1700000,
|
|
||||||
"chainId": 3,
|
|
||||||
"daoForkSupport": true,
|
|
||||||
"eip150Block": 0,
|
|
||||||
"eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
|
|
||||||
"eip155Block": 10,
|
|
||||||
"eip158Block": 10,
|
|
||||||
"ethash": {},
|
|
||||||
"homesteadBlock": 0
|
|
||||||
},
|
|
||||||
"difficulty": "3509749784",
|
|
||||||
"extraData": "0x4554482e45544846414e532e4f52472d4641313738394444",
|
|
||||||
"gasLimit": "4727564",
|
|
||||||
"hash": "0x609948ac3bd3c00b7736b933248891d6c901ee28f066241bddb28f4e00a9f440",
|
|
||||||
"miner": "0xbbf5029fd710d227630c8b7d338051b8e76d50b3",
|
|
||||||
"mixHash": "0xb131e4507c93c7377de00e7c271bf409ec7492767142ff0f45c882f8068c2ada",
|
|
||||||
"nonce": "0x4eb12e19c16d43da",
|
|
||||||
"number": "2289805",
|
|
||||||
"stateRoot": "0xc7f10f352bff82fac3c2999d3085093d12652e19c7fd32591de49dc5d91b4f1f",
|
|
||||||
"timestamp": "1513601261",
|
|
||||||
"totalDifficulty": "7143276353481064"
|
|
||||||
},
|
|
||||||
"input": "0xf88b8271908506fc23ac0083015f90943b873a919aa0512d5a0f09e6dcceaa4a6727fafe80a463e4bff40000000000000000000000000024f658a46fbb89d8ac105e98d7ac7cbbaf27c52aa0bdce0b59e8761854e857fe64015f06dd08a4fbb7624f6094893a79a72e6ad6bea01d9dde033cff7bb235a3163f348a6d7ab8d6b52bc0963a95b91612e40ca766a4",
|
|
||||||
"result": {
|
|
||||||
"0x0024f658a46fbb89d8ac105e98d7ac7cbbaf27c5": {
|
|
||||||
"balance": "0x0",
|
|
||||||
"code": "0x",
|
|
||||||
"nonce": 22,
|
|
||||||
"storage": {}
|
|
||||||
},
|
|
||||||
"0x3b873a919aa0512d5a0f09e6dcceaa4a6727fafe": {
|
|
||||||
"balance": "0x4d87094125a369d9bd5",
|
|
||||||
"code": "0x606060405236156100935763ffffffff60e060020a60003504166311ee8382811461009c57806313af4035146100be5780631f5e8f4c146100ee57806324daddc5146101125780634921a91a1461013b57806363e4bff414610157578063764978f91461017f578063893d20e8146101a1578063ba40aaa1146101cd578063cebc9a82146101f4578063e177246e14610216575b61009a5b5b565b005b34156100a457fe5b6100ac61023d565b60408051918252519081900360200190f35b34156100c657fe5b6100da600160a060020a0360043516610244565b604080519115158252519081900360200190f35b34156100f657fe5b6100da610307565b604080519115158252519081900360200190f35b341561011a57fe5b6100da6004351515610318565b604080519115158252519081900360200190f35b6100da6103d6565b604080519115158252519081900360200190f35b6100da600160a060020a0360043516610420565b604080519115158252519081900360200190f35b341561018757fe5b6100ac61046c565b60408051918252519081900360200190f35b34156101a957fe5b6101b1610473565b60408051600160a060020a039092168252519081900360200190f35b34156101d557fe5b6100da600435610483565b604080519115158252519081900360200190f35b34156101fc57fe5b6100ac61050d565b60408051918252519081900360200190f35b341561021e57fe5b6100da600435610514565b604080519115158252519081900360200190f35b6003545b90565b60006000610250610473565b600160a060020a031633600160a060020a03161415156102705760006000fd5b600160a060020a03831615156102865760006000fd5b50600054600160a060020a0390811690831681146102fb57604051600160a060020a0380851691908316907ffcf23a92150d56e85e3a3d33b357493246e55783095eb6a733eb8439ffc752c890600090a360008054600160a060020a031916600160a060020a03851617905560019150610300565b600091505b5b50919050565b60005460a060020a900460ff165b90565b60006000610324610473565b600160a060020a031633600160a060020a03161415156103445760006000fd5b5060005460a060020a900460ff16801515831515146102fb576000546040805160a060020a90920460ff1615158252841515602083015280517fe6cd46a119083b86efc6884b970bfa30c1708f53ba57b86716f15b2f4551a9539281900390910190a16000805460a060020a60ff02191660a060020a8515150217905560019150610300565b600091505b5b50919050565b60006103e0610307565b801561040557506103ef610473565b600160a060020a031633600160a060020a031614155b156104105760006000fd5b610419336105a0565b90505b5b90565b600061042a610307565b801561044f5750610439610473565b600160a060020a031633600160a060020a031614155b1561045a5760006000fd5b610463826105a0565b90505b5b919050565b6001545b90565b600054600160a060020a03165b90565b6000600061048f610473565b600160a060020a031633600160a060020a03161415156104af5760006000fd5b506001548281146102fb57604080518281526020810185905281517f79a3746dde45672c9e8ab3644b8bb9c399a103da2dc94b56ba09777330a83509929181900390910190a160018381559150610300565b600091505b5b50919050565b6002545b90565b60006000610520610473565b600160a060020a031633600160a060020a03161415156105405760006000fd5b506002548281146102fb57604080518281526020810185905281517ff6991a728965fedd6e927fdf16bdad42d8995970b4b31b8a2bf88767516e2494929181900390910190a1600283905560019150610300565b600091505b5b50919050565b60006000426105ad61023d565b116102fb576105c46105bd61050d565b4201610652565b6105cc61046c565b604051909150600160a060020a038416908290600081818185876187965a03f1925050501561063d57604080518281529051600160a060020a038516917f9bca65ce52fdef8a470977b51f247a2295123a4807dfa9e502edf0d30722da3b919081900360200190a260019150610300565b6102fb42610652565b5b600091505b50919050565b60038190555b505600a165627a7a72305820f3c973c8b7ed1f62000b6701bd5b708469e19d0f1d73fde378a56c07fd0b19090029",
|
|
||||||
"nonce": 1,
|
|
||||||
"storage": {
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000001b436ba50d378d4bbc8660d312a13df6af6e89dfb",
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000001": "0x00000000000000000000000000000000000000000000000006f05b59d3b20000",
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000002": "0x000000000000000000000000000000000000000000000000000000000000003c",
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000003": "0x000000000000000000000000000000000000000000000000000000005a37b834"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"0xb436ba50d378d4bbc8660d312a13df6af6e89dfb": {
|
|
||||||
"balance": "0x1780d77678137ac1b775",
|
|
||||||
"code": "0x",
|
|
||||||
"nonce": 29072,
|
|
||||||
"storage": {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,102 +0,0 @@
|
||||||
{
|
|
||||||
"genesis": {
|
|
||||||
"difficulty": "13756228101629",
|
|
||||||
"extraData": "0xd983010302844765746887676f312e342e328777696e646f7773",
|
|
||||||
"gasLimit": "3141592",
|
|
||||||
"hash": "0x58b7a87b6ba10b46b4e251d64ebc3d9822dd82218eaf24dff6796f6f1f687251",
|
|
||||||
"miner": "0xf8b483dba2c3b7176a3da549ad41a48bb3121069",
|
|
||||||
"mixHash": "0x5984b9a316116bd890e6e5f4c52d655184b0d7aa74821e1382d7760f9803c1dd",
|
|
||||||
"nonce": "0xea4bb4997242c681",
|
|
||||||
"number": "1061221",
|
|
||||||
"stateRoot": "0x5402c04d481414248d824c3b61e924e0c9307adbc9fbaae774a74cce30a4163d",
|
|
||||||
"timestamp": "1456458069",
|
|
||||||
"totalDifficulty": "7930751135586064334",
|
|
||||||
"alloc": {
|
|
||||||
"0x2a65aca4d5fc5b5c859090a6c34d164135398226": {
|
|
||||||
"balance": "0x9fb6b81e112638b886",
|
|
||||||
"nonce": "217865",
|
|
||||||
"code": "0x"
|
|
||||||
},
|
|
||||||
"0xf0c5cef39b17c213cfe090a46b8c7760ffb7928a": {
|
|
||||||
"balance": "0x15b6828e22bb12188",
|
|
||||||
"nonce": "747",
|
|
||||||
"code": "0x"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"chainId": 1,
|
|
||||||
"homesteadBlock": 1150000,
|
|
||||||
"daoForkBlock": 1920000,
|
|
||||||
"daoForkSupport": true,
|
|
||||||
"eip150Block": 2463000,
|
|
||||||
"eip150Hash": "0x2086799aeebeae135c246c65021c82b4e15a2c451340993aacfd2751886514f0",
|
|
||||||
"eip155Block": 2675000,
|
|
||||||
"eip158Block": 2675000,
|
|
||||||
"byzantiumBlock": 4370000,
|
|
||||||
"constantinopleBlock": 7280000,
|
|
||||||
"petersburgBlock": 7280000,
|
|
||||||
"istanbulBlock": 9069000,
|
|
||||||
"muirGlacierBlock": 9200000,
|
|
||||||
"berlinBlock": 12244000,
|
|
||||||
"londonBlock": 12965000,
|
|
||||||
"arrowGlacierBlock": 13773000,
|
|
||||||
"grayGlacierBlock": 15050000,
|
|
||||||
"ethash": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"context": {
|
|
||||||
"number": "1061222",
|
|
||||||
"difficulty": "13749511193633",
|
|
||||||
"timestamp": "1456458097",
|
|
||||||
"gasLimit": "3141592",
|
|
||||||
"miner": "0x2a65aca4d5fc5b5c859090a6c34d164135398226"
|
|
||||||
},
|
|
||||||
"input": "0xf905498202eb850ba43b7400830f42408080b904f460606040526040516102b43803806102b48339016040526060805160600190602001505b5b33600060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908302179055505b806001600050908051906020019082805482825590600052602060002090601f01602090048101928215609e579182015b82811115609d5782518260005055916020019190600101906081565b5b50905060c5919060a9565b8082111560c1576000818150600090555060010160a9565b5090565b50505b506101dc806100d86000396000f30060606040526000357c01000000000000000000000000000000000000000000000000000000009004806341c0e1b514610044578063cfae32171461005157610042565b005b61004f6004506100ca565b005b61005c60045061015e565b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600302600f01f150905090810190601f1680156100bc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561015b57600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b5b565b60206040519081016040528060008152602001506001600050805480601f016020809104026020016040519081016040528092919081815260200182805480156101cd57820191906000526020600020905b8154815290600101906020018083116101b057829003601f168201915b505050505090506101d9565b9056000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001ee7b225f6964223a225a473466784a7245323639384866623839222c22666f726d5f736f75726365223a22434c54523031222c22636f6d6d69746d656e745f64617465223a22222c22626f72726f7765725f6e616d65223a22222c22626f72726f7765725f616464726573735f6c696e6531223a22222c22626f72726f7765725f616464726573735f6c696e6532223a22222c22626f72726f7765725f636f6e74616374223a22222c22626f72726f7765725f7374617465223a22222c22626f72726f7765725f74797065223a22222c2270726f70657274795f61646472657373223a22222c226c6f616e5f616d6f756e745f7772697474656e223a22222c226c6f616e5f616d6f756e74223a22222c224c54565f7772697474656e223a22222c224c5456223a22222c2244534352223a22222c2270726f70657274795f74797065223a22222c2270726f70657274795f6465736372697074696f6e223a22222c226c656e646572223a22222c2267756172616e746f7273223a22222c226c696d69746564223a22222c226361705f616d6f756e74223a22222c226361705f70657263656e745f7772697474656e223a22222c226361705f70657263656e74616765223a22222c227465726d5f7772697474656e223a22222c227465726d223a22222c22657874656e64223a22227d0000000000000000000000000000000000001ba027d54712289af34f0ec0f06092745104d68e5801cd17097bc1104111f855258da070ec9f1c942d9bedf89f9660a684d3bb8cd9c2ac7f6dd883cb3e26a193180244",
|
|
||||||
"tracerConfig": {
|
|
||||||
"diffMode": true
|
|
||||||
},
|
|
||||||
"result": {
|
|
||||||
"pre": {
|
|
||||||
"0x2a65aca4d5fc5b5c859090a6c34d164135398226": {
|
|
||||||
"balance": "0x9fb6b81e112638b886",
|
|
||||||
"nonce": 217865
|
|
||||||
},
|
|
||||||
"0xf0c5cef39b17c213cfe090a46b8c7760ffb7928a": {
|
|
||||||
"balance": "0x15b6828e22bb12188",
|
|
||||||
"nonce": 747
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"post": {
|
|
||||||
"0x2a65aca4d5fc5b5c859090a6c34d164135398226": {
|
|
||||||
"balance": "0x9fb71abdd2621d8886"
|
|
||||||
},
|
|
||||||
"0x40f2f445da6c9047554683fb382fba6769717116": {
|
|
||||||
"code": "0x60606040526000357c01000000000000000000000000000000000000000000000000000000009004806341c0e1b514610044578063cfae32171461005157610042565b005b61004f6004506100ca565b005b61005c60045061015e565b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600302600f01f150905090810190601f1680156100bc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561015b57600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b5b565b60206040519081016040528060008152602001506001600050805480601f016020809104026020016040519081016040528092919081815260200182805480156101cd57820191906000526020600020905b8154815290600101906020018083116101b057829003601f168201915b505050505090506101d9565b9056",
|
|
||||||
"storage": {
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000f0c5cef39b17c213cfe090a46b8c7760ffb7928a",
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000001": "0x00000000000000000000000000000000000000000000000000000000000001ee",
|
|
||||||
"0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6": "0x7b225f6964223a225a473466784a7245323639384866623839222c22666f726d",
|
|
||||||
"0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf7": "0x5f736f75726365223a22434c54523031222c22636f6d6d69746d656e745f6461",
|
|
||||||
"0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf8": "0x7465223a22222c22626f72726f7765725f6e616d65223a22222c22626f72726f",
|
|
||||||
"0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf9": "0x7765725f616464726573735f6c696e6531223a22222c22626f72726f7765725f",
|
|
||||||
"0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cfa": "0x616464726573735f6c696e6532223a22222c22626f72726f7765725f636f6e74",
|
|
||||||
"0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cfb": "0x616374223a22222c22626f72726f7765725f7374617465223a22222c22626f72",
|
|
||||||
"0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cfc": "0x726f7765725f74797065223a22222c2270726f70657274795f61646472657373",
|
|
||||||
"0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cfd": "0x223a22222c226c6f616e5f616d6f756e745f7772697474656e223a22222c226c",
|
|
||||||
"0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cfe": "0x6f616e5f616d6f756e74223a22222c224c54565f7772697474656e223a22222c",
|
|
||||||
"0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cff": "0x224c5456223a22222c2244534352223a22222c2270726f70657274795f747970",
|
|
||||||
"0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d00": "0x65223a22222c2270726f70657274795f6465736372697074696f6e223a22222c",
|
|
||||||
"0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d01": "0x226c656e646572223a22222c2267756172616e746f7273223a22222c226c696d",
|
|
||||||
"0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d02": "0x69746564223a22222c226361705f616d6f756e74223a22222c226361705f7065",
|
|
||||||
"0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d03": "0x7263656e745f7772697474656e223a22222c226361705f70657263656e746167",
|
|
||||||
"0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d04": "0x65223a22222c227465726d5f7772697474656e223a22222c227465726d223a22",
|
|
||||||
"0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d05": "0x222c22657874656e64223a22227d000000000000000000000000000000000000"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"0xf0c5cef39b17c213cfe090a46b8c7760ffb7928a": {
|
|
||||||
"balance": "0x15b058920efcc5188",
|
|
||||||
"nonce": 748
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,94 +0,0 @@
|
||||||
{
|
|
||||||
"genesis": {
|
|
||||||
"baseFeePerGas": "51088069741",
|
|
||||||
"difficulty": "14315558652874667",
|
|
||||||
"extraData": "0xd883010a10846765746888676f312e31362e35856c696e7578",
|
|
||||||
"gasLimit": "30058590",
|
|
||||||
"hash": "0xdf6b95183f99054fb6541e3b482c0109c9f6be40553cff24efa3ac76736adbf5",
|
|
||||||
"miner": "0xb7e390864a90b7b923c9f9310c6f98aafe43f707",
|
|
||||||
"mixHash": "0x8d76b0d32e42ab277dbf00836eabef76674cd70ae2bb53718175069ad6b6147e",
|
|
||||||
"nonce": "0x8d3a1c010ad2c687",
|
|
||||||
"number": "14707767",
|
|
||||||
"stateRoot": "0x8a50c896a6f7eb1f3479337db981fa10ce316281cb4dd2f07487be9ca27dae6b",
|
|
||||||
"timestamp": "1651623275",
|
|
||||||
"alloc": {
|
|
||||||
"0x0000000000000000000000000000000000000000": {
|
|
||||||
"balance": "0x268fd0b894b8c4f6d1f"
|
|
||||||
},
|
|
||||||
"0x13b152c9f50878ffaf3de41e192653bda545d889": {
|
|
||||||
"balance": "0x0",
|
|
||||||
"nonce": "1",
|
|
||||||
"code": "0x363d3d373d3d3d363d73059ffafdc6ef594230de44f824e2bd0a51ca5ded5af43d82803e903d91602b57fd5bf3"
|
|
||||||
},
|
|
||||||
"0x808b4da0be6c9512e948521452227efc619bea52": {
|
|
||||||
"balance": "0x2cdb96c56db040b43",
|
|
||||||
"nonce": "1223932"
|
|
||||||
},
|
|
||||||
"0x8f03f1a3f10c05e7cccf75c1fd10168e06659be7": {
|
|
||||||
"balance": "0x38079b28689d40240e",
|
|
||||||
"nonce": "44"
|
|
||||||
},
|
|
||||||
"0xffa397285ce46fb78c588a9e993286aac68c37cd": {
|
|
||||||
"balance": "0x0",
|
|
||||||
"nonce": "747319",
|
|
||||||
"code": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c8063b97a23191461003b578063fb90b3201461006f575b600080fd5b6100436100bd565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6100bb6004803603604081101561008557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506100e1565b005b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008282604051602001808373ffffffffffffffffffffffffffffffffffffffff1660601b815260140182815260200192505050604051602081830303815290604052805190602001209050600061015960008054906101000a900473ffffffffffffffffffffffffffffffffffffffff168361024d565b90508073ffffffffffffffffffffffffffffffffffffffff166319ab453c856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156101c457600080fd5b505af11580156101d8573d6000803e3d6000fd5b505050507fa35ea2cc726861482a50a162c72aad60965cc64641d419cd4d675036238b52048185604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a150505050565b6000808360601b90506040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528160148201527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006028820152836037826000f5925050509291505056fea2646970667358221220c87b2492828fdd7dad3175a32a98ff07fc0eedf106536f2eddd9a016971c56a764736f6c63430007050033",
|
|
||||||
"storage": {
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000059ffafdc6ef594230de44f824e2bd0a51ca5ded"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"chainId": 1,
|
|
||||||
"homesteadBlock": 1150000,
|
|
||||||
"daoForkBlock": 1920000,
|
|
||||||
"daoForkSupport": true,
|
|
||||||
"eip150Block": 2463000,
|
|
||||||
"eip150Hash": "0x2086799aeebeae135c246c65021c82b4e15a2c451340993aacfd2751886514f0",
|
|
||||||
"eip155Block": 2675000,
|
|
||||||
"eip158Block": 2675000,
|
|
||||||
"byzantiumBlock": 4370000,
|
|
||||||
"constantinopleBlock": 7280000,
|
|
||||||
"petersburgBlock": 7280000,
|
|
||||||
"istanbulBlock": 9069000,
|
|
||||||
"muirGlacierBlock": 9200000,
|
|
||||||
"berlinBlock": 12244000,
|
|
||||||
"londonBlock": 12965000,
|
|
||||||
"arrowGlacierBlock": 13773000,
|
|
||||||
"grayGlacierBlock": 15050000,
|
|
||||||
"terminalTotalDifficultyPassed": true,
|
|
||||||
"ethash": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"context": {
|
|
||||||
"number": "14707768",
|
|
||||||
"difficulty": "14322823549655084",
|
|
||||||
"timestamp": "1651623279",
|
|
||||||
"gasLimit": "30029237",
|
|
||||||
"miner": "0x8f03f1a3f10c05e7cccf75c1fd10168e06659be7"
|
|
||||||
},
|
|
||||||
"input": "0x02f8b4018312acfc8459682f00851a46bcf47a8302b1a194ffa397285ce46fb78c588a9e993286aac68c37cd80b844fb90b3200000000000000000000000002a549b4af9ec39b03142da6dc32221fc390b553300000000000000000000000000000000000000000000000000000000000cb3d5c001a03002079d2873f7963c4278200c43aa71efad262b2150bc8524480acfc38b5faaa077d44aa09d56b9cf99443c7f55aaad1bbae9cfb5bbb9de31eaf7a8f9e623e980",
|
|
||||||
"tracerConfig": {
|
|
||||||
"diffMode": true
|
|
||||||
},
|
|
||||||
"result": {
|
|
||||||
"pre": {
|
|
||||||
"0x808b4da0be6c9512e948521452227efc619bea52": {
|
|
||||||
"balance": "0x2cdb96c56db040b43",
|
|
||||||
"nonce": 1223932
|
|
||||||
},
|
|
||||||
"0x8f03f1a3f10c05e7cccf75c1fd10168e06659be7": {
|
|
||||||
"balance": "0x38079b28689d40240e",
|
|
||||||
"nonce": 44
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"post": {
|
|
||||||
"0x808b4da0be6c9512e948521452227efc619bea52": {
|
|
||||||
"balance": "0x2cd72a36dd031f089",
|
|
||||||
"nonce": 1223933
|
|
||||||
},
|
|
||||||
"0x8f03f1a3f10c05e7cccf75c1fd10168e06659be7": {
|
|
||||||
"balance": "0x38079c19423e44b30e"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,104 +0,0 @@
|
||||||
{
|
|
||||||
"genesis": {
|
|
||||||
"difficulty": "6217248151198",
|
|
||||||
"extraData": "0xd783010103844765746887676f312e342e32856c696e7578",
|
|
||||||
"gasLimit": "3141592",
|
|
||||||
"hash": "0xe8bff55fe3e61936ef321cf3afaeb1ba2f7234e1e89535fa8ae39963caebe9c3",
|
|
||||||
"miner": "0x52bc44d5378309ee2abf1539bf71de1b7d7be3b5",
|
|
||||||
"mixHash": "0x03da00d5a15a064e5ebddf53cd0aaeb9a8aff0f40c0fb031a74f463d11ec83b8",
|
|
||||||
"nonce": "0x6575fe08c4167044",
|
|
||||||
"number": "243825",
|
|
||||||
"stateRoot": "0x47182fe2e6e740b8a76f82fe5c527d6ad548f805274f21792cf4047235b24fbf",
|
|
||||||
"timestamp": "1442424328",
|
|
||||||
"totalDifficulty": "1035061827427752845",
|
|
||||||
"alloc": {
|
|
||||||
"0x082d4cdf07f386ffa9258f52a5c49db4ac321ec6": {
|
|
||||||
"balance": "0xc820f93200f4000",
|
|
||||||
"nonce": "0x5E",
|
|
||||||
"code": "0x"
|
|
||||||
},
|
|
||||||
"0x332b656504f4eabb44c8617a42af37461a34e9dc": {
|
|
||||||
"balance": "0x11faea4f35e5af80000",
|
|
||||||
"code": "0x",
|
|
||||||
"storage": {
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000000000"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"0x52bc44d5378309ee2abf1539bf71de1b7d7be3b5": {
|
|
||||||
"balance": "0xbf681825be002ac452",
|
|
||||||
"nonce": "0x70FA",
|
|
||||||
"code": "0x"
|
|
||||||
},
|
|
||||||
"0x82effbaaaf28614e55b2ba440fb198e0e5789b0f": {
|
|
||||||
"balance": "0xb3d0ac5cb94df6f6b0",
|
|
||||||
"nonce": "0x1",
|
|
||||||
"code": "0x"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"chainId": 1,
|
|
||||||
"homesteadBlock": 1150000,
|
|
||||||
"daoForkBlock": 1920000,
|
|
||||||
"daoForkSupport": true,
|
|
||||||
"eip150Block": 2463000,
|
|
||||||
"eip150Hash": "0x2086799aeebeae135c246c65021c82b4e15a2c451340993aacfd2751886514f0",
|
|
||||||
"eip155Block": 2675000,
|
|
||||||
"eip158Block": 2675000,
|
|
||||||
"byzantiumBlock": 4370000,
|
|
||||||
"constantinopleBlock": 7280000,
|
|
||||||
"petersburgBlock": 7280000,
|
|
||||||
"istanbulBlock": 9069000,
|
|
||||||
"muirGlacierBlock": 9200000,
|
|
||||||
"berlinBlock": 12244000,
|
|
||||||
"londonBlock": 12965000,
|
|
||||||
"arrowGlacierBlock": 13773000,
|
|
||||||
"grayGlacierBlock": 15050000,
|
|
||||||
"ethash": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"context": {
|
|
||||||
"number": "243826",
|
|
||||||
"difficulty": "6214212385501",
|
|
||||||
"timestamp": "1442424353",
|
|
||||||
"gasLimit": "3141592",
|
|
||||||
"miner": "0x52bc44d5378309ee2abf1539bf71de1b7d7be3b5"
|
|
||||||
},
|
|
||||||
"input": "0xf8e85e850ba43b7400830f42408080b89660606040527382effbaaaf28614e55b2ba440fb198e0e5789b0f600060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908302179055505b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b600a80608c6000396000f30060606040526008565b001ca0340b21661e5bb85a46319a15f33a362e5c0f02faa7cdbf9c5808b2134da968eaa0226e6788f8c20e211d436ab7f6298ef32fa4c23a509eeeaac0880d115c17bc3f",
|
|
||||||
"tracerConfig": {
|
|
||||||
"diffMode": true
|
|
||||||
},
|
|
||||||
"result": {
|
|
||||||
"pre": {
|
|
||||||
"0x082d4cdf07f386ffa9258f52a5c49db4ac321ec6": {
|
|
||||||
"balance": "0xc820f93200f4000",
|
|
||||||
"nonce": 94
|
|
||||||
},
|
|
||||||
"0x332b656504f4eabb44c8617a42af37461a34e9dc": {
|
|
||||||
"balance": "0x11faea4f35e5af80000",
|
|
||||||
"storage": {
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000000000"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"0x52bc44d5378309ee2abf1539bf71de1b7d7be3b5": {
|
|
||||||
"balance": "0xbf681825be002ac452",
|
|
||||||
"nonce": 28922
|
|
||||||
},
|
|
||||||
"0x82effbaaaf28614e55b2ba440fb198e0e5789b0f": {
|
|
||||||
"balance": "0xb3d0ac5cb94df6f6b0",
|
|
||||||
"nonce": 1
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"post": {
|
|
||||||
"0x082d4cdf07f386ffa9258f52a5c49db4ac321ec6": {
|
|
||||||
"balance": "0xc7d4d88af8b4c00",
|
|
||||||
"nonce": 95
|
|
||||||
},
|
|
||||||
"0x52bc44d5378309ee2abf1539bf71de1b7d7be3b5": {
|
|
||||||
"balance": "0xbf681ce7c870aeb852"
|
|
||||||
},
|
|
||||||
"0x82effbaaaf28614e55b2ba440fb198e0e5789b0f": {
|
|
||||||
"balance": "0x1d37f515017a8eef6b0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -1,103 +0,0 @@
|
||||||
{
|
|
||||||
"context": {
|
|
||||||
"difficulty": "3502894804",
|
|
||||||
"gasLimit": "4722976",
|
|
||||||
"miner": "0x1585936b53834b021f68cc13eeefdec2efc8e724",
|
|
||||||
"number": "2289806",
|
|
||||||
"timestamp": "1513601314"
|
|
||||||
},
|
|
||||||
"genesis": {
|
|
||||||
"alloc": {
|
|
||||||
"0x0024f658a46fbb89d8ac105e98d7ac7cbbaf27c5": {
|
|
||||||
"balance": "0x0",
|
|
||||||
"code": "0x",
|
|
||||||
"nonce": "22",
|
|
||||||
"storage": {}
|
|
||||||
},
|
|
||||||
"0x3b873a919aa0512d5a0f09e6dcceaa4a6727fafe": {
|
|
||||||
"balance": "0x4d87094125a369d9bd5",
|
|
||||||
"code": "0x606060405236156100935763ffffffff60e060020a60003504166311ee8382811461009c57806313af4035146100be5780631f5e8f4c146100ee57806324daddc5146101125780634921a91a1461013b57806363e4bff414610157578063764978f91461017f578063893d20e8146101a1578063ba40aaa1146101cd578063cebc9a82146101f4578063e177246e14610216575b61009a5b5b565b005b34156100a457fe5b6100ac61023d565b60408051918252519081900360200190f35b34156100c657fe5b6100da600160a060020a0360043516610244565b604080519115158252519081900360200190f35b34156100f657fe5b6100da610307565b604080519115158252519081900360200190f35b341561011a57fe5b6100da6004351515610318565b604080519115158252519081900360200190f35b6100da6103d6565b604080519115158252519081900360200190f35b6100da600160a060020a0360043516610420565b604080519115158252519081900360200190f35b341561018757fe5b6100ac61046c565b60408051918252519081900360200190f35b34156101a957fe5b6101b1610473565b60408051600160a060020a039092168252519081900360200190f35b34156101d557fe5b6100da600435610483565b604080519115158252519081900360200190f35b34156101fc57fe5b6100ac61050d565b60408051918252519081900360200190f35b341561021e57fe5b6100da600435610514565b604080519115158252519081900360200190f35b6003545b90565b60006000610250610473565b600160a060020a031633600160a060020a03161415156102705760006000fd5b600160a060020a03831615156102865760006000fd5b50600054600160a060020a0390811690831681146102fb57604051600160a060020a0380851691908316907ffcf23a92150d56e85e3a3d33b357493246e55783095eb6a733eb8439ffc752c890600090a360008054600160a060020a031916600160a060020a03851617905560019150610300565b600091505b5b50919050565b60005460a060020a900460ff165b90565b60006000610324610473565b600160a060020a031633600160a060020a03161415156103445760006000fd5b5060005460a060020a900460ff16801515831515146102fb576000546040805160a060020a90920460ff1615158252841515602083015280517fe6cd46a119083b86efc6884b970bfa30c1708f53ba57b86716f15b2f4551a9539281900390910190a16000805460a060020a60ff02191660a060020a8515150217905560019150610300565b600091505b5b50919050565b60006103e0610307565b801561040557506103ef610473565b600160a060020a031633600160a060020a031614155b156104105760006000fd5b610419336105a0565b90505b5b90565b600061042a610307565b801561044f5750610439610473565b600160a060020a031633600160a060020a031614155b1561045a5760006000fd5b610463826105a0565b90505b5b919050565b6001545b90565b600054600160a060020a03165b90565b6000600061048f610473565b600160a060020a031633600160a060020a03161415156104af5760006000fd5b506001548281146102fb57604080518281526020810185905281517f79a3746dde45672c9e8ab3644b8bb9c399a103da2dc94b56ba09777330a83509929181900390910190a160018381559150610300565b600091505b5b50919050565b6002545b90565b60006000610520610473565b600160a060020a031633600160a060020a03161415156105405760006000fd5b506002548281146102fb57604080518281526020810185905281517ff6991a728965fedd6e927fdf16bdad42d8995970b4b31b8a2bf88767516e2494929181900390910190a1600283905560019150610300565b600091505b5b50919050565b60006000426105ad61023d565b116102fb576105c46105bd61050d565b4201610652565b6105cc61046c565b604051909150600160a060020a038416908290600081818185876187965a03f1925050501561063d57604080518281529051600160a060020a038516917f9bca65ce52fdef8a470977b51f247a2295123a4807dfa9e502edf0d30722da3b919081900360200190a260019150610300565b6102fb42610652565b5b600091505b50919050565b60038190555b505600a165627a7a72305820f3c973c8b7ed1f62000b6701bd5b708469e19d0f1d73fde378a56c07fd0b19090029",
|
|
||||||
"nonce": "1",
|
|
||||||
"storage": {
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000001b436ba50d378d4bbc8660d312a13df6af6e89dfb",
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000001": "0x00000000000000000000000000000000000000000000000006f05b59d3b20000",
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000002": "0x000000000000000000000000000000000000000000000000000000000000003c",
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000003": "0x000000000000000000000000000000000000000000000000000000005a37b834"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"0xb436ba50d378d4bbc8660d312a13df6af6e89dfb": {
|
|
||||||
"balance": "0x1780d77678137ac1b775",
|
|
||||||
"code": "0x",
|
|
||||||
"nonce": "29072",
|
|
||||||
"storage": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"byzantiumBlock": 1700000,
|
|
||||||
"chainId": 3,
|
|
||||||
"daoForkSupport": true,
|
|
||||||
"eip150Block": 0,
|
|
||||||
"eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
|
|
||||||
"eip155Block": 10,
|
|
||||||
"eip158Block": 10,
|
|
||||||
"ethash": {},
|
|
||||||
"homesteadBlock": 0
|
|
||||||
},
|
|
||||||
"difficulty": "3509749784",
|
|
||||||
"extraData": "0x4554482e45544846414e532e4f52472d4641313738394444",
|
|
||||||
"gasLimit": "4727564",
|
|
||||||
"hash": "0x609948ac3bd3c00b7736b933248891d6c901ee28f066241bddb28f4e00a9f440",
|
|
||||||
"miner": "0xbbf5029fd710d227630c8b7d338051b8e76d50b3",
|
|
||||||
"mixHash": "0xb131e4507c93c7377de00e7c271bf409ec7492767142ff0f45c882f8068c2ada",
|
|
||||||
"nonce": "0x4eb12e19c16d43da",
|
|
||||||
"number": "2289805",
|
|
||||||
"stateRoot": "0xc7f10f352bff82fac3c2999d3085093d12652e19c7fd32591de49dc5d91b4f1f",
|
|
||||||
"timestamp": "1513601261",
|
|
||||||
"totalDifficulty": "7143276353481064"
|
|
||||||
},
|
|
||||||
"input": "0xf88b8271908506fc23ac0083015f90943b873a919aa0512d5a0f09e6dcceaa4a6727fafe80a463e4bff40000000000000000000000000024f658a46fbb89d8ac105e98d7ac7cbbaf27c52aa0bdce0b59e8761854e857fe64015f06dd08a4fbb7624f6094893a79a72e6ad6bea01d9dde033cff7bb235a3163f348a6d7ab8d6b52bc0963a95b91612e40ca766a4",
|
|
||||||
"tracerConfig": {
|
|
||||||
"diffMode": true
|
|
||||||
},
|
|
||||||
"result": {
|
|
||||||
"pre": {
|
|
||||||
"0x0024f658a46fbb89d8ac105e98d7ac7cbbaf27c5": {
|
|
||||||
"balance": "0x0",
|
|
||||||
"nonce": 22
|
|
||||||
},
|
|
||||||
"0x1585936b53834b021f68cc13eeefdec2efc8e724": {
|
|
||||||
"balance": "0x0"
|
|
||||||
},
|
|
||||||
"0x3b873a919aa0512d5a0f09e6dcceaa4a6727fafe": {
|
|
||||||
"balance": "0x4d87094125a369d9bd5",
|
|
||||||
"nonce": 1,
|
|
||||||
"code": "0x606060405236156100935763ffffffff60e060020a60003504166311ee8382811461009c57806313af4035146100be5780631f5e8f4c146100ee57806324daddc5146101125780634921a91a1461013b57806363e4bff414610157578063764978f91461017f578063893d20e8146101a1578063ba40aaa1146101cd578063cebc9a82146101f4578063e177246e14610216575b61009a5b5b565b005b34156100a457fe5b6100ac61023d565b60408051918252519081900360200190f35b34156100c657fe5b6100da600160a060020a0360043516610244565b604080519115158252519081900360200190f35b34156100f657fe5b6100da610307565b604080519115158252519081900360200190f35b341561011a57fe5b6100da6004351515610318565b604080519115158252519081900360200190f35b6100da6103d6565b604080519115158252519081900360200190f35b6100da600160a060020a0360043516610420565b604080519115158252519081900360200190f35b341561018757fe5b6100ac61046c565b60408051918252519081900360200190f35b34156101a957fe5b6101b1610473565b60408051600160a060020a039092168252519081900360200190f35b34156101d557fe5b6100da600435610483565b604080519115158252519081900360200190f35b34156101fc57fe5b6100ac61050d565b60408051918252519081900360200190f35b341561021e57fe5b6100da600435610514565b604080519115158252519081900360200190f35b6003545b90565b60006000610250610473565b600160a060020a031633600160a060020a03161415156102705760006000fd5b600160a060020a03831615156102865760006000fd5b50600054600160a060020a0390811690831681146102fb57604051600160a060020a0380851691908316907ffcf23a92150d56e85e3a3d33b357493246e55783095eb6a733eb8439ffc752c890600090a360008054600160a060020a031916600160a060020a03851617905560019150610300565b600091505b5b50919050565b60005460a060020a900460ff165b90565b60006000610324610473565b600160a060020a031633600160a060020a03161415156103445760006000fd5b5060005460a060020a900460ff16801515831515146102fb576000546040805160a060020a90920460ff1615158252841515602083015280517fe6cd46a119083b86efc6884b970bfa30c1708f53ba57b86716f15b2f4551a9539281900390910190a16000805460a060020a60ff02191660a060020a8515150217905560019150610300565b600091505b5b50919050565b60006103e0610307565b801561040557506103ef610473565b600160a060020a031633600160a060020a031614155b156104105760006000fd5b610419336105a0565b90505b5b90565b600061042a610307565b801561044f5750610439610473565b600160a060020a031633600160a060020a031614155b1561045a5760006000fd5b610463826105a0565b90505b5b919050565b6001545b90565b600054600160a060020a03165b90565b6000600061048f610473565b600160a060020a031633600160a060020a03161415156104af5760006000fd5b506001548281146102fb57604080518281526020810185905281517f79a3746dde45672c9e8ab3644b8bb9c399a103da2dc94b56ba09777330a83509929181900390910190a160018381559150610300565b600091505b5b50919050565b6002545b90565b60006000610520610473565b600160a060020a031633600160a060020a03161415156105405760006000fd5b506002548281146102fb57604080518281526020810185905281517ff6991a728965fedd6e927fdf16bdad42d8995970b4b31b8a2bf88767516e2494929181900390910190a1600283905560019150610300565b600091505b5b50919050565b60006000426105ad61023d565b116102fb576105c46105bd61050d565b4201610652565b6105cc61046c565b604051909150600160a060020a038416908290600081818185876187965a03f1925050501561063d57604080518281529051600160a060020a038516917f9bca65ce52fdef8a470977b51f247a2295123a4807dfa9e502edf0d30722da3b919081900360200190a260019150610300565b6102fb42610652565b5b600091505b50919050565b60038190555b505600a165627a7a72305820f3c973c8b7ed1f62000b6701bd5b708469e19d0f1d73fde378a56c07fd0b19090029",
|
|
||||||
"storage": {
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000003": "0x000000000000000000000000000000000000000000000000000000005a37b834"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"0xb436ba50d378d4bbc8660d312a13df6af6e89dfb": {
|
|
||||||
"balance": "0x1780d77678137ac1b775",
|
|
||||||
"nonce": 29072
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"post": {
|
|
||||||
"0x0024f658a46fbb89d8ac105e98d7ac7cbbaf27c5": {
|
|
||||||
"balance": "0x6f05b59d3b20000"
|
|
||||||
},
|
|
||||||
"0x1585936b53834b021f68cc13eeefdec2efc8e724": {
|
|
||||||
"balance": "0x420eed1bd6c00"
|
|
||||||
},
|
|
||||||
"0x3b873a919aa0512d5a0f09e6dcceaa4a6727fafe": {
|
|
||||||
"balance": "0x4d869a3b70062eb9bd5",
|
|
||||||
"storage": {
|
|
||||||
"0x0000000000000000000000000000000000000000000000000000000000000003": "0x000000000000000000000000000000000000000000000000000000005a37b95e"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"0xb436ba50d378d4bbc8660d312a13df6af6e89dfb": {
|
|
||||||
"balance": "0x1780d7725724a9044b75",
|
|
||||||
"nonce": 29073
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -1,72 +0,0 @@
|
||||||
package tracetest
|
|
||||||
|
|
||||||
import (
|
|
||||||
"strings"
|
|
||||||
"unicode"
|
|
||||||
|
|
||||||
// Force-load native and js packages, to trigger registration
|
|
||||||
_ "github.com/ethereum/go-ethereum/eth/tracers/js"
|
|
||||||
_ "github.com/ethereum/go-ethereum/eth/tracers/native"
|
|
||||||
)
|
|
||||||
|
|
||||||
// To generate a new callTracer test, copy paste the makeTest method below into
|
|
||||||
// a Geth console and call it with a transaction hash you which to export.
|
|
||||||
|
|
||||||
/*
|
|
||||||
// makeTest generates a callTracer test by running a prestate reassembled and a
|
|
||||||
// call trace run, assembling all the gathered information into a test case.
|
|
||||||
var makeTest = function(tx, rewind) {
|
|
||||||
// Generate the genesis block from the block, transaction and prestate data
|
|
||||||
var block = eth.getBlock(eth.getTransaction(tx).blockHash);
|
|
||||||
var genesis = eth.getBlock(block.parentHash);
|
|
||||||
|
|
||||||
delete genesis.gasUsed;
|
|
||||||
delete genesis.logsBloom;
|
|
||||||
delete genesis.parentHash;
|
|
||||||
delete genesis.receiptsRoot;
|
|
||||||
delete genesis.sha3Uncles;
|
|
||||||
delete genesis.size;
|
|
||||||
delete genesis.transactions;
|
|
||||||
delete genesis.transactionsRoot;
|
|
||||||
delete genesis.uncles;
|
|
||||||
|
|
||||||
genesis.gasLimit = genesis.gasLimit.toString();
|
|
||||||
genesis.number = genesis.number.toString();
|
|
||||||
genesis.timestamp = genesis.timestamp.toString();
|
|
||||||
|
|
||||||
genesis.alloc = debug.traceTransaction(tx, {tracer: "prestateTracer", rewind: rewind});
|
|
||||||
for (var key in genesis.alloc) {
|
|
||||||
var nonce = genesis.alloc[key].nonce;
|
|
||||||
if (nonce) {
|
|
||||||
genesis.alloc[key].nonce = nonce.toString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
genesis.config = admin.nodeInfo.protocols.eth.config;
|
|
||||||
|
|
||||||
// Generate the call trace and produce the test input
|
|
||||||
var result = debug.traceTransaction(tx, {tracer: "callTracer", rewind: rewind});
|
|
||||||
delete result.time;
|
|
||||||
|
|
||||||
console.log(JSON.stringify({
|
|
||||||
genesis: genesis,
|
|
||||||
context: {
|
|
||||||
number: block.number.toString(),
|
|
||||||
difficulty: block.difficulty,
|
|
||||||
timestamp: block.timestamp.toString(),
|
|
||||||
gasLimit: block.gasLimit.toString(),
|
|
||||||
miner: block.miner,
|
|
||||||
},
|
|
||||||
input: eth.getRawTransaction(tx),
|
|
||||||
result: result,
|
|
||||||
}, null, 2));
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
// camel converts a snake cased input string into a camel cased output.
|
|
||||||
func camel(str string) string {
|
|
||||||
pieces := strings.Split(str, "_")
|
|
||||||
for i := 1; i < len(pieces); i++ {
|
|
||||||
pieces[i] = string(unicode.ToUpper(rune(pieces[i][0]))) + pieces[i][1:]
|
|
||||||
}
|
|
||||||
return strings.Join(pieces, "")
|
|
||||||
}
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -1,992 +0,0 @@
|
||||||
// Copyright 2022 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/>.
|
|
||||||
|
|
||||||
package js
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"math/big"
|
|
||||||
|
|
||||||
"github.com/dop251/goja"
|
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
|
||||||
"github.com/ethereum/go-ethereum/common/hexutil"
|
|
||||||
"github.com/ethereum/go-ethereum/core/vm"
|
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
|
||||||
"github.com/ethereum/go-ethereum/eth/tracers"
|
|
||||||
jsassets "github.com/ethereum/go-ethereum/eth/tracers/js/internal/tracers"
|
|
||||||
)
|
|
||||||
|
|
||||||
var assetTracers = make(map[string]string)
|
|
||||||
|
|
||||||
// init retrieves the JavaScript transaction tracers included in go-ethereum.
|
|
||||||
func init() {
|
|
||||||
var err error
|
|
||||||
assetTracers, err = jsassets.Load()
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
type ctorFn = func(*tracers.Context, json.RawMessage) (tracers.Tracer, error)
|
|
||||||
lookup := func(code string) ctorFn {
|
|
||||||
return func(ctx *tracers.Context, cfg json.RawMessage) (tracers.Tracer, error) {
|
|
||||||
return newJsTracer(code, ctx, cfg)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for name, code := range assetTracers {
|
|
||||||
tracers.DefaultDirectory.Register(name, lookup(code), true)
|
|
||||||
}
|
|
||||||
tracers.DefaultDirectory.RegisterJSEval(newJsTracer)
|
|
||||||
}
|
|
||||||
|
|
||||||
// bigIntProgram is compiled once and the exported function mostly invoked to convert
|
|
||||||
// hex strings into big ints.
|
|
||||||
var bigIntProgram = goja.MustCompile("bigInt", bigIntegerJS, false)
|
|
||||||
|
|
||||||
type toBigFn = func(vm *goja.Runtime, val string) (goja.Value, error)
|
|
||||||
type toBufFn = func(vm *goja.Runtime, val []byte) (goja.Value, error)
|
|
||||||
type fromBufFn = func(vm *goja.Runtime, buf goja.Value, allowString bool) ([]byte, error)
|
|
||||||
|
|
||||||
func toBuf(vm *goja.Runtime, bufType goja.Value, val []byte) (goja.Value, error) {
|
|
||||||
// bufType is usually Uint8Array. This is equivalent to `new Uint8Array(val)` in JS.
|
|
||||||
return vm.New(bufType, vm.ToValue(vm.NewArrayBuffer(val)))
|
|
||||||
}
|
|
||||||
|
|
||||||
func fromBuf(vm *goja.Runtime, bufType goja.Value, buf goja.Value, allowString bool) ([]byte, error) {
|
|
||||||
obj := buf.ToObject(vm)
|
|
||||||
switch obj.ClassName() {
|
|
||||||
case "String":
|
|
||||||
if !allowString {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
return common.FromHex(obj.String()), nil
|
|
||||||
|
|
||||||
case "Array":
|
|
||||||
var b []byte
|
|
||||||
if err := vm.ExportTo(buf, &b); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return b, nil
|
|
||||||
|
|
||||||
case "Object":
|
|
||||||
if !obj.Get("constructor").SameAs(bufType) {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
b := obj.Export().([]byte)
|
|
||||||
return b, nil
|
|
||||||
}
|
|
||||||
return nil, errors.New("invalid buffer type")
|
|
||||||
}
|
|
||||||
|
|
||||||
// jsTracer is an implementation of the Tracer interface which evaluates
|
|
||||||
// JS functions on the relevant EVM hooks. It uses Goja as its JS engine.
|
|
||||||
type jsTracer struct {
|
|
||||||
vm *goja.Runtime
|
|
||||||
env *vm.EVM
|
|
||||||
toBig toBigFn // Converts a hex string into a JS bigint
|
|
||||||
toBuf toBufFn // Converts a []byte into a JS buffer
|
|
||||||
fromBuf fromBufFn // Converts an array, hex string or Uint8Array to a []byte
|
|
||||||
ctx map[string]goja.Value // KV-bag passed to JS in `result`
|
|
||||||
activePrecompiles []common.Address // List of active precompiles at current block
|
|
||||||
traceStep bool // True if tracer object exposes a `step()` method
|
|
||||||
traceFrame bool // True if tracer object exposes the `enter()` and `exit()` methods
|
|
||||||
gasLimit uint64 // Amount of gas bought for the whole tx
|
|
||||||
err error // Any error that should stop tracing
|
|
||||||
obj *goja.Object // Trace object
|
|
||||||
|
|
||||||
// Methods exposed by tracer
|
|
||||||
result goja.Callable
|
|
||||||
fault goja.Callable
|
|
||||||
step goja.Callable
|
|
||||||
enter goja.Callable
|
|
||||||
exit goja.Callable
|
|
||||||
|
|
||||||
// Underlying structs being passed into JS
|
|
||||||
log *steplog
|
|
||||||
frame *callframe
|
|
||||||
frameResult *callframeResult
|
|
||||||
|
|
||||||
// Goja-wrapping of types prepared for JS consumption
|
|
||||||
logValue goja.Value
|
|
||||||
dbValue goja.Value
|
|
||||||
frameValue goja.Value
|
|
||||||
frameResultValue goja.Value
|
|
||||||
}
|
|
||||||
|
|
||||||
// newJsTracer instantiates a new JS tracer instance. code is a
|
|
||||||
// Javascript snippet which evaluates to an expression returning
|
|
||||||
// an object with certain methods:
|
|
||||||
//
|
|
||||||
// The methods `result` and `fault` are required to be present.
|
|
||||||
// The methods `step`, `enter`, and `exit` are optional, but note that
|
|
||||||
// `enter` and `exit` always go together.
|
|
||||||
func newJsTracer(code string, ctx *tracers.Context, cfg json.RawMessage) (tracers.Tracer, error) {
|
|
||||||
vm := goja.New()
|
|
||||||
// By default field names are exported to JS as is, i.e. capitalized.
|
|
||||||
vm.SetFieldNameMapper(goja.UncapFieldNameMapper())
|
|
||||||
t := &jsTracer{
|
|
||||||
vm: vm,
|
|
||||||
ctx: make(map[string]goja.Value),
|
|
||||||
}
|
|
||||||
|
|
||||||
t.setTypeConverters()
|
|
||||||
t.setBuiltinFunctions()
|
|
||||||
|
|
||||||
if ctx == nil {
|
|
||||||
ctx = new(tracers.Context)
|
|
||||||
}
|
|
||||||
if ctx.BlockHash != (common.Hash{}) {
|
|
||||||
blockHash, err := t.toBuf(vm, ctx.BlockHash.Bytes())
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
t.ctx["blockHash"] = blockHash
|
|
||||||
if ctx.TxHash != (common.Hash{}) {
|
|
||||||
t.ctx["txIndex"] = vm.ToValue(ctx.TxIndex)
|
|
||||||
txHash, err := t.toBuf(vm, ctx.TxHash.Bytes())
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
t.ctx["txHash"] = txHash
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ret, err := vm.RunString("(" + code + ")")
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
// Check tracer's interface for required and optional methods.
|
|
||||||
obj := ret.ToObject(vm)
|
|
||||||
result, ok := goja.AssertFunction(obj.Get("result"))
|
|
||||||
if !ok {
|
|
||||||
return nil, errors.New("trace object must expose a function result()")
|
|
||||||
}
|
|
||||||
fault, ok := goja.AssertFunction(obj.Get("fault"))
|
|
||||||
if !ok {
|
|
||||||
return nil, errors.New("trace object must expose a function fault()")
|
|
||||||
}
|
|
||||||
step, ok := goja.AssertFunction(obj.Get("step"))
|
|
||||||
t.traceStep = ok
|
|
||||||
enter, hasEnter := goja.AssertFunction(obj.Get("enter"))
|
|
||||||
exit, hasExit := goja.AssertFunction(obj.Get("exit"))
|
|
||||||
if hasEnter != hasExit {
|
|
||||||
return nil, errors.New("trace object must expose either both or none of enter() and exit()")
|
|
||||||
}
|
|
||||||
t.traceFrame = hasEnter
|
|
||||||
t.obj = obj
|
|
||||||
t.step = step
|
|
||||||
t.enter = enter
|
|
||||||
t.exit = exit
|
|
||||||
t.result = result
|
|
||||||
t.fault = fault
|
|
||||||
|
|
||||||
// Pass in config
|
|
||||||
if setup, ok := goja.AssertFunction(obj.Get("setup")); ok {
|
|
||||||
cfgStr := "{}"
|
|
||||||
if cfg != nil {
|
|
||||||
cfgStr = string(cfg)
|
|
||||||
}
|
|
||||||
if _, err := setup(obj, vm.ToValue(cfgStr)); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Setup objects carrying data to JS. These are created once and re-used.
|
|
||||||
t.log = &steplog{
|
|
||||||
vm: vm,
|
|
||||||
op: &opObj{vm: vm},
|
|
||||||
memory: &memoryObj{vm: vm, toBig: t.toBig, toBuf: t.toBuf},
|
|
||||||
stack: &stackObj{vm: vm, toBig: t.toBig},
|
|
||||||
contract: &contractObj{vm: vm, toBig: t.toBig, toBuf: t.toBuf},
|
|
||||||
}
|
|
||||||
t.frame = &callframe{vm: vm, toBig: t.toBig, toBuf: t.toBuf}
|
|
||||||
t.frameResult = &callframeResult{vm: vm, toBuf: t.toBuf}
|
|
||||||
t.frameValue = t.frame.setupObject()
|
|
||||||
t.frameResultValue = t.frameResult.setupObject()
|
|
||||||
t.logValue = t.log.setupObject()
|
|
||||||
return t, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CaptureTxStart implements the Tracer interface and is invoked at the beginning of
|
|
||||||
// transaction processing.
|
|
||||||
func (t *jsTracer) CaptureTxStart(gasLimit uint64) {
|
|
||||||
t.gasLimit = gasLimit
|
|
||||||
}
|
|
||||||
|
|
||||||
// CaptureTxEnd implements the Tracer interface and is invoked at the end of
|
|
||||||
// transaction processing.
|
|
||||||
func (t *jsTracer) CaptureTxEnd(restGas uint64) {
|
|
||||||
t.ctx["gasUsed"] = t.vm.ToValue(t.gasLimit - restGas)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CaptureStart implements the Tracer interface to initialize the tracing operation.
|
|
||||||
func (t *jsTracer) CaptureStart(env *vm.EVM, from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) {
|
|
||||||
cancel := func(err error) {
|
|
||||||
t.err = err
|
|
||||||
t.env.Cancel()
|
|
||||||
}
|
|
||||||
t.env = env
|
|
||||||
db := &dbObj{db: env.StateDB, vm: t.vm, toBig: t.toBig, toBuf: t.toBuf, fromBuf: t.fromBuf}
|
|
||||||
t.dbValue = db.setupObject()
|
|
||||||
if create {
|
|
||||||
t.ctx["type"] = t.vm.ToValue("CREATE")
|
|
||||||
} else {
|
|
||||||
t.ctx["type"] = t.vm.ToValue("CALL")
|
|
||||||
}
|
|
||||||
fromVal, err := t.toBuf(t.vm, from.Bytes())
|
|
||||||
if err != nil {
|
|
||||||
cancel(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
t.ctx["from"] = fromVal
|
|
||||||
toVal, err := t.toBuf(t.vm, to.Bytes())
|
|
||||||
if err != nil {
|
|
||||||
cancel(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
t.ctx["to"] = toVal
|
|
||||||
inputVal, err := t.toBuf(t.vm, input)
|
|
||||||
if err != nil {
|
|
||||||
cancel(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
t.ctx["input"] = inputVal
|
|
||||||
t.ctx["gas"] = t.vm.ToValue(t.gasLimit)
|
|
||||||
gasPriceBig, err := t.toBig(t.vm, env.TxContext.GasPrice.String())
|
|
||||||
if err != nil {
|
|
||||||
cancel(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
t.ctx["gasPrice"] = gasPriceBig
|
|
||||||
valueBig, err := t.toBig(t.vm, value.String())
|
|
||||||
if err != nil {
|
|
||||||
cancel(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
t.ctx["value"] = valueBig
|
|
||||||
t.ctx["block"] = t.vm.ToValue(env.Context.BlockNumber.Uint64())
|
|
||||||
// Update list of precompiles based on current block
|
|
||||||
rules := env.ChainConfig().Rules(env.Context.BlockNumber, env.Context.Random != nil, env.Context.Time)
|
|
||||||
t.activePrecompiles = vm.ActivePrecompiles(rules)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CaptureState implements the Tracer interface to trace a single step of VM execution.
|
|
||||||
func (t *jsTracer) CaptureState(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, rData []byte, depth int, err error) {
|
|
||||||
if !t.traceStep {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if t.err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
log := t.log
|
|
||||||
log.op.op = op
|
|
||||||
log.memory.memory = scope.Memory
|
|
||||||
log.stack.stack = scope.Stack
|
|
||||||
log.contract.contract = scope.Contract
|
|
||||||
log.pc = pc
|
|
||||||
log.gas = gas
|
|
||||||
log.cost = cost
|
|
||||||
log.refund = t.env.StateDB.GetRefund()
|
|
||||||
log.depth = depth
|
|
||||||
log.err = err
|
|
||||||
if _, err := t.step(t.obj, t.logValue, t.dbValue); err != nil {
|
|
||||||
t.onError("step", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// CaptureFault implements the Tracer interface to trace an execution fault
|
|
||||||
func (t *jsTracer) CaptureFault(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, depth int, err error) {
|
|
||||||
if t.err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
// Other log fields have been already set as part of the last CaptureState.
|
|
||||||
t.log.err = err
|
|
||||||
if _, err := t.fault(t.obj, t.logValue, t.dbValue); err != nil {
|
|
||||||
t.onError("fault", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// CaptureEnd is called after the call finishes to finalize the tracing.
|
|
||||||
func (t *jsTracer) CaptureEnd(output []byte, gasUsed uint64, err error) {
|
|
||||||
if err != nil {
|
|
||||||
t.ctx["error"] = t.vm.ToValue(err.Error())
|
|
||||||
}
|
|
||||||
outputVal, err := t.toBuf(t.vm, output)
|
|
||||||
if err != nil {
|
|
||||||
t.err = err
|
|
||||||
return
|
|
||||||
}
|
|
||||||
t.ctx["output"] = outputVal
|
|
||||||
}
|
|
||||||
|
|
||||||
// CaptureEnter is called when EVM enters a new scope (via call, create or selfdestruct).
|
|
||||||
func (t *jsTracer) CaptureEnter(typ vm.OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) {
|
|
||||||
if !t.traceFrame {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if t.err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
t.frame.typ = typ.String()
|
|
||||||
t.frame.from = from
|
|
||||||
t.frame.to = to
|
|
||||||
t.frame.input = common.CopyBytes(input)
|
|
||||||
t.frame.gas = uint(gas)
|
|
||||||
t.frame.value = nil
|
|
||||||
if value != nil {
|
|
||||||
t.frame.value = new(big.Int).SetBytes(value.Bytes())
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err := t.enter(t.obj, t.frameValue); err != nil {
|
|
||||||
t.onError("enter", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// CaptureExit is called when EVM exits a scope, even if the scope didn't
|
|
||||||
// execute any code.
|
|
||||||
func (t *jsTracer) CaptureExit(output []byte, gasUsed uint64, err error) {
|
|
||||||
if !t.traceFrame {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
t.frameResult.gasUsed = uint(gasUsed)
|
|
||||||
t.frameResult.output = common.CopyBytes(output)
|
|
||||||
t.frameResult.err = err
|
|
||||||
|
|
||||||
if _, err := t.exit(t.obj, t.frameResultValue); err != nil {
|
|
||||||
t.onError("exit", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetResult calls the Javascript 'result' function and returns its value, or any accumulated error
|
|
||||||
func (t *jsTracer) GetResult() (json.RawMessage, error) {
|
|
||||||
ctx := t.vm.ToValue(t.ctx)
|
|
||||||
res, err := t.result(t.obj, ctx, t.dbValue)
|
|
||||||
if err != nil {
|
|
||||||
return nil, wrapError("result", err)
|
|
||||||
}
|
|
||||||
encoded, err := json.Marshal(res)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return json.RawMessage(encoded), t.err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Stop terminates execution of the tracer at the first opportune moment.
|
|
||||||
func (t *jsTracer) Stop(err error) {
|
|
||||||
t.vm.Interrupt(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// onError is called anytime the running JS code is interrupted
|
|
||||||
// and returns an error. It in turn pings the EVM to cancel its
|
|
||||||
// execution.
|
|
||||||
func (t *jsTracer) onError(context string, err error) {
|
|
||||||
t.err = wrapError(context, err)
|
|
||||||
// `env` is set on CaptureStart which comes before any JS execution.
|
|
||||||
// So it should be non-nil.
|
|
||||||
t.env.Cancel()
|
|
||||||
}
|
|
||||||
|
|
||||||
func wrapError(context string, err error) error {
|
|
||||||
return fmt.Errorf("%v in server-side tracer function '%v'", err, context)
|
|
||||||
}
|
|
||||||
|
|
||||||
// setBuiltinFunctions injects Go functions which are available to tracers into the environment.
|
|
||||||
// It depends on type converters having been set up.
|
|
||||||
func (t *jsTracer) setBuiltinFunctions() {
|
|
||||||
vm := t.vm
|
|
||||||
// TODO: load console from goja-nodejs
|
|
||||||
vm.Set("toHex", func(v goja.Value) string {
|
|
||||||
b, err := t.fromBuf(vm, v, false)
|
|
||||||
if err != nil {
|
|
||||||
vm.Interrupt(err)
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
return hexutil.Encode(b)
|
|
||||||
})
|
|
||||||
vm.Set("toWord", func(v goja.Value) goja.Value {
|
|
||||||
// TODO: add test with []byte len < 32 or > 32
|
|
||||||
b, err := t.fromBuf(vm, v, true)
|
|
||||||
if err != nil {
|
|
||||||
vm.Interrupt(err)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
b = common.BytesToHash(b).Bytes()
|
|
||||||
res, err := t.toBuf(vm, b)
|
|
||||||
if err != nil {
|
|
||||||
vm.Interrupt(err)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
})
|
|
||||||
vm.Set("toAddress", func(v goja.Value) goja.Value {
|
|
||||||
a, err := t.fromBuf(vm, v, true)
|
|
||||||
if err != nil {
|
|
||||||
vm.Interrupt(err)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
a = common.BytesToAddress(a).Bytes()
|
|
||||||
res, err := t.toBuf(vm, a)
|
|
||||||
if err != nil {
|
|
||||||
vm.Interrupt(err)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
})
|
|
||||||
vm.Set("toContract", func(from goja.Value, nonce uint) goja.Value {
|
|
||||||
a, err := t.fromBuf(vm, from, true)
|
|
||||||
if err != nil {
|
|
||||||
vm.Interrupt(err)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
addr := common.BytesToAddress(a)
|
|
||||||
b := crypto.CreateAddress(addr, uint64(nonce)).Bytes()
|
|
||||||
res, err := t.toBuf(vm, b)
|
|
||||||
if err != nil {
|
|
||||||
vm.Interrupt(err)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
})
|
|
||||||
vm.Set("toContract2", func(from goja.Value, salt string, initcode goja.Value) goja.Value {
|
|
||||||
a, err := t.fromBuf(vm, from, true)
|
|
||||||
if err != nil {
|
|
||||||
vm.Interrupt(err)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
addr := common.BytesToAddress(a)
|
|
||||||
code, err := t.fromBuf(vm, initcode, true)
|
|
||||||
if err != nil {
|
|
||||||
vm.Interrupt(err)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
code = common.CopyBytes(code)
|
|
||||||
codeHash := crypto.Keccak256(code)
|
|
||||||
b := crypto.CreateAddress2(addr, common.HexToHash(salt), codeHash).Bytes()
|
|
||||||
res, err := t.toBuf(vm, b)
|
|
||||||
if err != nil {
|
|
||||||
vm.Interrupt(err)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
})
|
|
||||||
vm.Set("isPrecompiled", func(v goja.Value) bool {
|
|
||||||
a, err := t.fromBuf(vm, v, true)
|
|
||||||
if err != nil {
|
|
||||||
vm.Interrupt(err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
addr := common.BytesToAddress(a)
|
|
||||||
for _, p := range t.activePrecompiles {
|
|
||||||
if p == addr {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
})
|
|
||||||
vm.Set("slice", func(slice goja.Value, start, end int64) goja.Value {
|
|
||||||
b, err := t.fromBuf(vm, slice, false)
|
|
||||||
if err != nil {
|
|
||||||
vm.Interrupt(err)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
if start < 0 || start > end || end > int64(len(b)) {
|
|
||||||
vm.Interrupt(fmt.Sprintf("Tracer accessed out of bound memory: available %d, offset %d, size %d", len(b), start, end-start))
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
res, err := t.toBuf(vm, b[start:end])
|
|
||||||
if err != nil {
|
|
||||||
vm.Interrupt(err)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// setTypeConverters sets up utilities for converting Go types into those
|
|
||||||
// suitable for JS consumption.
|
|
||||||
func (t *jsTracer) setTypeConverters() error {
|
|
||||||
// Inject bigint logic.
|
|
||||||
// TODO: To be replaced after goja adds support for native JS bigint.
|
|
||||||
toBigCode, err := t.vm.RunProgram(bigIntProgram)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
// Used to create JS bigint objects from go.
|
|
||||||
toBigFn, ok := goja.AssertFunction(toBigCode)
|
|
||||||
if !ok {
|
|
||||||
return errors.New("failed to bind bigInt func")
|
|
||||||
}
|
|
||||||
toBigWrapper := func(vm *goja.Runtime, val string) (goja.Value, error) {
|
|
||||||
return toBigFn(goja.Undefined(), vm.ToValue(val))
|
|
||||||
}
|
|
||||||
t.toBig = toBigWrapper
|
|
||||||
// NOTE: We need this workaround to create JS buffers because
|
|
||||||
// goja doesn't at the moment expose constructors for typed arrays.
|
|
||||||
//
|
|
||||||
// Cache uint8ArrayType once to be used every time for less overhead.
|
|
||||||
uint8ArrayType := t.vm.Get("Uint8Array")
|
|
||||||
toBufWrapper := func(vm *goja.Runtime, val []byte) (goja.Value, error) {
|
|
||||||
return toBuf(vm, uint8ArrayType, val)
|
|
||||||
}
|
|
||||||
t.toBuf = toBufWrapper
|
|
||||||
fromBufWrapper := func(vm *goja.Runtime, buf goja.Value, allowString bool) ([]byte, error) {
|
|
||||||
return fromBuf(vm, uint8ArrayType, buf, allowString)
|
|
||||||
}
|
|
||||||
t.fromBuf = fromBufWrapper
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type opObj struct {
|
|
||||||
vm *goja.Runtime
|
|
||||||
op vm.OpCode
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *opObj) ToNumber() int {
|
|
||||||
return int(o.op)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *opObj) ToString() string {
|
|
||||||
return o.op.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *opObj) IsPush() bool {
|
|
||||||
return o.op.IsPush()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *opObj) setupObject() *goja.Object {
|
|
||||||
obj := o.vm.NewObject()
|
|
||||||
obj.Set("toNumber", o.vm.ToValue(o.ToNumber))
|
|
||||||
obj.Set("toString", o.vm.ToValue(o.ToString))
|
|
||||||
obj.Set("isPush", o.vm.ToValue(o.IsPush))
|
|
||||||
return obj
|
|
||||||
}
|
|
||||||
|
|
||||||
type memoryObj struct {
|
|
||||||
memory *vm.Memory
|
|
||||||
vm *goja.Runtime
|
|
||||||
toBig toBigFn
|
|
||||||
toBuf toBufFn
|
|
||||||
}
|
|
||||||
|
|
||||||
func (mo *memoryObj) Slice(begin, end int64) goja.Value {
|
|
||||||
b, err := mo.slice(begin, end)
|
|
||||||
if err != nil {
|
|
||||||
mo.vm.Interrupt(err)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
res, err := mo.toBuf(mo.vm, b)
|
|
||||||
if err != nil {
|
|
||||||
mo.vm.Interrupt(err)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
// slice returns the requested range of memory as a byte slice.
|
|
||||||
func (mo *memoryObj) slice(begin, end int64) ([]byte, error) {
|
|
||||||
if end == begin {
|
|
||||||
return []byte{}, nil
|
|
||||||
}
|
|
||||||
if end < begin || begin < 0 {
|
|
||||||
return nil, fmt.Errorf("tracer accessed out of bound memory: offset %d, end %d", begin, end)
|
|
||||||
}
|
|
||||||
slice, err := tracers.GetMemoryCopyPadded(mo.memory, begin, end-begin)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return slice, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (mo *memoryObj) GetUint(addr int64) goja.Value {
|
|
||||||
value, err := mo.getUint(addr)
|
|
||||||
if err != nil {
|
|
||||||
mo.vm.Interrupt(err)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
res, err := mo.toBig(mo.vm, value.String())
|
|
||||||
if err != nil {
|
|
||||||
mo.vm.Interrupt(err)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
// getUint returns the 32 bytes at the specified address interpreted as a uint.
|
|
||||||
func (mo *memoryObj) getUint(addr int64) (*big.Int, error) {
|
|
||||||
if mo.memory.Len() < int(addr)+32 || addr < 0 {
|
|
||||||
return nil, fmt.Errorf("tracer accessed out of bound memory: available %d, offset %d, size %d", mo.memory.Len(), addr, 32)
|
|
||||||
}
|
|
||||||
return new(big.Int).SetBytes(mo.memory.GetPtr(addr, 32)), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (mo *memoryObj) Length() int {
|
|
||||||
return mo.memory.Len()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *memoryObj) setupObject() *goja.Object {
|
|
||||||
o := m.vm.NewObject()
|
|
||||||
o.Set("slice", m.vm.ToValue(m.Slice))
|
|
||||||
o.Set("getUint", m.vm.ToValue(m.GetUint))
|
|
||||||
o.Set("length", m.vm.ToValue(m.Length))
|
|
||||||
return o
|
|
||||||
}
|
|
||||||
|
|
||||||
type stackObj struct {
|
|
||||||
stack *vm.Stack
|
|
||||||
vm *goja.Runtime
|
|
||||||
toBig toBigFn
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *stackObj) Peek(idx int) goja.Value {
|
|
||||||
value, err := s.peek(idx)
|
|
||||||
if err != nil {
|
|
||||||
s.vm.Interrupt(err)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
res, err := s.toBig(s.vm, value.String())
|
|
||||||
if err != nil {
|
|
||||||
s.vm.Interrupt(err)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
// peek returns the nth-from-the-top element of the stack.
|
|
||||||
func (s *stackObj) peek(idx int) (*big.Int, error) {
|
|
||||||
if len(s.stack.Data()) <= idx || idx < 0 {
|
|
||||||
return nil, fmt.Errorf("tracer accessed out of bound stack: size %d, index %d", len(s.stack.Data()), idx)
|
|
||||||
}
|
|
||||||
return s.stack.Back(idx).ToBig(), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *stackObj) Length() int {
|
|
||||||
return len(s.stack.Data())
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *stackObj) setupObject() *goja.Object {
|
|
||||||
o := s.vm.NewObject()
|
|
||||||
o.Set("peek", s.vm.ToValue(s.Peek))
|
|
||||||
o.Set("length", s.vm.ToValue(s.Length))
|
|
||||||
return o
|
|
||||||
}
|
|
||||||
|
|
||||||
type dbObj struct {
|
|
||||||
db vm.StateDB
|
|
||||||
vm *goja.Runtime
|
|
||||||
toBig toBigFn
|
|
||||||
toBuf toBufFn
|
|
||||||
fromBuf fromBufFn
|
|
||||||
}
|
|
||||||
|
|
||||||
func (do *dbObj) GetBalance(addrSlice goja.Value) goja.Value {
|
|
||||||
a, err := do.fromBuf(do.vm, addrSlice, false)
|
|
||||||
if err != nil {
|
|
||||||
do.vm.Interrupt(err)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
addr := common.BytesToAddress(a)
|
|
||||||
value := do.db.GetBalance(addr)
|
|
||||||
res, err := do.toBig(do.vm, value.String())
|
|
||||||
if err != nil {
|
|
||||||
do.vm.Interrupt(err)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
func (do *dbObj) GetNonce(addrSlice goja.Value) uint64 {
|
|
||||||
a, err := do.fromBuf(do.vm, addrSlice, false)
|
|
||||||
if err != nil {
|
|
||||||
do.vm.Interrupt(err)
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
addr := common.BytesToAddress(a)
|
|
||||||
return do.db.GetNonce(addr)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (do *dbObj) GetCode(addrSlice goja.Value) goja.Value {
|
|
||||||
a, err := do.fromBuf(do.vm, addrSlice, false)
|
|
||||||
if err != nil {
|
|
||||||
do.vm.Interrupt(err)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
addr := common.BytesToAddress(a)
|
|
||||||
code := do.db.GetCode(addr)
|
|
||||||
res, err := do.toBuf(do.vm, code)
|
|
||||||
if err != nil {
|
|
||||||
do.vm.Interrupt(err)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
func (do *dbObj) GetState(addrSlice goja.Value, hashSlice goja.Value) goja.Value {
|
|
||||||
a, err := do.fromBuf(do.vm, addrSlice, false)
|
|
||||||
if err != nil {
|
|
||||||
do.vm.Interrupt(err)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
addr := common.BytesToAddress(a)
|
|
||||||
h, err := do.fromBuf(do.vm, hashSlice, false)
|
|
||||||
if err != nil {
|
|
||||||
do.vm.Interrupt(err)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
hash := common.BytesToHash(h)
|
|
||||||
state := do.db.GetState(addr, hash).Bytes()
|
|
||||||
res, err := do.toBuf(do.vm, state)
|
|
||||||
if err != nil {
|
|
||||||
do.vm.Interrupt(err)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
func (do *dbObj) Exists(addrSlice goja.Value) bool {
|
|
||||||
a, err := do.fromBuf(do.vm, addrSlice, false)
|
|
||||||
if err != nil {
|
|
||||||
do.vm.Interrupt(err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
addr := common.BytesToAddress(a)
|
|
||||||
return do.db.Exist(addr)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (do *dbObj) setupObject() *goja.Object {
|
|
||||||
o := do.vm.NewObject()
|
|
||||||
o.Set("getBalance", do.vm.ToValue(do.GetBalance))
|
|
||||||
o.Set("getNonce", do.vm.ToValue(do.GetNonce))
|
|
||||||
o.Set("getCode", do.vm.ToValue(do.GetCode))
|
|
||||||
o.Set("getState", do.vm.ToValue(do.GetState))
|
|
||||||
o.Set("exists", do.vm.ToValue(do.Exists))
|
|
||||||
return o
|
|
||||||
}
|
|
||||||
|
|
||||||
type contractObj struct {
|
|
||||||
contract *vm.Contract
|
|
||||||
vm *goja.Runtime
|
|
||||||
toBig toBigFn
|
|
||||||
toBuf toBufFn
|
|
||||||
}
|
|
||||||
|
|
||||||
func (co *contractObj) GetCaller() goja.Value {
|
|
||||||
caller := co.contract.Caller().Bytes()
|
|
||||||
res, err := co.toBuf(co.vm, caller)
|
|
||||||
if err != nil {
|
|
||||||
co.vm.Interrupt(err)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
func (co *contractObj) GetAddress() goja.Value {
|
|
||||||
addr := co.contract.Address().Bytes()
|
|
||||||
res, err := co.toBuf(co.vm, addr)
|
|
||||||
if err != nil {
|
|
||||||
co.vm.Interrupt(err)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
func (co *contractObj) GetValue() goja.Value {
|
|
||||||
value := co.contract.Value()
|
|
||||||
res, err := co.toBig(co.vm, value.String())
|
|
||||||
if err != nil {
|
|
||||||
co.vm.Interrupt(err)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
func (co *contractObj) GetInput() goja.Value {
|
|
||||||
input := common.CopyBytes(co.contract.Input)
|
|
||||||
res, err := co.toBuf(co.vm, input)
|
|
||||||
if err != nil {
|
|
||||||
co.vm.Interrupt(err)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *contractObj) setupObject() *goja.Object {
|
|
||||||
o := c.vm.NewObject()
|
|
||||||
o.Set("getCaller", c.vm.ToValue(c.GetCaller))
|
|
||||||
o.Set("getAddress", c.vm.ToValue(c.GetAddress))
|
|
||||||
o.Set("getValue", c.vm.ToValue(c.GetValue))
|
|
||||||
o.Set("getInput", c.vm.ToValue(c.GetInput))
|
|
||||||
return o
|
|
||||||
}
|
|
||||||
|
|
||||||
type callframe struct {
|
|
||||||
vm *goja.Runtime
|
|
||||||
toBig toBigFn
|
|
||||||
toBuf toBufFn
|
|
||||||
|
|
||||||
typ string
|
|
||||||
from common.Address
|
|
||||||
to common.Address
|
|
||||||
input []byte
|
|
||||||
gas uint
|
|
||||||
value *big.Int
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *callframe) GetType() string {
|
|
||||||
return f.typ
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *callframe) GetFrom() goja.Value {
|
|
||||||
from := f.from.Bytes()
|
|
||||||
res, err := f.toBuf(f.vm, from)
|
|
||||||
if err != nil {
|
|
||||||
f.vm.Interrupt(err)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *callframe) GetTo() goja.Value {
|
|
||||||
to := f.to.Bytes()
|
|
||||||
res, err := f.toBuf(f.vm, to)
|
|
||||||
if err != nil {
|
|
||||||
f.vm.Interrupt(err)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *callframe) GetInput() goja.Value {
|
|
||||||
input := f.input
|
|
||||||
res, err := f.toBuf(f.vm, input)
|
|
||||||
if err != nil {
|
|
||||||
f.vm.Interrupt(err)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *callframe) GetGas() uint {
|
|
||||||
return f.gas
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *callframe) GetValue() goja.Value {
|
|
||||||
if f.value == nil {
|
|
||||||
return goja.Undefined()
|
|
||||||
}
|
|
||||||
res, err := f.toBig(f.vm, f.value.String())
|
|
||||||
if err != nil {
|
|
||||||
f.vm.Interrupt(err)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *callframe) setupObject() *goja.Object {
|
|
||||||
o := f.vm.NewObject()
|
|
||||||
o.Set("getType", f.vm.ToValue(f.GetType))
|
|
||||||
o.Set("getFrom", f.vm.ToValue(f.GetFrom))
|
|
||||||
o.Set("getTo", f.vm.ToValue(f.GetTo))
|
|
||||||
o.Set("getInput", f.vm.ToValue(f.GetInput))
|
|
||||||
o.Set("getGas", f.vm.ToValue(f.GetGas))
|
|
||||||
o.Set("getValue", f.vm.ToValue(f.GetValue))
|
|
||||||
return o
|
|
||||||
}
|
|
||||||
|
|
||||||
type callframeResult struct {
|
|
||||||
vm *goja.Runtime
|
|
||||||
toBuf toBufFn
|
|
||||||
|
|
||||||
gasUsed uint
|
|
||||||
output []byte
|
|
||||||
err error
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *callframeResult) GetGasUsed() uint {
|
|
||||||
return r.gasUsed
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *callframeResult) GetOutput() goja.Value {
|
|
||||||
res, err := r.toBuf(r.vm, r.output)
|
|
||||||
if err != nil {
|
|
||||||
r.vm.Interrupt(err)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *callframeResult) GetError() goja.Value {
|
|
||||||
if r.err != nil {
|
|
||||||
return r.vm.ToValue(r.err.Error())
|
|
||||||
}
|
|
||||||
return goja.Undefined()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *callframeResult) setupObject() *goja.Object {
|
|
||||||
o := r.vm.NewObject()
|
|
||||||
o.Set("getGasUsed", r.vm.ToValue(r.GetGasUsed))
|
|
||||||
o.Set("getOutput", r.vm.ToValue(r.GetOutput))
|
|
||||||
o.Set("getError", r.vm.ToValue(r.GetError))
|
|
||||||
return o
|
|
||||||
}
|
|
||||||
|
|
||||||
type steplog struct {
|
|
||||||
vm *goja.Runtime
|
|
||||||
|
|
||||||
op *opObj
|
|
||||||
memory *memoryObj
|
|
||||||
stack *stackObj
|
|
||||||
contract *contractObj
|
|
||||||
|
|
||||||
pc uint64
|
|
||||||
gas uint64
|
|
||||||
cost uint64
|
|
||||||
depth int
|
|
||||||
refund uint64
|
|
||||||
err error
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *steplog) GetPC() uint64 { return l.pc }
|
|
||||||
func (l *steplog) GetGas() uint64 { return l.gas }
|
|
||||||
func (l *steplog) GetCost() uint64 { return l.cost }
|
|
||||||
func (l *steplog) GetDepth() int { return l.depth }
|
|
||||||
func (l *steplog) GetRefund() uint64 { return l.refund }
|
|
||||||
|
|
||||||
func (l *steplog) GetError() goja.Value {
|
|
||||||
if l.err != nil {
|
|
||||||
return l.vm.ToValue(l.err.Error())
|
|
||||||
}
|
|
||||||
return goja.Undefined()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *steplog) setupObject() *goja.Object {
|
|
||||||
o := l.vm.NewObject()
|
|
||||||
// Setup basic fields.
|
|
||||||
o.Set("getPC", l.vm.ToValue(l.GetPC))
|
|
||||||
o.Set("getGas", l.vm.ToValue(l.GetGas))
|
|
||||||
o.Set("getCost", l.vm.ToValue(l.GetCost))
|
|
||||||
o.Set("getDepth", l.vm.ToValue(l.GetDepth))
|
|
||||||
o.Set("getRefund", l.vm.ToValue(l.GetRefund))
|
|
||||||
o.Set("getError", l.vm.ToValue(l.GetError))
|
|
||||||
// Setup nested objects.
|
|
||||||
o.Set("op", l.op.setupObject())
|
|
||||||
o.Set("stack", l.stack.setupObject())
|
|
||||||
o.Set("memory", l.memory.setupObject())
|
|
||||||
o.Set("contract", l.contract.setupObject())
|
|
||||||
return o
|
|
||||||
}
|
|
||||||
|
|
@ -1,86 +0,0 @@
|
||||||
// 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/>.
|
|
||||||
|
|
||||||
// 4byteTracer searches for 4byte-identifiers, and collects them for post-processing.
|
|
||||||
// It collects the methods identifiers along with the size of the supplied data, so
|
|
||||||
// a reversed signature can be matched against the size of the data.
|
|
||||||
//
|
|
||||||
// Example:
|
|
||||||
// > debug.traceTransaction( "0x214e597e35da083692f5386141e69f47e973b2c56e7a8073b1ea08fd7571e9de", {tracer: "4byteTracer"})
|
|
||||||
// {
|
|
||||||
// 0x27dc297e-128: 1,
|
|
||||||
// 0x38cc4831-0: 2,
|
|
||||||
// 0x524f3889-96: 1,
|
|
||||||
// 0xadf59f99-288: 1,
|
|
||||||
// 0xc281d19e-0: 1
|
|
||||||
// }
|
|
||||||
{
|
|
||||||
// ids aggregates the 4byte ids found.
|
|
||||||
ids : {},
|
|
||||||
|
|
||||||
// callType returns 'false' for non-calls, or the peek-index for the first param
|
|
||||||
// after 'value', i.e. meminstart.
|
|
||||||
callType: function(opstr){
|
|
||||||
switch(opstr){
|
|
||||||
case "CALL": case "CALLCODE":
|
|
||||||
// gas, addr, val, memin, meminsz, memout, memoutsz
|
|
||||||
return 3; // stack ptr to memin
|
|
||||||
|
|
||||||
case "DELEGATECALL": case "STATICCALL":
|
|
||||||
// gas, addr, memin, meminsz, memout, memoutsz
|
|
||||||
return 2; // stack ptr to memin
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
},
|
|
||||||
|
|
||||||
// store save the given identifier and datasize.
|
|
||||||
store: function(id, size){
|
|
||||||
var key = "" + toHex(id) + "-" + size;
|
|
||||||
this.ids[key] = this.ids[key] + 1 || 1;
|
|
||||||
},
|
|
||||||
|
|
||||||
// step is invoked for every opcode that the VM executes.
|
|
||||||
step: function(log, db) {
|
|
||||||
// Skip any opcodes that are not internal calls
|
|
||||||
var ct = this.callType(log.op.toString());
|
|
||||||
if (!ct) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Skip any pre-compile invocations, those are just fancy opcodes
|
|
||||||
if (isPrecompiled(toAddress(log.stack.peek(1).toString(16)))) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Gather internal call details
|
|
||||||
var inSz = log.stack.peek(ct + 1).valueOf();
|
|
||||||
if (inSz >= 4) {
|
|
||||||
var inOff = log.stack.peek(ct).valueOf();
|
|
||||||
this.store(log.memory.slice(inOff, inOff + 4), inSz-4);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
// 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) {
|
|
||||||
// Save the outer calldata also
|
|
||||||
if (ctx.input.length >= 4) {
|
|
||||||
this.store(slice(ctx.input, 0, 4), ctx.input.length-4)
|
|
||||||
}
|
|
||||||
return this.ids;
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
@ -1,47 +0,0 @@
|
||||||
// Copyright 2018 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/>.
|
|
||||||
|
|
||||||
{
|
|
||||||
// hist is the counters of opcode bigrams
|
|
||||||
hist: {},
|
|
||||||
// lastOp is last operation
|
|
||||||
lastOp: '',
|
|
||||||
// execution depth of last op
|
|
||||||
lastDepth: 0,
|
|
||||||
// step is invoked for every opcode that the VM executes.
|
|
||||||
step: function(log, db) {
|
|
||||||
var op = log.op.toString();
|
|
||||||
var depth = log.getDepth();
|
|
||||||
if (depth == this.lastDepth){
|
|
||||||
var key = this.lastOp+'-'+op;
|
|
||||||
if (this.hist[key]){
|
|
||||||
this.hist[key]++;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
this.hist[key] = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.lastOp = op;
|
|
||||||
this.lastDepth = depth;
|
|
||||||
},
|
|
||||||
// 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) {
|
|
||||||
return this.hist;
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
@ -1,250 +0,0 @@
|
||||||
// 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),
|
|
||||||
};
|
|
||||||
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,
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,93 +0,0 @@
|
||||||
// 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/>.
|
|
||||||
|
|
||||||
// evmdisTracer returns sufficient information from a trace to perform evmdis-style
|
|
||||||
// disassembly.
|
|
||||||
{
|
|
||||||
stack: [{ops: []}],
|
|
||||||
|
|
||||||
npushes: {0: 0, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1, 10: 1, 11: 1, 16: 1, 17: 1, 18: 1, 19: 1, 20: 1, 21: 1, 22: 1, 23: 1, 24: 1, 25: 1, 26: 1, 32: 1, 48: 1, 49: 1, 50: 1, 51: 1, 52: 1, 53: 1, 54: 1, 55: 0, 56: 1, 57: 0, 58: 1, 59: 1, 60: 0, 64: 1, 65: 1, 66: 1, 67: 1, 68: 1, 69: 1, 80: 0, 81: 1, 82: 0, 83: 0, 84: 1, 85: 0, 86: 0, 87: 0, 88: 1, 89: 1, 90: 1, 91: 0, 96: 1, 97: 1, 98: 1, 99: 1, 100: 1, 101: 1, 102: 1, 103: 1, 104: 1, 105: 1, 106: 1, 107: 1, 108: 1, 109: 1, 110: 1, 111: 1, 112: 1, 113: 1, 114: 1, 115: 1, 116: 1, 117: 1, 118: 1, 119: 1, 120: 1, 121: 1, 122: 1, 123: 1, 124: 1, 125: 1, 126: 1, 127: 1, 128: 2, 129: 3, 130: 4, 131: 5, 132: 6, 133: 7, 134: 8, 135: 9, 136: 10, 137: 11, 138: 12, 139: 13, 140: 14, 141: 15, 142: 16, 143: 17, 144: 2, 145: 3, 146: 4, 147: 5, 148: 6, 149: 7, 150: 8, 151: 9, 152: 10, 153: 11, 154: 12, 155: 13, 156: 14, 157: 15, 158: 16, 159: 17, 160: 0, 161: 0, 162: 0, 163: 0, 164: 0, 240: 1, 241: 1, 242: 1, 243: 0, 244: 0, 255: 0},
|
|
||||||
|
|
||||||
// result is invoked when all the opcodes have been iterated over and returns
|
|
||||||
// the final result of the tracing.
|
|
||||||
result: function() { return this.stack[0].ops; },
|
|
||||||
|
|
||||||
// fault is invoked when the actual execution of an opcode fails.
|
|
||||||
fault: function(log, db) { },
|
|
||||||
|
|
||||||
// step is invoked for every opcode that the VM executes.
|
|
||||||
step: function(log, db) {
|
|
||||||
var frame = this.stack[this.stack.length - 1];
|
|
||||||
|
|
||||||
var error = log.getError();
|
|
||||||
if (error) {
|
|
||||||
frame["error"] = error;
|
|
||||||
} else if (log.getDepth() == this.stack.length) {
|
|
||||||
opinfo = {
|
|
||||||
op: log.op.toNumber(),
|
|
||||||
depth : log.getDepth(),
|
|
||||||
result: [],
|
|
||||||
};
|
|
||||||
if (frame.ops.length > 0) {
|
|
||||||
var prevop = frame.ops[frame.ops.length - 1];
|
|
||||||
for(var i = 0; i < this.npushes[prevop.op]; i++)
|
|
||||||
prevop.result.push(log.stack.peek(i).toString(16));
|
|
||||||
}
|
|
||||||
switch(log.op.toString()) {
|
|
||||||
case "CALL": case "CALLCODE":
|
|
||||||
var instart = log.stack.peek(3).valueOf();
|
|
||||||
var insize = log.stack.peek(4).valueOf();
|
|
||||||
opinfo["gas"] = log.stack.peek(0).valueOf();
|
|
||||||
opinfo["to"] = log.stack.peek(1).toString(16);
|
|
||||||
opinfo["value"] = log.stack.peek(2).toString();
|
|
||||||
opinfo["input"] = log.memory.slice(instart, instart + insize);
|
|
||||||
opinfo["error"] = null;
|
|
||||||
opinfo["return"] = null;
|
|
||||||
opinfo["ops"] = [];
|
|
||||||
this.stack.push(opinfo);
|
|
||||||
break;
|
|
||||||
case "DELEGATECALL": case "STATICCALL":
|
|
||||||
var instart = log.stack.peek(2).valueOf();
|
|
||||||
var insize = log.stack.peek(3).valueOf();
|
|
||||||
opinfo["op"] = log.op.toString();
|
|
||||||
opinfo["gas"] = log.stack.peek(0).valueOf();
|
|
||||||
opinfo["to"] = log.stack.peek(1).toString(16);
|
|
||||||
opinfo["input"] = log.memory.slice(instart, instart + insize);
|
|
||||||
opinfo["error"] = null;
|
|
||||||
opinfo["return"] = null;
|
|
||||||
opinfo["ops"] = [];
|
|
||||||
this.stack.push(opinfo);
|
|
||||||
break;
|
|
||||||
case "RETURN": case "REVERT":
|
|
||||||
var out = log.stack.peek(0).valueOf();
|
|
||||||
var outsize = log.stack.peek(1).valueOf();
|
|
||||||
frame.return = log.memory.slice(out, out + outsize);
|
|
||||||
break;
|
|
||||||
case "STOP": case "SELFDESTRUCT":
|
|
||||||
frame.return = log.memory.slice(0, 0);
|
|
||||||
break;
|
|
||||||
case "JUMPDEST":
|
|
||||||
opinfo["pc"] = log.getPC();
|
|
||||||
}
|
|
||||||
if(log.op.isPush()) {
|
|
||||||
opinfo["len"] = log.op.toNumber() - 0x5e;
|
|
||||||
}
|
|
||||||
frame.ops.push(opinfo);
|
|
||||||
} else {
|
|
||||||
this.stack = this.stack.slice(0, log.getDepth());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,29 +0,0 @@
|
||||||
// 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/>.
|
|
||||||
|
|
||||||
// noopTracer is just the barebone boilerplate code required from a JavaScript
|
|
||||||
// object to be usable as a transaction tracer.
|
|
||||||
{
|
|
||||||
// step is invoked for every opcode that the VM executes.
|
|
||||||
step: function(log, db) { },
|
|
||||||
|
|
||||||
// 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 {}; }
|
|
||||||
}
|
|
||||||
|
|
@ -1,32 +0,0 @@
|
||||||
// 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/>.
|
|
||||||
|
|
||||||
// opcountTracer is a sample tracer that just counts the number of instructions
|
|
||||||
// executed by the EVM before the transaction terminated.
|
|
||||||
{
|
|
||||||
// count tracks the number of EVM instructions executed.
|
|
||||||
count: 0,
|
|
||||||
|
|
||||||
// step is invoked for every opcode that the VM executes.
|
|
||||||
step: function(log, db) { this.count++ },
|
|
||||||
|
|
||||||
// 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.count }
|
|
||||||
}
|
|
||||||
|
|
@ -1,115 +0,0 @@
|
||||||
// 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/>.
|
|
||||||
|
|
||||||
// prestateTracer outputs sufficient information to create a local execution of
|
|
||||||
// the transaction from a custom assembled genesis block.
|
|
||||||
{
|
|
||||||
// prestate is the genesis that we're building.
|
|
||||||
prestate: null,
|
|
||||||
|
|
||||||
// lookupAccount injects the specified account into the prestate object.
|
|
||||||
lookupAccount: function(addr, db){
|
|
||||||
var acc = toHex(addr);
|
|
||||||
if (this.prestate[acc] === undefined) {
|
|
||||||
this.prestate[acc] = {
|
|
||||||
balance: '0x' + db.getBalance(addr).toString(16),
|
|
||||||
nonce: db.getNonce(addr),
|
|
||||||
code: toHex(db.getCode(addr)),
|
|
||||||
storage: {}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
// lookupStorage injects the specified storage entry of the given account into
|
|
||||||
// the prestate object.
|
|
||||||
lookupStorage: function(addr, key, db){
|
|
||||||
var acc = toHex(addr);
|
|
||||||
var idx = toHex(key);
|
|
||||||
|
|
||||||
if (this.prestate[acc].storage[idx] === undefined) {
|
|
||||||
this.prestate[acc].storage[idx] = toHex(db.getState(addr, key));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
// result is invoked when all the opcodes have been iterated over and returns
|
|
||||||
// the final result of the tracing.
|
|
||||||
result: function(ctx, db) {
|
|
||||||
if (this.prestate === null) {
|
|
||||||
this.prestate = {};
|
|
||||||
// If tx is transfer-only, the recipient account
|
|
||||||
// hasn't been populated.
|
|
||||||
this.lookupAccount(ctx.to, db);
|
|
||||||
}
|
|
||||||
|
|
||||||
// At this point, we need to deduct the 'value' from the
|
|
||||||
// outer transaction, and move it back to the origin
|
|
||||||
this.lookupAccount(ctx.from, db);
|
|
||||||
|
|
||||||
var fromBal = bigInt(this.prestate[toHex(ctx.from)].balance.slice(2), 16);
|
|
||||||
var toBal = bigInt(this.prestate[toHex(ctx.to)].balance.slice(2), 16);
|
|
||||||
|
|
||||||
this.prestate[toHex(ctx.to)].balance = '0x'+toBal.subtract(ctx.value).toString(16);
|
|
||||||
this.prestate[toHex(ctx.from)].balance = '0x'+fromBal.add(ctx.value).add(ctx.gasUsed * ctx.gasPrice).toString(16);
|
|
||||||
|
|
||||||
// Decrement the caller's nonce, and remove empty create targets
|
|
||||||
this.prestate[toHex(ctx.from)].nonce--;
|
|
||||||
if (ctx.type == 'CREATE') {
|
|
||||||
// We can blibdly delete the contract prestate, as any existing state would
|
|
||||||
// have caused the transaction to be rejected as invalid in the first place.
|
|
||||||
delete this.prestate[toHex(ctx.to)];
|
|
||||||
}
|
|
||||||
// Return the assembled allocations (prestate)
|
|
||||||
return this.prestate;
|
|
||||||
},
|
|
||||||
|
|
||||||
// step is invoked for every opcode that the VM executes.
|
|
||||||
step: function(log, db) {
|
|
||||||
// Add the current account if we just started tracing
|
|
||||||
if (this.prestate === null){
|
|
||||||
this.prestate = {};
|
|
||||||
// Balance will potentially be wrong here, since this will include the value
|
|
||||||
// sent along with the message. We fix that in 'result()'.
|
|
||||||
this.lookupAccount(log.contract.getAddress(), db);
|
|
||||||
}
|
|
||||||
// Whenever new state is accessed, add it to the prestate
|
|
||||||
switch (log.op.toString()) {
|
|
||||||
case "EXTCODECOPY": case "EXTCODESIZE": case "EXTCODEHASH": case "BALANCE":
|
|
||||||
this.lookupAccount(toAddress(log.stack.peek(0).toString(16)), db);
|
|
||||||
break;
|
|
||||||
case "CREATE":
|
|
||||||
var from = log.contract.getAddress();
|
|
||||||
this.lookupAccount(toContract(from, db.getNonce(from)), db);
|
|
||||||
break;
|
|
||||||
case "CREATE2":
|
|
||||||
var from = log.contract.getAddress();
|
|
||||||
// stack: salt, size, offset, endowment
|
|
||||||
var offset = log.stack.peek(1).valueOf()
|
|
||||||
var size = log.stack.peek(2).valueOf()
|
|
||||||
var end = offset + size
|
|
||||||
this.lookupAccount(toContract2(from, log.stack.peek(3).toString(16), log.memory.slice(offset, end)), db);
|
|
||||||
break;
|
|
||||||
case "CALL": case "CALLCODE": case "DELEGATECALL": case "STATICCALL":
|
|
||||||
this.lookupAccount(toAddress(log.stack.peek(1).toString(16)), db);
|
|
||||||
break;
|
|
||||||
case 'SSTORE':case 'SLOAD':
|
|
||||||
this.lookupStorage(log.contract.getAddress(), toWord(log.stack.peek(0).toString(16)), db);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
// fault is invoked when the actual execution of an opcode fails.
|
|
||||||
fault: function(log, db) {}
|
|
||||||
}
|
|
||||||
|
|
@ -1,59 +0,0 @@
|
||||||
// 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/>.
|
|
||||||
|
|
||||||
// Package tracers contains the actual JavaScript tracer assets.
|
|
||||||
package tracers
|
|
||||||
|
|
||||||
import (
|
|
||||||
"embed"
|
|
||||||
"io/fs"
|
|
||||||
"strings"
|
|
||||||
"unicode"
|
|
||||||
)
|
|
||||||
|
|
||||||
//go:embed *.js
|
|
||||||
var files embed.FS
|
|
||||||
|
|
||||||
// Load reads the built-in JS tracer files embedded in the binary and
|
|
||||||
// returns a mapping of tracer name to source.
|
|
||||||
func Load() (map[string]string, error) {
|
|
||||||
var assetTracers = make(map[string]string)
|
|
||||||
err := fs.WalkDir(files, ".", func(path string, d fs.DirEntry, err error) error {
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if d.IsDir() {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
b, err := fs.ReadFile(files, path)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
name := camel(strings.TrimSuffix(path, ".js"))
|
|
||||||
assetTracers[name] = string(b)
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
return assetTracers, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// camel converts a snake cased input string into a camel cased output.
|
|
||||||
func camel(str string) string {
|
|
||||||
pieces := strings.Split(str, "_")
|
|
||||||
for i := 1; i < len(pieces); i++ {
|
|
||||||
pieces[i] = string(unicode.ToUpper(rune(pieces[i][0]))) + pieces[i][1:]
|
|
||||||
}
|
|
||||||
return strings.Join(pieces, "")
|
|
||||||
}
|
|
||||||
|
|
@ -1,49 +0,0 @@
|
||||||
// Copyright 2018 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/>.
|
|
||||||
|
|
||||||
{
|
|
||||||
// hist is the map of trigram counters
|
|
||||||
hist: {},
|
|
||||||
// lastOp is last operation
|
|
||||||
lastOps: ['',''],
|
|
||||||
lastDepth: 0,
|
|
||||||
// step is invoked for every opcode that the VM executes.
|
|
||||||
step: function(log, db) {
|
|
||||||
var depth = log.getDepth();
|
|
||||||
if (depth != this.lastDepth){
|
|
||||||
this.lastOps = ['',''];
|
|
||||||
this.lastDepth = depth;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var op = log.op.toString();
|
|
||||||
var key = this.lastOps[0]+'-'+this.lastOps[1]+'-'+op;
|
|
||||||
if (this.hist[key]){
|
|
||||||
this.hist[key]++;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
this.hist[key] = 1;
|
|
||||||
}
|
|
||||||
this.lastOps[0] = this.lastOps[1];
|
|
||||||
this.lastOps[1] = op;
|
|
||||||
},
|
|
||||||
// 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) {
|
|
||||||
return this.hist;
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
@ -1,41 +0,0 @@
|
||||||
// Copyright 2018 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/>.
|
|
||||||
|
|
||||||
{
|
|
||||||
// hist is the map of opcodes to counters
|
|
||||||
hist: {},
|
|
||||||
// nops counts number of ops
|
|
||||||
nops: 0,
|
|
||||||
// step is invoked for every opcode that the VM executes.
|
|
||||||
step: function(log, db) {
|
|
||||||
var op = log.op.toString();
|
|
||||||
if (this.hist[op]){
|
|
||||||
this.hist[op]++;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
this.hist[op] = 1;
|
|
||||||
}
|
|
||||||
this.nops++;
|
|
||||||
},
|
|
||||||
// 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) {
|
|
||||||
return this.hist;
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
@ -1,319 +0,0 @@
|
||||||
// Copyright 2021 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/>.
|
|
||||||
|
|
||||||
package js
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
|
||||||
"math/big"
|
|
||||||
"strings"
|
|
||||||
"testing"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
|
||||||
"github.com/ethereum/go-ethereum/core/state"
|
|
||||||
"github.com/ethereum/go-ethereum/core/vm"
|
|
||||||
"github.com/ethereum/go-ethereum/eth/tracers"
|
|
||||||
"github.com/ethereum/go-ethereum/params"
|
|
||||||
)
|
|
||||||
|
|
||||||
type account struct{}
|
|
||||||
|
|
||||||
func (account) SubBalance(amount *big.Int) {}
|
|
||||||
func (account) AddBalance(amount *big.Int) {}
|
|
||||||
func (account) SetAddress(common.Address) {}
|
|
||||||
func (account) Value() *big.Int { return nil }
|
|
||||||
func (account) SetBalance(*big.Int) {}
|
|
||||||
func (account) SetNonce(uint64) {}
|
|
||||||
func (account) Balance() *big.Int { return nil }
|
|
||||||
func (account) Address() common.Address { return common.Address{} }
|
|
||||||
func (account) SetCode(common.Hash, []byte) {}
|
|
||||||
func (account) ForEachStorage(cb func(key, value common.Hash) bool) {}
|
|
||||||
|
|
||||||
type dummyStatedb struct {
|
|
||||||
state.StateDB
|
|
||||||
}
|
|
||||||
|
|
||||||
func (*dummyStatedb) GetRefund() uint64 { return 1337 }
|
|
||||||
func (*dummyStatedb) GetBalance(addr common.Address) *big.Int { return new(big.Int) }
|
|
||||||
|
|
||||||
type vmContext struct {
|
|
||||||
blockCtx vm.BlockContext
|
|
||||||
txCtx vm.TxContext
|
|
||||||
}
|
|
||||||
|
|
||||||
func testCtx() *vmContext {
|
|
||||||
return &vmContext{blockCtx: vm.BlockContext{BlockNumber: big.NewInt(1)}, txCtx: vm.TxContext{GasPrice: big.NewInt(100000)}}
|
|
||||||
}
|
|
||||||
|
|
||||||
func runTrace(tracer tracers.Tracer, vmctx *vmContext, chaincfg *params.ChainConfig, contractCode []byte) (json.RawMessage, error) {
|
|
||||||
var (
|
|
||||||
env = vm.NewEVM(vmctx.blockCtx, vmctx.txCtx, &dummyStatedb{}, chaincfg, vm.Config{Tracer: tracer})
|
|
||||||
gasLimit uint64 = 31000
|
|
||||||
startGas uint64 = 10000
|
|
||||||
value = big.NewInt(0)
|
|
||||||
contract = vm.NewContract(account{}, account{}, value, startGas)
|
|
||||||
)
|
|
||||||
contract.Code = []byte{byte(vm.PUSH1), 0x1, byte(vm.PUSH1), 0x1, 0x0}
|
|
||||||
if contractCode != nil {
|
|
||||||
contract.Code = contractCode
|
|
||||||
}
|
|
||||||
|
|
||||||
tracer.CaptureTxStart(gasLimit)
|
|
||||||
tracer.CaptureStart(env, contract.Caller(), contract.Address(), false, []byte{}, startGas, value)
|
|
||||||
ret, err := env.Interpreter().Run(contract, []byte{}, false)
|
|
||||||
tracer.CaptureEnd(ret, startGas-contract.Gas, err)
|
|
||||||
// Rest gas assumes no refund
|
|
||||||
tracer.CaptureTxEnd(contract.Gas)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return tracer.GetResult()
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestTracer(t *testing.T) {
|
|
||||||
execTracer := func(code string, contract []byte) ([]byte, string) {
|
|
||||||
t.Helper()
|
|
||||||
tracer, err := newJsTracer(code, nil, nil)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
ret, err := runTrace(tracer, testCtx(), params.TestChainConfig, contract)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err.Error() // Stringify to allow comparison without nil checks
|
|
||||||
}
|
|
||||||
return ret, ""
|
|
||||||
}
|
|
||||||
for i, tt := range []struct {
|
|
||||||
code string
|
|
||||||
want string
|
|
||||||
fail string
|
|
||||||
contract []byte
|
|
||||||
}{
|
|
||||||
{ // tests that we don't panic on bad arguments to memory access
|
|
||||||
code: "{depths: [], step: function(log) { this.depths.push(log.memory.slice(-1,-2)); }, fault: function() {}, result: function() { return this.depths; }}",
|
|
||||||
want: ``,
|
|
||||||
fail: "tracer accessed out of bound memory: offset -1, end -2 at step (<eval>:1:53(13)) in server-side tracer function 'step'",
|
|
||||||
}, { // tests that we don't panic on bad arguments to stack peeks
|
|
||||||
code: "{depths: [], step: function(log) { this.depths.push(log.stack.peek(-1)); }, fault: function() {}, result: function() { return this.depths; }}",
|
|
||||||
want: ``,
|
|
||||||
fail: "tracer accessed out of bound stack: size 0, index -1 at step (<eval>:1:53(11)) in server-side tracer function 'step'",
|
|
||||||
}, { // tests that we don't panic on bad arguments to memory getUint
|
|
||||||
code: "{ depths: [], step: function(log, db) { this.depths.push(log.memory.getUint(-64));}, fault: function() {}, result: function() { return this.depths; }}",
|
|
||||||
want: ``,
|
|
||||||
fail: "tracer accessed out of bound memory: available 0, offset -64, size 32 at step (<eval>:1:58(11)) in server-side tracer function 'step'",
|
|
||||||
}, { // tests some general counting
|
|
||||||
code: "{count: 0, step: function() { this.count += 1; }, fault: function() {}, result: function() { return this.count; }}",
|
|
||||||
want: `3`,
|
|
||||||
}, { // tests that depth is reported correctly
|
|
||||||
code: "{depths: [], step: function(log) { this.depths.push(log.stack.length()); }, fault: function() {}, result: function() { return this.depths; }}",
|
|
||||||
want: `[0,1,2]`,
|
|
||||||
}, { // tests memory length
|
|
||||||
code: "{lengths: [], step: function(log) { this.lengths.push(log.memory.length()); }, fault: function() {}, result: function() { return this.lengths; }}",
|
|
||||||
want: `[0,0,0]`,
|
|
||||||
}, { // tests to-string of opcodes
|
|
||||||
code: "{opcodes: [], step: function(log) { this.opcodes.push(log.op.toString()); }, fault: function() {}, result: function() { return this.opcodes; }}",
|
|
||||||
want: `["PUSH1","PUSH1","STOP"]`,
|
|
||||||
}, { // tests gasUsed
|
|
||||||
code: "{depths: [], step: function() {}, fault: function() {}, result: function(ctx) { return ctx.gasPrice+'.'+ctx.gasUsed; }}",
|
|
||||||
want: `"100000.21006"`,
|
|
||||||
}, {
|
|
||||||
code: "{res: null, step: function(log) {}, fault: function() {}, result: function() { return toWord('0xffaa') }}",
|
|
||||||
want: `{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":255,"31":170}`,
|
|
||||||
}, { // test feeding a buffer back into go
|
|
||||||
code: "{res: null, step: function(log) { var address = log.contract.getAddress(); this.res = toAddress(address); }, fault: function() {}, result: function() { return this.res }}",
|
|
||||||
want: `{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0}`,
|
|
||||||
}, {
|
|
||||||
code: "{res: null, step: function(log) { var address = '0x0000000000000000000000000000000000000000'; this.res = toAddress(address); }, fault: function() {}, result: function() { return this.res }}",
|
|
||||||
want: `{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0}`,
|
|
||||||
}, {
|
|
||||||
code: "{res: null, step: function(log) { var address = Array.prototype.slice.call(log.contract.getAddress()); this.res = toAddress(address); }, fault: function() {}, result: function() { return this.res }}",
|
|
||||||
want: `{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0}`,
|
|
||||||
}, {
|
|
||||||
code: "{res: [], step: function(log) { var op = log.op.toString(); if (op === 'MSTORE8' || op === 'STOP') { this.res.push(log.memory.slice(0, 2)) } }, fault: function() {}, result: function() { return this.res }}",
|
|
||||||
want: `[{"0":0,"1":0},{"0":255,"1":0}]`,
|
|
||||||
contract: []byte{byte(vm.PUSH1), byte(0xff), byte(vm.PUSH1), byte(0x00), byte(vm.MSTORE8), byte(vm.STOP)},
|
|
||||||
}, {
|
|
||||||
code: "{res: [], step: function(log) { if (log.op.toString() === 'STOP') { this.res.push(log.memory.slice(5, 1025 * 1024)) } }, fault: function() {}, result: function() { return this.res }}",
|
|
||||||
want: "",
|
|
||||||
fail: "reached limit for padding memory slice: 1049568 at step (<eval>:1:83(20)) in server-side tracer function 'step'",
|
|
||||||
contract: []byte{byte(vm.PUSH1), byte(0xff), byte(vm.PUSH1), byte(0x00), byte(vm.MSTORE8), byte(vm.STOP)},
|
|
||||||
},
|
|
||||||
} {
|
|
||||||
if have, err := execTracer(tt.code, tt.contract); tt.want != string(have) || tt.fail != err {
|
|
||||||
t.Errorf("testcase %d: expected return value to be \n'%s'\n\tgot\n'%s'\nerror to be\n'%s'\n\tgot\n'%s'\n\tcode: %v", i, tt.want, string(have), tt.fail, err, tt.code)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestHalt(t *testing.T) {
|
|
||||||
timeout := errors.New("stahp")
|
|
||||||
tracer, err := newJsTracer("{step: function() { while(1); }, result: function() { return null; }, fault: function(){}}", nil, nil)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
go func() {
|
|
||||||
time.Sleep(1 * time.Second)
|
|
||||||
tracer.Stop(timeout)
|
|
||||||
}()
|
|
||||||
if _, err = runTrace(tracer, testCtx(), params.TestChainConfig, nil); !strings.Contains(err.Error(), "stahp") {
|
|
||||||
t.Errorf("Expected timeout error, got %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestHaltBetweenSteps(t *testing.T) {
|
|
||||||
tracer, err := newJsTracer("{step: function() {}, fault: function() {}, result: function() { return null; }}", nil, nil)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
env := vm.NewEVM(vm.BlockContext{BlockNumber: big.NewInt(1)}, vm.TxContext{GasPrice: big.NewInt(1)}, &dummyStatedb{}, params.TestChainConfig, vm.Config{Tracer: tracer})
|
|
||||||
scope := &vm.ScopeContext{
|
|
||||||
Contract: vm.NewContract(&account{}, &account{}, big.NewInt(0), 0),
|
|
||||||
}
|
|
||||||
tracer.CaptureStart(env, common.Address{}, common.Address{}, false, []byte{}, 0, big.NewInt(0))
|
|
||||||
tracer.CaptureState(0, 0, 0, 0, scope, nil, 0, nil)
|
|
||||||
timeout := errors.New("stahp")
|
|
||||||
tracer.Stop(timeout)
|
|
||||||
tracer.CaptureState(0, 0, 0, 0, scope, nil, 0, nil)
|
|
||||||
|
|
||||||
if _, err := tracer.GetResult(); !strings.Contains(err.Error(), timeout.Error()) {
|
|
||||||
t.Errorf("Expected timeout error, got %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// testNoStepExec tests a regular value transfer (no exec), and accessing the statedb
|
|
||||||
// in 'result'
|
|
||||||
func TestNoStepExec(t *testing.T) {
|
|
||||||
execTracer := func(code string) []byte {
|
|
||||||
t.Helper()
|
|
||||||
tracer, err := newJsTracer(code, nil, nil)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
env := vm.NewEVM(vm.BlockContext{BlockNumber: big.NewInt(1)}, vm.TxContext{GasPrice: big.NewInt(100)}, &dummyStatedb{}, params.TestChainConfig, vm.Config{Tracer: tracer})
|
|
||||||
tracer.CaptureStart(env, common.Address{}, common.Address{}, false, []byte{}, 1000, big.NewInt(0))
|
|
||||||
tracer.CaptureEnd(nil, 0, nil)
|
|
||||||
ret, err := tracer.GetResult()
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
return ret
|
|
||||||
}
|
|
||||||
for i, tt := range []struct {
|
|
||||||
code string
|
|
||||||
want string
|
|
||||||
}{
|
|
||||||
{ // tests that we don't panic on accessing the db methods
|
|
||||||
code: "{depths: [], step: function() {}, fault: function() {}, result: function(ctx, db){ return db.getBalance(ctx.to)} }",
|
|
||||||
want: `"0"`,
|
|
||||||
},
|
|
||||||
} {
|
|
||||||
if have := execTracer(tt.code); tt.want != string(have) {
|
|
||||||
t.Errorf("testcase %d: expected return value to be %s got %s\n\tcode: %v", i, tt.want, string(have), tt.code)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestIsPrecompile(t *testing.T) {
|
|
||||||
chaincfg := ¶ms.ChainConfig{ChainID: big.NewInt(1), HomesteadBlock: big.NewInt(0), DAOForkBlock: nil, DAOForkSupport: false, EIP150Block: big.NewInt(0), EIP155Block: big.NewInt(0), EIP158Block: big.NewInt(0), ByzantiumBlock: big.NewInt(100), ConstantinopleBlock: big.NewInt(0), PetersburgBlock: big.NewInt(0), IstanbulBlock: big.NewInt(200), MuirGlacierBlock: big.NewInt(0), BerlinBlock: big.NewInt(300), LondonBlock: big.NewInt(0), TerminalTotalDifficulty: nil, Ethash: new(params.EthashConfig), Clique: nil}
|
|
||||||
chaincfg.ByzantiumBlock = big.NewInt(100)
|
|
||||||
chaincfg.IstanbulBlock = big.NewInt(200)
|
|
||||||
chaincfg.BerlinBlock = big.NewInt(300)
|
|
||||||
txCtx := vm.TxContext{GasPrice: big.NewInt(100000)}
|
|
||||||
tracer, err := newJsTracer("{addr: toAddress('0000000000000000000000000000000000000009'), res: null, step: function() { this.res = isPrecompiled(this.addr); }, fault: function() {}, result: function() { return this.res; }}", nil, nil)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
blockCtx := vm.BlockContext{BlockNumber: big.NewInt(150)}
|
|
||||||
res, err := runTrace(tracer, &vmContext{blockCtx, txCtx}, chaincfg, nil)
|
|
||||||
if err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
if string(res) != "false" {
|
|
||||||
t.Errorf("tracer should not consider blake2f as precompile in byzantium")
|
|
||||||
}
|
|
||||||
|
|
||||||
tracer, _ = newJsTracer("{addr: toAddress('0000000000000000000000000000000000000009'), res: null, step: function() { this.res = isPrecompiled(this.addr); }, fault: function() {}, result: function() { return this.res; }}", nil, nil)
|
|
||||||
blockCtx = vm.BlockContext{BlockNumber: big.NewInt(250)}
|
|
||||||
res, err = runTrace(tracer, &vmContext{blockCtx, txCtx}, chaincfg, nil)
|
|
||||||
if err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
if string(res) != "true" {
|
|
||||||
t.Errorf("tracer should consider blake2f as precompile in istanbul")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestEnterExit(t *testing.T) {
|
|
||||||
// test that either both or none of enter() and exit() are defined
|
|
||||||
if _, err := newJsTracer("{step: function() {}, fault: function() {}, result: function() { return null; }, enter: function() {}}", new(tracers.Context), nil); err == nil {
|
|
||||||
t.Fatal("tracer creation should've failed without exit() definition")
|
|
||||||
}
|
|
||||||
if _, err := newJsTracer("{step: function() {}, fault: function() {}, result: function() { return null; }, enter: function() {}, exit: function() {}}", new(tracers.Context), nil); err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
// test that the enter and exit method are correctly invoked and the values passed
|
|
||||||
tracer, err := newJsTracer("{enters: 0, exits: 0, enterGas: 0, gasUsed: 0, step: function() {}, fault: function() {}, result: function() { return {enters: this.enters, exits: this.exits, enterGas: this.enterGas, gasUsed: this.gasUsed} }, enter: function(frame) { this.enters++; this.enterGas = frame.getGas(); }, exit: function(res) { this.exits++; this.gasUsed = res.getGasUsed(); }}", new(tracers.Context), nil)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
scope := &vm.ScopeContext{
|
|
||||||
Contract: vm.NewContract(&account{}, &account{}, big.NewInt(0), 0),
|
|
||||||
}
|
|
||||||
tracer.CaptureEnter(vm.CALL, scope.Contract.Caller(), scope.Contract.Address(), []byte{}, 1000, new(big.Int))
|
|
||||||
tracer.CaptureExit([]byte{}, 400, nil)
|
|
||||||
|
|
||||||
have, err := tracer.GetResult()
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
want := `{"enters":1,"exits":1,"enterGas":1000,"gasUsed":400}`
|
|
||||||
if string(have) != want {
|
|
||||||
t.Errorf("Number of invocations of enter() and exit() is wrong. Have %s, want %s\n", have, want)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestSetup(t *testing.T) {
|
|
||||||
// Test empty config
|
|
||||||
_, err := newJsTracer(`{setup: function(cfg) { if (cfg !== "{}") { throw("invalid empty config") } }, fault: function() {}, result: function() {}}`, new(tracers.Context), nil)
|
|
||||||
if err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
cfg, err := json.Marshal(map[string]string{"foo": "bar"})
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
// Test no setup func
|
|
||||||
_, err = newJsTracer(`{fault: function() {}, result: function() {}}`, new(tracers.Context), cfg)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
// Test config value
|
|
||||||
tracer, err := newJsTracer("{config: null, setup: function(cfg) { this.config = JSON.parse(cfg) }, step: function() {}, fault: function() {}, result: function() { return this.config.foo }}", new(tracers.Context), cfg)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
have, err := tracer.GetResult()
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
if string(have) != `"bar"` {
|
|
||||||
t.Errorf("tracer returned wrong result. have: %s, want: \"bar\"\n", string(have))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,183 +0,0 @@
|
||||||
// Copyright 2021 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/>.
|
|
||||||
|
|
||||||
package logger
|
|
||||||
|
|
||||||
import (
|
|
||||||
"math/big"
|
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
|
||||||
"github.com/ethereum/go-ethereum/core/types"
|
|
||||||
"github.com/ethereum/go-ethereum/core/vm"
|
|
||||||
)
|
|
||||||
|
|
||||||
// accessList is an accumulator for the set of accounts and storage slots an EVM
|
|
||||||
// contract execution touches.
|
|
||||||
type accessList map[common.Address]accessListSlots
|
|
||||||
|
|
||||||
// accessListSlots is an accumulator for the set of storage slots within a single
|
|
||||||
// contract that an EVM contract execution touches.
|
|
||||||
type accessListSlots map[common.Hash]struct{}
|
|
||||||
|
|
||||||
// newAccessList creates a new accessList.
|
|
||||||
func newAccessList() accessList {
|
|
||||||
return make(map[common.Address]accessListSlots)
|
|
||||||
}
|
|
||||||
|
|
||||||
// addAddress adds an address to the accesslist.
|
|
||||||
func (al accessList) addAddress(address common.Address) {
|
|
||||||
// Set address if not previously present
|
|
||||||
if _, present := al[address]; !present {
|
|
||||||
al[address] = make(map[common.Hash]struct{})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// addSlot adds a storage slot to the accesslist.
|
|
||||||
func (al accessList) addSlot(address common.Address, slot common.Hash) {
|
|
||||||
// Set address if not previously present
|
|
||||||
al.addAddress(address)
|
|
||||||
|
|
||||||
// Set the slot on the surely existent storage set
|
|
||||||
al[address][slot] = struct{}{}
|
|
||||||
}
|
|
||||||
|
|
||||||
// equal checks if the content of the current access list is the same as the
|
|
||||||
// content of the other one.
|
|
||||||
func (al accessList) equal(other accessList) bool {
|
|
||||||
// Cross reference the accounts first
|
|
||||||
if len(al) != len(other) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
// Given that len(al) == len(other), we only need to check that
|
|
||||||
// all the items from al are in other.
|
|
||||||
for addr := range al {
|
|
||||||
if _, ok := other[addr]; !ok {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Accounts match, cross reference the storage slots too
|
|
||||||
for addr, slots := range al {
|
|
||||||
otherslots := other[addr]
|
|
||||||
|
|
||||||
if len(slots) != len(otherslots) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
// Given that len(slots) == len(otherslots), we only need to check that
|
|
||||||
// all the items from slots are in otherslots.
|
|
||||||
for hash := range slots {
|
|
||||||
if _, ok := otherslots[hash]; !ok {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// accesslist converts the accesslist to a types.AccessList.
|
|
||||||
func (al accessList) accessList() types.AccessList {
|
|
||||||
acl := make(types.AccessList, 0, len(al))
|
|
||||||
for addr, slots := range al {
|
|
||||||
tuple := types.AccessTuple{Address: addr, StorageKeys: []common.Hash{}}
|
|
||||||
for slot := range slots {
|
|
||||||
tuple.StorageKeys = append(tuple.StorageKeys, slot)
|
|
||||||
}
|
|
||||||
acl = append(acl, tuple)
|
|
||||||
}
|
|
||||||
return acl
|
|
||||||
}
|
|
||||||
|
|
||||||
// AccessListTracer is a tracer that accumulates touched accounts and storage
|
|
||||||
// slots into an internal set.
|
|
||||||
type AccessListTracer struct {
|
|
||||||
excl map[common.Address]struct{} // Set of account to exclude from the list
|
|
||||||
list accessList // Set of accounts and storage slots touched
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewAccessListTracer creates a new tracer that can generate AccessLists.
|
|
||||||
// An optional AccessList can be specified to occupy slots and addresses in
|
|
||||||
// the resulting accesslist.
|
|
||||||
func NewAccessListTracer(acl types.AccessList, from, to common.Address, precompiles []common.Address) *AccessListTracer {
|
|
||||||
excl := map[common.Address]struct{}{
|
|
||||||
from: {}, to: {},
|
|
||||||
}
|
|
||||||
for _, addr := range precompiles {
|
|
||||||
excl[addr] = struct{}{}
|
|
||||||
}
|
|
||||||
list := newAccessList()
|
|
||||||
for _, al := range acl {
|
|
||||||
if _, ok := excl[al.Address]; !ok {
|
|
||||||
list.addAddress(al.Address)
|
|
||||||
}
|
|
||||||
for _, slot := range al.StorageKeys {
|
|
||||||
list.addSlot(al.Address, slot)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return &AccessListTracer{
|
|
||||||
excl: excl,
|
|
||||||
list: list,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *AccessListTracer) CaptureStart(env *vm.EVM, from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) {
|
|
||||||
}
|
|
||||||
|
|
||||||
// CaptureState captures all opcodes that touch storage or addresses and adds them to the accesslist.
|
|
||||||
func (a *AccessListTracer) CaptureState(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, rData []byte, depth int, err error) {
|
|
||||||
stack := scope.Stack
|
|
||||||
stackData := stack.Data()
|
|
||||||
stackLen := len(stackData)
|
|
||||||
if (op == vm.SLOAD || op == vm.SSTORE) && stackLen >= 1 {
|
|
||||||
slot := common.Hash(stackData[stackLen-1].Bytes32())
|
|
||||||
a.list.addSlot(scope.Contract.Address(), slot)
|
|
||||||
}
|
|
||||||
if (op == vm.EXTCODECOPY || op == vm.EXTCODEHASH || op == vm.EXTCODESIZE || op == vm.BALANCE || op == vm.SELFDESTRUCT) && stackLen >= 1 {
|
|
||||||
addr := common.Address(stackData[stackLen-1].Bytes20())
|
|
||||||
if _, ok := a.excl[addr]; !ok {
|
|
||||||
a.list.addAddress(addr)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (op == vm.DELEGATECALL || op == vm.CALL || op == vm.STATICCALL || op == vm.CALLCODE) && stackLen >= 5 {
|
|
||||||
addr := common.Address(stackData[stackLen-2].Bytes20())
|
|
||||||
if _, ok := a.excl[addr]; !ok {
|
|
||||||
a.list.addAddress(addr)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (*AccessListTracer) CaptureFault(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, depth int, err error) {
|
|
||||||
}
|
|
||||||
|
|
||||||
func (*AccessListTracer) CaptureEnd(output []byte, gasUsed uint64, err error) {}
|
|
||||||
|
|
||||||
func (*AccessListTracer) CaptureEnter(typ vm.OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) {
|
|
||||||
}
|
|
||||||
|
|
||||||
func (*AccessListTracer) CaptureExit(output []byte, gasUsed uint64, err error) {}
|
|
||||||
|
|
||||||
func (*AccessListTracer) CaptureTxStart(gasLimit uint64) {}
|
|
||||||
|
|
||||||
func (*AccessListTracer) CaptureTxEnd(restGas uint64) {}
|
|
||||||
|
|
||||||
// AccessList returns the current accesslist maintained by the tracer.
|
|
||||||
func (a *AccessListTracer) AccessList() types.AccessList {
|
|
||||||
return a.list.accessList()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Equal returns if the content of two access list traces are equal.
|
|
||||||
func (a *AccessListTracer) Equal(other *AccessListTracer) bool {
|
|
||||||
return a.list.equal(other.list)
|
|
||||||
}
|
|
||||||
|
|
@ -1,118 +0,0 @@
|
||||||
// Code generated by github.com/fjl/gencodec. DO NOT EDIT.
|
|
||||||
|
|
||||||
package logger
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
|
||||||
"github.com/ethereum/go-ethereum/common/hexutil"
|
|
||||||
"github.com/ethereum/go-ethereum/common/math"
|
|
||||||
"github.com/ethereum/go-ethereum/core/vm"
|
|
||||||
"github.com/holiman/uint256"
|
|
||||||
)
|
|
||||||
|
|
||||||
var _ = (*structLogMarshaling)(nil)
|
|
||||||
|
|
||||||
// MarshalJSON marshals as JSON.
|
|
||||||
func (s StructLog) MarshalJSON() ([]byte, error) {
|
|
||||||
type StructLog struct {
|
|
||||||
Pc uint64 `json:"pc"`
|
|
||||||
Op vm.OpCode `json:"op"`
|
|
||||||
Gas math.HexOrDecimal64 `json:"gas"`
|
|
||||||
GasCost math.HexOrDecimal64 `json:"gasCost"`
|
|
||||||
Memory hexutil.Bytes `json:"memory,omitempty"`
|
|
||||||
MemorySize int `json:"memSize"`
|
|
||||||
Stack []hexutil.U256 `json:"stack"`
|
|
||||||
ReturnData hexutil.Bytes `json:"returnData,omitempty"`
|
|
||||||
Storage map[common.Hash]common.Hash `json:"-"`
|
|
||||||
Depth int `json:"depth"`
|
|
||||||
RefundCounter uint64 `json:"refund"`
|
|
||||||
Err error `json:"-"`
|
|
||||||
OpName string `json:"opName"`
|
|
||||||
ErrorString string `json:"error,omitempty"`
|
|
||||||
}
|
|
||||||
var enc StructLog
|
|
||||||
enc.Pc = s.Pc
|
|
||||||
enc.Op = s.Op
|
|
||||||
enc.Gas = math.HexOrDecimal64(s.Gas)
|
|
||||||
enc.GasCost = math.HexOrDecimal64(s.GasCost)
|
|
||||||
enc.Memory = s.Memory
|
|
||||||
enc.MemorySize = s.MemorySize
|
|
||||||
if s.Stack != nil {
|
|
||||||
enc.Stack = make([]hexutil.U256, len(s.Stack))
|
|
||||||
for k, v := range s.Stack {
|
|
||||||
enc.Stack[k] = hexutil.U256(v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
enc.ReturnData = s.ReturnData
|
|
||||||
enc.Storage = s.Storage
|
|
||||||
enc.Depth = s.Depth
|
|
||||||
enc.RefundCounter = s.RefundCounter
|
|
||||||
enc.Err = s.Err
|
|
||||||
enc.OpName = s.OpName()
|
|
||||||
enc.ErrorString = s.ErrorString()
|
|
||||||
return json.Marshal(&enc)
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalJSON unmarshals from JSON.
|
|
||||||
func (s *StructLog) UnmarshalJSON(input []byte) error {
|
|
||||||
type StructLog struct {
|
|
||||||
Pc *uint64 `json:"pc"`
|
|
||||||
Op *vm.OpCode `json:"op"`
|
|
||||||
Gas *math.HexOrDecimal64 `json:"gas"`
|
|
||||||
GasCost *math.HexOrDecimal64 `json:"gasCost"`
|
|
||||||
Memory *hexutil.Bytes `json:"memory,omitempty"`
|
|
||||||
MemorySize *int `json:"memSize"`
|
|
||||||
Stack []hexutil.U256 `json:"stack"`
|
|
||||||
ReturnData *hexutil.Bytes `json:"returnData,omitempty"`
|
|
||||||
Storage map[common.Hash]common.Hash `json:"-"`
|
|
||||||
Depth *int `json:"depth"`
|
|
||||||
RefundCounter *uint64 `json:"refund"`
|
|
||||||
Err error `json:"-"`
|
|
||||||
}
|
|
||||||
var dec StructLog
|
|
||||||
if err := json.Unmarshal(input, &dec); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if dec.Pc != nil {
|
|
||||||
s.Pc = *dec.Pc
|
|
||||||
}
|
|
||||||
if dec.Op != nil {
|
|
||||||
s.Op = *dec.Op
|
|
||||||
}
|
|
||||||
if dec.Gas != nil {
|
|
||||||
s.Gas = uint64(*dec.Gas)
|
|
||||||
}
|
|
||||||
if dec.GasCost != nil {
|
|
||||||
s.GasCost = uint64(*dec.GasCost)
|
|
||||||
}
|
|
||||||
if dec.Memory != nil {
|
|
||||||
s.Memory = *dec.Memory
|
|
||||||
}
|
|
||||||
if dec.MemorySize != nil {
|
|
||||||
s.MemorySize = *dec.MemorySize
|
|
||||||
}
|
|
||||||
if dec.Stack != nil {
|
|
||||||
s.Stack = make([]uint256.Int, len(dec.Stack))
|
|
||||||
for k, v := range dec.Stack {
|
|
||||||
s.Stack[k] = uint256.Int(v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if dec.ReturnData != nil {
|
|
||||||
s.ReturnData = *dec.ReturnData
|
|
||||||
}
|
|
||||||
if dec.Storage != nil {
|
|
||||||
s.Storage = dec.Storage
|
|
||||||
}
|
|
||||||
if dec.Depth != nil {
|
|
||||||
s.Depth = *dec.Depth
|
|
||||||
}
|
|
||||||
if dec.RefundCounter != nil {
|
|
||||||
s.RefundCounter = *dec.RefundCounter
|
|
||||||
}
|
|
||||||
if dec.Err != nil {
|
|
||||||
s.Err = dec.Err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
@ -1,467 +0,0 @@
|
||||||
// Copyright 2021 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/>.
|
|
||||||
|
|
||||||
package logger
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/hex"
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"math/big"
|
|
||||||
"strings"
|
|
||||||
"sync/atomic"
|
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
|
||||||
"github.com/ethereum/go-ethereum/common/hexutil"
|
|
||||||
"github.com/ethereum/go-ethereum/common/math"
|
|
||||||
"github.com/ethereum/go-ethereum/core/types"
|
|
||||||
"github.com/ethereum/go-ethereum/core/vm"
|
|
||||||
"github.com/ethereum/go-ethereum/params"
|
|
||||||
"github.com/holiman/uint256"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Storage represents a contract's storage.
|
|
||||||
type Storage map[common.Hash]common.Hash
|
|
||||||
|
|
||||||
// Copy duplicates the current storage.
|
|
||||||
func (s Storage) Copy() Storage {
|
|
||||||
cpy := make(Storage, len(s))
|
|
||||||
for key, value := range s {
|
|
||||||
cpy[key] = value
|
|
||||||
}
|
|
||||||
return cpy
|
|
||||||
}
|
|
||||||
|
|
||||||
// Config are the configuration options for structured logger the EVM
|
|
||||||
type Config struct {
|
|
||||||
EnableMemory bool // enable memory capture
|
|
||||||
DisableStack bool // disable stack capture
|
|
||||||
DisableStorage bool // disable storage capture
|
|
||||||
EnableReturnData bool // enable return data capture
|
|
||||||
Debug bool // print output during capture end
|
|
||||||
Limit int // maximum length of output, but zero means unlimited
|
|
||||||
// Chain overrides, can be used to execute a trace using future fork rules
|
|
||||||
Overrides *params.ChainConfig `json:"overrides,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
//go:generate go run github.com/fjl/gencodec -type StructLog -field-override structLogMarshaling -out gen_structlog.go
|
|
||||||
|
|
||||||
// StructLog is emitted to the EVM each cycle and lists information about the current internal state
|
|
||||||
// prior to the execution of the statement.
|
|
||||||
type StructLog struct {
|
|
||||||
Pc uint64 `json:"pc"`
|
|
||||||
Op vm.OpCode `json:"op"`
|
|
||||||
Gas uint64 `json:"gas"`
|
|
||||||
GasCost uint64 `json:"gasCost"`
|
|
||||||
Memory []byte `json:"memory,omitempty"`
|
|
||||||
MemorySize int `json:"memSize"`
|
|
||||||
Stack []uint256.Int `json:"stack"`
|
|
||||||
ReturnData []byte `json:"returnData,omitempty"`
|
|
||||||
Storage map[common.Hash]common.Hash `json:"-"`
|
|
||||||
Depth int `json:"depth"`
|
|
||||||
RefundCounter uint64 `json:"refund"`
|
|
||||||
Err error `json:"-"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// overrides for gencodec
|
|
||||||
type structLogMarshaling struct {
|
|
||||||
Gas math.HexOrDecimal64
|
|
||||||
GasCost math.HexOrDecimal64
|
|
||||||
Memory hexutil.Bytes
|
|
||||||
ReturnData hexutil.Bytes
|
|
||||||
Stack []hexutil.U256
|
|
||||||
OpName string `json:"opName"` // adds call to OpName() in MarshalJSON
|
|
||||||
ErrorString string `json:"error,omitempty"` // adds call to ErrorString() in MarshalJSON
|
|
||||||
}
|
|
||||||
|
|
||||||
// OpName formats the operand name in a human-readable format.
|
|
||||||
func (s *StructLog) OpName() string {
|
|
||||||
return s.Op.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
// ErrorString formats the log's error as a string.
|
|
||||||
func (s *StructLog) ErrorString() string {
|
|
||||||
if s.Err != nil {
|
|
||||||
return s.Err.Error()
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// StructLogger is an EVM state logger and implements EVMLogger.
|
|
||||||
//
|
|
||||||
// StructLogger can capture state based on the given Log configuration and also keeps
|
|
||||||
// a track record of modified storage which is used in reporting snapshots of the
|
|
||||||
// contract their storage.
|
|
||||||
type StructLogger struct {
|
|
||||||
cfg Config
|
|
||||||
env *vm.EVM
|
|
||||||
|
|
||||||
storage map[common.Address]Storage
|
|
||||||
logs []StructLog
|
|
||||||
output []byte
|
|
||||||
err error
|
|
||||||
gasLimit uint64
|
|
||||||
usedGas uint64
|
|
||||||
|
|
||||||
interrupt atomic.Bool // Atomic flag to signal execution interruption
|
|
||||||
reason error // Textual reason for the interruption
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewStructLogger returns a new logger
|
|
||||||
func NewStructLogger(cfg *Config) *StructLogger {
|
|
||||||
logger := &StructLogger{
|
|
||||||
storage: make(map[common.Address]Storage),
|
|
||||||
}
|
|
||||||
if cfg != nil {
|
|
||||||
logger.cfg = *cfg
|
|
||||||
}
|
|
||||||
return logger
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reset clears the data held by the logger.
|
|
||||||
func (l *StructLogger) Reset() {
|
|
||||||
l.storage = make(map[common.Address]Storage)
|
|
||||||
l.output = make([]byte, 0)
|
|
||||||
l.logs = l.logs[:0]
|
|
||||||
l.err = nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CaptureStart implements the EVMLogger interface to initialize the tracing operation.
|
|
||||||
func (l *StructLogger) CaptureStart(env *vm.EVM, from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) {
|
|
||||||
l.env = env
|
|
||||||
}
|
|
||||||
|
|
||||||
// CaptureState logs a new structured log message and pushes it out to the environment
|
|
||||||
//
|
|
||||||
// CaptureState also tracks SLOAD/SSTORE ops to track storage change.
|
|
||||||
func (l *StructLogger) CaptureState(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, rData []byte, depth int, err error) {
|
|
||||||
// If tracing was interrupted, set the error and stop
|
|
||||||
if l.interrupt.Load() {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
// check if already accumulated the specified number of logs
|
|
||||||
if l.cfg.Limit != 0 && l.cfg.Limit <= len(l.logs) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
memory := scope.Memory
|
|
||||||
stack := scope.Stack
|
|
||||||
contract := scope.Contract
|
|
||||||
// Copy a snapshot of the current memory state to a new buffer
|
|
||||||
var mem []byte
|
|
||||||
if l.cfg.EnableMemory {
|
|
||||||
mem = make([]byte, len(memory.Data()))
|
|
||||||
copy(mem, memory.Data())
|
|
||||||
}
|
|
||||||
// Copy a snapshot of the current stack state to a new buffer
|
|
||||||
var stck []uint256.Int
|
|
||||||
if !l.cfg.DisableStack {
|
|
||||||
stck = make([]uint256.Int, len(stack.Data()))
|
|
||||||
for i, item := range stack.Data() {
|
|
||||||
stck[i] = item
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stackData := stack.Data()
|
|
||||||
stackLen := len(stackData)
|
|
||||||
// Copy a snapshot of the current storage to a new container
|
|
||||||
var storage Storage
|
|
||||||
if !l.cfg.DisableStorage && (op == vm.SLOAD || op == vm.SSTORE) {
|
|
||||||
// initialise new changed values storage container for this contract
|
|
||||||
// if not present.
|
|
||||||
if l.storage[contract.Address()] == nil {
|
|
||||||
l.storage[contract.Address()] = make(Storage)
|
|
||||||
}
|
|
||||||
// capture SLOAD opcodes and record the read entry in the local storage
|
|
||||||
if op == vm.SLOAD && stackLen >= 1 {
|
|
||||||
var (
|
|
||||||
address = common.Hash(stackData[stackLen-1].Bytes32())
|
|
||||||
value = l.env.StateDB.GetState(contract.Address(), address)
|
|
||||||
)
|
|
||||||
l.storage[contract.Address()][address] = value
|
|
||||||
storage = l.storage[contract.Address()].Copy()
|
|
||||||
} else if op == vm.SSTORE && stackLen >= 2 {
|
|
||||||
// capture SSTORE opcodes and record the written entry in the local storage.
|
|
||||||
var (
|
|
||||||
value = common.Hash(stackData[stackLen-2].Bytes32())
|
|
||||||
address = common.Hash(stackData[stackLen-1].Bytes32())
|
|
||||||
)
|
|
||||||
l.storage[contract.Address()][address] = value
|
|
||||||
storage = l.storage[contract.Address()].Copy()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var rdata []byte
|
|
||||||
if l.cfg.EnableReturnData {
|
|
||||||
rdata = make([]byte, len(rData))
|
|
||||||
copy(rdata, rData)
|
|
||||||
}
|
|
||||||
// create a new snapshot of the EVM.
|
|
||||||
log := StructLog{pc, op, gas, cost, mem, memory.Len(), stck, rdata, storage, depth, l.env.StateDB.GetRefund(), err}
|
|
||||||
l.logs = append(l.logs, log)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CaptureFault implements the EVMLogger interface to trace an execution fault
|
|
||||||
// while running an opcode.
|
|
||||||
func (l *StructLogger) CaptureFault(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, depth int, err error) {
|
|
||||||
}
|
|
||||||
|
|
||||||
// CaptureEnd is called after the call finishes to finalize the tracing.
|
|
||||||
func (l *StructLogger) CaptureEnd(output []byte, gasUsed uint64, err error) {
|
|
||||||
l.output = output
|
|
||||||
l.err = err
|
|
||||||
if l.cfg.Debug {
|
|
||||||
fmt.Printf("%#x\n", output)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Printf(" error: %v\n", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *StructLogger) CaptureEnter(typ vm.OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) {
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *StructLogger) CaptureExit(output []byte, gasUsed uint64, err error) {
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *StructLogger) GetResult() (json.RawMessage, error) {
|
|
||||||
// Tracing aborted
|
|
||||||
if l.reason != nil {
|
|
||||||
return nil, l.reason
|
|
||||||
}
|
|
||||||
failed := l.err != nil
|
|
||||||
returnData := common.CopyBytes(l.output)
|
|
||||||
// Return data when successful and revert reason when reverted, otherwise empty.
|
|
||||||
returnVal := fmt.Sprintf("%x", returnData)
|
|
||||||
if failed && l.err != vm.ErrExecutionReverted {
|
|
||||||
returnVal = ""
|
|
||||||
}
|
|
||||||
return json.Marshal(&ExecutionResult{
|
|
||||||
Gas: l.usedGas,
|
|
||||||
Failed: failed,
|
|
||||||
ReturnValue: returnVal,
|
|
||||||
StructLogs: formatLogs(l.StructLogs()),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// Stop terminates execution of the tracer at the first opportune moment.
|
|
||||||
func (l *StructLogger) Stop(err error) {
|
|
||||||
l.reason = err
|
|
||||||
l.interrupt.Store(true)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *StructLogger) CaptureTxStart(gasLimit uint64) {
|
|
||||||
l.gasLimit = gasLimit
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *StructLogger) CaptureTxEnd(restGas uint64) {
|
|
||||||
l.usedGas = l.gasLimit - restGas
|
|
||||||
}
|
|
||||||
|
|
||||||
// StructLogs returns the captured log entries.
|
|
||||||
func (l *StructLogger) StructLogs() []StructLog { return l.logs }
|
|
||||||
|
|
||||||
// Error returns the VM error captured by the trace.
|
|
||||||
func (l *StructLogger) Error() error { return l.err }
|
|
||||||
|
|
||||||
// Output returns the VM return value captured by the trace.
|
|
||||||
func (l *StructLogger) Output() []byte { return l.output }
|
|
||||||
|
|
||||||
// WriteTrace writes a formatted trace to the given writer
|
|
||||||
func WriteTrace(writer io.Writer, logs []StructLog) {
|
|
||||||
for _, log := range logs {
|
|
||||||
fmt.Fprintf(writer, "%-16spc=%08d gas=%v cost=%v", log.Op, log.Pc, log.Gas, log.GasCost)
|
|
||||||
if log.Err != nil {
|
|
||||||
fmt.Fprintf(writer, " ERROR: %v", log.Err)
|
|
||||||
}
|
|
||||||
fmt.Fprintln(writer)
|
|
||||||
|
|
||||||
if len(log.Stack) > 0 {
|
|
||||||
fmt.Fprintln(writer, "Stack:")
|
|
||||||
for i := len(log.Stack) - 1; i >= 0; i-- {
|
|
||||||
fmt.Fprintf(writer, "%08d %s\n", len(log.Stack)-i-1, log.Stack[i].Hex())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if len(log.Memory) > 0 {
|
|
||||||
fmt.Fprintln(writer, "Memory:")
|
|
||||||
fmt.Fprint(writer, hex.Dump(log.Memory))
|
|
||||||
}
|
|
||||||
if len(log.Storage) > 0 {
|
|
||||||
fmt.Fprintln(writer, "Storage:")
|
|
||||||
for h, item := range log.Storage {
|
|
||||||
fmt.Fprintf(writer, "%x: %x\n", h, item)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if len(log.ReturnData) > 0 {
|
|
||||||
fmt.Fprintln(writer, "ReturnData:")
|
|
||||||
fmt.Fprint(writer, hex.Dump(log.ReturnData))
|
|
||||||
}
|
|
||||||
fmt.Fprintln(writer)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// WriteLogs writes vm logs in a readable format to the given writer
|
|
||||||
func WriteLogs(writer io.Writer, logs []*types.Log) {
|
|
||||||
for _, log := range logs {
|
|
||||||
fmt.Fprintf(writer, "LOG%d: %x bn=%d txi=%x\n", len(log.Topics), log.Address, log.BlockNumber, log.TxIndex)
|
|
||||||
|
|
||||||
for i, topic := range log.Topics {
|
|
||||||
fmt.Fprintf(writer, "%08d %x\n", i, topic)
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Fprint(writer, hex.Dump(log.Data))
|
|
||||||
fmt.Fprintln(writer)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type mdLogger struct {
|
|
||||||
out io.Writer
|
|
||||||
cfg *Config
|
|
||||||
env *vm.EVM
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewMarkdownLogger creates a logger which outputs information in a format adapted
|
|
||||||
// for human readability, and is also a valid markdown table
|
|
||||||
func NewMarkdownLogger(cfg *Config, writer io.Writer) *mdLogger {
|
|
||||||
l := &mdLogger{out: writer, cfg: cfg}
|
|
||||||
if l.cfg == nil {
|
|
||||||
l.cfg = &Config{}
|
|
||||||
}
|
|
||||||
return l
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *mdLogger) CaptureStart(env *vm.EVM, from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) {
|
|
||||||
t.env = env
|
|
||||||
if !create {
|
|
||||||
fmt.Fprintf(t.out, "From: `%v`\nTo: `%v`\nData: `%#x`\nGas: `%d`\nValue `%v` wei\n",
|
|
||||||
from.String(), to.String(),
|
|
||||||
input, gas, value)
|
|
||||||
} else {
|
|
||||||
fmt.Fprintf(t.out, "From: `%v`\nCreate at: `%v`\nData: `%#x`\nGas: `%d`\nValue `%v` wei\n",
|
|
||||||
from.String(), to.String(),
|
|
||||||
input, gas, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Fprintf(t.out, `
|
|
||||||
| Pc | Op | Cost | Stack | RStack | Refund |
|
|
||||||
|-------|-------------|------|-----------|-----------|---------|
|
|
||||||
`)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CaptureState also tracks SLOAD/SSTORE ops to track storage change.
|
|
||||||
func (t *mdLogger) CaptureState(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, rData []byte, depth int, err error) {
|
|
||||||
stack := scope.Stack
|
|
||||||
fmt.Fprintf(t.out, "| %4d | %10v | %3d |", pc, op, cost)
|
|
||||||
|
|
||||||
if !t.cfg.DisableStack {
|
|
||||||
// format stack
|
|
||||||
var a []string
|
|
||||||
for _, elem := range stack.Data() {
|
|
||||||
a = append(a, elem.Hex())
|
|
||||||
}
|
|
||||||
b := fmt.Sprintf("[%v]", strings.Join(a, ","))
|
|
||||||
fmt.Fprintf(t.out, "%10v |", b)
|
|
||||||
}
|
|
||||||
fmt.Fprintf(t.out, "%10v |", t.env.StateDB.GetRefund())
|
|
||||||
fmt.Fprintln(t.out, "")
|
|
||||||
if err != nil {
|
|
||||||
fmt.Fprintf(t.out, "Error: %v\n", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *mdLogger) CaptureFault(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, depth int, err error) {
|
|
||||||
fmt.Fprintf(t.out, "\nError: at pc=%d, op=%v: %v\n", pc, op, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *mdLogger) CaptureEnd(output []byte, gasUsed uint64, err error) {
|
|
||||||
fmt.Fprintf(t.out, "\nOutput: `%#x`\nConsumed gas: `%d`\nError: `%v`\n",
|
|
||||||
output, gasUsed, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *mdLogger) CaptureEnter(typ vm.OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) {
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *mdLogger) CaptureExit(output []byte, gasUsed uint64, err error) {}
|
|
||||||
|
|
||||||
func (*mdLogger) CaptureTxStart(gasLimit uint64) {}
|
|
||||||
|
|
||||||
func (*mdLogger) CaptureTxEnd(restGas uint64) {}
|
|
||||||
|
|
||||||
// ExecutionResult groups all structured logs emitted by the EVM
|
|
||||||
// while replaying a transaction in debug mode as well as transaction
|
|
||||||
// execution status, the amount of gas used and the return value
|
|
||||||
type ExecutionResult struct {
|
|
||||||
Gas uint64 `json:"gas"`
|
|
||||||
Failed bool `json:"failed"`
|
|
||||||
ReturnValue string `json:"returnValue"`
|
|
||||||
StructLogs []StructLogRes `json:"structLogs"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// StructLogRes stores a structured log emitted by the EVM while replaying a
|
|
||||||
// transaction in debug mode
|
|
||||||
type StructLogRes struct {
|
|
||||||
Pc uint64 `json:"pc"`
|
|
||||||
Op string `json:"op"`
|
|
||||||
Gas uint64 `json:"gas"`
|
|
||||||
GasCost uint64 `json:"gasCost"`
|
|
||||||
Depth int `json:"depth"`
|
|
||||||
Error string `json:"error,omitempty"`
|
|
||||||
Stack *[]string `json:"stack,omitempty"`
|
|
||||||
ReturnData string `json:"returnData,omitempty"`
|
|
||||||
Memory *[]string `json:"memory,omitempty"`
|
|
||||||
Storage *map[string]string `json:"storage,omitempty"`
|
|
||||||
RefundCounter uint64 `json:"refund,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// formatLogs formats EVM returned structured logs for json output
|
|
||||||
func formatLogs(logs []StructLog) []StructLogRes {
|
|
||||||
formatted := make([]StructLogRes, len(logs))
|
|
||||||
for index, trace := range logs {
|
|
||||||
formatted[index] = StructLogRes{
|
|
||||||
Pc: trace.Pc,
|
|
||||||
Op: trace.Op.String(),
|
|
||||||
Gas: trace.Gas,
|
|
||||||
GasCost: trace.GasCost,
|
|
||||||
Depth: trace.Depth,
|
|
||||||
Error: trace.ErrorString(),
|
|
||||||
RefundCounter: trace.RefundCounter,
|
|
||||||
}
|
|
||||||
if trace.Stack != nil {
|
|
||||||
stack := make([]string, len(trace.Stack))
|
|
||||||
for i, stackValue := range trace.Stack {
|
|
||||||
stack[i] = stackValue.Hex()
|
|
||||||
}
|
|
||||||
formatted[index].Stack = &stack
|
|
||||||
}
|
|
||||||
if trace.ReturnData != nil && len(trace.ReturnData) > 0 {
|
|
||||||
formatted[index].ReturnData = hexutil.Bytes(trace.ReturnData).String()
|
|
||||||
}
|
|
||||||
if trace.Memory != nil {
|
|
||||||
memory := make([]string, 0, (len(trace.Memory)+31)/32)
|
|
||||||
for i := 0; i+32 <= len(trace.Memory); i += 32 {
|
|
||||||
memory = append(memory, fmt.Sprintf("%x", trace.Memory[i:i+32]))
|
|
||||||
}
|
|
||||||
formatted[index].Memory = &memory
|
|
||||||
}
|
|
||||||
if trace.Storage != nil {
|
|
||||||
storage := make(map[string]string)
|
|
||||||
for i, storageValue := range trace.Storage {
|
|
||||||
storage[fmt.Sprintf("%x", i)] = fmt.Sprintf("%x", storageValue)
|
|
||||||
}
|
|
||||||
formatted[index].Storage = &storage
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return formatted
|
|
||||||
}
|
|
||||||
|
|
@ -1,102 +0,0 @@
|
||||||
// Copyright 2021 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/>.
|
|
||||||
|
|
||||||
package logger
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"io"
|
|
||||||
"math/big"
|
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
|
||||||
"github.com/ethereum/go-ethereum/common/math"
|
|
||||||
"github.com/ethereum/go-ethereum/core/vm"
|
|
||||||
)
|
|
||||||
|
|
||||||
type JSONLogger struct {
|
|
||||||
encoder *json.Encoder
|
|
||||||
cfg *Config
|
|
||||||
env *vm.EVM
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewJSONLogger creates a new EVM tracer that prints execution steps as JSON objects
|
|
||||||
// into the provided stream.
|
|
||||||
func NewJSONLogger(cfg *Config, writer io.Writer) *JSONLogger {
|
|
||||||
l := &JSONLogger{encoder: json.NewEncoder(writer), cfg: cfg}
|
|
||||||
if l.cfg == nil {
|
|
||||||
l.cfg = &Config{}
|
|
||||||
}
|
|
||||||
return l
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *JSONLogger) CaptureStart(env *vm.EVM, from, to common.Address, create bool, input []byte, gas uint64, value *big.Int) {
|
|
||||||
l.env = env
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *JSONLogger) CaptureFault(pc uint64, op vm.OpCode, gas uint64, cost uint64, scope *vm.ScopeContext, depth int, err error) {
|
|
||||||
// TODO: Add rData to this interface as well
|
|
||||||
l.CaptureState(pc, op, gas, cost, scope, nil, depth, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CaptureState outputs state information on the logger.
|
|
||||||
func (l *JSONLogger) CaptureState(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, rData []byte, depth int, err error) {
|
|
||||||
memory := scope.Memory
|
|
||||||
stack := scope.Stack
|
|
||||||
|
|
||||||
log := StructLog{
|
|
||||||
Pc: pc,
|
|
||||||
Op: op,
|
|
||||||
Gas: gas,
|
|
||||||
GasCost: cost,
|
|
||||||
MemorySize: memory.Len(),
|
|
||||||
Depth: depth,
|
|
||||||
RefundCounter: l.env.StateDB.GetRefund(),
|
|
||||||
Err: err,
|
|
||||||
}
|
|
||||||
if l.cfg.EnableMemory {
|
|
||||||
log.Memory = memory.Data()
|
|
||||||
}
|
|
||||||
if !l.cfg.DisableStack {
|
|
||||||
log.Stack = stack.Data()
|
|
||||||
}
|
|
||||||
if l.cfg.EnableReturnData {
|
|
||||||
log.ReturnData = rData
|
|
||||||
}
|
|
||||||
l.encoder.Encode(log)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CaptureEnd is triggered at end of execution.
|
|
||||||
func (l *JSONLogger) CaptureEnd(output []byte, gasUsed uint64, err error) {
|
|
||||||
type endLog struct {
|
|
||||||
Output string `json:"output"`
|
|
||||||
GasUsed math.HexOrDecimal64 `json:"gasUsed"`
|
|
||||||
Err string `json:"error,omitempty"`
|
|
||||||
}
|
|
||||||
var errMsg string
|
|
||||||
if err != nil {
|
|
||||||
errMsg = err.Error()
|
|
||||||
}
|
|
||||||
l.encoder.Encode(endLog{common.Bytes2Hex(output), math.HexOrDecimal64(gasUsed), errMsg})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *JSONLogger) CaptureEnter(typ vm.OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) {
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *JSONLogger) CaptureExit(output []byte, gasUsed uint64, err error) {}
|
|
||||||
|
|
||||||
func (l *JSONLogger) CaptureTxStart(gasLimit uint64) {}
|
|
||||||
|
|
||||||
func (l *JSONLogger) CaptureTxEnd(restGas uint64) {}
|
|
||||||
|
|
@ -1,107 +0,0 @@
|
||||||
// Copyright 2021 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/>.
|
|
||||||
|
|
||||||
package logger
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
|
||||||
"math/big"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
|
||||||
"github.com/ethereum/go-ethereum/core/state"
|
|
||||||
"github.com/ethereum/go-ethereum/core/vm"
|
|
||||||
"github.com/ethereum/go-ethereum/params"
|
|
||||||
)
|
|
||||||
|
|
||||||
type dummyContractRef struct {
|
|
||||||
calledForEach bool
|
|
||||||
}
|
|
||||||
|
|
||||||
func (dummyContractRef) Address() common.Address { return common.Address{} }
|
|
||||||
func (dummyContractRef) Value() *big.Int { return new(big.Int) }
|
|
||||||
func (dummyContractRef) SetCode(common.Hash, []byte) {}
|
|
||||||
func (d *dummyContractRef) ForEachStorage(callback func(key, value common.Hash) bool) {
|
|
||||||
d.calledForEach = true
|
|
||||||
}
|
|
||||||
func (d *dummyContractRef) SubBalance(amount *big.Int) {}
|
|
||||||
func (d *dummyContractRef) AddBalance(amount *big.Int) {}
|
|
||||||
func (d *dummyContractRef) SetBalance(*big.Int) {}
|
|
||||||
func (d *dummyContractRef) SetNonce(uint64) {}
|
|
||||||
func (d *dummyContractRef) Balance() *big.Int { return new(big.Int) }
|
|
||||||
|
|
||||||
type dummyStatedb struct {
|
|
||||||
state.StateDB
|
|
||||||
}
|
|
||||||
|
|
||||||
func (*dummyStatedb) GetRefund() uint64 { return 1337 }
|
|
||||||
func (*dummyStatedb) GetState(_ common.Address, _ common.Hash) common.Hash { return common.Hash{} }
|
|
||||||
func (*dummyStatedb) SetState(_ common.Address, _ common.Hash, _ common.Hash) {}
|
|
||||||
|
|
||||||
func TestStoreCapture(t *testing.T) {
|
|
||||||
var (
|
|
||||||
logger = NewStructLogger(nil)
|
|
||||||
env = vm.NewEVM(vm.BlockContext{}, vm.TxContext{}, &dummyStatedb{}, params.TestChainConfig, vm.Config{Tracer: logger})
|
|
||||||
contract = vm.NewContract(&dummyContractRef{}, &dummyContractRef{}, new(big.Int), 100000)
|
|
||||||
)
|
|
||||||
contract.Code = []byte{byte(vm.PUSH1), 0x1, byte(vm.PUSH1), 0x0, byte(vm.SSTORE)}
|
|
||||||
var index common.Hash
|
|
||||||
logger.CaptureStart(env, common.Address{}, contract.Address(), false, nil, 0, nil)
|
|
||||||
_, err := env.Interpreter().Run(contract, []byte{}, false)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
if len(logger.storage[contract.Address()]) == 0 {
|
|
||||||
t.Fatalf("expected exactly 1 changed value on address %x, got %d", contract.Address(),
|
|
||||||
len(logger.storage[contract.Address()]))
|
|
||||||
}
|
|
||||||
exp := common.BigToHash(big.NewInt(1))
|
|
||||||
if logger.storage[contract.Address()][index] != exp {
|
|
||||||
t.Errorf("expected %x, got %x", exp, logger.storage[contract.Address()][index])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests that blank fields don't appear in logs when JSON marshalled, to reduce
|
|
||||||
// logs bloat and confusion. See https://github.com/ethereum/go-ethereum/issues/24487
|
|
||||||
func TestStructLogMarshalingOmitEmpty(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
name string
|
|
||||||
log *StructLog
|
|
||||||
want string
|
|
||||||
}{
|
|
||||||
{"empty err and no fields", &StructLog{},
|
|
||||||
`{"pc":0,"op":0,"gas":"0x0","gasCost":"0x0","memSize":0,"stack":null,"depth":0,"refund":0,"opName":"STOP"}`},
|
|
||||||
{"with err", &StructLog{Err: errors.New("this failed")},
|
|
||||||
`{"pc":0,"op":0,"gas":"0x0","gasCost":"0x0","memSize":0,"stack":null,"depth":0,"refund":0,"opName":"STOP","error":"this failed"}`},
|
|
||||||
{"with mem", &StructLog{Memory: make([]byte, 2), MemorySize: 2},
|
|
||||||
`{"pc":0,"op":0,"gas":"0x0","gasCost":"0x0","memory":"0x0000","memSize":2,"stack":null,"depth":0,"refund":0,"opName":"STOP"}`},
|
|
||||||
{"with 0-size mem", &StructLog{Memory: make([]byte, 0)},
|
|
||||||
`{"pc":0,"op":0,"gas":"0x0","gasCost":"0x0","memSize":0,"stack":null,"depth":0,"refund":0,"opName":"STOP"}`},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, tt := range tests {
|
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
|
||||||
blob, err := json.Marshal(tt.log)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
if have, want := string(blob), tt.want; have != want {
|
|
||||||
t.Fatalf("mismatched results\n\thave: %v\n\twant: %v", have, want)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue