From ae83ea28da86d1c440ff394b9040abe7556a6783 Mon Sep 17 00:00:00 2001 From: weiihann Date: Tue, 19 Nov 2024 10:37:37 +0800 Subject: [PATCH 1/7] Use period APIs --- cmd/evm/internal/t8ntool/transition.go | 2 +- cmd/geth/verkle.go | 11 ++++++----- core/state_processor_test.go | 2 +- go.mod | 2 ++ go.sum | 4 ++-- trie/transition.go | 2 +- trie/verkle.go | 23 ++++++++++++----------- trie/verkle_iterator_test.go | 2 +- trie/verkle_test.go | 20 ++++++++++---------- 9 files changed, 36 insertions(+), 32 deletions(-) diff --git a/cmd/evm/internal/t8ntool/transition.go b/cmd/evm/internal/t8ntool/transition.go index 86b9c8c78fde..10250e83f394 100644 --- a/cmd/evm/internal/t8ntool/transition.go +++ b/cmd/evm/internal/t8ntool/transition.go @@ -601,7 +601,7 @@ func VerkleRoot(ctx *cli.Context) error { } func genVktFromAlloc(alloc core.GenesisAlloc) (*trie.VerkleTrie, error) { - vkt := trie.NewVerkleTrie(verkle.New(), trie.NewDatabase(rawdb.NewMemoryDatabase()), utils.NewPointCache(), true) + vkt := trie.NewVerkleTrie(verkle.New(), trie.NewDatabase(rawdb.NewMemoryDatabase()), utils.NewPointCache(), true, 0) for addr, acc := range alloc { for slot, value := range acc.Storage { diff --git a/cmd/geth/verkle.go b/cmd/geth/verkle.go index c3e68a29cfa0..072dd372a75c 100644 --- a/cmd/geth/verkle.go +++ b/cmd/geth/verkle.go @@ -128,6 +128,7 @@ func convertToVerkle(ctx *cli.Context) error { lastReport time.Time start = time.Now() vRoot = verkle.New().(*verkle.InternalNode) + curPeriod = verkle.StatePeriod(0) // we assume conversion always starts from period 0 ) saveverkle := func(path []byte, node verkle.VerkleNode) { @@ -202,7 +203,7 @@ func convertToVerkle(ctx *cli.Context) error { // Otherwise, store the previous group in the tree with a // stem insertion. - vRoot.InsertValuesAtStem(chunkkey[:31], values, chaindb.Get) + vRoot.InsertValuesAtStem(chunkkey[:31], values, curPeriod, false, chaindb.Get) } // Write the code size in the account header group @@ -267,7 +268,7 @@ func convertToVerkle(ctx *cli.Context) error { copy(k[:], []byte(s)) // reminder that InsertStem will merge leaves // if they exist. - vRoot.InsertValuesAtStem(k[:31], vs, chaindb.Get) + vRoot.InsertValuesAtStem(k[:31], vs, curPeriod, false, chaindb.Get) } translatedStorage = make(map[string][][]byte) vRoot.FlushAtDepth(2, saveverkle) @@ -276,7 +277,7 @@ func convertToVerkle(ctx *cli.Context) error { for s, vs := range translatedStorage { var k [31]byte copy(k[:], []byte(s)) - vRoot.InsertValuesAtStem(k[:31], vs, chaindb.Get) + vRoot.InsertValuesAtStem(k[:31], vs, curPeriod, false, chaindb.Get) } storageIt.Release() if storageIt.Error() != nil { @@ -285,7 +286,7 @@ func convertToVerkle(ctx *cli.Context) error { } } // Finish with storing the complete account header group inside the tree. - vRoot.InsertValuesAtStem(stem[:31], newValues, chaindb.Get) + vRoot.InsertValuesAtStem(stem[:31], newValues, curPeriod, false, chaindb.Get) if time.Since(lastReport) > time.Second*8 { log.Info("Traversing state", "accounts", accounts, "elapsed", common.PrettyDuration(time.Since(start))) @@ -445,7 +446,7 @@ func expandVerkle(ctx *cli.Context) error { for i, key := range keylist { log.Info("Reading key", "index", i, "key", keylist[0]) - root.Get(key, chaindb.Get) + root.Get(key, 0, chaindb.Get) } if err := os.WriteFile("dump.dot", []byte(verkle.ToDot(root)), 0o600); err != nil { diff --git a/core/state_processor_test.go b/core/state_processor_test.go index 541801f40fcb..249b691746da 100644 --- a/core/state_processor_test.go +++ b/core/state_processor_test.go @@ -617,7 +617,7 @@ func TestProcessVerkle(t *testing.T) { t.Fatal(err) } // check the proof for the last block - err = verkle.Verify(proofs[1], chain[0].Root().Bytes(), chain[1].Root().Bytes(), keyvals[1]) + err = verkle.Verify(proofs[1], chain[0].Root().Bytes(), chain[1].Root().Bytes(), keyvals[1], 0) if err != nil { t.Fatal(err) } diff --git a/go.mod b/go.mod index d2f5ce408aa1..6f8090dc0006 100644 --- a/go.mod +++ b/go.mod @@ -133,3 +133,5 @@ require ( gopkg.in/yaml.v2 v2.4.0 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) + +replace github.com/ethereum/go-verkle => github.com/weiihann/go-verkle v0.11.1 diff --git a/go.sum b/go.sum index 28f4b42a991a..5510af7bd4c6 100644 --- a/go.sum +++ b/go.sum @@ -129,8 +129,6 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= github.com/ethereum/c-kzg-4844 v0.3.0 h1:3Y3hD6l5i0dEYsBL50C+Om644kve3pNqoAcvE26o9zI= github.com/ethereum/c-kzg-4844 v0.3.0/go.mod h1:WI2Nd82DMZAAZI1wV2neKGost9EKjvbpQR9OqE5Qqa8= -github.com/ethereum/go-verkle v0.2.2 h1:I2W0WjnrFUIzzVPwm8ykY+7pL2d4VhlsePn4j7cnFk8= -github.com/ethereum/go-verkle v0.2.2/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= @@ -452,6 +450,8 @@ github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBn github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= +github.com/weiihann/go-verkle v0.11.1 h1:qrOmZdIAy5gLs3F4+G6obH2jjjF7JhqoewRf21AAMgY= +github.com/weiihann/go-verkle v0.11.1/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= diff --git a/trie/transition.go b/trie/transition.go index 61e61d2d8d56..6bcdfe19a01a 100644 --- a/trie/transition.go +++ b/trie/transition.go @@ -180,7 +180,7 @@ func (t *TransitionTrie) UpdateStem(key []byte, values [][]byte) error { trie := t.overlay switch root := trie.root.(type) { case *verkle.InternalNode: - return root.InsertValuesAtStem(key, values, t.overlay.FlatdbNodeResolver) + return root.InsertValuesAtStem(key, values, trie.curPeriod, false, trie.FlatdbNodeResolver) default: panic("invalid root type") } diff --git a/trie/verkle.go b/trie/verkle.go index 2bd40659da95..ff67de0a484c 100644 --- a/trie/verkle.go +++ b/trie/verkle.go @@ -39,18 +39,20 @@ type VerkleTrie struct { db *Database pointCache *utils.PointCache ended bool + curPeriod verkle.StatePeriod } func (vt *VerkleTrie) ToDot() string { return verkle.ToDot(vt.root) } -func NewVerkleTrie(root verkle.VerkleNode, db *Database, pointCache *utils.PointCache, ended bool) *VerkleTrie { +func NewVerkleTrie(root verkle.VerkleNode, db *Database, pointCache *utils.PointCache, ended bool, curPeriod verkle.StatePeriod) *VerkleTrie { return &VerkleTrie{ root: root, db: db, pointCache: pointCache, ended: ended, + curPeriod: curPeriod, } } @@ -59,7 +61,7 @@ func (trie *VerkleTrie) FlatdbNodeResolver(path []byte) ([]byte, error) { } func (trie *VerkleTrie) InsertMigratedLeaves(leaves []verkle.LeafNode) error { - return trie.root.(*verkle.InternalNode).InsertMigratedLeaves(leaves, trie.FlatdbNodeResolver) + return trie.root.(*verkle.InternalNode).InsertMigratedLeaves(leaves, trie.curPeriod, trie.FlatdbNodeResolver) } var ( @@ -89,13 +91,13 @@ func (trie *VerkleTrie) GetKey(key []byte) []byte { func (trie *VerkleTrie) GetStorage(addr common.Address, key []byte) ([]byte, error) { pointEval := trie.pointCache.GetTreeKeyHeader(addr[:]) k := utils.GetTreeKeyStorageSlotWithEvaluatedAddress(pointEval, key) - return trie.root.Get(k, trie.FlatdbNodeResolver) + return trie.root.Get(k, trie.curPeriod, trie.FlatdbNodeResolver) } // GetWithHashedKey returns the value, assuming that the key has already // been hashed. func (trie *VerkleTrie) GetWithHashedKey(key []byte) ([]byte, error) { - return trie.root.Get(key, trie.FlatdbNodeResolver) + return trie.root.Get(key, trie.curPeriod, trie.FlatdbNodeResolver) } func (t *VerkleTrie) GetAccount(addr common.Address) (*types.StateAccount, error) { @@ -107,7 +109,7 @@ func (t *VerkleTrie) GetAccount(addr common.Address) (*types.StateAccount, error ) switch t.root.(type) { case *verkle.InternalNode: - values, err = t.root.(*verkle.InternalNode).GetValuesAtStem(versionkey[:31], t.FlatdbNodeResolver) + values, err = t.root.(*verkle.InternalNode).GetValuesAtStem(versionkey[:31], t.curPeriod, t.FlatdbNodeResolver) default: return nil, errInvalidRootType } @@ -175,7 +177,7 @@ func (t *VerkleTrie) UpdateAccount(addr common.Address, acc *types.StateAccount, switch root := t.root.(type) { case *verkle.InternalNode: - err = root.InsertValuesAtStem(stem, values, t.FlatdbNodeResolver) + err = root.InsertValuesAtStem(stem, values, t.curPeriod, false, t.FlatdbNodeResolver) // TODO(weiihann): check isResurrect default: return errInvalidRootType } @@ -189,7 +191,7 @@ func (t *VerkleTrie) UpdateAccount(addr common.Address, acc *types.StateAccount, func (trie *VerkleTrie) UpdateStem(key []byte, values [][]byte) error { switch root := trie.root.(type) { case *verkle.InternalNode: - return root.InsertValuesAtStem(key, values, trie.FlatdbNodeResolver) + return root.InsertValuesAtStem(key, values, trie.curPeriod, false, trie.FlatdbNodeResolver) // TODO(weiihann): check isResurrect default: panic("invalid root type") } @@ -207,7 +209,7 @@ func (trie *VerkleTrie) UpdateStorage(address common.Address, key, value []byte) } else { copy(v[32-len(value):], value[:]) } - return trie.root.Insert(k, v[:], trie.FlatdbNodeResolver) + return trie.root.Insert(k, v[:], trie.curPeriod, trie.FlatdbNodeResolver) } func (t *VerkleTrie) DeleteAccount(addr common.Address) error { @@ -220,7 +222,7 @@ func (trie *VerkleTrie) DeleteStorage(addr common.Address, key []byte) error { pointEval := trie.pointCache.GetTreeKeyHeader(addr[:]) k := utils.GetTreeKeyStorageSlotWithEvaluatedAddress(pointEval, key) var zero [32]byte - return trie.root.Insert(k, zero[:], trie.FlatdbNodeResolver) + return trie.root.Insert(k, zero[:], trie.curPeriod, trie.FlatdbNodeResolver) } // Hash returns the root hash of the trie. It does not write to the database and @@ -295,7 +297,7 @@ func ProveAndSerialize(pretrie, posttrie *VerkleTrie, keys [][]byte, resolver ve if posttrie != nil { postroot = posttrie.root } - proof, _, _, _, err := verkle.MakeVerkleMultiProof(pretrie.root, postroot, keys, resolver) + proof, _, _, _, err := verkle.MakeVerkleMultiProof(pretrie.root, postroot, keys, pretrie.curPeriod, resolver) if err != nil { return nil, nil, err } @@ -400,7 +402,6 @@ func (t *VerkleTrie) UpdateContractCode(addr common.Address, codeHash common.Has if groupOffset == 255 || len(chunks)-i <= 32 { err = t.UpdateStem(key[:31], values) - if err != nil { return fmt.Errorf("UpdateContractCode (addr=%x) error: %w", addr[:], err) } diff --git a/trie/verkle_iterator_test.go b/trie/verkle_iterator_test.go index 42f8f9fd3406..b7114f57c8e7 100644 --- a/trie/verkle_iterator_test.go +++ b/trie/verkle_iterator_test.go @@ -28,7 +28,7 @@ import ( ) func TestVerkleIterator(t *testing.T) { - trie := NewVerkleTrie(verkle.New(), NewDatabase(rawdb.NewMemoryDatabase()), utils.NewPointCache(), true) + trie := NewVerkleTrie(verkle.New(), NewDatabase(rawdb.NewMemoryDatabase()), utils.NewPointCache(), true, 0) account0 := &types.StateAccount{ Nonce: 1, Balance: big.NewInt(2), diff --git a/trie/verkle_test.go b/trie/verkle_test.go index 0d0934649a5f..a941a929d701 100644 --- a/trie/verkle_test.go +++ b/trie/verkle_test.go @@ -67,11 +67,11 @@ func TestReproduceTree(t *testing.T) { root := verkle.New() for i, key := range presentKeys { - root.Insert(key, values[i], nil) + root.Insert(key, values[i], 0, nil) } root.Commit() - proof, Cs, _, _, err := verkle.MakeVerkleMultiProof(root, nil, append(presentKeys, absentKeys...), nil) + proof, Cs, _, _, err := verkle.MakeVerkleMultiProof(root, nil, append(presentKeys, absentKeys...), 0, nil) if err != nil { t.Fatalf("could not create proof: %v", err) } @@ -80,7 +80,7 @@ func TestReproduceTree(t *testing.T) { t.Fatalf("could not serialize proof: %v", err) } preStateRoot := root.Commit().Bytes() - if err := verkle.Verify(vktProof, preStateRoot[:], nil, statediff); err != nil { + if err := verkle.Verify(vktProof, preStateRoot[:], nil, statediff, 0); err != nil { t.Fatalf("could not verify proof: %v", err) } @@ -294,17 +294,17 @@ func TestReproduceCondrieuStemAggregationInProofOfAbsence(t *testing.T) { root := verkle.New() for i, key := range presentKeys { - root.Insert(key, values[i], nil) + root.Insert(key, values[i], 0, nil) } root.Commit() - proof, Cs, _, _, _ := verkle.MakeVerkleMultiProof(root, nil, append(presentKeys, absentKeys...), nil) + proof, Cs, _, _, _ := verkle.MakeVerkleMultiProof(root, nil, append(presentKeys, absentKeys...), 0, nil) vktProof, statediff, err := verkle.SerializeProof(proof) if err != nil { t.Fatalf("could not serialize proof: %v", err) } preStateRoot := root.Commit().Bytes() - if err := verkle.Verify(vktProof, preStateRoot[:], nil, statediff); err != nil { + if err := verkle.Verify(vktProof, preStateRoot[:], nil, statediff, 0); err != nil { t.Fatal("could not verify proof") } @@ -344,17 +344,17 @@ func TestReproduceCondrieuPoAStemConflictWithAnotherStem(t *testing.T) { root := verkle.New() for i, key := range presentKeys { - root.Insert(key, values[i], nil) + root.Insert(key, values[i], 0, nil) } root.Commit() - proof, Cs, _, _, _ := verkle.MakeVerkleMultiProof(root, nil, append(presentKeys, absentKeys...), nil) + proof, Cs, _, _, _ := verkle.MakeVerkleMultiProof(root, nil, append(presentKeys, absentKeys...), 0, nil) vktProof, stateDiff, err := verkle.SerializeProof(proof) if err != nil { t.Fatalf("could not serialize proof: %v", err) } preStateRoot := root.Commit().Bytes() - if err := verkle.Verify(vktProof, preStateRoot[:], nil, stateDiff); err != nil { + if err := verkle.Verify(vktProof, preStateRoot[:], nil, stateDiff, 0); err != nil { t.Fatal("could not verify proof") } @@ -378,7 +378,7 @@ func TestReproduceCondrieuPoAStemConflictWithAnotherStem(t *testing.T) { func TestEmptyKeySetInProveAndSerialize(t *testing.T) { tree := verkle.New() - verkle.MakeVerkleMultiProof(tree, nil, [][]byte{}, nil) + verkle.MakeVerkleMultiProof(tree, nil, [][]byte{}, 0, nil) } func TestGetTreeKeys(t *testing.T) { From aa0dacc3dad0e3d7ec1ed4eeaf7d6cd035b1ba82 Mon Sep 17 00:00:00 2001 From: weiihann Date: Wed, 20 Nov 2024 12:17:21 +0800 Subject: [PATCH 2/7] core/types: get period from current timestamp --- core/types/period.go | 24 +++++++++++++ core/types/period_test.go | 74 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 98 insertions(+) create mode 100644 core/types/period.go create mode 100644 core/types/period_test.go diff --git a/core/types/period.go b/core/types/period.go new file mode 100644 index 000000000000..c876d57702e4 --- /dev/null +++ b/core/types/period.go @@ -0,0 +1,24 @@ +package types + +import ( + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-verkle" +) + +var ( + PeriodLength = uint64(15_778_800) // measured in seconds, about 6 months + Period0 = verkle.StatePeriod(0) +) + +func GetStatePeriod(config *params.ChainConfig, curTime uint64) verkle.StatePeriod { + if config == nil || config.StateExpiryTime == nil { + return Period0 + } + + forkTime := *config.StateExpiryTime + if curTime < forkTime { + return Period0 + } + + return verkle.StatePeriod((curTime - forkTime) / PeriodLength) +} \ No newline at end of file diff --git a/core/types/period_test.go b/core/types/period_test.go new file mode 100644 index 000000000000..b9b1e658f1f5 --- /dev/null +++ b/core/types/period_test.go @@ -0,0 +1,74 @@ +package types + +import ( + "testing" + + "github.com/ethereum/go-ethereum/params" +) + +func u64(v uint64) *uint64 { return &v } + +func TestGetStatePeriod(t *testing.T) { + tests := []struct { + name string + config *params.ChainConfig + curTime uint64 + expectedPeriod uint64 + }{ + { + name: "nil config returns period 0", + config: nil, + curTime: 16_000_000, + expectedPeriod: 0, + }, + { + name: "nil StateExpiryTime returns period 0", + config: ¶ms.ChainConfig{ + StateExpiryTime: nil, + }, + curTime: 16_000_000, + expectedPeriod: 0, + }, + { + name: "current time before fork time returns period 0", + config: ¶ms.ChainConfig{ + StateExpiryTime: u64(16_000_000), + }, + curTime: 15_000_000, + expectedPeriod: 0, + }, + { + name: "current time equal to fork time returns period 0", + config: ¶ms.ChainConfig{ + StateExpiryTime: u64(16_000_000), + }, + curTime: 16_000_000, + expectedPeriod: 0, + }, + { + name: "current time after fork time returns correct period", + config: ¶ms.ChainConfig{ + StateExpiryTime: u64(16_000_000), + }, + curTime: 16_000_000 + PeriodLength, + expectedPeriod: 1, + }, + { + name: "multiple periods after fork time", + config: ¶ms.ChainConfig{ + StateExpiryTime: u64(16_000_000), + }, + curTime: 16_000_000 + (PeriodLength * 3), + expectedPeriod: 3, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := GetStatePeriod(tt.config, tt.curTime) + if uint64(got) != tt.expectedPeriod { + t.Errorf("GetStatePeriod() = %v, want %v", got, tt.expectedPeriod) + } + }) + } +} From ff8dc23f53bfdc15a5681a3dc635201ae1518814 Mon Sep 17 00:00:00 2001 From: weiihann Date: Mon, 25 Nov 2024 22:17:23 +0800 Subject: [PATCH 3/7] all: propagate period from chain to tree --- accounts/abi/bind/backends/simulated.go | 12 ++++-- cmd/evm/internal/t8ntool/execution.go | 8 ++-- cmd/evm/runner.go | 4 +- cmd/evm/staterunner.go | 2 +- cmd/geth/chaincmd.go | 2 +- consensus/beacon/consensus.go | 8 ++-- core/block_validator.go | 2 +- core/blockchain.go | 6 ++- core/blockchain_reader.go | 11 ++++-- core/blockchain_test.go | 4 +- core/chain_makers.go | 8 ++-- core/genesis.go | 8 +++- core/state/database.go | 12 +++--- core/state/iterator_test.go | 2 +- core/state/state_test.go | 14 +++---- core/state/statedb.go | 5 ++- core/state/statedb_fuzz_test.go | 2 +- core/state/statedb_test.go | 46 +++++++++++----------- core/state/sync_test.go | 6 +-- core/state/trie_prefetcher.go | 3 +- core/state/trie_prefetcher_test.go | 2 +- core/state_processor_test.go | 2 +- core/txpool/blobpool/blobpool.go | 4 +- core/txpool/blobpool/blobpool_test.go | 13 +++--- core/txpool/blobpool/interface.go | 3 +- core/txpool/legacypool/legacypool.go | 5 ++- core/txpool/legacypool/legacypool2_test.go | 8 ++-- core/txpool/legacypool/legacypool_test.go | 41 +++++++++---------- core/vm/gas_table_test.go | 4 +- core/vm/instructions_test.go | 2 +- core/vm/interpreter_test.go | 2 +- core/vm/runtime/runtime.go | 4 +- core/vm/runtime/runtime_test.go | 10 ++--- eth/api_backend.go | 4 +- eth/api_debug.go | 6 +-- eth/api_debug_test.go | 12 +++--- eth/catalyst/api_test.go | 8 ++-- eth/protocols/eth/handler_test.go | 4 +- eth/state_accessor.go | 11 +++--- eth/tracers/api.go | 4 ++ eth/tracers/api_test.go | 2 +- internal/ethapi/api_test.go | 2 +- les/server_requests.go | 2 +- light/odr_test.go | 6 +-- light/trie.go | 5 ++- light/trie_test.go | 4 +- miner/miner_test.go | 5 ++- miner/worker.go | 2 +- params/config.go | 17 ++++++++ tests/init.go | 2 + tests/state_test_util.go | 6 +-- 51 files changed, 207 insertions(+), 160 deletions(-) diff --git a/accounts/abi/bind/backends/simulated.go b/accounts/abi/bind/backends/simulated.go index 83b91f7f8d59..ca98fb760155 100644 --- a/accounts/abi/bind/backends/simulated.go +++ b/accounts/abi/bind/backends/simulated.go @@ -148,7 +148,8 @@ func (b *SimulatedBackend) rollback(parent *types.Block) { blocks, _ := core.GenerateChain(b.config, parent, ethash.NewFaker(), b.database, 1, func(int, *core.BlockGen) {}) b.pendingBlock = blocks[0] - b.pendingState, _ = state.New(b.pendingBlock.Root(), b.blockchain.StateCache(), nil) + pendingPeriod := types.GetStatePeriod(b.config, b.pendingBlock.Time()) + b.pendingState, _ = state.New(b.pendingBlock.Root(), b.blockchain.StateCache(), nil, pendingPeriod) } // Fork creates a side-chain that can be used to simulate reorgs. @@ -187,7 +188,8 @@ func (b *SimulatedBackend) stateByBlockNumber(ctx context.Context, blockNumber * if err != nil { return nil, err } - return b.blockchain.StateAt(block.Root()) + blockPeriod := types.GetStatePeriod(b.config, block.Time()) + return b.blockchain.StateAt(block.Root(), blockPeriod) } // CodeAt returns the code associated with a certain account in the blockchain. @@ -703,7 +705,8 @@ func (b *SimulatedBackend) SendTransaction(ctx context.Context, tx *types.Transa stateDB, _ := b.blockchain.State() b.pendingBlock = blocks[0] - b.pendingState, _ = state.New(b.pendingBlock.Root(), stateDB.Database(), nil) + pendingPeriod := types.GetStatePeriod(b.config, b.pendingBlock.Time()) + b.pendingState, _ = state.New(b.pendingBlock.Root(), stateDB.Database(), nil, pendingPeriod) b.pendingReceipts = receipts[0] return nil } @@ -824,7 +827,8 @@ func (b *SimulatedBackend) AdjustTime(adjustment time.Duration) error { stateDB, _ := b.blockchain.State() b.pendingBlock = blocks[0] - b.pendingState, _ = state.New(b.pendingBlock.Root(), stateDB.Database(), nil) + pendingPeriod := types.GetStatePeriod(b.config, b.pendingBlock.Time()) + b.pendingState, _ = state.New(b.pendingBlock.Root(), stateDB.Database(), nil, pendingPeriod) return nil } diff --git a/cmd/evm/internal/t8ntool/execution.go b/cmd/evm/internal/t8ntool/execution.go index 2fb49139d71f..2159dc905ac2 100644 --- a/cmd/evm/internal/t8ntool/execution.go +++ b/cmd/evm/internal/t8ntool/execution.go @@ -419,7 +419,7 @@ func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig, } // Re-create statedb instance with new root upon the updated database // for accessing latest states. - statedb, err = state.New(root, statedb.Database(), nil) + statedb, err = state.New(root, statedb.Database(), nil, types.Period0) if err != nil { return nil, nil, NewError(ErrorEVM, fmt.Errorf("could not reopen state: %v", err)) } @@ -434,7 +434,7 @@ func MakePreState(db ethdb.Database, chainConfig *params.ChainConfig, pre *Prest sdb.InitTransitionStatus(true, true, common.Hash{}) } - statedb, _ := state.New(types.EmptyRootHash, sdb, nil) + statedb, _ := state.New(types.EmptyRootHash, sdb, nil, types.Period0) if pre.Env.Ended != nil && *pre.Env.Ended { vtr := statedb.GetTrie().(*trie.VerkleTrie) @@ -528,7 +528,7 @@ func MakePreState(db ethdb.Database, chainConfig *params.ChainConfig, pre *Prest // to dump the tree that was passed as parameters, but is not suited for block // execution since it's missing the snapshot and therefore it can't go through // the conversion. - statedb, err = state.New(types.EmptyRootHash, sdb, nil) + statedb, err = state.New(types.EmptyRootHash, sdb, nil, types.Period0) if err != nil { panic(err) } @@ -562,7 +562,7 @@ func MakePreState(db ethdb.Database, chainConfig *params.ChainConfig, pre *Prest // recreate the verkle db with the tree root, but this time with the mpt snapshot, // so that the conversion can proceed. - statedb, err = state.New(root, sdb, snaps) + statedb, err = state.New(root, sdb, snaps, types.Period0) if err != nil { panic(err) } diff --git a/cmd/evm/runner.go b/cmd/evm/runner.go index ed7989e87299..045825ab9867 100644 --- a/cmd/evm/runner.go +++ b/cmd/evm/runner.go @@ -144,11 +144,11 @@ func runCmd(ctx *cli.Context) error { db := rawdb.NewMemoryDatabase() genesis := gen.MustCommit(db) sdb := state.NewDatabaseWithConfig(db, &trie.Config{Preimages: preimages}) - statedb, _ = state.New(genesis.Root(), sdb, nil) + statedb, _ = state.New(genesis.Root(), sdb, nil, types.Period0) chainConfig = gen.Config } else { sdb := state.NewDatabaseWithConfig(rawdb.NewMemoryDatabase(), &trie.Config{Preimages: preimages}) - statedb, _ = state.New(types.EmptyRootHash, sdb, nil) + statedb, _ = state.New(types.EmptyRootHash, sdb, nil, types.Period0) genesisConfig = new(core.Genesis) } if ctx.String(SenderFlag.Name) != "" { diff --git a/cmd/evm/staterunner.go b/cmd/evm/staterunner.go index 231830f6d78b..9d5bb243d94b 100644 --- a/cmd/evm/staterunner.go +++ b/cmd/evm/staterunner.go @@ -117,7 +117,7 @@ func runStateTest(fname string, cfg vm.Config, jsonOut, dump bool) error { // Test failed, mark as so and dump any state to aid debugging result.Pass, result.Error = false, err.Error() if dump && s != nil { - s, _ = state.New(*result.Root, s.Database(), nil) + s, _ = state.New(*result.Root, s.Database(), nil, 0) dump := s.RawDump(nil) result.State = &dump } diff --git a/cmd/geth/chaincmd.go b/cmd/geth/chaincmd.go index e3b8575a3624..11ecdc6987be 100644 --- a/cmd/geth/chaincmd.go +++ b/cmd/geth/chaincmd.go @@ -513,7 +513,7 @@ func dump(ctx *cli.Context) error { config := &trie.Config{ Preimages: true, // always enable preimage lookup } - state, err := state.New(root, state.NewDatabaseWithConfig(db, config), nil) + state, err := state.New(root, state.NewDatabaseWithConfig(db, config), nil, types.Period0) // TODO(weiihann): load head block and get the period if err != nil { return err } diff --git a/consensus/beacon/consensus.go b/consensus/beacon/consensus.go index c7bfd1e55b09..513efa4b797b 100644 --- a/consensus/beacon/consensus.go +++ b/consensus/beacon/consensus.go @@ -414,7 +414,7 @@ func (beacon *Beacon) FinalizeAndAssemble(chain consensus.ChainHeaderReader, hea state.Database().LoadTransitionState(parent.Root) var err error - stateDiff, proof, err = BuildVerkleProof(header, state, parent.Root) + stateDiff, proof, err = BuildVerkleProof(header, state, parent.Root, types.GetStatePeriod(chain.Config(), parent.Time)) if err != nil { return nil, fmt.Errorf("error building verkle proof: %w", err) } @@ -429,13 +429,13 @@ func (beacon *Beacon) FinalizeAndAssemble(chain consensus.ChainHeaderReader, hea return block, nil } -func BuildVerkleProof(header *types.Header, state *state.StateDB, parentRoot common.Hash) (verkle.StateDiff, *verkle.VerkleProof, error) { +func BuildVerkleProof(header *types.Header, state *state.StateDB, parentRoot common.Hash, curPeriod verkle.StatePeriod) (verkle.StateDiff, *verkle.VerkleProof, error) { var ( proof *verkle.VerkleProof stateDiff verkle.StateDiff ) - preTrie, err := state.Database().OpenTrie(parentRoot) + preTrie, err := state.Database().OpenTrie(parentRoot, curPeriod) if err != nil { return nil, nil, fmt.Errorf("error opening pre-state tree root: %w", err) } @@ -469,7 +469,7 @@ func BuildVerkleProof(header *types.Header, state *state.StateDB, parentRoot com // conversion, when the previous tree is a merkle tree. // Logically, the "previous" verkle tree is an empty tree. okpre = true - vtrpre = trie.NewVerkleTrie(verkle.New(), state.Database().TrieDB(), utils.NewPointCache(), false) + vtrpre = trie.NewVerkleTrie(verkle.New(), state.Database().TrieDB(), utils.NewPointCache(), false, 0) // TODO(weiihann) post := state.GetTrie().(*trie.TransitionTrie) vtrpost = post.Overlay() okpost = true diff --git a/core/block_validator.go b/core/block_validator.go index 4f15087e62b6..11c30de63200 100644 --- a/core/block_validator.go +++ b/core/block_validator.go @@ -137,7 +137,7 @@ func (v *BlockValidator) ValidateState(block *types.Block, statedb *state.StateD if parent == nil { return fmt.Errorf("nil parent header for block %d", header.Number) } - stateDiff, proof, err := beacon.BuildVerkleProof(header, statedb, parent.Root()) + stateDiff, proof, err := beacon.BuildVerkleProof(header, statedb, parent.Root(), types.GetStatePeriod(v.bc.Config(), parent.Time())) if err != nil { return fmt.Errorf("error building verkle proof: %w", err) } diff --git a/core/blockchain.go b/core/blockchain.go index e6b9c5901a26..485703692dab 100644 --- a/core/blockchain.go +++ b/core/blockchain.go @@ -1760,6 +1760,7 @@ func (bc *BlockChain) insertChain(chain types.Blocks, setHead bool) (int, error) parent = bc.GetHeader(block.ParentHash(), block.NumberU64()-1) } + curPeriod := types.GetStatePeriod(bc.Config(), block.Time()) if bc.Config().IsVerkle(block.Number(), block.Time()) { bc.stateCache.LoadTransitionState(parent.Root) @@ -1778,7 +1779,7 @@ func (bc *BlockChain) insertChain(chain types.Blocks, setHead bool) (int, error) bc.StartVerkleTransition(parent.Root, emptyVerkleRoot, bc.Config(), &parent.Time, parent.Root) bc.stateCache.SetLastMerkleRoot(parent.Root) } - statedb, err := state.New(parent.Root, bc.stateCache, bc.snaps) + statedb, err := state.New(parent.Root, bc.stateCache, bc.snaps, curPeriod) // TODO(weiihann): here if err != nil { return it.index, err } @@ -1792,7 +1793,8 @@ func (bc *BlockChain) insertChain(chain types.Blocks, setHead bool) (int, error) var followupInterrupt atomic.Bool if !bc.cacheConfig.TrieCleanNoPrefetch { if followup, err := it.peek(); followup != nil && err == nil { - throwaway, _ := state.New(parent.Root, bc.stateCache, bc.snaps) + blockPeriod := types.GetStatePeriod(bc.Config(), followup.Time()) + throwaway, _ := state.New(parent.Root, bc.stateCache, bc.snaps, blockPeriod) go func(start time.Time, followup *types.Block, throwaway *state.StateDB) { bc.prefetcher.Prefetch(followup, throwaway, bc.vmConfig, &followupInterrupt) diff --git a/core/blockchain_reader.go b/core/blockchain_reader.go index f9d0e3531f72..2d3f5c69133a 100644 --- a/core/blockchain_reader.go +++ b/core/blockchain_reader.go @@ -30,6 +30,7 @@ import ( "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/trie" + "github.com/ethereum/go-verkle" ) // CurrentHeader retrieves the current head header of the canonical chain. The @@ -278,7 +279,7 @@ func (bc *BlockChain) GetTd(hash common.Hash, number uint64) *big.Int { // HasState checks if state trie is fully present in the database or not. func (bc *BlockChain) HasState(hash common.Hash) bool { - _, err := bc.stateCache.OpenTrie(hash) + _, err := bc.stateCache.OpenTrie(hash, types.Period0) // we can ignore the actual period since we're only checking for presence return err == nil } @@ -315,12 +316,14 @@ func (bc *BlockChain) ContractCodeWithPrefix(hash common.Hash) ([]byte, error) { // State returns a new mutable state based on the current HEAD block. func (bc *BlockChain) State() (*state.StateDB, error) { - return bc.StateAt(bc.CurrentBlock().Root) + curBlock := bc.CurrentBlock() + curPeriod := types.GetStatePeriod(bc.chainConfig, curBlock.Time) + return bc.StateAt(curBlock.Root, curPeriod) } // StateAt returns a new mutable state based on a particular point in time. -func (bc *BlockChain) StateAt(root common.Hash) (*state.StateDB, error) { - return state.New(root, bc.stateCache, bc.snaps) +func (bc *BlockChain) StateAt(root common.Hash, curPeriod verkle.StatePeriod) (*state.StateDB, error) { + return state.New(root, bc.stateCache, bc.snaps, curPeriod) } // Config retrieves the chain's fork configuration. diff --git a/core/blockchain_test.go b/core/blockchain_test.go index 1b4b569575a5..c47317f01596 100644 --- a/core/blockchain_test.go +++ b/core/blockchain_test.go @@ -158,7 +158,7 @@ func testBlockChainImport(chain types.Blocks, blockchain *BlockChain) error { } return err } - statedb, err := state.New(blockchain.GetBlockByHash(block.ParentHash()).Root(), blockchain.stateCache, nil) + statedb, err := state.New(blockchain.GetBlockByHash(block.ParentHash()).Root(), blockchain.stateCache, nil, types.Period0) if err != nil { return err } @@ -4222,7 +4222,7 @@ func TestTransientStorageReset(t *testing.T) { t.Fatalf("failed to insert into chain: %v", err) } // Check the storage - state, err := chain.StateAt(chain.CurrentHeader().Root) + state, err := chain.StateAt(chain.CurrentHeader().Root, types.Period0) if err != nil { t.Fatalf("Failed to load state %v", err) } diff --git a/core/chain_makers.go b/core/chain_makers.go index 07a600ef735e..6fca0fbbc751 100644 --- a/core/chain_makers.go +++ b/core/chain_makers.go @@ -336,7 +336,8 @@ func GenerateChain(config *params.ChainConfig, parent *types.Block, engine conse return nil, nil } for i := 0; i < n; i++ { - statedb, err := state.New(parent.Root(), state.NewDatabase(db), nil) + curPeriod := types.GetStatePeriod(config, parent.Time()) + statedb, err := state.New(parent.Root(), state.NewDatabase(db), nil, curPeriod) if err != nil { panic(err) } @@ -432,7 +433,7 @@ func GenerateVerkleChain(config *params.ChainConfig, parent *types.Block, engine proots = append(proots, parent.Root()) // quick check that we are self-consistent - err = verkle.Verify(block.ExecutionWitness().VerkleProof, block.ExecutionWitness().ParentStateRoot[:], block.Root().Bytes(), block.ExecutionWitness().StateDiff) + err = verkle.Verify(block.ExecutionWitness().VerkleProof, block.ExecutionWitness().ParentStateRoot[:], block.Root().Bytes(), block.ExecutionWitness().StateDiff, 0) // TODO(weiihann) if err != nil { panic(err) } @@ -447,7 +448,8 @@ func GenerateVerkleChain(config *params.ChainConfig, parent *types.Block, engine db.EndVerkleTransition() db.SaveTransitionState(parent.Root()) for i := 0; i < n; i++ { - statedb, err := state.New(parent.Root(), db, snaps) + curPeriod := types.GetStatePeriod(config, parent.Time()) + statedb, err := state.New(parent.Root(), db, snaps, curPeriod) if err != nil { panic(fmt.Sprintf("could not find state for block %d: err=%v, parent root=%x", i, err, parent.Root())) } diff --git a/core/genesis.go b/core/genesis.go index b5fe17a6f4ae..aba7ab600d47 100644 --- a/core/genesis.go +++ b/core/genesis.go @@ -129,7 +129,7 @@ func (ga *GenesisAlloc) deriveHash(cfg *params.ChainConfig, timestamp uint64) (c db.StartVerkleTransition(common.Hash{}, common.Hash{}, cfg, ×tamp, common.Hash{}) db.EndVerkleTransition() } - statedb, err := state.New(types.EmptyRootHash, db, nil) + statedb, err := state.New(types.EmptyRootHash, db, nil, types.Period0) if err != nil { return common.Hash{}, err } @@ -155,7 +155,7 @@ func (ga *GenesisAlloc) flush(db ethdb.Database, triedb *trie.Database, blockhas database.EndVerkleTransition() } - statedb, err := state.New(types.EmptyRootHash, database, nil) + statedb, err := state.New(types.EmptyRootHash, database, nil, types.Period0) if err != nil { return err } @@ -294,6 +294,7 @@ func (e *GenesisMismatchError) Error() string { type ChainOverrides struct { OverrideCancun *uint64 OverrideVerkle *uint64 + OverrideStateExpiry *uint64 OverrideProofInBlock *bool OverrideOverlayStride *uint64 } @@ -327,6 +328,9 @@ func SetupGenesisBlockWithOverride(db ethdb.Database, triedb *trie.Database, gen if overrides != nil && overrides.OverrideVerkle != nil { config.VerkleTime = overrides.OverrideVerkle } + if overrides != nil && overrides.OverrideStateExpiry != nil { + config.StateExpiryTime = overrides.OverrideStateExpiry + } } } // Just commit the new block if there is no stored genesis block. diff --git a/core/state/database.go b/core/state/database.go index 72fb15888ff8..b03658c50342 100644 --- a/core/state/database.go +++ b/core/state/database.go @@ -54,7 +54,7 @@ func NoBanner() { // Database wraps access to tries and contract code. type Database interface { // OpenTrie opens the main account trie. - OpenTrie(root common.Hash) (Trie, error) + OpenTrie(root common.Hash, curPeriod verkle.StatePeriod) (Trie, error) // OpenStorageTrie opens the storage trie of an account. OpenStorageTrie(stateRoot common.Hash, address common.Address, root common.Hash, main Trie) (Trie, error) @@ -340,26 +340,26 @@ func (db *cachingDB) openMPTTrie(root common.Hash) (Trie, error) { return tr, nil } -func (db *cachingDB) openVKTrie(_ common.Hash) (Trie, error) { +func (db *cachingDB) openVKTrie(_ common.Hash, curPeriod verkle.StatePeriod) (Trie, error) { payload, err := db.DiskDB().Get(trie.FlatDBVerkleNodeKeyPrefix) if err != nil { - return trie.NewVerkleTrie(verkle.New(), db.triedb, db.addrToPoint, db.CurrentTransitionState.Ended), nil + return trie.NewVerkleTrie(verkle.New(), db.triedb, db.addrToPoint, db.CurrentTransitionState.Ended, curPeriod), nil } r, err := verkle.ParseNode(payload, 0) if err != nil { panic(err) } - return trie.NewVerkleTrie(r, db.triedb, db.addrToPoint, db.CurrentTransitionState.Ended), err + return trie.NewVerkleTrie(r, db.triedb, db.addrToPoint, db.CurrentTransitionState.Ended, curPeriod), err } // OpenTrie opens the main account trie at a specific root hash. -func (db *cachingDB) OpenTrie(root common.Hash) (Trie, error) { +func (db *cachingDB) OpenTrie(root common.Hash, curPeriod verkle.StatePeriod) (Trie, error) { // TODO separate both cases when I can be certain that it won't // find a Verkle trie where is expects a Transitoion trie. if db.InTransition() || db.Transitioned() { // NOTE this is a kaustinen-only change, it will break replay - vkt, err := db.openVKTrie(root) + vkt, err := db.openVKTrie(root, curPeriod) // assume that transition will always start with period 0 if err != nil { log.Error("failed to open the vkt", "err", err) return nil, err diff --git a/core/state/iterator_test.go b/core/state/iterator_test.go index c8e1a181eb6f..e0fa7419c048 100644 --- a/core/state/iterator_test.go +++ b/core/state/iterator_test.go @@ -30,7 +30,7 @@ func TestNodeIteratorCoverage(t *testing.T) { db, sdb, root, _ := makeTestState() sdb.TrieDB().Commit(root, false) - state, err := New(root, sdb, nil) + state, err := New(root, sdb, nil, 0) if err != nil { t.Fatalf("failed to create state trie at %x: %v", root, err) } diff --git a/core/state/state_test.go b/core/state/state_test.go index 2553133dea55..64d816c3df9b 100644 --- a/core/state/state_test.go +++ b/core/state/state_test.go @@ -37,14 +37,14 @@ type stateEnv struct { func newStateEnv() *stateEnv { db := rawdb.NewMemoryDatabase() - sdb, _ := New(types.EmptyRootHash, NewDatabase(db), nil) + sdb, _ := New(types.EmptyRootHash, NewDatabase(db), nil, types.Period0) return &stateEnv{db: db, state: sdb} } func TestDump(t *testing.T) { db := rawdb.NewMemoryDatabase() tdb := NewDatabaseWithConfig(db, &trie.Config{Preimages: true}) - sdb, _ := New(types.EmptyRootHash, tdb, nil) + sdb, _ := New(types.EmptyRootHash, tdb, nil, types.Period0) s := &stateEnv{db: db, state: sdb} // generate a few entries @@ -61,7 +61,7 @@ func TestDump(t *testing.T) { root, _ := s.state.Commit(0, false) // check that DumpToCollector contains the state objects that are in trie - s.state, _ = New(root, tdb, nil) + s.state, _ = New(root, tdb, nil, types.Period0) got := string(s.state.Dump(nil)) want := `{ "root": "71edff0130dd2385947095001c73d9e28d862fc286fca2b922ca6f6f3cddfdd2", @@ -98,7 +98,7 @@ func TestDump(t *testing.T) { func TestIterativeDump(t *testing.T) { db := rawdb.NewMemoryDatabase() tdb := NewDatabaseWithConfig(db, &trie.Config{Preimages: true}) - sdb, _ := New(types.EmptyRootHash, tdb, nil) + sdb, _ := New(types.EmptyRootHash, tdb, nil, types.Period0) s := &stateEnv{db: db, state: sdb} // generate a few entries @@ -115,7 +115,7 @@ func TestIterativeDump(t *testing.T) { s.state.updateStateObject(obj1) s.state.updateStateObject(obj2) root, _ := s.state.Commit(0, false) - s.state, _ = New(root, tdb, nil) + s.state, _ = New(root, tdb, nil, types.Period0) b := &bytes.Buffer{} s.state.IterativeDump(nil, json.NewEncoder(b)) @@ -191,7 +191,7 @@ func TestSnapshotEmpty(t *testing.T) { } func TestSnapshot2(t *testing.T) { - state, _ := New(types.EmptyRootHash, NewDatabase(rawdb.NewMemoryDatabase()), nil) + state, _ := New(types.EmptyRootHash, NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) stateobjaddr0 := common.BytesToAddress([]byte("so0")) stateobjaddr1 := common.BytesToAddress([]byte("so1")) @@ -213,7 +213,7 @@ func TestSnapshot2(t *testing.T) { state.setStateObject(so0) root, _ := state.Commit(0, false) - state, _ = New(root, state.db, state.snaps) + state, _ = New(root, state.db, state.snaps, types.Period0) // and one with deleted == true so1 := state.getStateObject(stateobjaddr1) diff --git a/core/state/statedb.go b/core/state/statedb.go index 3b85508e39dc..f4021be82215 100644 --- a/core/state/statedb.go +++ b/core/state/statedb.go @@ -36,6 +36,7 @@ import ( "github.com/ethereum/go-ethereum/trie" "github.com/ethereum/go-ethereum/trie/trienode" "github.com/ethereum/go-ethereum/trie/triestate" + "github.com/ethereum/go-verkle" ) type revision struct { @@ -148,8 +149,8 @@ type StateDB struct { } // New creates a new state from a given trie. -func New(root common.Hash, db Database, snaps *snapshot.Tree) (*StateDB, error) { - tr, err := db.OpenTrie(root) +func New(root common.Hash, db Database, snaps *snapshot.Tree, curPeriod verkle.StatePeriod) (*StateDB, error) { + tr, err := db.OpenTrie(root, curPeriod) if err != nil { return nil, err } diff --git a/core/state/statedb_fuzz_test.go b/core/state/statedb_fuzz_test.go index 17d60c9ba629..4023e08a1bff 100644 --- a/core/state/statedb_fuzz_test.go +++ b/core/state/statedb_fuzz_test.go @@ -188,7 +188,7 @@ func (test *stateTest) run() bool { if i != 0 { root = roots[len(roots)-1] } - state, err := New(root, sdb, nil) + state, err := New(root, sdb, nil, types.Period0) if err != nil { panic(err) } diff --git a/core/state/statedb_test.go b/core/state/statedb_test.go index e6479076fa98..c0f7fa4382e7 100644 --- a/core/state/statedb_test.go +++ b/core/state/statedb_test.go @@ -43,7 +43,7 @@ import ( func TestUpdateLeaks(t *testing.T) { // Create an empty state database db := rawdb.NewMemoryDatabase() - state, _ := New(types.EmptyRootHash, NewDatabase(db), nil) + state, _ := New(types.EmptyRootHash, NewDatabase(db), nil, types.Period0) // Update it with some accounts for i := byte(0); i < 255; i++ { @@ -77,8 +77,8 @@ func TestIntermediateLeaks(t *testing.T) { // Create two state databases, one transitioning to the final state, the other final from the beginning transDb := rawdb.NewMemoryDatabase() finalDb := rawdb.NewMemoryDatabase() - transState, _ := New(types.EmptyRootHash, NewDatabase(transDb), nil) - finalState, _ := New(types.EmptyRootHash, NewDatabase(finalDb), nil) + transState, _ := New(types.EmptyRootHash, NewDatabase(transDb), nil, types.Period0) + finalState, _ := New(types.EmptyRootHash, NewDatabase(finalDb), nil, types.Period0) modify := func(state *StateDB, addr common.Address, i, tweak byte) { state.SetBalance(addr, big.NewInt(int64(11*i)+int64(tweak))) @@ -153,7 +153,7 @@ func TestIntermediateLeaks(t *testing.T) { // https://github.com/ethereum/go-ethereum/pull/15549. func TestCopy(t *testing.T) { // Create a random state test to copy and modify "independently" - orig, _ := New(types.EmptyRootHash, NewDatabase(rawdb.NewMemoryDatabase()), nil) + orig, _ := New(types.EmptyRootHash, NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) for i := byte(0); i < 255; i++ { obj := orig.GetOrNewStateObject(common.BytesToAddress([]byte{i})) @@ -413,7 +413,7 @@ func (test *snapshotTest) String() string { func (test *snapshotTest) run() bool { // Run all actions and create snapshots. var ( - state, _ = New(types.EmptyRootHash, NewDatabase(rawdb.NewMemoryDatabase()), nil) + state, _ = New(types.EmptyRootHash, NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) snapshotRevs = make([]int, len(test.snapshots)) sindex = 0 ) @@ -427,7 +427,7 @@ func (test *snapshotTest) run() bool { // Revert all snapshots in reverse order. Each revert must yield a state // that is equivalent to fresh state with all actions up the snapshot applied. for sindex--; sindex >= 0; sindex-- { - checkstate, _ := New(types.EmptyRootHash, state.Database(), nil) + checkstate, _ := New(types.EmptyRootHash, state.Database(), nil, types.Period0) for _, action := range test.actions[:test.snapshots[sindex]] { action.fn(action, checkstate) } @@ -488,7 +488,7 @@ func TestTouchDelete(t *testing.T) { s := newStateEnv() s.state.GetOrNewStateObject(common.Address{}) root, _ := s.state.Commit(0, false) - s.state, _ = New(root, s.state.db, s.state.snaps) + s.state, _ = New(root, s.state.db, s.state.snaps, types.Period0) snapshot := s.state.Snapshot() s.state.AddBalance(common.Address{}, new(big.Int)) @@ -505,7 +505,7 @@ func TestTouchDelete(t *testing.T) { // TestCopyOfCopy tests that modified objects are carried over to the copy, and the copy of the copy. // See https://github.com/ethereum/go-ethereum/pull/15225#issuecomment-380191512 func TestCopyOfCopy(t *testing.T) { - state, _ := New(types.EmptyRootHash, NewDatabase(rawdb.NewMemoryDatabase()), nil) + state, _ := New(types.EmptyRootHash, NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) addr := common.HexToAddress("aaaa") state.SetBalance(addr, big.NewInt(42)) @@ -523,7 +523,7 @@ func TestCopyOfCopy(t *testing.T) { // See https://github.com/ethereum/go-ethereum/issues/20106. func TestCopyCommitCopy(t *testing.T) { tdb := NewDatabase(rawdb.NewMemoryDatabase()) - state, _ := New(types.EmptyRootHash, tdb, nil) + state, _ := New(types.EmptyRootHash, tdb, nil, types.Period0) // Create an account and check if the retrieved balance is correct addr := common.HexToAddress("0xaffeaffeaffeaffeaffeaffeaffeaffeaffeaffe") @@ -576,7 +576,7 @@ func TestCopyCommitCopy(t *testing.T) { } // Commit state, ensure states can be loaded from disk root, _ := state.Commit(0, false) - state, _ = New(root, tdb, nil) + state, _ = New(root, tdb, nil, types.Period0) if balance := state.GetBalance(addr); balance.Cmp(big.NewInt(42)) != 0 { t.Fatalf("state post-commit balance mismatch: have %v, want %v", balance, 42) } @@ -596,7 +596,7 @@ func TestCopyCommitCopy(t *testing.T) { // // See https://github.com/ethereum/go-ethereum/issues/20106. func TestCopyCopyCommitCopy(t *testing.T) { - state, _ := New(types.EmptyRootHash, NewDatabase(rawdb.NewMemoryDatabase()), nil) + state, _ := New(types.EmptyRootHash, NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) // Create an account and check if the retrieved balance is correct addr := common.HexToAddress("0xaffeaffeaffeaffeaffeaffeaffeaffeaffeaffe") @@ -665,7 +665,7 @@ func TestCopyCopyCommitCopy(t *testing.T) { // TestCommitCopy tests the copy from a committed state is not functional. func TestCommitCopy(t *testing.T) { - state, _ := New(types.EmptyRootHash, NewDatabase(rawdb.NewMemoryDatabase()), nil) + state, _ := New(types.EmptyRootHash, NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) // Create an account and check if the retrieved balance is correct addr := common.HexToAddress("0xaffeaffeaffeaffeaffeaffeaffeaffeaffeaffe") @@ -718,13 +718,13 @@ func TestCommitCopy(t *testing.T) { // first, but the journal wiped the entire state object on create-revert. func TestDeleteCreateRevert(t *testing.T) { // Create an initial state with a single contract - state, _ := New(types.EmptyRootHash, NewDatabase(rawdb.NewMemoryDatabase()), nil) + state, _ := New(types.EmptyRootHash, NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) addr := common.BytesToAddress([]byte("so")) state.SetBalance(addr, big.NewInt(1)) root, _ := state.Commit(0, false) - state, _ = New(root, state.db, state.snaps) + state, _ = New(root, state.db, state.snaps, types.Period0) // Simulate self-destructing in one transaction, then create-reverting in another state.SelfDestruct(addr) @@ -736,7 +736,7 @@ func TestDeleteCreateRevert(t *testing.T) { // Commit the entire state and make sure we don't crash and have the correct state root, _ = state.Commit(0, true) - state, _ = New(root, state.db, state.snaps) + state, _ = New(root, state.db, state.snaps, types.Period0) if state.getStateObject(addr) != nil { t.Fatalf("self-destructed contract came alive") @@ -751,7 +751,7 @@ func TestMissingTrieNodes(t *testing.T) { memDb := rawdb.NewMemoryDatabase() db := NewDatabase(memDb) var root common.Hash - state, err := New(types.EmptyRootHash, db, nil) + state, err := New(types.EmptyRootHash, db, nil, types.Period0) if err != nil { panic("nil stte") } @@ -768,7 +768,7 @@ func TestMissingTrieNodes(t *testing.T) { state.Database().TrieDB().Cap(0) } // Create a new state on the old root - state, _ = New(root, db, nil) + state, _ = New(root, db, nil, types.Period0) // Now we clear out the memdb it := memDb.NewIterator(nil, nil) for it.Next() { @@ -803,7 +803,7 @@ func TestStateDBAccessList(t *testing.T) { memDb := rawdb.NewMemoryDatabase() db := NewDatabase(memDb) - state, _ := New(types.EmptyRootHash, db, nil) + state, _ := New(types.EmptyRootHash, db, nil, types.Period0) state.accessList = newAccessList() verifyAddrs := func(astrings ...string) { @@ -973,7 +973,7 @@ func TestFlushOrderDataLoss(t *testing.T) { var ( memdb = rawdb.NewMemoryDatabase() statedb = NewDatabase(memdb) - state, _ = New(types.EmptyRootHash, statedb, nil) + state, _ = New(types.EmptyRootHash, statedb, nil, types.Period0) ) for a := byte(0); a < 10; a++ { state.CreateAccount(common.Address{a}) @@ -993,7 +993,7 @@ func TestFlushOrderDataLoss(t *testing.T) { t.Fatalf("failed to commit state trie: %v", err) } // Reopen the state trie from flushed disk and verify it - state, err = New(root, NewDatabase(memdb), nil) + state, err = New(root, NewDatabase(memdb), nil, types.Period0) if err != nil { t.Fatalf("failed to reopen state trie: %v", err) } @@ -1009,7 +1009,7 @@ func TestFlushOrderDataLoss(t *testing.T) { func TestStateDBTransientStorage(t *testing.T) { memDb := rawdb.NewMemoryDatabase() db := NewDatabase(memDb) - state, _ := New(types.EmptyRootHash, db, nil) + state, _ := New(types.EmptyRootHash, db, nil, types.Period0) key := common.Hash{0x01} value := common.Hash{0x02} @@ -1046,7 +1046,7 @@ func TestResetObject(t *testing.T) { tdb = trie.NewDatabase(disk) db = NewDatabaseWithNodeDB(disk, tdb) snaps, _ = snapshot.New(snapshot.Config{CacheSize: 10}, disk, tdb, types.EmptyRootHash) - state, _ = New(types.EmptyRootHash, db, snaps) + state, _ = New(types.EmptyRootHash, db, snaps, types.Period0) addr = common.HexToAddress("0x1") slotA = common.HexToHash("0x1") slotB = common.HexToHash("0x2") @@ -1079,7 +1079,7 @@ func TestResetObject(t *testing.T) { func TestCodeChunkOverflow(t *testing.T) { // Create an empty state database db := rawdb.NewMemoryDatabase() - state, _ := New(common.Hash{}, NewDatabaseWithConfig(db, nil), nil) + state, _ := New(common.Hash{}, NewDatabaseWithConfig(db, nil), nil, types.Period0) // Update it with some accounts addr := common.BytesToAddress([]byte{1}) diff --git a/core/state/sync_test.go b/core/state/sync_test.go index db0b23a8e1b4..72c7a5fb8a82 100644 --- a/core/state/sync_test.go +++ b/core/state/sync_test.go @@ -43,7 +43,7 @@ func makeTestState() (ethdb.Database, Database, common.Hash, []*testAccount) { // Create an empty state db := rawdb.NewMemoryDatabase() sdb := NewDatabaseWithConfig(db, &trie.Config{Preimages: true}) - state, _ := New(types.EmptyRootHash, sdb, nil) + state, _ := New(types.EmptyRootHash, sdb, nil, types.Period0) // Fill it with some arbitrary data var accounts []*testAccount @@ -83,7 +83,7 @@ func makeTestState() (ethdb.Database, Database, common.Hash, []*testAccount) { // account array. func checkStateAccounts(t *testing.T, db ethdb.Database, root common.Hash, accounts []*testAccount) { // Check root availability and state contents - state, err := New(root, NewDatabase(db), nil) + state, err := New(root, NewDatabase(db), nil, types.Period0) if err != nil { t.Fatalf("failed to create state trie at %x: %v", root, err) } @@ -105,7 +105,7 @@ func checkStateAccounts(t *testing.T, db ethdb.Database, root common.Hash, accou // checkStateConsistency checks that all data of a state root is present. func checkStateConsistency(db ethdb.Database, root common.Hash) error { - state, err := New(root, NewDatabaseWithConfig(db, &trie.Config{Preimages: true}), nil) + state, err := New(root, NewDatabaseWithConfig(db, &trie.Config{Preimages: true}), nil, types.Period0) if err != nil { return err } diff --git a/core/state/trie_prefetcher.go b/core/state/trie_prefetcher.go index 4521736c7beb..c0acd4f64385 100644 --- a/core/state/trie_prefetcher.go +++ b/core/state/trie_prefetcher.go @@ -289,13 +289,14 @@ func (sf *subfetcher) abort() { // loop waits for new tasks to be scheduled and keeps loading them until it runs // out of tasks or its underlying trie is retrieved for committing. +// TODO(weiihann): how to parse period to prefetcher? func (sf *subfetcher) loop() { // No matter how the loop stops, signal anyone waiting that it's terminated defer close(sf.term) // Start by opening the trie and stop processing if it fails if sf.owner == (common.Hash{}) { - trie, err := sf.db.OpenTrie(sf.root) + trie, err := sf.db.OpenTrie(sf.root, 0) // TODO(weiihann): Verkle currently doesn't support prefetching, ignore period for now if err != nil { log.Warn("Trie prefetcher failed opening trie", "root", sf.root, "err", err) return diff --git a/core/state/trie_prefetcher_test.go b/core/state/trie_prefetcher_test.go index b190567e92bc..640a05f7aeb1 100644 --- a/core/state/trie_prefetcher_test.go +++ b/core/state/trie_prefetcher_test.go @@ -27,7 +27,7 @@ import ( ) func filledStateDB() *StateDB { - state, _ := New(types.EmptyRootHash, NewDatabase(rawdb.NewMemoryDatabase()), nil) + state, _ := New(types.EmptyRootHash, NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) // Create an account and check if the retrieved balance is correct addr := common.HexToAddress("0xaffeaffeaffeaffeaffeaffeaffeaffeaffeaffe") diff --git a/core/state_processor_test.go b/core/state_processor_test.go index 249b691746da..639ff14385a9 100644 --- a/core/state_processor_test.go +++ b/core/state_processor_test.go @@ -611,7 +611,7 @@ func TestProcessVerkle(t *testing.T) { //fmt.Printf("root= %x\n", chain[0].Root()) // check the proof for the 1st block - err = verkle.Verify(proofs[0], genesis.Root().Bytes(), chain[0].Root().Bytes(), keyvals[0]) + err = verkle.Verify(proofs[0], genesis.Root().Bytes(), chain[0].Root().Bytes(), keyvals[0], 0) // TODO(weiihann) if err != nil { spew.Dump(genesis.Root().Bytes(), proofs[0]) t.Fatal(err) diff --git a/core/txpool/blobpool/blobpool.go b/core/txpool/blobpool/blobpool.go index c0dd6e8acc90..6b83c119a538 100644 --- a/core/txpool/blobpool/blobpool.go +++ b/core/txpool/blobpool/blobpool.go @@ -365,7 +365,7 @@ func (p *BlobPool) Init(gasTip *big.Int, head *types.Header, reserve txpool.Addr return err } } - state, err := p.chain.StateAt(head.Root) + state, err := p.chain.StateAt(head.Root, types.GetStatePeriod(p.chain.Config(), head.Time)) if err != nil { return err } @@ -746,7 +746,7 @@ func (p *BlobPool) Reset(oldHead, newHead *types.Header) { resettimeHist.Update(time.Since(start).Nanoseconds()) }(time.Now()) - statedb, err := p.chain.StateAt(newHead.Root) + statedb, err := p.chain.StateAt(newHead.Root, types.GetStatePeriod(p.chain.Config(), newHead.Time)) if err != nil { log.Error("Failed to reset blobpool state", "err", err) return diff --git a/core/txpool/blobpool/blobpool_test.go b/core/txpool/blobpool/blobpool_test.go index 78a5039b5b13..3251f3059789 100644 --- a/core/txpool/blobpool/blobpool_test.go +++ b/core/txpool/blobpool/blobpool_test.go @@ -43,6 +43,7 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-verkle" "github.com/holiman/billy" "github.com/holiman/uint256" ) @@ -158,7 +159,7 @@ func (bt *testBlockChain) GetBlock(hash common.Hash, number uint64) *types.Block return nil } -func (bc *testBlockChain) StateAt(common.Hash) (*state.StateDB, error) { +func (bc *testBlockChain) StateAt(root common.Hash, _ verkle.StatePeriod) (*state.StateDB, error) { return bc.statedb, nil } @@ -506,7 +507,7 @@ func TestOpenDrops(t *testing.T) { store.Close() // Create a blob pool out of the pre-seeded data - statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewDatabase(memorydb.New())), nil) + statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewDatabase(memorydb.New())), nil, types.Period0) statedb.AddBalance(crypto.PubkeyToAddress(gapper.PublicKey), big.NewInt(1000000)) statedb.AddBalance(crypto.PubkeyToAddress(dangler.PublicKey), big.NewInt(1000000)) statedb.AddBalance(crypto.PubkeyToAddress(filler.PublicKey), big.NewInt(1000000)) @@ -631,7 +632,7 @@ func TestOpenIndex(t *testing.T) { store.Close() // Create a blob pool out of the pre-seeded data - statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewDatabase(memorydb.New())), nil) + statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewDatabase(memorydb.New())), nil, types.Period0) statedb.AddBalance(addr, big.NewInt(1_000_000_000)) statedb.Commit(0, true) @@ -731,7 +732,7 @@ func TestOpenHeap(t *testing.T) { store.Close() // Create a blob pool out of the pre-seeded data - statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewDatabase(memorydb.New())), nil) + statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewDatabase(memorydb.New())), nil, types.Period0) statedb.AddBalance(addr1, big.NewInt(1_000_000_000)) statedb.AddBalance(addr2, big.NewInt(1_000_000_000)) statedb.AddBalance(addr3, big.NewInt(1_000_000_000)) @@ -811,7 +812,7 @@ func TestOpenCap(t *testing.T) { // with a high cap to ensure everything was persisted previously for _, datacap := range []uint64{2 * (txAvgSize + blobSize), 100 * (txAvgSize + blobSize)} { // Create a blob pool out of the pre-seeded data, but cap it to 2 blob transaction - statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewDatabase(memorydb.New())), nil) + statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewDatabase(memorydb.New())), nil, types.Period0) statedb.AddBalance(addr1, big.NewInt(1_000_000_000)) statedb.AddBalance(addr2, big.NewInt(1_000_000_000)) statedb.AddBalance(addr3, big.NewInt(1_000_000_000)) @@ -1198,7 +1199,7 @@ func TestAdd(t *testing.T) { keys = make(map[string]*ecdsa.PrivateKey) addrs = make(map[string]common.Address) ) - statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewDatabase(memorydb.New())), nil) + statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewDatabase(memorydb.New())), nil, types.Period0) for acc, seed := range tt.seeds { // Generate a new random key/address for the seed account keys[acc], _ = crypto.GenerateKey() diff --git a/core/txpool/blobpool/interface.go b/core/txpool/blobpool/interface.go index 6f296a54bd63..25d4ff61577c 100644 --- a/core/txpool/blobpool/interface.go +++ b/core/txpool/blobpool/interface.go @@ -21,6 +21,7 @@ import ( "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-verkle" ) // BlockChain defines the minimal set of methods needed to back a blob pool with @@ -40,5 +41,5 @@ type BlockChain interface { GetBlock(hash common.Hash, number uint64) *types.Block // StateAt returns a state database for a given root hash (generally the head). - StateAt(root common.Hash) (*state.StateDB, error) + StateAt(root common.Hash, curPeriod verkle.StatePeriod) (*state.StateDB, error) } diff --git a/core/txpool/legacypool/legacypool.go b/core/txpool/legacypool/legacypool.go index b1ae8bac8140..e16edabfcea2 100644 --- a/core/txpool/legacypool/legacypool.go +++ b/core/txpool/legacypool/legacypool.go @@ -37,6 +37,7 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/metrics" "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-verkle" ) const ( @@ -119,7 +120,7 @@ type BlockChain interface { GetBlock(hash common.Hash, number uint64) *types.Block // StateAt returns a state database for a given root hash (generally the head). - StateAt(root common.Hash) (*state.StateDB, error) + StateAt(root common.Hash, curPeriod verkle.StatePeriod) (*state.StateDB, error) } // Config are the configuration parameters of the transaction pool. @@ -1400,7 +1401,7 @@ func (pool *LegacyPool) reset(oldHead, newHead *types.Header) { if newHead == nil { newHead = pool.chain.CurrentBlock() // Special case during testing } - statedb, err := pool.chain.StateAt(newHead.Root) + statedb, err := pool.chain.StateAt(newHead.Root, types.GetStatePeriod(pool.chain.Config(), newHead.Time)) if err != nil { log.Error("Failed to reset txpool state", "err", err) return diff --git a/core/txpool/legacypool/legacypool2_test.go b/core/txpool/legacypool/legacypool2_test.go index a73c1bb8a772..137d08f42a58 100644 --- a/core/txpool/legacypool/legacypool2_test.go +++ b/core/txpool/legacypool/legacypool2_test.go @@ -78,7 +78,7 @@ func TestTransactionFutureAttack(t *testing.T) { t.Parallel() // Create the pool to test the limit enforcement with - statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) + statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) blockchain := newTestBlockChain(eip1559Config, 1000000, statedb, new(event.Feed)) config := testTxPoolConfig config.GlobalQueue = 100 @@ -115,7 +115,7 @@ func TestTransactionFutureAttack(t *testing.T) { func TestTransactionFuture1559(t *testing.T) { t.Parallel() // Create the pool to test the pricing enforcement with - statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) + statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) blockchain := newTestBlockChain(eip1559Config, 1000000, statedb, new(event.Feed)) pool := New(testTxPoolConfig, blockchain) pool.Init(new(big.Int).SetUint64(testTxPoolConfig.PriceLimit), blockchain.CurrentBlock(), makeAddressReserver()) @@ -148,7 +148,7 @@ func TestTransactionFuture1559(t *testing.T) { func TestTransactionZAttack(t *testing.T) { t.Parallel() // Create the pool to test the pricing enforcement with - statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) + statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) blockchain := newTestBlockChain(eip1559Config, 1000000, statedb, new(event.Feed)) pool := New(testTxPoolConfig, blockchain) pool.Init(new(big.Int).SetUint64(testTxPoolConfig.PriceLimit), blockchain.CurrentBlock(), makeAddressReserver()) @@ -216,7 +216,7 @@ func TestTransactionZAttack(t *testing.T) { func BenchmarkFutureAttack(b *testing.B) { // Create the pool to test the limit enforcement with - statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) + statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) blockchain := newTestBlockChain(eip1559Config, 1000000, statedb, new(event.Feed)) config := testTxPoolConfig config.GlobalQueue = 100 diff --git a/core/txpool/legacypool/legacypool_test.go b/core/txpool/legacypool/legacypool_test.go index a8f3dd7d8624..e4158fa37ece 100644 --- a/core/txpool/legacypool/legacypool_test.go +++ b/core/txpool/legacypool/legacypool_test.go @@ -39,6 +39,7 @@ import ( "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/trie" + "github.com/ethereum/go-verkle" ) var ( @@ -88,7 +89,7 @@ func (bc *testBlockChain) GetBlock(hash common.Hash, number uint64) *types.Block return types.NewBlock(bc.CurrentBlock(), nil, nil, nil, trie.NewStackTrie(nil)) } -func (bc *testBlockChain) StateAt(common.Hash) (*state.StateDB, error) { +func (bc *testBlockChain) StateAt(common.Hash, verkle.StatePeriod) (*state.StateDB, error) { return bc.statedb, nil } @@ -158,7 +159,7 @@ func setupPool() (*LegacyPool, *ecdsa.PrivateKey) { } func setupPoolWithConfig(config *params.ChainConfig) (*LegacyPool, *ecdsa.PrivateKey) { - statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) + statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) blockchain := newTestBlockChain(config, 10000000, statedb, new(event.Feed)) key, _ := crypto.GenerateKey() @@ -252,7 +253,7 @@ func (c *testChain) State() (*state.StateDB, error) { // a state change between those fetches. stdb := c.statedb if *c.trigger { - c.statedb, _ = state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) + c.statedb, _ = state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) // simulate that the new head block included tx0 and tx1 c.statedb.SetNonce(c.address, 2) c.statedb.SetBalance(c.address, new(big.Int).SetUint64(params.Ether)) @@ -270,7 +271,7 @@ func TestStateChangeDuringReset(t *testing.T) { var ( key, _ = crypto.GenerateKey() address = crypto.PubkeyToAddress(key.PublicKey) - statedb, _ = state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) + statedb, _ = state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) trigger = false ) @@ -469,7 +470,7 @@ func TestChainFork(t *testing.T) { addr := crypto.PubkeyToAddress(key.PublicKey) resetState := func() { - statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) + statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) statedb.AddBalance(addr, big.NewInt(100000000000000)) pool.chain = newTestBlockChain(pool.chainconfig, 1000000, statedb, new(event.Feed)) @@ -498,7 +499,7 @@ func TestDoubleNonce(t *testing.T) { addr := crypto.PubkeyToAddress(key.PublicKey) resetState := func() { - statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) + statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) statedb.AddBalance(addr, big.NewInt(100000000000000)) pool.chain = newTestBlockChain(pool.chainconfig, 1000000, statedb, new(event.Feed)) @@ -698,7 +699,7 @@ func TestPostponing(t *testing.T) { t.Parallel() // Create the pool to test the postponing with - statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) + statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) blockchain := newTestBlockChain(params.TestChainConfig, 1000000, statedb, new(event.Feed)) pool := New(testTxPoolConfig, blockchain) @@ -911,7 +912,7 @@ func testQueueGlobalLimiting(t *testing.T, nolocals bool) { t.Parallel() // Create the pool to test the limit enforcement with - statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) + statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) blockchain := newTestBlockChain(params.TestChainConfig, 1000000, statedb, new(event.Feed)) config := testTxPoolConfig @@ -1004,7 +1005,7 @@ func testQueueTimeLimiting(t *testing.T, nolocals bool) { evictionInterval = time.Millisecond * 100 // Create the pool to test the non-expiration enforcement - statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) + statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) blockchain := newTestBlockChain(params.TestChainConfig, 1000000, statedb, new(event.Feed)) config := testTxPoolConfig @@ -1190,7 +1191,7 @@ func TestPendingGlobalLimiting(t *testing.T) { t.Parallel() // Create the pool to test the limit enforcement with - statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) + statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) blockchain := newTestBlockChain(params.TestChainConfig, 1000000, statedb, new(event.Feed)) config := testTxPoolConfig @@ -1292,7 +1293,7 @@ func TestCapClearsFromAll(t *testing.T) { t.Parallel() // Create the pool to test the limit enforcement with - statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) + statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) blockchain := newTestBlockChain(params.TestChainConfig, 1000000, statedb, new(event.Feed)) config := testTxPoolConfig @@ -1327,7 +1328,7 @@ func TestPendingMinimumAllowance(t *testing.T) { t.Parallel() // Create the pool to test the limit enforcement with - statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) + statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) blockchain := newTestBlockChain(params.TestChainConfig, 1000000, statedb, new(event.Feed)) config := testTxPoolConfig @@ -1376,7 +1377,7 @@ func TestRepricing(t *testing.T) { t.Parallel() // Create the pool to test the pricing enforcement with - statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) + statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) blockchain := newTestBlockChain(params.TestChainConfig, 1000000, statedb, new(event.Feed)) pool := New(testTxPoolConfig, blockchain) @@ -1625,7 +1626,7 @@ func TestRepricingKeepsLocals(t *testing.T) { t.Parallel() // Create the pool to test the pricing enforcement with - statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) + statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) blockchain := newTestBlockChain(eip1559Config, 1000000, statedb, new(event.Feed)) pool := New(testTxPoolConfig, blockchain) @@ -1699,7 +1700,7 @@ func TestUnderpricing(t *testing.T) { t.Parallel() // Create the pool to test the pricing enforcement with - statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) + statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) blockchain := newTestBlockChain(params.TestChainConfig, 1000000, statedb, new(event.Feed)) config := testTxPoolConfig @@ -1814,7 +1815,7 @@ func TestStableUnderpricing(t *testing.T) { t.Parallel() // Create the pool to test the pricing enforcement with - statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) + statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) blockchain := newTestBlockChain(params.TestChainConfig, 1000000, statedb, new(event.Feed)) config := testTxPoolConfig @@ -2047,7 +2048,7 @@ func TestDeduplication(t *testing.T) { t.Parallel() // Create the pool to test the pricing enforcement with - statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) + statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) blockchain := newTestBlockChain(params.TestChainConfig, 1000000, statedb, new(event.Feed)) pool := New(testTxPoolConfig, blockchain) @@ -2114,7 +2115,7 @@ func TestReplacement(t *testing.T) { t.Parallel() // Create the pool to test the pricing enforcement with - statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) + statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) blockchain := newTestBlockChain(params.TestChainConfig, 1000000, statedb, new(event.Feed)) pool := New(testTxPoolConfig, blockchain) @@ -2320,7 +2321,7 @@ func testJournaling(t *testing.T, nolocals bool) { os.Remove(journal) // Create the original pool to inject transaction into the journal - statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) + statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) blockchain := newTestBlockChain(params.TestChainConfig, 1000000, statedb, new(event.Feed)) config := testTxPoolConfig @@ -2421,7 +2422,7 @@ func TestStatusCheck(t *testing.T) { t.Parallel() // Create the pool to test the status retrievals with - statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) + statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) blockchain := newTestBlockChain(params.TestChainConfig, 1000000, statedb, new(event.Feed)) pool := New(testTxPoolConfig, blockchain) diff --git a/core/vm/gas_table_test.go b/core/vm/gas_table_test.go index 4a5259a262a6..d61198bfeabf 100644 --- a/core/vm/gas_table_test.go +++ b/core/vm/gas_table_test.go @@ -84,7 +84,7 @@ func TestEIP2200(t *testing.T) { for i, tt := range eip2200Tests { address := common.BytesToAddress([]byte("contract")) - statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) + statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) statedb.CreateAccount(address) statedb.SetCode(address, hexutil.MustDecode(tt.input)) statedb.SetState(address, common.Hash{}, common.BytesToHash([]byte{tt.original})) @@ -136,7 +136,7 @@ func TestCreateGas(t *testing.T) { var gasUsed = uint64(0) doCheck := func(testGas int) bool { address := common.BytesToAddress([]byte("contract")) - statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) + statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) statedb.CreateAccount(address) statedb.SetCode(address, hexutil.MustDecode(tt.code)) statedb.Finalise(true) diff --git a/core/vm/instructions_test.go b/core/vm/instructions_test.go index 807073336d6d..bbc9731a386d 100644 --- a/core/vm/instructions_test.go +++ b/core/vm/instructions_test.go @@ -582,7 +582,7 @@ func BenchmarkOpMstore(bench *testing.B) { func TestOpTstore(t *testing.T) { var ( - statedb, _ = state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) + statedb, _ = state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) env = NewEVM(BlockContext{}, TxContext{}, statedb, params.TestChainConfig, Config{}) stack = newstack() mem = NewMemory() diff --git a/core/vm/interpreter_test.go b/core/vm/interpreter_test.go index 96e681fccd4b..cc94c9f6911b 100644 --- a/core/vm/interpreter_test.go +++ b/core/vm/interpreter_test.go @@ -43,7 +43,7 @@ func TestLoopInterrupt(t *testing.T) { } for i, tt := range loopInterruptTests { - statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) + statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) statedb.CreateAccount(address) statedb.SetCode(address, common.Hex2Bytes(tt)) statedb.Finalise(true) diff --git a/core/vm/runtime/runtime.go b/core/vm/runtime/runtime.go index a3e75c67212c..13cfb1748ad2 100644 --- a/core/vm/runtime/runtime.go +++ b/core/vm/runtime/runtime.go @@ -108,7 +108,7 @@ func Execute(code, input []byte, cfg *Config) ([]byte, *state.StateDB, error) { setDefaults(cfg) if cfg.State == nil { - cfg.State, _ = state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) + cfg.State, _ = state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) } var ( address = common.BytesToAddress([]byte("contract")) @@ -142,7 +142,7 @@ func Create(input []byte, cfg *Config) ([]byte, common.Address, uint64, error) { setDefaults(cfg) if cfg.State == nil { - cfg.State, _ = state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) + cfg.State, _ = state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) } var ( vmenv = NewEnv(cfg) diff --git a/core/vm/runtime/runtime_test.go b/core/vm/runtime/runtime_test.go index 7b521a2ead59..6713dbfdb171 100644 --- a/core/vm/runtime/runtime_test.go +++ b/core/vm/runtime/runtime_test.go @@ -103,7 +103,7 @@ func TestExecute(t *testing.T) { } func TestCall(t *testing.T) { - state, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) + state, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) address := common.HexToAddress("0x0a") state.SetCode(address, []byte{ byte(vm.PUSH1), 10, @@ -159,7 +159,7 @@ func BenchmarkCall(b *testing.B) { } func benchmarkEVM_Create(bench *testing.B, code string) { var ( - statedb, _ = state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) + statedb, _ = state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) sender = common.BytesToAddress([]byte("sender")) receiver = common.BytesToAddress([]byte("receiver")) ) @@ -327,7 +327,7 @@ func TestBlockhash(t *testing.T) { func benchmarkNonModifyingCode(gas uint64, code []byte, name string, tracerCode string, b *testing.B) { cfg := new(Config) setDefaults(cfg) - cfg.State, _ = state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) + cfg.State, _ = state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) cfg.GasLimit = gas if len(tracerCode) > 0 { tracer, err := tracers.DefaultDirectory.New(tracerCode, new(tracers.Context), nil) @@ -818,7 +818,7 @@ func TestRuntimeJSTracer(t *testing.T) { main := common.HexToAddress("0xaa") for i, jsTracer := range jsTracers { for j, tc := range tests { - statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) + statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) statedb.SetCode(main, tc.code) statedb.SetCode(common.HexToAddress("0xbb"), calleeCode) statedb.SetCode(common.HexToAddress("0xcc"), calleeCode) @@ -860,7 +860,7 @@ func TestJSTracerCreateTx(t *testing.T) { exit: function(res) { this.exits++ }}` code := []byte{byte(vm.PUSH1), 0, byte(vm.PUSH1), 0, byte(vm.RETURN)} - statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) + statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) tracer, err := tracers.DefaultDirectory.New(jsTracer, new(tracers.Context), nil) if err != nil { t.Fatal(err) diff --git a/eth/api_backend.go b/eth/api_backend.go index 30e249368410..5de2f3c63805 100644 --- a/eth/api_backend.go +++ b/eth/api_backend.go @@ -215,7 +215,7 @@ func (b *EthAPIBackend) StateAndHeaderByNumber(ctx context.Context, number rpc.B if header == nil { return nil, nil, errors.New("header not found") } - stateDb, err := b.eth.BlockChain().StateAt(header.Root) + stateDb, err := b.eth.BlockChain().StateAt(header.Root, types.GetStatePeriod(b.eth.blockchain.Config(), header.Time)) return stateDb, header, err } @@ -234,7 +234,7 @@ func (b *EthAPIBackend) StateAndHeaderByNumberOrHash(ctx context.Context, blockN if blockNrOrHash.RequireCanonical && b.eth.blockchain.GetCanonicalHash(header.Number.Uint64()) != hash { return nil, nil, errors.New("hash is not currently canonical") } - stateDb, err := b.eth.BlockChain().StateAt(header.Root) + stateDb, err := b.eth.BlockChain().StateAt(header.Root, types.GetStatePeriod(b.eth.blockchain.Config(), header.Time)) return stateDb, header, err } return nil, nil, errors.New("invalid arguments; neither block nor hash specified") diff --git a/eth/api_debug.go b/eth/api_debug.go index 3e0daac1b5b0..88c5c0fc2e00 100644 --- a/eth/api_debug.go +++ b/eth/api_debug.go @@ -81,7 +81,7 @@ func (api *DebugAPI) DumpBlock(blockNr rpc.BlockNumber) (state.Dump, error) { if header == nil { return state.Dump{}, fmt.Errorf("block #%d not found", blockNr) } - stateDb, err := api.eth.BlockChain().StateAt(header.Root) + stateDb, err := api.eth.BlockChain().StateAt(header.Root, types.GetStatePeriod(api.eth.blockchain.Config(), header.Time)) if err != nil { return state.Dump{}, err } @@ -166,7 +166,7 @@ func (api *DebugAPI) AccountRange(blockNrOrHash rpc.BlockNumberOrHash, start hex if header == nil { return state.IteratorDump{}, fmt.Errorf("block #%d not found", number) } - stateDb, err = api.eth.BlockChain().StateAt(header.Root) + stateDb, err = api.eth.BlockChain().StateAt(header.Root, types.GetStatePeriod(api.eth.blockchain.Config(), header.Time)) if err != nil { return state.IteratorDump{}, err } @@ -176,7 +176,7 @@ func (api *DebugAPI) AccountRange(blockNrOrHash rpc.BlockNumberOrHash, start hex if block == nil { return state.IteratorDump{}, fmt.Errorf("block %s not found", hash.Hex()) } - stateDb, err = api.eth.BlockChain().StateAt(block.Root()) + stateDb, err = api.eth.BlockChain().StateAt(block.Root(), types.GetStatePeriod(api.eth.blockchain.Config(), block.Time())) if err != nil { return state.IteratorDump{}, err } diff --git a/eth/api_debug_test.go b/eth/api_debug_test.go index 4b08bd4fc57d..a6b1e8e132b1 100644 --- a/eth/api_debug_test.go +++ b/eth/api_debug_test.go @@ -63,7 +63,7 @@ func TestAccountRange(t *testing.T) { var ( statedb = state.NewDatabaseWithConfig(rawdb.NewMemoryDatabase(), &trie.Config{Preimages: true}) - sdb, _ = state.New(types.EmptyRootHash, statedb, nil) + sdb, _ = state.New(types.EmptyRootHash, statedb, nil, types.Period0) addrs = [AccountRangeMaxResults * 2]common.Address{} m = map[common.Address]bool{} ) @@ -80,9 +80,9 @@ func TestAccountRange(t *testing.T) { } } root, _ := sdb.Commit(0, true) - sdb, _ = state.New(root, statedb, nil) + sdb, _ = state.New(root, statedb, nil, types.Period0) - trie, err := statedb.OpenTrie(root) + trie, err := statedb.OpenTrie(root, types.Period0) if err != nil { t.Fatal(err) } @@ -134,11 +134,11 @@ func TestEmptyAccountRange(t *testing.T) { var ( statedb = state.NewDatabase(rawdb.NewMemoryDatabase()) - st, _ = state.New(types.EmptyRootHash, statedb, nil) + st, _ = state.New(types.EmptyRootHash, statedb, nil, types.Period0) ) // Commit(although nothing to flush) and re-init the statedb st.Commit(0, true) - st, _ = state.New(types.EmptyRootHash, statedb, nil) + st, _ = state.New(types.EmptyRootHash, statedb, nil, types.Period0) results := st.IteratorDump(&state.DumpConfig{ SkipCode: true, @@ -159,7 +159,7 @@ func TestStorageRangeAt(t *testing.T) { // Create a state where account 0x010000... has a few storage entries. var ( - state, _ = state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) + state, _ = state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewMemoryDatabase()), nil, types.Period0) addr = common.Address{0x01} keys = []common.Hash{ // hashes of Keys of storage common.HexToHash("340dd630ad21bf010b4e676dbfa9ba9a02175262d1fa356232cfde6cb5b47ef2"), diff --git a/eth/catalyst/api_test.go b/eth/catalyst/api_test.go index 05ad3def48ae..02bf74d59b12 100644 --- a/eth/catalyst/api_test.go +++ b/eth/catalyst/api_test.go @@ -312,7 +312,7 @@ func TestEth2NewBlock(t *testing.T) { ethservice.BlockChain().SubscribeRemovedLogsEvent(rmLogsCh) for i := 0; i < 10; i++ { - statedb, _ := ethservice.BlockChain().StateAt(parent.Root()) + statedb, _ := ethservice.BlockChain().StateAt(parent.Root(), types.Period0) nonce := statedb.GetNonce(testAddr) tx, _ := types.SignTx(types.NewContractCreation(nonce, new(big.Int), 1000000, big.NewInt(2*params.InitialBaseFee), logCode), types.LatestSigner(ethservice.BlockChain().Config()), testKey) ethservice.TxPool().Add([]*txpool.Transaction{{Tx: tx}}, true, false) @@ -481,7 +481,7 @@ func TestFullAPI(t *testing.T) { ) callback := func(parent *types.Header) { - statedb, _ := ethservice.BlockChain().StateAt(parent.Root) + statedb, _ := ethservice.BlockChain().StateAt(parent.Root, types.Period0) nonce := statedb.GetNonce(testAddr) tx, _ := types.SignTx(types.NewContractCreation(nonce, new(big.Int), 1000000, big.NewInt(2*params.InitialBaseFee), logCode), types.LatestSigner(ethservice.BlockChain().Config()), testKey) ethservice.TxPool().Add([]*txpool.Transaction{{Tx: tx}}, true, false) @@ -602,7 +602,7 @@ func TestNewPayloadOnInvalidChain(t *testing.T) { logCode = common.Hex2Bytes("60606040525b7f24ec1d3ff24c2f6ff210738839dbc339cd45a5294d85c79361016243157aae7b60405180905060405180910390a15b600a8060416000396000f360606040526008565b00") ) for i := 0; i < 10; i++ { - statedb, _ := ethservice.BlockChain().StateAt(parent.Root) + statedb, _ := ethservice.BlockChain().StateAt(parent.Root, types.Period0) tx := types.MustSignNewTx(testKey, signer, &types.LegacyTx{ Nonce: statedb.GetNonce(testAddr), Value: new(big.Int), @@ -1281,7 +1281,7 @@ func setupBodies(t *testing.T) (*node.Node, *eth.Ethereum, []*types.Block) { ) callback := func(parent *types.Header) { - statedb, _ := ethservice.BlockChain().StateAt(parent.Root) + statedb, _ := ethservice.BlockChain().StateAt(parent.Root, types.Period0) nonce := statedb.GetNonce(testAddr) tx, _ := types.SignTx(types.NewContractCreation(nonce, new(big.Int), 1000000, big.NewInt(2*params.InitialBaseFee), logCode), types.LatestSigner(ethservice.BlockChain().Config()), testKey) ethservice.TxPool().Add([]*txpool.Transaction{{Tx: tx}}, true, false) diff --git a/eth/protocols/eth/handler_test.go b/eth/protocols/eth/handler_test.go index 3f1dc9fe76e6..0309d244ebdf 100644 --- a/eth/protocols/eth/handler_test.go +++ b/eth/protocols/eth/handler_test.go @@ -535,9 +535,9 @@ func testGetNodeData(t *testing.T, protocol uint, drop bool) { accounts := []common.Address{testAddr, acc1Addr, acc2Addr} for i := uint64(0); i <= backend.chain.CurrentBlock().Number.Uint64(); i++ { root := backend.chain.GetBlockByNumber(i).Root() - reconstructed, _ := state.New(root, state.NewDatabase(reconstructDB), nil) + reconstructed, _ := state.New(root, state.NewDatabase(reconstructDB), nil, types.Period0) for j, acc := range accounts { - state, _ := backend.chain.StateAt(root) + state, _ := backend.chain.StateAt(root, types.Period0) bw := state.GetBalance(acc) bh := reconstructed.GetBalance(acc) diff --git a/eth/state_accessor.go b/eth/state_accessor.go index a725585e7120..e61119264f1e 100644 --- a/eth/state_accessor.go +++ b/eth/state_accessor.go @@ -63,6 +63,7 @@ func (eth *Ethereum) StateAtBlock(ctx context.Context, block *types.Block, reexe database state.Database report = true origin = block.NumberU64() + curPeriod = types.GetStatePeriod(eth.blockchain.Config(), block.Time()) ) // The state is only for reading purposes, check the state presence in // live database. @@ -70,7 +71,7 @@ func (eth *Ethereum) StateAtBlock(ctx context.Context, block *types.Block, reexe // The state is available in live database, create a reference // on top to prevent garbage collection and return a release // function to deref it. - if statedb, err = eth.blockchain.StateAt(block.Root()); err == nil { + if statedb, err = eth.blockchain.StateAt(block.Root(), curPeriod); err == nil { statedb.Database().TrieDB().Reference(block.Root(), common.Hash{}) return statedb, func() { statedb.Database().TrieDB().Dereference(block.Root()) @@ -85,7 +86,7 @@ func (eth *Ethereum) StateAtBlock(ctx context.Context, block *types.Block, reexe // Create an ephemeral trie.Database for isolating the live one. Otherwise // the internal junks created by tracing will be persisted into the disk. database = state.NewDatabaseWithConfig(eth.chainDb, &trie.Config{Cache: 16}) - if statedb, err = state.New(block.Root(), database, nil); err == nil { + if statedb, err = state.New(block.Root(), database, nil, curPeriod); err == nil { log.Info("Found disk backend for state trie", "root", block.Root(), "number", block.Number()) return statedb, noopReleaser, nil } @@ -105,7 +106,7 @@ func (eth *Ethereum) StateAtBlock(ctx context.Context, block *types.Block, reexe // otherwise we would rewind past a persisted block (specific corner case is // chain tracing from the genesis). if !readOnly { - statedb, err = state.New(current.Root(), database, nil) + statedb, err = state.New(current.Root(), database, nil, curPeriod) if err == nil { return statedb, noopReleaser, nil } @@ -124,7 +125,7 @@ func (eth *Ethereum) StateAtBlock(ctx context.Context, block *types.Block, reexe } current = parent - statedb, err = state.New(current.Root(), database, nil) + statedb, err = state.New(current.Root(), database, nil, curPeriod) if err == nil { break } @@ -169,7 +170,7 @@ func (eth *Ethereum) StateAtBlock(ctx context.Context, block *types.Block, reexe return nil, nil, fmt.Errorf("stateAtBlock commit failed, number %d root %v: %w", current.NumberU64(), current.Root().Hex(), err) } - statedb, err = state.New(root, database, nil) + statedb, err = state.New(root, database, nil, curPeriod) if err != nil { return nil, nil, fmt.Errorf("state reset after block %d failed: %v", current.NumberU64(), err) } diff --git a/eth/tracers/api.go b/eth/tracers/api.go index 1b650bc9f1ee..9f3c3879986b 100644 --- a/eth/tracers/api.go +++ b/eth/tracers/api.go @@ -1020,6 +1020,10 @@ func overrideConfig(original *params.ChainConfig, override *params.ChainConfig) copy.VerkleTime = timestamp canon = false } + if timestamp := override.StateExpiryTime; timestamp != nil { + copy.StateExpiryTime = timestamp + canon = false + } return copy, canon } diff --git a/eth/tracers/api_test.go b/eth/tracers/api_test.go index 11d7ff4b694e..8247bbb566e7 100644 --- a/eth/tracers/api_test.go +++ b/eth/tracers/api_test.go @@ -140,7 +140,7 @@ func (b *testBackend) teardown() { } 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()) + statedb, err := b.chain.StateAt(block.Root(), 0) if err != nil { return nil, nil, errStateNotFound } diff --git a/internal/ethapi/api_test.go b/internal/ethapi/api_test.go index 4d8c7e07074b..250b7632721a 100644 --- a/internal/ethapi/api_test.go +++ b/internal/ethapi/api_test.go @@ -312,7 +312,7 @@ func (b testBackend) StateAndHeaderByNumber(ctx context.Context, number rpc.Bloc if header == nil { return nil, nil, errors.New("header not found") } - stateDb, err := b.chain.StateAt(header.Root) + stateDb, err := b.chain.StateAt(header.Root, types.Period0) return stateDb, header, err } func (b testBackend) StateAndHeaderByNumberOrHash(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash) (*state.StateDB, *types.Header, error) { diff --git a/les/server_requests.go b/les/server_requests.go index 6f3e5e0f0335..a106f7215b98 100644 --- a/les/server_requests.go +++ b/les/server_requests.go @@ -416,7 +416,7 @@ func handleGetProofs(msg Decoder) (serveRequestFn, uint64, uint64, error) { switch len(request.AccountAddress) { case 0: // No account key specified, open an account trie - trie, err = statedb.OpenTrie(root) + trie, err = statedb.OpenTrie(root, types.Period0) if trie == nil || err != nil { p.Log().Warn("Failed to open storage trie for proof", "block", header.Number, "hash", header.Hash(), "root", root, "err", err) continue diff --git a/light/odr_test.go b/light/odr_test.go index ffe4031ce944..9e83a2327ebd 100644 --- a/light/odr_test.go +++ b/light/odr_test.go @@ -89,7 +89,7 @@ func (odr *testOdr) Retrieve(ctx context.Context, req OdrRequest) error { if len(req.Id.AccountAddress) > 0 { t, err = odr.serverState.OpenStorageTrie(req.Id.StateRoot, common.BytesToAddress(req.Id.AccountAddress), req.Id.Root, nil) } else { - t, err = odr.serverState.OpenTrie(req.Id.Root) + t, err = odr.serverState.OpenTrie(req.Id.Root, types.Period0) } if err != nil { panic(err) @@ -161,7 +161,7 @@ func odrAccounts(ctx context.Context, db ethdb.Database, bc *core.BlockChain, lc st = NewState(ctx, header, lc.Odr()) } else { header := bc.GetHeaderByHash(bhash) - st, _ = state.New(header.Root, bc.StateCache(), nil) + st, _ = state.New(header.Root, bc.StateCache(), nil, types.Period0) } var res []byte @@ -195,7 +195,7 @@ func odrContractCall(ctx context.Context, db ethdb.Database, bc *core.BlockChain } else { chain = bc header = bc.GetHeaderByHash(bhash) - st, _ = state.New(header.Root, bc.StateCache(), nil) + st, _ = state.New(header.Root, bc.StateCache(), nil, types.Period0) } // Perform read-only call. diff --git a/light/trie.go b/light/trie.go index fd7e4e472f21..3659137aeba2 100644 --- a/light/trie.go +++ b/light/trie.go @@ -31,6 +31,7 @@ import ( "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/trie" "github.com/ethereum/go-ethereum/trie/trienode" + "github.com/ethereum/go-verkle" ) var ( @@ -38,7 +39,7 @@ var ( ) func NewState(ctx context.Context, head *types.Header, odr OdrBackend) *state.StateDB { - state, _ := state.New(head.Root, NewStateDatabase(ctx, head, odr), nil) + state, _ := state.New(head.Root, NewStateDatabase(ctx, head, odr), nil, types.Period0) return state } @@ -52,7 +53,7 @@ type odrDatabase struct { backend OdrBackend } -func (db *odrDatabase) OpenTrie(root common.Hash) (state.Trie, error) { +func (db *odrDatabase) OpenTrie(root common.Hash, _ verkle.StatePeriod) (state.Trie, error) { return &odrTrie{db: db, id: db.id}, nil } diff --git a/light/trie_test.go b/light/trie_test.go index ad7d769c84a4..cf2056bb828b 100644 --- a/light/trie_test.go +++ b/light/trie_test.go @@ -54,8 +54,8 @@ func TestNodeIterator(t *testing.T) { ctx := context.Background() odr := &testOdr{sdb: fulldb, ldb: lightdb, serverState: blockchain.StateCache(), indexerConfig: TestClientIndexerConfig} head := blockchain.CurrentHeader() - lightTrie, _ := NewStateDatabase(ctx, head, odr).OpenTrie(head.Root) - fullTrie, _ := blockchain.StateCache().OpenTrie(head.Root) + lightTrie, _ := NewStateDatabase(ctx, head, odr).OpenTrie(head.Root, 0) + fullTrie, _ := blockchain.StateCache().OpenTrie(head.Root, 0) if err := diffTries(fullTrie, lightTrie); err != nil { t.Fatal(err) } diff --git a/miner/miner_test.go b/miner/miner_test.go index 21db1ce4a9e6..23e8c3393800 100644 --- a/miner/miner_test.go +++ b/miner/miner_test.go @@ -37,6 +37,7 @@ import ( "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/trie" + "github.com/ethereum/go-verkle" ) type mockBackend struct { @@ -85,7 +86,7 @@ func (bc *testBlockChain) GetBlock(hash common.Hash, number uint64) *types.Block return types.NewBlock(bc.CurrentBlock(), nil, nil, nil, trie.NewStackTrie(nil)) } -func (bc *testBlockChain) StateAt(common.Hash) (*state.StateDB, error) { +func (bc *testBlockChain) StateAt(common.Hash, verkle.StatePeriod) (*state.StateDB, error) { return bc.statedb, nil } @@ -300,7 +301,7 @@ func createMiner(t *testing.T) (*Miner, *event.TypeMux, func(skipMiner bool)) { if err != nil { t.Fatalf("can't create new chain %v", err) } - statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(chainDB), nil) + statedb, _ := state.New(types.EmptyRootHash, state.NewDatabase(chainDB), nil, types.Period0) blockchain := &testBlockChain{chainConfig, statedb, 10000000, new(event.Feed)} pool := legacypool.New(testTxPoolConfig, blockchain) diff --git a/miner/worker.go b/miner/worker.go index 39980f245b9b..7317a6bbd137 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -900,7 +900,7 @@ func (w *worker) prepareWork(genParams *generateParams) (*environment, error) { // Retrieve the parent state to execute on top and start a prefetcher for // the miner to speed block sealing up a bit. - state, err := w.chain.StateAt(parent.Root) + state, err := w.chain.StateAt(parent.Root, types.Period0) if err != nil { return nil, err } diff --git a/params/config.go b/params/config.go index d702304d4597..c8d7e268f8c1 100644 --- a/params/config.go +++ b/params/config.go @@ -128,6 +128,7 @@ var ( ShanghaiTime: nil, CancunTime: nil, VerkleTime: nil, + StateExpiryTime: nil, TerminalTotalDifficulty: nil, TerminalTotalDifficultyPassed: true, Ethash: new(EthashConfig), @@ -178,6 +179,7 @@ var ( ShanghaiTime: nil, CancunTime: nil, VerkleTime: nil, + StateExpiryTime: nil, TerminalTotalDifficulty: nil, TerminalTotalDifficultyPassed: false, Ethash: nil, @@ -207,6 +209,7 @@ var ( ShanghaiTime: nil, CancunTime: nil, VerkleTime: nil, + StateExpiryTime: nil, TerminalTotalDifficulty: nil, TerminalTotalDifficultyPassed: false, Ethash: new(EthashConfig), @@ -236,6 +239,7 @@ var ( ShanghaiTime: nil, CancunTime: nil, VerkleTime: nil, + StateExpiryTime: nil, TerminalTotalDifficulty: nil, TerminalTotalDifficultyPassed: false, Ethash: new(EthashConfig), @@ -285,6 +289,7 @@ type ChainConfig struct { ShanghaiTime *uint64 `json:"shanghaiTime,omitempty"` // Shanghai switch time (nil = no fork, 0 = already on shanghai) CancunTime *uint64 `json:"cancunTime,omitempty"` // Cancun switch time (nil = no fork, 0 = already on cancun) VerkleTime *uint64 `json:"verkleTime,omitempty"` // Verkle switch time (nil = no fork, 0 = already on verkle) + StateExpiryTime *uint64 `json:"stateExpiryTime,omitempty"` // State expiry time (nil = no fork, 0 = already on state expiry) // TerminalTotalDifficulty is the amount of total difficulty reached by // the network that triggers the consensus upgrade. @@ -410,6 +415,9 @@ func (c *ChainConfig) Description() string { if c.VerkleTime != nil { banner += fmt.Sprintf(" - Verkle: @%-10v\n", *c.VerkleTime) } + if c.StateExpiryTime != nil { + banner += fmt.Sprintf(" - State expiry: @%-10v\n", *c.StateExpiryTime) + } return banner } @@ -508,6 +516,11 @@ func (c *ChainConfig) IsVerkle(num *big.Int, time uint64) bool { return c.IsLondon(num) && isTimestampForked(c.VerkleTime, time) } +// IsStateExpiry returns whether time is either equal to the State expiry time or greater. +func (c *ChainConfig) IsStateExpiry(num *big.Int, time uint64) bool { + return c.IsLondon(num) && isTimestampForked(c.StateExpiryTime, time) +} + // CheckCompatible checks whether scheduled fork transitions have been imported // with a mismatching chain configuration. func (c *ChainConfig) CheckCompatible(newcfg *ChainConfig, height uint64, time uint64) *ConfigCompatError { @@ -562,6 +575,7 @@ func (c *ChainConfig) CheckConfigForkOrder() error { {name: "shanghaiTime", timestamp: c.ShanghaiTime}, {name: "cancunTime", timestamp: c.CancunTime, optional: true}, {name: "verkleTime", timestamp: c.VerkleTime, optional: true}, + {name: "stateExpiryTime", timestamp: c.StateExpiryTime, optional: true}, } { if lastFork.name != "" { switch { @@ -665,6 +679,9 @@ func (c *ChainConfig) checkCompatible(newcfg *ChainConfig, headNumber *big.Int, if isForkTimestampIncompatible(c.VerkleTime, newcfg.VerkleTime, headTimestamp) { return newTimestampCompatError("Verkle fork timestamp", c.VerkleTime, newcfg.VerkleTime) } + if isForkTimestampIncompatible(c.StateExpiryTime, newcfg.StateExpiryTime, headTimestamp) { + return newTimestampCompatError("State expiry fork timestamp", c.StateExpiryTime, newcfg.StateExpiryTime) + } return nil } diff --git a/tests/init.go b/tests/init.go index c65c4cff147d..1fc6b7537c1c 100644 --- a/tests/init.go +++ b/tests/init.go @@ -336,6 +336,7 @@ var Forks = map[string]*params.ChainConfig{ TerminalTotalDifficulty: big.NewInt(0), ShanghaiTime: u64(0), VerkleTime: u64(0), + StateExpiryTime: u64(0), }, "ShanghaiToVerkleAtTime32": { ChainID: big.NewInt(1), @@ -355,6 +356,7 @@ var Forks = map[string]*params.ChainConfig{ TerminalTotalDifficulty: big.NewInt(0), ShanghaiTime: u64(0), VerkleTime: u64(32), + StateExpiryTime: u64(32), }, } diff --git a/tests/state_test_util.go b/tests/state_test_util.go index 42f0c662ee42..4c99a5690a1a 100644 --- a/tests/state_test_util.go +++ b/tests/state_test_util.go @@ -208,7 +208,7 @@ func (t *StateTest) Run(subtest StateSubtest, vmconfig vm.Config, snapshotter bo return snaps, statedb, fmt.Errorf("post state logs hash mismatch: got %x, want %x", logs, post.Logs) } // Re-init the post-state instance for further operation - statedb, err = state.New(root, statedb.Database(), snaps) + statedb, err = state.New(root, statedb.Database(), snaps, types.Period0) if err != nil { return nil, nil, err } @@ -293,7 +293,7 @@ func (t *StateTest) gasLimit(subtest StateSubtest) uint64 { func MakePreState(db ethdb.Database, accounts core.GenesisAlloc, snapshotter bool) (*snapshot.Tree, *state.StateDB) { sdb := state.NewDatabaseWithConfig(db, &trie.Config{Preimages: true}) - statedb, _ := state.New(types.EmptyRootHash, sdb, nil) + statedb, _ := state.New(types.EmptyRootHash, sdb, nil, types.Period0) for addr, a := range accounts { statedb.SetCode(addr, a.Code) statedb.SetNonce(addr, a.Nonce) @@ -315,7 +315,7 @@ func MakePreState(db ethdb.Database, accounts core.GenesisAlloc, snapshotter boo } snaps, _ = snapshot.New(snapconfig, db, sdb.TrieDB(), root) } - statedb, _ = state.New(root, sdb, snaps) + statedb, _ = state.New(root, sdb, snaps, types.Period0) return snaps, statedb } From 13ecb7702a8cb7430ccc936e14884c08a3a37448 Mon Sep 17 00:00:00 2001 From: weiihann Date: Wed, 4 Dec 2024 18:55:26 +0800 Subject: [PATCH 4/7] revive tx + evm revive + trie revive --- accounts/abi/bind/backends/simulated.go | 1 + accounts/abi/bind/base.go | 1 + cmd/evm/internal/t8ntool/execution.go | 2 +- cmd/evm/internal/t8ntool/transaction.go | 2 +- core/bench_test.go | 2 +- core/state/database.go | 2 + core/state/statedb.go | 4 + core/state_processor.go | 1 + core/state_processor_test.go | 4 +- core/state_transition.go | 22 +++- core/txpool/validation.go | 2 +- core/types/transaction.go | 9 ++ core/types/transaction_marshalling.go | 20 ++++ core/types/tx_access_list.go | 2 +- core/types/tx_blob.go | 1 + core/types/tx_dynamic_fee.go | 1 + core/types/tx_expiry.go | 138 ++++++++++++++++++++++++ core/types/tx_legacy.go | 1 + core/vm/interface.go | 3 + eth/tracers/js/tracer_test.go | 2 + eth/tracers/logger/logger_test.go | 2 + internal/ethapi/transaction_args.go | 4 + light/trie.go | 4 + light/txpool.go | 2 +- params/verkle_params.go | 10 +- signer/core/apitypes/types.go | 4 + tests/transaction_test_util.go | 2 +- trie/secure_trie.go | 5 + trie/transition.go | 4 + trie/verkle.go | 9 ++ 30 files changed, 250 insertions(+), 16 deletions(-) create mode 100644 core/types/tx_expiry.go diff --git a/accounts/abi/bind/backends/simulated.go b/accounts/abi/bind/backends/simulated.go index ca98fb760155..7fdc1ab5f7b5 100644 --- a/accounts/abi/bind/backends/simulated.go +++ b/accounts/abi/bind/backends/simulated.go @@ -662,6 +662,7 @@ func (b *SimulatedBackend) callContract(ctx context.Context, call ethereum.CallM GasTipCap: call.GasTipCap, Data: call.Data, AccessList: call.AccessList, + // TODO(weiihann): need to add revive list? SkipAccountChecks: true, } diff --git a/accounts/abi/bind/base.go b/accounts/abi/bind/base.go index b03f431f7717..c27cf822404c 100644 --- a/accounts/abi/bind/base.go +++ b/accounts/abi/bind/base.go @@ -241,6 +241,7 @@ func (c *BoundContract) Transfer(opts *TransactOpts) (*types.Transaction, error) return c.transact(opts, &c.address, nil) } +// TODO(weiihann): create resurrect tx func (c *BoundContract) createDynamicTx(opts *TransactOpts, contract *common.Address, input []byte, head *types.Header) (*types.Transaction, error) { // Normalize value value := opts.Value diff --git a/cmd/evm/internal/t8ntool/execution.go b/cmd/evm/internal/t8ntool/execution.go index 2159dc905ac2..8296d09d6118 100644 --- a/cmd/evm/internal/t8ntool/execution.go +++ b/cmd/evm/internal/t8ntool/execution.go @@ -567,7 +567,7 @@ func MakePreState(db ethdb.Database, chainConfig *params.ChainConfig, pre *Prest panic(err) } } else { - statedb, err = state.New(mptRoot, sdb, nil) + statedb, err = state.New(mptRoot, sdb, nil, types.Period0) if err != nil { panic(err) } diff --git a/cmd/evm/internal/t8ntool/transaction.go b/cmd/evm/internal/t8ntool/transaction.go index 03a2e2eb99c2..6c0192f47c21 100644 --- a/cmd/evm/internal/t8ntool/transaction.go +++ b/cmd/evm/internal/t8ntool/transaction.go @@ -139,7 +139,7 @@ func Transaction(ctx *cli.Context) error { r.Address = sender } // Check intrinsic gas - if gas, err := core.IntrinsicGas(tx.Data(), tx.AccessList(), tx.To() == nil, + if gas, err := core.IntrinsicGas(tx.Data(), tx.AccessList(), tx.ReviveList(), tx.To() == nil, chainConfig.IsHomestead(new(big.Int)), chainConfig.IsIstanbul(new(big.Int)), chainConfig.IsShanghai(new(big.Int), 0)); err != nil { r.Error = err results = append(results, r) diff --git a/core/bench_test.go b/core/bench_test.go index 55fa980a8566..73235c5ce1f4 100644 --- a/core/bench_test.go +++ b/core/bench_test.go @@ -83,7 +83,7 @@ func genValueTx(nbytes int) func(int, *BlockGen) { return func(i int, gen *BlockGen) { toaddr := common.Address{} data := make([]byte, nbytes) - gas, _ := IntrinsicGas(data, nil, false, false, false, false) + gas, _ := IntrinsicGas(data, nil, nil, false, false, false, false) signer := types.MakeSigner(gen.config, big.NewInt(int64(i)), gen.header.Time) gasPrice := big.NewInt(0) if gen.header.BaseFee != nil { diff --git a/core/state/database.go b/core/state/database.go index b03658c50342..16e799dff5b8 100644 --- a/core/state/database.go +++ b/core/state/database.go @@ -188,6 +188,8 @@ type Trie interface { // IsVerkle returns true if the trie is verkle-tree based IsVerkle() bool + + Revive(stem verkle.Stem, values [][]byte) error } // NewDatabase creates a backing store for state. The returned database is safe for diff --git a/core/state/statedb.go b/core/state/statedb.go index f4021be82215..926a99bb5a42 100644 --- a/core/state/statedb.go +++ b/core/state/statedb.go @@ -1468,3 +1468,7 @@ func copy2DSet[k comparable](set map[k]map[common.Hash][]byte) map[k]map[common. } return copied } + +func (s *StateDB) Revive(stem verkle.Stem, values [][]byte) error { + return s.trie.Revive(stem, values) +} diff --git a/core/state_processor.go b/core/state_processor.go index 9ad1a1a518a8..8c8bb9974c87 100644 --- a/core/state_processor.go +++ b/core/state_processor.go @@ -82,6 +82,7 @@ func (p *StateProcessor) Process(block *types.Block, statedb *state.StateDB, cfg if p.config.IsVerkle(block.Number(), block.Time()) { ProcessParentBlockHash(statedb, block.NumberU64()-1, block.ParentHash()) } + // TODO(weiihann): need to do anything here? // Iterate over and process the individual transactions for i, tx := range block.Transactions() { msg, err := TransactionToMessage(tx, signer, header.BaseFee) diff --git a/core/state_processor_test.go b/core/state_processor_test.go index 639ff14385a9..6a1cd3850d0f 100644 --- a/core/state_processor_test.go +++ b/core/state_processor_test.go @@ -438,9 +438,9 @@ func GenerateBadBlock(parent *types.Block, engine consensus.Engine, txs types.Tr // Source: https://gist.github.com/gballet/a23db1e1cb4ed105616b5920feb75985 var ( code = common.FromHex(`6060604052600a8060106000396000f360606040526008565b00`) - intrinsicContractCreationGas, _ = IntrinsicGas(code, nil, true, true, true, true) + intrinsicContractCreationGas, _ = IntrinsicGas(code, nil, nil, true, true, true, true) codeWithExtCodeCopy = common.FromHex(`0x60806040526040516100109061017b565b604051809103906000f08015801561002c573d6000803e3d6000fd5b506000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034801561007857600080fd5b5060008067ffffffffffffffff8111156100955761009461024a565b5b6040519080825280601f01601f1916602001820160405280156100c75781602001600182028036833780820191505090505b50905060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506020600083833c81610101906101e3565b60405161010d90610187565b61011791906101a3565b604051809103906000f080158015610133573d6000803e3d6000fd5b50600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505061029b565b60d58061046783390190565b6102068061053c83390190565b61019d816101d9565b82525050565b60006020820190506101b86000830184610194565b92915050565b6000819050602082019050919050565b600081519050919050565b6000819050919050565b60006101ee826101ce565b826101f8846101be565b905061020381610279565b925060208210156102435761023e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8360200360080261028e565b831692505b5050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600061028582516101d9565b80915050919050565b600082821b905092915050565b6101bd806102aa6000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f566852414610030575b600080fd5b61003861004e565b6040516100459190610146565b60405180910390f35b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166381ca91d36040518163ffffffff1660e01b815260040160206040518083038186803b1580156100b857600080fd5b505afa1580156100cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100f0919061010a565b905090565b60008151905061010481610170565b92915050565b6000602082840312156101205761011f61016b565b5b600061012e848285016100f5565b91505092915050565b61014081610161565b82525050565b600060208201905061015b6000830184610137565b92915050565b6000819050919050565b600080fd5b61017981610161565b811461018457600080fd5b5056fea2646970667358221220a6a0e11af79f176f9c421b7b12f441356b25f6489b83d38cc828a701720b41f164736f6c63430008070033608060405234801561001057600080fd5b5060b68061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063ab5ed15014602d575b600080fd5b60336047565b604051603e9190605d565b60405180910390f35b60006001905090565b6057816076565b82525050565b6000602082019050607060008301846050565b92915050565b600081905091905056fea26469706673582212203a14eb0d5cd07c277d3e24912f110ddda3e553245a99afc4eeefb2fbae5327aa64736f6c63430008070033608060405234801561001057600080fd5b5060405161020638038061020683398181016040528101906100329190610063565b60018160001c6100429190610090565b60008190555050610145565b60008151905061005d8161012e565b92915050565b60006020828403121561007957610078610129565b5b60006100878482850161004e565b91505092915050565b600061009b826100f0565b91506100a6836100f0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156100db576100da6100fa565b5b828201905092915050565b6000819050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600080fd5b610137816100e6565b811461014257600080fd5b50565b60b3806101536000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c806381ca91d314602d575b600080fd5b60336047565b604051603e9190605a565b60405180910390f35b60005481565b6054816073565b82525050565b6000602082019050606d6000830184604d565b92915050565b600081905091905056fea26469706673582212209bff7098a2f526de1ad499866f27d6d0d6f17b74a413036d6063ca6a0998ca4264736f6c63430008070033`) - intrinsicCodeWithExtCodeCopyGas, _ = IntrinsicGas(codeWithExtCodeCopy, nil, true, true, true, true) + intrinsicCodeWithExtCodeCopyGas, _ = IntrinsicGas(codeWithExtCodeCopy, nil, nil, true, true, true, true) ) func TestProcessVerkle(t *testing.T) { diff --git a/core/state_transition.go b/core/state_transition.go index 98e520d44982..1424a9df4a7c 100644 --- a/core/state_transition.go +++ b/core/state_transition.go @@ -66,7 +66,7 @@ func (result *ExecutionResult) Revert() []byte { } // IntrinsicGas computes the 'intrinsic gas' for a message with the given data. -func IntrinsicGas(data []byte, accessList types.AccessList, isContractCreation bool, isHomestead, isEIP2028 bool, isEIP3860 bool) (uint64, error) { +func IntrinsicGas(data []byte, accessList types.AccessList, reviveList types.ReviveList, isContractCreation bool, isHomestead, isEIP2028 bool, isEIP3860 bool) (uint64, error) { // Set the starting gas for the raw transaction var gas uint64 if isContractCreation && isHomestead { @@ -112,6 +112,15 @@ func IntrinsicGas(data []byte, accessList types.AccessList, isContractCreation b gas += uint64(len(accessList)) * params.TxAccessListAddressGas gas += uint64(accessList.StorageKeys()) * params.TxAccessListStorageKeyGas } + if reviveList != nil { + gas += uint64(len(reviveList)) * params.WitnessBranchReadCost + gas += uint64(len(reviveList)) * params.WitnessBranchWriteCost + for _, val := range reviveList { + gas += uint64(len(val.Values)) * params.WitnessChunkReadCost + gas += uint64(len(val.Values)) * params.WitnessChunkWriteCost + gas += uint64(len(val.Values)) * params.WitnessChunkFillCost + } + } return gas, nil } @@ -137,6 +146,7 @@ type Message struct { GasTipCap *big.Int Data []byte AccessList types.AccessList + ReviveList types.ReviveList BlobGasFeeCap *big.Int BlobHashes []common.Hash @@ -158,6 +168,7 @@ func TransactionToMessage(tx *types.Transaction, s types.Signer, baseFee *big.In Value: tx.Value(), Data: tx.Data(), AccessList: tx.AccessList(), + ReviveList: tx.ReviveList(), SkipAccountChecks: false, BlobHashes: tx.BlobHashes(), BlobGasFeeCap: tx.BlobGasFeeCap(), @@ -380,7 +391,7 @@ func (st *StateTransition) TransitionDb() (*ExecutionResult, error) { ) // Check clauses 4-5, subtract intrinsic gas if everything is correct - gas, err := IntrinsicGas(msg.Data, msg.AccessList, contractCreation, rules.IsHomestead, rules.IsIstanbul, rules.IsShanghai) + gas, err := IntrinsicGas(msg.Data, msg.AccessList, msg.ReviveList, contractCreation, rules.IsHomestead, rules.IsIstanbul, rules.IsShanghai) if err != nil { return nil, err } @@ -418,6 +429,13 @@ func (st *StateTransition) TransitionDb() (*ExecutionResult, error) { // - reset transient storage(eip 1153) st.state.Prepare(rules, msg.From, st.evm.Context.Coinbase, msg.To, vm.ActivePrecompiles(rules), msg.AccessList) + // Before performing the actual transition, we first perform the revive + for _, revive := range msg.ReviveList { + if err := st.state.Revive(revive.Stem, revive.Values); err != nil { + return nil, err + } + } + var ( ret []byte vmerr error // vm errors do not effect consensus and are therefore not assigned to err diff --git a/core/txpool/validation.go b/core/txpool/validation.go index e1c0f314c789..73d0c4764d56 100644 --- a/core/txpool/validation.go +++ b/core/txpool/validation.go @@ -96,7 +96,7 @@ func ValidateTransaction(tx *types.Transaction, blobs []kzg4844.Blob, commits [] } // Ensure the transaction has more gas than the bare minimum needed to cover // the transaction metadata - intrGas, err := core.IntrinsicGas(tx.Data(), tx.AccessList(), tx.To() == nil, true, opts.Config.IsIstanbul(head.Number), opts.Config.IsShanghai(head.Number, head.Time)) + intrGas, err := core.IntrinsicGas(tx.Data(), tx.AccessList(), tx.ReviveList(), tx.To() == nil, true, opts.Config.IsIstanbul(head.Number), opts.Config.IsShanghai(head.Number, head.Time)) if err != nil { return err } diff --git a/core/types/transaction.go b/core/types/transaction.go index e774809c29d9..684c7ca736be 100644 --- a/core/types/transaction.go +++ b/core/types/transaction.go @@ -45,6 +45,7 @@ const ( AccessListTxType = 0x01 DynamicFeeTxType = 0x02 BlobTxType = 0x03 + ReviveTxType = 0x04 ) // Transaction is an Ethereum transaction. @@ -85,6 +86,7 @@ type TxData interface { blobGas() uint64 blobGasFeeCap() *big.Int blobHashes() []common.Hash + reviveList() []ReviveValue rawSignatureValues() (v, r, s *big.Int) setSignatureValues(chainID, v, r, s *big.Int) @@ -199,6 +201,10 @@ func (tx *Transaction) decodeTyped(b []byte) (TxData, error) { var inner BlobTx err := rlp.DecodeBytes(b[1:], &inner) return &inner, err + case ReviveTxType: + var inner ReviveTx + err := rlp.DecodeBytes(b[1:], &inner) + return &inner, err default: return nil, ErrTxTypeNotSupported } @@ -276,6 +282,9 @@ func (tx *Transaction) Data() []byte { return tx.inner.data() } // AccessList returns the access list of the transaction. func (tx *Transaction) AccessList() AccessList { return tx.inner.accessList() } +// ReviveList returns the revive list of the transaction. +func (tx *Transaction) ReviveList() ReviveList { return tx.inner.reviveList() } + // Gas returns the gas limit of the transaction. func (tx *Transaction) Gas() uint64 { return tx.inner.gas() } diff --git a/core/types/transaction_marshalling.go b/core/types/transaction_marshalling.go index a29ec2f6e611..1f2350a53afc 100644 --- a/core/types/transaction_marshalling.go +++ b/core/types/transaction_marshalling.go @@ -41,6 +41,7 @@ type txJSON struct { Value *hexutil.Big `json:"value"` Input *hexutil.Bytes `json:"input"` AccessList *AccessList `json:"accessList,omitempty"` + ReviveList []ReviveValue `json:"reviveList,omitempty"` BlobVersionedHashes []common.Hash `json:"blobVersionedHashes,omitempty"` V *hexutil.Big `json:"v"` R *hexutil.Big `json:"r"` @@ -115,6 +116,25 @@ func (tx *Transaction) MarshalJSON() ([]byte, error) { enc.V = (*hexutil.Big)(itx.V.ToBig()) enc.R = (*hexutil.Big)(itx.R.ToBig()) enc.S = (*hexutil.Big)(itx.S.ToBig()) + + case *ReviveTx: + enc.ChainID = (*hexutil.Big)(itx.ChainID.ToBig()) + enc.Nonce = (*hexutil.Uint64)(&itx.Nonce) + enc.To = tx.To() + enc.Gas = (*hexutil.Uint64)(&itx.Gas) + enc.MaxFeePerGas = (*hexutil.Big)(itx.GasFeeCap.ToBig()) + enc.MaxPriorityFeePerGas = (*hexutil.Big)(itx.GasTipCap.ToBig()) + enc.Value = (*hexutil.Big)(itx.Value.ToBig()) + enc.Input = (*hexutil.Bytes)(&itx.Data) + enc.AccessList = &itx.AccessList + enc.V = (*hexutil.Big)(itx.V.ToBig()) + enc.R = (*hexutil.Big)(itx.R.ToBig()) + enc.S = (*hexutil.Big)(itx.S.ToBig()) + // TODO(weiihann): seems a bit hacky + enc.ReviveList = make([]ReviveValue, len(itx.ReviveList)) + for i, revive := range itx.ReviveList { + enc.ReviveList[i] = revive + } } return json.Marshal(&enc) } diff --git a/core/types/tx_access_list.go b/core/types/tx_access_list.go index 7ce9da73ecbe..2286c494624c 100644 --- a/core/types/tx_access_list.go +++ b/core/types/tx_access_list.go @@ -108,7 +108,7 @@ func (tx *AccessListTx) to() *common.Address { return tx.To } func (tx *AccessListTx) blobGas() uint64 { return 0 } func (tx *AccessListTx) blobGasFeeCap() *big.Int { return nil } func (tx *AccessListTx) blobHashes() []common.Hash { return nil } - +func (tx *AccessListTx) reviveList() []ReviveValue { return nil } func (tx *AccessListTx) effectiveGasPrice(dst *big.Int, baseFee *big.Int) *big.Int { return dst.Set(tx.GasPrice) } diff --git a/core/types/tx_blob.go b/core/types/tx_blob.go index a08121bf1416..9174323a3450 100644 --- a/core/types/tx_blob.go +++ b/core/types/tx_blob.go @@ -108,6 +108,7 @@ func (tx *BlobTx) to() *common.Address { tmp := tx.To; return &tmp } func (tx *BlobTx) blobGas() uint64 { return params.BlobTxBlobGasPerBlob * uint64(len(tx.BlobHashes)) } func (tx *BlobTx) blobGasFeeCap() *big.Int { return tx.BlobFeeCap.ToBig() } func (tx *BlobTx) blobHashes() []common.Hash { return tx.BlobHashes } +func (tx *BlobTx) reviveList() []ReviveValue { return nil } func (tx *BlobTx) effectiveGasPrice(dst *big.Int, baseFee *big.Int) *big.Int { if baseFee == nil { diff --git a/core/types/tx_dynamic_fee.go b/core/types/tx_dynamic_fee.go index 47b870abbf5c..3401006dd9d3 100644 --- a/core/types/tx_dynamic_fee.go +++ b/core/types/tx_dynamic_fee.go @@ -97,6 +97,7 @@ func (tx *DynamicFeeTx) to() *common.Address { return tx.To } func (tx *DynamicFeeTx) blobGas() uint64 { return 0 } func (tx *DynamicFeeTx) blobGasFeeCap() *big.Int { return nil } func (tx *DynamicFeeTx) blobHashes() []common.Hash { return nil } +func (tx *DynamicFeeTx) reviveList() []ReviveValue { return nil } func (tx *DynamicFeeTx) effectiveGasPrice(dst *big.Int, baseFee *big.Int) *big.Int { if baseFee == nil { diff --git a/core/types/tx_expiry.go b/core/types/tx_expiry.go new file mode 100644 index 000000000000..6a59ccb3ceea --- /dev/null +++ b/core/types/tx_expiry.go @@ -0,0 +1,138 @@ +// 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 . + +package types + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-verkle" + "github.com/holiman/uint256" +) + +type ReviveList []ReviveValue + +type ReviveValue struct { + Stem verkle.Stem `json:"stem"` + LastPeriod verkle.StatePeriod `json:"last_period"` + Values [][]byte `json:"values"` +} + +// ReviveTx represents an EIP-7736 resurrect transaction. +type ReviveTx struct { + ChainID *uint256.Int + Nonce uint64 + GasTipCap *uint256.Int // a.k.a. maxPriorityFeePerGas + GasFeeCap *uint256.Int // a.k.a. maxFeePerGas + Gas uint64 + To *common.Address `rlp:"nil"` // nil means contract creation + Value *uint256.Int + Data []byte + AccessList AccessList + ReviveList ReviveList // TODO(weiihann): this should be ssz(Vector[stem,last_epoch,values], do it later + + // Signature values + V *uint256.Int `json:"v" gencodec:"required"` + R *uint256.Int `json:"r" gencodec:"required"` + S *uint256.Int `json:"s" gencodec:"required"` +} + +// copy creates a deep copy of the transaction data and initializes all fields. +func (tx *ReviveTx) copy() TxData { + cpy := &ReviveTx{ + Nonce: tx.Nonce, + To: copyAddressPtr(tx.To), + Data: common.CopyBytes(tx.Data), + Gas: tx.Gas, + // These are copied below. + AccessList: make(AccessList, len(tx.AccessList)), + Value: new(uint256.Int), + ChainID: new(uint256.Int), + GasTipCap: new(uint256.Int), + GasFeeCap: new(uint256.Int), + V: new(uint256.Int), + R: new(uint256.Int), + S: new(uint256.Int), + } + copy(cpy.AccessList, tx.AccessList) + if tx.Value != nil { + cpy.Value.Set(tx.Value) + } + if tx.ChainID != nil { + cpy.ChainID.Set(tx.ChainID) + } + if tx.GasTipCap != nil { + cpy.GasTipCap.Set(tx.GasTipCap) + } + if tx.GasFeeCap != nil { + cpy.GasFeeCap.Set(tx.GasFeeCap) + } + if tx.V != nil { + cpy.V.Set(tx.V) + } + if tx.R != nil { + cpy.R.Set(tx.R) + } + if tx.S != nil { + cpy.S.Set(tx.S) + } + + cpy.ReviveList = make([]ReviveValue, len(tx.ReviveList)) + for i, revive := range tx.ReviveList { + cpy.ReviveList[i] = revive + } + + return cpy +} + +// accessors for innerTx. +func (tx *ReviveTx) txType() byte { return ReviveTxType } +func (tx *ReviveTx) chainID() *big.Int { return tx.ChainID.ToBig() } +func (tx *ReviveTx) accessList() AccessList { return tx.AccessList } +func (tx *ReviveTx) data() []byte { return tx.Data } +func (tx *ReviveTx) gas() uint64 { return tx.Gas } +func (tx *ReviveTx) gasFeeCap() *big.Int { return tx.GasFeeCap.ToBig() } +func (tx *ReviveTx) gasTipCap() *big.Int { return tx.GasTipCap.ToBig() } +func (tx *ReviveTx) gasPrice() *big.Int { return tx.GasFeeCap.ToBig() } +func (tx *ReviveTx) value() *big.Int { return tx.Value.ToBig() } +func (tx *ReviveTx) nonce() uint64 { return tx.Nonce } +func (tx *ReviveTx) to() *common.Address { return tx.To } +func (tx *ReviveTx) blobGas() uint64 { return 0 } +func (tx *ReviveTx) blobGasFeeCap() *big.Int { return nil } +func (tx *ReviveTx) blobHashes() []common.Hash { return nil } +func (tx *ReviveTx) reviveList() []ReviveValue { return tx.ReviveList } +func (tx *ReviveTx) effectiveGasPrice(dst *big.Int, baseFee *big.Int) *big.Int { + if baseFee == nil { + return dst.Set(tx.GasFeeCap.ToBig()) + } + tip := dst.Sub(tx.GasFeeCap.ToBig(), baseFee) + if tip.Cmp(tx.GasTipCap.ToBig()) > 0 { + tip.Set(tx.GasTipCap.ToBig()) + } + return tip.Add(tip, baseFee) +} + +func (tx *ReviveTx) rawSignatureValues() (v, r, s *big.Int) { + return tx.V.ToBig(), tx.R.ToBig(), tx.S.ToBig() +} + +func (tx *ReviveTx) setSignatureValues(chainID, v, r, s *big.Int) { + tx.ChainID.SetFromBig(chainID) + tx.V.SetFromBig(v) + tx.R.SetFromBig(r) + tx.S.SetFromBig(s) +} diff --git a/core/types/tx_legacy.go b/core/types/tx_legacy.go index 902e70cf94b9..3cc8e3ba2b76 100644 --- a/core/types/tx_legacy.go +++ b/core/types/tx_legacy.go @@ -105,6 +105,7 @@ func (tx *LegacyTx) to() *common.Address { return tx.To } func (tx *LegacyTx) blobGas() uint64 { return 0 } func (tx *LegacyTx) blobGasFeeCap() *big.Int { return nil } func (tx *LegacyTx) blobHashes() []common.Hash { return nil } +func (tx *LegacyTx) reviveList() []ReviveValue { return nil } func (tx *LegacyTx) effectiveGasPrice(dst *big.Int, baseFee *big.Int) *big.Int { return dst.Set(tx.GasPrice) diff --git a/core/vm/interface.go b/core/vm/interface.go index 4241b1d45a77..dd5163835542 100644 --- a/core/vm/interface.go +++ b/core/vm/interface.go @@ -23,6 +23,7 @@ import ( "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-verkle" ) // StateDB is an EVM database for full state querying. @@ -84,6 +85,8 @@ type StateDB interface { Witness() *state.AccessWitness SetWitness(*state.AccessWitness) + + Revive(stem verkle.Stem, values [][]byte) error } // CallContext provides a basic interface for the EVM calling conventions. The EVM diff --git a/eth/tracers/js/tracer_test.go b/eth/tracers/js/tracer_test.go index c68c81e511e9..3d67ec51758f 100644 --- a/eth/tracers/js/tracer_test.go +++ b/eth/tracers/js/tracer_test.go @@ -29,6 +29,7 @@ import ( "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/eth/tracers" "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-verkle" ) type account struct{} @@ -50,6 +51,7 @@ type dummyStatedb struct { func (*dummyStatedb) GetRefund() uint64 { return 1337 } func (*dummyStatedb) GetBalance(addr common.Address) *big.Int { return new(big.Int) } +func (*dummyStatedb) Revive(_ verkle.Stem, _ [][]byte) error {panic("not supported")} type vmContext struct { blockCtx vm.BlockContext diff --git a/eth/tracers/logger/logger_test.go b/eth/tracers/logger/logger_test.go index 3192a15cbab8..802512733897 100644 --- a/eth/tracers/logger/logger_test.go +++ b/eth/tracers/logger/logger_test.go @@ -26,6 +26,7 @@ import ( "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-verkle" ) type dummyContractRef struct { @@ -51,6 +52,7 @@ type dummyStatedb struct { 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 (*dummyStatedb) Revive(_ verkle.Stem, _ [][]byte) error { panic("not supported") } func TestStoreCapture(t *testing.T) { var ( diff --git a/internal/ethapi/transaction_args.go b/internal/ethapi/transaction_args.go index 6e2690e095d9..a477a1dda241 100644 --- a/internal/ethapi/transaction_args.go +++ b/internal/ethapi/transaction_args.go @@ -52,6 +52,7 @@ type TransactionArgs struct { // Introduced by AccessListTxType transaction. AccessList *types.AccessList `json:"accessList,omitempty"` + ReviveList *types.ReviveList `json:"reviveList,omitempty"` ChainID *hexutil.Big `json:"chainId,omitempty"` } @@ -109,6 +110,7 @@ func (args *TransactionArgs) setDefaults(ctx context.Context, b Backend) error { Value: args.Value, Data: (*hexutil.Bytes)(&data), AccessList: args.AccessList, + ReviveList: args.ReviveList, } pendingBlockNr := rpc.BlockNumberOrHashWithNumber(rpc.PendingBlockNumber) estimated, err := DoEstimateGas(ctx, b, callArgs, pendingBlockNr, b.RPCGasCap()) @@ -284,6 +286,8 @@ func (args *TransactionArgs) ToMessage(globalGasCap uint64, baseFee *big.Int) (* func (args *TransactionArgs) toTransaction() *types.Transaction { var data types.TxData switch { + case args.ReviveList != nil: + panic("TODO(weiihann):implement me") case args.MaxFeePerGas != nil: al := types.AccessList{} if args.AccessList != nil { diff --git a/light/trie.go b/light/trie.go index 3659137aeba2..3017f7e3396e 100644 --- a/light/trie.go +++ b/light/trie.go @@ -191,6 +191,10 @@ type odrTrie struct { trie *trie.Trie } +func (t *odrTrie) Revive(_ verkle.Stem, _ [][]byte) error { + panic("not supported") +} + func (t *odrTrie) GetStorage(_ common.Address, key []byte) ([]byte, error) { key = crypto.Keccak256(key) var enc []byte diff --git a/light/txpool.go b/light/txpool.go index b792d70b14b8..bee54016530b 100644 --- a/light/txpool.go +++ b/light/txpool.go @@ -386,7 +386,7 @@ func (pool *TxPool) validateTx(ctx context.Context, tx *types.Transaction) error } // Should supply enough intrinsic gas - gas, err := core.IntrinsicGas(tx.Data(), tx.AccessList(), tx.To() == nil, true, pool.istanbul, pool.shanghai) + gas, err := core.IntrinsicGas(tx.Data(), tx.AccessList(), tx.ReviveList(), tx.To() == nil, true, pool.istanbul, pool.shanghai) if err != nil { return err } diff --git a/params/verkle_params.go b/params/verkle_params.go index 93d4f7cd6476..56b1ab3c9d6c 100644 --- a/params/verkle_params.go +++ b/params/verkle_params.go @@ -18,11 +18,11 @@ package params // Verkle tree EIP: costs associated to witness accesses var ( - WitnessBranchReadCost uint64 = 1900 - WitnessChunkReadCost uint64 = 200 - WitnessBranchWriteCost uint64 = 3000 - WitnessChunkWriteCost uint64 = 500 - WitnessChunkFillCost uint64 = 6200 + WitnessBranchReadCost uint64 = 1900 // WITNESS_BRANCH_COST + WitnessChunkReadCost uint64 = 200 // WITNESS_CHUNK_COST + WitnessBranchWriteCost uint64 = 3000 // SUBTREE_EDIT_COST + WitnessChunkWriteCost uint64 = 500 // CHUNK_EDIT_COST + WitnessChunkFillCost uint64 = 6200 // CHUNK_FILL_COST ) // ClearVerkleWitnessCosts sets all witness costs to 0, which is necessary diff --git a/signer/core/apitypes/types.go b/signer/core/apitypes/types.go index 8218e754d36c..49e2f1d01063 100644 --- a/signer/core/apitypes/types.go +++ b/signer/core/apitypes/types.go @@ -97,6 +97,7 @@ type SendTxArgs struct { // For non-legacy transactions AccessList *types.AccessList `json:"accessList,omitempty"` + ReviveList []hexutil.Bytes `json:"reviveList,omitempty"` ChainID *hexutil.Big `json:"chainId,omitempty"` } @@ -153,6 +154,9 @@ func (args *SendTxArgs) ToTransaction() *types.Transaction { Data: input, AccessList: *args.AccessList, } + case args.ReviveList != nil: + // TODO(weiihann): handle this + default: data = &types.LegacyTx{ To: to, diff --git a/tests/transaction_test_util.go b/tests/transaction_test_util.go index 391aa57584cf..48a527a1f2cd 100644 --- a/tests/transaction_test_util.go +++ b/tests/transaction_test_util.go @@ -55,7 +55,7 @@ func (tt *TransactionTest) Run(config *params.ChainConfig) error { return nil, nil, err } // Intrinsic gas - requiredGas, err := core.IntrinsicGas(tx.Data(), tx.AccessList(), tx.To() == nil, isHomestead, isIstanbul, false) + requiredGas, err := core.IntrinsicGas(tx.Data(), tx.AccessList(), tx.ReviveList(), tx.To() == nil, isHomestead, isIstanbul, false) if err != nil { return nil, nil, err } diff --git a/trie/secure_trie.go b/trie/secure_trie.go index 9198f595796e..5fdfc2518167 100644 --- a/trie/secure_trie.go +++ b/trie/secure_trie.go @@ -21,6 +21,7 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/trie/trienode" + "github.com/ethereum/go-verkle" ) // SecureTrie is the old name of StateTrie. @@ -292,3 +293,7 @@ func (t *StateTrie) getSecKeyCache() map[string][]byte { func (t *StateTrie) IsVerkle() bool { return false } + +func (t *StateTrie) Revive(_ verkle.Stem, _ [][]byte) error { + panic("not supported") +} diff --git a/trie/transition.go b/trie/transition.go index 6bcdfe19a01a..394d8e165b59 100644 --- a/trie/transition.go +++ b/trie/transition.go @@ -197,3 +197,7 @@ func (t *TransitionTrie) Copy() *TransitionTrie { func (t *TransitionTrie) UpdateContractCode(addr common.Address, codeHash common.Hash, code []byte) error { return t.overlay.UpdateContractCode(addr, codeHash, code) } + +func (t *TransitionTrie) Revive(_ verkle.Stem, _ [][]byte) error { + panic("shouldn't happen in transition trie") +} diff --git a/trie/verkle.go b/trie/verkle.go index ff67de0a484c..bbc883fe97b9 100644 --- a/trie/verkle.go +++ b/trie/verkle.go @@ -197,6 +197,15 @@ func (trie *VerkleTrie) UpdateStem(key []byte, values [][]byte) error { } } +func (trie *VerkleTrie) Revive(stem verkle.Stem, values [][]byte) error { + switch root := trie.root.(type) { + case *verkle.InternalNode: + return root.InsertValuesAtStem(stem, values, trie.curPeriod, true, trie.FlatdbNodeResolver) + default: + panic("invalid root type") + } +} + // Update associates key with value in the trie. If value has length zero, any // existing value is deleted from the trie. The value bytes must not be modified // by the caller while they are stored in the trie. If a node was not found in the From d409acb4cdcbd2af2fdcad56f258fbd88965f752 Mon Sep 17 00:00:00 2001 From: weiihann Date: Mon, 27 Jan 2025 18:31:09 +0800 Subject: [PATCH 5/7] all: use latest state expiry from go-verkle --- .cursorignore | 2 + accounts/abi/bind/backends/simulated.go | 2 +- accounts/abi/bind/base.go | 2 +- cmd/geth/chaincmd.go | 2 +- consensus/beacon/consensus.go | 2 +- core/blockchain.go | 2 +- core/chain_makers.go | 8 +- core/output/block0.rlp.hex | 1 + core/output/block1.rlp.hex | 1 + core/output/block2.rlp.hex | 1 + core/output/statediffs.json | 1 + core/output/traces.jsonl | 529 ++++++++++++++++++++++++ core/state/database.go | 3 +- core/state/statedb.go | 14 +- core/state/trie_prefetcher.go | 3 +- core/state_processor.go | 1 - core/state_transition.go | 2 +- core/types/transaction_marshalling.go | 66 ++- core/vm/interface.go | 5 +- eth/tracers/js/tracer_test.go | 4 +- eth/tracers/logger/logger_test.go | 5 +- go.mod | 2 +- go.sum | 4 +- internal/ethapi/transaction_args.go | 18 +- light/trie.go | 2 +- signer/core/apitypes/types.go | 3 +- trie/secure_trie.go | 2 +- trie/transition.go | 2 +- trie/verkle.go | 10 +- 29 files changed, 663 insertions(+), 36 deletions(-) create mode 100644 .cursorignore create mode 100644 core/output/block0.rlp.hex create mode 100644 core/output/block1.rlp.hex create mode 100644 core/output/block2.rlp.hex create mode 100644 core/output/statediffs.json create mode 100644 core/output/traces.jsonl diff --git a/.cursorignore b/.cursorignore new file mode 100644 index 000000000000..98400c4c0beb --- /dev/null +++ b/.cursorignore @@ -0,0 +1,2 @@ +# Add directories or file patterns to ignore during indexing (e.g. foo/ or *.csv) +*.json \ No newline at end of file diff --git a/accounts/abi/bind/backends/simulated.go b/accounts/abi/bind/backends/simulated.go index 7fdc1ab5f7b5..4cc5f21534ed 100644 --- a/accounts/abi/bind/backends/simulated.go +++ b/accounts/abi/bind/backends/simulated.go @@ -662,7 +662,7 @@ func (b *SimulatedBackend) callContract(ctx context.Context, call ethereum.CallM GasTipCap: call.GasTipCap, Data: call.Data, AccessList: call.AccessList, - // TODO(weiihann): need to add revive list? + // TODO(wh): handle revive SkipAccountChecks: true, } diff --git a/accounts/abi/bind/base.go b/accounts/abi/bind/base.go index c27cf822404c..160b62defffd 100644 --- a/accounts/abi/bind/base.go +++ b/accounts/abi/bind/base.go @@ -241,7 +241,7 @@ func (c *BoundContract) Transfer(opts *TransactOpts) (*types.Transaction, error) return c.transact(opts, &c.address, nil) } -// TODO(weiihann): create resurrect tx +// TODO(wh): handle this, create resurrect tx func (c *BoundContract) createDynamicTx(opts *TransactOpts, contract *common.Address, input []byte, head *types.Header) (*types.Transaction, error) { // Normalize value value := opts.Value diff --git a/cmd/geth/chaincmd.go b/cmd/geth/chaincmd.go index 11ecdc6987be..1c85145e7afa 100644 --- a/cmd/geth/chaincmd.go +++ b/cmd/geth/chaincmd.go @@ -513,7 +513,7 @@ func dump(ctx *cli.Context) error { config := &trie.Config{ Preimages: true, // always enable preimage lookup } - state, err := state.New(root, state.NewDatabaseWithConfig(db, config), nil, types.Period0) // TODO(weiihann): load head block and get the period + state, err := state.New(root, state.NewDatabaseWithConfig(db, config), nil, types.Period0) // TODO(wh): load head block and get the period if err != nil { return err } diff --git a/consensus/beacon/consensus.go b/consensus/beacon/consensus.go index 513efa4b797b..3e9a536ab830 100644 --- a/consensus/beacon/consensus.go +++ b/consensus/beacon/consensus.go @@ -469,7 +469,7 @@ func BuildVerkleProof(header *types.Header, state *state.StateDB, parentRoot com // conversion, when the previous tree is a merkle tree. // Logically, the "previous" verkle tree is an empty tree. okpre = true - vtrpre = trie.NewVerkleTrie(verkle.New(), state.Database().TrieDB(), utils.NewPointCache(), false, 0) // TODO(weiihann) + vtrpre = trie.NewVerkleTrie(verkle.New(), state.Database().TrieDB(), utils.NewPointCache(), false, types.Period0) post := state.GetTrie().(*trie.TransitionTrie) vtrpost = post.Overlay() okpost = true diff --git a/core/blockchain.go b/core/blockchain.go index 485703692dab..3a2014c1d4e5 100644 --- a/core/blockchain.go +++ b/core/blockchain.go @@ -1779,7 +1779,7 @@ func (bc *BlockChain) insertChain(chain types.Blocks, setHead bool) (int, error) bc.StartVerkleTransition(parent.Root, emptyVerkleRoot, bc.Config(), &parent.Time, parent.Root) bc.stateCache.SetLastMerkleRoot(parent.Root) } - statedb, err := state.New(parent.Root, bc.stateCache, bc.snaps, curPeriod) // TODO(weiihann): here + statedb, err := state.New(parent.Root, bc.stateCache, bc.snaps, curPeriod) if err != nil { return it.index, err } diff --git a/core/chain_makers.go b/core/chain_makers.go index 6fca0fbbc751..7c36be78694e 100644 --- a/core/chain_makers.go +++ b/core/chain_makers.go @@ -336,8 +336,8 @@ func GenerateChain(config *params.ChainConfig, parent *types.Block, engine conse return nil, nil } for i := 0; i < n; i++ { - curPeriod := types.GetStatePeriod(config, parent.Time()) - statedb, err := state.New(parent.Root(), state.NewDatabase(db), nil, curPeriod) + parentPeriod := types.GetStatePeriod(config, parent.Time()) + statedb, err := state.New(parent.Root(), state.NewDatabase(db), nil, parentPeriod) if err != nil { panic(err) } @@ -386,6 +386,7 @@ func GenerateVerkleChain(config *params.ChainConfig, parent *types.Block, engine b.header = makeHeader(chainreader, parent, statedb, b.engine) preState := statedb.Copy() fmt.Println("prestate", preState.GetTrie().(*trie.VerkleTrie).ToDot()) + statedb.SetCurPeriod(types.GetStatePeriod(config, b.header.Time)) // update period as we are going to process new block if config.IsVerkle(b.header.Number, b.header.Time) { if !config.IsVerkle(b.parent.Number(), b.parent.Time()) { @@ -433,7 +434,8 @@ func GenerateVerkleChain(config *params.ChainConfig, parent *types.Block, engine proots = append(proots, parent.Root()) // quick check that we are self-consistent - err = verkle.Verify(block.ExecutionWitness().VerkleProof, block.ExecutionWitness().ParentStateRoot[:], block.Root().Bytes(), block.ExecutionWitness().StateDiff, 0) // TODO(weiihann) + blockPeriod := types.GetStatePeriod(config, b.header.Time) + err = verkle.Verify(block.ExecutionWitness().VerkleProof, block.ExecutionWitness().ParentStateRoot[:], block.Root().Bytes(), block.ExecutionWitness().StateDiff, blockPeriod) if err != nil { panic(err) } diff --git a/core/output/block0.rlp.hex b/core/output/block0.rlp.hex new file mode 100644 index 000000000000..45649ed4931a --- /dev/null +++ b/core/output/block0.rlp.hex @@ -0,0 +1 @@ +f9021ff90219a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a029fa68fddcc400522ae4b6f147528fc24514c0de632e96f217d8b17490726c6aa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083020000808347e7c4808080a00000000000000000000000000000000000000000000000000000000000000000880000000000000000843b9aca00a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421c0c0c0 \ No newline at end of file diff --git a/core/output/block1.rlp.hex b/core/output/block1.rlp.hex new file mode 100644 index 000000000000..8cd263222795 --- /dev/null +++ b/core/output/block1.rlp.hex @@ -0,0 +1 @@ +f90353f90218a0709a2f8414d6f57e276968a3a61865e675eadc4e86d75d5011038305ae7910dea01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a015f25558e974b88672fb254fafe53551d3c52c64069ddf42f51b34de3f7c119ca05bc6adb39ea9aa931ff304798334ca7079af7338ae6c0aa5fa309acb3d0a5b15a0251f2cb798e965c5d9b11c882f37c69fd2c42b314fabe64d2b4998c76eb93ae8b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080018347e7c482f6180a80a0000000000000000000000000000000000000000000000000000000000000000088000000000000000084342770c0a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421f90133f8658084342770c08252089400020300000000000000000000000000000000008203e78026a012b305f880108f997fba308aed436c3f9579cc3cd974fbba42d4dbed5eb5bf28a04bfb28644ea72bd4f6d668fbbed3a0352c3318cee582eec7933dbd06380eaa9ff8650184342770c08252089400000000000000000000000000000000000000008203e78025a035084f770e2443be85a5c774532dbacda1f5d0161876cec312e08008833f0a52a028c346755226a6f34f8c83dd9634ce232f71930ed3d56beb660877ee1400244bf8630284342770c0825208940000000000000000000000000000000000000000808026a0eb6949fa8562003ad7492e200b7b73a0c68de8c84998683863c87335d7f7ad28a054f2f110f801036824d6952471d3e3959dd58e639d9169b26632ea1bb814cfecc0c0 \ No newline at end of file diff --git a/core/output/block2.rlp.hex b/core/output/block2.rlp.hex new file mode 100644 index 000000000000..fdc5cf37effb --- /dev/null +++ b/core/output/block2.rlp.hex @@ -0,0 +1 @@ +f90b57f90219a09cd8e265f03adee194fdf0147fa40270562586418c8a4e3bf9e8dbe5f3a41cd8a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0305579520915a655e8dab8f9fa71a433d4471155427bffc265708caf55e9a514a002010f59e092529d1f2b457e7c1911a08cdf728a14ac1088ea9615dce3b87447a07279017c7fbd8dcd1ed3255ae492d3fa12b8e6f29d033302ce05ecdd3157113bb901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080028347e7c48303c9931480a00000000000000000000000000000000000000000000000000000000000000000880000000000000000842dcf2261a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421f90936f8650384342770c08252089401020300000000000000000000000000000000008203e78026a0b1dc957ad929efeadb591bd77121aea2a1808c8a82e460d671aaccce2e96855aa038de06965d668cfaeb7d33d97e3c8e03380aac057741afa265756b32d07c43b0f8650484342770c08252089400000000000000000000000000000000000000008203e78025a013c16fdd3018f4cdd2db8cd0cdf694973de65df7179bbb0c10de42583acaed7aa0633d469034029959d960c23d3b028ae68360c1a4a66663f4d841aaca69b0c6ebf8630584342770c0825208940000000000000000000000000000000000000000808025a0640b2c69c75bedf0b9388e5b60e40ea6f4ea0a084b6660ab27ace0c66dfc04c7a052dc3febc7ca404f37b267a961de42ea35e6de362fcefc6f6928a830837f0ce5f86a0684342770c0832dc6c080109a6060604052600a8060106000396000f360606040526008565b0026a0e909f28a02715713732d38899d8dfe97688ffa3dc7a96a5072b367bac35badcba061e24f56eab4f791158b16ca771b7914d85d401f549618329624be3d546adef9f907940784342770c0832dc6c08080b9074260806040526040516100109061017b565b604051809103906000f08015801561002c573d6000803e3d6000fd5b506000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034801561007857600080fd5b5060008067ffffffffffffffff8111156100955761009461024a565b5b6040519080825280601f01601f1916602001820160405280156100c75781602001600182028036833780820191505090505b50905060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506020600083833c81610101906101e3565b60405161010d90610187565b61011791906101a3565b604051809103906000f080158015610133573d6000803e3d6000fd5b50600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505061029b565b60d58061046783390190565b6102068061053c83390190565b61019d816101d9565b82525050565b60006020820190506101b86000830184610194565b92915050565b6000819050602082019050919050565b600081519050919050565b6000819050919050565b60006101ee826101ce565b826101f8846101be565b905061020381610279565b925060208210156102435761023e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8360200360080261028e565b831692505b5050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600061028582516101d9565b80915050919050565b600082821b905092915050565b6101bd806102aa6000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f566852414610030575b600080fd5b61003861004e565b6040516100459190610146565b60405180910390f35b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166381ca91d36040518163ffffffff1660e01b815260040160206040518083038186803b1580156100b857600080fd5b505afa1580156100cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100f0919061010a565b905090565b60008151905061010481610170565b92915050565b6000602082840312156101205761011f61016b565b5b600061012e848285016100f5565b91505092915050565b61014081610161565b82525050565b600060208201905061015b6000830184610137565b92915050565b6000819050919050565b600080fd5b61017981610161565b811461018457600080fd5b5056fea2646970667358221220a6a0e11af79f176f9c421b7b12f441356b25f6489b83d38cc828a701720b41f164736f6c63430008070033608060405234801561001057600080fd5b5060b68061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063ab5ed15014602d575b600080fd5b60336047565b604051603e9190605d565b60405180910390f35b60006001905090565b6057816076565b82525050565b6000602082019050607060008301846050565b92915050565b600081905091905056fea26469706673582212203a14eb0d5cd07c277d3e24912f110ddda3e553245a99afc4eeefb2fbae5327aa64736f6c63430008070033608060405234801561001057600080fd5b5060405161020638038061020683398181016040528101906100329190610063565b60018160001c6100429190610090565b60008190555050610145565b60008151905061005d8161012e565b92915050565b60006020828403121561007957610078610129565b5b60006100878482850161004e565b91505092915050565b600061009b826100f0565b91506100a6836100f0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156100db576100da6100fa565b5b828201905092915050565b6000819050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600080fd5b610137816100e6565b811461014257600080fd5b50565b60b3806101536000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c806381ca91d314602d575b600080fd5b60336047565b604051603e9190605a565b60405180910390f35b60005481565b6054816073565b82525050565b6000602082019050606d6000830184604d565b92915050565b600081905091905056fea26469706673582212209bff7098a2f526de1ad499866f27d6d0d6f17b74a413036d6063ca6a0998ca4264736f6c6343000807003326a0e910089d33abf2c4fbc11ae870a94928bceb63362c2df12d88769e40132c69aba04c148c16c0b06a51ccf2f9644552a4510cce5dda2626c1912b0ddb8a738020a2c0c0 \ No newline at end of file diff --git a/core/output/statediffs.json b/core/output/statediffs.json new file mode 100644 index 000000000000..e4dd1effa4e6 --- /dev/null +++ b/core/output/statediffs.json @@ -0,0 +1 @@ +[[{"stem":"0x1540dfad7755b40be0768c6aa0a5096fbf0215e0e8cf354dd928a178346466","suffixDiffs":[{"suffix":0,"currentValue":"0x0000000000000000000000000000000000000000000000000de0b6b3a7640000","newValue":"0x0000000000000000000000000000000300000000000000000de08490dd58e632"},{"suffix":1,"currentValue":"0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","newValue":null}],"prePeriod":0},{"stem":"0x1a100684fd68185060405f3f160e4bb6e034194336b547bdae323f888d5332","suffixDiffs":[{"suffix":0,"currentValue":null,"newValue":"0x00000000000000000000000000000000000000000000000000000000000003e7"},{"suffix":1,"currentValue":null,"newValue":"0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"}],"prePeriod":0},{"stem":"0x5b5fdfedd6a0e932da408ac7d772a36513d1eee9b9926e52620c43a433aad7","suffixDiffs":[{"suffix":64,"currentValue":null,"newValue":"0x709a2f8414d6f57e276968a3a61865e675eadc4e86d75d5011038305ae7910de"}],"prePeriod":0},{"stem":"0xb4e8461a62334403b43cf4ea81015570273ab8aff7b04f00e56f1f98569445","suffixDiffs":[{"suffix":0,"currentValue":null,"newValue":"0x00000000000000000000000000000000000000000000000000000000000003e7"},{"suffix":1,"currentValue":null,"newValue":"0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"}],"prePeriod":0}],[{"stem":"0x1540dfad7755b40be0768c6aa0a5096fbf0215e0e8cf354dd928a178346466","suffixDiffs":[{"suffix":0,"currentValue":"0x0000000000000000000000000000000300000000000000000de08490dd58e632","newValue":"0x0000000000000000000000000000000800000000000000000ddfbf09a0ec6014"},{"suffix":1,"currentValue":"0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","newValue":null}],"prePeriod":0},{"stem":"0x178d84708160f6d9844906241e30a7d719cfc3b486ecc89222b0872c33dfea","suffixDiffs":[{"suffix":0,"currentValue":null,"newValue":"0x00000000000001bd000000000000000300000000000000000000000000000000"},{"suffix":1,"currentValue":null,"newValue":"0x855d6153e73150a38cab4b29ba925205be4f569cc2b5e049dfe5aca12d8ed260"},{"suffix":64,"currentValue":null,"newValue":"0x0000000000000000000000000f2cc432c8892c12eede08774adfd63df6f49282"},{"suffix":65,"currentValue":null,"newValue":"0x00000000000000000000000074b186f98c406a19aaf31b542b2b2353fb1577f6"},{"suffix":128,"currentValue":null,"newValue":"0x00608060405234801561001057600080fd5b506004361061002b5760003560e0"},{"suffix":129,"currentValue":null,"newValue":"0x001c8063f566852414610030575b600080fd5b61003861004e565b6040516100"},{"suffix":130,"currentValue":null,"newValue":"0x01459190610146565b60405180910390f35b6000600160009054906101000a90"},{"suffix":131,"currentValue":null,"newValue":"0x000473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffff"},{"suffix":132,"currentValue":null,"newValue":"0x0dffffffffffffffffffffffffff166381ca91d36040518163ffffffff1660e0"},{"suffix":133,"currentValue":null,"newValue":"0x001b815260040160206040518083038186803b1580156100b857600080fd5b50"},{"suffix":134,"currentValue":null,"newValue":"0x005afa1580156100cc573d6000803e3d6000fd5b505050506040513d601f1960"},{"suffix":135,"currentValue":null,"newValue":"0x011f820116820180604052508101906100f0919061010a565b905090565b6000"},{"suffix":136,"currentValue":null,"newValue":"0x008151905061010481610170565b92915050565b600060208284031215610120"},{"suffix":137,"currentValue":null,"newValue":"0x005761011f61016b565b5b600061012e848285016100f5565b91505092915050"},{"suffix":138,"currentValue":null,"newValue":"0x00565b61014081610161565b82525050565b600060208201905061015b600083"},{"suffix":139,"currentValue":null,"newValue":"0x000184610137565b92915050565b6000819050919050565b600080fd5b610179"},{"suffix":140,"currentValue":null,"newValue":"0x0081610161565b811461018457600080fd5b5056fea2646970667358221220a6"},{"suffix":141,"currentValue":null,"newValue":"0x00a0e11af79f176f9c421b7b12f441356b25f6489b83d38cc828a701720b41f1"},{"suffix":142,"currentValue":null,"newValue":"0x1064736f6c634300080700330000000000000000000000000000000000000000"}],"prePeriod":0},{"stem":"0x1a100684fd68185060405f3f160e4bb6e034194336b547bdae323f888d5332","suffixDiffs":[{"suffix":0,"currentValue":"0x00000000000000000000000000000000000000000000000000000000000003e7","newValue":"0x00000000000000000000000000000000000000000000000000001807e55a9f5b"},{"suffix":1,"currentValue":"0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","newValue":null}],"prePeriod":0},{"stem":"0x274ec3dcd311343e210f21e9c6d8501d7a35f81ce0dc49dbfdaf1dba64c067","suffixDiffs":[{"suffix":0,"currentValue":null,"newValue":"0x00000000000000000000000000000000000000000000000000000000000003e7"},{"suffix":1,"currentValue":null,"newValue":"0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"}],"prePeriod":0},{"stem":"0x30c7d6046291983794ea45a4ddb23a699dea413d11fcf95301a8994c75a1aa","suffixDiffs":[{"suffix":0,"currentValue":null,"newValue":"0x000000000000000a000000000000000100000000000000000000000000000010"},{"suffix":1,"currentValue":null,"newValue":"0xd1d29ee74a6d03244189ddb39239adc2a5f77ba91a8df459f17a172dbd96213d"},{"suffix":128,"currentValue":null,"newValue":"0x0060606040526008565b00000000000000000000000000000000000000000000"}],"prePeriod":0},{"stem":"0x4ea39246b161c112dec076e052f64934ce4fa4da0462830f9825c0525571eb","suffixDiffs":[{"suffix":0,"currentValue":null,"newValue":"0x00000000000000b3000000000000000100000000000000000000000000000000"},{"suffix":1,"currentValue":null,"newValue":"0x59580f918eb81909c7f6139444354459095c3588e72895bcf6f4192dc412998d"},{"suffix":64,"currentValue":null,"newValue":"0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac"},{"suffix":128,"currentValue":null,"newValue":"0x006080604052348015600f57600080fd5b506004361060285760003560e01c80"},{"suffix":129,"currentValue":null,"newValue":"0x006381ca91d314602d575b600080fd5b60336047565b604051603e9190605a56"},{"suffix":130,"currentValue":null,"newValue":"0x005b60405180910390f35b60005481565b6054816073565b82525050565b6000"},{"suffix":131,"currentValue":null,"newValue":"0x00602082019050606d6000830184604d565b92915050565b6000819050919050"},{"suffix":132,"currentValue":null,"newValue":"0x0056fea26469706673582212209bff7098a2f526de1ad499866f27d6d0d6f17b"},{"suffix":133,"currentValue":null,"newValue":"0x0174a413036d6063ca6a0998ca4264736f6c6343000807003300000000000000"}],"prePeriod":0},{"stem":"0x5b5fdfedd6a0e932da408ac7d772a36513d1eee9b9926e52620c43a433aad7","suffixDiffs":[{"suffix":65,"currentValue":null,"newValue":"0x9cd8e265f03adee194fdf0147fa40270562586418c8a4e3bf9e8dbe5f3a41cd8"}],"prePeriod":0},{"stem":"0xcf5a147cace4cfb354948c7dd4e7f3e9e0ca2d2bc9e5ab40aa17e1b2de6eed","suffixDiffs":[{"suffix":0,"currentValue":null,"newValue":"0x00000000000000b6000000000000000100000000000000000000000000000000"},{"suffix":1,"currentValue":null,"newValue":"0xc13691f74686a63a183168600bde00cbd5748529bbb12949e384b17398e4557a"},{"suffix":128,"currentValue":null,"newValue":"0x006080604052348015600f57600080fd5b506004361060285760003560e01c80"},{"suffix":129,"currentValue":null,"newValue":"0x0063ab5ed15014602d575b600080fd5b60336047565b604051603e9190605d56"},{"suffix":130,"currentValue":null,"newValue":"0x005b60405180910390f35b60006001905090565b6057816076565b8252505056"},{"suffix":131,"currentValue":null,"newValue":"0x005b6000602082019050607060008301846050565b92915050565b6000819050"},{"suffix":132,"currentValue":null,"newValue":"0x0091905056fea26469706673582212203a14eb0d5cd07c277d3e24912f110ddd"},{"suffix":133,"currentValue":null,"newValue":"0x14a3e553245a99afc4eeefb2fbae5327aa64736f6c6343000807003300000000"}],"prePeriod":0}]] \ No newline at end of file diff --git a/core/output/traces.jsonl b/core/output/traces.jsonl new file mode 100644 index 000000000000..3f610b7c1274 --- /dev/null +++ b/core/output/traces.jsonl @@ -0,0 +1,529 @@ +{"output":"","gasUsed":"0x0"} +{"output":"","gasUsed":"0x0"} +{"output":"","gasUsed":"0x0"} +{"output":"","gasUsed":"0x0"} +{"output":"","gasUsed":"0x0"} +{"output":"","gasUsed":"0x0"} +{"pc":0,"op":96,"gas":"0x2cdd9e","gasCost":"0x3","memSize":0,"stack":[],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":2,"op":96,"gas":"0x2cdd9b","gasCost":"0x3","memSize":0,"stack":["0x60"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":4,"op":82,"gas":"0x2cdd98","gasCost":"0xc","memSize":0,"stack":["0x60","0x40"],"depth":1,"refund":0,"opName":"MSTORE"} +{"pc":5,"op":96,"gas":"0x2cdd8c","gasCost":"0x3","memSize":96,"stack":[],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":7,"op":128,"gas":"0x2cdd89","gasCost":"0x3","memSize":96,"stack":["0xa"],"depth":1,"refund":0,"opName":"DUP1"} +{"pc":8,"op":96,"gas":"0x2cdd86","gasCost":"0x3","memSize":96,"stack":["0xa","0xa"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":10,"op":96,"gas":"0x2cdd83","gasCost":"0x3","memSize":96,"stack":["0xa","0xa","0x10"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":12,"op":57,"gas":"0x2cdd80","gasCost":"0x6","memSize":96,"stack":["0xa","0xa","0x10","0x0"],"depth":1,"refund":0,"opName":"CODECOPY"} +{"pc":13,"op":96,"gas":"0x2cdd7a","gasCost":"0x3","memSize":96,"stack":["0xa"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":15,"op":243,"gas":"0x2cdd77","gasCost":"0x0","memSize":96,"stack":["0xa","0x0"],"depth":1,"refund":0,"opName":"RETURN"} +{"output":"60606040526008565b00","gasUsed":"0x2e3"} +{"pc":0,"op":96,"gas":"0x2c72ba","gasCost":"0x3","memSize":0,"stack":[],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":2,"op":96,"gas":"0x2c72b7","gasCost":"0x3","memSize":0,"stack":["0x80"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":4,"op":82,"gas":"0x2c72b4","gasCost":"0xc","memSize":0,"stack":["0x80","0x40"],"depth":1,"refund":0,"opName":"MSTORE"} +{"pc":5,"op":96,"gas":"0x2c72a8","gasCost":"0x3","memSize":96,"stack":[],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":7,"op":81,"gas":"0x2c72a5","gasCost":"0x3","memSize":96,"stack":["0x40"],"depth":1,"refund":0,"opName":"MLOAD"} +{"pc":8,"op":97,"gas":"0x2c72a2","gasCost":"0x3","memSize":96,"stack":["0x80"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":11,"op":144,"gas":"0x2c729f","gasCost":"0x3","memSize":96,"stack":["0x80","0x10"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":12,"op":97,"gas":"0x2c729c","gasCost":"0x3","memSize":96,"stack":["0x10","0x80"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":15,"op":86,"gas":"0x2c7299","gasCost":"0x8","memSize":96,"stack":["0x10","0x80","0x17b"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":379,"op":91,"gas":"0x2c7291","gasCost":"0x1","memSize":96,"stack":["0x10","0x80"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":380,"op":96,"gas":"0x2c7290","gasCost":"0x3","memSize":96,"stack":["0x10","0x80"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":382,"op":128,"gas":"0x2c728d","gasCost":"0x3","memSize":96,"stack":["0x10","0x80","0xd5"],"depth":1,"refund":0,"opName":"DUP1"} +{"pc":383,"op":97,"gas":"0x2c728a","gasCost":"0x3","memSize":96,"stack":["0x10","0x80","0xd5","0xd5"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":386,"op":131,"gas":"0x2c7287","gasCost":"0x3","memSize":96,"stack":["0x10","0x80","0xd5","0xd5","0x467"],"depth":1,"refund":0,"opName":"DUP4"} +{"pc":387,"op":57,"gas":"0x2c7284","gasCost":"0x30","memSize":96,"stack":["0x10","0x80","0xd5","0xd5","0x467","0x80"],"depth":1,"refund":0,"opName":"CODECOPY"} +{"pc":388,"op":1,"gas":"0x2c7254","gasCost":"0x3","memSize":352,"stack":["0x10","0x80","0xd5"],"depth":1,"refund":0,"opName":"ADD"} +{"pc":389,"op":144,"gas":"0x2c7251","gasCost":"0x3","memSize":352,"stack":["0x10","0x155"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":390,"op":86,"gas":"0x2c724e","gasCost":"0x8","memSize":352,"stack":["0x155","0x10"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":16,"op":91,"gas":"0x2c7246","gasCost":"0x1","memSize":352,"stack":["0x155"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":17,"op":96,"gas":"0x2c7245","gasCost":"0x3","memSize":352,"stack":["0x155"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":19,"op":81,"gas":"0x2c7242","gasCost":"0x3","memSize":352,"stack":["0x155","0x40"],"depth":1,"refund":0,"opName":"MLOAD"} +{"pc":20,"op":128,"gas":"0x2c723f","gasCost":"0x3","memSize":352,"stack":["0x155","0x80"],"depth":1,"refund":0,"opName":"DUP1"} +{"pc":21,"op":145,"gas":"0x2c723c","gasCost":"0x3","memSize":352,"stack":["0x155","0x80","0x80"],"depth":1,"refund":0,"opName":"SWAP2"} +{"pc":22,"op":3,"gas":"0x2c7239","gasCost":"0x3","memSize":352,"stack":["0x80","0x80","0x155"],"depth":1,"refund":0,"opName":"SUB"} +{"pc":23,"op":144,"gas":"0x2c7236","gasCost":"0x3","memSize":352,"stack":["0x80","0xd5"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":24,"op":96,"gas":"0x2c7233","gasCost":"0x3","memSize":352,"stack":["0xd5","0x80"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":26,"op":240,"gas":"0x2c7230","gasCost":"0x3f6","memSize":352,"stack":["0xd5","0x80","0x0"],"depth":1,"refund":0,"opName":"CREATE"} +{"pc":0,"op":96,"gas":"0x2ba3e6","gasCost":"0x3","memSize":0,"stack":[],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":2,"op":96,"gas":"0x2ba3e3","gasCost":"0x3","memSize":0,"stack":["0x80"],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":4,"op":82,"gas":"0x2ba3e0","gasCost":"0xc","memSize":0,"stack":["0x80","0x40"],"depth":2,"refund":0,"opName":"MSTORE"} +{"pc":5,"op":52,"gas":"0x2ba3d4","gasCost":"0x2","memSize":96,"stack":[],"depth":2,"refund":0,"opName":"CALLVALUE"} +{"pc":6,"op":128,"gas":"0x2ba3d2","gasCost":"0x3","memSize":96,"stack":["0x0"],"depth":2,"refund":0,"opName":"DUP1"} +{"pc":7,"op":21,"gas":"0x2ba3cf","gasCost":"0x3","memSize":96,"stack":["0x0","0x0"],"depth":2,"refund":0,"opName":"ISZERO"} +{"pc":8,"op":97,"gas":"0x2ba3cc","gasCost":"0x3","memSize":96,"stack":["0x0","0x1"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":11,"op":87,"gas":"0x2ba3c9","gasCost":"0xa","memSize":96,"stack":["0x0","0x1","0x10"],"depth":2,"refund":0,"opName":"JUMPI"} +{"pc":16,"op":91,"gas":"0x2ba3bf","gasCost":"0x1","memSize":96,"stack":["0x0"],"depth":2,"refund":0,"opName":"JUMPDEST"} +{"pc":17,"op":80,"gas":"0x2ba3be","gasCost":"0x2","memSize":96,"stack":["0x0"],"depth":2,"refund":0,"opName":"POP"} +{"pc":18,"op":96,"gas":"0x2ba3bc","gasCost":"0x3","memSize":96,"stack":[],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":20,"op":128,"gas":"0x2ba3b9","gasCost":"0x3","memSize":96,"stack":["0xb6"],"depth":2,"refund":0,"opName":"DUP1"} +{"pc":21,"op":97,"gas":"0x2ba3b6","gasCost":"0x3","memSize":96,"stack":["0xb6","0xb6"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":24,"op":96,"gas":"0x2ba3b3","gasCost":"0x3","memSize":96,"stack":["0xb6","0xb6","0x1f"],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":26,"op":57,"gas":"0x2ba3b0","gasCost":"0x1e","memSize":96,"stack":["0xb6","0xb6","0x1f","0x0"],"depth":2,"refund":0,"opName":"CODECOPY"} +{"pc":27,"op":96,"gas":"0x2ba392","gasCost":"0x3","memSize":192,"stack":["0xb6"],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":29,"op":243,"gas":"0x2ba38f","gasCost":"0x0","memSize":192,"stack":["0xb6","0x0"],"depth":2,"refund":0,"opName":"RETURN"} +{"pc":27,"op":128,"gas":"0x2c44df","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"DUP1"} +{"pc":28,"op":21,"gas":"0x2c44dc","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"ISZERO"} +{"pc":29,"op":128,"gas":"0x2c44d9","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0"],"depth":1,"refund":0,"opName":"DUP1"} +{"pc":30,"op":21,"gas":"0x2c44d6","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x0"],"depth":1,"refund":0,"opName":"ISZERO"} +{"pc":31,"op":97,"gas":"0x2c44d3","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x1"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":34,"op":87,"gas":"0x2c44d0","gasCost":"0xa","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x1","0x2c"],"depth":1,"refund":0,"opName":"JUMPI"} +{"pc":44,"op":91,"gas":"0x2c44c6","gasCost":"0x1","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":45,"op":80,"gas":"0x2c44c5","gasCost":"0x2","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0"],"depth":1,"refund":0,"opName":"POP"} +{"pc":46,"op":96,"gas":"0x2c44c3","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":48,"op":128,"gas":"0x2c44c0","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0"],"depth":1,"refund":0,"opName":"DUP1"} +{"pc":49,"op":97,"gas":"0x2c44bd","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x0"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":52,"op":10,"gas":"0x2c44ba","gasCost":"0xa","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x0","0x100"],"depth":1,"refund":0,"opName":"EXP"} +{"pc":53,"op":129,"gas":"0x2c44b0","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x1"],"depth":1,"refund":0,"opName":"DUP2"} +{"pc":54,"op":84,"gas":"0x2c44ad","gasCost":"0xc8","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x1","0x0"],"depth":1,"refund":0,"opName":"SLOAD"} +{"pc":55,"op":129,"gas":"0x2c43e5","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x1","0x0"],"depth":1,"refund":0,"opName":"DUP2"} +{"pc":56,"op":115,"gas":"0x2c43e2","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x1","0x0","0x1"],"depth":1,"refund":0,"opName":"PUSH20"} +{"pc":77,"op":2,"gas":"0x2c43df","gasCost":"0x5","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x1","0x0","0x1","0xffffffffffffffffffffffffffffffffffffffff"],"depth":1,"refund":0,"opName":"MUL"} +{"pc":78,"op":25,"gas":"0x2c43da","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x1","0x0","0xffffffffffffffffffffffffffffffffffffffff"],"depth":1,"refund":0,"opName":"NOT"} +{"pc":79,"op":22,"gas":"0x2c43d7","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x1","0x0","0xffffffffffffffffffffffff0000000000000000000000000000000000000000"],"depth":1,"refund":0,"opName":"AND"} +{"pc":80,"op":144,"gas":"0x2c43d4","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x1","0x0"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":81,"op":131,"gas":"0x2c43d1","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x0","0x1"],"depth":1,"refund":0,"opName":"DUP4"} +{"pc":82,"op":115,"gas":"0x2c43ce","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x0","0x1","0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"PUSH20"} +{"pc":103,"op":22,"gas":"0x2c43cb","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x0","0x1","0xf2cc432c8892c12eede08774adfd63df6f49282","0xffffffffffffffffffffffffffffffffffffffff"],"depth":1,"refund":0,"opName":"AND"} +{"pc":104,"op":2,"gas":"0x2c43c8","gasCost":"0x5","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x0","0x1","0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"MUL"} +{"pc":105,"op":23,"gas":"0x2c43c3","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x0","0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"OR"} +{"pc":106,"op":144,"gas":"0x2c43c0","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":107,"op":85,"gas":"0x2c43bd","gasCost":"0x1f4","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0xf2cc432c8892c12eede08774adfd63df6f49282","0x0"],"depth":1,"refund":0,"opName":"SSTORE"} +{"pc":108,"op":80,"gas":"0x2c41c9","gasCost":"0x2","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"POP"} +{"pc":109,"op":52,"gas":"0x2c41c7","gasCost":"0x2","memSize":352,"stack":[],"depth":1,"refund":0,"opName":"CALLVALUE"} +{"pc":110,"op":128,"gas":"0x2c41c5","gasCost":"0x3","memSize":352,"stack":["0x0"],"depth":1,"refund":0,"opName":"DUP1"} +{"pc":111,"op":21,"gas":"0x2c41c2","gasCost":"0x3","memSize":352,"stack":["0x0","0x0"],"depth":1,"refund":0,"opName":"ISZERO"} +{"pc":112,"op":97,"gas":"0x2c41bf","gasCost":"0x3","memSize":352,"stack":["0x0","0x1"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":115,"op":87,"gas":"0x2c41bc","gasCost":"0xa","memSize":352,"stack":["0x0","0x1","0x78"],"depth":1,"refund":0,"opName":"JUMPI"} +{"pc":120,"op":91,"gas":"0x2c41b2","gasCost":"0x1","memSize":352,"stack":["0x0"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":121,"op":80,"gas":"0x2c41b1","gasCost":"0x2","memSize":352,"stack":["0x0"],"depth":1,"refund":0,"opName":"POP"} +{"pc":122,"op":96,"gas":"0x2c41af","gasCost":"0x3","memSize":352,"stack":[],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":124,"op":128,"gas":"0x2c41ac","gasCost":"0x3","memSize":352,"stack":["0x0"],"depth":1,"refund":0,"opName":"DUP1"} +{"pc":125,"op":103,"gas":"0x2c41a9","gasCost":"0x3","memSize":352,"stack":["0x0","0x0"],"depth":1,"refund":0,"opName":"PUSH8"} +{"pc":134,"op":129,"gas":"0x2c41a6","gasCost":"0x3","memSize":352,"stack":["0x0","0x0","0xffffffffffffffff"],"depth":1,"refund":0,"opName":"DUP2"} +{"pc":135,"op":17,"gas":"0x2c41a3","gasCost":"0x3","memSize":352,"stack":["0x0","0x0","0xffffffffffffffff","0x0"],"depth":1,"refund":0,"opName":"GT"} +{"pc":136,"op":21,"gas":"0x2c41a0","gasCost":"0x3","memSize":352,"stack":["0x0","0x0","0x0"],"depth":1,"refund":0,"opName":"ISZERO"} +{"pc":137,"op":97,"gas":"0x2c419d","gasCost":"0x3","memSize":352,"stack":["0x0","0x0","0x1"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":140,"op":87,"gas":"0x2c419a","gasCost":"0xa","memSize":352,"stack":["0x0","0x0","0x1","0x95"],"depth":1,"refund":0,"opName":"JUMPI"} +{"pc":149,"op":91,"gas":"0x2c4190","gasCost":"0x1","memSize":352,"stack":["0x0","0x0"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":150,"op":96,"gas":"0x2c418f","gasCost":"0x3","memSize":352,"stack":["0x0","0x0"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":152,"op":81,"gas":"0x2c418c","gasCost":"0x3","memSize":352,"stack":["0x0","0x0","0x40"],"depth":1,"refund":0,"opName":"MLOAD"} +{"pc":153,"op":144,"gas":"0x2c4189","gasCost":"0x3","memSize":352,"stack":["0x0","0x0","0x80"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":154,"op":128,"gas":"0x2c4186","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0"],"depth":1,"refund":0,"opName":"DUP1"} +{"pc":155,"op":130,"gas":"0x2c4183","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0x0"],"depth":1,"refund":0,"opName":"DUP3"} +{"pc":156,"op":82,"gas":"0x2c4180","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0x0","0x80"],"depth":1,"refund":0,"opName":"MSTORE"} +{"pc":157,"op":128,"gas":"0x2c417d","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0"],"depth":1,"refund":0,"opName":"DUP1"} +{"pc":158,"op":96,"gas":"0x2c417a","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0x0"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":160,"op":1,"gas":"0x2c4177","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0x0","0x1f"],"depth":1,"refund":0,"opName":"ADD"} +{"pc":161,"op":96,"gas":"0x2c4174","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0x1f"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":163,"op":25,"gas":"0x2c4171","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0x1f","0x1f"],"depth":1,"refund":0,"opName":"NOT"} +{"pc":164,"op":22,"gas":"0x2c416e","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0x1f","0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"],"depth":1,"refund":0,"opName":"AND"} +{"pc":165,"op":96,"gas":"0x2c416b","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0x0"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":167,"op":1,"gas":"0x2c4168","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0x0","0x20"],"depth":1,"refund":0,"opName":"ADD"} +{"pc":168,"op":130,"gas":"0x2c4165","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0x20"],"depth":1,"refund":0,"opName":"DUP3"} +{"pc":169,"op":1,"gas":"0x2c4162","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0x20","0x80"],"depth":1,"refund":0,"opName":"ADD"} +{"pc":170,"op":96,"gas":"0x2c415f","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0xa0"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":172,"op":82,"gas":"0x2c415c","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0xa0","0x40"],"depth":1,"refund":0,"opName":"MSTORE"} +{"pc":173,"op":128,"gas":"0x2c4159","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0"],"depth":1,"refund":0,"opName":"DUP1"} +{"pc":174,"op":21,"gas":"0x2c4156","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0x0"],"depth":1,"refund":0,"opName":"ISZERO"} +{"pc":175,"op":97,"gas":"0x2c4153","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0x1"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":178,"op":87,"gas":"0x2c4150","gasCost":"0xa","memSize":352,"stack":["0x0","0x80","0x0","0x1","0xc7"],"depth":1,"refund":0,"opName":"JUMPI"} +{"pc":199,"op":91,"gas":"0x2c4146","gasCost":"0x1","memSize":352,"stack":["0x0","0x80","0x0"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":200,"op":80,"gas":"0x2c4145","gasCost":"0x2","memSize":352,"stack":["0x0","0x80","0x0"],"depth":1,"refund":0,"opName":"POP"} +{"pc":201,"op":144,"gas":"0x2c4143","gasCost":"0x3","memSize":352,"stack":["0x0","0x80"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":202,"op":80,"gas":"0x2c4140","gasCost":"0x2","memSize":352,"stack":["0x80","0x0"],"depth":1,"refund":0,"opName":"POP"} +{"pc":203,"op":96,"gas":"0x2c413e","gasCost":"0x3","memSize":352,"stack":["0x80"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":205,"op":128,"gas":"0x2c413b","gasCost":"0x3","memSize":352,"stack":["0x80","0x0"],"depth":1,"refund":0,"opName":"DUP1"} +{"pc":206,"op":96,"gas":"0x2c4138","gasCost":"0x3","memSize":352,"stack":["0x80","0x0","0x0"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":208,"op":144,"gas":"0x2c4135","gasCost":"0x3","memSize":352,"stack":["0x80","0x0","0x0","0x0"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":209,"op":84,"gas":"0x2c4132","gasCost":"0x64","memSize":352,"stack":["0x80","0x0","0x0","0x0"],"depth":1,"refund":0,"opName":"SLOAD"} +{"pc":210,"op":144,"gas":"0x2c40ce","gasCost":"0x3","memSize":352,"stack":["0x80","0x0","0x0","0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":211,"op":97,"gas":"0x2c40cb","gasCost":"0x3","memSize":352,"stack":["0x80","0x0","0xf2cc432c8892c12eede08774adfd63df6f49282","0x0"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":214,"op":10,"gas":"0x2c40c8","gasCost":"0xa","memSize":352,"stack":["0x80","0x0","0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x100"],"depth":1,"refund":0,"opName":"EXP"} +{"pc":215,"op":144,"gas":"0x2c40be","gasCost":"0x3","memSize":352,"stack":["0x80","0x0","0xf2cc432c8892c12eede08774adfd63df6f49282","0x1"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":216,"op":4,"gas":"0x2c40bb","gasCost":"0x5","memSize":352,"stack":["0x80","0x0","0x1","0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"DIV"} +{"pc":217,"op":115,"gas":"0x2c40b6","gasCost":"0x3","memSize":352,"stack":["0x80","0x0","0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"PUSH20"} +{"pc":238,"op":22,"gas":"0x2c40b3","gasCost":"0x3","memSize":352,"stack":["0x80","0x0","0xf2cc432c8892c12eede08774adfd63df6f49282","0xffffffffffffffffffffffffffffffffffffffff"],"depth":1,"refund":0,"opName":"AND"} +{"pc":239,"op":144,"gas":"0x2c40b0","gasCost":"0x3","memSize":352,"stack":["0x80","0x0","0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":240,"op":80,"gas":"0x2c40ad","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x0"],"depth":1,"refund":0,"opName":"POP"} +{"pc":241,"op":96,"gas":"0x2c40ab","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":243,"op":96,"gas":"0x2c40a8","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x20"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":245,"op":131,"gas":"0x2c40a5","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x20","0x0"],"depth":1,"refund":0,"opName":"DUP4"} +{"pc":246,"op":131,"gas":"0x2c40a2","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x20","0x0","0x80"],"depth":1,"refund":0,"opName":"DUP4"} +{"pc":247,"op":60,"gas":"0x2c409f","gasCost":"0x67","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x20","0x0","0x80","0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"EXTCODECOPY"} +{"pc":248,"op":129,"gas":"0x2c4038","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"DUP2"} +{"pc":249,"op":97,"gas":"0x2c4035","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":252,"op":144,"gas":"0x2c4032","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80","0x101"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":253,"op":97,"gas":"0x2c402f","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":256,"op":86,"gas":"0x2c402c","gasCost":"0x8","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x1e3"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":483,"op":91,"gas":"0x2c4024","gasCost":"0x1","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":484,"op":96,"gas":"0x2c4023","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":486,"op":97,"gas":"0x2c4020","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":489,"op":130,"gas":"0x2c401d","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x1ee"],"depth":1,"refund":0,"opName":"DUP3"} +{"pc":490,"op":97,"gas":"0x2c401a","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x1ee","0x80"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":493,"op":86,"gas":"0x2c4017","gasCost":"0x8","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x1ee","0x80","0x1ce"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":462,"op":91,"gas":"0x2c400f","gasCost":"0x1","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x1ee","0x80"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":463,"op":96,"gas":"0x2c400e","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x1ee","0x80"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":465,"op":129,"gas":"0x2c400b","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x1ee","0x80","0x0"],"depth":1,"refund":0,"opName":"DUP2"} +{"pc":466,"op":81,"gas":"0x2c4008","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x1ee","0x80","0x0","0x80"],"depth":1,"refund":0,"opName":"MLOAD"} +{"pc":467,"op":144,"gas":"0x2c4005","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x1ee","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":468,"op":80,"gas":"0x2c4002","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x1ee","0x80","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x0"],"depth":1,"refund":0,"opName":"POP"} +{"pc":469,"op":145,"gas":"0x2c4000","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x1ee","0x80","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063"],"depth":1,"refund":0,"opName":"SWAP2"} +{"pc":470,"op":144,"gas":"0x2c3ffd","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1ee"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":471,"op":80,"gas":"0x2c3ffa","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x1ee","0x80"],"depth":1,"refund":0,"opName":"POP"} +{"pc":472,"op":86,"gas":"0x2c3ff8","gasCost":"0x8","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x1ee"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":494,"op":91,"gas":"0x2c3ff0","gasCost":"0x1","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":495,"op":130,"gas":"0x2c3fef","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063"],"depth":1,"refund":0,"opName":"DUP3"} +{"pc":496,"op":97,"gas":"0x2c3fec","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":499,"op":132,"gas":"0x2c3fe9","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8"],"depth":1,"refund":0,"opName":"DUP5"} +{"pc":500,"op":97,"gas":"0x2c3fe6","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8","0x80"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":503,"op":86,"gas":"0x2c3fe3","gasCost":"0x8","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8","0x80","0x1be"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":446,"op":91,"gas":"0x2c3fdb","gasCost":"0x1","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8","0x80"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":447,"op":96,"gas":"0x2c3fda","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8","0x80"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":449,"op":129,"gas":"0x2c3fd7","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8","0x80","0x0"],"depth":1,"refund":0,"opName":"DUP2"} +{"pc":450,"op":144,"gas":"0x2c3fd4","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8","0x80","0x0","0x80"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":451,"op":80,"gas":"0x2c3fd1","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8","0x80","0x80","0x0"],"depth":1,"refund":0,"opName":"POP"} +{"pc":452,"op":96,"gas":"0x2c3fcf","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8","0x80","0x80"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":454,"op":130,"gas":"0x2c3fcc","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8","0x80","0x80","0x20"],"depth":1,"refund":0,"opName":"DUP3"} +{"pc":455,"op":1,"gas":"0x2c3fc9","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8","0x80","0x80","0x20","0x80"],"depth":1,"refund":0,"opName":"ADD"} +{"pc":456,"op":144,"gas":"0x2c3fc6","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8","0x80","0x80","0xa0"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":457,"op":80,"gas":"0x2c3fc3","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8","0x80","0xa0","0x80"],"depth":1,"refund":0,"opName":"POP"} +{"pc":458,"op":145,"gas":"0x2c3fc1","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8","0x80","0xa0"],"depth":1,"refund":0,"opName":"SWAP2"} +{"pc":459,"op":144,"gas":"0x2c3fbe","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0xa0","0x80","0x1f8"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":460,"op":80,"gas":"0x2c3fbb","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0xa0","0x1f8","0x80"],"depth":1,"refund":0,"opName":"POP"} +{"pc":461,"op":86,"gas":"0x2c3fb9","gasCost":"0x8","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0xa0","0x1f8"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":504,"op":91,"gas":"0x2c3fb1","gasCost":"0x1","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0xa0"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":505,"op":144,"gas":"0x2c3fb0","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0xa0"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":506,"op":80,"gas":"0x2c3fad","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x80"],"depth":1,"refund":0,"opName":"POP"} +{"pc":507,"op":97,"gas":"0x2c3fab","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":510,"op":129,"gas":"0x2c3fa8","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203"],"depth":1,"refund":0,"opName":"DUP2"} +{"pc":511,"op":97,"gas":"0x2c3fa5","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":514,"op":86,"gas":"0x2c3fa2","gasCost":"0x8","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x279"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":633,"op":91,"gas":"0x2c3f9a","gasCost":"0x1","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":634,"op":96,"gas":"0x2c3f99","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":636,"op":97,"gas":"0x2c3f96","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":639,"op":130,"gas":"0x2c3f93","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x285"],"depth":1,"refund":0,"opName":"DUP3"} +{"pc":640,"op":81,"gas":"0x2c3f90","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x285","0xa0"],"depth":1,"refund":0,"opName":"MLOAD"} +{"pc":641,"op":97,"gas":"0x2c3f8d","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x285","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":644,"op":86,"gas":"0x2c3f8a","gasCost":"0x8","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x285","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x1d9"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":473,"op":91,"gas":"0x2c3f82","gasCost":"0x1","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x285","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":474,"op":96,"gas":"0x2c3f81","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x285","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":476,"op":129,"gas":"0x2c3f7e","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x285","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":1,"refund":0,"opName":"DUP2"} +{"pc":477,"op":144,"gas":"0x2c3f7b","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x285","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":478,"op":80,"gas":"0x2c3f78","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x285","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":1,"refund":0,"opName":"POP"} +{"pc":479,"op":145,"gas":"0x2c3f76","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x285","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"SWAP2"} +{"pc":480,"op":144,"gas":"0x2c3f73","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x285"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":481,"op":80,"gas":"0x2c3f70","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x285","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"POP"} +{"pc":482,"op":86,"gas":"0x2c3f6e","gasCost":"0x8","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x285"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":645,"op":91,"gas":"0x2c3f66","gasCost":"0x1","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":646,"op":128,"gas":"0x2c3f65","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"DUP1"} +{"pc":647,"op":145,"gas":"0x2c3f62","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"SWAP2"} +{"pc":648,"op":80,"gas":"0x2c3f5f","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":1,"refund":0,"opName":"POP"} +{"pc":649,"op":80,"gas":"0x2c3f5d","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"POP"} +{"pc":650,"op":145,"gas":"0x2c3f5b","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"SWAP2"} +{"pc":651,"op":144,"gas":"0x2c3f58","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0xa0","0x203"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":652,"op":80,"gas":"0x2c3f55","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x203","0xa0"],"depth":1,"refund":0,"opName":"POP"} +{"pc":653,"op":86,"gas":"0x2c3f53","gasCost":"0x8","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x203"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":515,"op":91,"gas":"0x2c3f4b","gasCost":"0x1","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":516,"op":146,"gas":"0x2c3f4a","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"SWAP3"} +{"pc":517,"op":80,"gas":"0x2c3f47","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x0"],"depth":1,"refund":0,"opName":"POP"} +{"pc":518,"op":96,"gas":"0x2c3f45","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":520,"op":130,"gas":"0x2c3f42","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x20"],"depth":1,"refund":0,"opName":"DUP3"} +{"pc":521,"op":16,"gas":"0x2c3f3f","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x20","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063"],"depth":1,"refund":0,"opName":"LT"} +{"pc":522,"op":21,"gas":"0x2c3f3c","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x0"],"depth":1,"refund":0,"opName":"ISZERO"} +{"pc":523,"op":97,"gas":"0x2c3f39","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x1"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":526,"op":87,"gas":"0x2c3f36","gasCost":"0xa","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x1","0x243"],"depth":1,"refund":0,"opName":"JUMPI"} +{"pc":579,"op":91,"gas":"0x2c3f2c","gasCost":"0x1","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":580,"op":80,"gas":"0x2c3f2b","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0"],"depth":1,"refund":0,"opName":"POP"} +{"pc":581,"op":80,"gas":"0x2c3f29","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063"],"depth":1,"refund":0,"opName":"POP"} +{"pc":582,"op":145,"gas":"0x2c3f27","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"SWAP2"} +{"pc":583,"op":144,"gas":"0x2c3f24","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80","0x101"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":584,"op":80,"gas":"0x2c3f21","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x101","0x80"],"depth":1,"refund":0,"opName":"POP"} +{"pc":585,"op":86,"gas":"0x2c3f1f","gasCost":"0x8","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x101"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":257,"op":91,"gas":"0x2c3f17","gasCost":"0x1","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":258,"op":96,"gas":"0x2c3f16","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":260,"op":81,"gas":"0x2c3f13","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x40"],"depth":1,"refund":0,"opName":"MLOAD"} +{"pc":261,"op":97,"gas":"0x2c3f10","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0xa0"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":264,"op":144,"gas":"0x2c3f0d","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0xa0","0x10d"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":265,"op":97,"gas":"0x2c3f0a","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x10d","0xa0"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":268,"op":86,"gas":"0x2c3f07","gasCost":"0x8","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x10d","0xa0","0x187"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":391,"op":91,"gas":"0x2c3eff","gasCost":"0x1","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x10d","0xa0"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":392,"op":97,"gas":"0x2c3efe","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x10d","0xa0"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":395,"op":128,"gas":"0x2c3efb","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x10d","0xa0","0x206"],"depth":1,"refund":0,"opName":"DUP1"} +{"pc":396,"op":97,"gas":"0x2c3ef8","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x10d","0xa0","0x206","0x206"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":399,"op":131,"gas":"0x2c3ef5","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x10d","0xa0","0x206","0x206","0x53c"],"depth":1,"refund":0,"opName":"DUP4"} +{"pc":400,"op":57,"gas":"0x2c3ef2","gasCost":"0x57","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x10d","0xa0","0x206","0x206","0x53c","0xa0"],"depth":1,"refund":0,"opName":"CODECOPY"} +{"pc":401,"op":1,"gas":"0x2c3e9b","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x10d","0xa0","0x206"],"depth":1,"refund":0,"opName":"ADD"} +{"pc":402,"op":144,"gas":"0x2c3e98","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x10d","0x2a6"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":403,"op":86,"gas":"0x2c3e95","gasCost":"0x8","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x10d"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":269,"op":91,"gas":"0x2c3e8d","gasCost":"0x1","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":270,"op":97,"gas":"0x2c3e8c","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":273,"op":145,"gas":"0x2c3e89","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x117"],"depth":1,"refund":0,"opName":"SWAP2"} +{"pc":274,"op":144,"gas":"0x2c3e86","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":275,"op":97,"gas":"0x2c3e83","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":278,"op":86,"gas":"0x2c3e80","gasCost":"0x8","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x1a3"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":419,"op":91,"gas":"0x2c3e78","gasCost":"0x1","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":420,"op":96,"gas":"0x2c3e77","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":422,"op":96,"gas":"0x2c3e74","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x0"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":424,"op":130,"gas":"0x2c3e71","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x0","0x20"],"depth":1,"refund":0,"opName":"DUP3"} +{"pc":425,"op":1,"gas":"0x2c3e6e","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x0","0x20","0x2a6"],"depth":1,"refund":0,"opName":"ADD"} +{"pc":426,"op":144,"gas":"0x2c3e6b","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x0","0x2c6"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":427,"op":80,"gas":"0x2c3e68","gasCost":"0x2","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x0"],"depth":1,"refund":0,"opName":"POP"} +{"pc":428,"op":97,"gas":"0x2c3e66","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":431,"op":96,"gas":"0x2c3e63","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":433,"op":131,"gas":"0x2c3e60","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x0"],"depth":1,"refund":0,"opName":"DUP4"} +{"pc":434,"op":1,"gas":"0x2c3e5d","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x0","0x2a6"],"depth":1,"refund":0,"opName":"ADD"} +{"pc":435,"op":132,"gas":"0x2c3e5a","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6"],"depth":1,"refund":0,"opName":"DUP5"} +{"pc":436,"op":97,"gas":"0x2c3e57","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":439,"op":86,"gas":"0x2c3e54","gasCost":"0x8","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x194"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":404,"op":91,"gas":"0x2c3e4c","gasCost":"0x1","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":405,"op":97,"gas":"0x2c3e4b","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":408,"op":129,"gas":"0x2c3e48","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x19d"],"depth":1,"refund":0,"opName":"DUP2"} +{"pc":409,"op":97,"gas":"0x2c3e45","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x19d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":412,"op":86,"gas":"0x2c3e42","gasCost":"0x8","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x19d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x1d9"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":473,"op":91,"gas":"0x2c3e3a","gasCost":"0x1","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x19d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":474,"op":96,"gas":"0x2c3e39","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x19d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":476,"op":129,"gas":"0x2c3e36","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x19d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":1,"refund":0,"opName":"DUP2"} +{"pc":477,"op":144,"gas":"0x2c3e33","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x19d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":478,"op":80,"gas":"0x2c3e30","gasCost":"0x2","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x19d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":1,"refund":0,"opName":"POP"} +{"pc":479,"op":145,"gas":"0x2c3e2e","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x19d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"SWAP2"} +{"pc":480,"op":144,"gas":"0x2c3e2b","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x19d"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":481,"op":80,"gas":"0x2c3e28","gasCost":"0x2","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x19d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"POP"} +{"pc":482,"op":86,"gas":"0x2c3e26","gasCost":"0x8","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x19d"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":413,"op":91,"gas":"0x2c3e1e","gasCost":"0x1","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":414,"op":130,"gas":"0x2c3e1d","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"DUP3"} +{"pc":415,"op":82,"gas":"0x2c3e1a","gasCost":"0x7","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6"],"depth":1,"refund":0,"opName":"MSTORE"} +{"pc":416,"op":80,"gas":"0x2c3e13","gasCost":"0x2","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"POP"} +{"pc":417,"op":80,"gas":"0x2c3e11","gasCost":"0x2","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6"],"depth":1,"refund":0,"opName":"POP"} +{"pc":418,"op":86,"gas":"0x2c3e0f","gasCost":"0x8","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":440,"op":91,"gas":"0x2c3e07","gasCost":"0x1","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":441,"op":146,"gas":"0x2c3e06","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6"],"depth":1,"refund":0,"opName":"SWAP3"} +{"pc":442,"op":145,"gas":"0x2c3e03","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x2c6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x117"],"depth":1,"refund":0,"opName":"SWAP2"} +{"pc":443,"op":80,"gas":"0x2c3e00","gasCost":"0x2","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x2c6","0x117","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"POP"} +{"pc":444,"op":80,"gas":"0x2c3dfe","gasCost":"0x2","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x2c6","0x117","0x2a6"],"depth":1,"refund":0,"opName":"POP"} +{"pc":445,"op":86,"gas":"0x2c3dfc","gasCost":"0x8","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x2c6","0x117"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":279,"op":91,"gas":"0x2c3df4","gasCost":"0x1","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x2c6"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":280,"op":96,"gas":"0x2c3df3","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x2c6"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":282,"op":81,"gas":"0x2c3df0","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x2c6","0x40"],"depth":1,"refund":0,"opName":"MLOAD"} +{"pc":283,"op":128,"gas":"0x2c3ded","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x2c6","0xa0"],"depth":1,"refund":0,"opName":"DUP1"} +{"pc":284,"op":145,"gas":"0x2c3dea","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x2c6","0xa0","0xa0"],"depth":1,"refund":0,"opName":"SWAP2"} +{"pc":285,"op":3,"gas":"0x2c3de7","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0xa0","0xa0","0x2c6"],"depth":1,"refund":0,"opName":"SUB"} +{"pc":286,"op":144,"gas":"0x2c3de4","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0xa0","0x226"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":287,"op":96,"gas":"0x2c3de1","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x226","0xa0"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":289,"op":240,"gas":"0x2c3dde","gasCost":"0x40c","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x226","0xa0","0x0"],"depth":1,"refund":0,"opName":"CREATE"} +{"pc":0,"op":96,"gas":"0x2b704f","gasCost":"0x3","memSize":0,"stack":[],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":2,"op":96,"gas":"0x2b704c","gasCost":"0x3","memSize":0,"stack":["0x80"],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":4,"op":82,"gas":"0x2b7049","gasCost":"0xc","memSize":0,"stack":["0x80","0x40"],"depth":2,"refund":0,"opName":"MSTORE"} +{"pc":5,"op":52,"gas":"0x2b703d","gasCost":"0x2","memSize":96,"stack":[],"depth":2,"refund":0,"opName":"CALLVALUE"} +{"pc":6,"op":128,"gas":"0x2b703b","gasCost":"0x3","memSize":96,"stack":["0x0"],"depth":2,"refund":0,"opName":"DUP1"} +{"pc":7,"op":21,"gas":"0x2b7038","gasCost":"0x3","memSize":96,"stack":["0x0","0x0"],"depth":2,"refund":0,"opName":"ISZERO"} +{"pc":8,"op":97,"gas":"0x2b7035","gasCost":"0x3","memSize":96,"stack":["0x0","0x1"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":11,"op":87,"gas":"0x2b7032","gasCost":"0xa","memSize":96,"stack":["0x0","0x1","0x10"],"depth":2,"refund":0,"opName":"JUMPI"} +{"pc":16,"op":91,"gas":"0x2b7028","gasCost":"0x1","memSize":96,"stack":["0x0"],"depth":2,"refund":0,"opName":"JUMPDEST"} +{"pc":17,"op":80,"gas":"0x2b7027","gasCost":"0x2","memSize":96,"stack":["0x0"],"depth":2,"refund":0,"opName":"POP"} +{"pc":18,"op":96,"gas":"0x2b7025","gasCost":"0x3","memSize":96,"stack":[],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":20,"op":81,"gas":"0x2b7022","gasCost":"0x3","memSize":96,"stack":["0x40"],"depth":2,"refund":0,"opName":"MLOAD"} +{"pc":21,"op":97,"gas":"0x2b701f","gasCost":"0x3","memSize":96,"stack":["0x80"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":24,"op":56,"gas":"0x2b701c","gasCost":"0x2","memSize":96,"stack":["0x80","0x206"],"depth":2,"refund":0,"opName":"CODESIZE"} +{"pc":25,"op":3,"gas":"0x2b701a","gasCost":"0x3","memSize":96,"stack":["0x80","0x206","0x226"],"depth":2,"refund":0,"opName":"SUB"} +{"pc":26,"op":128,"gas":"0x2b7017","gasCost":"0x3","memSize":96,"stack":["0x80","0x20"],"depth":2,"refund":0,"opName":"DUP1"} +{"pc":27,"op":97,"gas":"0x2b7014","gasCost":"0x3","memSize":96,"stack":["0x80","0x20","0x20"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":30,"op":131,"gas":"0x2b7011","gasCost":"0x3","memSize":96,"stack":["0x80","0x20","0x20","0x206"],"depth":2,"refund":0,"opName":"DUP4"} +{"pc":31,"op":57,"gas":"0x2b700e","gasCost":"0xc","memSize":96,"stack":["0x80","0x20","0x20","0x206","0x80"],"depth":2,"refund":0,"opName":"CODECOPY"} +{"pc":32,"op":129,"gas":"0x2b7002","gasCost":"0x3","memSize":160,"stack":["0x80","0x20"],"depth":2,"refund":0,"opName":"DUP2"} +{"pc":33,"op":129,"gas":"0x2b6fff","gasCost":"0x3","memSize":160,"stack":["0x80","0x20","0x80"],"depth":2,"refund":0,"opName":"DUP2"} +{"pc":34,"op":1,"gas":"0x2b6ffc","gasCost":"0x3","memSize":160,"stack":["0x80","0x20","0x80","0x20"],"depth":2,"refund":0,"opName":"ADD"} +{"pc":35,"op":96,"gas":"0x2b6ff9","gasCost":"0x3","memSize":160,"stack":["0x80","0x20","0xa0"],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":37,"op":82,"gas":"0x2b6ff6","gasCost":"0x3","memSize":160,"stack":["0x80","0x20","0xa0","0x40"],"depth":2,"refund":0,"opName":"MSTORE"} +{"pc":38,"op":129,"gas":"0x2b6ff3","gasCost":"0x3","memSize":160,"stack":["0x80","0x20"],"depth":2,"refund":0,"opName":"DUP2"} +{"pc":39,"op":1,"gas":"0x2b6ff0","gasCost":"0x3","memSize":160,"stack":["0x80","0x20","0x80"],"depth":2,"refund":0,"opName":"ADD"} +{"pc":40,"op":144,"gas":"0x2b6fed","gasCost":"0x3","memSize":160,"stack":["0x80","0xa0"],"depth":2,"refund":0,"opName":"SWAP1"} +{"pc":41,"op":97,"gas":"0x2b6fea","gasCost":"0x3","memSize":160,"stack":["0xa0","0x80"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":44,"op":145,"gas":"0x2b6fe7","gasCost":"0x3","memSize":160,"stack":["0xa0","0x80","0x32"],"depth":2,"refund":0,"opName":"SWAP2"} +{"pc":45,"op":144,"gas":"0x2b6fe4","gasCost":"0x3","memSize":160,"stack":["0x32","0x80","0xa0"],"depth":2,"refund":0,"opName":"SWAP1"} +{"pc":46,"op":97,"gas":"0x2b6fe1","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":49,"op":86,"gas":"0x2b6fde","gasCost":"0x8","memSize":160,"stack":["0x32","0xa0","0x80","0x63"],"depth":2,"refund":0,"opName":"JUMP"} +{"pc":99,"op":91,"gas":"0x2b6fd6","gasCost":"0x1","memSize":160,"stack":["0x32","0xa0","0x80"],"depth":2,"refund":0,"opName":"JUMPDEST"} +{"pc":100,"op":96,"gas":"0x2b6fd5","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80"],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":102,"op":96,"gas":"0x2b6fd2","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0"],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":104,"op":130,"gas":"0x2b6fcf","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x20"],"depth":2,"refund":0,"opName":"DUP3"} +{"pc":105,"op":132,"gas":"0x2b6fcc","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x20","0x80"],"depth":2,"refund":0,"opName":"DUP5"} +{"pc":106,"op":3,"gas":"0x2b6fc9","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x20","0x80","0xa0"],"depth":2,"refund":0,"opName":"SUB"} +{"pc":107,"op":18,"gas":"0x2b6fc6","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x20","0x20"],"depth":2,"refund":0,"opName":"SLT"} +{"pc":108,"op":21,"gas":"0x2b6fc3","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0"],"depth":2,"refund":0,"opName":"ISZERO"} +{"pc":109,"op":97,"gas":"0x2b6fc0","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x1"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":112,"op":87,"gas":"0x2b6fbd","gasCost":"0xa","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x1","0x79"],"depth":2,"refund":0,"opName":"JUMPI"} +{"pc":121,"op":91,"gas":"0x2b6fb3","gasCost":"0x1","memSize":160,"stack":["0x32","0xa0","0x80","0x0"],"depth":2,"refund":0,"opName":"JUMPDEST"} +{"pc":122,"op":96,"gas":"0x2b6fb2","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0"],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":124,"op":97,"gas":"0x2b6faf","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":127,"op":132,"gas":"0x2b6fac","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87"],"depth":2,"refund":0,"opName":"DUP5"} +{"pc":128,"op":130,"gas":"0x2b6fa9","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0"],"depth":2,"refund":0,"opName":"DUP3"} +{"pc":129,"op":133,"gas":"0x2b6fa6","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x0"],"depth":2,"refund":0,"opName":"DUP6"} +{"pc":130,"op":1,"gas":"0x2b6fa3","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x0","0x80"],"depth":2,"refund":0,"opName":"ADD"} +{"pc":131,"op":97,"gas":"0x2b6fa0","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":134,"op":86,"gas":"0x2b6f9d","gasCost":"0x8","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x4e"],"depth":2,"refund":0,"opName":"JUMP"} +{"pc":78,"op":91,"gas":"0x2b6f95","gasCost":"0x1","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80"],"depth":2,"refund":0,"opName":"JUMPDEST"} +{"pc":79,"op":96,"gas":"0x2b6f94","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80"],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":81,"op":129,"gas":"0x2b6f91","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x0"],"depth":2,"refund":0,"opName":"DUP2"} +{"pc":82,"op":81,"gas":"0x2b6f8e","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x0","0x80"],"depth":2,"refund":0,"opName":"MLOAD"} +{"pc":83,"op":144,"gas":"0x2b6f8b","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"SWAP1"} +{"pc":84,"op":80,"gas":"0x2b6f88","gasCost":"0x2","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":2,"refund":0,"opName":"POP"} +{"pc":85,"op":97,"gas":"0x2b6f86","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":88,"op":129,"gas":"0x2b6f83","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d"],"depth":2,"refund":0,"opName":"DUP2"} +{"pc":89,"op":97,"gas":"0x2b6f80","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":92,"op":86,"gas":"0x2b6f7d","gasCost":"0x8","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x12e"],"depth":2,"refund":0,"opName":"JUMP"} +{"pc":302,"op":91,"gas":"0x2b6f75","gasCost":"0x1","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"JUMPDEST"} +{"pc":303,"op":97,"gas":"0x2b6f74","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":306,"op":129,"gas":"0x2b6f71","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x137"],"depth":2,"refund":0,"opName":"DUP2"} +{"pc":307,"op":97,"gas":"0x2b6f6e","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x137","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":310,"op":86,"gas":"0x2b6f6b","gasCost":"0x8","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x137","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0xe6"],"depth":2,"refund":0,"opName":"JUMP"} +{"pc":230,"op":91,"gas":"0x2b6f63","gasCost":"0x1","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x137","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"JUMPDEST"} +{"pc":231,"op":96,"gas":"0x2b6f62","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x137","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":233,"op":129,"gas":"0x2b6f5f","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x137","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":2,"refund":0,"opName":"DUP2"} +{"pc":234,"op":144,"gas":"0x2b6f5c","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x137","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"SWAP1"} +{"pc":235,"op":80,"gas":"0x2b6f59","gasCost":"0x2","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x137","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":2,"refund":0,"opName":"POP"} +{"pc":236,"op":145,"gas":"0x2b6f57","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x137","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"SWAP2"} +{"pc":237,"op":144,"gas":"0x2b6f54","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x137"],"depth":2,"refund":0,"opName":"SWAP1"} +{"pc":238,"op":80,"gas":"0x2b6f51","gasCost":"0x2","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x137","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"POP"} +{"pc":239,"op":86,"gas":"0x2b6f4f","gasCost":"0x8","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x137"],"depth":2,"refund":0,"opName":"JUMP"} +{"pc":311,"op":91,"gas":"0x2b6f47","gasCost":"0x1","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"JUMPDEST"} +{"pc":312,"op":129,"gas":"0x2b6f46","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"DUP2"} +{"pc":313,"op":20,"gas":"0x2b6f43","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"EQ"} +{"pc":314,"op":97,"gas":"0x2b6f40","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x1"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":317,"op":87,"gas":"0x2b6f3d","gasCost":"0xa","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x1","0x142"],"depth":2,"refund":0,"opName":"JUMPI"} +{"pc":322,"op":91,"gas":"0x2b6f33","gasCost":"0x1","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"JUMPDEST"} +{"pc":323,"op":80,"gas":"0x2b6f32","gasCost":"0x2","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"POP"} +{"pc":324,"op":86,"gas":"0x2b6f30","gasCost":"0x8","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d"],"depth":2,"refund":0,"opName":"JUMP"} +{"pc":93,"op":91,"gas":"0x2b6f28","gasCost":"0x1","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"JUMPDEST"} +{"pc":94,"op":146,"gas":"0x2b6f27","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"SWAP3"} +{"pc":95,"op":145,"gas":"0x2b6f24","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0xa0","0x80","0x87"],"depth":2,"refund":0,"opName":"SWAP2"} +{"pc":96,"op":80,"gas":"0x2b6f21","gasCost":"0x2","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x87","0x80","0xa0"],"depth":2,"refund":0,"opName":"POP"} +{"pc":97,"op":80,"gas":"0x2b6f1f","gasCost":"0x2","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x87","0x80"],"depth":2,"refund":0,"opName":"POP"} +{"pc":98,"op":86,"gas":"0x2b6f1d","gasCost":"0x8","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x87"],"depth":2,"refund":0,"opName":"JUMP"} +{"pc":135,"op":91,"gas":"0x2b6f15","gasCost":"0x1","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"JUMPDEST"} +{"pc":136,"op":145,"gas":"0x2b6f14","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"SWAP2"} +{"pc":137,"op":80,"gas":"0x2b6f11","gasCost":"0x2","memSize":160,"stack":["0x32","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x0"],"depth":2,"refund":0,"opName":"POP"} +{"pc":138,"op":80,"gas":"0x2b6f0f","gasCost":"0x2","memSize":160,"stack":["0x32","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":2,"refund":0,"opName":"POP"} +{"pc":139,"op":146,"gas":"0x2b6f0d","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"SWAP3"} +{"pc":140,"op":145,"gas":"0x2b6f0a","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0xa0","0x80","0x32"],"depth":2,"refund":0,"opName":"SWAP2"} +{"pc":141,"op":80,"gas":"0x2b6f07","gasCost":"0x2","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x32","0x80","0xa0"],"depth":2,"refund":0,"opName":"POP"} +{"pc":142,"op":80,"gas":"0x2b6f05","gasCost":"0x2","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x32","0x80"],"depth":2,"refund":0,"opName":"POP"} +{"pc":143,"op":86,"gas":"0x2b6f03","gasCost":"0x8","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x32"],"depth":2,"refund":0,"opName":"JUMP"} +{"pc":50,"op":91,"gas":"0x2b6efb","gasCost":"0x1","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"JUMPDEST"} +{"pc":51,"op":96,"gas":"0x2b6efa","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":53,"op":129,"gas":"0x2b6ef7","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x1"],"depth":2,"refund":0,"opName":"DUP2"} +{"pc":54,"op":96,"gas":"0x2b6ef4","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":56,"op":28,"gas":"0x2b6ef1","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":2,"refund":0,"opName":"SHR"} +{"pc":57,"op":97,"gas":"0x2b6eee","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":60,"op":145,"gas":"0x2b6eeb","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42"],"depth":2,"refund":0,"opName":"SWAP2"} +{"pc":61,"op":144,"gas":"0x2b6ee8","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x1"],"depth":2,"refund":0,"opName":"SWAP1"} +{"pc":62,"op":97,"gas":"0x2b6ee5","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":65,"op":86,"gas":"0x2b6ee2","gasCost":"0x8","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x90"],"depth":2,"refund":0,"opName":"JUMP"} +{"pc":144,"op":91,"gas":"0x2b6eda","gasCost":"0x1","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"JUMPDEST"} +{"pc":145,"op":96,"gas":"0x2b6ed9","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":147,"op":97,"gas":"0x2b6ed6","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":150,"op":130,"gas":"0x2b6ed3","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x9b"],"depth":2,"refund":0,"opName":"DUP3"} +{"pc":151,"op":97,"gas":"0x2b6ed0","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x9b","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":154,"op":86,"gas":"0x2b6ecd","gasCost":"0x8","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x9b","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0xf0"],"depth":2,"refund":0,"opName":"JUMP"} +{"pc":240,"op":91,"gas":"0x2b6ec5","gasCost":"0x1","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x9b","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"JUMPDEST"} +{"pc":241,"op":96,"gas":"0x2b6ec4","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x9b","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":243,"op":129,"gas":"0x2b6ec1","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x9b","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":2,"refund":0,"opName":"DUP2"} +{"pc":244,"op":144,"gas":"0x2b6ebe","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x9b","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"SWAP1"} +{"pc":245,"op":80,"gas":"0x2b6ebb","gasCost":"0x2","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x9b","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":2,"refund":0,"opName":"POP"} +{"pc":246,"op":145,"gas":"0x2b6eb9","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x9b","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"SWAP2"} +{"pc":247,"op":144,"gas":"0x2b6eb6","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x9b"],"depth":2,"refund":0,"opName":"SWAP1"} +{"pc":248,"op":80,"gas":"0x2b6eb3","gasCost":"0x2","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x9b","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"POP"} +{"pc":249,"op":86,"gas":"0x2b6eb1","gasCost":"0x8","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x9b"],"depth":2,"refund":0,"opName":"JUMP"} +{"pc":155,"op":91,"gas":"0x2b6ea9","gasCost":"0x1","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"JUMPDEST"} +{"pc":156,"op":145,"gas":"0x2b6ea8","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"SWAP2"} +{"pc":157,"op":80,"gas":"0x2b6ea5","gasCost":"0x2","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"POP"} +{"pc":158,"op":97,"gas":"0x2b6ea3","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":161,"op":131,"gas":"0x2b6ea0","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0xa6"],"depth":2,"refund":0,"opName":"DUP4"} +{"pc":162,"op":97,"gas":"0x2b6e9d","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0xa6","0x1"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":165,"op":86,"gas":"0x2b6e9a","gasCost":"0x8","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0xa6","0x1","0xf0"],"depth":2,"refund":0,"opName":"JUMP"} +{"pc":240,"op":91,"gas":"0x2b6e92","gasCost":"0x1","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0xa6","0x1"],"depth":2,"refund":0,"opName":"JUMPDEST"} +{"pc":241,"op":96,"gas":"0x2b6e91","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0xa6","0x1"],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":243,"op":129,"gas":"0x2b6e8e","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0xa6","0x1","0x0"],"depth":2,"refund":0,"opName":"DUP2"} +{"pc":244,"op":144,"gas":"0x2b6e8b","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0xa6","0x1","0x0","0x1"],"depth":2,"refund":0,"opName":"SWAP1"} +{"pc":245,"op":80,"gas":"0x2b6e88","gasCost":"0x2","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0xa6","0x1","0x1","0x0"],"depth":2,"refund":0,"opName":"POP"} +{"pc":246,"op":145,"gas":"0x2b6e86","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0xa6","0x1","0x1"],"depth":2,"refund":0,"opName":"SWAP2"} +{"pc":247,"op":144,"gas":"0x2b6e83","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x1","0x1","0xa6"],"depth":2,"refund":0,"opName":"SWAP1"} +{"pc":248,"op":80,"gas":"0x2b6e80","gasCost":"0x2","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x1","0xa6","0x1"],"depth":2,"refund":0,"opName":"POP"} +{"pc":249,"op":86,"gas":"0x2b6e7e","gasCost":"0x8","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x1","0xa6"],"depth":2,"refund":0,"opName":"JUMP"} +{"pc":166,"op":91,"gas":"0x2b6e76","gasCost":"0x1","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x1"],"depth":2,"refund":0,"opName":"JUMPDEST"} +{"pc":167,"op":146,"gas":"0x2b6e75","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x1"],"depth":2,"refund":0,"opName":"SWAP3"} +{"pc":168,"op":80,"gas":"0x2b6e72","gasCost":"0x2","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x1"],"depth":2,"refund":0,"opName":"POP"} +{"pc":169,"op":130,"gas":"0x2b6e70","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":2,"refund":0,"opName":"DUP3"} +{"pc":170,"op":127,"gas":"0x2b6e6d","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x1"],"depth":2,"refund":0,"opName":"PUSH32"} +{"pc":203,"op":3,"gas":"0x2b6e6a","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x1","0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"],"depth":2,"refund":0,"opName":"SUB"} +{"pc":204,"op":130,"gas":"0x2b6e67","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"],"depth":2,"refund":0,"opName":"DUP3"} +{"pc":205,"op":17,"gas":"0x2b6e64","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"GT"} +{"pc":206,"op":21,"gas":"0x2b6e61","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x0"],"depth":2,"refund":0,"opName":"ISZERO"} +{"pc":207,"op":97,"gas":"0x2b6e5e","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x1"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":210,"op":87,"gas":"0x2b6e5b","gasCost":"0xa","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x1","0xdb"],"depth":2,"refund":0,"opName":"JUMPI"} +{"pc":219,"op":91,"gas":"0x2b6e51","gasCost":"0x1","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":2,"refund":0,"opName":"JUMPDEST"} +{"pc":220,"op":130,"gas":"0x2b6e50","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":2,"refund":0,"opName":"DUP3"} +{"pc":221,"op":130,"gas":"0x2b6e4d","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x1"],"depth":2,"refund":0,"opName":"DUP3"} +{"pc":222,"op":1,"gas":"0x2b6e4a","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"ADD"} +{"pc":223,"op":144,"gas":"0x2b6e47","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac"],"depth":2,"refund":0,"opName":"SWAP1"} +{"pc":224,"op":80,"gas":"0x2b6e44","gasCost":"0x2","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac","0x0"],"depth":2,"refund":0,"opName":"POP"} +{"pc":225,"op":146,"gas":"0x2b6e42","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac"],"depth":2,"refund":0,"opName":"SWAP3"} +{"pc":226,"op":145,"gas":"0x2b6e3f","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42"],"depth":2,"refund":0,"opName":"SWAP2"} +{"pc":227,"op":80,"gas":"0x2b6e3c","gasCost":"0x2","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac","0x42","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x1"],"depth":2,"refund":0,"opName":"POP"} +{"pc":228,"op":80,"gas":"0x2b6e3a","gasCost":"0x2","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac","0x42","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"POP"} +{"pc":229,"op":86,"gas":"0x2b6e38","gasCost":"0x8","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac","0x42"],"depth":2,"refund":0,"opName":"JUMP"} +{"pc":66,"op":91,"gas":"0x2b6e30","gasCost":"0x1","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac"],"depth":2,"refund":0,"opName":"JUMPDEST"} +{"pc":67,"op":96,"gas":"0x2b6e2f","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac"],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":69,"op":129,"gas":"0x2b6e2c","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac","0x0"],"depth":2,"refund":0,"opName":"DUP2"} +{"pc":70,"op":144,"gas":"0x2b6e29","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac"],"depth":2,"refund":0,"opName":"SWAP1"} +{"pc":71,"op":85,"gas":"0x2b6e26","gasCost":"0x2bc","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac","0x0"],"depth":2,"refund":0,"opName":"SSTORE"} +{"pc":72,"op":80,"gas":"0x2b6b6a","gasCost":"0x2","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac"],"depth":2,"refund":0,"opName":"POP"} +{"pc":73,"op":80,"gas":"0x2b6b68","gasCost":"0x2","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"POP"} +{"pc":74,"op":97,"gas":"0x2b6b66","gasCost":"0x3","memSize":160,"stack":[],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":77,"op":86,"gas":"0x2b6b63","gasCost":"0x8","memSize":160,"stack":["0x145"],"depth":2,"refund":0,"opName":"JUMP"} +{"pc":325,"op":91,"gas":"0x2b6b5b","gasCost":"0x1","memSize":160,"stack":[],"depth":2,"refund":0,"opName":"JUMPDEST"} +{"pc":326,"op":96,"gas":"0x2b6b5a","gasCost":"0x3","memSize":160,"stack":[],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":328,"op":128,"gas":"0x2b6b57","gasCost":"0x3","memSize":160,"stack":["0xb3"],"depth":2,"refund":0,"opName":"DUP1"} +{"pc":329,"op":97,"gas":"0x2b6b54","gasCost":"0x3","memSize":160,"stack":["0xb3","0xb3"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":332,"op":96,"gas":"0x2b6b51","gasCost":"0x3","memSize":160,"stack":["0xb3","0xb3","0x153"],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":334,"op":57,"gas":"0x2b6b4e","gasCost":"0x18","memSize":160,"stack":["0xb3","0xb3","0x153","0x0"],"depth":2,"refund":0,"opName":"CODECOPY"} +{"pc":335,"op":96,"gas":"0x2b6b36","gasCost":"0x3","memSize":192,"stack":["0xb3"],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":337,"op":243,"gas":"0x2b6b33","gasCost":"0x0","memSize":192,"stack":["0xb3","0x0"],"depth":2,"refund":0,"opName":"RETURN"} +{"pc":290,"op":128,"gas":"0x2c0bb2","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6"],"depth":1,"refund":0,"opName":"DUP1"} +{"pc":291,"op":21,"gas":"0x2c0baf","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x74b186f98c406a19aaf31b542b2b2353fb1577f6"],"depth":1,"refund":0,"opName":"ISZERO"} +{"pc":292,"op":128,"gas":"0x2c0bac","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x0"],"depth":1,"refund":0,"opName":"DUP1"} +{"pc":293,"op":21,"gas":"0x2c0ba9","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x0","0x0"],"depth":1,"refund":0,"opName":"ISZERO"} +{"pc":294,"op":97,"gas":"0x2c0ba6","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x0","0x1"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":297,"op":87,"gas":"0x2c0ba3","gasCost":"0xa","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x0","0x1","0x133"],"depth":1,"refund":0,"opName":"JUMPI"} +{"pc":307,"op":91,"gas":"0x2c0b99","gasCost":"0x1","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x0"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":308,"op":80,"gas":"0x2c0b98","gasCost":"0x2","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x0"],"depth":1,"refund":0,"opName":"POP"} +{"pc":309,"op":96,"gas":"0x2c0b96","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":311,"op":96,"gas":"0x2c0b93","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":313,"op":97,"gas":"0x2c0b90","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x0"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":316,"op":10,"gas":"0x2c0b8d","gasCost":"0xa","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x0","0x100"],"depth":1,"refund":0,"opName":"EXP"} +{"pc":317,"op":129,"gas":"0x2c0b83","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x1"],"depth":1,"refund":0,"opName":"DUP2"} +{"pc":318,"op":84,"gas":"0x2c0b80","gasCost":"0xc8","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x1","0x1"],"depth":1,"refund":0,"opName":"SLOAD"} +{"pc":319,"op":129,"gas":"0x2c0ab8","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x1","0x0"],"depth":1,"refund":0,"opName":"DUP2"} +{"pc":320,"op":115,"gas":"0x2c0ab5","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x1","0x0","0x1"],"depth":1,"refund":0,"opName":"PUSH20"} +{"pc":341,"op":2,"gas":"0x2c0ab2","gasCost":"0x5","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x1","0x0","0x1","0xffffffffffffffffffffffffffffffffffffffff"],"depth":1,"refund":0,"opName":"MUL"} +{"pc":342,"op":25,"gas":"0x2c0aad","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x1","0x0","0xffffffffffffffffffffffffffffffffffffffff"],"depth":1,"refund":0,"opName":"NOT"} +{"pc":343,"op":22,"gas":"0x2c0aaa","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x1","0x0","0xffffffffffffffffffffffff0000000000000000000000000000000000000000"],"depth":1,"refund":0,"opName":"AND"} +{"pc":344,"op":144,"gas":"0x2c0aa7","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x1","0x0"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":345,"op":131,"gas":"0x2c0aa4","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x0","0x1"],"depth":1,"refund":0,"opName":"DUP4"} +{"pc":346,"op":115,"gas":"0x2c0aa1","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x0","0x1","0x74b186f98c406a19aaf31b542b2b2353fb1577f6"],"depth":1,"refund":0,"opName":"PUSH20"} +{"pc":367,"op":22,"gas":"0x2c0a9e","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x0","0x1","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0xffffffffffffffffffffffffffffffffffffffff"],"depth":1,"refund":0,"opName":"AND"} +{"pc":368,"op":2,"gas":"0x2c0a9b","gasCost":"0x5","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x0","0x1","0x74b186f98c406a19aaf31b542b2b2353fb1577f6"],"depth":1,"refund":0,"opName":"MUL"} +{"pc":369,"op":23,"gas":"0x2c0a96","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x0","0x74b186f98c406a19aaf31b542b2b2353fb1577f6"],"depth":1,"refund":0,"opName":"OR"} +{"pc":370,"op":144,"gas":"0x2c0a93","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x74b186f98c406a19aaf31b542b2b2353fb1577f6"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":371,"op":85,"gas":"0x2c0a90","gasCost":"0x1f4","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1"],"depth":1,"refund":0,"opName":"SSTORE"} +{"pc":372,"op":80,"gas":"0x2c089c","gasCost":"0x2","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6"],"depth":1,"refund":0,"opName":"POP"} +{"pc":373,"op":80,"gas":"0x2c089a","gasCost":"0x2","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"POP"} +{"pc":374,"op":80,"gas":"0x2c0898","gasCost":"0x2","memSize":736,"stack":["0x80"],"depth":1,"refund":0,"opName":"POP"} +{"pc":375,"op":97,"gas":"0x2c0896","gasCost":"0x3","memSize":736,"stack":[],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":378,"op":86,"gas":"0x2c0893","gasCost":"0x8","memSize":736,"stack":["0x29b"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":667,"op":91,"gas":"0x2c088b","gasCost":"0x1","memSize":736,"stack":[],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":668,"op":97,"gas":"0x2c088a","gasCost":"0x3","memSize":736,"stack":[],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":671,"op":128,"gas":"0x2c0887","gasCost":"0x3","memSize":736,"stack":["0x1bd"],"depth":1,"refund":0,"opName":"DUP1"} +{"pc":672,"op":97,"gas":"0x2c0884","gasCost":"0x3","memSize":736,"stack":["0x1bd","0x1bd"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":675,"op":96,"gas":"0x2c0881","gasCost":"0x3","memSize":736,"stack":["0x1bd","0x1bd","0x2aa"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":677,"op":57,"gas":"0x2c087e","gasCost":"0x2d","memSize":736,"stack":["0x1bd","0x1bd","0x2aa","0x0"],"depth":1,"refund":0,"opName":"CODECOPY"} +{"pc":678,"op":96,"gas":"0x2c0851","gasCost":"0x3","memSize":736,"stack":["0x1bd"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":680,"op":243,"gas":"0x2c084e","gasCost":"0x0","memSize":736,"stack":["0x1bd","0x0"],"depth":1,"refund":0,"opName":"RETURN"} +{"output":"608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f566852414610030575b600080fd5b61003861004e565b6040516100459190610146565b60405180910390f35b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166381ca91d36040518163ffffffff1660e01b815260040160206040518083038186803b1580156100b857600080fd5b505afa1580156100cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100f0919061010a565b905090565b60008151905061010481610170565b92915050565b6000602082840312156101205761011f61016b565b5b600061012e848285016100f5565b91505092915050565b61014081610161565b82525050565b600060208201905061015b6000830184610137565b92915050565b6000819050919050565b600080fd5b61017981610161565b811461018457600080fd5b5056fea2646970667358221220a6a0e11af79f176f9c421b7b12f441356b25f6489b83d38cc828a701720b41f164736f6c63430008070033","gasUsed":"0x9370"} diff --git a/core/state/database.go b/core/state/database.go index 16e799dff5b8..2af28912a99f 100644 --- a/core/state/database.go +++ b/core/state/database.go @@ -189,7 +189,8 @@ type Trie interface { // IsVerkle returns true if the trie is verkle-tree based IsVerkle() bool - Revive(stem verkle.Stem, values [][]byte) error + // Revive(stem verkle.Stem, values [][]byte) error + Revive(stem verkle.Stem, values [][]byte, oldPeriod, curPeriod verkle.StatePeriod) error } // NewDatabase creates a backing store for state. The returned database is safe for diff --git a/core/state/statedb.go b/core/state/statedb.go index 926a99bb5a42..4d8a4211125c 100644 --- a/core/state/statedb.go +++ b/core/state/statedb.go @@ -121,6 +121,7 @@ type StateDB struct { // Verkle witness witness *AccessWitness + curPeriod verkle.StatePeriod // Journal of state modifications. This is the backbone of // Snapshot and RevertToSnapshot. @@ -176,6 +177,7 @@ func New(root common.Hash, db Database, snaps *snapshot.Tree, curPeriod verkle.S } if tr.IsVerkle() { sdb.witness = sdb.NewAccessWitness() + sdb.curPeriod = curPeriod } if sdb.snaps != nil { sdb.snap = sdb.snaps.Snapshot(root) @@ -1469,6 +1471,14 @@ func copy2DSet[k comparable](set map[k]map[common.Hash][]byte) map[k]map[common. return copied } -func (s *StateDB) Revive(stem verkle.Stem, values [][]byte) error { - return s.trie.Revive(stem, values) +func (s *StateDB) Revive(stem verkle.Stem, values [][]byte, oldPeriod, curPeriod verkle.StatePeriod) error { + return s.trie.Revive(stem, values, oldPeriod, curPeriod) +} + +func (s *StateDB) CurPeriod() verkle.StatePeriod { + return s.curPeriod +} + +func (s *StateDB) SetCurPeriod(period verkle.StatePeriod) { + s.curPeriod = period } diff --git a/core/state/trie_prefetcher.go b/core/state/trie_prefetcher.go index c0acd4f64385..c895b4062e38 100644 --- a/core/state/trie_prefetcher.go +++ b/core/state/trie_prefetcher.go @@ -289,14 +289,13 @@ func (sf *subfetcher) abort() { // loop waits for new tasks to be scheduled and keeps loading them until it runs // out of tasks or its underlying trie is retrieved for committing. -// TODO(weiihann): how to parse period to prefetcher? func (sf *subfetcher) loop() { // No matter how the loop stops, signal anyone waiting that it's terminated defer close(sf.term) // Start by opening the trie and stop processing if it fails if sf.owner == (common.Hash{}) { - trie, err := sf.db.OpenTrie(sf.root, 0) // TODO(weiihann): Verkle currently doesn't support prefetching, ignore period for now + trie, err := sf.db.OpenTrie(sf.root, 0) // TODO(wh): Verkle currently doesn't support prefetching, ignore period for now if err != nil { log.Warn("Trie prefetcher failed opening trie", "root", sf.root, "err", err) return diff --git a/core/state_processor.go b/core/state_processor.go index 8c8bb9974c87..9ad1a1a518a8 100644 --- a/core/state_processor.go +++ b/core/state_processor.go @@ -82,7 +82,6 @@ func (p *StateProcessor) Process(block *types.Block, statedb *state.StateDB, cfg if p.config.IsVerkle(block.Number(), block.Time()) { ProcessParentBlockHash(statedb, block.NumberU64()-1, block.ParentHash()) } - // TODO(weiihann): need to do anything here? // Iterate over and process the individual transactions for i, tx := range block.Transactions() { msg, err := TransactionToMessage(tx, signer, header.BaseFee) diff --git a/core/state_transition.go b/core/state_transition.go index 1424a9df4a7c..bfdf44456171 100644 --- a/core/state_transition.go +++ b/core/state_transition.go @@ -431,7 +431,7 @@ func (st *StateTransition) TransitionDb() (*ExecutionResult, error) { // Before performing the actual transition, we first perform the revive for _, revive := range msg.ReviveList { - if err := st.state.Revive(revive.Stem, revive.Values); err != nil { + if err := st.state.Revive(revive.Stem, revive.Values, revive.LastPeriod, st.state.CurPeriod()); err != nil { return nil, err } } diff --git a/core/types/transaction_marshalling.go b/core/types/transaction_marshalling.go index 1f2350a53afc..334ad340706e 100644 --- a/core/types/transaction_marshalling.go +++ b/core/types/transaction_marshalling.go @@ -130,11 +130,8 @@ func (tx *Transaction) MarshalJSON() ([]byte, error) { enc.V = (*hexutil.Big)(itx.V.ToBig()) enc.R = (*hexutil.Big)(itx.R.ToBig()) enc.S = (*hexutil.Big)(itx.S.ToBig()) - // TODO(weiihann): seems a bit hacky enc.ReviveList = make([]ReviveValue, len(itx.ReviveList)) - for i, revive := range itx.ReviveList { - enc.ReviveList[i] = revive - } + copy(enc.ReviveList, itx.ReviveList) } return json.Marshal(&enc) } @@ -367,6 +364,67 @@ func (tx *Transaction) UnmarshalJSON(input []byte) error { } } + case ReviveTxType: + var itx ReviveTx + inner = &itx + if dec.ChainID == nil { + return errors.New("missing required field 'chainId' in transaction") + } + itx.ChainID = uint256.MustFromBig((*big.Int)(dec.ChainID)) + if dec.Nonce == nil { + return errors.New("missing required field 'nonce' in transaction") + } + itx.Nonce = uint64(*dec.Nonce) + if dec.To != nil { + itx.To = dec.To + } + if dec.Gas == nil { + return errors.New("missing required field 'gas' in transaction") + } + itx.Gas = uint64(*dec.Gas) + if dec.MaxFeePerGas == nil { + return errors.New("missing required field 'maxFeePerGas' in transaction") + } + itx.GasFeeCap = uint256.MustFromBig((*big.Int)(dec.MaxFeePerGas)) + if dec.MaxPriorityFeePerGas == nil { + return errors.New("missing required field 'maxPriorityFeePerGas' in transaction") + } + itx.GasTipCap = uint256.MustFromBig((*big.Int)(dec.MaxPriorityFeePerGas)) + if dec.Value == nil { + return errors.New("missing required field 'value' in transaction") + } + itx.Value = uint256.MustFromBig((*big.Int)(dec.Value)) + if dec.Input == nil { + return errors.New("missing required field 'input' in transaction") + } + itx.Data = *dec.Input + if dec.V == nil { + return errors.New("missing required field 'v' in transaction") + } + if dec.AccessList != nil { + itx.AccessList = *dec.AccessList + } + if dec.ReviveList == nil { + return errors.New("missing required field 'reviveList' in transaction") + } + itx.ReviveList = make([]ReviveValue, len(dec.ReviveList)) + copy(itx.ReviveList, dec.ReviveList) + itx.V = uint256.MustFromBig((*big.Int)(dec.V)) + if dec.R == nil { + return errors.New("missing required field 'r' in transaction") + } + itx.R = uint256.MustFromBig((*big.Int)(dec.R)) + if dec.S == nil { + return errors.New("missing required field 's' in transaction") + } + itx.S = uint256.MustFromBig((*big.Int)(dec.S)) + withSignature := itx.V.Sign() != 0 || itx.R.Sign() != 0 || itx.S.Sign() != 0 + if withSignature { + if err := sanityCheckSignature(itx.V.ToBig(), itx.R.ToBig(), itx.S.ToBig(), false); err != nil { + return err + } + } + default: return ErrTxTypeNotSupported } diff --git a/core/vm/interface.go b/core/vm/interface.go index dd5163835542..fd0b9889d5e4 100644 --- a/core/vm/interface.go +++ b/core/vm/interface.go @@ -86,7 +86,10 @@ type StateDB interface { Witness() *state.AccessWitness SetWitness(*state.AccessWitness) - Revive(stem verkle.Stem, values [][]byte) error + CurPeriod() verkle.StatePeriod + SetCurPeriod(verkle.StatePeriod) + + Revive(stem verkle.Stem, values [][]byte, oldPeriod, curPeriod verkle.StatePeriod) error } // CallContext provides a basic interface for the EVM calling conventions. The EVM diff --git a/eth/tracers/js/tracer_test.go b/eth/tracers/js/tracer_test.go index 3d67ec51758f..1ea9803e7970 100644 --- a/eth/tracers/js/tracer_test.go +++ b/eth/tracers/js/tracer_test.go @@ -51,7 +51,9 @@ type dummyStatedb struct { func (*dummyStatedb) GetRefund() uint64 { return 1337 } func (*dummyStatedb) GetBalance(addr common.Address) *big.Int { return new(big.Int) } -func (*dummyStatedb) Revive(_ verkle.Stem, _ [][]byte) error {panic("not supported")} +func (*dummyStatedb) Revive(_ verkle.Stem, _ [][]byte, _ verkle.StatePeriod, _ verkle.StatePeriod) error { panic("not supported") } +func (*dummyStatedb) CurPeriod() verkle.StatePeriod { return 0 } +func (*dummyStatedb) SetCurPeriod(period verkle.StatePeriod) { } type vmContext struct { blockCtx vm.BlockContext diff --git a/eth/tracers/logger/logger_test.go b/eth/tracers/logger/logger_test.go index 802512733897..dee30ac8ee03 100644 --- a/eth/tracers/logger/logger_test.go +++ b/eth/tracers/logger/logger_test.go @@ -52,8 +52,9 @@ type dummyStatedb struct { 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 (*dummyStatedb) Revive(_ verkle.Stem, _ [][]byte) error { panic("not supported") } - +func (*dummyStatedb) Revive(_ verkle.Stem, _ [][]byte, _ verkle.StatePeriod, _ verkle.StatePeriod) error { panic("not supported") } +func (*dummyStatedb) CurPeriod() verkle.StatePeriod { return 0 } +func (*dummyStatedb) SetCurPeriod(period verkle.StatePeriod) { } func TestStoreCapture(t *testing.T) { var ( logger = NewStructLogger(nil) diff --git a/go.mod b/go.mod index 6f8090dc0006..cdc1c9c491ad 100644 --- a/go.mod +++ b/go.mod @@ -134,4 +134,4 @@ require ( rsc.io/tmplfunc v0.0.3 // indirect ) -replace github.com/ethereum/go-verkle => github.com/weiihann/go-verkle v0.11.1 +replace github.com/ethereum/go-verkle => github.com/weiihann/go-verkle v0.11.2 diff --git a/go.sum b/go.sum index 5510af7bd4c6..40b0a63db0fd 100644 --- a/go.sum +++ b/go.sum @@ -450,8 +450,8 @@ github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBn github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= -github.com/weiihann/go-verkle v0.11.1 h1:qrOmZdIAy5gLs3F4+G6obH2jjjF7JhqoewRf21AAMgY= -github.com/weiihann/go-verkle v0.11.1/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk= +github.com/weiihann/go-verkle v0.11.2 h1:dzBDSwQTPJdNQuXnLWMe3k9oa9enleMidVYwjUSn220= +github.com/weiihann/go-verkle v0.11.2/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= diff --git a/internal/ethapi/transaction_args.go b/internal/ethapi/transaction_args.go index a477a1dda241..1d1ac0d0e07f 100644 --- a/internal/ethapi/transaction_args.go +++ b/internal/ethapi/transaction_args.go @@ -30,6 +30,7 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/rpc" + "github.com/holiman/uint256" ) // TransactionArgs represents the arguments to construct a new transaction @@ -287,7 +288,22 @@ func (args *TransactionArgs) toTransaction() *types.Transaction { var data types.TxData switch { case args.ReviveList != nil: - panic("TODO(weiihann):implement me") + al := types.AccessList{} + if args.AccessList != nil { + al = *args.AccessList + } + data = &types.ReviveTx{ + To: args.To, + ChainID: uint256.MustFromBig(args.ChainID.ToInt()), + Nonce: uint64(*args.Nonce), + Gas: uint64(*args.Gas), + GasFeeCap: uint256.MustFromBig(args.MaxFeePerGas.ToInt()), + GasTipCap: uint256.MustFromBig(args.MaxPriorityFeePerGas.ToInt()), + Value: uint256.MustFromBig(args.Value.ToInt()), + Data: args.data(), + AccessList: al, + ReviveList: *args.ReviveList, + } case args.MaxFeePerGas != nil: al := types.AccessList{} if args.AccessList != nil { diff --git a/light/trie.go b/light/trie.go index 3017f7e3396e..cbade83e0e1b 100644 --- a/light/trie.go +++ b/light/trie.go @@ -191,7 +191,7 @@ type odrTrie struct { trie *trie.Trie } -func (t *odrTrie) Revive(_ verkle.Stem, _ [][]byte) error { +func (t *odrTrie) Revive(_ verkle.Stem, _ [][]byte, _ verkle.StatePeriod, _ verkle.StatePeriod) error { panic("not supported") } diff --git a/signer/core/apitypes/types.go b/signer/core/apitypes/types.go index 49e2f1d01063..4a6dd9e32903 100644 --- a/signer/core/apitypes/types.go +++ b/signer/core/apitypes/types.go @@ -155,7 +155,8 @@ func (args *SendTxArgs) ToTransaction() *types.Transaction { AccessList: *args.AccessList, } case args.ReviveList != nil: - // TODO(weiihann): handle this + // TODO(wh): handle this + panic("ToTransaction(): revive list not implemented") default: data = &types.LegacyTx{ diff --git a/trie/secure_trie.go b/trie/secure_trie.go index 5fdfc2518167..fe9eb142da77 100644 --- a/trie/secure_trie.go +++ b/trie/secure_trie.go @@ -294,6 +294,6 @@ func (t *StateTrie) IsVerkle() bool { return false } -func (t *StateTrie) Revive(_ verkle.Stem, _ [][]byte) error { +func (t *StateTrie) Revive(_ verkle.Stem, _ [][]byte, _ verkle.StatePeriod, _ verkle.StatePeriod) error { panic("not supported") } diff --git a/trie/transition.go b/trie/transition.go index 394d8e165b59..09b9b975adf9 100644 --- a/trie/transition.go +++ b/trie/transition.go @@ -198,6 +198,6 @@ func (t *TransitionTrie) UpdateContractCode(addr common.Address, codeHash common return t.overlay.UpdateContractCode(addr, codeHash, code) } -func (t *TransitionTrie) Revive(_ verkle.Stem, _ [][]byte) error { +func (t *TransitionTrie) Revive(_ verkle.Stem, _ [][]byte, _ verkle.StatePeriod, _ verkle.StatePeriod) error { panic("shouldn't happen in transition trie") } diff --git a/trie/verkle.go b/trie/verkle.go index bbc883fe97b9..76a848f93a77 100644 --- a/trie/verkle.go +++ b/trie/verkle.go @@ -61,7 +61,7 @@ func (trie *VerkleTrie) FlatdbNodeResolver(path []byte) ([]byte, error) { } func (trie *VerkleTrie) InsertMigratedLeaves(leaves []verkle.LeafNode) error { - return trie.root.(*verkle.InternalNode).InsertMigratedLeaves(leaves, trie.curPeriod, trie.FlatdbNodeResolver) + return trie.root.(*verkle.InternalNode).InsertMigratedLeaves(leaves, trie.FlatdbNodeResolver) } var ( @@ -177,7 +177,7 @@ func (t *VerkleTrie) UpdateAccount(addr common.Address, acc *types.StateAccount, switch root := t.root.(type) { case *verkle.InternalNode: - err = root.InsertValuesAtStem(stem, values, t.curPeriod, false, t.FlatdbNodeResolver) // TODO(weiihann): check isResurrect + err = root.InsertValuesAtStem(stem, values, t.curPeriod, false, t.FlatdbNodeResolver) default: return errInvalidRootType } @@ -191,16 +191,16 @@ func (t *VerkleTrie) UpdateAccount(addr common.Address, acc *types.StateAccount, func (trie *VerkleTrie) UpdateStem(key []byte, values [][]byte) error { switch root := trie.root.(type) { case *verkle.InternalNode: - return root.InsertValuesAtStem(key, values, trie.curPeriod, false, trie.FlatdbNodeResolver) // TODO(weiihann): check isResurrect + return root.InsertValuesAtStem(key, values, trie.curPeriod, false, trie.FlatdbNodeResolver) default: panic("invalid root type") } } -func (trie *VerkleTrie) Revive(stem verkle.Stem, values [][]byte) error { +func (trie *VerkleTrie) Revive(stem verkle.Stem, values [][]byte, oldPeriod, curPeriod verkle.StatePeriod) error { switch root := trie.root.(type) { case *verkle.InternalNode: - return root.InsertValuesAtStem(stem, values, trie.curPeriod, true, trie.FlatdbNodeResolver) + return root.Revive(stem, values, oldPeriod, curPeriod, false, trie.FlatdbNodeResolver) default: panic("invalid root type") } From a659cedc9034e561c80a4210d477a565a32fe1a8 Mon Sep 17 00:00:00 2001 From: weiihann Date: Tue, 18 Mar 2025 00:08:47 +0800 Subject: [PATCH 6/7] still got issues --- consensus/beacon/consensus.go | 40 ++- core/chain_makers.go | 19 +- core/output/block1.rlp.hex | 2 +- core/output/block2.rlp.hex | 2 +- core/output/block3.rlp.hex | 1 + core/output/statediffs.json | 2 +- core/output/traces.jsonl | 529 ---------------------------------- core/overlay/conversion.go | 1 + core/state/state_object.go | 9 + core/state/statedb.go | 20 +- core/state_processor_test.go | 378 +++++++++++++++++++++++- core/types/period.go | 9 +- go.mod | 2 +- go.sum | 4 +- params/config.go | 3 + trie/transition.go | 1 + trie/verkle.go | 11 + 17 files changed, 487 insertions(+), 546 deletions(-) create mode 100644 core/output/block3.rlp.hex diff --git a/consensus/beacon/consensus.go b/consensus/beacon/consensus.go index 3e9a536ab830..4bcdb8d5dfae 100644 --- a/consensus/beacon/consensus.go +++ b/consensus/beacon/consensus.go @@ -20,6 +20,7 @@ import ( "errors" "fmt" "math/big" + "strings" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/math" @@ -429,13 +430,13 @@ func (beacon *Beacon) FinalizeAndAssemble(chain consensus.ChainHeaderReader, hea return block, nil } -func BuildVerkleProof(header *types.Header, state *state.StateDB, parentRoot common.Hash, curPeriod verkle.StatePeriod) (verkle.StateDiff, *verkle.VerkleProof, error) { +func BuildVerkleProof(header *types.Header, state *state.StateDB, parentRoot common.Hash, parentPeriod verkle.StatePeriod) (verkle.StateDiff, *verkle.VerkleProof, error) { var ( proof *verkle.VerkleProof stateDiff verkle.StateDiff ) - preTrie, err := state.Database().OpenTrie(parentRoot, curPeriod) + preTrie, err := state.Database().OpenTrie(parentRoot, parentPeriod) if err != nil { return nil, nil, fmt.Errorf("error opening pre-state tree root: %w", err) } @@ -483,9 +484,44 @@ func BuildVerkleProof(header *types.Header, state *state.StateDB, parentRoot com } } } + + fmt.Println(getStateDiffString(stateDiff)) + return stateDiff, proof, nil } +func getStateDiffString(sd verkle.StateDiff) string { + var b strings.Builder + b.WriteString("StateDiff[\n") + for i, stem := range sd { + if i > 0 { + b.WriteString(",\n") + } + b.WriteString(fmt.Sprintf(" Stem: %x\n", stem.Stem)) + b.WriteString(fmt.Sprintf(" Period: %d\n", stem.PrePeriod)) + b.WriteString(" SuffixDiffs[\n") + for j, suffix := range stem.SuffixDiffs { + if j > 0 { + b.WriteString(",\n") + } + b.WriteString(fmt.Sprintf(" Suffix: %x\n", suffix.Suffix)) + if suffix.CurrentValue != nil { + b.WriteString(fmt.Sprintf(" CurrentValue: %x\n", *suffix.CurrentValue)) + } else { + b.WriteString(" CurrentValue: nil\n") + } + if suffix.NewValue != nil { + b.WriteString(fmt.Sprintf(" NewValue: %x\n", *suffix.NewValue)) + } else { + b.WriteString(" NewValue: nil\n") + } + } + b.WriteString(" ]") + } + b.WriteString("\n]") + return b.String() +} + // Seal generates a new sealing request for the given input block and pushes // the result into the given channel. // diff --git a/core/chain_makers.go b/core/chain_makers.go index 7c36be78694e..b77ce9f79574 100644 --- a/core/chain_makers.go +++ b/core/chain_makers.go @@ -385,8 +385,16 @@ func GenerateVerkleChain(config *params.ChainConfig, parent *types.Block, engine b := &BlockGen{i: i, chain: blocks, parent: parent, statedb: statedb, config: config, engine: engine} b.header = makeHeader(chainreader, parent, statedb, b.engine) preState := statedb.Copy() - fmt.Println("prestate", preState.GetTrie().(*trie.VerkleTrie).ToDot()) - statedb.SetCurPeriod(types.GetStatePeriod(config, b.header.Time)) // update period as we are going to process new block + fmt.Println("--------------------------------") + fmt.Println("block", b.header.Number) + if b.header.Number.Cmp(new(big.Int).SetUint64(2)) == 0 { + fmt.Println("here") + } + fmt.Println("--------------------------------") + fmt.Printf("prestate root: %x\n", preState.GetTrie().(*trie.VerkleTrie).Hash()) + fmt.Println(preState.GetTrie().(*trie.VerkleTrie).ToDot()) + curPeriod := types.GetStatePeriod(config, b.header.Time) + statedb.SetCurPeriod(curPeriod) // update period as we are going to process new block if config.IsVerkle(b.header.Number, b.header.Time) { if !config.IsVerkle(b.parent.Number(), b.parent.Time()) { @@ -434,8 +442,7 @@ func GenerateVerkleChain(config *params.ChainConfig, parent *types.Block, engine proots = append(proots, parent.Root()) // quick check that we are self-consistent - blockPeriod := types.GetStatePeriod(config, b.header.Time) - err = verkle.Verify(block.ExecutionWitness().VerkleProof, block.ExecutionWitness().ParentStateRoot[:], block.Root().Bytes(), block.ExecutionWitness().StateDiff, blockPeriod) + err = verkle.Verify(block.ExecutionWitness().VerkleProof, block.ExecutionWitness().ParentStateRoot[:], block.Root().Bytes(), block.ExecutionWitness().StateDiff, curPeriod) if err != nil { panic(err) } @@ -450,8 +457,8 @@ func GenerateVerkleChain(config *params.ChainConfig, parent *types.Block, engine db.EndVerkleTransition() db.SaveTransitionState(parent.Root()) for i := 0; i < n; i++ { - curPeriod := types.GetStatePeriod(config, parent.Time()) - statedb, err := state.New(parent.Root(), db, snaps, curPeriod) + parentPeriod := types.GetStatePeriod(config, parent.Time()) + statedb, err := state.New(parent.Root(), db, snaps, parentPeriod) if err != nil { panic(fmt.Sprintf("could not find state for block %d: err=%v, parent root=%x", i, err, parent.Root())) } diff --git a/core/output/block1.rlp.hex b/core/output/block1.rlp.hex index 8cd263222795..2a38062a2d12 100644 --- a/core/output/block1.rlp.hex +++ b/core/output/block1.rlp.hex @@ -1 +1 @@ -f90353f90218a0709a2f8414d6f57e276968a3a61865e675eadc4e86d75d5011038305ae7910dea01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a015f25558e974b88672fb254fafe53551d3c52c64069ddf42f51b34de3f7c119ca05bc6adb39ea9aa931ff304798334ca7079af7338ae6c0aa5fa309acb3d0a5b15a0251f2cb798e965c5d9b11c882f37c69fd2c42b314fabe64d2b4998c76eb93ae8b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080018347e7c482f6180a80a0000000000000000000000000000000000000000000000000000000000000000088000000000000000084342770c0a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421f90133f8658084342770c08252089400020300000000000000000000000000000000008203e78026a012b305f880108f997fba308aed436c3f9579cc3cd974fbba42d4dbed5eb5bf28a04bfb28644ea72bd4f6d668fbbed3a0352c3318cee582eec7933dbd06380eaa9ff8650184342770c08252089400000000000000000000000000000000000000008203e78025a035084f770e2443be85a5c774532dbacda1f5d0161876cec312e08008833f0a52a028c346755226a6f34f8c83dd9634ce232f71930ed3d56beb660877ee1400244bf8630284342770c0825208940000000000000000000000000000000000000000808026a0eb6949fa8562003ad7492e200b7b73a0c68de8c84998683863c87335d7f7ad28a054f2f110f801036824d6952471d3e3959dd58e639d9169b26632ea1bb814cfecc0c0 \ No newline at end of file +f90286f90218a0709a2f8414d6f57e276968a3a61865e675eadc4e86d75d5011038305ae7910dea01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a02f1fe311381b79041e3acdda6ae9a165968db97c67e030c58370f052d926e7c8a0fe0d769741c549cb191936ff391da87fa47ebc27443f9643db6ed1e74b53c1b4a0056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080018347e7c48252080a80a0000000000000000000000000000000000000000000000000000000000000000088000000000000000084342770c0a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421f867f8658084342770c08252089400020300000000000000000000000000000000008203e78026a012b305f880108f997fba308aed436c3f9579cc3cd974fbba42d4dbed5eb5bf28a04bfb28644ea72bd4f6d668fbbed3a0352c3318cee582eec7933dbd06380eaa9fc0c0 \ No newline at end of file diff --git a/core/output/block2.rlp.hex b/core/output/block2.rlp.hex index fdc5cf37effb..6728190d9c92 100644 --- a/core/output/block2.rlp.hex +++ b/core/output/block2.rlp.hex @@ -1 +1 @@ -f90b57f90219a09cd8e265f03adee194fdf0147fa40270562586418c8a4e3bf9e8dbe5f3a41cd8a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0305579520915a655e8dab8f9fa71a433d4471155427bffc265708caf55e9a514a002010f59e092529d1f2b457e7c1911a08cdf728a14ac1088ea9615dce3b87447a07279017c7fbd8dcd1ed3255ae492d3fa12b8e6f29d033302ce05ecdd3157113bb901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080028347e7c48303c9931480a00000000000000000000000000000000000000000000000000000000000000000880000000000000000842dcf2261a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421f90936f8650384342770c08252089401020300000000000000000000000000000000008203e78026a0b1dc957ad929efeadb591bd77121aea2a1808c8a82e460d671aaccce2e96855aa038de06965d668cfaeb7d33d97e3c8e03380aac057741afa265756b32d07c43b0f8650484342770c08252089400000000000000000000000000000000000000008203e78025a013c16fdd3018f4cdd2db8cd0cdf694973de65df7179bbb0c10de42583acaed7aa0633d469034029959d960c23d3b028ae68360c1a4a66663f4d841aaca69b0c6ebf8630584342770c0825208940000000000000000000000000000000000000000808025a0640b2c69c75bedf0b9388e5b60e40ea6f4ea0a084b6660ab27ace0c66dfc04c7a052dc3febc7ca404f37b267a961de42ea35e6de362fcefc6f6928a830837f0ce5f86a0684342770c0832dc6c080109a6060604052600a8060106000396000f360606040526008565b0026a0e909f28a02715713732d38899d8dfe97688ffa3dc7a96a5072b367bac35badcba061e24f56eab4f791158b16ca771b7914d85d401f549618329624be3d546adef9f907940784342770c0832dc6c08080b9074260806040526040516100109061017b565b604051809103906000f08015801561002c573d6000803e3d6000fd5b506000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034801561007857600080fd5b5060008067ffffffffffffffff8111156100955761009461024a565b5b6040519080825280601f01601f1916602001820160405280156100c75781602001600182028036833780820191505090505b50905060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506020600083833c81610101906101e3565b60405161010d90610187565b61011791906101a3565b604051809103906000f080158015610133573d6000803e3d6000fd5b50600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505061029b565b60d58061046783390190565b6102068061053c83390190565b61019d816101d9565b82525050565b60006020820190506101b86000830184610194565b92915050565b6000819050602082019050919050565b600081519050919050565b6000819050919050565b60006101ee826101ce565b826101f8846101be565b905061020381610279565b925060208210156102435761023e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8360200360080261028e565b831692505b5050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600061028582516101d9565b80915050919050565b600082821b905092915050565b6101bd806102aa6000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f566852414610030575b600080fd5b61003861004e565b6040516100459190610146565b60405180910390f35b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166381ca91d36040518163ffffffff1660e01b815260040160206040518083038186803b1580156100b857600080fd5b505afa1580156100cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100f0919061010a565b905090565b60008151905061010481610170565b92915050565b6000602082840312156101205761011f61016b565b5b600061012e848285016100f5565b91505092915050565b61014081610161565b82525050565b600060208201905061015b6000830184610137565b92915050565b6000819050919050565b600080fd5b61017981610161565b811461018457600080fd5b5056fea2646970667358221220a6a0e11af79f176f9c421b7b12f441356b25f6489b83d38cc828a701720b41f164736f6c63430008070033608060405234801561001057600080fd5b5060b68061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063ab5ed15014602d575b600080fd5b60336047565b604051603e9190605d565b60405180910390f35b60006001905090565b6057816076565b82525050565b6000602082019050607060008301846050565b92915050565b600081905091905056fea26469706673582212203a14eb0d5cd07c277d3e24912f110ddda3e553245a99afc4eeefb2fbae5327aa64736f6c63430008070033608060405234801561001057600080fd5b5060405161020638038061020683398181016040528101906100329190610063565b60018160001c6100429190610090565b60008190555050610145565b60008151905061005d8161012e565b92915050565b60006020828403121561007957610078610129565b5b60006100878482850161004e565b91505092915050565b600061009b826100f0565b91506100a6836100f0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156100db576100da6100fa565b5b828201905092915050565b6000819050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600080fd5b610137816100e6565b811461014257600080fd5b50565b60b3806101536000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c806381ca91d314602d575b600080fd5b60336047565b604051603e9190605a565b60405180910390f35b60005481565b6054816073565b82525050565b6000602082019050606d6000830184604d565b92915050565b600081905091905056fea26469706673582212209bff7098a2f526de1ad499866f27d6d0d6f17b74a413036d6063ca6a0998ca4264736f6c6343000807003326a0e910089d33abf2c4fbc11ae870a94928bceb63362c2df12d88769e40132c69aba04c148c16c0b06a51ccf2f9644552a4510cce5dda2626c1912b0ddb8a738020a2c0c0 \ No newline at end of file +f90286f90218a0ff175f876b42eabd790b57ad00bd73102d093aefc689c35a72e6bcd689148a31a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a04aafe9c915fcf3da2155500d20662460b7a264b847792940d5d1cac8055398bfa09f896dbe01842762be6278d5d31b3dc286fd95b7ac99a58124cab053c5e9314da0056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080028347e7c48252081480a00000000000000000000000000000000000000000000000000000000000000000880000000000000000842db16291a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421f867f8650184342770c08252089401020300000000000000000000000000000000008203e78026a08a1fe777b0ddf099ed46f7098a5fd083725c6fb6afe4d01a04b275a1efb60e7da064252eed7e0d78ed0114f6b5de2e7c6ef3d657bb7c345bd51fcad1684a0ee5ffc0c0 \ No newline at end of file diff --git a/core/output/block3.rlp.hex b/core/output/block3.rlp.hex new file mode 100644 index 000000000000..1954182ddac2 --- /dev/null +++ b/core/output/block3.rlp.hex @@ -0,0 +1 @@ +f90286f90218a09bb8980ca21378f2f4137dcc2124f2390f4ccbf2bf0a19638fa10f505c725e3ea01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a038c5466782f40fc47929ea3aebb3cf5615949b2c150f823e081923433d9e71f4a0ec90a937186681cd2b64f38d18511c412e88f4ada9eb2eee63e600cea67d31a9a0056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080038347e7c48252081e80a000000000000000000000000000000000000000000000000000000000000000008800000000000000008428083e69a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421f867f8650284342770c08252089402020300000000000000000000000000000000008203e78025a08c437a22cee263698a2e5c3367c69773f02ca4933d77f7cedb2a5d12778d1788a00101e88aa1053ca5a8ab5565a1d12cffab51a567bf7da0b9193444d6d8b47d0ac0c0 \ No newline at end of file diff --git a/core/output/statediffs.json b/core/output/statediffs.json index e4dd1effa4e6..0dc5b269d5fe 100644 --- a/core/output/statediffs.json +++ b/core/output/statediffs.json @@ -1 +1 @@ -[[{"stem":"0x1540dfad7755b40be0768c6aa0a5096fbf0215e0e8cf354dd928a178346466","suffixDiffs":[{"suffix":0,"currentValue":"0x0000000000000000000000000000000000000000000000000de0b6b3a7640000","newValue":"0x0000000000000000000000000000000300000000000000000de08490dd58e632"},{"suffix":1,"currentValue":"0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","newValue":null}],"prePeriod":0},{"stem":"0x1a100684fd68185060405f3f160e4bb6e034194336b547bdae323f888d5332","suffixDiffs":[{"suffix":0,"currentValue":null,"newValue":"0x00000000000000000000000000000000000000000000000000000000000003e7"},{"suffix":1,"currentValue":null,"newValue":"0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"}],"prePeriod":0},{"stem":"0x5b5fdfedd6a0e932da408ac7d772a36513d1eee9b9926e52620c43a433aad7","suffixDiffs":[{"suffix":64,"currentValue":null,"newValue":"0x709a2f8414d6f57e276968a3a61865e675eadc4e86d75d5011038305ae7910de"}],"prePeriod":0},{"stem":"0xb4e8461a62334403b43cf4ea81015570273ab8aff7b04f00e56f1f98569445","suffixDiffs":[{"suffix":0,"currentValue":null,"newValue":"0x00000000000000000000000000000000000000000000000000000000000003e7"},{"suffix":1,"currentValue":null,"newValue":"0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"}],"prePeriod":0}],[{"stem":"0x1540dfad7755b40be0768c6aa0a5096fbf0215e0e8cf354dd928a178346466","suffixDiffs":[{"suffix":0,"currentValue":"0x0000000000000000000000000000000300000000000000000de08490dd58e632","newValue":"0x0000000000000000000000000000000800000000000000000ddfbf09a0ec6014"},{"suffix":1,"currentValue":"0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","newValue":null}],"prePeriod":0},{"stem":"0x178d84708160f6d9844906241e30a7d719cfc3b486ecc89222b0872c33dfea","suffixDiffs":[{"suffix":0,"currentValue":null,"newValue":"0x00000000000001bd000000000000000300000000000000000000000000000000"},{"suffix":1,"currentValue":null,"newValue":"0x855d6153e73150a38cab4b29ba925205be4f569cc2b5e049dfe5aca12d8ed260"},{"suffix":64,"currentValue":null,"newValue":"0x0000000000000000000000000f2cc432c8892c12eede08774adfd63df6f49282"},{"suffix":65,"currentValue":null,"newValue":"0x00000000000000000000000074b186f98c406a19aaf31b542b2b2353fb1577f6"},{"suffix":128,"currentValue":null,"newValue":"0x00608060405234801561001057600080fd5b506004361061002b5760003560e0"},{"suffix":129,"currentValue":null,"newValue":"0x001c8063f566852414610030575b600080fd5b61003861004e565b6040516100"},{"suffix":130,"currentValue":null,"newValue":"0x01459190610146565b60405180910390f35b6000600160009054906101000a90"},{"suffix":131,"currentValue":null,"newValue":"0x000473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffff"},{"suffix":132,"currentValue":null,"newValue":"0x0dffffffffffffffffffffffffff166381ca91d36040518163ffffffff1660e0"},{"suffix":133,"currentValue":null,"newValue":"0x001b815260040160206040518083038186803b1580156100b857600080fd5b50"},{"suffix":134,"currentValue":null,"newValue":"0x005afa1580156100cc573d6000803e3d6000fd5b505050506040513d601f1960"},{"suffix":135,"currentValue":null,"newValue":"0x011f820116820180604052508101906100f0919061010a565b905090565b6000"},{"suffix":136,"currentValue":null,"newValue":"0x008151905061010481610170565b92915050565b600060208284031215610120"},{"suffix":137,"currentValue":null,"newValue":"0x005761011f61016b565b5b600061012e848285016100f5565b91505092915050"},{"suffix":138,"currentValue":null,"newValue":"0x00565b61014081610161565b82525050565b600060208201905061015b600083"},{"suffix":139,"currentValue":null,"newValue":"0x000184610137565b92915050565b6000819050919050565b600080fd5b610179"},{"suffix":140,"currentValue":null,"newValue":"0x0081610161565b811461018457600080fd5b5056fea2646970667358221220a6"},{"suffix":141,"currentValue":null,"newValue":"0x00a0e11af79f176f9c421b7b12f441356b25f6489b83d38cc828a701720b41f1"},{"suffix":142,"currentValue":null,"newValue":"0x1064736f6c634300080700330000000000000000000000000000000000000000"}],"prePeriod":0},{"stem":"0x1a100684fd68185060405f3f160e4bb6e034194336b547bdae323f888d5332","suffixDiffs":[{"suffix":0,"currentValue":"0x00000000000000000000000000000000000000000000000000000000000003e7","newValue":"0x00000000000000000000000000000000000000000000000000001807e55a9f5b"},{"suffix":1,"currentValue":"0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","newValue":null}],"prePeriod":0},{"stem":"0x274ec3dcd311343e210f21e9c6d8501d7a35f81ce0dc49dbfdaf1dba64c067","suffixDiffs":[{"suffix":0,"currentValue":null,"newValue":"0x00000000000000000000000000000000000000000000000000000000000003e7"},{"suffix":1,"currentValue":null,"newValue":"0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"}],"prePeriod":0},{"stem":"0x30c7d6046291983794ea45a4ddb23a699dea413d11fcf95301a8994c75a1aa","suffixDiffs":[{"suffix":0,"currentValue":null,"newValue":"0x000000000000000a000000000000000100000000000000000000000000000010"},{"suffix":1,"currentValue":null,"newValue":"0xd1d29ee74a6d03244189ddb39239adc2a5f77ba91a8df459f17a172dbd96213d"},{"suffix":128,"currentValue":null,"newValue":"0x0060606040526008565b00000000000000000000000000000000000000000000"}],"prePeriod":0},{"stem":"0x4ea39246b161c112dec076e052f64934ce4fa4da0462830f9825c0525571eb","suffixDiffs":[{"suffix":0,"currentValue":null,"newValue":"0x00000000000000b3000000000000000100000000000000000000000000000000"},{"suffix":1,"currentValue":null,"newValue":"0x59580f918eb81909c7f6139444354459095c3588e72895bcf6f4192dc412998d"},{"suffix":64,"currentValue":null,"newValue":"0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac"},{"suffix":128,"currentValue":null,"newValue":"0x006080604052348015600f57600080fd5b506004361060285760003560e01c80"},{"suffix":129,"currentValue":null,"newValue":"0x006381ca91d314602d575b600080fd5b60336047565b604051603e9190605a56"},{"suffix":130,"currentValue":null,"newValue":"0x005b60405180910390f35b60005481565b6054816073565b82525050565b6000"},{"suffix":131,"currentValue":null,"newValue":"0x00602082019050606d6000830184604d565b92915050565b6000819050919050"},{"suffix":132,"currentValue":null,"newValue":"0x0056fea26469706673582212209bff7098a2f526de1ad499866f27d6d0d6f17b"},{"suffix":133,"currentValue":null,"newValue":"0x0174a413036d6063ca6a0998ca4264736f6c6343000807003300000000000000"}],"prePeriod":0},{"stem":"0x5b5fdfedd6a0e932da408ac7d772a36513d1eee9b9926e52620c43a433aad7","suffixDiffs":[{"suffix":65,"currentValue":null,"newValue":"0x9cd8e265f03adee194fdf0147fa40270562586418c8a4e3bf9e8dbe5f3a41cd8"}],"prePeriod":0},{"stem":"0xcf5a147cace4cfb354948c7dd4e7f3e9e0ca2d2bc9e5ab40aa17e1b2de6eed","suffixDiffs":[{"suffix":0,"currentValue":null,"newValue":"0x00000000000000b6000000000000000100000000000000000000000000000000"},{"suffix":1,"currentValue":null,"newValue":"0xc13691f74686a63a183168600bde00cbd5748529bbb12949e384b17398e4557a"},{"suffix":128,"currentValue":null,"newValue":"0x006080604052348015600f57600080fd5b506004361060285760003560e01c80"},{"suffix":129,"currentValue":null,"newValue":"0x0063ab5ed15014602d575b600080fd5b60336047565b604051603e9190605d56"},{"suffix":130,"currentValue":null,"newValue":"0x005b60405180910390f35b60006001905090565b6057816076565b8252505056"},{"suffix":131,"currentValue":null,"newValue":"0x005b6000602082019050607060008301846050565b92915050565b6000819050"},{"suffix":132,"currentValue":null,"newValue":"0x0091905056fea26469706673582212203a14eb0d5cd07c277d3e24912f110ddd"},{"suffix":133,"currentValue":null,"newValue":"0x14a3e553245a99afc4eeefb2fbae5327aa64736f6c6343000807003300000000"}],"prePeriod":0}]] \ No newline at end of file +[[{"stem":"0x1540dfad7755b40be0768c6aa0a5096fbf0215e0e8cf354dd928a178346466","suffixDiffs":[{"suffix":0,"currentValue":"0x0000000000000000000000000000000000000000000000000de0b6b3a7640000","newValue":"0x0000000000000000000000000000000100000000000000000de0a5fd640af619"},{"suffix":1,"currentValue":"0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","newValue":null}],"prePeriod":0},{"stem":"0x5b5fdfedd6a0e932da408ac7d772a36513d1eee9b9926e52620c43a433aad7","suffixDiffs":[{"suffix":64,"currentValue":null,"newValue":"0x709a2f8414d6f57e276968a3a61865e675eadc4e86d75d5011038305ae7910de"}],"prePeriod":0},{"stem":"0xb4e8461a62334403b43cf4ea81015570273ab8aff7b04f00e56f1f98569445","suffixDiffs":[{"suffix":0,"currentValue":null,"newValue":"0x00000000000000000000000000000000000000000000000000000000000003e7"},{"suffix":1,"currentValue":null,"newValue":"0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"}],"prePeriod":0}],[{"stem":"0x1540dfad7755b40be0768c6aa0a5096fbf0215e0e8cf354dd928a178346466","suffixDiffs":[{"suffix":0,"currentValue":"0x0000000000000000000000000000000100000000000000000de0a5fd640af619","newValue":"0x0000000000000000000000000000000200000000000000000de0954720b1ec32"},{"suffix":1,"currentValue":"0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","newValue":null}],"prePeriod":0},{"stem":"0x1a100684fd68185060405f3f160e4bb6e034194336b547bdae323f888d5332","suffixDiffs":[{"suffix":0,"currentValue":null,"newValue":"0x00000000000000000000000000000000000000000000000000000212043b7f78"},{"suffix":1,"currentValue":null,"newValue":"0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"}],"prePeriod":0},{"stem":"0x274ec3dcd311343e210f21e9c6d8501d7a35f81ce0dc49dbfdaf1dba64c067","suffixDiffs":[{"suffix":0,"currentValue":null,"newValue":"0x00000000000000000000000000000000000000000000000000000000000003e7"},{"suffix":1,"currentValue":null,"newValue":"0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"}],"prePeriod":0},{"stem":"0x5b5fdfedd6a0e932da408ac7d772a36513d1eee9b9926e52620c43a433aad7","suffixDiffs":[{"suffix":65,"currentValue":null,"newValue":"0xff175f876b42eabd790b57ad00bd73102d093aefc689c35a72e6bcd689148a31"}],"prePeriod":0}],[{"stem":"0x1540dfad7755b40be0768c6aa0a5096fbf0215e0e8cf354dd928a178346466","suffixDiffs":[{"suffix":0,"currentValue":"0x0000000000000000000000000000000200000000000000000de0954720b1ec32","newValue":"0x0000000000000000000000000000000300000000000000000de08490dd58e24b"},{"suffix":1,"currentValue":"0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","newValue":null}],"prePeriod":0},{"stem":"0x1a100684fd68185060405f3f160e4bb6e034194336b547bdae323f888d5332","suffixDiffs":[{"suffix":0,"currentValue":"0x00000000000000000000000000000000000000000000000000000212043b7f78","newValue":"0x000000000000000000000000000000000000000000000000000005f46354f030"},{"suffix":1,"currentValue":"0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","newValue":null}],"prePeriod":0},{"stem":"0x3993ae011a2539538d4cd410776c98b4dd4100770ea47f8a04c0c523451479","suffixDiffs":[{"suffix":0,"currentValue":null,"newValue":"0x00000000000000000000000000000000000000000000000000000000000003e7"},{"suffix":1,"currentValue":null,"newValue":"0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"}],"prePeriod":0},{"stem":"0x5b5fdfedd6a0e932da408ac7d772a36513d1eee9b9926e52620c43a433aad7","suffixDiffs":[{"suffix":66,"currentValue":null,"newValue":"0x9bb8980ca21378f2f4137dcc2124f2390f4ccbf2bf0a19638fa10f505c725e3e"}],"prePeriod":0}]] \ No newline at end of file diff --git a/core/output/traces.jsonl b/core/output/traces.jsonl index 3f610b7c1274..e69de29bb2d1 100644 --- a/core/output/traces.jsonl +++ b/core/output/traces.jsonl @@ -1,529 +0,0 @@ -{"output":"","gasUsed":"0x0"} -{"output":"","gasUsed":"0x0"} -{"output":"","gasUsed":"0x0"} -{"output":"","gasUsed":"0x0"} -{"output":"","gasUsed":"0x0"} -{"output":"","gasUsed":"0x0"} -{"pc":0,"op":96,"gas":"0x2cdd9e","gasCost":"0x3","memSize":0,"stack":[],"depth":1,"refund":0,"opName":"PUSH1"} -{"pc":2,"op":96,"gas":"0x2cdd9b","gasCost":"0x3","memSize":0,"stack":["0x60"],"depth":1,"refund":0,"opName":"PUSH1"} -{"pc":4,"op":82,"gas":"0x2cdd98","gasCost":"0xc","memSize":0,"stack":["0x60","0x40"],"depth":1,"refund":0,"opName":"MSTORE"} -{"pc":5,"op":96,"gas":"0x2cdd8c","gasCost":"0x3","memSize":96,"stack":[],"depth":1,"refund":0,"opName":"PUSH1"} -{"pc":7,"op":128,"gas":"0x2cdd89","gasCost":"0x3","memSize":96,"stack":["0xa"],"depth":1,"refund":0,"opName":"DUP1"} -{"pc":8,"op":96,"gas":"0x2cdd86","gasCost":"0x3","memSize":96,"stack":["0xa","0xa"],"depth":1,"refund":0,"opName":"PUSH1"} -{"pc":10,"op":96,"gas":"0x2cdd83","gasCost":"0x3","memSize":96,"stack":["0xa","0xa","0x10"],"depth":1,"refund":0,"opName":"PUSH1"} -{"pc":12,"op":57,"gas":"0x2cdd80","gasCost":"0x6","memSize":96,"stack":["0xa","0xa","0x10","0x0"],"depth":1,"refund":0,"opName":"CODECOPY"} -{"pc":13,"op":96,"gas":"0x2cdd7a","gasCost":"0x3","memSize":96,"stack":["0xa"],"depth":1,"refund":0,"opName":"PUSH1"} -{"pc":15,"op":243,"gas":"0x2cdd77","gasCost":"0x0","memSize":96,"stack":["0xa","0x0"],"depth":1,"refund":0,"opName":"RETURN"} -{"output":"60606040526008565b00","gasUsed":"0x2e3"} -{"pc":0,"op":96,"gas":"0x2c72ba","gasCost":"0x3","memSize":0,"stack":[],"depth":1,"refund":0,"opName":"PUSH1"} -{"pc":2,"op":96,"gas":"0x2c72b7","gasCost":"0x3","memSize":0,"stack":["0x80"],"depth":1,"refund":0,"opName":"PUSH1"} -{"pc":4,"op":82,"gas":"0x2c72b4","gasCost":"0xc","memSize":0,"stack":["0x80","0x40"],"depth":1,"refund":0,"opName":"MSTORE"} -{"pc":5,"op":96,"gas":"0x2c72a8","gasCost":"0x3","memSize":96,"stack":[],"depth":1,"refund":0,"opName":"PUSH1"} -{"pc":7,"op":81,"gas":"0x2c72a5","gasCost":"0x3","memSize":96,"stack":["0x40"],"depth":1,"refund":0,"opName":"MLOAD"} -{"pc":8,"op":97,"gas":"0x2c72a2","gasCost":"0x3","memSize":96,"stack":["0x80"],"depth":1,"refund":0,"opName":"PUSH2"} -{"pc":11,"op":144,"gas":"0x2c729f","gasCost":"0x3","memSize":96,"stack":["0x80","0x10"],"depth":1,"refund":0,"opName":"SWAP1"} -{"pc":12,"op":97,"gas":"0x2c729c","gasCost":"0x3","memSize":96,"stack":["0x10","0x80"],"depth":1,"refund":0,"opName":"PUSH2"} -{"pc":15,"op":86,"gas":"0x2c7299","gasCost":"0x8","memSize":96,"stack":["0x10","0x80","0x17b"],"depth":1,"refund":0,"opName":"JUMP"} -{"pc":379,"op":91,"gas":"0x2c7291","gasCost":"0x1","memSize":96,"stack":["0x10","0x80"],"depth":1,"refund":0,"opName":"JUMPDEST"} -{"pc":380,"op":96,"gas":"0x2c7290","gasCost":"0x3","memSize":96,"stack":["0x10","0x80"],"depth":1,"refund":0,"opName":"PUSH1"} -{"pc":382,"op":128,"gas":"0x2c728d","gasCost":"0x3","memSize":96,"stack":["0x10","0x80","0xd5"],"depth":1,"refund":0,"opName":"DUP1"} -{"pc":383,"op":97,"gas":"0x2c728a","gasCost":"0x3","memSize":96,"stack":["0x10","0x80","0xd5","0xd5"],"depth":1,"refund":0,"opName":"PUSH2"} -{"pc":386,"op":131,"gas":"0x2c7287","gasCost":"0x3","memSize":96,"stack":["0x10","0x80","0xd5","0xd5","0x467"],"depth":1,"refund":0,"opName":"DUP4"} -{"pc":387,"op":57,"gas":"0x2c7284","gasCost":"0x30","memSize":96,"stack":["0x10","0x80","0xd5","0xd5","0x467","0x80"],"depth":1,"refund":0,"opName":"CODECOPY"} -{"pc":388,"op":1,"gas":"0x2c7254","gasCost":"0x3","memSize":352,"stack":["0x10","0x80","0xd5"],"depth":1,"refund":0,"opName":"ADD"} -{"pc":389,"op":144,"gas":"0x2c7251","gasCost":"0x3","memSize":352,"stack":["0x10","0x155"],"depth":1,"refund":0,"opName":"SWAP1"} -{"pc":390,"op":86,"gas":"0x2c724e","gasCost":"0x8","memSize":352,"stack":["0x155","0x10"],"depth":1,"refund":0,"opName":"JUMP"} -{"pc":16,"op":91,"gas":"0x2c7246","gasCost":"0x1","memSize":352,"stack":["0x155"],"depth":1,"refund":0,"opName":"JUMPDEST"} -{"pc":17,"op":96,"gas":"0x2c7245","gasCost":"0x3","memSize":352,"stack":["0x155"],"depth":1,"refund":0,"opName":"PUSH1"} -{"pc":19,"op":81,"gas":"0x2c7242","gasCost":"0x3","memSize":352,"stack":["0x155","0x40"],"depth":1,"refund":0,"opName":"MLOAD"} -{"pc":20,"op":128,"gas":"0x2c723f","gasCost":"0x3","memSize":352,"stack":["0x155","0x80"],"depth":1,"refund":0,"opName":"DUP1"} -{"pc":21,"op":145,"gas":"0x2c723c","gasCost":"0x3","memSize":352,"stack":["0x155","0x80","0x80"],"depth":1,"refund":0,"opName":"SWAP2"} -{"pc":22,"op":3,"gas":"0x2c7239","gasCost":"0x3","memSize":352,"stack":["0x80","0x80","0x155"],"depth":1,"refund":0,"opName":"SUB"} -{"pc":23,"op":144,"gas":"0x2c7236","gasCost":"0x3","memSize":352,"stack":["0x80","0xd5"],"depth":1,"refund":0,"opName":"SWAP1"} -{"pc":24,"op":96,"gas":"0x2c7233","gasCost":"0x3","memSize":352,"stack":["0xd5","0x80"],"depth":1,"refund":0,"opName":"PUSH1"} -{"pc":26,"op":240,"gas":"0x2c7230","gasCost":"0x3f6","memSize":352,"stack":["0xd5","0x80","0x0"],"depth":1,"refund":0,"opName":"CREATE"} -{"pc":0,"op":96,"gas":"0x2ba3e6","gasCost":"0x3","memSize":0,"stack":[],"depth":2,"refund":0,"opName":"PUSH1"} -{"pc":2,"op":96,"gas":"0x2ba3e3","gasCost":"0x3","memSize":0,"stack":["0x80"],"depth":2,"refund":0,"opName":"PUSH1"} -{"pc":4,"op":82,"gas":"0x2ba3e0","gasCost":"0xc","memSize":0,"stack":["0x80","0x40"],"depth":2,"refund":0,"opName":"MSTORE"} -{"pc":5,"op":52,"gas":"0x2ba3d4","gasCost":"0x2","memSize":96,"stack":[],"depth":2,"refund":0,"opName":"CALLVALUE"} -{"pc":6,"op":128,"gas":"0x2ba3d2","gasCost":"0x3","memSize":96,"stack":["0x0"],"depth":2,"refund":0,"opName":"DUP1"} -{"pc":7,"op":21,"gas":"0x2ba3cf","gasCost":"0x3","memSize":96,"stack":["0x0","0x0"],"depth":2,"refund":0,"opName":"ISZERO"} -{"pc":8,"op":97,"gas":"0x2ba3cc","gasCost":"0x3","memSize":96,"stack":["0x0","0x1"],"depth":2,"refund":0,"opName":"PUSH2"} -{"pc":11,"op":87,"gas":"0x2ba3c9","gasCost":"0xa","memSize":96,"stack":["0x0","0x1","0x10"],"depth":2,"refund":0,"opName":"JUMPI"} -{"pc":16,"op":91,"gas":"0x2ba3bf","gasCost":"0x1","memSize":96,"stack":["0x0"],"depth":2,"refund":0,"opName":"JUMPDEST"} -{"pc":17,"op":80,"gas":"0x2ba3be","gasCost":"0x2","memSize":96,"stack":["0x0"],"depth":2,"refund":0,"opName":"POP"} -{"pc":18,"op":96,"gas":"0x2ba3bc","gasCost":"0x3","memSize":96,"stack":[],"depth":2,"refund":0,"opName":"PUSH1"} -{"pc":20,"op":128,"gas":"0x2ba3b9","gasCost":"0x3","memSize":96,"stack":["0xb6"],"depth":2,"refund":0,"opName":"DUP1"} -{"pc":21,"op":97,"gas":"0x2ba3b6","gasCost":"0x3","memSize":96,"stack":["0xb6","0xb6"],"depth":2,"refund":0,"opName":"PUSH2"} -{"pc":24,"op":96,"gas":"0x2ba3b3","gasCost":"0x3","memSize":96,"stack":["0xb6","0xb6","0x1f"],"depth":2,"refund":0,"opName":"PUSH1"} -{"pc":26,"op":57,"gas":"0x2ba3b0","gasCost":"0x1e","memSize":96,"stack":["0xb6","0xb6","0x1f","0x0"],"depth":2,"refund":0,"opName":"CODECOPY"} -{"pc":27,"op":96,"gas":"0x2ba392","gasCost":"0x3","memSize":192,"stack":["0xb6"],"depth":2,"refund":0,"opName":"PUSH1"} -{"pc":29,"op":243,"gas":"0x2ba38f","gasCost":"0x0","memSize":192,"stack":["0xb6","0x0"],"depth":2,"refund":0,"opName":"RETURN"} -{"pc":27,"op":128,"gas":"0x2c44df","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"DUP1"} -{"pc":28,"op":21,"gas":"0x2c44dc","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"ISZERO"} -{"pc":29,"op":128,"gas":"0x2c44d9","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0"],"depth":1,"refund":0,"opName":"DUP1"} -{"pc":30,"op":21,"gas":"0x2c44d6","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x0"],"depth":1,"refund":0,"opName":"ISZERO"} -{"pc":31,"op":97,"gas":"0x2c44d3","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x1"],"depth":1,"refund":0,"opName":"PUSH2"} -{"pc":34,"op":87,"gas":"0x2c44d0","gasCost":"0xa","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x1","0x2c"],"depth":1,"refund":0,"opName":"JUMPI"} -{"pc":44,"op":91,"gas":"0x2c44c6","gasCost":"0x1","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0"],"depth":1,"refund":0,"opName":"JUMPDEST"} -{"pc":45,"op":80,"gas":"0x2c44c5","gasCost":"0x2","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0"],"depth":1,"refund":0,"opName":"POP"} -{"pc":46,"op":96,"gas":"0x2c44c3","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"PUSH1"} -{"pc":48,"op":128,"gas":"0x2c44c0","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0"],"depth":1,"refund":0,"opName":"DUP1"} -{"pc":49,"op":97,"gas":"0x2c44bd","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x0"],"depth":1,"refund":0,"opName":"PUSH2"} -{"pc":52,"op":10,"gas":"0x2c44ba","gasCost":"0xa","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x0","0x100"],"depth":1,"refund":0,"opName":"EXP"} -{"pc":53,"op":129,"gas":"0x2c44b0","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x1"],"depth":1,"refund":0,"opName":"DUP2"} -{"pc":54,"op":84,"gas":"0x2c44ad","gasCost":"0xc8","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x1","0x0"],"depth":1,"refund":0,"opName":"SLOAD"} -{"pc":55,"op":129,"gas":"0x2c43e5","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x1","0x0"],"depth":1,"refund":0,"opName":"DUP2"} -{"pc":56,"op":115,"gas":"0x2c43e2","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x1","0x0","0x1"],"depth":1,"refund":0,"opName":"PUSH20"} -{"pc":77,"op":2,"gas":"0x2c43df","gasCost":"0x5","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x1","0x0","0x1","0xffffffffffffffffffffffffffffffffffffffff"],"depth":1,"refund":0,"opName":"MUL"} -{"pc":78,"op":25,"gas":"0x2c43da","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x1","0x0","0xffffffffffffffffffffffffffffffffffffffff"],"depth":1,"refund":0,"opName":"NOT"} -{"pc":79,"op":22,"gas":"0x2c43d7","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x1","0x0","0xffffffffffffffffffffffff0000000000000000000000000000000000000000"],"depth":1,"refund":0,"opName":"AND"} -{"pc":80,"op":144,"gas":"0x2c43d4","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x1","0x0"],"depth":1,"refund":0,"opName":"SWAP1"} -{"pc":81,"op":131,"gas":"0x2c43d1","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x0","0x1"],"depth":1,"refund":0,"opName":"DUP4"} -{"pc":82,"op":115,"gas":"0x2c43ce","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x0","0x1","0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"PUSH20"} -{"pc":103,"op":22,"gas":"0x2c43cb","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x0","0x1","0xf2cc432c8892c12eede08774adfd63df6f49282","0xffffffffffffffffffffffffffffffffffffffff"],"depth":1,"refund":0,"opName":"AND"} -{"pc":104,"op":2,"gas":"0x2c43c8","gasCost":"0x5","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x0","0x1","0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"MUL"} -{"pc":105,"op":23,"gas":"0x2c43c3","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x0","0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"OR"} -{"pc":106,"op":144,"gas":"0x2c43c0","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"SWAP1"} -{"pc":107,"op":85,"gas":"0x2c43bd","gasCost":"0x1f4","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0xf2cc432c8892c12eede08774adfd63df6f49282","0x0"],"depth":1,"refund":0,"opName":"SSTORE"} -{"pc":108,"op":80,"gas":"0x2c41c9","gasCost":"0x2","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"POP"} -{"pc":109,"op":52,"gas":"0x2c41c7","gasCost":"0x2","memSize":352,"stack":[],"depth":1,"refund":0,"opName":"CALLVALUE"} -{"pc":110,"op":128,"gas":"0x2c41c5","gasCost":"0x3","memSize":352,"stack":["0x0"],"depth":1,"refund":0,"opName":"DUP1"} -{"pc":111,"op":21,"gas":"0x2c41c2","gasCost":"0x3","memSize":352,"stack":["0x0","0x0"],"depth":1,"refund":0,"opName":"ISZERO"} -{"pc":112,"op":97,"gas":"0x2c41bf","gasCost":"0x3","memSize":352,"stack":["0x0","0x1"],"depth":1,"refund":0,"opName":"PUSH2"} -{"pc":115,"op":87,"gas":"0x2c41bc","gasCost":"0xa","memSize":352,"stack":["0x0","0x1","0x78"],"depth":1,"refund":0,"opName":"JUMPI"} -{"pc":120,"op":91,"gas":"0x2c41b2","gasCost":"0x1","memSize":352,"stack":["0x0"],"depth":1,"refund":0,"opName":"JUMPDEST"} -{"pc":121,"op":80,"gas":"0x2c41b1","gasCost":"0x2","memSize":352,"stack":["0x0"],"depth":1,"refund":0,"opName":"POP"} -{"pc":122,"op":96,"gas":"0x2c41af","gasCost":"0x3","memSize":352,"stack":[],"depth":1,"refund":0,"opName":"PUSH1"} -{"pc":124,"op":128,"gas":"0x2c41ac","gasCost":"0x3","memSize":352,"stack":["0x0"],"depth":1,"refund":0,"opName":"DUP1"} -{"pc":125,"op":103,"gas":"0x2c41a9","gasCost":"0x3","memSize":352,"stack":["0x0","0x0"],"depth":1,"refund":0,"opName":"PUSH8"} -{"pc":134,"op":129,"gas":"0x2c41a6","gasCost":"0x3","memSize":352,"stack":["0x0","0x0","0xffffffffffffffff"],"depth":1,"refund":0,"opName":"DUP2"} -{"pc":135,"op":17,"gas":"0x2c41a3","gasCost":"0x3","memSize":352,"stack":["0x0","0x0","0xffffffffffffffff","0x0"],"depth":1,"refund":0,"opName":"GT"} -{"pc":136,"op":21,"gas":"0x2c41a0","gasCost":"0x3","memSize":352,"stack":["0x0","0x0","0x0"],"depth":1,"refund":0,"opName":"ISZERO"} -{"pc":137,"op":97,"gas":"0x2c419d","gasCost":"0x3","memSize":352,"stack":["0x0","0x0","0x1"],"depth":1,"refund":0,"opName":"PUSH2"} -{"pc":140,"op":87,"gas":"0x2c419a","gasCost":"0xa","memSize":352,"stack":["0x0","0x0","0x1","0x95"],"depth":1,"refund":0,"opName":"JUMPI"} -{"pc":149,"op":91,"gas":"0x2c4190","gasCost":"0x1","memSize":352,"stack":["0x0","0x0"],"depth":1,"refund":0,"opName":"JUMPDEST"} -{"pc":150,"op":96,"gas":"0x2c418f","gasCost":"0x3","memSize":352,"stack":["0x0","0x0"],"depth":1,"refund":0,"opName":"PUSH1"} -{"pc":152,"op":81,"gas":"0x2c418c","gasCost":"0x3","memSize":352,"stack":["0x0","0x0","0x40"],"depth":1,"refund":0,"opName":"MLOAD"} -{"pc":153,"op":144,"gas":"0x2c4189","gasCost":"0x3","memSize":352,"stack":["0x0","0x0","0x80"],"depth":1,"refund":0,"opName":"SWAP1"} -{"pc":154,"op":128,"gas":"0x2c4186","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0"],"depth":1,"refund":0,"opName":"DUP1"} -{"pc":155,"op":130,"gas":"0x2c4183","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0x0"],"depth":1,"refund":0,"opName":"DUP3"} -{"pc":156,"op":82,"gas":"0x2c4180","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0x0","0x80"],"depth":1,"refund":0,"opName":"MSTORE"} -{"pc":157,"op":128,"gas":"0x2c417d","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0"],"depth":1,"refund":0,"opName":"DUP1"} -{"pc":158,"op":96,"gas":"0x2c417a","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0x0"],"depth":1,"refund":0,"opName":"PUSH1"} -{"pc":160,"op":1,"gas":"0x2c4177","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0x0","0x1f"],"depth":1,"refund":0,"opName":"ADD"} -{"pc":161,"op":96,"gas":"0x2c4174","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0x1f"],"depth":1,"refund":0,"opName":"PUSH1"} -{"pc":163,"op":25,"gas":"0x2c4171","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0x1f","0x1f"],"depth":1,"refund":0,"opName":"NOT"} -{"pc":164,"op":22,"gas":"0x2c416e","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0x1f","0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"],"depth":1,"refund":0,"opName":"AND"} -{"pc":165,"op":96,"gas":"0x2c416b","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0x0"],"depth":1,"refund":0,"opName":"PUSH1"} -{"pc":167,"op":1,"gas":"0x2c4168","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0x0","0x20"],"depth":1,"refund":0,"opName":"ADD"} -{"pc":168,"op":130,"gas":"0x2c4165","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0x20"],"depth":1,"refund":0,"opName":"DUP3"} -{"pc":169,"op":1,"gas":"0x2c4162","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0x20","0x80"],"depth":1,"refund":0,"opName":"ADD"} -{"pc":170,"op":96,"gas":"0x2c415f","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0xa0"],"depth":1,"refund":0,"opName":"PUSH1"} -{"pc":172,"op":82,"gas":"0x2c415c","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0xa0","0x40"],"depth":1,"refund":0,"opName":"MSTORE"} -{"pc":173,"op":128,"gas":"0x2c4159","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0"],"depth":1,"refund":0,"opName":"DUP1"} -{"pc":174,"op":21,"gas":"0x2c4156","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0x0"],"depth":1,"refund":0,"opName":"ISZERO"} -{"pc":175,"op":97,"gas":"0x2c4153","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0x1"],"depth":1,"refund":0,"opName":"PUSH2"} -{"pc":178,"op":87,"gas":"0x2c4150","gasCost":"0xa","memSize":352,"stack":["0x0","0x80","0x0","0x1","0xc7"],"depth":1,"refund":0,"opName":"JUMPI"} -{"pc":199,"op":91,"gas":"0x2c4146","gasCost":"0x1","memSize":352,"stack":["0x0","0x80","0x0"],"depth":1,"refund":0,"opName":"JUMPDEST"} -{"pc":200,"op":80,"gas":"0x2c4145","gasCost":"0x2","memSize":352,"stack":["0x0","0x80","0x0"],"depth":1,"refund":0,"opName":"POP"} -{"pc":201,"op":144,"gas":"0x2c4143","gasCost":"0x3","memSize":352,"stack":["0x0","0x80"],"depth":1,"refund":0,"opName":"SWAP1"} -{"pc":202,"op":80,"gas":"0x2c4140","gasCost":"0x2","memSize":352,"stack":["0x80","0x0"],"depth":1,"refund":0,"opName":"POP"} -{"pc":203,"op":96,"gas":"0x2c413e","gasCost":"0x3","memSize":352,"stack":["0x80"],"depth":1,"refund":0,"opName":"PUSH1"} -{"pc":205,"op":128,"gas":"0x2c413b","gasCost":"0x3","memSize":352,"stack":["0x80","0x0"],"depth":1,"refund":0,"opName":"DUP1"} -{"pc":206,"op":96,"gas":"0x2c4138","gasCost":"0x3","memSize":352,"stack":["0x80","0x0","0x0"],"depth":1,"refund":0,"opName":"PUSH1"} -{"pc":208,"op":144,"gas":"0x2c4135","gasCost":"0x3","memSize":352,"stack":["0x80","0x0","0x0","0x0"],"depth":1,"refund":0,"opName":"SWAP1"} -{"pc":209,"op":84,"gas":"0x2c4132","gasCost":"0x64","memSize":352,"stack":["0x80","0x0","0x0","0x0"],"depth":1,"refund":0,"opName":"SLOAD"} -{"pc":210,"op":144,"gas":"0x2c40ce","gasCost":"0x3","memSize":352,"stack":["0x80","0x0","0x0","0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"SWAP1"} -{"pc":211,"op":97,"gas":"0x2c40cb","gasCost":"0x3","memSize":352,"stack":["0x80","0x0","0xf2cc432c8892c12eede08774adfd63df6f49282","0x0"],"depth":1,"refund":0,"opName":"PUSH2"} -{"pc":214,"op":10,"gas":"0x2c40c8","gasCost":"0xa","memSize":352,"stack":["0x80","0x0","0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x100"],"depth":1,"refund":0,"opName":"EXP"} -{"pc":215,"op":144,"gas":"0x2c40be","gasCost":"0x3","memSize":352,"stack":["0x80","0x0","0xf2cc432c8892c12eede08774adfd63df6f49282","0x1"],"depth":1,"refund":0,"opName":"SWAP1"} -{"pc":216,"op":4,"gas":"0x2c40bb","gasCost":"0x5","memSize":352,"stack":["0x80","0x0","0x1","0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"DIV"} -{"pc":217,"op":115,"gas":"0x2c40b6","gasCost":"0x3","memSize":352,"stack":["0x80","0x0","0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"PUSH20"} -{"pc":238,"op":22,"gas":"0x2c40b3","gasCost":"0x3","memSize":352,"stack":["0x80","0x0","0xf2cc432c8892c12eede08774adfd63df6f49282","0xffffffffffffffffffffffffffffffffffffffff"],"depth":1,"refund":0,"opName":"AND"} -{"pc":239,"op":144,"gas":"0x2c40b0","gasCost":"0x3","memSize":352,"stack":["0x80","0x0","0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"SWAP1"} -{"pc":240,"op":80,"gas":"0x2c40ad","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x0"],"depth":1,"refund":0,"opName":"POP"} -{"pc":241,"op":96,"gas":"0x2c40ab","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"PUSH1"} -{"pc":243,"op":96,"gas":"0x2c40a8","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x20"],"depth":1,"refund":0,"opName":"PUSH1"} -{"pc":245,"op":131,"gas":"0x2c40a5","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x20","0x0"],"depth":1,"refund":0,"opName":"DUP4"} -{"pc":246,"op":131,"gas":"0x2c40a2","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x20","0x0","0x80"],"depth":1,"refund":0,"opName":"DUP4"} -{"pc":247,"op":60,"gas":"0x2c409f","gasCost":"0x67","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x20","0x0","0x80","0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"EXTCODECOPY"} -{"pc":248,"op":129,"gas":"0x2c4038","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"DUP2"} -{"pc":249,"op":97,"gas":"0x2c4035","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80"],"depth":1,"refund":0,"opName":"PUSH2"} -{"pc":252,"op":144,"gas":"0x2c4032","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80","0x101"],"depth":1,"refund":0,"opName":"SWAP1"} -{"pc":253,"op":97,"gas":"0x2c402f","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80"],"depth":1,"refund":0,"opName":"PUSH2"} -{"pc":256,"op":86,"gas":"0x2c402c","gasCost":"0x8","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x1e3"],"depth":1,"refund":0,"opName":"JUMP"} -{"pc":483,"op":91,"gas":"0x2c4024","gasCost":"0x1","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80"],"depth":1,"refund":0,"opName":"JUMPDEST"} -{"pc":484,"op":96,"gas":"0x2c4023","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80"],"depth":1,"refund":0,"opName":"PUSH1"} -{"pc":486,"op":97,"gas":"0x2c4020","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0"],"depth":1,"refund":0,"opName":"PUSH2"} -{"pc":489,"op":130,"gas":"0x2c401d","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x1ee"],"depth":1,"refund":0,"opName":"DUP3"} -{"pc":490,"op":97,"gas":"0x2c401a","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x1ee","0x80"],"depth":1,"refund":0,"opName":"PUSH2"} -{"pc":493,"op":86,"gas":"0x2c4017","gasCost":"0x8","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x1ee","0x80","0x1ce"],"depth":1,"refund":0,"opName":"JUMP"} -{"pc":462,"op":91,"gas":"0x2c400f","gasCost":"0x1","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x1ee","0x80"],"depth":1,"refund":0,"opName":"JUMPDEST"} -{"pc":463,"op":96,"gas":"0x2c400e","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x1ee","0x80"],"depth":1,"refund":0,"opName":"PUSH1"} -{"pc":465,"op":129,"gas":"0x2c400b","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x1ee","0x80","0x0"],"depth":1,"refund":0,"opName":"DUP2"} -{"pc":466,"op":81,"gas":"0x2c4008","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x1ee","0x80","0x0","0x80"],"depth":1,"refund":0,"opName":"MLOAD"} -{"pc":467,"op":144,"gas":"0x2c4005","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x1ee","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063"],"depth":1,"refund":0,"opName":"SWAP1"} -{"pc":468,"op":80,"gas":"0x2c4002","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x1ee","0x80","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x0"],"depth":1,"refund":0,"opName":"POP"} -{"pc":469,"op":145,"gas":"0x2c4000","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x1ee","0x80","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063"],"depth":1,"refund":0,"opName":"SWAP2"} -{"pc":470,"op":144,"gas":"0x2c3ffd","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1ee"],"depth":1,"refund":0,"opName":"SWAP1"} -{"pc":471,"op":80,"gas":"0x2c3ffa","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x1ee","0x80"],"depth":1,"refund":0,"opName":"POP"} -{"pc":472,"op":86,"gas":"0x2c3ff8","gasCost":"0x8","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x1ee"],"depth":1,"refund":0,"opName":"JUMP"} -{"pc":494,"op":91,"gas":"0x2c3ff0","gasCost":"0x1","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063"],"depth":1,"refund":0,"opName":"JUMPDEST"} -{"pc":495,"op":130,"gas":"0x2c3fef","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063"],"depth":1,"refund":0,"opName":"DUP3"} -{"pc":496,"op":97,"gas":"0x2c3fec","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80"],"depth":1,"refund":0,"opName":"PUSH2"} -{"pc":499,"op":132,"gas":"0x2c3fe9","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8"],"depth":1,"refund":0,"opName":"DUP5"} -{"pc":500,"op":97,"gas":"0x2c3fe6","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8","0x80"],"depth":1,"refund":0,"opName":"PUSH2"} -{"pc":503,"op":86,"gas":"0x2c3fe3","gasCost":"0x8","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8","0x80","0x1be"],"depth":1,"refund":0,"opName":"JUMP"} -{"pc":446,"op":91,"gas":"0x2c3fdb","gasCost":"0x1","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8","0x80"],"depth":1,"refund":0,"opName":"JUMPDEST"} -{"pc":447,"op":96,"gas":"0x2c3fda","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8","0x80"],"depth":1,"refund":0,"opName":"PUSH1"} -{"pc":449,"op":129,"gas":"0x2c3fd7","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8","0x80","0x0"],"depth":1,"refund":0,"opName":"DUP2"} -{"pc":450,"op":144,"gas":"0x2c3fd4","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8","0x80","0x0","0x80"],"depth":1,"refund":0,"opName":"SWAP1"} -{"pc":451,"op":80,"gas":"0x2c3fd1","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8","0x80","0x80","0x0"],"depth":1,"refund":0,"opName":"POP"} -{"pc":452,"op":96,"gas":"0x2c3fcf","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8","0x80","0x80"],"depth":1,"refund":0,"opName":"PUSH1"} -{"pc":454,"op":130,"gas":"0x2c3fcc","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8","0x80","0x80","0x20"],"depth":1,"refund":0,"opName":"DUP3"} -{"pc":455,"op":1,"gas":"0x2c3fc9","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8","0x80","0x80","0x20","0x80"],"depth":1,"refund":0,"opName":"ADD"} -{"pc":456,"op":144,"gas":"0x2c3fc6","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8","0x80","0x80","0xa0"],"depth":1,"refund":0,"opName":"SWAP1"} -{"pc":457,"op":80,"gas":"0x2c3fc3","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8","0x80","0xa0","0x80"],"depth":1,"refund":0,"opName":"POP"} -{"pc":458,"op":145,"gas":"0x2c3fc1","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8","0x80","0xa0"],"depth":1,"refund":0,"opName":"SWAP2"} -{"pc":459,"op":144,"gas":"0x2c3fbe","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0xa0","0x80","0x1f8"],"depth":1,"refund":0,"opName":"SWAP1"} -{"pc":460,"op":80,"gas":"0x2c3fbb","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0xa0","0x1f8","0x80"],"depth":1,"refund":0,"opName":"POP"} -{"pc":461,"op":86,"gas":"0x2c3fb9","gasCost":"0x8","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0xa0","0x1f8"],"depth":1,"refund":0,"opName":"JUMP"} -{"pc":504,"op":91,"gas":"0x2c3fb1","gasCost":"0x1","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0xa0"],"depth":1,"refund":0,"opName":"JUMPDEST"} -{"pc":505,"op":144,"gas":"0x2c3fb0","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0xa0"],"depth":1,"refund":0,"opName":"SWAP1"} -{"pc":506,"op":80,"gas":"0x2c3fad","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x80"],"depth":1,"refund":0,"opName":"POP"} -{"pc":507,"op":97,"gas":"0x2c3fab","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0"],"depth":1,"refund":0,"opName":"PUSH2"} -{"pc":510,"op":129,"gas":"0x2c3fa8","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203"],"depth":1,"refund":0,"opName":"DUP2"} -{"pc":511,"op":97,"gas":"0x2c3fa5","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0"],"depth":1,"refund":0,"opName":"PUSH2"} -{"pc":514,"op":86,"gas":"0x2c3fa2","gasCost":"0x8","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x279"],"depth":1,"refund":0,"opName":"JUMP"} -{"pc":633,"op":91,"gas":"0x2c3f9a","gasCost":"0x1","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0"],"depth":1,"refund":0,"opName":"JUMPDEST"} -{"pc":634,"op":96,"gas":"0x2c3f99","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0"],"depth":1,"refund":0,"opName":"PUSH1"} -{"pc":636,"op":97,"gas":"0x2c3f96","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0"],"depth":1,"refund":0,"opName":"PUSH2"} -{"pc":639,"op":130,"gas":"0x2c3f93","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x285"],"depth":1,"refund":0,"opName":"DUP3"} -{"pc":640,"op":81,"gas":"0x2c3f90","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x285","0xa0"],"depth":1,"refund":0,"opName":"MLOAD"} -{"pc":641,"op":97,"gas":"0x2c3f8d","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x285","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"PUSH2"} -{"pc":644,"op":86,"gas":"0x2c3f8a","gasCost":"0x8","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x285","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x1d9"],"depth":1,"refund":0,"opName":"JUMP"} -{"pc":473,"op":91,"gas":"0x2c3f82","gasCost":"0x1","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x285","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"JUMPDEST"} -{"pc":474,"op":96,"gas":"0x2c3f81","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x285","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"PUSH1"} -{"pc":476,"op":129,"gas":"0x2c3f7e","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x285","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":1,"refund":0,"opName":"DUP2"} -{"pc":477,"op":144,"gas":"0x2c3f7b","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x285","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"SWAP1"} -{"pc":478,"op":80,"gas":"0x2c3f78","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x285","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":1,"refund":0,"opName":"POP"} -{"pc":479,"op":145,"gas":"0x2c3f76","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x285","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"SWAP2"} -{"pc":480,"op":144,"gas":"0x2c3f73","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x285"],"depth":1,"refund":0,"opName":"SWAP1"} -{"pc":481,"op":80,"gas":"0x2c3f70","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x285","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"POP"} -{"pc":482,"op":86,"gas":"0x2c3f6e","gasCost":"0x8","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x285"],"depth":1,"refund":0,"opName":"JUMP"} -{"pc":645,"op":91,"gas":"0x2c3f66","gasCost":"0x1","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"JUMPDEST"} -{"pc":646,"op":128,"gas":"0x2c3f65","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"DUP1"} -{"pc":647,"op":145,"gas":"0x2c3f62","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"SWAP2"} -{"pc":648,"op":80,"gas":"0x2c3f5f","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":1,"refund":0,"opName":"POP"} -{"pc":649,"op":80,"gas":"0x2c3f5d","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"POP"} -{"pc":650,"op":145,"gas":"0x2c3f5b","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"SWAP2"} -{"pc":651,"op":144,"gas":"0x2c3f58","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0xa0","0x203"],"depth":1,"refund":0,"opName":"SWAP1"} -{"pc":652,"op":80,"gas":"0x2c3f55","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x203","0xa0"],"depth":1,"refund":0,"opName":"POP"} -{"pc":653,"op":86,"gas":"0x2c3f53","gasCost":"0x8","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x203"],"depth":1,"refund":0,"opName":"JUMP"} -{"pc":515,"op":91,"gas":"0x2c3f4b","gasCost":"0x1","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"JUMPDEST"} -{"pc":516,"op":146,"gas":"0x2c3f4a","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"SWAP3"} -{"pc":517,"op":80,"gas":"0x2c3f47","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x0"],"depth":1,"refund":0,"opName":"POP"} -{"pc":518,"op":96,"gas":"0x2c3f45","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0"],"depth":1,"refund":0,"opName":"PUSH1"} -{"pc":520,"op":130,"gas":"0x2c3f42","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x20"],"depth":1,"refund":0,"opName":"DUP3"} -{"pc":521,"op":16,"gas":"0x2c3f3f","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x20","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063"],"depth":1,"refund":0,"opName":"LT"} -{"pc":522,"op":21,"gas":"0x2c3f3c","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x0"],"depth":1,"refund":0,"opName":"ISZERO"} -{"pc":523,"op":97,"gas":"0x2c3f39","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x1"],"depth":1,"refund":0,"opName":"PUSH2"} -{"pc":526,"op":87,"gas":"0x2c3f36","gasCost":"0xa","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x1","0x243"],"depth":1,"refund":0,"opName":"JUMPI"} -{"pc":579,"op":91,"gas":"0x2c3f2c","gasCost":"0x1","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0"],"depth":1,"refund":0,"opName":"JUMPDEST"} -{"pc":580,"op":80,"gas":"0x2c3f2b","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0"],"depth":1,"refund":0,"opName":"POP"} -{"pc":581,"op":80,"gas":"0x2c3f29","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063"],"depth":1,"refund":0,"opName":"POP"} -{"pc":582,"op":145,"gas":"0x2c3f27","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"SWAP2"} -{"pc":583,"op":144,"gas":"0x2c3f24","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80","0x101"],"depth":1,"refund":0,"opName":"SWAP1"} -{"pc":584,"op":80,"gas":"0x2c3f21","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x101","0x80"],"depth":1,"refund":0,"opName":"POP"} -{"pc":585,"op":86,"gas":"0x2c3f1f","gasCost":"0x8","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x101"],"depth":1,"refund":0,"opName":"JUMP"} -{"pc":257,"op":91,"gas":"0x2c3f17","gasCost":"0x1","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"JUMPDEST"} -{"pc":258,"op":96,"gas":"0x2c3f16","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"PUSH1"} -{"pc":260,"op":81,"gas":"0x2c3f13","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x40"],"depth":1,"refund":0,"opName":"MLOAD"} -{"pc":261,"op":97,"gas":"0x2c3f10","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0xa0"],"depth":1,"refund":0,"opName":"PUSH2"} -{"pc":264,"op":144,"gas":"0x2c3f0d","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0xa0","0x10d"],"depth":1,"refund":0,"opName":"SWAP1"} -{"pc":265,"op":97,"gas":"0x2c3f0a","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x10d","0xa0"],"depth":1,"refund":0,"opName":"PUSH2"} -{"pc":268,"op":86,"gas":"0x2c3f07","gasCost":"0x8","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x10d","0xa0","0x187"],"depth":1,"refund":0,"opName":"JUMP"} -{"pc":391,"op":91,"gas":"0x2c3eff","gasCost":"0x1","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x10d","0xa0"],"depth":1,"refund":0,"opName":"JUMPDEST"} -{"pc":392,"op":97,"gas":"0x2c3efe","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x10d","0xa0"],"depth":1,"refund":0,"opName":"PUSH2"} -{"pc":395,"op":128,"gas":"0x2c3efb","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x10d","0xa0","0x206"],"depth":1,"refund":0,"opName":"DUP1"} -{"pc":396,"op":97,"gas":"0x2c3ef8","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x10d","0xa0","0x206","0x206"],"depth":1,"refund":0,"opName":"PUSH2"} -{"pc":399,"op":131,"gas":"0x2c3ef5","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x10d","0xa0","0x206","0x206","0x53c"],"depth":1,"refund":0,"opName":"DUP4"} -{"pc":400,"op":57,"gas":"0x2c3ef2","gasCost":"0x57","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x10d","0xa0","0x206","0x206","0x53c","0xa0"],"depth":1,"refund":0,"opName":"CODECOPY"} -{"pc":401,"op":1,"gas":"0x2c3e9b","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x10d","0xa0","0x206"],"depth":1,"refund":0,"opName":"ADD"} -{"pc":402,"op":144,"gas":"0x2c3e98","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x10d","0x2a6"],"depth":1,"refund":0,"opName":"SWAP1"} -{"pc":403,"op":86,"gas":"0x2c3e95","gasCost":"0x8","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x10d"],"depth":1,"refund":0,"opName":"JUMP"} -{"pc":269,"op":91,"gas":"0x2c3e8d","gasCost":"0x1","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6"],"depth":1,"refund":0,"opName":"JUMPDEST"} -{"pc":270,"op":97,"gas":"0x2c3e8c","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6"],"depth":1,"refund":0,"opName":"PUSH2"} -{"pc":273,"op":145,"gas":"0x2c3e89","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x117"],"depth":1,"refund":0,"opName":"SWAP2"} -{"pc":274,"op":144,"gas":"0x2c3e86","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"SWAP1"} -{"pc":275,"op":97,"gas":"0x2c3e83","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6"],"depth":1,"refund":0,"opName":"PUSH2"} -{"pc":278,"op":86,"gas":"0x2c3e80","gasCost":"0x8","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x1a3"],"depth":1,"refund":0,"opName":"JUMP"} -{"pc":419,"op":91,"gas":"0x2c3e78","gasCost":"0x1","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6"],"depth":1,"refund":0,"opName":"JUMPDEST"} -{"pc":420,"op":96,"gas":"0x2c3e77","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6"],"depth":1,"refund":0,"opName":"PUSH1"} -{"pc":422,"op":96,"gas":"0x2c3e74","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x0"],"depth":1,"refund":0,"opName":"PUSH1"} -{"pc":424,"op":130,"gas":"0x2c3e71","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x0","0x20"],"depth":1,"refund":0,"opName":"DUP3"} -{"pc":425,"op":1,"gas":"0x2c3e6e","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x0","0x20","0x2a6"],"depth":1,"refund":0,"opName":"ADD"} -{"pc":426,"op":144,"gas":"0x2c3e6b","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x0","0x2c6"],"depth":1,"refund":0,"opName":"SWAP1"} -{"pc":427,"op":80,"gas":"0x2c3e68","gasCost":"0x2","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x0"],"depth":1,"refund":0,"opName":"POP"} -{"pc":428,"op":97,"gas":"0x2c3e66","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6"],"depth":1,"refund":0,"opName":"PUSH2"} -{"pc":431,"op":96,"gas":"0x2c3e63","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8"],"depth":1,"refund":0,"opName":"PUSH1"} -{"pc":433,"op":131,"gas":"0x2c3e60","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x0"],"depth":1,"refund":0,"opName":"DUP4"} -{"pc":434,"op":1,"gas":"0x2c3e5d","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x0","0x2a6"],"depth":1,"refund":0,"opName":"ADD"} -{"pc":435,"op":132,"gas":"0x2c3e5a","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6"],"depth":1,"refund":0,"opName":"DUP5"} -{"pc":436,"op":97,"gas":"0x2c3e57","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"PUSH2"} -{"pc":439,"op":86,"gas":"0x2c3e54","gasCost":"0x8","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x194"],"depth":1,"refund":0,"opName":"JUMP"} -{"pc":404,"op":91,"gas":"0x2c3e4c","gasCost":"0x1","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"JUMPDEST"} -{"pc":405,"op":97,"gas":"0x2c3e4b","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"PUSH2"} -{"pc":408,"op":129,"gas":"0x2c3e48","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x19d"],"depth":1,"refund":0,"opName":"DUP2"} -{"pc":409,"op":97,"gas":"0x2c3e45","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x19d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"PUSH2"} -{"pc":412,"op":86,"gas":"0x2c3e42","gasCost":"0x8","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x19d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x1d9"],"depth":1,"refund":0,"opName":"JUMP"} -{"pc":473,"op":91,"gas":"0x2c3e3a","gasCost":"0x1","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x19d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"JUMPDEST"} -{"pc":474,"op":96,"gas":"0x2c3e39","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x19d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"PUSH1"} -{"pc":476,"op":129,"gas":"0x2c3e36","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x19d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":1,"refund":0,"opName":"DUP2"} -{"pc":477,"op":144,"gas":"0x2c3e33","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x19d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"SWAP1"} -{"pc":478,"op":80,"gas":"0x2c3e30","gasCost":"0x2","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x19d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":1,"refund":0,"opName":"POP"} -{"pc":479,"op":145,"gas":"0x2c3e2e","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x19d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"SWAP2"} -{"pc":480,"op":144,"gas":"0x2c3e2b","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x19d"],"depth":1,"refund":0,"opName":"SWAP1"} -{"pc":481,"op":80,"gas":"0x2c3e28","gasCost":"0x2","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x19d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"POP"} -{"pc":482,"op":86,"gas":"0x2c3e26","gasCost":"0x8","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x19d"],"depth":1,"refund":0,"opName":"JUMP"} -{"pc":413,"op":91,"gas":"0x2c3e1e","gasCost":"0x1","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"JUMPDEST"} -{"pc":414,"op":130,"gas":"0x2c3e1d","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"DUP3"} -{"pc":415,"op":82,"gas":"0x2c3e1a","gasCost":"0x7","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6"],"depth":1,"refund":0,"opName":"MSTORE"} -{"pc":416,"op":80,"gas":"0x2c3e13","gasCost":"0x2","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"POP"} -{"pc":417,"op":80,"gas":"0x2c3e11","gasCost":"0x2","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6"],"depth":1,"refund":0,"opName":"POP"} -{"pc":418,"op":86,"gas":"0x2c3e0f","gasCost":"0x8","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8"],"depth":1,"refund":0,"opName":"JUMP"} -{"pc":440,"op":91,"gas":"0x2c3e07","gasCost":"0x1","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6"],"depth":1,"refund":0,"opName":"JUMPDEST"} -{"pc":441,"op":146,"gas":"0x2c3e06","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6"],"depth":1,"refund":0,"opName":"SWAP3"} -{"pc":442,"op":145,"gas":"0x2c3e03","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x2c6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x117"],"depth":1,"refund":0,"opName":"SWAP2"} -{"pc":443,"op":80,"gas":"0x2c3e00","gasCost":"0x2","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x2c6","0x117","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"POP"} -{"pc":444,"op":80,"gas":"0x2c3dfe","gasCost":"0x2","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x2c6","0x117","0x2a6"],"depth":1,"refund":0,"opName":"POP"} -{"pc":445,"op":86,"gas":"0x2c3dfc","gasCost":"0x8","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x2c6","0x117"],"depth":1,"refund":0,"opName":"JUMP"} -{"pc":279,"op":91,"gas":"0x2c3df4","gasCost":"0x1","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x2c6"],"depth":1,"refund":0,"opName":"JUMPDEST"} -{"pc":280,"op":96,"gas":"0x2c3df3","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x2c6"],"depth":1,"refund":0,"opName":"PUSH1"} -{"pc":282,"op":81,"gas":"0x2c3df0","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x2c6","0x40"],"depth":1,"refund":0,"opName":"MLOAD"} -{"pc":283,"op":128,"gas":"0x2c3ded","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x2c6","0xa0"],"depth":1,"refund":0,"opName":"DUP1"} -{"pc":284,"op":145,"gas":"0x2c3dea","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x2c6","0xa0","0xa0"],"depth":1,"refund":0,"opName":"SWAP2"} -{"pc":285,"op":3,"gas":"0x2c3de7","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0xa0","0xa0","0x2c6"],"depth":1,"refund":0,"opName":"SUB"} -{"pc":286,"op":144,"gas":"0x2c3de4","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0xa0","0x226"],"depth":1,"refund":0,"opName":"SWAP1"} -{"pc":287,"op":96,"gas":"0x2c3de1","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x226","0xa0"],"depth":1,"refund":0,"opName":"PUSH1"} -{"pc":289,"op":240,"gas":"0x2c3dde","gasCost":"0x40c","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x226","0xa0","0x0"],"depth":1,"refund":0,"opName":"CREATE"} -{"pc":0,"op":96,"gas":"0x2b704f","gasCost":"0x3","memSize":0,"stack":[],"depth":2,"refund":0,"opName":"PUSH1"} -{"pc":2,"op":96,"gas":"0x2b704c","gasCost":"0x3","memSize":0,"stack":["0x80"],"depth":2,"refund":0,"opName":"PUSH1"} -{"pc":4,"op":82,"gas":"0x2b7049","gasCost":"0xc","memSize":0,"stack":["0x80","0x40"],"depth":2,"refund":0,"opName":"MSTORE"} -{"pc":5,"op":52,"gas":"0x2b703d","gasCost":"0x2","memSize":96,"stack":[],"depth":2,"refund":0,"opName":"CALLVALUE"} -{"pc":6,"op":128,"gas":"0x2b703b","gasCost":"0x3","memSize":96,"stack":["0x0"],"depth":2,"refund":0,"opName":"DUP1"} -{"pc":7,"op":21,"gas":"0x2b7038","gasCost":"0x3","memSize":96,"stack":["0x0","0x0"],"depth":2,"refund":0,"opName":"ISZERO"} -{"pc":8,"op":97,"gas":"0x2b7035","gasCost":"0x3","memSize":96,"stack":["0x0","0x1"],"depth":2,"refund":0,"opName":"PUSH2"} -{"pc":11,"op":87,"gas":"0x2b7032","gasCost":"0xa","memSize":96,"stack":["0x0","0x1","0x10"],"depth":2,"refund":0,"opName":"JUMPI"} -{"pc":16,"op":91,"gas":"0x2b7028","gasCost":"0x1","memSize":96,"stack":["0x0"],"depth":2,"refund":0,"opName":"JUMPDEST"} -{"pc":17,"op":80,"gas":"0x2b7027","gasCost":"0x2","memSize":96,"stack":["0x0"],"depth":2,"refund":0,"opName":"POP"} -{"pc":18,"op":96,"gas":"0x2b7025","gasCost":"0x3","memSize":96,"stack":[],"depth":2,"refund":0,"opName":"PUSH1"} -{"pc":20,"op":81,"gas":"0x2b7022","gasCost":"0x3","memSize":96,"stack":["0x40"],"depth":2,"refund":0,"opName":"MLOAD"} -{"pc":21,"op":97,"gas":"0x2b701f","gasCost":"0x3","memSize":96,"stack":["0x80"],"depth":2,"refund":0,"opName":"PUSH2"} -{"pc":24,"op":56,"gas":"0x2b701c","gasCost":"0x2","memSize":96,"stack":["0x80","0x206"],"depth":2,"refund":0,"opName":"CODESIZE"} -{"pc":25,"op":3,"gas":"0x2b701a","gasCost":"0x3","memSize":96,"stack":["0x80","0x206","0x226"],"depth":2,"refund":0,"opName":"SUB"} -{"pc":26,"op":128,"gas":"0x2b7017","gasCost":"0x3","memSize":96,"stack":["0x80","0x20"],"depth":2,"refund":0,"opName":"DUP1"} -{"pc":27,"op":97,"gas":"0x2b7014","gasCost":"0x3","memSize":96,"stack":["0x80","0x20","0x20"],"depth":2,"refund":0,"opName":"PUSH2"} -{"pc":30,"op":131,"gas":"0x2b7011","gasCost":"0x3","memSize":96,"stack":["0x80","0x20","0x20","0x206"],"depth":2,"refund":0,"opName":"DUP4"} -{"pc":31,"op":57,"gas":"0x2b700e","gasCost":"0xc","memSize":96,"stack":["0x80","0x20","0x20","0x206","0x80"],"depth":2,"refund":0,"opName":"CODECOPY"} -{"pc":32,"op":129,"gas":"0x2b7002","gasCost":"0x3","memSize":160,"stack":["0x80","0x20"],"depth":2,"refund":0,"opName":"DUP2"} -{"pc":33,"op":129,"gas":"0x2b6fff","gasCost":"0x3","memSize":160,"stack":["0x80","0x20","0x80"],"depth":2,"refund":0,"opName":"DUP2"} -{"pc":34,"op":1,"gas":"0x2b6ffc","gasCost":"0x3","memSize":160,"stack":["0x80","0x20","0x80","0x20"],"depth":2,"refund":0,"opName":"ADD"} -{"pc":35,"op":96,"gas":"0x2b6ff9","gasCost":"0x3","memSize":160,"stack":["0x80","0x20","0xa0"],"depth":2,"refund":0,"opName":"PUSH1"} -{"pc":37,"op":82,"gas":"0x2b6ff6","gasCost":"0x3","memSize":160,"stack":["0x80","0x20","0xa0","0x40"],"depth":2,"refund":0,"opName":"MSTORE"} -{"pc":38,"op":129,"gas":"0x2b6ff3","gasCost":"0x3","memSize":160,"stack":["0x80","0x20"],"depth":2,"refund":0,"opName":"DUP2"} -{"pc":39,"op":1,"gas":"0x2b6ff0","gasCost":"0x3","memSize":160,"stack":["0x80","0x20","0x80"],"depth":2,"refund":0,"opName":"ADD"} -{"pc":40,"op":144,"gas":"0x2b6fed","gasCost":"0x3","memSize":160,"stack":["0x80","0xa0"],"depth":2,"refund":0,"opName":"SWAP1"} -{"pc":41,"op":97,"gas":"0x2b6fea","gasCost":"0x3","memSize":160,"stack":["0xa0","0x80"],"depth":2,"refund":0,"opName":"PUSH2"} -{"pc":44,"op":145,"gas":"0x2b6fe7","gasCost":"0x3","memSize":160,"stack":["0xa0","0x80","0x32"],"depth":2,"refund":0,"opName":"SWAP2"} -{"pc":45,"op":144,"gas":"0x2b6fe4","gasCost":"0x3","memSize":160,"stack":["0x32","0x80","0xa0"],"depth":2,"refund":0,"opName":"SWAP1"} -{"pc":46,"op":97,"gas":"0x2b6fe1","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80"],"depth":2,"refund":0,"opName":"PUSH2"} -{"pc":49,"op":86,"gas":"0x2b6fde","gasCost":"0x8","memSize":160,"stack":["0x32","0xa0","0x80","0x63"],"depth":2,"refund":0,"opName":"JUMP"} -{"pc":99,"op":91,"gas":"0x2b6fd6","gasCost":"0x1","memSize":160,"stack":["0x32","0xa0","0x80"],"depth":2,"refund":0,"opName":"JUMPDEST"} -{"pc":100,"op":96,"gas":"0x2b6fd5","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80"],"depth":2,"refund":0,"opName":"PUSH1"} -{"pc":102,"op":96,"gas":"0x2b6fd2","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0"],"depth":2,"refund":0,"opName":"PUSH1"} -{"pc":104,"op":130,"gas":"0x2b6fcf","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x20"],"depth":2,"refund":0,"opName":"DUP3"} -{"pc":105,"op":132,"gas":"0x2b6fcc","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x20","0x80"],"depth":2,"refund":0,"opName":"DUP5"} -{"pc":106,"op":3,"gas":"0x2b6fc9","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x20","0x80","0xa0"],"depth":2,"refund":0,"opName":"SUB"} -{"pc":107,"op":18,"gas":"0x2b6fc6","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x20","0x20"],"depth":2,"refund":0,"opName":"SLT"} -{"pc":108,"op":21,"gas":"0x2b6fc3","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0"],"depth":2,"refund":0,"opName":"ISZERO"} -{"pc":109,"op":97,"gas":"0x2b6fc0","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x1"],"depth":2,"refund":0,"opName":"PUSH2"} -{"pc":112,"op":87,"gas":"0x2b6fbd","gasCost":"0xa","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x1","0x79"],"depth":2,"refund":0,"opName":"JUMPI"} -{"pc":121,"op":91,"gas":"0x2b6fb3","gasCost":"0x1","memSize":160,"stack":["0x32","0xa0","0x80","0x0"],"depth":2,"refund":0,"opName":"JUMPDEST"} -{"pc":122,"op":96,"gas":"0x2b6fb2","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0"],"depth":2,"refund":0,"opName":"PUSH1"} -{"pc":124,"op":97,"gas":"0x2b6faf","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0"],"depth":2,"refund":0,"opName":"PUSH2"} -{"pc":127,"op":132,"gas":"0x2b6fac","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87"],"depth":2,"refund":0,"opName":"DUP5"} -{"pc":128,"op":130,"gas":"0x2b6fa9","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0"],"depth":2,"refund":0,"opName":"DUP3"} -{"pc":129,"op":133,"gas":"0x2b6fa6","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x0"],"depth":2,"refund":0,"opName":"DUP6"} -{"pc":130,"op":1,"gas":"0x2b6fa3","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x0","0x80"],"depth":2,"refund":0,"opName":"ADD"} -{"pc":131,"op":97,"gas":"0x2b6fa0","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80"],"depth":2,"refund":0,"opName":"PUSH2"} -{"pc":134,"op":86,"gas":"0x2b6f9d","gasCost":"0x8","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x4e"],"depth":2,"refund":0,"opName":"JUMP"} -{"pc":78,"op":91,"gas":"0x2b6f95","gasCost":"0x1","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80"],"depth":2,"refund":0,"opName":"JUMPDEST"} -{"pc":79,"op":96,"gas":"0x2b6f94","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80"],"depth":2,"refund":0,"opName":"PUSH1"} -{"pc":81,"op":129,"gas":"0x2b6f91","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x0"],"depth":2,"refund":0,"opName":"DUP2"} -{"pc":82,"op":81,"gas":"0x2b6f8e","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x0","0x80"],"depth":2,"refund":0,"opName":"MLOAD"} -{"pc":83,"op":144,"gas":"0x2b6f8b","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"SWAP1"} -{"pc":84,"op":80,"gas":"0x2b6f88","gasCost":"0x2","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":2,"refund":0,"opName":"POP"} -{"pc":85,"op":97,"gas":"0x2b6f86","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"PUSH2"} -{"pc":88,"op":129,"gas":"0x2b6f83","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d"],"depth":2,"refund":0,"opName":"DUP2"} -{"pc":89,"op":97,"gas":"0x2b6f80","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"PUSH2"} -{"pc":92,"op":86,"gas":"0x2b6f7d","gasCost":"0x8","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x12e"],"depth":2,"refund":0,"opName":"JUMP"} -{"pc":302,"op":91,"gas":"0x2b6f75","gasCost":"0x1","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"JUMPDEST"} -{"pc":303,"op":97,"gas":"0x2b6f74","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"PUSH2"} -{"pc":306,"op":129,"gas":"0x2b6f71","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x137"],"depth":2,"refund":0,"opName":"DUP2"} -{"pc":307,"op":97,"gas":"0x2b6f6e","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x137","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"PUSH2"} -{"pc":310,"op":86,"gas":"0x2b6f6b","gasCost":"0x8","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x137","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0xe6"],"depth":2,"refund":0,"opName":"JUMP"} -{"pc":230,"op":91,"gas":"0x2b6f63","gasCost":"0x1","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x137","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"JUMPDEST"} -{"pc":231,"op":96,"gas":"0x2b6f62","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x137","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"PUSH1"} -{"pc":233,"op":129,"gas":"0x2b6f5f","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x137","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":2,"refund":0,"opName":"DUP2"} -{"pc":234,"op":144,"gas":"0x2b6f5c","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x137","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"SWAP1"} -{"pc":235,"op":80,"gas":"0x2b6f59","gasCost":"0x2","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x137","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":2,"refund":0,"opName":"POP"} -{"pc":236,"op":145,"gas":"0x2b6f57","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x137","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"SWAP2"} -{"pc":237,"op":144,"gas":"0x2b6f54","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x137"],"depth":2,"refund":0,"opName":"SWAP1"} -{"pc":238,"op":80,"gas":"0x2b6f51","gasCost":"0x2","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x137","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"POP"} -{"pc":239,"op":86,"gas":"0x2b6f4f","gasCost":"0x8","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x137"],"depth":2,"refund":0,"opName":"JUMP"} -{"pc":311,"op":91,"gas":"0x2b6f47","gasCost":"0x1","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"JUMPDEST"} -{"pc":312,"op":129,"gas":"0x2b6f46","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"DUP2"} -{"pc":313,"op":20,"gas":"0x2b6f43","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"EQ"} -{"pc":314,"op":97,"gas":"0x2b6f40","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x1"],"depth":2,"refund":0,"opName":"PUSH2"} -{"pc":317,"op":87,"gas":"0x2b6f3d","gasCost":"0xa","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x1","0x142"],"depth":2,"refund":0,"opName":"JUMPI"} -{"pc":322,"op":91,"gas":"0x2b6f33","gasCost":"0x1","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"JUMPDEST"} -{"pc":323,"op":80,"gas":"0x2b6f32","gasCost":"0x2","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"POP"} -{"pc":324,"op":86,"gas":"0x2b6f30","gasCost":"0x8","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d"],"depth":2,"refund":0,"opName":"JUMP"} -{"pc":93,"op":91,"gas":"0x2b6f28","gasCost":"0x1","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"JUMPDEST"} -{"pc":94,"op":146,"gas":"0x2b6f27","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"SWAP3"} -{"pc":95,"op":145,"gas":"0x2b6f24","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0xa0","0x80","0x87"],"depth":2,"refund":0,"opName":"SWAP2"} -{"pc":96,"op":80,"gas":"0x2b6f21","gasCost":"0x2","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x87","0x80","0xa0"],"depth":2,"refund":0,"opName":"POP"} -{"pc":97,"op":80,"gas":"0x2b6f1f","gasCost":"0x2","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x87","0x80"],"depth":2,"refund":0,"opName":"POP"} -{"pc":98,"op":86,"gas":"0x2b6f1d","gasCost":"0x8","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x87"],"depth":2,"refund":0,"opName":"JUMP"} -{"pc":135,"op":91,"gas":"0x2b6f15","gasCost":"0x1","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"JUMPDEST"} -{"pc":136,"op":145,"gas":"0x2b6f14","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"SWAP2"} -{"pc":137,"op":80,"gas":"0x2b6f11","gasCost":"0x2","memSize":160,"stack":["0x32","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x0"],"depth":2,"refund":0,"opName":"POP"} -{"pc":138,"op":80,"gas":"0x2b6f0f","gasCost":"0x2","memSize":160,"stack":["0x32","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":2,"refund":0,"opName":"POP"} -{"pc":139,"op":146,"gas":"0x2b6f0d","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"SWAP3"} -{"pc":140,"op":145,"gas":"0x2b6f0a","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0xa0","0x80","0x32"],"depth":2,"refund":0,"opName":"SWAP2"} -{"pc":141,"op":80,"gas":"0x2b6f07","gasCost":"0x2","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x32","0x80","0xa0"],"depth":2,"refund":0,"opName":"POP"} -{"pc":142,"op":80,"gas":"0x2b6f05","gasCost":"0x2","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x32","0x80"],"depth":2,"refund":0,"opName":"POP"} -{"pc":143,"op":86,"gas":"0x2b6f03","gasCost":"0x8","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x32"],"depth":2,"refund":0,"opName":"JUMP"} -{"pc":50,"op":91,"gas":"0x2b6efb","gasCost":"0x1","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"JUMPDEST"} -{"pc":51,"op":96,"gas":"0x2b6efa","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"PUSH1"} -{"pc":53,"op":129,"gas":"0x2b6ef7","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x1"],"depth":2,"refund":0,"opName":"DUP2"} -{"pc":54,"op":96,"gas":"0x2b6ef4","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"PUSH1"} -{"pc":56,"op":28,"gas":"0x2b6ef1","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":2,"refund":0,"opName":"SHR"} -{"pc":57,"op":97,"gas":"0x2b6eee","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"PUSH2"} -{"pc":60,"op":145,"gas":"0x2b6eeb","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42"],"depth":2,"refund":0,"opName":"SWAP2"} -{"pc":61,"op":144,"gas":"0x2b6ee8","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x1"],"depth":2,"refund":0,"opName":"SWAP1"} -{"pc":62,"op":97,"gas":"0x2b6ee5","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"PUSH2"} -{"pc":65,"op":86,"gas":"0x2b6ee2","gasCost":"0x8","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x90"],"depth":2,"refund":0,"opName":"JUMP"} -{"pc":144,"op":91,"gas":"0x2b6eda","gasCost":"0x1","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"JUMPDEST"} -{"pc":145,"op":96,"gas":"0x2b6ed9","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"PUSH1"} -{"pc":147,"op":97,"gas":"0x2b6ed6","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":2,"refund":0,"opName":"PUSH2"} -{"pc":150,"op":130,"gas":"0x2b6ed3","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x9b"],"depth":2,"refund":0,"opName":"DUP3"} -{"pc":151,"op":97,"gas":"0x2b6ed0","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x9b","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"PUSH2"} -{"pc":154,"op":86,"gas":"0x2b6ecd","gasCost":"0x8","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x9b","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0xf0"],"depth":2,"refund":0,"opName":"JUMP"} -{"pc":240,"op":91,"gas":"0x2b6ec5","gasCost":"0x1","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x9b","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"JUMPDEST"} -{"pc":241,"op":96,"gas":"0x2b6ec4","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x9b","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"PUSH1"} -{"pc":243,"op":129,"gas":"0x2b6ec1","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x9b","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":2,"refund":0,"opName":"DUP2"} -{"pc":244,"op":144,"gas":"0x2b6ebe","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x9b","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"SWAP1"} -{"pc":245,"op":80,"gas":"0x2b6ebb","gasCost":"0x2","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x9b","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":2,"refund":0,"opName":"POP"} -{"pc":246,"op":145,"gas":"0x2b6eb9","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x9b","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"SWAP2"} -{"pc":247,"op":144,"gas":"0x2b6eb6","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x9b"],"depth":2,"refund":0,"opName":"SWAP1"} -{"pc":248,"op":80,"gas":"0x2b6eb3","gasCost":"0x2","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x9b","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"POP"} -{"pc":249,"op":86,"gas":"0x2b6eb1","gasCost":"0x8","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x9b"],"depth":2,"refund":0,"opName":"JUMP"} -{"pc":155,"op":91,"gas":"0x2b6ea9","gasCost":"0x1","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"JUMPDEST"} -{"pc":156,"op":145,"gas":"0x2b6ea8","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"SWAP2"} -{"pc":157,"op":80,"gas":"0x2b6ea5","gasCost":"0x2","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"POP"} -{"pc":158,"op":97,"gas":"0x2b6ea3","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":2,"refund":0,"opName":"PUSH2"} -{"pc":161,"op":131,"gas":"0x2b6ea0","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0xa6"],"depth":2,"refund":0,"opName":"DUP4"} -{"pc":162,"op":97,"gas":"0x2b6e9d","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0xa6","0x1"],"depth":2,"refund":0,"opName":"PUSH2"} -{"pc":165,"op":86,"gas":"0x2b6e9a","gasCost":"0x8","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0xa6","0x1","0xf0"],"depth":2,"refund":0,"opName":"JUMP"} -{"pc":240,"op":91,"gas":"0x2b6e92","gasCost":"0x1","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0xa6","0x1"],"depth":2,"refund":0,"opName":"JUMPDEST"} -{"pc":241,"op":96,"gas":"0x2b6e91","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0xa6","0x1"],"depth":2,"refund":0,"opName":"PUSH1"} -{"pc":243,"op":129,"gas":"0x2b6e8e","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0xa6","0x1","0x0"],"depth":2,"refund":0,"opName":"DUP2"} -{"pc":244,"op":144,"gas":"0x2b6e8b","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0xa6","0x1","0x0","0x1"],"depth":2,"refund":0,"opName":"SWAP1"} -{"pc":245,"op":80,"gas":"0x2b6e88","gasCost":"0x2","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0xa6","0x1","0x1","0x0"],"depth":2,"refund":0,"opName":"POP"} -{"pc":246,"op":145,"gas":"0x2b6e86","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0xa6","0x1","0x1"],"depth":2,"refund":0,"opName":"SWAP2"} -{"pc":247,"op":144,"gas":"0x2b6e83","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x1","0x1","0xa6"],"depth":2,"refund":0,"opName":"SWAP1"} -{"pc":248,"op":80,"gas":"0x2b6e80","gasCost":"0x2","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x1","0xa6","0x1"],"depth":2,"refund":0,"opName":"POP"} -{"pc":249,"op":86,"gas":"0x2b6e7e","gasCost":"0x8","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x1","0xa6"],"depth":2,"refund":0,"opName":"JUMP"} -{"pc":166,"op":91,"gas":"0x2b6e76","gasCost":"0x1","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x1"],"depth":2,"refund":0,"opName":"JUMPDEST"} -{"pc":167,"op":146,"gas":"0x2b6e75","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x1"],"depth":2,"refund":0,"opName":"SWAP3"} -{"pc":168,"op":80,"gas":"0x2b6e72","gasCost":"0x2","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x1"],"depth":2,"refund":0,"opName":"POP"} -{"pc":169,"op":130,"gas":"0x2b6e70","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":2,"refund":0,"opName":"DUP3"} -{"pc":170,"op":127,"gas":"0x2b6e6d","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x1"],"depth":2,"refund":0,"opName":"PUSH32"} -{"pc":203,"op":3,"gas":"0x2b6e6a","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x1","0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"],"depth":2,"refund":0,"opName":"SUB"} -{"pc":204,"op":130,"gas":"0x2b6e67","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"],"depth":2,"refund":0,"opName":"DUP3"} -{"pc":205,"op":17,"gas":"0x2b6e64","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"GT"} -{"pc":206,"op":21,"gas":"0x2b6e61","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x0"],"depth":2,"refund":0,"opName":"ISZERO"} -{"pc":207,"op":97,"gas":"0x2b6e5e","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x1"],"depth":2,"refund":0,"opName":"PUSH2"} -{"pc":210,"op":87,"gas":"0x2b6e5b","gasCost":"0xa","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x1","0xdb"],"depth":2,"refund":0,"opName":"JUMPI"} -{"pc":219,"op":91,"gas":"0x2b6e51","gasCost":"0x1","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":2,"refund":0,"opName":"JUMPDEST"} -{"pc":220,"op":130,"gas":"0x2b6e50","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":2,"refund":0,"opName":"DUP3"} -{"pc":221,"op":130,"gas":"0x2b6e4d","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x1"],"depth":2,"refund":0,"opName":"DUP3"} -{"pc":222,"op":1,"gas":"0x2b6e4a","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"ADD"} -{"pc":223,"op":144,"gas":"0x2b6e47","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac"],"depth":2,"refund":0,"opName":"SWAP1"} -{"pc":224,"op":80,"gas":"0x2b6e44","gasCost":"0x2","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac","0x0"],"depth":2,"refund":0,"opName":"POP"} -{"pc":225,"op":146,"gas":"0x2b6e42","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac"],"depth":2,"refund":0,"opName":"SWAP3"} -{"pc":226,"op":145,"gas":"0x2b6e3f","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42"],"depth":2,"refund":0,"opName":"SWAP2"} -{"pc":227,"op":80,"gas":"0x2b6e3c","gasCost":"0x2","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac","0x42","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x1"],"depth":2,"refund":0,"opName":"POP"} -{"pc":228,"op":80,"gas":"0x2b6e3a","gasCost":"0x2","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac","0x42","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"POP"} -{"pc":229,"op":86,"gas":"0x2b6e38","gasCost":"0x8","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac","0x42"],"depth":2,"refund":0,"opName":"JUMP"} -{"pc":66,"op":91,"gas":"0x2b6e30","gasCost":"0x1","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac"],"depth":2,"refund":0,"opName":"JUMPDEST"} -{"pc":67,"op":96,"gas":"0x2b6e2f","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac"],"depth":2,"refund":0,"opName":"PUSH1"} -{"pc":69,"op":129,"gas":"0x2b6e2c","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac","0x0"],"depth":2,"refund":0,"opName":"DUP2"} -{"pc":70,"op":144,"gas":"0x2b6e29","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac"],"depth":2,"refund":0,"opName":"SWAP1"} -{"pc":71,"op":85,"gas":"0x2b6e26","gasCost":"0x2bc","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac","0x0"],"depth":2,"refund":0,"opName":"SSTORE"} -{"pc":72,"op":80,"gas":"0x2b6b6a","gasCost":"0x2","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac"],"depth":2,"refund":0,"opName":"POP"} -{"pc":73,"op":80,"gas":"0x2b6b68","gasCost":"0x2","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"POP"} -{"pc":74,"op":97,"gas":"0x2b6b66","gasCost":"0x3","memSize":160,"stack":[],"depth":2,"refund":0,"opName":"PUSH2"} -{"pc":77,"op":86,"gas":"0x2b6b63","gasCost":"0x8","memSize":160,"stack":["0x145"],"depth":2,"refund":0,"opName":"JUMP"} -{"pc":325,"op":91,"gas":"0x2b6b5b","gasCost":"0x1","memSize":160,"stack":[],"depth":2,"refund":0,"opName":"JUMPDEST"} -{"pc":326,"op":96,"gas":"0x2b6b5a","gasCost":"0x3","memSize":160,"stack":[],"depth":2,"refund":0,"opName":"PUSH1"} -{"pc":328,"op":128,"gas":"0x2b6b57","gasCost":"0x3","memSize":160,"stack":["0xb3"],"depth":2,"refund":0,"opName":"DUP1"} -{"pc":329,"op":97,"gas":"0x2b6b54","gasCost":"0x3","memSize":160,"stack":["0xb3","0xb3"],"depth":2,"refund":0,"opName":"PUSH2"} -{"pc":332,"op":96,"gas":"0x2b6b51","gasCost":"0x3","memSize":160,"stack":["0xb3","0xb3","0x153"],"depth":2,"refund":0,"opName":"PUSH1"} -{"pc":334,"op":57,"gas":"0x2b6b4e","gasCost":"0x18","memSize":160,"stack":["0xb3","0xb3","0x153","0x0"],"depth":2,"refund":0,"opName":"CODECOPY"} -{"pc":335,"op":96,"gas":"0x2b6b36","gasCost":"0x3","memSize":192,"stack":["0xb3"],"depth":2,"refund":0,"opName":"PUSH1"} -{"pc":337,"op":243,"gas":"0x2b6b33","gasCost":"0x0","memSize":192,"stack":["0xb3","0x0"],"depth":2,"refund":0,"opName":"RETURN"} -{"pc":290,"op":128,"gas":"0x2c0bb2","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6"],"depth":1,"refund":0,"opName":"DUP1"} -{"pc":291,"op":21,"gas":"0x2c0baf","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x74b186f98c406a19aaf31b542b2b2353fb1577f6"],"depth":1,"refund":0,"opName":"ISZERO"} -{"pc":292,"op":128,"gas":"0x2c0bac","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x0"],"depth":1,"refund":0,"opName":"DUP1"} -{"pc":293,"op":21,"gas":"0x2c0ba9","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x0","0x0"],"depth":1,"refund":0,"opName":"ISZERO"} -{"pc":294,"op":97,"gas":"0x2c0ba6","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x0","0x1"],"depth":1,"refund":0,"opName":"PUSH2"} -{"pc":297,"op":87,"gas":"0x2c0ba3","gasCost":"0xa","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x0","0x1","0x133"],"depth":1,"refund":0,"opName":"JUMPI"} -{"pc":307,"op":91,"gas":"0x2c0b99","gasCost":"0x1","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x0"],"depth":1,"refund":0,"opName":"JUMPDEST"} -{"pc":308,"op":80,"gas":"0x2c0b98","gasCost":"0x2","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x0"],"depth":1,"refund":0,"opName":"POP"} -{"pc":309,"op":96,"gas":"0x2c0b96","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6"],"depth":1,"refund":0,"opName":"PUSH1"} -{"pc":311,"op":96,"gas":"0x2c0b93","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1"],"depth":1,"refund":0,"opName":"PUSH1"} -{"pc":313,"op":97,"gas":"0x2c0b90","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x0"],"depth":1,"refund":0,"opName":"PUSH2"} -{"pc":316,"op":10,"gas":"0x2c0b8d","gasCost":"0xa","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x0","0x100"],"depth":1,"refund":0,"opName":"EXP"} -{"pc":317,"op":129,"gas":"0x2c0b83","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x1"],"depth":1,"refund":0,"opName":"DUP2"} -{"pc":318,"op":84,"gas":"0x2c0b80","gasCost":"0xc8","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x1","0x1"],"depth":1,"refund":0,"opName":"SLOAD"} -{"pc":319,"op":129,"gas":"0x2c0ab8","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x1","0x0"],"depth":1,"refund":0,"opName":"DUP2"} -{"pc":320,"op":115,"gas":"0x2c0ab5","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x1","0x0","0x1"],"depth":1,"refund":0,"opName":"PUSH20"} -{"pc":341,"op":2,"gas":"0x2c0ab2","gasCost":"0x5","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x1","0x0","0x1","0xffffffffffffffffffffffffffffffffffffffff"],"depth":1,"refund":0,"opName":"MUL"} -{"pc":342,"op":25,"gas":"0x2c0aad","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x1","0x0","0xffffffffffffffffffffffffffffffffffffffff"],"depth":1,"refund":0,"opName":"NOT"} -{"pc":343,"op":22,"gas":"0x2c0aaa","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x1","0x0","0xffffffffffffffffffffffff0000000000000000000000000000000000000000"],"depth":1,"refund":0,"opName":"AND"} -{"pc":344,"op":144,"gas":"0x2c0aa7","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x1","0x0"],"depth":1,"refund":0,"opName":"SWAP1"} -{"pc":345,"op":131,"gas":"0x2c0aa4","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x0","0x1"],"depth":1,"refund":0,"opName":"DUP4"} -{"pc":346,"op":115,"gas":"0x2c0aa1","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x0","0x1","0x74b186f98c406a19aaf31b542b2b2353fb1577f6"],"depth":1,"refund":0,"opName":"PUSH20"} -{"pc":367,"op":22,"gas":"0x2c0a9e","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x0","0x1","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0xffffffffffffffffffffffffffffffffffffffff"],"depth":1,"refund":0,"opName":"AND"} -{"pc":368,"op":2,"gas":"0x2c0a9b","gasCost":"0x5","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x0","0x1","0x74b186f98c406a19aaf31b542b2b2353fb1577f6"],"depth":1,"refund":0,"opName":"MUL"} -{"pc":369,"op":23,"gas":"0x2c0a96","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x0","0x74b186f98c406a19aaf31b542b2b2353fb1577f6"],"depth":1,"refund":0,"opName":"OR"} -{"pc":370,"op":144,"gas":"0x2c0a93","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x74b186f98c406a19aaf31b542b2b2353fb1577f6"],"depth":1,"refund":0,"opName":"SWAP1"} -{"pc":371,"op":85,"gas":"0x2c0a90","gasCost":"0x1f4","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1"],"depth":1,"refund":0,"opName":"SSTORE"} -{"pc":372,"op":80,"gas":"0x2c089c","gasCost":"0x2","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6"],"depth":1,"refund":0,"opName":"POP"} -{"pc":373,"op":80,"gas":"0x2c089a","gasCost":"0x2","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"POP"} -{"pc":374,"op":80,"gas":"0x2c0898","gasCost":"0x2","memSize":736,"stack":["0x80"],"depth":1,"refund":0,"opName":"POP"} -{"pc":375,"op":97,"gas":"0x2c0896","gasCost":"0x3","memSize":736,"stack":[],"depth":1,"refund":0,"opName":"PUSH2"} -{"pc":378,"op":86,"gas":"0x2c0893","gasCost":"0x8","memSize":736,"stack":["0x29b"],"depth":1,"refund":0,"opName":"JUMP"} -{"pc":667,"op":91,"gas":"0x2c088b","gasCost":"0x1","memSize":736,"stack":[],"depth":1,"refund":0,"opName":"JUMPDEST"} -{"pc":668,"op":97,"gas":"0x2c088a","gasCost":"0x3","memSize":736,"stack":[],"depth":1,"refund":0,"opName":"PUSH2"} -{"pc":671,"op":128,"gas":"0x2c0887","gasCost":"0x3","memSize":736,"stack":["0x1bd"],"depth":1,"refund":0,"opName":"DUP1"} -{"pc":672,"op":97,"gas":"0x2c0884","gasCost":"0x3","memSize":736,"stack":["0x1bd","0x1bd"],"depth":1,"refund":0,"opName":"PUSH2"} -{"pc":675,"op":96,"gas":"0x2c0881","gasCost":"0x3","memSize":736,"stack":["0x1bd","0x1bd","0x2aa"],"depth":1,"refund":0,"opName":"PUSH1"} -{"pc":677,"op":57,"gas":"0x2c087e","gasCost":"0x2d","memSize":736,"stack":["0x1bd","0x1bd","0x2aa","0x0"],"depth":1,"refund":0,"opName":"CODECOPY"} -{"pc":678,"op":96,"gas":"0x2c0851","gasCost":"0x3","memSize":736,"stack":["0x1bd"],"depth":1,"refund":0,"opName":"PUSH1"} -{"pc":680,"op":243,"gas":"0x2c084e","gasCost":"0x0","memSize":736,"stack":["0x1bd","0x0"],"depth":1,"refund":0,"opName":"RETURN"} -{"output":"608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f566852414610030575b600080fd5b61003861004e565b6040516100459190610146565b60405180910390f35b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166381ca91d36040518163ffffffff1660e01b815260040160206040518083038186803b1580156100b857600080fd5b505afa1580156100cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100f0919061010a565b905090565b60008151905061010481610170565b92915050565b6000602082840312156101205761011f61016b565b5b600061012e848285016100f5565b91505092915050565b61014081610161565b82525050565b600060208201905061015b6000830184610137565b92915050565b6000819050919050565b600080fd5b61017981610161565b811461018457600080fd5b5056fea2646970667358221220a6a0e11af79f176f9c421b7b12f441356b25f6489b83d38cc828a701720b41f164736f6c63430008070033","gasUsed":"0x9370"} diff --git a/core/overlay/conversion.go b/core/overlay/conversion.go index d98c081eec76..0ff9359a3e66 100644 --- a/core/overlay/conversion.go +++ b/core/overlay/conversion.go @@ -214,6 +214,7 @@ func (kvm *keyValueMigrator) migrateCollectedKeyValues(tree *trie.VerkleTrie) er } // OverlayVerkleTransition contains the overlay conversion logic +// TODO(weiihann): this is the conversion code func OverlayVerkleTransition(statedb *state.StateDB, root common.Hash, maxMovedCount uint64) error { migrdb := statedb.Database() migrdb.LockCurrentTransitionState() diff --git a/core/state/state_object.go b/core/state/state_object.go index a250d48ffabb..831f66d7dc3f 100644 --- a/core/state/state_object.go +++ b/core/state/state_object.go @@ -29,6 +29,7 @@ import ( "github.com/ethereum/go-ethereum/metrics" "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/trie/trienode" + // "github.com/ethereum/go-ethereum/trie" ) type Code []byte @@ -292,6 +293,12 @@ func (s *stateObject) updateTrie() (Trie, error) { } // Insert all the pending updates into the trie usedStorage := make([][]byte, 0, len(s.pendingStorage)) + // switch tr := tr.(type) { + // case *trie.VerkleTrie: + // fmt.Printf("tr.Hash(): %x\n", tr.Hash()) + // case *trie.TransitionTrie: + // fmt.Printf("tr.Hash(): %x\n", tr.Hash()) + // } for key, value := range s.pendingStorage { // Skip noop changes, persist actual changes if value == s.originStorage[key] { @@ -372,7 +379,9 @@ func (s *stateObject) updateRoot() { if metrics.EnabledExpensive { defer func(start time.Time) { s.db.StorageHashes += time.Since(start) }(time.Now()) } + fmt.Printf("stateObject.updateRoot s.data.Root before: %x\n", s.data.Root) s.data.Root = tr.Hash() + fmt.Printf("stateObject.updateRoot s.data.Root after: %x\n", s.data.Root) } // commit returns the changes made in storage trie and updates the account data. diff --git a/core/state/statedb.go b/core/state/statedb.go index 4d8a4211125c..3fbf3ac11afb 100644 --- a/core/state/statedb.go +++ b/core/state/statedb.go @@ -986,6 +986,7 @@ func (s *StateDB) Finalise(deleteEmptyObjects bool) { // It is called in between transactions to get the root hash that // goes into transaction receipts. func (s *StateDB) IntermediateRoot(deleteEmptyObjects bool) common.Hash { + fmt.Println("StateDB.IntermediateRoot") // Finalise all the dirty storage states and write them into the tries s.Finalise(deleteEmptyObjects) @@ -1046,8 +1047,9 @@ func (s *StateDB) IntermediateRoot(deleteEmptyObjects bool) common.Hash { if metrics.EnabledExpensive { defer func(start time.Time) { s.AccountHashes += time.Since(start) }(time.Now()) } + fmt.Printf("StateDB.IntermediateRoot s.trie.hash before\n") root := s.trie.Hash() - + fmt.Printf("StateDB.IntermediateRoot s.trie.hash after: %x\n", root) // Save the root of the MPT so that it can be used during the transition if !s.Database().InTransition() && !s.Database().Transitioned() { s.Database().SetLastMerkleRoot(root) @@ -1223,6 +1225,19 @@ func (s *StateDB) GetTrie() Trie { // The associated block number of the state transition is also provided // for more chain context. func (s *StateDB) Commit(block uint64, deleteEmptyObjects bool) (common.Hash, error) { + if s.GetTrie().IsVerkle() { + fmt.Println("--------------------------------") + fmt.Println("StateDB.Commit") + fmt.Println("--------------------------------") + tr := s.trie + switch vkt := tr.(type) { + case *trie.VerkleTrie: + fmt.Println(vkt.ToDot()) + case *trie.TransitionTrie: + fmt.Println(vkt.Overlay().ToDot()) + } + fmt.Println("--------------------------------") + } // Short circuit in case any database failure occurred earlier. if s.dbErr != nil { return common.Hash{}, fmt.Errorf("commit aborted due to earlier error: %v", s.dbErr) @@ -1481,4 +1496,7 @@ func (s *StateDB) CurPeriod() verkle.StatePeriod { func (s *StateDB) SetCurPeriod(period verkle.StatePeriod) { s.curPeriod = period + if tr, ok := s.trie.(*trie.VerkleTrie); ok { + tr.SetPeriod(period) + } } diff --git a/core/state_processor_test.go b/core/state_processor_test.go index 6a1cd3850d0f..7b6f431c7d78 100644 --- a/core/state_processor_test.go +++ b/core/state_processor_test.go @@ -611,7 +611,7 @@ func TestProcessVerkle(t *testing.T) { //fmt.Printf("root= %x\n", chain[0].Root()) // check the proof for the 1st block - err = verkle.Verify(proofs[0], genesis.Root().Bytes(), chain[0].Root().Bytes(), keyvals[0], 0) // TODO(weiihann) + err = verkle.Verify(proofs[0], genesis.Root().Bytes(), chain[0].Root().Bytes(), keyvals[0], 0) if err != nil { spew.Dump(genesis.Root().Bytes(), proofs[0]) t.Fatal(err) @@ -1636,3 +1636,379 @@ func TestProcessVerkleSelfDestructInSameTxWithSelfBeneficiary(t *testing.T) { } } } + +func TestProcessVerkleWithStateExpiry(t *testing.T) { + var ( + config = ¶ms.ChainConfig{ + ChainID: big.NewInt(1), + HomesteadBlock: big.NewInt(0), + EIP150Block: big.NewInt(0), + EIP155Block: big.NewInt(0), + EIP158Block: big.NewInt(0), + ByzantiumBlock: big.NewInt(0), + ConstantinopleBlock: big.NewInt(0), + PetersburgBlock: big.NewInt(0), + IstanbulBlock: big.NewInt(0), + MuirGlacierBlock: big.NewInt(0), + BerlinBlock: big.NewInt(0), + LondonBlock: big.NewInt(0), + Ethash: new(params.EthashConfig), + ShanghaiTime: u64(0), + VerkleTime: u64(0), + StateExpiryTime: u64(0), + TerminalTotalDifficulty: common.Big0, + TerminalTotalDifficultyPassed: true, + ProofInBlocks: true, + StateExpiryPeriod: u64(10), + } + signer = types.LatestSigner(config) + testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") + bcdb = rawdb.NewMemoryDatabase() // Database for the blockchain + gendb = rawdb.NewMemoryDatabase() // Database for the block-generation code, they must be separate as they are path-based. + coinbase = common.HexToAddress("0x71562b71999873DB5b286dF957af199Ec94617F7") + gspec = &Genesis{ + Config: config, + Alloc: GenesisAlloc{ + coinbase: GenesisAccount{ + Balance: big.NewInt(1000000000000000000), // 1 ether + Nonce: 0, + }, + params.HistoryStorageAddress: GenesisAccount{ + Balance: big.NewInt(0), + Nonce: 1, + }, + }, + } + loggerCfg = &logger.Config{} + ) + + os.MkdirAll("output", 0755) + traceFile, err := os.Create("./output/traces.jsonl") + if err != nil { + t.Fatal(err) + } + + // Verkle trees use the snapshot, which must be enabled before the + // data is saved into the tree+database. + genesis := gspec.MustCommit(bcdb) + blockchain, _ := NewBlockChain(bcdb, nil, gspec, nil, beacon.New(ethash.NewFaker()), vm.Config{Tracer: logger.NewJSONLogger(loggerCfg, traceFile)}, nil, nil) + defer blockchain.Stop() + + // Commit the genesis block to the block-generation database as it + // is now independent of the blockchain database. + gspec.MustCommit(gendb) + + txCost1 := params.TxGas + txCost2 := params.TxGas + contractCreationCost := intrinsicContractCreationGas + + params.WitnessChunkReadCost + params.WitnessChunkWriteCost + params.WitnessBranchReadCost + params.WitnessBranchWriteCost + /* creation */ + params.WitnessChunkReadCost + params.WitnessChunkWriteCost + /* creation with value */ + params.WitnessChunkReadCost + params.WitnessChunkWriteCost + /* code chunk #0 */ + 39 /* execution costs */ + codeWithExtCodeCopyGas := intrinsicCodeWithExtCodeCopyGas + + params.WitnessChunkReadCost + params.WitnessChunkWriteCost + params.WitnessBranchReadCost + params.WitnessBranchWriteCost + /* creation (tx) */ + params.WitnessChunkReadCost + params.WitnessChunkWriteCost + /* write code hash */ + params.WitnessChunkReadCost + params.WitnessChunkWriteCost + params.WitnessBranchReadCost + params.WitnessBranchWriteCost + /* creation (CREATE at pc=0x20) */ + params.WitnessChunkReadCost + params.WitnessChunkWriteCost + /* write code hash */ + params.WitnessChunkReadCost + params.WitnessChunkWriteCost + /* code chunk #0 */ + params.WitnessChunkReadCost + params.WitnessChunkWriteCost + /* code chunk #1 */ + params.WitnessChunkReadCost + params.WitnessChunkWriteCost + /* code chunk #2 */ + params.WitnessChunkReadCost + params.WitnessChunkWriteCost + /* code chunk #3 */ + params.WitnessChunkReadCost + params.WitnessChunkWriteCost + /* code chunk #4 */ + params.WitnessChunkReadCost + params.WitnessChunkWriteCost + /* code chunk #5 */ + params.WitnessChunkReadCost + /* SLOAD in constructor */ + params.WitnessChunkWriteCost + /* SSTORE in constructor */ + params.WitnessChunkReadCost + params.WitnessChunkWriteCost + params.WitnessBranchReadCost + params.WitnessBranchWriteCost + /* creation (CREATE at PC=0x121) */ + params.WitnessChunkReadCost + params.WitnessChunkWriteCost + /* write code hash */ + params.WitnessChunkReadCost + params.WitnessChunkWriteCost + /* code chunk #0 */ + params.WitnessChunkReadCost + params.WitnessChunkWriteCost + /* code chunk #1 */ + params.WitnessChunkReadCost + params.WitnessChunkWriteCost + /* code chunk #2 */ + params.WitnessChunkReadCost + params.WitnessChunkWriteCost + /* code chunk #3 */ + params.WitnessChunkReadCost + params.WitnessChunkWriteCost + /* code chunk #4 */ + params.WitnessChunkReadCost + params.WitnessChunkWriteCost + /* code chunk #5 */ + params.WitnessChunkReadCost + /* SLOAD in constructor */ + params.WitnessChunkWriteCost + /* SSTORE in constructor */ + params.WitnessChunkReadCost + params.WitnessChunkWriteCost + /* write code hash for tx creation */ + params.WitnessChunkReadCost + params.WitnessChunkWriteCost + /* code chunk #0 */ + params.WitnessChunkReadCost + params.WitnessChunkWriteCost + /* code chunk #1 */ + params.WitnessChunkReadCost + params.WitnessChunkWriteCost + /* code chunk #2 */ + params.WitnessChunkReadCost + params.WitnessChunkWriteCost + /* code chunk #3 */ + params.WitnessChunkReadCost + params.WitnessChunkWriteCost + /* code chunk #4 */ + params.WitnessChunkReadCost + params.WitnessChunkWriteCost + /* code chunk #5 */ + params.WitnessChunkReadCost + params.WitnessChunkWriteCost + /* code chunk #6 */ + params.WitnessChunkReadCost + params.WitnessChunkWriteCost + /* code chunk #7 */ + params.WitnessChunkReadCost + params.WitnessChunkWriteCost + /* code chunk #8 */ + params.WitnessChunkReadCost + params.WitnessChunkWriteCost + /* code chunk #9 */ + params.WitnessChunkReadCost + params.WitnessChunkWriteCost + /* code chunk #10 */ + params.WitnessChunkReadCost + params.WitnessChunkWriteCost + /* code chunk #11 */ + params.WitnessChunkReadCost + params.WitnessChunkWriteCost + /* code chunk #12 */ + params.WitnessChunkReadCost + params.WitnessChunkWriteCost + /* code chunk #13 */ + params.WitnessChunkReadCost + params.WitnessChunkWriteCost + /* code chunk #14 */ + 4144 /* execution costs */ + blockGasUsagesExpected := []uint64{ + txCost1*2 + txCost2, + txCost1*2 + txCost2 + contractCreationCost + codeWithExtCodeCopyGas, + txCost1*2 + txCost2, + } + nonceCount := uint64(0) + // TODO utiliser GenerateChainWithGenesis pour le rendre plus pratique + chain, _, proofs, keyvals, _ := GenerateVerkleChain(gspec.Config, genesis, beacon.New(ethash.NewFaker()), gendb, 3, func(i int, gen *BlockGen) { + gen.SetPoS() + + // TODO need to check that the tx cost provided is the exact amount used (no remaining left-over) + tx, _ := types.SignTx(types.NewTransaction(nonceCount, common.Address{byte(i), 2, 3}, big.NewInt(999), txCost1, big.NewInt(875000000), nil), signer, testKey) + gen.AddTx(tx) + nonceCount++ + // tx, _ = types.SignTx(types.NewTransaction(nonceCount, common.Address{}, big.NewInt(999), txCost1, big.NewInt(875000000), nil), signer, testKey) + // gen.AddTx(tx) + // nonceCount++ + // tx, _ = types.SignTx(types.NewTransaction(nonceCount, common.Address{}, big.NewInt(0), txCost2, big.NewInt(875000000), nil), signer, testKey) + // gen.AddTx(tx) + // nonceCount++ + // Add two contract creations in block #2 + // if i == 1 { + // tx, _ = types.SignTx(types.NewContractCreation(nonceCount, big.NewInt(16), 3000000, big.NewInt(875000000), code), signer, testKey) + // gen.AddTx(tx) + // nonceCount++ + // tx, _ = types.SignTx(types.NewContractCreation(nonceCount, big.NewInt(0), 3000000, big.NewInt(875000000), codeWithExtCodeCopy), signer, testKey) + // gen.AddTx(tx) + // nonceCount++ + // } + }) + + kvjson, err := json.Marshal(keyvals) + if err != nil { + t.Fatal(err) + } + err = os.WriteFile("./output/statediffs.json", kvjson, 0644) + if err != nil { + t.Fatal(err) + } + blockrlp, err := rlp.EncodeToBytes(genesis) + if err != nil { + t.Fatal(err) + } + err = os.WriteFile(fmt.Sprintf("./output/block%d.rlp.hex", 0), []byte(fmt.Sprintf("%x", blockrlp)), 0644) + if err != nil { + t.Fatal(err) + } + for _, block := range chain { + blockrlp, err := rlp.EncodeToBytes(block) + if err != nil { + t.Fatal(err) + } + err = os.WriteFile(fmt.Sprintf("./output/block%d.rlp.hex", block.NumberU64()), []byte(fmt.Sprintf("%x", blockrlp)), 0644) + if err != nil { + t.Fatal(err) + } + } + + // Uncomment to extract block #2 + //f, _ := os.Create("block2.rlp") + //defer f.Close() + //var buf bytes.Buffer + //rlp.Encode(&buf, chain[1]) + //f.Write(buf.Bytes()) + //fmt.Printf("root= %x\n", chain[0].Root()) + + // check the proof for the 1st block + err = verkle.Verify(proofs[0], genesis.Root().Bytes(), chain[0].Root().Bytes(), keyvals[0], types.Period0) + if err != nil { + spew.Dump(genesis.Root().Bytes(), proofs[0]) + t.Fatal(err) + } + // check the proof for the 2nd block + err = verkle.Verify(proofs[1], chain[0].Root().Bytes(), chain[1].Root().Bytes(), keyvals[1], types.Period1) + if err != nil { + t.Fatal(err) + } + // check the proof for the 3rd block + err = verkle.Verify(proofs[2], chain[1].Root().Bytes(), chain[2].Root().Bytes(), keyvals[2], types.Period2) + if err != nil { + t.Fatal(err) + } + t.Log("verified verkle proof") + + endnum, err := blockchain.InsertChain(chain) + if err != nil { + t.Fatalf("block %d imported with error: %v", endnum, err) + } + + for i := 0; i < 3; i++ { + b := blockchain.GetBlockByNumber(uint64(i) + 1) + if b == nil { + t.Fatalf("expected block %d to be present in chain", i+1) + } + if b.Hash() != chain[i].Hash() { + t.Fatalf("block #%d not found at expected height", b.NumberU64()) + } + if b.GasUsed() != blockGasUsagesExpected[i] { + t.Fatalf("expected block #%d txs to use %d, got %d\n", b.NumberU64(), blockGasUsagesExpected[i], b.GasUsed()) + } + } +} + +func TestProcessVerkleWithStateExpiryThisWorks(t *testing.T) { + var ( + config = ¶ms.ChainConfig{ + ChainID: big.NewInt(1), + HomesteadBlock: big.NewInt(0), + EIP150Block: big.NewInt(0), + EIP155Block: big.NewInt(0), + EIP158Block: big.NewInt(0), + ByzantiumBlock: big.NewInt(0), + ConstantinopleBlock: big.NewInt(0), + PetersburgBlock: big.NewInt(0), + IstanbulBlock: big.NewInt(0), + MuirGlacierBlock: big.NewInt(0), + BerlinBlock: big.NewInt(0), + LondonBlock: big.NewInt(0), + Ethash: new(params.EthashConfig), + ShanghaiTime: u64(0), + VerkleTime: u64(0), + StateExpiryTime: u64(0), + TerminalTotalDifficulty: common.Big0, + TerminalTotalDifficultyPassed: true, + ProofInBlocks: true, + StateExpiryPeriod: u64(100), + } + signer = types.LatestSigner(config) + testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") + bcdb = rawdb.NewMemoryDatabase() // Database for the blockchain + gendb = rawdb.NewMemoryDatabase() // Database for the block-generation code, they must be separate as they are path-based. + coinbase = common.HexToAddress("0x71562b71999873DB5b286dF957af199Ec94617F7") + gspec = &Genesis{ + Config: config, + Alloc: GenesisAlloc{ + coinbase: GenesisAccount{ + Balance: big.NewInt(1000000000000000000), // 1 ether + Nonce: 0, + }, + params.HistoryStorageAddress: GenesisAccount{ + Balance: big.NewInt(0), + Nonce: 1, + }, + }, + } + loggerCfg = &logger.Config{} + ) + + os.MkdirAll("output", 0755) + traceFile, err := os.Create("./output/traces.jsonl") + if err != nil { + t.Fatal(err) + } + + // Verkle trees use the snapshot, which must be enabled before the + // data is saved into the tree+database. + genesis := gspec.MustCommit(bcdb) + blockchain, _ := NewBlockChain(bcdb, nil, gspec, nil, beacon.New(ethash.NewFaker()), vm.Config{Tracer: logger.NewJSONLogger(loggerCfg, traceFile)}, nil, nil) + defer blockchain.Stop() + + // Commit the genesis block to the block-generation database as it + // is now independent of the blockchain database. + gspec.MustCommit(gendb) + + txCost1 := params.TxGas + blockGasUsagesExpected := []uint64{ + txCost1, + txCost1, + txCost1, + } + nonceCount := uint64(0) + // TODO utiliser GenerateChainWithGenesis pour le rendre plus pratique + chain, _, proofs, keyvals, _ := GenerateVerkleChain(gspec.Config, genesis, beacon.New(ethash.NewFaker()), gendb, 3, func(i int, gen *BlockGen) { + gen.SetPoS() + + // TODO need to check that the tx cost provided is the exact amount used (no remaining left-over) + tx, _ := types.SignTx(types.NewTransaction(nonceCount, common.Address{byte(i), 2, 3}, big.NewInt(999), txCost1, big.NewInt(875000000), nil), signer, testKey) + gen.AddTx(tx) + nonceCount++ + // tx, _ = types.SignTx(types.NewTransaction(nonceCount, common.Address{}, big.NewInt(999), txCost1, big.NewInt(875000000), nil), signer, testKey) + // gen.AddTx(tx) + // nonceCount++ + // tx, _ = types.SignTx(types.NewTransaction(nonceCount, common.Address{}, big.NewInt(0), txCost2, big.NewInt(875000000), nil), signer, testKey) + // gen.AddTx(tx) + // nonceCount++ + // Add two contract creations in block #2 + // if i == 1 { + // tx, _ = types.SignTx(types.NewContractCreation(nonceCount, big.NewInt(16), 3000000, big.NewInt(875000000), code), signer, testKey) + // gen.AddTx(tx) + // nonceCount++ + // tx, _ = types.SignTx(types.NewContractCreation(nonceCount, big.NewInt(0), 3000000, big.NewInt(875000000), codeWithExtCodeCopy), signer, testKey) + // gen.AddTx(tx) + // nonceCount++ + // } + }) + + kvjson, err := json.Marshal(keyvals) + if err != nil { + t.Fatal(err) + } + err = os.WriteFile("./output/statediffs.json", kvjson, 0644) + if err != nil { + t.Fatal(err) + } + blockrlp, err := rlp.EncodeToBytes(genesis) + if err != nil { + t.Fatal(err) + } + err = os.WriteFile(fmt.Sprintf("./output/block%d.rlp.hex", 0), []byte(fmt.Sprintf("%x", blockrlp)), 0644) + if err != nil { + t.Fatal(err) + } + for _, block := range chain { + blockrlp, err := rlp.EncodeToBytes(block) + if err != nil { + t.Fatal(err) + } + err = os.WriteFile(fmt.Sprintf("./output/block%d.rlp.hex", block.NumberU64()), []byte(fmt.Sprintf("%x", blockrlp)), 0644) + if err != nil { + t.Fatal(err) + } + } + + // Uncomment to extract block #2 + //f, _ := os.Create("block2.rlp") + //defer f.Close() + //var buf bytes.Buffer + //rlp.Encode(&buf, chain[1]) + //f.Write(buf.Bytes()) + //fmt.Printf("root= %x\n", chain[0].Root()) + + // check the proof for the 1st block + err = verkle.Verify(proofs[0], genesis.Root().Bytes(), chain[0].Root().Bytes(), keyvals[0], types.Period0) + if err != nil { + spew.Dump(genesis.Root().Bytes(), proofs[0]) + t.Fatal(err) + } + // check the proof for the 2nd block + err = verkle.Verify(proofs[1], chain[0].Root().Bytes(), chain[1].Root().Bytes(), keyvals[1], types.Period0) + if err != nil { + t.Fatal(err) + } + // check the proof for the 3rd block + err = verkle.Verify(proofs[2], chain[1].Root().Bytes(), chain[2].Root().Bytes(), keyvals[2], types.Period0) + if err != nil { + t.Fatal(err) + } + t.Log("verified verkle proof") + + endnum, err := blockchain.InsertChain(chain) + if err != nil { + t.Fatalf("block %d imported with error: %v", endnum, err) + } + + for i := 0; i < 3; i++ { + b := blockchain.GetBlockByNumber(uint64(i) + 1) + if b == nil { + t.Fatalf("expected block %d to be present in chain", i+1) + } + if b.Hash() != chain[i].Hash() { + t.Fatalf("block #%d not found at expected height", b.NumberU64()) + } + if b.GasUsed() != blockGasUsagesExpected[i] { + t.Fatalf("expected block #%d txs to use %d, got %d\n", b.NumberU64(), blockGasUsagesExpected[i], b.GasUsed()) + } + } +} diff --git a/core/types/period.go b/core/types/period.go index c876d57702e4..be142fb9918d 100644 --- a/core/types/period.go +++ b/core/types/period.go @@ -8,6 +8,8 @@ import ( var ( PeriodLength = uint64(15_778_800) // measured in seconds, about 6 months Period0 = verkle.StatePeriod(0) + Period1 = verkle.StatePeriod(1) + Period2 = verkle.StatePeriod(2) ) func GetStatePeriod(config *params.ChainConfig, curTime uint64) verkle.StatePeriod { @@ -20,5 +22,10 @@ func GetStatePeriod(config *params.ChainConfig, curTime uint64) verkle.StatePeri return Period0 } - return verkle.StatePeriod((curTime - forkTime) / PeriodLength) + periodLen := PeriodLength + if config.StateExpiryPeriod != nil { + periodLen = *config.StateExpiryPeriod + } + + return verkle.StatePeriod((curTime - forkTime) / periodLen) } \ No newline at end of file diff --git a/go.mod b/go.mod index cdc1c9c491ad..df4f309ffc25 100644 --- a/go.mod +++ b/go.mod @@ -134,4 +134,4 @@ require ( rsc.io/tmplfunc v0.0.3 // indirect ) -replace github.com/ethereum/go-verkle => github.com/weiihann/go-verkle v0.11.2 +replace github.com/ethereum/go-verkle => github.com/weiihann/go-verkle v0.11.3-0.20250221075231-54a369960b8d diff --git a/go.sum b/go.sum index 40b0a63db0fd..492dcfa5226c 100644 --- a/go.sum +++ b/go.sum @@ -450,8 +450,8 @@ github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBn github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= -github.com/weiihann/go-verkle v0.11.2 h1:dzBDSwQTPJdNQuXnLWMe3k9oa9enleMidVYwjUSn220= -github.com/weiihann/go-verkle v0.11.2/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk= +github.com/weiihann/go-verkle v0.11.3-0.20250221075231-54a369960b8d h1:YCVvFQJfSX8HAPJgns4wNLlXlnPoxrJ/cQfQhygx5/8= +github.com/weiihann/go-verkle v0.11.3-0.20250221075231-54a369960b8d/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= diff --git a/params/config.go b/params/config.go index c8d7e268f8c1..47e315488484 100644 --- a/params/config.go +++ b/params/config.go @@ -308,6 +308,9 @@ type ChainConfig struct { // Proof in block ProofInBlocks bool `json:"proofInBlocks,omitempty"` OverlayStride uint64 `json:"overlayStride,omitempty"` + + // TODO(weiihann): only used for testing, remove this field later + StateExpiryPeriod *uint64 `json:"stateExpiryPeriod,omitempty"` } // EthashConfig is the consensus engine configs for proof-of-work based sealing. diff --git a/trie/transition.go b/trie/transition.go index 09b9b975adf9..888f862ca94f 100644 --- a/trie/transition.go +++ b/trie/transition.go @@ -134,6 +134,7 @@ func (t *TransitionTrie) DeleteAccount(key common.Address) error { // Hash returns the root hash of the trie. It does not write to the database and // can be used even if the trie doesn't have one. func (t *TransitionTrie) Hash() common.Hash { + fmt.Println("TransitionTrie.Hash") return t.overlay.Hash() } diff --git a/trie/verkle.go b/trie/verkle.go index 76a848f93a77..78971163063b 100644 --- a/trie/verkle.go +++ b/trie/verkle.go @@ -82,6 +82,7 @@ var ( // GetKey returns the sha3 preimage of a hashed key that was previously used // to store a value. func (trie *VerkleTrie) GetKey(key []byte) []byte { + fmt.Printf("vkt period %d GetKey %x\n", trie.curPeriod, key) return key } @@ -89,6 +90,7 @@ func (trie *VerkleTrie) GetKey(key []byte) []byte { // not be modified by the caller. If a node was not found in the database, a // trie.MissingNodeError is returned. func (trie *VerkleTrie) GetStorage(addr common.Address, key []byte) ([]byte, error) { + fmt.Printf("VerkleTrie.GetStorage addr: %x key: %x\n", addr, key) pointEval := trie.pointCache.GetTreeKeyHeader(addr[:]) k := utils.GetTreeKeyStorageSlotWithEvaluatedAddress(pointEval, key) return trie.root.Get(k, trie.curPeriod, trie.FlatdbNodeResolver) @@ -97,10 +99,12 @@ func (trie *VerkleTrie) GetStorage(addr common.Address, key []byte) ([]byte, err // GetWithHashedKey returns the value, assuming that the key has already // been hashed. func (trie *VerkleTrie) GetWithHashedKey(key []byte) ([]byte, error) { + fmt.Printf("VerkleTrie.GetWithHashedKey key: %x\n", key) return trie.root.Get(key, trie.curPeriod, trie.FlatdbNodeResolver) } func (t *VerkleTrie) GetAccount(addr common.Address) (*types.StateAccount, error) { + fmt.Printf("VerkleTrie.GetAccount addr: %x\n", addr) acc := &types.StateAccount{} versionkey := t.pointCache.GetTreeKeyBasicDataCached(addr[:]) var ( @@ -237,12 +241,14 @@ func (trie *VerkleTrie) DeleteStorage(addr common.Address, key []byte) error { // Hash returns the root hash of the trie. It does not write to the database and // can be used even if the trie doesn't have one. func (trie *VerkleTrie) Hash() common.Hash { + fmt.Println("VerkleTrie.Hash") return trie.root.Commit().Bytes() } // Commit writes all nodes to the trie's memory database, tracking the internal // and external (for account tries) references. func (trie *VerkleTrie) Commit(_ bool) (common.Hash, *trienode.NodeSet, error) { + // fmt.Println("Commit\n", trie.ToDot()) root, ok := trie.root.(*verkle.InternalNode) if !ok { return common.Hash{}, nil, errors.New("unexpected root node type") @@ -301,7 +307,12 @@ func (trie *VerkleTrie) IsVerkle() bool { return true } +func (trie *VerkleTrie) SetPeriod(period verkle.StatePeriod) { + trie.curPeriod = period +} + func ProveAndSerialize(pretrie, posttrie *VerkleTrie, keys [][]byte, resolver verkle.NodeResolverFn) (*verkle.VerkleProof, verkle.StateDiff, error) { + fmt.Println("ProveAndSerialize") var postroot verkle.VerkleNode if posttrie != nil { postroot = posttrie.root From a1eddf30d562ffb53a174796cef2f157b90ecc49 Mon Sep 17 00:00:00 2001 From: weiihann Date: Mon, 21 Apr 2025 17:54:44 +0800 Subject: [PATCH 7/7] add override flags --- Makefile | 2 +- cmd/geth/chaincmd.go | 12 +++++++++++- cmd/geth/config.go | 8 ++++++++ cmd/geth/main.go | 2 ++ cmd/utils/flags.go | 10 ++++++++++ core/genesis.go | 4 ++++ eth/backend.go | 6 ++++++ eth/ethconfig/config.go | 6 ++++++ go.mod | 2 +- go.sum | 4 ++-- les/client.go | 3 +++ trie/transition.go | 2 +- trie/verkle.go | 4 ++-- 13 files changed, 57 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index e6286da7fbae..2574429b7c16 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ GOBIN = ./build/bin GO ?= latest -GORUN = env GO111MODULE=on go run +GORUN = env GO111MODULE=on go1.22.1 run geth: $(GORUN) build/ci.go install ./cmd/geth diff --git a/cmd/geth/chaincmd.go b/cmd/geth/chaincmd.go index 1c85145e7afa..e38b5568f7b8 100644 --- a/cmd/geth/chaincmd.go +++ b/cmd/geth/chaincmd.go @@ -49,7 +49,7 @@ var ( Name: "init", Usage: "Bootstrap and initialize a new genesis block", ArgsUsage: "", - Flags: flags.Merge([]cli.Flag{utils.CachePreimagesFlag, utils.OverrideVerkle}, utils.DatabasePathFlags), + Flags: flags.Merge([]cli.Flag{utils.CachePreimagesFlag, utils.OverrideVerkle, utils.OverrideStateExpiry, utils.OverrideStateExpiryPeriod}, utils.DatabasePathFlags), Description: ` The init command initializes a new genesis block and definition for the network. This is a destructive action and changes the network in which you will be @@ -207,6 +207,16 @@ func initGenesis(ctx *cli.Context) error { overrides.OverrideVerkle = &v } + if ctx.IsSet(utils.OverrideStateExpiry.Name) { + v := ctx.Uint64(utils.OverrideStateExpiry.Name) + overrides.OverrideStateExpiry = &v + } + + if ctx.IsSet(utils.OverrideStateExpiryPeriod.Name) { + v := ctx.Uint64(utils.OverrideStateExpiryPeriod.Name) + overrides.OverrideStateExpiryPeriod = &v + } + for _, name := range []string{"chaindata", "lightchaindata"} { chaindb, err := stack.OpenDatabaseWithFreezer(name, 0, 0, ctx.String(utils.AncientFlag.Name), "", false) if err != nil { diff --git a/cmd/geth/config.go b/cmd/geth/config.go index 96ef125f3d42..27cb7c5539ca 100644 --- a/cmd/geth/config.go +++ b/cmd/geth/config.go @@ -175,6 +175,14 @@ func makeFullNode(ctx *cli.Context) (*node.Node, ethapi.Backend) { v := ctx.Uint64(utils.OverrideVerkle.Name) cfg.Eth.OverrideVerkle = &v } + if ctx.IsSet(utils.OverrideStateExpiry.Name) { + v := ctx.Uint64(utils.OverrideStateExpiry.Name) + cfg.Eth.OverrideStateExpiry = &v + } + if ctx.IsSet(utils.OverrideStateExpiryPeriod.Name) { + v := ctx.Uint64(utils.OverrideStateExpiryPeriod.Name) + cfg.Eth.OverrideStateExpiryPeriod = &v + } if ctx.IsSet(utils.OverrideProofInBlock.Name) { v := ctx.Bool(utils.OverrideProofInBlock.Name) cfg.Eth.OverrideProofInBlock = &v diff --git a/cmd/geth/main.go b/cmd/geth/main.go index 7c0e304b0a66..04aaef24b519 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -70,6 +70,8 @@ var ( utils.OverrideOverlayStride, utils.OverrideCancun, utils.OverrideVerkle, + utils.OverrideStateExpiry, + utils.OverrideStateExpiryPeriod, utils.OverrideProofInBlock, utils.ClearVerkleCosts, utils.EnablePersonal, diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index e92a0f331fc9..0e24c183217b 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -279,6 +279,16 @@ var ( Usage: "Manually specify the Verkle fork timestamp, overriding the bundled setting", Category: flags.EthCategory, } + OverrideStateExpiry = &cli.Uint64Flag{ + Name: "override.expiry", + Usage: "Manually specify the state expiry timestamp, overriding the bundled setting", + Category: flags.EthCategory, + } + OverrideStateExpiryPeriod = &cli.Uint64Flag{ + Name: "override.expiryperiod", + Usage: "Manually specify the state expiry period, overriding the bundled setting", + Category: flags.EthCategory, + } OverrideProofInBlock = &cli.BoolFlag{ Name: "override.blockproof", Usage: "Manually specify the proof-in-block setting", diff --git a/core/genesis.go b/core/genesis.go index aba7ab600d47..fbca652e3dcd 100644 --- a/core/genesis.go +++ b/core/genesis.go @@ -295,6 +295,7 @@ type ChainOverrides struct { OverrideCancun *uint64 OverrideVerkle *uint64 OverrideStateExpiry *uint64 + OverrideStateExpiryPeriod *uint64 OverrideProofInBlock *bool OverrideOverlayStride *uint64 } @@ -331,6 +332,9 @@ func SetupGenesisBlockWithOverride(db ethdb.Database, triedb *trie.Database, gen if overrides != nil && overrides.OverrideStateExpiry != nil { config.StateExpiryTime = overrides.OverrideStateExpiry } + if overrides != nil && overrides.OverrideStateExpiryPeriod != nil { + config.StateExpiryPeriod = overrides.OverrideStateExpiryPeriod + } } } // Just commit the new block if there is no stored genesis block. diff --git a/eth/backend.go b/eth/backend.go index d4e8f11bcea8..92dae5c3b933 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -201,6 +201,12 @@ func New(stack *node.Node, config *ethconfig.Config) (*Ethereum, error) { if config.OverrideVerkle != nil { overrides.OverrideVerkle = config.OverrideVerkle } + if config.OverrideStateExpiry != nil { + overrides.OverrideStateExpiry = config.OverrideStateExpiry + } + if config.OverrideStateExpiryPeriod != nil { + overrides.OverrideStateExpiryPeriod = config.OverrideStateExpiryPeriod + } if config.OverrideProofInBlock != nil { overrides.OverrideProofInBlock = config.OverrideProofInBlock } diff --git a/eth/ethconfig/config.go b/eth/ethconfig/config.go index a1b2677ccf7e..601a4fdafaaf 100644 --- a/eth/ethconfig/config.go +++ b/eth/ethconfig/config.go @@ -159,6 +159,12 @@ type Config struct { // OverrideVerkle (TODO: remove after the fork) OverrideVerkle *uint64 `toml:",omitempty"` + // OverrideStateExpiry (TODO: remove after the fork) + OverrideStateExpiry *uint64 `toml:",omitempty"` + + // OverrideStateExpiryPeriod (TODO: remove after the fork) + OverrideStateExpiryPeriod *uint64 `toml:",omitempty"` + // OverrideProofInBlock OverrideProofInBlock *bool `toml:",omitempty"` diff --git a/go.mod b/go.mod index df4f309ffc25..776d08b598f0 100644 --- a/go.mod +++ b/go.mod @@ -134,4 +134,4 @@ require ( rsc.io/tmplfunc v0.0.3 // indirect ) -replace github.com/ethereum/go-verkle => github.com/weiihann/go-verkle v0.11.3-0.20250221075231-54a369960b8d +replace github.com/ethereum/go-verkle => github.com/weiihann/go-verkle v0.11.3-0.20250421072228-a835e89d1f00 diff --git a/go.sum b/go.sum index 492dcfa5226c..3d086393f417 100644 --- a/go.sum +++ b/go.sum @@ -450,8 +450,8 @@ github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBn github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= -github.com/weiihann/go-verkle v0.11.3-0.20250221075231-54a369960b8d h1:YCVvFQJfSX8HAPJgns4wNLlXlnPoxrJ/cQfQhygx5/8= -github.com/weiihann/go-verkle v0.11.3-0.20250221075231-54a369960b8d/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk= +github.com/weiihann/go-verkle v0.11.3-0.20250421072228-a835e89d1f00 h1:g0Tsj5B3f/o1HWJue+4Pt/bS+evwln/mEdGBv+CXOyo= +github.com/weiihann/go-verkle v0.11.3-0.20250421072228-a835e89d1f00/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= diff --git a/les/client.go b/les/client.go index 132c857aa529..fef743ad0892 100644 --- a/les/client.go +++ b/les/client.go @@ -98,6 +98,9 @@ func New(stack *node.Node, config *ethconfig.Config) (*LightEthereum, error) { if config.OverrideVerkle != nil { overrides.OverrideVerkle = config.OverrideVerkle } + if config.OverrideStateExpiry != nil { + overrides.OverrideStateExpiry = config.OverrideStateExpiry + } chainConfig, genesisHash, genesisErr := core.SetupGenesisBlockWithOverride(chainDb, trie.NewDatabase(chainDb), config.Genesis, &overrides) if _, isCompat := genesisErr.(*params.ConfigCompatError); genesisErr != nil && !isCompat { return nil, genesisErr diff --git a/trie/transition.go b/trie/transition.go index 888f862ca94f..3f615ca0da59 100644 --- a/trie/transition.go +++ b/trie/transition.go @@ -134,7 +134,7 @@ func (t *TransitionTrie) DeleteAccount(key common.Address) error { // Hash returns the root hash of the trie. It does not write to the database and // can be used even if the trie doesn't have one. func (t *TransitionTrie) Hash() common.Hash { - fmt.Println("TransitionTrie.Hash") + // fmt.Println("TransitionTrie.Hash") return t.overlay.Hash() } diff --git a/trie/verkle.go b/trie/verkle.go index 78971163063b..c39988231301 100644 --- a/trie/verkle.go +++ b/trie/verkle.go @@ -241,7 +241,7 @@ func (trie *VerkleTrie) DeleteStorage(addr common.Address, key []byte) error { // Hash returns the root hash of the trie. It does not write to the database and // can be used even if the trie doesn't have one. func (trie *VerkleTrie) Hash() common.Hash { - fmt.Println("VerkleTrie.Hash") + // fmt.Println("VerkleTrie.Hash") return trie.root.Commit().Bytes() } @@ -312,7 +312,7 @@ func (trie *VerkleTrie) SetPeriod(period verkle.StatePeriod) { } func ProveAndSerialize(pretrie, posttrie *VerkleTrie, keys [][]byte, resolver verkle.NodeResolverFn) (*verkle.VerkleProof, verkle.StateDiff, error) { - fmt.Println("ProveAndSerialize") + // fmt.Println("ProveAndSerialize") var postroot verkle.VerkleNode if posttrie != nil { postroot = posttrie.root