aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2014-12-20 09:34:12 +0800
committerobscuren <geffobscura@gmail.com>2014-12-20 09:34:12 +0800
commit3983dd2428137211f84f299f9ce8690c22f50afd (patch)
tree3a2dc53b365e6f377fc82a3514150d1297fe549c
parent7daa8c2f6eb25511c6a54ad420709af911fc6748 (diff)
parent0a9dc1536c5d776844d6947a0090ff7e1a7c6ab4 (diff)
downloaddexon-3983dd2428137211f84f299f9ce8690c22f50afd.tar
dexon-3983dd2428137211f84f299f9ce8690c22f50afd.tar.gz
dexon-3983dd2428137211f84f299f9ce8690c22f50afd.tar.bz2
dexon-3983dd2428137211f84f299f9ce8690c22f50afd.tar.lz
dexon-3983dd2428137211f84f299f9ce8690c22f50afd.tar.xz
dexon-3983dd2428137211f84f299f9ce8690c22f50afd.tar.zst
dexon-3983dd2428137211f84f299f9ce8690c22f50afd.zip
Merge branch 'release/v0.7.10'
-rw-r--r--.gitignore4
-rw-r--r--.travis.yml25
-rw-r--r--Dockerfile41
-rw-r--r--LICENSE8
-rw-r--r--README.md88
-rwxr-xr-x_data/chain1bin0 -> 175331 bytes
-rwxr-xr-x_data/chain2bin0 -> 28118 bytes
-rw-r--r--block_pool.go351
-rw-r--r--cmd/LICENSE16
-rw-r--r--cmd/ethereum/cmd.go52
-rw-r--r--cmd/ethereum/flags.go (renamed from ethereum/flags.go)31
-rw-r--r--cmd/ethereum/main.go (renamed from ethereum/main.go)48
-rw-r--r--cmd/ethereum/repl/console_colors_windows.go97
-rw-r--r--cmd/ethereum/repl/repl.go (renamed from ethereum/repl/repl.go)29
-rw-r--r--cmd/ethereum/repl/repl_darwin.go (renamed from ethereum/repl/repl_darwin.go)23
l---------cmd/ethereum/repl/repl_linux.go (renamed from ethereum/repl/repl_linux.go)0
-rw-r--r--cmd/ethereum/repl/repl_windows.go92
-rw-r--r--cmd/ethtest/main.go128
-rw-r--r--cmd/evm/code.txt1
-rw-r--r--cmd/evm/input.txt1
-rw-r--r--cmd/evm/main.go164
-rw-r--r--cmd/mist/assets/back.png (renamed from mist/assets/back.png)bin1004 -> 1004 bytes
-rw-r--r--cmd/mist/assets/browser.png (renamed from mist/assets/browser.png)bin12903 -> 12903 bytes
-rw-r--r--cmd/mist/assets/bug.png (renamed from mist/assets/bug.png)bin1671 -> 1671 bytes
-rw-r--r--cmd/mist/assets/close.png (renamed from mist/assets/close.png)bin905 -> 905 bytes
-rw-r--r--cmd/mist/assets/debugger/debugger.qml (renamed from mist/assets/debugger/debugger.qml)0
-rw-r--r--cmd/mist/assets/ext/big.js (renamed from mist/assets/ext/big.js)17
-rw-r--r--cmd/mist/assets/ext/eth.js/.gitignore14
-rw-r--r--cmd/mist/assets/ext/eth.js/README.md18
-rw-r--r--cmd/mist/assets/ext/eth.js/httprpc.js70
-rw-r--r--cmd/mist/assets/ext/eth.js/index.html33
-rw-r--r--cmd/mist/assets/ext/eth.js/main.js432
-rw-r--r--cmd/mist/assets/ext/eth.js/qt.js27
-rw-r--r--cmd/mist/assets/ext/eth.js/websocket.js51
-rw-r--r--cmd/mist/assets/ext/ethereum.js (renamed from mist/assets/ext/ethereum.js)17
-rw-r--r--cmd/mist/assets/ext/filter.js (renamed from mist/assets/ext/filter.js)17
-rw-r--r--cmd/mist/assets/ext/home.html (renamed from mist/assets/ext/home.html)0
-rw-r--r--cmd/mist/assets/ext/html_messaging.js (renamed from mist/assets/ext/html_messaging.js)17
-rw-r--r--cmd/mist/assets/ext/http.js30
-rw-r--r--cmd/mist/assets/ext/q.js (renamed from mist/assets/ext/q.js)0
-rw-r--r--cmd/mist/assets/ext/qml_messaging.js30
-rw-r--r--cmd/mist/assets/ext/qt_messaging_adapter.js38
-rw-r--r--cmd/mist/assets/ext/setup.js8
-rw-r--r--cmd/mist/assets/ext/string.js (renamed from mist/assets/ext/string.js)17
-rw-r--r--cmd/mist/assets/ext/test.html (renamed from mist/assets/ext/test.html)0
-rw-r--r--cmd/mist/assets/facet.png (renamed from mist/assets/facet.png)bin27302 -> 27302 bytes
-rw-r--r--cmd/mist/assets/heart.png (renamed from mist/assets/heart.png)bin4277 -> 4277 bytes
-rw-r--r--cmd/mist/assets/icecream.png (renamed from mist/assets/icecream.png)bin4643 -> 4643 bytes
-rw-r--r--cmd/mist/assets/miner.pngbin0 -> 2100 bytes
-rw-r--r--cmd/mist/assets/muted/codemirror.css (renamed from mist/assets/muted/codemirror.css)0
-rw-r--r--cmd/mist/assets/muted/debugger.html (renamed from mist/assets/muted/debugger.html)0
-rw-r--r--cmd/mist/assets/muted/eclipse.css (renamed from mist/assets/muted/eclipse.css)0
-rw-r--r--cmd/mist/assets/muted/index.html (renamed from mist/assets/muted/index.html)0
-rw-r--r--cmd/mist/assets/muted/lib/codemirror.js (renamed from mist/assets/muted/lib/codemirror.js)0
-rw-r--r--cmd/mist/assets/muted/lib/go.js (renamed from mist/assets/muted/lib/go.js)0
-rw-r--r--cmd/mist/assets/muted/lib/matchbrackets.js (renamed from mist/assets/muted/lib/matchbrackets.js)0
-rw-r--r--cmd/mist/assets/muted/muted.js (renamed from mist/assets/muted/muted.js)17
-rw-r--r--cmd/mist/assets/net.png (renamed from mist/assets/net.png)bin4669 -> 4669 bytes
-rw-r--r--cmd/mist/assets/network.png (renamed from mist/assets/network.png)bin2900 -> 2900 bytes
-rw-r--r--cmd/mist/assets/new.png (renamed from mist/assets/new.png)bin4776 -> 4776 bytes
-rw-r--r--cmd/mist/assets/pick.png (renamed from mist/assets/pick.png)bin932 -> 932 bytes
-rw-r--r--cmd/mist/assets/qml/QmlApp.qml (renamed from mist/assets/qml/QmlApp.qml)0
-rw-r--r--cmd/mist/assets/qml/first_run.qml (renamed from mist/assets/qml/first_run.qml)0
-rw-r--r--cmd/mist/assets/qml/main.qml (renamed from mist/assets/qml/main.qml)69
-rw-r--r--cmd/mist/assets/qml/muted.qml (renamed from mist/assets/qml/muted.qml)0
-rw-r--r--cmd/mist/assets/qml/test_app.qml (renamed from mist/assets/qml/test_app.qml)0
-rw-r--r--cmd/mist/assets/qml/transactions.qml (renamed from mist/assets/qml/transactions.qml)0
-rw-r--r--cmd/mist/assets/qml/views/chain.qml (renamed from mist/assets/qml/views/chain.qml)59
-rw-r--r--cmd/mist/assets/qml/views/history.qml (renamed from mist/assets/qml/views/history.qml)1
-rw-r--r--cmd/mist/assets/qml/views/info.qml (renamed from mist/assets/qml/views/info.qml)3
-rw-r--r--cmd/mist/assets/qml/views/jeffcoin/jeff.png (renamed from mist/assets/qml/views/jeffcoin/jeff.png)bin84076 -> 84076 bytes
-rw-r--r--cmd/mist/assets/qml/views/jeffcoin/jeffcoin.qml (renamed from mist/assets/qml/views/jeffcoin/jeffcoin.qml)0
-rw-r--r--cmd/mist/assets/qml/views/miner.qml254
-rw-r--r--cmd/mist/assets/qml/views/pending_tx.qml (renamed from mist/assets/qml/views/pending_tx.qml)1
-rw-r--r--cmd/mist/assets/qml/views/transaction.qml (renamed from mist/assets/qml/views/transaction.qml)5
-rw-r--r--cmd/mist/assets/qml/views/wallet.qml (renamed from mist/assets/qml/views/wallet.qml)35
-rw-r--r--cmd/mist/assets/qml/webapp.qml413
-rw-r--r--cmd/mist/assets/tx.png (renamed from mist/assets/tx.png)bin4070 -> 4070 bytes
-rw-r--r--cmd/mist/assets/util/test.html (renamed from mist/assets/util/test.html)0
-rw-r--r--cmd/mist/assets/wallet.png (renamed from mist/assets/wallet.png)bin1114 -> 1114 bytes
-rw-r--r--cmd/mist/bindings.go (renamed from mist/bindings.go)84
-rw-r--r--cmd/mist/debugger.go (renamed from mist/debugger.go)69
-rw-r--r--cmd/mist/errors.go53
-rw-r--r--cmd/mist/ext_app.go143
-rw-r--r--cmd/mist/flags.go (renamed from mist/flags.go)77
-rw-r--r--cmd/mist/gui.go (renamed from mist/gui.go)297
-rw-r--r--cmd/mist/html_container.go (renamed from mist/html_container.go)39
-rw-r--r--cmd/mist/main.go (renamed from mist/main.go)44
-rw-r--r--cmd/mist/qml_container.go85
-rw-r--r--cmd/mist/ui_lib.go (renamed from mist/ui_lib.go)118
-rw-r--r--cmd/peerserver/main.go40
-rw-r--r--cmd/utils/cmd.go (renamed from utils/cmd.go)99
-rw-r--r--cmd/utils/vm_env.go70
-rw-r--r--cmd/utils/websockets.go (renamed from utils/websockets.go)10
-rw-r--r--compression/rle/read_write.go84
-rw-r--r--compression/rle/read_write_test.go118
-rw-r--r--core/.gitignore12
-rw-r--r--core/asm.go50
-rw-r--r--core/block_manager.go371
-rw-r--r--core/chain_manager.go355
-rw-r--r--core/chain_manager_test.go77
-rw-r--r--core/dagger.go160
-rw-r--r--core/dagger_test.go19
-rw-r--r--core/error.go141
-rw-r--r--core/events.go12
-rw-r--r--core/execution.go71
-rw-r--r--core/fees.go7
-rw-r--r--core/filter.go200
-rw-r--r--core/filter_test.go1
-rw-r--r--core/genesis.go52
-rw-r--r--core/helper_test.go93
-rw-r--r--core/simple_pow.go1
-rw-r--r--core/state_transition.go238
-rw-r--r--core/transaction_pool.go233
-rw-r--r--core/types/block.go416
-rw-r--r--core/types/bloom9.go54
-rw-r--r--core/types/bloom9_test.go31
-rw-r--r--core/types/common.go16
-rw-r--r--core/types/derive_sha.go20
-rw-r--r--core/types/receipt.go81
-rw-r--r--core/types/transaction.go224
-rw-r--r--core/types/transaction_test.go1
-rw-r--r--core/vm_env.go61
-rw-r--r--crypto/crypto.go115
-rw-r--r--crypto/crypto_test.go36
-rw-r--r--crypto/curve.go363
-rw-r--r--crypto/encrypt_decrypt_test.go40
-rw-r--r--crypto/key_manager.go134
-rw-r--r--crypto/key_store.go113
-rw-r--r--crypto/keypair.go58
-rw-r--r--crypto/keyring.go123
-rw-r--r--crypto/keys_test.go122
-rw-r--r--crypto/mnemonic.go60
-rw-r--r--crypto/mnemonic_test.go74
-rw-r--r--crypto/mnemonic_words.go1630
-rw-r--r--ethdb/.gitignore12
-rw-r--r--ethdb/README.md11
-rw-r--r--ethdb/database.go89
-rw-r--r--ethdb/database_test.go28
-rw-r--r--ethdb/memory_database.go67
-rw-r--r--ethereum.go659
-rw-r--r--ethereum/cmd.go35
-rw-r--r--ethereum/repl/repl_windows.go24
-rw-r--r--ethutil/.gitignore12
-rw-r--r--ethutil/.travis.yml3
-rw-r--r--ethutil/README.md139
-rw-r--r--ethutil/big.go116
-rw-r--r--ethutil/big_test.go73
-rw-r--r--ethutil/bytes.go234
-rw-r--r--ethutil/bytes_test.go193
-rw-r--r--ethutil/common.go87
-rw-r--r--ethutil/common_test.go68
-rw-r--r--ethutil/config.go72
-rw-r--r--ethutil/db.go12
-rw-r--r--ethutil/list.go81
-rw-r--r--ethutil/main_test.go9
-rw-r--r--ethutil/package.go123
-rw-r--r--ethutil/path.go60
-rw-r--r--ethutil/path_test.go51
-rw-r--r--ethutil/rand.go24
-rw-r--r--ethutil/rand_test.go17
-rw-r--r--ethutil/rlp.go276
-rw-r--r--ethutil/rlp_test.go156
-rw-r--r--ethutil/script_unix.go19
-rw-r--r--ethutil/script_windows.go12
-rw-r--r--ethutil/set.go36
-rw-r--r--ethutil/size.go15
-rw-r--r--ethutil/size_test.go23
-rw-r--r--ethutil/value.go401
-rw-r--r--ethutil/value_test.go70
-rw-r--r--event/event.go183
-rw-r--r--event/event_test.go176
-rw-r--r--event/example_test.go42
-rw-r--r--event/filter/filter.go70
-rw-r--r--event/filter/filter_test.go34
-rw-r--r--event/filter/generic_filter.go22
-rw-r--r--events.go11
-rwxr-xr-xgocoverage.sh29
-rwxr-xr-xinstall.sh52
-rwxr-xr-xinstall_deps.sh8
-rw-r--r--javascript/javascript_runtime.go94
-rw-r--r--javascript/js_lib.go4
-rw-r--r--javascript/types.go34
-rw-r--r--logger/example_test.go21
-rw-r--r--logger/loggers.go248
-rw-r--r--logger/loggers_test.go174
-rw-r--r--miner/miner.go261
-rw-r--r--mist/assets/ext/http.js13
-rw-r--r--mist/assets/ext/qml_messaging.js13
-rw-r--r--mist/assets/ext/qt_messaging_adapter.js21
-rw-r--r--mist/assets/qml/views/javascript.qml45
-rw-r--r--mist/assets/qml/webapp.qml417
-rw-r--r--mist/errors.go36
-rw-r--r--mist/ext_app.go145
-rw-r--r--mist/qml_container.go68
-rw-r--r--nat.go12
-rw-r--r--natpmp.go55
-rw-r--r--natupnp.go338
-rw-r--r--p2p/client_identity.go63
-rw-r--r--p2p/client_identity_test.go30
-rw-r--r--p2p/message.go232
-rw-r--r--p2p/message_test.go133
-rw-r--r--p2p/natpmp.go55
-rw-r--r--p2p/natupnp.go341
-rw-r--r--p2p/peer.go462
-rw-r--r--p2p/peer_error.go133
-rw-r--r--p2p/peer_test.go295
-rw-r--r--p2p/protocol.go294
-rw-r--r--p2p/protocol_test.go58
-rw-r--r--p2p/server.go467
-rw-r--r--p2p/server_test.go161
-rw-r--r--p2p/testlog_test.go28
-rw-r--r--p2p/testpoc7.go40
-rw-r--r--peer.go881
-rw-r--r--pow/ar/block.go12
-rw-r--r--pow/ar/ops.go54
-rw-r--r--pow/ar/pow.go122
-rw-r--r--pow/ar/pow_test.go47
-rw-r--r--pow/ar/rnd.go66
-rw-r--r--pow/block.go9
-rw-r--r--pow/ezp/pow.go89
-rw-r--r--pow/pow.go8
-rw-r--r--profile.cov3038
-rw-r--r--ptrie/cache.go42
-rw-r--r--ptrie/fullnode.go69
-rw-r--r--ptrie/hashnode.go22
-rw-r--r--ptrie/iterator.go115
-rw-r--r--ptrie/iterator_test.go33
-rw-r--r--ptrie/node.go40
-rw-r--r--ptrie/shortnode.go31
-rw-r--r--ptrie/trie.go312
-rw-r--r--ptrie/trie_test.go259
-rw-r--r--ptrie/valuenode.go13
-rw-r--r--rlp/decode.go743
-rw-r--r--rlp/decode_test.go527
-rw-r--r--rlp/doc.go17
-rw-r--r--rlp/typecache.go62
-rw-r--r--rpc/json.go20
-rw-r--r--rpc/message.go14
-rw-r--r--rpc/packages.go311
-rw-r--r--rpc/server.go67
-rw-r--r--rpc/writer.go75
-rw-r--r--state/dump.go56
-rw-r--r--state/errors.go23
-rw-r--r--state/log.go78
-rw-r--r--state/main_test.go9
-rw-r--r--state/manifest.go55
-rw-r--r--state/state.go325
-rw-r--r--state/state_object.go320
-rw-r--r--state/state_test.go61
-rw-r--r--tests/files/BasicTests/blockgenesistest.json20
-rw-r--r--tests/files/BasicTests/genesishashestest.json15
-rw-r--r--tests/files/BasicTests/hexencodetest.json62
-rw-r--r--tests/files/BasicTests/keyaddrtest.json22
-rw-r--r--tests/files/BasicTests/rlptest.json146
-rw-r--r--tests/files/BasicTests/txtest.json24
-rw-r--r--tests/files/README.md26
-rw-r--r--tests/files/StateTests/stExample.json64
-rw-r--r--tests/files/StateTests/stInitCodeTest.json870
-rw-r--r--tests/files/StateTests/stLogTests.json3712
-rw-r--r--tests/files/StateTests/stPreCompiledContracts.json1674
-rw-r--r--tests/files/StateTests/stRecursiveCreate.json7231
-rw-r--r--tests/files/StateTests/stRefundTest.json523
-rw-r--r--tests/files/StateTests/stSpecialTest.json77
-rw-r--r--tests/files/StateTests/stSystemOperationsTest.json5830
-rw-r--r--tests/files/StateTests/stTransactionTest.json277
-rw-r--r--tests/files/TODO21
-rw-r--r--tests/files/TrieTests/trieanyorder.json55
-rw-r--r--tests/files/TrieTests/trietest.json31
-rw-r--r--tests/files/TrieTests/trietestnextprev.json19
-rw-r--r--tests/files/VMTests/RandomTests/randomTest.json46
-rw-r--r--tests/files/VMTests/vmArithmeticTest.json3261
-rw-r--r--tests/files/VMTests/vmBitwiseLogicOperationTest.json2682
-rw-r--r--tests/files/VMTests/vmBlockInfoTest.json271
-rw-r--r--tests/files/VMTests/vmEnvironmentalInfoTest.json1401
-rw-r--r--tests/files/VMTests/vmIOandFlowOperationsTest.json1527
-rw-r--r--tests/files/VMTests/vmLogTest.json2190
-rw-r--r--tests/files/VMTests/vmPushDupSwapTest.json3072
-rw-r--r--tests/files/VMTests/vmSha3Test.json253
-rw-r--r--tests/files/VMTests/vmtests.json214
-rw-r--r--tests/files/index.js32
-rw-r--r--tests/files/package.json23
-rw-r--r--tests/helper/common.go11
-rw-r--r--tests/helper/init.go20
-rw-r--r--tests/helper/readers.go42
-rw-r--r--tests/helper/trie.go31
-rw-r--r--tests/helper/vm.go156
-rw-r--r--tests/vm/.ethtest0
-rw-r--r--tests/vm/gh_test.go238
-rw-r--r--trie/encoding.go76
-rw-r--r--trie/encoding_test.go59
-rw-r--r--trie/iterator.go143
-rw-r--r--trie/main_test.go9
-rw-r--r--trie/slice.go53
-rw-r--r--trie/trie.go631
-rw-r--r--trie/trie_test.go447
-rw-r--r--types/ethereum.go1
-rw-r--r--ui/filter.go75
-rw-r--r--ui/qt/filter.go38
-rw-r--r--ui/qt/qwhisper/whisper.go70
-rw-r--r--utils/vm_env.go35
-rw-r--r--vm/.ethtest0
-rw-r--r--vm/address.go56
-rw-r--r--vm/analysis.go35
-rw-r--r--vm/asm.go45
-rw-r--r--vm/closure.go107
-rw-r--r--vm/common.go75
-rw-r--r--vm/debugger.go10
-rw-r--r--vm/environment.go81
-rw-r--r--vm/errors.go51
-rw-r--r--vm/main_test.go9
-rw-r--r--vm/stack.go179
-rw-r--r--vm/types.go334
-rw-r--r--vm/virtual_machine.go10
-rw-r--r--vm/vm.go36
-rw-r--r--vm/vm_debug.go983
-rw-r--r--vm/vm_test.go3
-rw-r--r--websocket/client.go122
-rw-r--r--websocket/message.go14
-rw-r--r--websocket/server.go127
-rw-r--r--whisper/envelope.go121
-rw-r--r--whisper/filter.go10
-rw-r--r--whisper/main.go47
-rw-r--r--whisper/message.go74
-rw-r--r--whisper/messages_test.go51
-rw-r--r--whisper/peer.go128
-rw-r--r--whisper/sort.go25
-rw-r--r--whisper/sort_test.go19
-rw-r--r--whisper/util.go27
-rw-r--r--whisper/whisper.go246
-rw-r--r--whisper/whisper_test.go47
-rw-r--r--wire/.gitignore12
-rw-r--r--wire/README.md36
-rw-r--r--wire/client_identity.go56
-rw-r--r--wire/client_identity_test.go30
-rw-r--r--wire/messages2.go199
-rw-r--r--wire/messaging.go178
-rw-r--r--xeth/config.go35
-rw-r--r--xeth/hexface.go255
-rw-r--r--xeth/js_types.go236
-rw-r--r--xeth/object.go26
-rw-r--r--xeth/pipe.go181
-rw-r--r--xeth/vm_env.go65
-rw-r--r--xeth/world.go64
344 files changed, 67743 insertions, 1445 deletions
diff --git a/.gitignore b/.gitignore
index de3a847ac..fea7df6c2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,6 +9,4 @@
*un~
.DS_Store
*/**/.DS_Store
-ethereum/ethereum
-ethereal/ethereal
-
+.ethtest
diff --git a/.travis.yml b/.travis.yml
index 32740f91a..d09cbcdb0 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,4 +1,25 @@
-before_install: sudo apt-get install libgmp3-dev
language: go
go:
- - 1.2
+ - 1.3
+before_install:
+ - sudo add-apt-repository ppa:ubuntu-sdk-team/ppa -y
+ - sudo apt-get update -qq
+ - sudo apt-get install -yqq libgmp3-dev qtbase5-private-dev qtdeclarative5-private-dev libqt5opengl5-dev libreadline6-dev
+install:
+ - go get code.google.com/p/go.tools/cmd/goimports
+ - go get github.com/golang/lint/golint
+ # - go get code.google.com/p/go.tools/cmd/vet
+ - go get code.google.com/p/go.tools/cmd/cover
+ - go get github.com/mattn/goveralls
+ - ./install_deps.sh
+before_script:
+ - gofmt -l -w .
+ - goimports -l -w .
+ - golint .
+ # - go vet ./...
+ # - go test -race ./...
+script:
+ - ./gocoverage.sh && goveralls -coverprofile=profile.cov -service=travis-ci -repotoken $COVERALLS_TOKEN
+env:
+ - secure: "U2U1AmkU4NJBgKR/uUAebQY87cNL0+1JHjnLOmmXwxYYyj5ralWb1aSuSH3qSXiT93qLBmtaUkuv9fberHVqrbAeVlztVdUsKAq7JMQH+M99iFkC9UiRMqHmtjWJ0ok4COD1sRYixxi21wb/JrMe3M1iL4QJVS61iltjHhVdM64="
+
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 000000000..1f37ce892
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,41 @@
+FROM ubuntu:14.04
+
+## Environment setup
+ENV HOME /root
+ENV GOPATH /root/go
+ENV PATH /go/bin:/root/go/bin:/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
+
+RUN mkdir -p /root/go
+ENV DEBIAN_FRONTEND noninteractive
+
+## Install base dependencies
+RUN apt-get update && apt-get upgrade -y
+RUN apt-get install -y git mercurial build-essential software-properties-common pkg-config libgmp3-dev libreadline6-dev libpcre3-dev libpcre++-dev
+
+## Build and install Go
+RUN hg clone -u release https://code.google.com/p/go
+RUN cd go && hg update go1.4
+RUN cd go/src && ./all.bash && go version
+
+## Install GUI dependencies
+RUN add-apt-repository ppa:ubuntu-sdk-team/ppa -y
+RUN apt-get update -y
+RUN apt-get install -y qtbase5-private-dev qtdeclarative5-private-dev libqt5opengl5-dev
+
+## Fetch and install serpent-go
+RUN go get -v -d github.com/ethereum/serpent-go
+WORKDIR $GOPATH/src/github.com/ethereum/serpent-go
+RUN git checkout master
+RUN git submodule update --init
+RUN go install -v
+
+# Fetch and install go-ethereum
+RUN go get -v -d github.com/ethereum/go-ethereum/...
+WORKDIR $GOPATH/src/github.com/ethereum/go-ethereum
+RUN git checkout poc8
+RUN ETH_DEPS=$(go list -f '{{.Imports}} {{.TestImports}} {{.XTestImports}}' github.com/ethereum/go-ethereum/... | sed -e 's/\[//g' | sed -e 's/\]//g' | sed -e 's/C //g'); if [ "$ETH_DEPS" ]; then go get $ETH_DEPS; fi
+RUN go install -v ./cmd/ethereum
+
+# Run JSON RPC
+ENTRYPOINT ["ethereum", "-rpc=true", "-rpcport=8080"]
+EXPOSE 8080
diff --git a/LICENSE b/LICENSE
index 78efdaabe..30f629158 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,16 +1,16 @@
Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved.
This library is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public
+modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This 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
-General Public License for more details.
+Lesser General Public License for more details.
-You should have received a copy of the GNU General Public License
-along with this library; if not, write to the Free Software
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301 USA
diff --git a/README.md b/README.md
index 8657e3fb6..564e5c56d 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,8 @@
+[![Bugs](https://badge.waffle.io/ethereum/go-ethereum.png?label=bug&title=Bugs)](https://waffle.io/ethereum/go-ethereum)
[![Stories in Ready](https://badge.waffle.io/ethereum/go-ethereum.png?label=ready&title=Ready)](https://waffle.io/ethereum/go-ethereum)
+[![Stories in
+Progress](https://badge.waffle.io/ethereum/go-ethereum.svg?label=in%20progress&title=In Progress)](http://waffle.io/ethereum/go-ethereum)
+
Ethereum
========
@@ -8,38 +12,64 @@ Status](http://build.ethdev.com/buildstatusimage?builder=Linux%20Go%20develop%20
Ethereum Go Client © 2014 Jeffrey Wilcke.
-Current state: Proof of Concept 0.6.7.
+Current state: Proof of Concept 0.7
-For the development package please see the [eth-go package](https://github.com/ethereum/eth-go).
+Ethereum is currently in its testing phase.
Build
-=======
+=====
-To build Ethereal (GUI):
+To build Mist (GUI):
-`go get github.com/ethereum/go-ethereum/ethereal`
+`go get github.com/ethereum/go-ethereum/cmd/mist`
To build the node (CLI):
-`go get github.com/ethereum/go-ethereum/ethereum`
+`go get github.com/ethereum/go-ethereum/cmd/ethereum`
For further, detailed, build instruction please see the [Wiki](https://github.com/ethereum/go-ethereum/wiki/Building-Ethereum(Go))
+Automated (dev) builds
+======================
+
+* [[OS X](http://build.ethdev.com/builds/OSX%20Go%20develop%20branch/latest/app/)]
+* [Windows] Coming soon&trade;
+* [Linux] Coming soon&trade;
+
+Binaries
+========
+
+Go Ethereum comes with several binaries found in
+[cmd](https://github.com/ethereum/go-ethereum/tree/master/cmd):
+
+* `mist` Official Ethereum Browser
+* `ethereum` Ethereum CLI
+* `ethtest` test tool which runs with the [tests](https://github.com/ethereum/testes) suit:
+ `ethtest "`cat myfile.json`"`.
+* `evm` is a generic Ethereum Virtual Machine: `evm -code 60ff60ff -gas
+ 10000 -price 0 -dump`. See `-h` for a detailed description.
+
General command line options
-====================
+============================
```
-Shared between ethereum and ethereal
+== Shared between ethereum and Mist ==
+
+= Settings
-id Set the custom identifier of the client (shows up on other clients)
-port Port on which the server will accept incomming connections
-upnp Enable UPnP
-maxpeer Desired amount of peers
-rpc Start JSON RPC
-
-dir Data directory used to store configs and databases
--import Import a private key
--genaddr Generates a new address and private key (destructive action)
--h This
+
+= Utility
+-h This
+-import Import a private key
+-genaddr Generates a new address and private key (destructive action)
+-dump Dump a specific state of a block to stdout given the -number or -hash
+-difftool Supress all output and prints VM output to stdout
+-diff vm=only vm output, all=all output including state storage
Ethereum only
ethereum [options] [filename]
@@ -47,31 +77,34 @@ ethereum [options] [filename]
filename Load the given file and interpret as JavaScript
-m Start mining blocks
-Etheral only
+== Mist only ==
+
-asset_path absolute path to GUI assets directory
```
Contribution
============
-If you would like to contribute to Ethereum Go, please fork, fix, commit and
-send a pull request to the main repository. Commits which do not comply with the coding standards explained below
-will be ignored. If you send a pull request, make sure that you
-commit to the `develop` branch and that you do not merge to `master`.
-Commits that are directly based off of the `master` branch instead of the `develop` branch will be ignored.
+If you'd like to contribute to Ethereum please fork, fix, commit and
+send a pull request. Commits who do not comply with the coding standards
+are ignored (use gofmt!). If you send pull requests make absolute sure that you
+commit on the `develop` branch and that you do not merge to master.
+Commits that are directly based on master are simply ignored.
-To make this process simpler try following the [git flow](http://nvie.com/posts/a-successful-git-branching-model/) branching model, as it sets this process up and streamlines work flow.
+To make life easier try [git flow](http://nvie.com/posts/a-successful-git-branching-model/) it sets
+this all up and streamlines your work flow.
Coding standards
================
-Code should be formatted according to the [Go Formatting
+Sources should be formatted according to the [Go Formatting
Style](http://golang.org/doc/effective_go.html#formatting).
-Unless struct fields are supposed to be directly accessible, provide
-getters and hide the fields through Go's exporting facility.
+Unless structs fields are supposed to be directly accesible, provide
+Getters and hide the fields through Go's exporting facility.
-Make comments in your code meaningful and only use them when necessary. Describe in detail what your code is trying to achieve. For example, this would be redundant and unnecessary commenting:
+When you comment put meaningfull comments. Describe in detail what you
+want to achieve.
*wrong*
@@ -82,7 +115,12 @@ if x > y {
}
```
-Everyone reading the source code should know what this code snippet was meant to achieve, and so those are **not** meaningful comments.
+Everyone reading the source probably know what you wanted to achieve
+with above code. Those are **not** meaningful comments.
-While this project is constantly tested and run, code tests should be written regardless. There is not time to evaluate every person's code specifically, so it is expected of you to write tests for the code so that it does not have to be tested manually. In fact, contributing by simply writing tests is perfectly fine!
+While the project isn't 100% tested I want you to write tests non the
+less. I haven't got time to evaluate everyone's code in detail so I
+expect you to write tests for me so I don't have to test your code
+manually. (If you want to contribute by just writing tests that's fine
+too!)
diff --git a/_data/chain1 b/_data/chain1
new file mode 100755
index 000000000..ef392e001
--- /dev/null
+++ b/_data/chain1
Binary files differ
diff --git a/_data/chain2 b/_data/chain2
new file mode 100755
index 000000000..48ed4d5ea
--- /dev/null
+++ b/_data/chain2
Binary files differ
diff --git a/block_pool.go b/block_pool.go
new file mode 100644
index 000000000..c618f6993
--- /dev/null
+++ b/block_pool.go
@@ -0,0 +1,351 @@
+package eth
+
+import (
+ "bytes"
+ "container/list"
+ "fmt"
+ "math"
+ "math/big"
+ "sync"
+ "time"
+
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/logger"
+ "github.com/ethereum/go-ethereum/wire"
+)
+
+var poollogger = logger.NewLogger("BPOOL")
+
+type block struct {
+ from *Peer
+ peer *Peer
+ block *types.Block
+ reqAt time.Time
+ requested int
+}
+
+type BlockPool struct {
+ mut sync.Mutex
+
+ eth *Ethereum
+
+ hashes [][]byte
+ pool map[string]*block
+
+ td *big.Int
+ quit chan bool
+
+ fetchingHashes bool
+ downloadStartedAt time.Time
+
+ ChainLength, BlocksProcessed int
+
+ peer *Peer
+}
+
+func NewBlockPool(eth *Ethereum) *BlockPool {
+ return &BlockPool{
+ eth: eth,
+ pool: make(map[string]*block),
+ td: ethutil.Big0,
+ quit: make(chan bool),
+ }
+}
+
+func (self *BlockPool) Len() int {
+ return len(self.hashes)
+}
+
+func (self *BlockPool) Reset() {
+ self.pool = make(map[string]*block)
+ self.hashes = nil
+}
+
+func (self *BlockPool) HasLatestHash() bool {
+ self.mut.Lock()
+ defer self.mut.Unlock()
+
+ return self.pool[string(self.eth.ChainManager().CurrentBlock().Hash())] != nil
+}
+
+func (self *BlockPool) HasCommonHash(hash []byte) bool {
+ return self.eth.ChainManager().GetBlock(hash) != nil
+}
+
+func (self *BlockPool) Blocks() (blocks types.Blocks) {
+ for _, item := range self.pool {
+ if item.block != nil {
+ blocks = append(blocks, item.block)
+ }
+ }
+
+ return
+}
+
+func (self *BlockPool) FetchHashes(peer *Peer) bool {
+ highestTd := self.eth.HighestTDPeer()
+
+ if (self.peer == nil && peer.td.Cmp(highestTd) >= 0) || (self.peer != nil && peer.td.Cmp(self.peer.td) > 0) || self.peer == peer {
+ if self.peer != peer {
+ poollogger.Infof("Found better suitable peer (%v vs %v)\n", self.td, peer.td)
+
+ if self.peer != nil {
+ self.peer.doneFetchingHashes = true
+ }
+ }
+
+ self.peer = peer
+ self.td = peer.td
+
+ if !self.HasLatestHash() {
+ self.fetchHashes()
+ }
+
+ return true
+ }
+
+ return false
+}
+
+func (self *BlockPool) fetchHashes() {
+ peer := self.peer
+
+ peer.doneFetchingHashes = false
+
+ const amount = 256
+ peerlogger.Debugf("Fetching hashes (%d) %x...\n", amount, peer.lastReceivedHash[0:4])
+ peer.QueueMessage(wire.NewMessage(wire.MsgGetBlockHashesTy, []interface{}{peer.lastReceivedHash, uint32(amount)}))
+}
+
+func (self *BlockPool) AddHash(hash []byte, peer *Peer) {
+ self.mut.Lock()
+ defer self.mut.Unlock()
+
+ if self.pool[string(hash)] == nil {
+ self.pool[string(hash)] = &block{peer, nil, nil, time.Now(), 0}
+
+ self.hashes = append([][]byte{hash}, self.hashes...)
+ }
+}
+
+func (self *BlockPool) Add(b *types.Block, peer *Peer) {
+ self.addBlock(b, peer, false)
+}
+
+func (self *BlockPool) AddNew(b *types.Block, peer *Peer) {
+ self.addBlock(b, peer, true)
+}
+
+func (self *BlockPool) addBlock(b *types.Block, peer *Peer, newBlock bool) {
+ self.mut.Lock()
+ defer self.mut.Unlock()
+
+ hash := string(b.Hash())
+
+ if self.pool[hash] == nil && !self.eth.ChainManager().HasBlock(b.Hash()) {
+ poollogger.Infof("Got unrequested block (%x...)\n", hash[0:4])
+
+ self.hashes = append(self.hashes, b.Hash())
+ self.pool[hash] = &block{peer, peer, b, time.Now(), 0}
+
+ // The following is only performed on an unrequested new block
+ if newBlock {
+ fmt.Println("1.", !self.eth.ChainManager().HasBlock(b.PrevHash), ethutil.Bytes2Hex(b.Hash()[0:4]), ethutil.Bytes2Hex(b.PrevHash[0:4]))
+ fmt.Println("2.", self.pool[string(b.PrevHash)] == nil)
+ fmt.Println("3.", !self.fetchingHashes)
+ if !self.eth.ChainManager().HasBlock(b.PrevHash) /*&& self.pool[string(b.PrevHash)] == nil*/ && !self.fetchingHashes {
+ poollogger.Infof("Unknown chain, requesting (%x...)\n", b.PrevHash[0:4])
+ peer.QueueMessage(wire.NewMessage(wire.MsgGetBlockHashesTy, []interface{}{b.Hash(), uint32(256)}))
+ }
+ }
+ } else if self.pool[hash] != nil {
+ self.pool[hash].block = b
+ }
+
+ self.BlocksProcessed++
+}
+
+func (self *BlockPool) Remove(hash []byte) {
+ self.mut.Lock()
+ defer self.mut.Unlock()
+
+ self.hashes = ethutil.DeleteFromByteSlice(self.hashes, hash)
+ delete(self.pool, string(hash))
+}
+
+func (self *BlockPool) DistributeHashes() {
+ self.mut.Lock()
+ defer self.mut.Unlock()
+
+ var (
+ peerLen = self.eth.peers.Len()
+ amount = 256 * peerLen
+ dist = make(map[*Peer][][]byte)
+ )
+
+ num := int(math.Min(float64(amount), float64(len(self.pool))))
+ for i, j := 0, 0; i < len(self.hashes) && j < num; i++ {
+ hash := self.hashes[i]
+ item := self.pool[string(hash)]
+
+ if item != nil && item.block == nil {
+ var peer *Peer
+ lastFetchFailed := time.Since(item.reqAt) > 5*time.Second
+
+ // Handle failed requests
+ if lastFetchFailed && item.requested > 5 && item.peer != nil {
+ if item.requested < 100 {
+ // Select peer the hash was retrieved off
+ peer = item.from
+ } else {
+ // Remove it
+ self.hashes = ethutil.DeleteFromByteSlice(self.hashes, hash)
+ delete(self.pool, string(hash))
+ }
+ } else if lastFetchFailed || item.peer == nil {
+ // Find a suitable, available peer
+ eachPeer(self.eth.peers, func(p *Peer, v *list.Element) {
+ if peer == nil && len(dist[p]) < amount/peerLen && p.statusKnown {
+ peer = p
+ }
+ })
+ }
+
+ if peer != nil {
+ item.reqAt = time.Now()
+ item.peer = peer
+ item.requested++
+
+ dist[peer] = append(dist[peer], hash)
+ }
+ }
+ }
+
+ for peer, hashes := range dist {
+ peer.FetchBlocks(hashes)
+ }
+
+ if len(dist) > 0 {
+ self.downloadStartedAt = time.Now()
+ }
+}
+
+func (self *BlockPool) Start() {
+ go self.downloadThread()
+ go self.chainThread()
+}
+
+func (self *BlockPool) Stop() {
+ close(self.quit)
+}
+
+func (self *BlockPool) downloadThread() {
+ serviceTimer := time.NewTicker(100 * time.Millisecond)
+out:
+ for {
+ select {
+ case <-self.quit:
+ break out
+ case <-serviceTimer.C:
+ // Check if we're catching up. If not distribute the hashes to
+ // the peers and download the blockchain
+ self.fetchingHashes = false
+ eachPeer(self.eth.peers, func(p *Peer, v *list.Element) {
+ if p.statusKnown && p.FetchingHashes() {
+ self.fetchingHashes = true
+ }
+ })
+
+ if len(self.hashes) > 0 {
+ self.DistributeHashes()
+ }
+
+ if self.ChainLength < len(self.hashes) {
+ self.ChainLength = len(self.hashes)
+ }
+
+ if self.peer != nil &&
+ !self.peer.doneFetchingHashes &&
+ time.Since(self.peer.lastHashAt) > 10*time.Second &&
+ time.Since(self.peer.lastHashRequestedAt) > 5*time.Second {
+ self.fetchHashes()
+ }
+
+ /*
+ if !self.fetchingHashes {
+ blocks := self.Blocks()
+ chain.BlockBy(chain.Number).Sort(blocks)
+
+ if len(blocks) > 0 {
+ if !self.eth.ChainManager().HasBlock(b.PrevHash) && self.pool[string(b.PrevHash)] == nil && !self.fetchingHashes {
+ }
+ }
+ }
+ */
+ }
+ }
+}
+
+func (self *BlockPool) chainThread() {
+ procTimer := time.NewTicker(500 * time.Millisecond)
+out:
+ for {
+ select {
+ case <-self.quit:
+ break out
+ case <-procTimer.C:
+ blocks := self.Blocks()
+ types.BlockBy(types.Number).Sort(blocks)
+
+ // Find common block
+ for i, block := range blocks {
+ if self.eth.ChainManager().HasBlock(block.PrevHash) {
+ blocks = blocks[i:]
+ break
+ }
+ }
+
+ if len(blocks) > 0 {
+ if self.eth.ChainManager().HasBlock(blocks[0].PrevHash) {
+ for i, block := range blocks[1:] {
+ // NOTE: The Ith element in this loop refers to the previous block in
+ // outer "blocks"
+ if bytes.Compare(block.PrevHash, blocks[i].Hash()) != 0 {
+ blocks = blocks[:i]
+
+ break
+ }
+ }
+ } else {
+ blocks = nil
+ }
+ }
+
+ if len(blocks) > 0 {
+ chainman := self.eth.ChainManager()
+
+ err := chainman.InsertChain(blocks)
+ if err != nil {
+ poollogger.Debugln(err)
+
+ self.Reset()
+
+ if self.peer != nil && self.peer.conn != nil {
+ poollogger.Debugf("Punishing peer for supplying bad chain (%v)\n", self.peer.conn.RemoteAddr())
+ }
+
+ // This peer gave us bad hashes and made us fetch a bad chain, therefor he shall be punished.
+ self.eth.BlacklistPeer(self.peer)
+ self.peer.StopWithReason(DiscBadPeer)
+ self.td = ethutil.Big0
+ self.peer = nil
+ }
+
+ for _, block := range blocks {
+ self.Remove(block.Hash())
+ }
+ }
+ }
+ }
+}
diff --git a/cmd/LICENSE b/cmd/LICENSE
new file mode 100644
index 000000000..78efdaabe
--- /dev/null
+++ b/cmd/LICENSE
@@ -0,0 +1,16 @@
+Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This 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
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+MA 02110-1301 USA
diff --git a/cmd/ethereum/cmd.go b/cmd/ethereum/cmd.go
new file mode 100644
index 000000000..8710d6136
--- /dev/null
+++ b/cmd/ethereum/cmd.go
@@ -0,0 +1,52 @@
+// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This 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
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+// MA 02110-1301 USA
+
+package main
+
+import (
+ "io/ioutil"
+ "os"
+
+ "github.com/ethereum/go-ethereum"
+ "github.com/ethereum/go-ethereum/cmd/ethereum/repl"
+ "github.com/ethereum/go-ethereum/cmd/utils"
+ "github.com/ethereum/go-ethereum/javascript"
+)
+
+func InitJsConsole(ethereum *eth.Ethereum) {
+ repl := ethrepl.NewJSRepl(ethereum)
+ go repl.Start()
+ utils.RegisterInterrupt(func(os.Signal) {
+ repl.Stop()
+ })
+}
+
+func ExecJsFile(ethereum *eth.Ethereum, InputFile string) {
+ file, err := os.Open(InputFile)
+ if err != nil {
+ clilogger.Fatalln(err)
+ }
+ content, err := ioutil.ReadAll(file)
+ if err != nil {
+ clilogger.Fatalln(err)
+ }
+ re := javascript.NewJSRE(ethereum)
+ utils.RegisterInterrupt(func(os.Signal) {
+ re.Stop()
+ })
+ re.Run(string(content))
+}
diff --git a/ethereum/flags.go b/cmd/ethereum/flags.go
index 58220f4e6..85aca47c3 100644
--- a/ethereum/flags.go
+++ b/cmd/ethereum/flags.go
@@ -1,13 +1,32 @@
+// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This 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
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+// MA 02110-1301 USA
+
package main
import (
"flag"
"fmt"
+ "log"
"os"
"os/user"
"path"
- "github.com/ethereum/eth-go/ethlog"
+ "github.com/ethereum/go-ethereum/logger"
+ "github.com/ethereum/go-ethereum/vm"
)
var (
@@ -37,6 +56,7 @@ var (
Dump bool
DumpHash string
DumpNumber int
+ VmType int
)
// flags specific to cli client
@@ -59,12 +79,13 @@ func Init() {
flag.PrintDefaults()
}
+ flag.IntVar(&VmType, "vm", 0, "Virtual Machine type: 0-1: standard, debug")
flag.StringVar(&Identifier, "id", "", "Custom client identifier")
flag.StringVar(&KeyRing, "keyring", "", "identifier for keyring to use")
flag.StringVar(&KeyStore, "keystore", "db", "system to store keyrings: db|file (db)")
flag.StringVar(&OutboundPort, "port", "30303", "listening port")
flag.BoolVar(&UseUPnP, "upnp", false, "enable UPnP support")
- flag.IntVar(&MaxPeer, "maxpeer", 10, "maximum desired peers")
+ flag.IntVar(&MaxPeer, "maxpeer", 30, "maximum desired peers")
flag.IntVar(&RpcPort, "rpcport", 8080, "port to start json-rpc server on")
flag.BoolVar(&StartRpc, "rpc", false, "start rpc server")
flag.BoolVar(&StartWebSockets, "ws", false, "start websocket server")
@@ -77,7 +98,7 @@ func Init() {
flag.StringVar(&Datadir, "datadir", defaultDataDir(), "specifies the datadir to use")
flag.StringVar(&ConfigFile, "conf", defaultConfigFile, "config file")
flag.StringVar(&DebugFile, "debug", "", "debug file (no debugging if not set)")
- flag.IntVar(&LogLevel, "loglevel", int(ethlog.InfoLevel), "loglevel: 0-5: silent,error,warn,info,debug,debug detail)")
+ flag.IntVar(&LogLevel, "loglevel", int(logger.InfoLevel), "loglevel: 0-5: silent,error,warn,info,debug,debug detail)")
flag.BoolVar(&DiffTool, "difftool", false, "creates output for diff'ing. Sets LogLevel=0")
flag.StringVar(&DiffType, "diff", "all", "sets the level of diff output [vm, all]. Has no effect if difftool=false")
flag.BoolVar(&ShowGenesis, "genesis", false, "Dump the genesis block")
@@ -91,5 +112,9 @@ func Init() {
flag.Parse()
+ if VmType >= int(vm.MaxVmTy) {
+ log.Fatal("Invalid VM type ", VmType)
+ }
+
InputFile = flag.Arg(0)
}
diff --git a/ethereum/main.go b/cmd/ethereum/main.go
index 0f0df20bb..2a3c46054 100644
--- a/ethereum/main.go
+++ b/cmd/ethereum/main.go
@@ -1,3 +1,20 @@
+// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This 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
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+// MA 02110-1301 USA
+
package main
import (
@@ -5,18 +22,18 @@ import (
"os"
"runtime"
- "github.com/ethereum/eth-go/ethchain"
- "github.com/ethereum/eth-go/ethlog"
- "github.com/ethereum/eth-go/ethutil"
- "github.com/ethereum/go-ethereum/utils"
+ "github.com/ethereum/go-ethereum/cmd/utils"
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/logger"
)
const (
ClientIdentifier = "Ethereum(G)"
- Version = "0.6.7"
+ Version = "0.7.10"
)
-var logger = ethlog.NewLogger("CLI")
+var clilogger = logger.NewLogger("CLI")
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
@@ -31,7 +48,7 @@ func main() {
LogLevel = 0
}
- utils.InitConfig(ConfigFile, Datadir, "ETH")
+ utils.InitConfig(VmType, ConfigFile, Datadir, "ETH")
ethutil.Config.Diff = DiffTool
ethutil.Config.DiffType = DiffType
@@ -42,7 +59,7 @@ func main() {
db := utils.NewDatabase()
err := utils.DBSanityCheck(db)
if err != nil {
- logger.Errorln(err)
+ fmt.Println(err)
os.Exit(1)
}
@@ -57,14 +74,14 @@ func main() {
ethereum := utils.NewEthereum(db, clientIdentity, keyManager, UseUPnP, OutboundPort, MaxPeer)
if Dump {
- var block *ethchain.Block
+ var block *types.Block
if len(DumpHash) == 0 && DumpNumber == -1 {
- block = ethereum.BlockChain().CurrentBlock
+ block = ethereum.ChainManager().CurrentBlock()
} else if len(DumpHash) > 0 {
- block = ethereum.BlockChain().GetBlock(ethutil.Hex2Bytes(DumpHash))
+ block = ethereum.ChainManager().GetBlock(ethutil.Hex2Bytes(DumpHash))
} else {
- block = ethereum.BlockChain().GetBlockByNumber(uint64(DumpNumber))
+ block = ethereum.ChainManager().GetBlockByNumber(uint64(DumpNumber))
}
if block == nil {
@@ -76,11 +93,14 @@ func main() {
os.Exit(1)
}
- fmt.Printf("RLP: %x\nstate: %x\nhash: %x\n", ethutil.Rlp(block), block.GetRoot(), block.Hash())
+ // block.GetRoot() does not exist
+ //fmt.Printf("RLP: %x\nstate: %x\nhash: %x\n", ethutil.Rlp(block), block.GetRoot(), block.Hash())
// Leave the Println. This needs clean output for piping
fmt.Printf("%s\n", block.State().Dump())
+ fmt.Println(block)
+
os.Exit(0)
}
@@ -111,5 +131,5 @@ func main() {
// this blocks the thread
ethereum.WaitForShutdown()
- ethlog.Flush()
+ logger.Flush()
}
diff --git a/cmd/ethereum/repl/console_colors_windows.go b/cmd/ethereum/repl/console_colors_windows.go
new file mode 100644
index 000000000..8062746fb
--- /dev/null
+++ b/cmd/ethereum/repl/console_colors_windows.go
@@ -0,0 +1,97 @@
+// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This 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
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+// MA 02110-1301 USA
+
+/* Inspired by https://github.com/xuyu/logging/blob/master/colorful_win.go */
+
+package ethrepl
+
+import (
+ "syscall"
+ "unsafe"
+)
+
+type color uint16
+
+const (
+ green = color(0x0002)
+ red = color(0x0004)
+ yellow = color(0x000E)
+)
+
+const (
+ mask = uint16(yellow | green | red)
+)
+
+var (
+ kernel32 = syscall.NewLazyDLL("kernel32.dll")
+ procGetStdHandle = kernel32.NewProc("GetStdHandle")
+ procSetConsoleTextAttribute = kernel32.NewProc("SetConsoleTextAttribute")
+ procGetConsoleScreenBufferInfo = kernel32.NewProc("GetConsoleScreenBufferInfo")
+ hStdout uintptr
+ initScreenInfo *consoleScreenBufferInfo
+)
+
+func setConsoleTextAttribute(hConsoleOutput uintptr, wAttributes uint16) bool {
+ ret, _, _ := procSetConsoleTextAttribute.Call(hConsoleOutput, uintptr(wAttributes))
+ return ret != 0
+}
+
+type coord struct {
+ X, Y int16
+}
+
+type smallRect struct {
+ Left, Top, Right, Bottom int16
+}
+
+type consoleScreenBufferInfo struct {
+ DwSize coord
+ DwCursorPosition coord
+ WAttributes uint16
+ SrWindow smallRect
+ DwMaximumWindowSize coord
+}
+
+func getConsoleScreenBufferInfo(hConsoleOutput uintptr) *consoleScreenBufferInfo {
+ var csbi consoleScreenBufferInfo
+ ret, _, _ := procGetConsoleScreenBufferInfo.Call(hConsoleOutput, uintptr(unsafe.Pointer(&csbi)))
+ if ret == 0 {
+ return nil
+ }
+ return &csbi
+}
+
+const (
+ stdOutputHandle = uint32(-11 & 0xFFFFFFFF)
+)
+
+func init() {
+ hStdout, _, _ = procGetStdHandle.Call(uintptr(stdOutputHandle))
+ initScreenInfo = getConsoleScreenBufferInfo(hStdout)
+}
+
+func resetColorful() {
+ if initScreenInfo == nil {
+ return
+ }
+ setConsoleTextAttribute(hStdout, initScreenInfo.WAttributes)
+}
+
+func changeColor(c color) {
+ attr := uint16(0) & ^mask | uint16(c)
+ setConsoleTextAttribute(hStdout, attr)
+}
diff --git a/ethereum/repl/repl.go b/cmd/ethereum/repl/repl.go
index d08feb7b4..a5146fecd 100644
--- a/ethereum/repl/repl.go
+++ b/cmd/ethereum/repl/repl.go
@@ -1,3 +1,20 @@
+// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This 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
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+// MA 02110-1301 USA
+
package ethrepl
import (
@@ -7,13 +24,13 @@ import (
"os"
"path"
- "github.com/ethereum/eth-go"
- "github.com/ethereum/eth-go/ethlog"
- "github.com/ethereum/eth-go/ethutil"
+ "github.com/ethereum/go-ethereum"
+ "github.com/ethereum/go-ethereum/ethutil"
"github.com/ethereum/go-ethereum/javascript"
+ "github.com/ethereum/go-ethereum/logger"
)
-var logger = ethlog.NewLogger("REPL")
+var repllogger = logger.NewLogger("REPL")
type Repl interface {
Start()
@@ -42,7 +59,7 @@ func NewJSRepl(ethereum *eth.Ethereum) *JSRepl {
func (self *JSRepl) Start() {
if !self.running {
self.running = true
- logger.Infoln("init JS Console")
+ repllogger.Infoln("init JS Console")
reader := bufio.NewReader(self.history)
for {
line, err := reader.ReadString('\n')
@@ -63,7 +80,7 @@ func (self *JSRepl) Stop() {
if self.running {
self.running = false
self.re.Stop()
- logger.Infoln("exit JS Console")
+ repllogger.Infoln("exit JS Console")
self.history.Close()
}
}
diff --git a/ethereum/repl/repl_darwin.go b/cmd/ethereum/repl/repl_darwin.go
index 4c07280f7..3710150cc 100644
--- a/ethereum/repl/repl_darwin.go
+++ b/cmd/ethereum/repl/repl_darwin.go
@@ -1,3 +1,20 @@
+// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This 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
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+// MA 02110-1301 USA
+
package ethrepl
// #cgo darwin CFLAGS: -I/usr/local/opt/readline/include
@@ -9,6 +26,7 @@ package ethrepl
// #include <readline/history.h>
import "C"
import (
+ "fmt"
"os"
"os/signal"
"strings"
@@ -118,6 +136,9 @@ func (self *JSRepl) PrintValue(v interface{}) {
method, _ := self.re.Vm.Get("prettyPrint")
v, err := self.re.Vm.ToValue(v)
if err == nil {
- method.Call(method, v)
+ val, err := method.Call(method, v)
+ if err == nil {
+ fmt.Printf("%v", val)
+ }
}
}
diff --git a/ethereum/repl/repl_linux.go b/cmd/ethereum/repl/repl_linux.go
index 276f135d7..276f135d7 120000
--- a/ethereum/repl/repl_linux.go
+++ b/cmd/ethereum/repl/repl_linux.go
diff --git a/cmd/ethereum/repl/repl_windows.go b/cmd/ethereum/repl/repl_windows.go
new file mode 100644
index 000000000..d2c405ee9
--- /dev/null
+++ b/cmd/ethereum/repl/repl_windows.go
@@ -0,0 +1,92 @@
+// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This 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
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+// MA 02110-1301 USA
+
+package ethrepl
+
+import (
+ "bufio"
+ "fmt"
+ "os"
+ "strings"
+)
+
+func (self *JSRepl) read() {
+ reader := bufio.NewReader(os.Stdin)
+ for {
+ fmt.Printf(self.prompt)
+ str, _, err := reader.ReadLine()
+ if err != nil {
+ fmt.Println("Error reading input", err)
+ } else {
+ if string(str) == "exit" {
+ self.Stop()
+ break
+ } else {
+ self.parseInput(string(str))
+ }
+ }
+ }
+}
+
+func addHistory(s string) {
+}
+
+func printColored(outputVal string) {
+ for outputVal != "" {
+ codePart := ""
+ if strings.HasPrefix(outputVal, "\033[32m") {
+ codePart = "\033[32m"
+ changeColor(2)
+ }
+ if strings.HasPrefix(outputVal, "\033[1m\033[30m") {
+ codePart = "\033[1m\033[30m"
+ changeColor(8)
+ }
+ if strings.HasPrefix(outputVal, "\033[31m") {
+ codePart = "\033[31m"
+ changeColor(red)
+ }
+ if strings.HasPrefix(outputVal, "\033[35m") {
+ codePart = "\033[35m"
+ changeColor(5)
+ }
+ if strings.HasPrefix(outputVal, "\033[0m") {
+ codePart = "\033[0m"
+ resetColorful()
+ }
+ textPart := outputVal[len(codePart):len(outputVal)]
+ index := strings.Index(textPart, "\033")
+ if index == -1 {
+ outputVal = ""
+ } else {
+ outputVal = textPart[index:len(textPart)]
+ textPart = textPart[0:index]
+ }
+ fmt.Printf("%v", textPart)
+ }
+}
+
+func (self *JSRepl) PrintValue(v interface{}) {
+ method, _ := self.re.Vm.Get("prettyPrint")
+ v, err := self.re.Vm.ToValue(v)
+ if err == nil {
+ val, err := method.Call(method, v)
+ if err == nil {
+ printColored(fmt.Sprintf("%v", val))
+ }
+ }
+}
diff --git a/cmd/ethtest/main.go b/cmd/ethtest/main.go
new file mode 100644
index 000000000..94ab779db
--- /dev/null
+++ b/cmd/ethtest/main.go
@@ -0,0 +1,128 @@
+/*
+ This file is part of go-ethereum
+
+ go-ethereum is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ go-ethereum 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
+*/
+/**
+ * @authors:
+ * Jeffrey Wilcke <i@jev.io>
+ * @date 2014
+ *
+ */
+
+package main
+
+import (
+ "bytes"
+ "encoding/json"
+ "io/ioutil"
+ "log"
+ "os"
+ "strings"
+
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/state"
+ "github.com/ethereum/go-ethereum/tests/helper"
+)
+
+type Account struct {
+ Balance string
+ Code string
+ Nonce string
+ Storage map[string]string
+}
+
+func StateObjectFromAccount(addr string, account Account) *state.StateObject {
+ obj := state.NewStateObject(ethutil.Hex2Bytes(addr))
+ obj.SetBalance(ethutil.Big(account.Balance))
+
+ if ethutil.IsHex(account.Code) {
+ account.Code = account.Code[2:]
+ }
+ obj.Code = ethutil.Hex2Bytes(account.Code)
+ obj.Nonce = ethutil.Big(account.Nonce).Uint64()
+
+ return obj
+}
+
+type VmTest struct {
+ Callcreates interface{}
+ Env map[string]string
+ Exec map[string]string
+ Gas string
+ Out string
+ Post map[string]Account
+ Pre map[string]Account
+}
+
+func RunVmTest(js string) (failed int) {
+ tests := make(map[string]VmTest)
+
+ data, _ := ioutil.ReadAll(strings.NewReader(js))
+ err := json.Unmarshal(data, &tests)
+ if err != nil {
+ log.Fatalln(err)
+ }
+
+ for name, test := range tests {
+ state := state.New(helper.NewTrie())
+ for addr, account := range test.Pre {
+ obj := StateObjectFromAccount(addr, account)
+ state.SetStateObject(obj)
+ }
+
+ ret, _, gas, err := helper.RunVm(state, test.Env, test.Exec)
+ // When an error is returned it doesn't always mean the tests fails.
+ // Have to come up with some conditional failing mechanism.
+ if err != nil {
+ log.Println(err)
+ }
+
+ rexp := helper.FromHex(test.Out)
+ if bytes.Compare(rexp, ret) != 0 {
+ log.Printf("%s's return failed. Expected %x, got %x\n", name, rexp, ret)
+ failed = 1
+ }
+
+ gexp := ethutil.Big(test.Gas)
+ if gexp.Cmp(gas) != 0 {
+ log.Printf("%s's gas failed. Expected %v, got %v\n", name, gexp, gas)
+ failed = 1
+ }
+
+ for addr, account := range test.Post {
+ obj := state.GetStateObject(helper.FromHex(addr))
+ for addr, value := range account.Storage {
+ v := obj.GetState(helper.FromHex(addr)).Bytes()
+ vexp := helper.FromHex(value)
+
+ if bytes.Compare(v, vexp) != 0 {
+ log.Printf("%s's : (%x: %s) storage failed. Expected %x, got %x (%v %v)\n", name, obj.Address()[0:4], addr, vexp, v, ethutil.BigD(vexp), ethutil.BigD(v))
+ failed = 1
+ }
+ }
+ }
+ }
+
+ return
+}
+
+func main() {
+ helper.Logger.SetLogLevel(5)
+ if len(os.Args) == 1 {
+ log.Fatalln("no json supplied")
+ }
+
+ os.Exit(RunVmTest(os.Args[1]))
+}
diff --git a/cmd/evm/code.txt b/cmd/evm/code.txt
new file mode 100644
index 000000000..a964ad9d2
--- /dev/null
+++ b/cmd/evm/code.txt
@@ -0,0 +1 @@
+60006102ff5360003560001a60008114156103395760013560405260216040516020025990590160009052606052604051602002816060513760405160200281019050506002604051121561005957604051602002606051f35b604051602002599059016000905260a052600060c052604051602002599059016000905260e0526000610100526001610120525b604051610120511215610109576060515161012051602002606051015112156100d8576101205160200260605101516101005160200260e051015260016101005101610100526100f9565b61012051602002606051015160c05160200260a0510152600160c0510160c0525b600161012051016101205261008d565b60216020599059016000905260c051808252806020028301925050602082015990590160009052600081538151600182015260218101825160200260a0518260005b8381101561016657808301518186015260208101905061014b565b50505050825160200281019050604059905901600090526102405281610240515283602061024051015261024051905090509050905060c05160200280599059016000905281816020850151855160003060195a03f1508090509050905060a05260216020599059016000905261010051808252806020028301925050602082015990590160009052600081538151600182015260218101825160200260e0518260005b8381101561022557808301518186015260208101905061020a565b50505050825160200281019050604059905901600090526102c052816102c051528360206102c05101526102c05190509050905090506101005160200280599059016000905281816020850151855160003060195a03f1508090509050905060e05260405160200259905901600090526102e0526000610120525b610100516101205112156102d7576101205160200260e0510151610120516020026102e051015260016101205101610120526102a0565b60605151610100516020026102e05101526000610120525b60c05161012051121561032d576101205160200260a05101516101205160016101005101016020026102e051015260016101205101610120526102ef565b6040516020026102e051f35b50
diff --git a/cmd/evm/input.txt b/cmd/evm/input.txt
new file mode 100644
index 000000000..1b6857ab9
--- /dev/null
+++ b/cmd/evm/input.txt
@@ -0,0 +1 @@
+0000000000000000000000000000000000000000000000000000000000000000c80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001100000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000150000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001b000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001f0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000023000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000250000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002700000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000029000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000002f0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000033000000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000350000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000003700000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000000000000000000000000000000039000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000003b000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000003d000000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000003f0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004100000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000000000000000000000000000043000000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000450000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000004700000000000000000000000000000000000000000000000000000000000000480000000000000000000000000000000000000000000000000000000000000049000000000000000000000000000000000000000000000000000000000000004a000000000000000000000000000000000000000000000000000000000000004b000000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000004d000000000000000000000000000000000000000000000000000000000000004e000000000000000000000000000000000000000000000000000000000000004f0000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000005100000000000000000000000000000000000000000000000000000000000000520000000000000000000000000000000000000000000000000000000000000053000000000000000000000000000000000000000000000000000000000000005400000000000000000000000000000000000000000000000000000000000000550000000000000000000000000000000000000000000000000000000000000056000000000000000000000000000000000000000000000000000000000000005700000000000000000000000000000000000000000000000000000000000000580000000000000000000000000000000000000000000000000000000000000059000000000000000000000000000000000000000000000000000000000000005a000000000000000000000000000000000000000000000000000000000000005b000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000005d000000000000000000000000000000000000000000000000000000000000005e000000000000000000000000000000000000000000000000000000000000005f0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000006100000000000000000000000000000000000000000000000000000000000000620000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000650000000000000000000000000000000000000000000000000000000000000066000000000000000000000000000000000000000000000000000000000000006700000000000000000000000000000000000000000000000000000000000000680000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000006b000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000006f0000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000007100000000000000000000000000000000000000000000000000000000000000720000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000000750000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000007700000000000000000000000000000000000000000000000000000000000000780000000000000000000000000000000000000000000000000000000000000079000000000000000000000000000000000000000000000000000000000000007a000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000007c000000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000008100000000000000000000000000000000000000000000000000000000000000820000000000000000000000000000000000000000000000000000000000000083000000000000000000000000000000000000000000000000000000000000008400000000000000000000000000000000000000000000000000000000000000850000000000000000000000000000000000000000000000000000000000000086000000000000000000000000000000000000000000000000000000000000008700000000000000000000000000000000000000000000000000000000000000880000000000000000000000000000000000000000000000000000000000000089000000000000000000000000000000000000000000000000000000000000008a000000000000000000000000000000000000000000000000000000000000008b000000000000000000000000000000000000000000000000000000000000008c000000000000000000000000000000000000000000000000000000000000008d000000000000000000000000000000000000000000000000000000000000008e000000000000000000000000000000000000000000000000000000000000008f0000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000009100000000000000000000000000000000000000000000000000000000000000920000000000000000000000000000000000000000000000000000000000000093000000000000000000000000000000000000000000000000000000000000009400000000000000000000000000000000000000000000000000000000000000950000000000000000000000000000000000000000000000000000000000000096000000000000000000000000000000000000000000000000000000000000009700000000000000000000000000000000000000000000000000000000000000980000000000000000000000000000000000000000000000000000000000000099000000000000000000000000000000000000000000000000000000000000009a000000000000000000000000000000000000000000000000000000000000009b000000000000000000000000000000000000000000000000000000000000009c000000000000000000000000000000000000000000000000000000000000009d000000000000000000000000000000000000000000000000000000000000009e000000000000000000000000000000000000000000000000000000000000009f00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000a100000000000000000000000000000000000000000000000000000000000000a200000000000000000000000000000000000000000000000000000000000000a300000000000000000000000000000000000000000000000000000000000000a400000000000000000000000000000000000000000000000000000000000000a500000000000000000000000000000000000000000000000000000000000000a600000000000000000000000000000000000000000000000000000000000000a700000000000000000000000000000000000000000000000000000000000000a800000000000000000000000000000000000000000000000000000000000000a900000000000000000000000000000000000000000000000000000000000000aa00000000000000000000000000000000000000000000000000000000000000ab00000000000000000000000000000000000000000000000000000000000000ac00000000000000000000000000000000000000000000000000000000000000ad00000000000000000000000000000000000000000000000000000000000000ae00000000000000000000000000000000000000000000000000000000000000af00000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000b100000000000000000000000000000000000000000000000000000000000000b200000000000000000000000000000000000000000000000000000000000000b300000000000000000000000000000000000000000000000000000000000000b400000000000000000000000000000000000000000000000000000000000000b500000000000000000000000000000000000000000000000000000000000000b600000000000000000000000000000000000000000000000000000000000000b700000000000000000000000000000000000000000000000000000000000000b800000000000000000000000000000000000000000000000000000000000000b900000000000000000000000000000000000000000000000000000000000000ba00000000000000000000000000000000000000000000000000000000000000bb00000000000000000000000000000000000000000000000000000000000000bc00000000000000000000000000000000000000000000000000000000000000bd00000000000000000000000000000000000000000000000000000000000000be00000000000000000000000000000000000000000000000000000000000000bf00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000c100000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000c300000000000000000000000000000000000000000000000000000000000000c400000000000000000000000000000000000000000000000000000000000000c500000000000000000000000000000000000000000000000000000000000000c600000000000000000000000000000000000000000000000000000000000000c7
diff --git a/cmd/evm/main.go b/cmd/evm/main.go
new file mode 100644
index 000000000..c6c986a04
--- /dev/null
+++ b/cmd/evm/main.go
@@ -0,0 +1,164 @@
+/*
+ This file is part of go-ethereum
+
+ go-ethereum is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ go-ethereum 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
+*/
+/**
+ * @authors
+ * Jeffrey Wilcke <i@jev.io>
+ * @date 2014
+ *
+ */
+
+package main
+
+import (
+ "flag"
+ "fmt"
+ "log"
+ "math/big"
+ "os"
+ "runtime"
+ "time"
+
+ "github.com/ethereum/go-ethereum/core"
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/ethdb"
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/logger"
+ "github.com/ethereum/go-ethereum/state"
+ "github.com/ethereum/go-ethereum/trie"
+ "github.com/ethereum/go-ethereum/vm"
+)
+
+var (
+ code = flag.String("code", "", "evm code")
+ loglevel = flag.Int("log", 4, "log level")
+ gas = flag.String("gas", "1000000000", "gas amount")
+ price = flag.String("price", "0", "gas price")
+ value = flag.String("value", "0", "tx value")
+ dump = flag.Bool("dump", false, "dump state after run")
+ data = flag.String("data", "", "data")
+)
+
+func perr(v ...interface{}) {
+ fmt.Println(v...)
+ //os.Exit(1)
+}
+
+func main() {
+ flag.Parse()
+
+ logger.AddLogSystem(logger.NewStdLogSystem(os.Stdout, log.LstdFlags, logger.LogLevel(*loglevel)))
+
+ ethutil.ReadConfig("/tmp/evmtest", "/tmp/evm", "")
+
+ db, _ := ethdb.NewMemDatabase()
+ statedb := state.New(trie.New(db, ""))
+ sender := statedb.NewStateObject([]byte("sender"))
+ receiver := statedb.NewStateObject([]byte("receiver"))
+ //receiver.SetCode([]byte(*code))
+ receiver.SetCode(ethutil.Hex2Bytes(*code))
+
+ vmenv := NewEnv(statedb, []byte("evmuser"), ethutil.Big(*value))
+
+ tstart := time.Now()
+
+ ret, e := vmenv.Call(sender, receiver.Address(), ethutil.Hex2Bytes(*data), ethutil.Big(*gas), ethutil.Big(*price), ethutil.Big(*value))
+
+ logger.Flush()
+ if e != nil {
+ perr(e)
+ }
+
+ if *dump {
+ fmt.Println(string(statedb.Dump()))
+ }
+
+ var mem runtime.MemStats
+ runtime.ReadMemStats(&mem)
+ fmt.Printf("vm took %v\n", time.Since(tstart))
+ fmt.Printf(`alloc: %d
+tot alloc: %d
+no. malloc: %d
+heap alloc: %d
+heap objs: %d
+num gc: %d
+`, mem.Alloc, mem.TotalAlloc, mem.Mallocs, mem.HeapAlloc, mem.HeapObjects, mem.NumGC)
+
+ fmt.Printf("%x\n", ret)
+}
+
+type VMEnv struct {
+ state *state.StateDB
+ block *types.Block
+
+ transactor []byte
+ value *big.Int
+
+ depth int
+ Gas *big.Int
+ time int64
+}
+
+func NewEnv(state *state.StateDB, transactor []byte, value *big.Int) *VMEnv {
+ return &VMEnv{
+ state: state,
+ transactor: transactor,
+ value: value,
+ time: time.Now().Unix(),
+ }
+}
+
+func (self *VMEnv) State() *state.StateDB { return self.state }
+func (self *VMEnv) Origin() []byte { return self.transactor }
+func (self *VMEnv) BlockNumber() *big.Int { return ethutil.Big0 }
+func (self *VMEnv) PrevHash() []byte { return make([]byte, 32) }
+func (self *VMEnv) Coinbase() []byte { return self.transactor }
+func (self *VMEnv) Time() int64 { return self.time }
+func (self *VMEnv) Difficulty() *big.Int { return ethutil.Big1 }
+func (self *VMEnv) BlockHash() []byte { return make([]byte, 32) }
+func (self *VMEnv) Value() *big.Int { return self.value }
+func (self *VMEnv) GasLimit() *big.Int { return big.NewInt(1000000000) }
+func (self *VMEnv) Depth() int { return 0 }
+func (self *VMEnv) SetDepth(i int) { self.depth = i }
+func (self *VMEnv) AddLog(log state.Log) {
+ self.state.AddLog(log)
+}
+func (self *VMEnv) Transfer(from, to vm.Account, amount *big.Int) error {
+ return vm.Transfer(from, to, amount)
+}
+
+func (self *VMEnv) vm(addr, data []byte, gas, price, value *big.Int) *core.Execution {
+ evm := vm.New(self, vm.DebugVmTy)
+
+ return core.NewExecution(evm, addr, data, gas, price, value)
+}
+
+func (self *VMEnv) Call(caller vm.ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error) {
+ exe := self.vm(addr, data, gas, price, value)
+ ret, err := exe.Call(addr, caller)
+ self.Gas = exe.Gas
+
+ return ret, err
+}
+func (self *VMEnv) CallCode(caller vm.ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error) {
+ exe := self.vm(caller.Address(), data, gas, price, value)
+ return exe.Call(addr, caller)
+}
+
+func (self *VMEnv) Create(caller vm.ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error, vm.ClosureRef) {
+ exe := self.vm(addr, data, gas, price, value)
+ return exe.Create(caller)
+}
diff --git a/mist/assets/back.png b/cmd/mist/assets/back.png
index 38fc84d6e..38fc84d6e 100644
--- a/mist/assets/back.png
+++ b/cmd/mist/assets/back.png
Binary files differ
diff --git a/mist/assets/browser.png b/cmd/mist/assets/browser.png
index 1d7348170..1d7348170 100644
--- a/mist/assets/browser.png
+++ b/cmd/mist/assets/browser.png
Binary files differ
diff --git a/mist/assets/bug.png b/cmd/mist/assets/bug.png
index f5e85dc99..f5e85dc99 100644
--- a/mist/assets/bug.png
+++ b/cmd/mist/assets/bug.png
Binary files differ
diff --git a/mist/assets/close.png b/cmd/mist/assets/close.png
index 88df442c5..88df442c5 100644
--- a/mist/assets/close.png
+++ b/cmd/mist/assets/close.png
Binary files differ
diff --git a/mist/assets/debugger/debugger.qml b/cmd/mist/assets/debugger/debugger.qml
index b30d20e6b..b30d20e6b 100644
--- a/mist/assets/debugger/debugger.qml
+++ b/cmd/mist/assets/debugger/debugger.qml
diff --git a/mist/assets/ext/big.js b/cmd/mist/assets/ext/big.js
index db633fd2f..daa8d7227 100644
--- a/mist/assets/ext/big.js
+++ b/cmd/mist/assets/ext/big.js
@@ -1,3 +1,20 @@
+// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This 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
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+// MA 02110-1301 USA
+
var bigInt = (function () {
var base = 10000000, logBase = 7;
var sign = {
diff --git a/cmd/mist/assets/ext/eth.js/.gitignore b/cmd/mist/assets/ext/eth.js/.gitignore
new file mode 100644
index 000000000..de3a847ac
--- /dev/null
+++ b/cmd/mist/assets/ext/eth.js/.gitignore
@@ -0,0 +1,14 @@
+# See http://help.github.com/ignore-files/ for more about ignoring files.
+#
+# If you find yourself ignoring temporary files generated by your text editor
+# or operating system, you probably want to add a global ignore instead:
+# git config --global core.excludesfile ~/.gitignore_global
+
+/tmp
+*/**/*un~
+*un~
+.DS_Store
+*/**/.DS_Store
+ethereum/ethereum
+ethereal/ethereal
+
diff --git a/cmd/mist/assets/ext/eth.js/README.md b/cmd/mist/assets/ext/eth.js/README.md
new file mode 100644
index 000000000..86e2969be
--- /dev/null
+++ b/cmd/mist/assets/ext/eth.js/README.md
@@ -0,0 +1,18 @@
+# Ethereum JavaScript API
+
+This is the Ethereum compatible JavaScript API using `Promise`s
+which implements the [Generic JSON RPC](https://github.com/ethereum/wiki/wiki/Generic-JSON-RPC) spec.
+
+For an example see `index.html`.
+
+**Please note this repo is in it's early stage.**
+
+If you'd like to run a WebSocket ethereum node check out
+[go-ethereum](https://github.com/ethereum/go-ethereum).
+
+To install ethereum and spawn a node:
+
+```
+go get github.com/ethereum/go-ethereum/ethereum
+ethereum -ws -loglevel=4
+```
diff --git a/cmd/mist/assets/ext/eth.js/httprpc.js b/cmd/mist/assets/ext/eth.js/httprpc.js
new file mode 100644
index 000000000..085b4693d
--- /dev/null
+++ b/cmd/mist/assets/ext/eth.js/httprpc.js
@@ -0,0 +1,70 @@
+(function () {
+ var HttpRpcProvider = function (host) {
+ this.handlers = [];
+ this.host = host;
+ };
+
+ function formatJsonRpcObject(object) {
+ return {
+ jsonrpc: '2.0',
+ method: object.call,
+ params: object.args,
+ id: object._id
+ }
+ };
+
+ function formatJsonRpcMessage(message) {
+ var object = JSON.parse(message);
+
+ return {
+ _id: object.id,
+ data: object.result
+ };
+ };
+
+ HttpRpcProvider.prototype.sendRequest = function (payload, cb) {
+ var data = formatJsonRpcObject(payload);
+
+ var request = new XMLHttpRequest();
+ request.open("POST", this.host, true);
+ request.send(JSON.stringify(data));
+ request.onreadystatechange = function () {
+ if (request.readyState === 4 && cb) {
+ cb(request);
+ }
+ }
+ };
+
+ HttpRpcProvider.prototype.send = function (payload) {
+ var self = this;
+ this.sendRequest(payload, function (request) {
+ self.handlers.forEach(function (handler) {
+ handler.call(self, formatJsonRpcMessage(request.responseText));
+ });
+ });
+ };
+
+ HttpRpcProvider.prototype.poll = function (payload, id) {
+ var self = this;
+ this.sendRequest(payload, function (request) {
+ var parsed = JSON.parse(request.responseText);
+ if (parsed.result instanceof Array ? parsed.result.length === 0 : !parsed.result) {
+ return;
+ }
+ self.handlers.forEach(function (handler) {
+ handler.call(self, {_event: payload.call, _id: id, data: parsed.result});
+ });
+ });
+ };
+
+ Object.defineProperty(HttpRpcProvider.prototype, "onmessage", {
+ set: function (handler) {
+ this.handlers.push(handler);
+ }
+ });
+
+ if (typeof(web3) !== "undefined" && web3.providers !== undefined) {
+ web3.providers.HttpRpcProvider = HttpRpcProvider;
+ }
+})();
+
diff --git a/cmd/mist/assets/ext/eth.js/index.html b/cmd/mist/assets/ext/eth.js/index.html
new file mode 100644
index 000000000..2b3f50a14
--- /dev/null
+++ b/cmd/mist/assets/ext/eth.js/index.html
@@ -0,0 +1,33 @@
+<!doctype>
+<html>
+
+<head>
+<script type="text/javascript" src="main.js"></script>
+<script type="text/javascript" src="websocket.js"></script>
+<script type="text/javascript" src="qt.js"></script>
+<script type="text/javascript" src="httprpc.js"></script>
+<script type="text/javascript">
+function registerName() {
+ var name = document.querySelector("#name").value;
+ name = web3.fromAscii(name);
+
+ var eth = web3.eth;
+ eth.transact({to: "NameReg", gas: "10000", gasPrice: eth.gasPrice, data: [web3.fromAscii("register"), name]}).then(function(tx) {
+ document.querySelector("#result").innerHTML = "Registered name. Please wait for the next block to come through.";
+ }, function(err) {
+ console.log(err);
+ });
+}
+</script>
+</head>
+
+<body>
+
+<h1>std::name_reg</h1>
+<input type="text" id="name"></input>
+<input type="submit" onClick="registerName();"></input>
+<div id="result"></div>
+
+</body>
+
+</html>
diff --git a/cmd/mist/assets/ext/eth.js/main.js b/cmd/mist/assets/ext/eth.js/main.js
new file mode 100644
index 000000000..5c7ca0603
--- /dev/null
+++ b/cmd/mist/assets/ext/eth.js/main.js
@@ -0,0 +1,432 @@
+(function(window) {
+ function isPromise(o) {
+ return o instanceof Promise
+ }
+
+ function flattenPromise (obj) {
+ if (obj instanceof Promise) {
+ return Promise.resolve(obj);
+ }
+
+ if (obj instanceof Array) {
+ return new Promise(function (resolve) {
+ var promises = obj.map(function (o) {
+ return flattenPromise(o);
+ });
+
+ return Promise.all(promises).then(function (res) {
+ for (var i = 0; i < obj.length; i++) {
+ obj[i] = res[i];
+ }
+ resolve(obj);
+ });
+ });
+ }
+
+ if (obj instanceof Object) {
+ return new Promise(function (resolve) {
+ var keys = Object.keys(obj);
+ var promises = keys.map(function (key) {
+ return flattenPromise(obj[key]);
+ });
+
+ return Promise.all(promises).then(function (res) {
+ for (var i = 0; i < keys.length; i++) {
+ obj[keys[i]] = res[i];
+ }
+ resolve(obj);
+ });
+ });
+ }
+
+ return Promise.resolve(obj);
+ };
+
+ var ethMethods = function () {
+ var blockCall = function (args) {
+ return typeof args[0] === "string" ? "blockByHash" : "blockByNumber";
+ };
+
+ var transactionCall = function (args) {
+ return typeof args[0] === "string" ? 'transactionByHash' : 'transactionByNumber';
+ };
+
+ var uncleCall = function (args) {
+ return typeof args[0] === "string" ? 'uncleByHash' : 'uncleByNumber';
+ };
+
+ var methods = [
+ { name: 'balanceAt', call: 'balanceAt' },
+ { name: 'stateAt', call: 'stateAt' },
+ { name: 'countAt', call: 'countAt'},
+ { name: 'codeAt', call: 'codeAt' },
+ { name: 'transact', call: 'transact' },
+ { name: 'call', call: 'call' },
+ { name: 'block', call: blockCall },
+ { name: 'transaction', call: transactionCall },
+ { name: 'uncle', call: uncleCall },
+ { name: 'compile', call: 'compile' }
+ ];
+ return methods;
+ };
+
+ var ethProperties = function () {
+ return [
+ { name: 'coinbase', getter: 'coinbase', setter: 'setCoinbase' },
+ { name: 'listening', getter: 'listening', setter: 'setListening' },
+ { name: 'mining', getter: 'mining', setter: 'setMining' },
+ { name: 'gasPrice', getter: 'gasPrice' },
+ { name: 'account', getter: 'account' },
+ { name: 'accounts', getter: 'accounts' },
+ { name: 'peerCount', getter: 'peerCount' },
+ { name: 'defaultBlock', getter: 'defaultBlock', setter: 'setDefaultBlock' },
+ { name: 'number', getter: 'number'}
+ ];
+ };
+
+ var dbMethods = function () {
+ return [
+ { name: 'put', call: 'put' },
+ { name: 'get', call: 'get' },
+ { name: 'putString', call: 'putString' },
+ { name: 'getString', call: 'getString' }
+ ];
+ };
+
+ var shhMethods = function () {
+ return [
+ { name: 'post', call: 'post' },
+ { name: 'newIdentity', call: 'newIdentity' },
+ { name: 'haveIdentity', call: 'haveIdentity' },
+ { name: 'newGroup', call: 'newGroup' },
+ { name: 'addToGroup', call: 'addToGroup' }
+ ];
+ };
+
+ var ethWatchMethods = function () {
+ var newFilter = function (args) {
+ return typeof args[0] === 'string' ? 'newFilterString' : 'newFilter';
+ };
+
+ return [
+ { name: 'newFilter', call: newFilter },
+ { name: 'uninstallFilter', call: 'uninstallFilter' },
+ { name: 'getMessages', call: 'getMessages' }
+ ];
+ };
+
+ var shhWatchMethods = function () {
+ return [
+ { name: 'newFilter', call: 'shhNewFilter' },
+ { name: 'uninstallFilter', call: 'shhUninstallFilter' },
+ { name: 'getMessage', call: 'shhGetMessages' }
+ ];
+ };
+
+ var setupMethods = function (obj, methods) {
+ methods.forEach(function (method) {
+ obj[method.name] = function () {
+ return flattenPromise(Array.prototype.slice.call(arguments)).then(function (args) {
+ var call = typeof method.call === "function" ? method.call(args) : method.call;
+ return {call: call, args: args};
+ }).then(function (request) {
+ return new Promise(function (resolve, reject) {
+ web3.provider.send(request, function (result) {
+ //if (result || typeof result === "boolean") {
+ resolve(result);
+ return;
+ //}
+ //reject(result);
+ });
+ });
+ }).catch(function( err) {
+ console.error(err);
+ });
+ };
+ });
+ };
+
+ var setupProperties = function (obj, properties) {
+ properties.forEach(function (property) {
+ var proto = {};
+ proto.get = function () {
+ return new Promise(function(resolve, reject) {
+ web3.provider.send({call: property.getter}, function(result) {
+ resolve(result);
+ });
+ });
+ };
+ if (property.setter) {
+ proto.set = function (val) {
+ return flattenPromise([val]).then(function (args) {
+ return new Promise(function (resolve) {
+ web3.provider.send({call: property.setter, args: args}, function (result) {
+ resolve(result);
+ });
+ });
+ }).catch(function (err) {
+ console.error(err);
+ });
+ }
+ }
+ Object.defineProperty(obj, property.name, proto);
+ });
+ };
+
+ var web3 = {
+ _callbacks: {},
+ _events: {},
+ providers: {},
+ toHex: function(str) {
+ var hex = "";
+ for(var i = 0; i < str.length; i++) {
+ var n = str.charCodeAt(i).toString(16);
+ hex += n.length < 2 ? '0' + n : n;
+ }
+
+ return hex;
+ },
+
+ toAscii: function(hex) {
+ // Find termination
+ var str = "";
+ var i = 0, l = hex.length;
+ for(; i < l; i+=2) {
+ var code = hex.charCodeAt(i)
+ if(code == 0) {
+ break;
+ }
+
+ str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));
+ }
+
+ return str;
+ },
+
+ toDecimal: function (val) {
+ return parseInt(val, 16);
+ },
+
+ fromAscii: function(str, pad) {
+ pad = pad === undefined ? 32 : pad;
+ var hex = this.toHex(str);
+ while(hex.length < pad*2)
+ hex += "00";
+ return hex
+ },
+
+ eth: {
+ prototype: Object(),
+ watch: function (params) {
+ return new Filter(params, ethWatch);
+ },
+ },
+
+ db: {
+ prototype: Object()
+ },
+
+ shh: {
+ prototype: Object(),
+ watch: function (params) {
+ return new Filter(params, shhWatch);
+ }
+ },
+
+ on: function(event, id, cb) {
+ if(web3._events[event] === undefined) {
+ web3._events[event] = {};
+ }
+
+ web3._events[event][id] = cb;
+ return this
+ },
+
+ off: function(event, id) {
+ if(web3._events[event] !== undefined) {
+ delete web3._events[event][id];
+ }
+
+ return this
+ },
+
+ trigger: function(event, id, data) {
+ var callbacks = web3._events[event];
+ if (!callbacks || !callbacks[id]) {
+ return;
+ }
+ var cb = callbacks[id];
+ cb(data);
+ },
+ };
+
+ var eth = web3.eth;
+ setupMethods(eth, ethMethods());
+ setupProperties(eth, ethProperties());
+ setupMethods(web3.db, dbMethods());
+ setupMethods(web3.shh, shhMethods());
+
+ var ethWatch = {
+ changed: 'changed'
+ };
+ setupMethods(ethWatch, ethWatchMethods());
+ var shhWatch = {
+ changed: 'shhChanged'
+ };
+ setupMethods(shhWatch, shhWatchMethods());
+
+ var ProviderManager = function() {
+ this.queued = [];
+ this.polls = [];
+ this.ready = false;
+ this.provider = undefined;
+ this.id = 1;
+
+ var self = this;
+ var poll = function () {
+ if (self.provider && self.provider.poll) {
+ self.polls.forEach(function (data) {
+ data.data._id = self.id;
+ self.id++;
+ self.provider.poll(data.data, data.id);
+ });
+ }
+ setTimeout(poll, 12000);
+ };
+ poll();
+ };
+
+ ProviderManager.prototype.send = function(data, cb) {
+ data._id = this.id;
+ if (cb) {
+ web3._callbacks[data._id] = cb;
+ }
+
+ data.args = data.args || [];
+ this.id++;
+
+ if(this.provider !== undefined) {
+ this.provider.send(data);
+ } else {
+ console.warn("provider is not set");
+ this.queued.push(data);
+ }
+ };
+
+ ProviderManager.prototype.set = function(provider) {
+ if(this.provider !== undefined && this.provider.unload !== undefined) {
+ this.provider.unload();
+ }
+
+ this.provider = provider;
+ this.ready = true;
+ };
+
+ ProviderManager.prototype.sendQueued = function() {
+ for(var i = 0; this.queued.length; i++) {
+ // Resend
+ this.send(this.queued[i]);
+ }
+ };
+
+ ProviderManager.prototype.installed = function() {
+ return this.provider !== undefined;
+ };
+
+ ProviderManager.prototype.startPolling = function (data, pollId) {
+ if (!this.provider || !this.provider.poll) {
+ return;
+ }
+ this.polls.push({data: data, id: pollId});
+ };
+
+ ProviderManager.prototype.stopPolling = function (pollId) {
+ for (var i = this.polls.length; i--;) {
+ var poll = this.polls[i];
+ if (poll.id === pollId) {
+ this.polls.splice(i, 1);
+ }
+ }
+ };
+
+ web3.provider = new ProviderManager();
+
+ web3.setProvider = function(provider) {
+ provider.onmessage = messageHandler;
+ web3.provider.set(provider);
+ web3.provider.sendQueued();
+ };
+
+ var Filter = function(options, impl) {
+ this.impl = impl;
+ this.callbacks = [];
+
+ var self = this;
+ this.promise = impl.newFilter(options);
+ this.promise.then(function (id) {
+ self.id = id;
+ web3.on(impl.changed, id, self.trigger.bind(self));
+ web3.provider.startPolling({call: impl.changed, args: [id]}, id);
+ });
+ };
+
+ Filter.prototype.arrived = function(callback) {
+ this.changed(callback);
+ }
+
+ Filter.prototype.changed = function(callback) {
+ var self = this;
+ this.promise.then(function(id) {
+ self.callbacks.push(callback);
+ });
+ };
+
+ Filter.prototype.trigger = function(messages) {
+ for(var i = 0; i < this.callbacks.length; i++) {
+ this.callbacks[i].call(this, messages);
+ }
+ };
+
+ Filter.prototype.uninstall = function() {
+ var self = this;
+ this.promise.then(function (id) {
+ self.impl.uninstallFilter(id);
+ web3.provider.stopPolling(id);
+ web3.off(impl.changed, id);
+ });
+ };
+
+ Filter.prototype.messages = function() {
+ var self = this;
+ return this.promise.then(function (id) {
+ return self.impl.getMessages(id);
+ });
+ };
+
+ function messageHandler(data) {
+ if(data._event !== undefined) {
+ web3.trigger(data._event, data._id, data.data);
+ return;
+ }
+
+ if(data._id) {
+ var cb = web3._callbacks[data._id];
+ if (cb) {
+ cb.call(this, data.data)
+ delete web3._callbacks[data._id];
+ }
+ }
+ }
+
+ /*
+ // Install default provider
+ if(!web3.provider.installed()) {
+ var sock = new web3.WebSocket("ws://localhost:40404/eth");
+
+ web3.setProvider(sock);
+ }
+ */
+
+ window.web3 = web3;
+
+})(this);
diff --git a/cmd/mist/assets/ext/eth.js/qt.js b/cmd/mist/assets/ext/eth.js/qt.js
new file mode 100644
index 000000000..644c37737
--- /dev/null
+++ b/cmd/mist/assets/ext/eth.js/qt.js
@@ -0,0 +1,27 @@
+(function() {
+ var QtProvider = function() {
+ this.handlers = [];
+
+ var self = this;
+ navigator.qt.onmessage = function (message) {
+ self.handlers.forEach(function (handler) {
+ handler.call(self, JSON.parse(message.data));
+ });
+ }
+ };
+
+ QtProvider.prototype.send = function(payload) {
+ navigator.qt.postMessage(JSON.stringify(payload));
+ };
+
+ Object.defineProperty(QtProvider.prototype, "onmessage", {
+ set: function(handler) {
+ this.handlers.push(handler);
+ },
+ });
+
+ if(typeof(web3) !== "undefined" && web3.providers !== undefined) {
+ web3.providers.QtProvider = QtProvider;
+ }
+})();
+
diff --git a/cmd/mist/assets/ext/eth.js/websocket.js b/cmd/mist/assets/ext/eth.js/websocket.js
new file mode 100644
index 000000000..732a086f2
--- /dev/null
+++ b/cmd/mist/assets/ext/eth.js/websocket.js
@@ -0,0 +1,51 @@
+(function() {
+ var WebSocketProvider = function(host) {
+ // onmessage handlers
+ this.handlers = [];
+ // queue will be filled with messages if send is invoked before the ws is ready
+ this.queued = [];
+ this.ready = false;
+
+ this.ws = new WebSocket(host);
+
+ var self = this;
+ this.ws.onmessage = function(event) {
+ for(var i = 0; i < self.handlers.length; i++) {
+ self.handlers[i].call(self, JSON.parse(event.data), event)
+ }
+ };
+
+ this.ws.onopen = function() {
+ self.ready = true;
+
+ for(var i = 0; i < self.queued.length; i++) {
+ // Resend
+ self.send(self.queued[i]);
+ }
+ };
+ };
+ WebSocketProvider.prototype.send = function(payload) {
+ if(this.ready) {
+ var data = JSON.stringify(payload);
+
+ this.ws.send(data);
+ } else {
+ this.queued.push(payload);
+ }
+ };
+
+ WebSocketProvider.prototype.onMessage = function(handler) {
+ this.handlers.push(handler);
+ };
+
+ WebSocketProvider.prototype.unload = function() {
+ this.ws.close();
+ };
+ Object.defineProperty(WebSocketProvider.prototype, "onmessage", {
+ set: function(provider) { this.onMessage(provider); }
+ });
+
+ if(typeof(web3) !== "undefined" && web3.providers !== undefined) {
+ web3.providers.WebSocketProvider = WebSocketProvider;
+ }
+})();
diff --git a/mist/assets/ext/ethereum.js b/cmd/mist/assets/ext/ethereum.js
index 697a404a3..aeb79e488 100644
--- a/mist/assets/ext/ethereum.js
+++ b/cmd/mist/assets/ext/ethereum.js
@@ -1,3 +1,20 @@
+// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This 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
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+// MA 02110-1301 USA
+
// Main Ethereum library
window.eth = {
prototype: Object(),
diff --git a/mist/assets/ext/filter.js b/cmd/mist/assets/ext/filter.js
index c23706249..f8529c54b 100644
--- a/mist/assets/ext/filter.js
+++ b/cmd/mist/assets/ext/filter.js
@@ -1,3 +1,20 @@
+// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This 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
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+// MA 02110-1301 USA
+
var ethx = {
prototype: Object,
diff --git a/mist/assets/ext/home.html b/cmd/mist/assets/ext/home.html
index a524e8403..a524e8403 100644
--- a/mist/assets/ext/home.html
+++ b/cmd/mist/assets/ext/home.html
diff --git a/mist/assets/ext/html_messaging.js b/cmd/mist/assets/ext/html_messaging.js
index 91310e998..f58eb7c29 100644
--- a/mist/assets/ext/html_messaging.js
+++ b/cmd/mist/assets/ext/html_messaging.js
@@ -1,3 +1,20 @@
+// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This 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
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+// MA 02110-1301 USA
+
// The magic return variable. The magic return variable will be set during the execution of the QML call.
(function(window) {
var Promise = window.Promise;
diff --git a/cmd/mist/assets/ext/http.js b/cmd/mist/assets/ext/http.js
new file mode 100644
index 000000000..81908266f
--- /dev/null
+++ b/cmd/mist/assets/ext/http.js
@@ -0,0 +1,30 @@
+// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This 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
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+// MA 02110-1301 USA
+
+// this function is included locally, but you can also include separately via a header definition
+function request(url, callback) {
+ var xhr = new XMLHttpRequest();
+ xhr.onreadystatechange = (function(req) {
+ return function() {
+ if(req.readyState === 4) {
+ callback(req);
+ }
+ }
+ })(xhr);
+ xhr.open('GET', url, true);
+ xhr.send('');
+}
diff --git a/mist/assets/ext/q.js b/cmd/mist/assets/ext/q.js
index 23c4245ee..23c4245ee 100644
--- a/mist/assets/ext/q.js
+++ b/cmd/mist/assets/ext/q.js
diff --git a/cmd/mist/assets/ext/qml_messaging.js b/cmd/mist/assets/ext/qml_messaging.js
new file mode 100644
index 000000000..031c5efd1
--- /dev/null
+++ b/cmd/mist/assets/ext/qml_messaging.js
@@ -0,0 +1,30 @@
+// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This 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
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+// MA 02110-1301 USA
+
+function HandleMessage(data) {
+ var message;
+ try { message = JSON.parse(data) } catch(e) {};
+
+ if(message) {
+ switch(message.type) {
+ case "coinbase":
+ return eth.coinBase();
+ case "block":
+ return eth.blockByNumber(0);
+ }
+ }
+}
diff --git a/cmd/mist/assets/ext/qt_messaging_adapter.js b/cmd/mist/assets/ext/qt_messaging_adapter.js
new file mode 100644
index 000000000..04f8e034a
--- /dev/null
+++ b/cmd/mist/assets/ext/qt_messaging_adapter.js
@@ -0,0 +1,38 @@
+// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This 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
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+// MA 02110-1301 USA
+
+window._messagingAdapter = function(data) {
+ navigator.qt.postMessage(data);
+};
+
+navigator.qt.onmessage = function(ev) {
+ var data = JSON.parse(ev.data)
+
+ if(data._event !== undefined) {
+ eth.trigger(data._event, data.data);
+ } else {
+ if(data._seed) {
+ var cb = eth._callbacks[data._seed];
+ if(cb) {
+ cb.call(this, data.data)
+
+ // Remove the "trigger" callback
+ delete eth._callbacks[ev._seed];
+ }
+ }
+ }
+}
diff --git a/cmd/mist/assets/ext/setup.js b/cmd/mist/assets/ext/setup.js
new file mode 100644
index 000000000..8317937b3
--- /dev/null
+++ b/cmd/mist/assets/ext/setup.js
@@ -0,0 +1,8 @@
+(function() {
+ if (typeof(Promise) === "undefined")
+ window.Promise = Q.Promise;
+
+ var eth = web3.eth;
+
+ web3.setProvider(new web3.providers.QtProvider());
+})()
diff --git a/mist/assets/ext/string.js b/cmd/mist/assets/ext/string.js
index 2473b5c36..e8dbd14d4 100644
--- a/mist/assets/ext/string.js
+++ b/cmd/mist/assets/ext/string.js
@@ -1,3 +1,20 @@
+// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This 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
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+// MA 02110-1301 USA
+
String.prototype.pad = function(l, r) {
if (r === undefined) {
r = l
diff --git a/mist/assets/ext/test.html b/cmd/mist/assets/ext/test.html
index 4bac7d36f..4bac7d36f 100644
--- a/mist/assets/ext/test.html
+++ b/cmd/mist/assets/ext/test.html
diff --git a/mist/assets/facet.png b/cmd/mist/assets/facet.png
index 49a266e96..49a266e96 100644
--- a/mist/assets/facet.png
+++ b/cmd/mist/assets/facet.png
Binary files differ
diff --git a/mist/assets/heart.png b/cmd/mist/assets/heart.png
index 3c874ab7f..3c874ab7f 100644
--- a/mist/assets/heart.png
+++ b/cmd/mist/assets/heart.png
Binary files differ
diff --git a/mist/assets/icecream.png b/cmd/mist/assets/icecream.png
index 2438ca845..2438ca845 100644
--- a/mist/assets/icecream.png
+++ b/cmd/mist/assets/icecream.png
Binary files differ
diff --git a/cmd/mist/assets/miner.png b/cmd/mist/assets/miner.png
new file mode 100644
index 000000000..58e3f4dfe
--- /dev/null
+++ b/cmd/mist/assets/miner.png
Binary files differ
diff --git a/mist/assets/muted/codemirror.css b/cmd/mist/assets/muted/codemirror.css
index 098a317a2..098a317a2 100644
--- a/mist/assets/muted/codemirror.css
+++ b/cmd/mist/assets/muted/codemirror.css
diff --git a/mist/assets/muted/debugger.html b/cmd/mist/assets/muted/debugger.html
index b7552f030..b7552f030 100644
--- a/mist/assets/muted/debugger.html
+++ b/cmd/mist/assets/muted/debugger.html
diff --git a/mist/assets/muted/eclipse.css b/cmd/mist/assets/muted/eclipse.css
index 317218e3d..317218e3d 100644
--- a/mist/assets/muted/eclipse.css
+++ b/cmd/mist/assets/muted/eclipse.css
diff --git a/mist/assets/muted/index.html b/cmd/mist/assets/muted/index.html
index 14949b5ac..14949b5ac 100644
--- a/mist/assets/muted/index.html
+++ b/cmd/mist/assets/muted/index.html
diff --git a/mist/assets/muted/lib/codemirror.js b/cmd/mist/assets/muted/lib/codemirror.js
index 0ab217711..0ab217711 100644
--- a/mist/assets/muted/lib/codemirror.js
+++ b/cmd/mist/assets/muted/lib/codemirror.js
diff --git a/mist/assets/muted/lib/go.js b/cmd/mist/assets/muted/lib/go.js
index 9f1c1c4ab..9f1c1c4ab 100644
--- a/mist/assets/muted/lib/go.js
+++ b/cmd/mist/assets/muted/lib/go.js
diff --git a/mist/assets/muted/lib/matchbrackets.js b/cmd/mist/assets/muted/lib/matchbrackets.js
index dcdde81df..dcdde81df 100644
--- a/mist/assets/muted/lib/matchbrackets.js
+++ b/cmd/mist/assets/muted/lib/matchbrackets.js
diff --git a/mist/assets/muted/muted.js b/cmd/mist/assets/muted/muted.js
index 72e858d7a..467411577 100644
--- a/mist/assets/muted/muted.js
+++ b/cmd/mist/assets/muted/muted.js
@@ -1,3 +1,20 @@
+// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This 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
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+// MA 02110-1301 USA
+
// Helper function for generating pseudo callbacks and sending data to the QML part of the application
function postData(data, cb) {
data._seed = Math.floor(Math.random() * 1000000)
diff --git a/mist/assets/net.png b/cmd/mist/assets/net.png
index 65a20ea00..65a20ea00 100644
--- a/mist/assets/net.png
+++ b/cmd/mist/assets/net.png
Binary files differ
diff --git a/mist/assets/network.png b/cmd/mist/assets/network.png
index 0a9ffe2ec..0a9ffe2ec 100644
--- a/mist/assets/network.png
+++ b/cmd/mist/assets/network.png
Binary files differ
diff --git a/mist/assets/new.png b/cmd/mist/assets/new.png
index e80096748..e80096748 100644
--- a/mist/assets/new.png
+++ b/cmd/mist/assets/new.png
Binary files differ
diff --git a/mist/assets/pick.png b/cmd/mist/assets/pick.png
index 2f5a261c2..2f5a261c2 100644
--- a/mist/assets/pick.png
+++ b/cmd/mist/assets/pick.png
Binary files differ
diff --git a/mist/assets/qml/QmlApp.qml b/cmd/mist/assets/qml/QmlApp.qml
index f5c503f4c..f5c503f4c 100644
--- a/mist/assets/qml/QmlApp.qml
+++ b/cmd/mist/assets/qml/QmlApp.qml
diff --git a/mist/assets/qml/first_run.qml b/cmd/mist/assets/qml/first_run.qml
index 0b1dac4c6..0b1dac4c6 100644
--- a/mist/assets/qml/first_run.qml
+++ b/cmd/mist/assets/qml/first_run.qml
diff --git a/mist/assets/qml/main.qml b/cmd/mist/assets/qml/main.qml
index 3d9204ce8..a08a8b4ef 100644
--- a/mist/assets/qml/main.qml
+++ b/cmd/mist/assets/qml/main.qml
@@ -12,7 +12,6 @@ import "../ext/http.js" as Http
ApplicationWindow {
id: root
- property alias miningButtonText: miningButton.text
property var ethx : Eth.ethx
property var browser
@@ -48,12 +47,12 @@ ApplicationWindow {
var wallet = addPlugin("./views/wallet.qml", {noAdd: true, close: false, section: "ethereum", active: true});
var browser = addPlugin("./webapp.qml", {noAdd: true, close: false, section: "ethereum", active: true});
root.browser = browser;
+ addPlugin("./views/miner.qml", {noAdd: true, close: false, section: "ethereum", active: true});
addPlugin("./views/transaction.qml", {noAdd: true, close: false, section: "legacy"});
addPlugin("./views/chain.qml", {noAdd: true, close: false, section: "legacy"});
- addPlugin("./views/info.qml", {noAdd: true, close: false, section: "legacy"});
addPlugin("./views/pending_tx.qml", {noAdd: true, close: false, section: "legacy"});
- addPlugin("./views/javascript.qml", {noAdd: true, close: false, section: "legacy"});
+ addPlugin("./views/info.qml", {noAdd: true, close: false, section: "legacy"});
addPlugin("./views/jeffcoin/jeffcoin.qml", {noAdd: true, close: false, section: "apps"})
@@ -253,29 +252,18 @@ ApplicationWindow {
}
statusBar: StatusBar {
- height: 32
+ //height: 32
id: statusBar
- RowLayout {
- Button {
- id: miningButton
- text: "Start Mining"
- onClicked: {
- gui.toggleMining()
- }
- }
-
- RowLayout {
- Label {
- id: walletValueLabel
+ Label {
+ //y: 6
+ id: walletValueLabel
- font.pixelSize: 10
- styleColor: "#797979"
- }
- }
+ font.pixelSize: 10
+ styleColor: "#797979"
}
Label {
- y: 6
+ //y: 6
objectName: "miningLabel"
visible: true
font.pixelSize: 10
@@ -284,7 +272,7 @@ ApplicationWindow {
}
Label {
- y: 6
+ //y: 6
id: lastBlockLabel
objectName: "lastBlockLabel"
visible: true
@@ -298,14 +286,14 @@ ApplicationWindow {
id: downloadIndicator
value: 0
objectName: "downloadIndicator"
- y: 3
+ y: -4
x: statusBar.width / 2 - this.width / 2
width: 160
}
Label {
objectName: "downloadLabel"
- y: 7
+ //y: 7
anchors.left: downloadIndicator.right
anchors.leftMargin: 5
font.pixelSize: 10
@@ -315,7 +303,7 @@ ApplicationWindow {
RowLayout {
id: peerGroup
- y: 7
+ //y: 7
anchors.right: parent.right
MouseArea {
onDoubleClicked: peerWindow.visible = true
@@ -324,14 +312,9 @@ ApplicationWindow {
Label {
id: peerLabel
- font.pixelSize: 8
+ font.pixelSize: 10
text: "0 / 0"
}
- Image {
- id: peerImage
- width: 10; height: 10
- source: "../network.png"
- }
}
}
@@ -363,12 +346,7 @@ ApplicationWindow {
view.visible = false
view.anchors.fill = mainView
- if( !view.hasOwnProperty("iconSource") ) {
- console.log("Could not load plugin. Property 'iconSourc' not found on view.");
- return;
- }
-
- var menuItem = menu.createMenuItem(view.iconSource, view, options);
+ var menuItem = menu.createMenuItem(view, options);
if( view.hasOwnProperty("menuItem") ) {
view.menuItem = menuItem;
}
@@ -525,7 +503,7 @@ ApplicationWindow {
}
}
- function createMenuItem(icon, view, options) {
+ function createMenuItem(view, options) {
if(options === undefined) {
options = {};
}
@@ -547,7 +525,10 @@ ApplicationWindow {
comp.view = view
comp.title = view.title
- comp.icon = view.iconSource
+
+ if(view.hasOwnProperty("iconSource")) {
+ comp.icon = view.iconSource;
+ }
comp.closable = options.close;
return comp
@@ -805,8 +786,8 @@ ApplicationWindow {
title: "About"
minimumWidth: 350
maximumWidth: 350
- maximumHeight: 200
- minimumHeight: 200
+ maximumHeight: 280
+ minimumHeight: 280
Image {
id: aboutIcon
@@ -816,7 +797,7 @@ ApplicationWindow {
smooth: true
source: "../facet.png"
x: 10
- y: 10
+ y: 30
}
Text {
@@ -825,7 +806,7 @@ ApplicationWindow {
anchors.top: parent.top
anchors.topMargin: 30
font.pointSize: 12
- text: "<h2>Mist (0.6.5)</h2><h4>Amalthea</h4><br><h3>Development</h3>Jeffrey Wilcke<br>Viktor Trón<br><h3>Building</h3>Maran Hidskes"
+ text: "<h2>Mist (0.7.10)</h2><br><h3>Development</h3>Jeffrey Wilcke<br>Viktor Trón<br>Felix Lange<br>Taylor Gerring<br>Daniel Nagy<br><h3>UX</h3>Alex van de Sande<br>"
}
}
@@ -889,7 +870,7 @@ ApplicationWindow {
pastPeers.append({text: ips.get(i)})
}
- pastPeers.insert(0, {text: "poc-6.ethdev.com:30303"})
+ pastPeers.insert(0, {text: "poc-7.ethdev.com:30303"})
}
}
diff --git a/mist/assets/qml/muted.qml b/cmd/mist/assets/qml/muted.qml
index fac8267c4..fac8267c4 100644
--- a/mist/assets/qml/muted.qml
+++ b/cmd/mist/assets/qml/muted.qml
diff --git a/mist/assets/qml/test_app.qml b/cmd/mist/assets/qml/test_app.qml
index c69587839..c69587839 100644
--- a/mist/assets/qml/test_app.qml
+++ b/cmd/mist/assets/qml/test_app.qml
diff --git a/mist/assets/qml/transactions.qml b/cmd/mist/assets/qml/transactions.qml
index e9a035a85..e9a035a85 100644
--- a/mist/assets/qml/transactions.qml
+++ b/cmd/mist/assets/qml/transactions.qml
diff --git a/mist/assets/qml/views/chain.qml b/cmd/mist/assets/qml/views/chain.qml
index 130ff8bb9..6baf757a5 100644
--- a/mist/assets/qml/views/chain.qml
+++ b/cmd/mist/assets/qml/views/chain.qml
@@ -8,8 +8,7 @@ import Ethereum 1.0
Rectangle {
id: root
- property var title: "Network"
- property var iconSource: "../net.png"
+ property var title: "Block Chain"
property var menuItem
objectName: "chainView"
@@ -64,12 +63,12 @@ Rectangle {
Menu {
id: contextMenu
- property var row;
+ property var row
MenuItem {
text: "Details"
onTriggered: {
popup.visible = true
- popup.setDetails(blockModel.get(this.row))
+ popup.setDetails(blockModel.get(contextMenu.row))
}
}
@@ -78,7 +77,7 @@ Rectangle {
MenuItem {
text: "Copy"
onTriggered: {
- copyToClipboard(blockModel.get(this.row).hash)
+ copyToClipboard(blockModel.get(contextMenu.row).hash)
}
}
@@ -86,7 +85,7 @@ Rectangle {
text: "Dump State"
onTriggered: {
generalFileDialog.show(false, function(path) {
- var hash = blockModel.get(this.row).hash;
+ var hash = blockModel.get(contextMenu.row).hash;
gui.dumpState(hash, path);
});
@@ -102,22 +101,18 @@ Rectangle {
initial = false
}
- /*
- var txs = JSON.parse(block.transactions);
- if(txs != null){
- amount = txs.length
- }
- */
- var txs = block.transactions;
var amount = block.transactions.length;
+ var txs = [];
+ for(var i = 0; i < block.transactions.length; i++) {
+ var tx = JSON.parse(block.transactions.getAsJson(i));
+ txs.push(tx);
+ }
if(initial){
- blockModel.append({size: block.size, number: block.number, name: block.name, gasLimit: block.gasLimit, gasUsed: block.gasUsed, coinbase: block.coinbase, hash: block.hash, txs: txs, txAmount: amount, time: block.time, prettyTime: convertToPretty(block.time)})
+ blockModel.append({raw: block.raw, bloom: block.bloom, size: block.size, number: block.number, name: block.name, gasLimit: block.gasLimit, gasUsed: block.gasUsed, coinbase: block.coinbase, hash: block.hash, txs: txs, txAmount: amount, time: block.time, prettyTime: convertToPretty(block.time)})
} else {
- blockModel.insert(0, {size: block.size, number: block.number, name: block.name, gasLimit: block.gasLimit, gasUsed: block.gasUsed, coinbase: block.coinbase, hash: block.hash, txs: txs, txAmount: amount, time: block.time, prettyTime: convertToPretty(block.time)})
+ blockModel.insert(0, {bloom: block.bloom, size: block.size, number: block.number, name: block.name, gasLimit: block.gasLimit, gasUsed: block.gasUsed, coinbase: block.coinbase, hash: block.hash, txs: txs, txAmount: amount, time: block.time, prettyTime: convertToPretty(block.time)})
}
-
- //root.secondary.text = "#" + block.number;
}
Window {
@@ -141,6 +136,7 @@ Rectangle {
Text { text: '<h3>Block details</h3>'; color: "#F2F2F2"}
Text { text: '<b>Block number:</b> ' + number + " (Size: " + size + ")"; color: "#F2F2F2"}
Text { text: '<b>Hash:</b> ' + hash; color: "#F2F2F2"}
+ Text { text: '<b>Bloom:</b> ' + bloom; color: "#F2F2F2"}
Text { text: '<b>Coinbase:</b> &lt;' + name + '&gt; ' + coinbase; color: "#F2F2F2"}
Text { text: '<b>Block found at:</b> ' + prettyTime; color: "#F2F2F2"}
Text { text: '<b>Gas used:</b> ' + gasUsed + " / " + gasLimit; color: "#F2F2F2"}
@@ -215,7 +211,7 @@ Rectangle {
anchors.topMargin: 10
text: "Debug contract"
onClicked: {
- if(tx.createsContract){
+ if(tx && tx.createsContract){
eth.startDbWithCode(tx.rawData)
}else {
eth.startDbWithContractAndData(tx.address, tx.rawData)
@@ -227,11 +223,17 @@ Rectangle {
text: "Contract"
anchors.top: contractLabel.bottom
anchors.left: parent.left
- anchors.bottom: popup.bottom
+ anchors.right: parent.right
wrapMode: Text.Wrap
- width: parent.width - 30
height: 80
- anchors.leftMargin: 10
+ }
+ TextArea {
+ id: dumpData
+ anchors.top: contractData.bottom
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.bottom: parent.bottom
+ height: 300
}
}
property var transactionModel: ListModel {
@@ -240,19 +242,20 @@ Rectangle {
property var singleBlock: ListModel {
id: singleBlock
}
- function setDetails(block){
- singleBlock.set(0,block)
+ function setDetails(bl){
+ singleBlock.set(0, bl)
popup.height = 300
transactionModel.clear()
- if(block.txs !== undefined){
- for(var i = 0; i < block.txs.length; i++) {
- transactionModel.insert(0, block.txs.get(i))
+ if(bl.txs !== undefined){
+ for(var i = 0; i < bl.txs.count; i++) {
+ transactionModel.insert(0, bl.txs.get(i))
}
- if(block.txs.length > 0 && block.txs.get(0).data){
- popup.showContractData(block.txs.get(0))
+ if(bl.txs.count > 0 && bl.txs.get(0).data){
+ popup.showContractData(bl.txs.get(0))
}
}
txView.forceActiveFocus()
+ dumpData.text = bl.raw;
}
}
}
diff --git a/mist/assets/qml/views/history.qml b/cmd/mist/assets/qml/views/history.qml
index 9eee883e3..c72f8f3ae 100644
--- a/mist/assets/qml/views/history.qml
+++ b/cmd/mist/assets/qml/views/history.qml
@@ -7,7 +7,6 @@ import QtQuick.Controls.Styles 1.1
import Ethereum 1.0
Rectangle {
- property var iconSource: "../tx.png"
property var title: "Transactions"
property var menuItem
diff --git a/mist/assets/qml/views/info.qml b/cmd/mist/assets/qml/views/info.qml
index 158e2c960..3ff551b05 100644
--- a/mist/assets/qml/views/info.qml
+++ b/cmd/mist/assets/qml/views/info.qml
@@ -7,8 +7,7 @@ import QtQuick.Controls.Styles 1.1
import Ethereum 1.0
Rectangle {
- property var title: "Information"
- property var iconSource: "../heart.png"
+ property var title: "Debug Info"
property var menuItem
objectName: "infoView"
diff --git a/mist/assets/qml/views/jeffcoin/jeff.png b/cmd/mist/assets/qml/views/jeffcoin/jeff.png
index 2b9c6651a..2b9c6651a 100644
--- a/mist/assets/qml/views/jeffcoin/jeff.png
+++ b/cmd/mist/assets/qml/views/jeffcoin/jeff.png
Binary files differ
diff --git a/mist/assets/qml/views/jeffcoin/jeffcoin.qml b/cmd/mist/assets/qml/views/jeffcoin/jeffcoin.qml
index 23502d334..23502d334 100644
--- a/mist/assets/qml/views/jeffcoin/jeffcoin.qml
+++ b/cmd/mist/assets/qml/views/jeffcoin/jeffcoin.qml
diff --git a/cmd/mist/assets/qml/views/miner.qml b/cmd/mist/assets/qml/views/miner.qml
new file mode 100644
index 000000000..e0182649f
--- /dev/null
+++ b/cmd/mist/assets/qml/views/miner.qml
@@ -0,0 +1,254 @@
+import QtQuick 2.0
+import QtQuick.Controls 1.0;
+import QtQuick.Layouts 1.0;
+import QtQuick.Dialogs 1.0;
+import QtQuick.Window 2.1;
+import QtQuick.Controls.Styles 1.1
+import Ethereum 1.0
+
+Rectangle {
+ id: root
+ property var title: "Miner"
+ property var iconSource: "../miner.png"
+ property var menuItem
+
+ color: "#00000000"
+
+ ColumnLayout {
+ spacing: 10
+ anchors.fill: parent
+
+ Rectangle {
+ id: mainPane
+ color: "#00000000"
+ anchors {
+ top: parent.top
+ bottom: localTxPane.top
+ left: parent.left
+ right: parent.right
+ }
+
+ Rectangle {
+ id: menu
+ height: 25
+ anchors {
+ left: parent.left
+ }
+
+ RowLayout {
+ id: tools
+ anchors {
+ left: parent.left
+ right: parent.right
+ }
+
+ Button {
+ text: "Start"
+ onClicked: {
+ eth.setGasPrice(minGasPrice.text || "10000000000000");
+ if (eth.toggleMining()) {
+ this.text = "Stop";
+ } else {
+ this.text = "Start";
+ }
+ }
+ }
+
+ Rectangle {
+ anchors.top: parent.top
+ anchors.topMargin: 2
+ width: 200
+ TextField {
+ id: minGasPrice
+ placeholderText: "Min Gas: 10000000000000"
+ width: 200
+ validator: RegExpValidator { regExp: /\d*/ }
+ }
+ }
+ }
+ }
+
+ Column {
+ anchors {
+ left: parent.left
+ right: parent.right
+ top: menu.bottom
+ topMargin: 5
+ }
+
+ Text {
+ text: "<b>Merged mining options</b>"
+ }
+
+ TableView {
+ id: mergedMiningTable
+ height: 300
+ anchors {
+ left: parent.left
+ right: parent.right
+ }
+ Component {
+ id: checkBoxDelegate
+
+ Item {
+ id: test
+ CheckBox {
+ anchors.fill: parent
+ checked: styleData.value
+
+ onClicked: {
+ var model = mergedMiningModel.get(styleData.row)
+
+ if (this.checked) {
+ model.id = txModel.createLocalTx(model.address, "0", "5000", "0", "")
+ } else {
+ txModel.removeWithId(model.id);
+ model.id = 0;
+ }
+ }
+ }
+ }
+ }
+ TableViewColumn{ role: "checked" ; title: "" ; width: 40 ; delegate: checkBoxDelegate }
+ TableViewColumn{ role: "name" ; title: "Name" ; width: 480 }
+ model: ListModel {
+ objectName: "mergedMiningModel"
+ id: mergedMiningModel
+ function addMergedMiningOption(model) {
+ this.append(model);
+ }
+ }
+ Component.onCompleted: {
+ /*
+ // XXX Temp. replace with above eventually
+ var tmpItems = ["JEVCoin", "Some coin", "Other coin", "Etc coin"];
+ var address = "e6716f9544a56c530d868e4bfbacb172315bdead";
+ for (var i = 0; i < tmpItems.length; i++) {
+ mergedMiningModel.append({checked: false, name: tmpItems[i], address: address, id: 0, itemId: i});
+ }
+ */
+ }
+ }
+ }
+ }
+
+ Rectangle {
+ id: localTxPane
+ color: "#ececec"
+ border.color: "#cccccc"
+ border.width: 1
+ anchors {
+ left: parent.left
+ right: parent.right
+ bottom: parent.bottom
+ }
+ height: 300
+
+ ColumnLayout {
+ spacing: 10
+ anchors.fill: parent
+ RowLayout {
+ id: newLocalTx
+ anchors {
+ left: parent.left
+ leftMargin: 5
+ top: parent.top
+ topMargin: 5
+ bottomMargin: 5
+ }
+
+ Text {
+ text: "Local tx"
+ }
+
+ Rectangle {
+ width: 250
+ color: "#00000000"
+ anchors.top: parent.top
+ anchors.topMargin: 2
+
+ TextField {
+ id: to
+ placeholderText: "To"
+ width: 250
+ validator: RegExpValidator { regExp: /[abcdefABCDEF1234567890]*/ }
+ }
+ }
+ TextField {
+ property var defaultGas: "5000"
+ id: gas
+ placeholderText: "Gas"
+ text: defaultGas
+ validator: RegExpValidator { regExp: /\d*/ }
+ }
+ TextField {
+ id: gasPrice
+ placeholderText: "Price"
+ validator: RegExpValidator { regExp: /\d*/ }
+ }
+ TextField {
+ id: value
+ placeholderText: "Amount"
+ text: "0"
+ validator: RegExpValidator { regExp: /\d*/ }
+ }
+ TextField {
+ id: data
+ placeholderText: "Data"
+ validator: RegExpValidator { regExp: /[abcdefABCDEF1234567890]*/ }
+ }
+ Button {
+ text: "Create"
+ onClicked: {
+ if (to.text.length == 40 && gasPrice.text.length != 0 && value.text.length != 0 && gas.text.length != 0) {
+ txModel.createLocalTx(to.text, gasPrice.text, gas.text, value.text, data.text);
+
+ to.text = ""; gasPrice.text = "";
+ gas.text = gas.defaultGas;
+ value.text = "0"
+ }
+ }
+ }
+ }
+
+ TableView {
+ id: txTableView
+ anchors {
+ top: newLocalTx.bottom
+ topMargin: 5
+ left: parent.left
+ right: parent.right
+ bottom: parent.bottom
+ }
+ TableViewColumn{ role: "to" ; title: "To" ; width: 480 }
+ TableViewColumn{ role: "gas" ; title: "Gas" ; width: 100 }
+ TableViewColumn{ role: "gasPrice" ; title: "Gas Price" ; width: 100 }
+ TableViewColumn{ role: "value" ; title: "Amount" ; width: 100 }
+ TableViewColumn{ role: "data" ; title: "Data" ; width: 100 }
+
+ model: ListModel {
+ id: txModel
+ Component.onCompleted: {
+ }
+ function removeWithId(id) {
+ for (var i = 0; i < this.count; i++) {
+ if (txModel.get(i).id == id) {
+ this.remove(i);
+ eth.removeLocalTransaction(id)
+ break;
+ }
+ }
+ }
+
+ function createLocalTx(to, gasPrice, gas, value, data) {
+ var id = eth.addLocalTransaction(to, data, gas, gasPrice, value)
+ txModel.insert(0, {to: to, gas: gas, gasPrice: gasPrice, value: value, data: data, id: id});
+
+ return id
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/mist/assets/qml/views/pending_tx.qml b/cmd/mist/assets/qml/views/pending_tx.qml
index abfa25790..4442a69db 100644
--- a/mist/assets/qml/views/pending_tx.qml
+++ b/cmd/mist/assets/qml/views/pending_tx.qml
@@ -8,7 +8,6 @@ import Ethereum 1.0
Rectangle {
property var title: "Pending Transactions"
- property var iconSource: "../tx.png"
property var menuItem
objectName: "pendingTxView"
diff --git a/mist/assets/qml/views/transaction.qml b/cmd/mist/assets/qml/views/transaction.qml
index 7d689733f..62c762956 100644
--- a/mist/assets/qml/views/transaction.qml
+++ b/cmd/mist/assets/qml/views/transaction.qml
@@ -7,8 +7,7 @@ import QtQuick.Controls.Styles 1.1
import Ethereum 1.0
Rectangle {
- property var iconSource: "../new.png"
- property var title: "New transaction"
+ property var title: "New Transaction"
property var menuItem
objectName: "newTxView"
@@ -115,7 +114,7 @@ Rectangle {
width: 50
validator: RegExpValidator { regExp: /\d*/ }
placeholderText: "Gas"
- text: "500"
+ text: "5000"
}
Label {
id: atLabel
diff --git a/mist/assets/qml/views/wallet.qml b/cmd/mist/assets/qml/views/wallet.qml
index a57e7869a..9727ef35c 100644
--- a/mist/assets/qml/views/wallet.qml
+++ b/cmd/mist/assets/qml/views/wallet.qml
@@ -16,7 +16,13 @@ Rectangle {
anchors.fill: parent
function onReady() {
- menuItem.secondaryTitle = eth.numberToHuman(eth.balanceAt(eth.key().address))
+ setBalance()
+ }
+
+ function setBalance() {
+ balance.text = "<b>Balance</b>: " + eth.numberToHuman(eth.balanceAt(eth.key().address))
+ if(menuItem)
+ menuItem.secondaryTitle = eth.numberToHuman(eth.balanceAt(eth.key().address))
}
ListModel {
@@ -39,7 +45,6 @@ Rectangle {
Text {
id: balance
- text: "<b>Balance</b>: " + eth.numberToHuman(eth.balanceAt(eth.key().address))
font.pixelSize: 24
anchors {
horizontalCenter: parent.horizontalCenter
@@ -126,7 +131,6 @@ Rectangle {
var value = txValue.text + denomModel.get(valueDenom.currentIndex).zeros;
var gasPrice = "10000000000000"
var res = eth.transact({from: eth.key().privateKey, to: txTo.text, value: value, gas: "500", gasPrice: gasPrice})
- console.log(res)
}
}
}
@@ -144,24 +148,35 @@ Rectangle {
id: txTableView
anchors.fill : parent
TableViewColumn{ role: "num" ; title: "#" ; width: 30 }
- TableViewColumn{ role: "from" ; title: "From" ; width: 280 }
- TableViewColumn{ role: "to" ; title: "To" ; width: 280 }
+ TableViewColumn{ role: "from" ; title: "From" ; width: 340 }
+ TableViewColumn{ role: "to" ; title: "To" ; width: 340 }
TableViewColumn{ role: "value" ; title: "Amount" ; width: 100 }
model: ListModel {
id: txModel
Component.onCompleted: {
- var filter = ethx.watch({latest: -1, from: eth.key().address});
- filter.changed(addTxs)
-
- addTxs(filter.messages())
+ var me = eth.key().address;
+ var filterTo = ethx.watch({latest: -1, to: me});
+ var filterFrom = ethx.watch({latest: -1, from: me});
+ filterTo.changed(addTxs)
+ filterFrom.changed(addTxs)
+
+ addTxs(filterTo.messages())
+ addTxs(filterFrom.messages())
}
function addTxs(messages) {
+ setBalance()
+
for(var i = 0; i < messages.length; i++) {
var message = messages.get(i);
var to = eth.lookupName(message.to);
- var from = eth.lookupName(message.from);
+ var from;
+ if(message.from.length == 0) {
+ from = "- MINED -";
+ } else {
+ from = eth.lookupName(message.from);
+ }
txModel.insert(0, {num: txModel.count, from: from, to: to, value: eth.numberToHuman(message.value)})
}
}
diff --git a/cmd/mist/assets/qml/webapp.qml b/cmd/mist/assets/qml/webapp.qml
new file mode 100644
index 000000000..bd7399dc9
--- /dev/null
+++ b/cmd/mist/assets/qml/webapp.qml
@@ -0,0 +1,413 @@
+import QtQuick 2.0
+import QtWebKit 3.0
+import QtWebKit.experimental 1.0
+import QtQuick.Controls 1.0;
+import QtQuick.Controls.Styles 1.0
+import QtQuick.Layouts 1.0;
+import QtQuick.Window 2.1;
+import Ethereum 1.0
+
+Rectangle {
+ id: window
+ property var title: "Browser"
+ property var iconSource: "../browser.png"
+ property var menuItem
+
+ property alias url: webview.url
+ property alias webView: webview
+
+ property var cleanPath: false
+ property var open: function(url) {
+ if(!window.cleanPath) {
+ var uri = url;
+ if(!/.*\:\/\/.*/.test(uri)) {
+ uri = "http://" + uri;
+ }
+
+ var reg = /(^https?\:\/\/(?:www\.)?)([a-zA-Z0-9_\-]*\.eth)(.*)/
+
+ if(reg.test(uri)) {
+ uri.replace(reg, function(match, pre, domain, path) {
+ uri = pre;
+
+ var lookup = eth.lookupDomain(domain.substring(0, domain.length - 4));
+ var ip = [];
+ for(var i = 0, l = lookup.length; i < l; i++) {
+ ip.push(lookup.charCodeAt(i))
+ }
+
+ if(ip.length != 0) {
+ uri += lookup;
+ } else {
+ uri += domain;
+ }
+
+ uri += path;
+ });
+ }
+
+ window.cleanPath = true;
+
+ webview.url = uri;
+
+ //uriNav.text = uri.text.replace(/(^https?\:\/\/(?:www\.)?)([a-zA-Z0-9_\-]*\.\w{2,3})(.*)/, "$1$2<span style='color:#CCC'>$3</span>");
+ uriNav.text = uri;
+ } else {
+ // Prevent inf loop.
+ window.cleanPath = false;
+ }
+ }
+
+ Component.onCompleted: {
+ webview.url = "http://etherian.io"
+ }
+
+ signal messages(var messages, int id);
+ onMessages: {
+ // Bit of a cheat to get proper JSON
+ var m = JSON.parse(JSON.parse(JSON.stringify(messages)))
+ webview.postEvent("messages", [m, id]);
+ }
+
+ Item {
+ objectName: "root"
+ id: root
+ anchors.fill: parent
+ state: "inspectorShown"
+
+ RowLayout {
+ id: navBar
+ height: 40
+ anchors {
+ left: parent.left
+ right: parent.right
+ leftMargin: 7
+ }
+
+ Button {
+ id: back
+ onClicked: {
+ webview.goBack()
+ }
+ style: ButtonStyle {
+ background: Image {
+ source: "../back.png"
+ width: 30
+ height: 30
+ }
+ }
+ }
+
+ TextField {
+ anchors {
+ left: back.right
+ right: toggleInspector.left
+ leftMargin: 5
+ rightMargin: 5
+ }
+ text: "http://etherian.io"
+ id: uriNav
+ y: parent.height / 2 - this.height / 2
+
+ Keys.onReturnPressed: {
+ webview.url = this.text;
+ }
+ }
+
+ Button {
+ id: toggleInspector
+ anchors {
+ right: parent.right
+ }
+ iconSource: "../bug.png"
+ onClicked: {
+ if(inspector.visible == true){
+ inspector.visible = false
+ }else{
+ inspector.visible = true
+ inspector.url = webview.experimental.remoteInspectorUrl
+ }
+ }
+ }
+ }
+
+
+ WebView {
+ objectName: "webView"
+ id: webview
+ anchors {
+ left: parent.left
+ right: parent.right
+ bottom: parent.bottom
+ top: navBar.bottom
+ }
+
+ //property var cleanPath: false
+ onNavigationRequested: {
+ window.open(request.url.toString());
+ }
+
+ function sendMessage(data) {
+ webview.experimental.postMessage(JSON.stringify(data))
+ }
+
+
+ experimental.preferences.javascriptEnabled: true
+ experimental.preferences.navigatorQtObjectEnabled: true
+ experimental.preferences.developerExtrasEnabled: true
+ //experimental.userScripts: ["../ext/qt_messaging_adapter.js", "../ext/q.js", "../ext/big.js", "../ext/string.js", "../ext/html_messaging.js"]
+ experimental.userScripts: ["../ext/q.js", "../ext/eth.js/main.js", "../ext/eth.js/qt.js", "../ext/setup.js"]
+ experimental.onMessageReceived: {
+ console.log("[onMessageReceived]: ", message.data)
+ // TODO move to messaging.js
+ var data = JSON.parse(message.data)
+
+ try {
+ switch(data.call) {
+ case "compile":
+ postData(data._id, eth.compile(data.args[0]))
+ break
+
+ case "coinbase":
+ postData(data._id, eth.coinBase())
+
+ case "account":
+ postData(data._id, eth.key().address);
+
+ case "isListening":
+ postData(data._id, eth.isListening())
+
+ break
+
+ case "isMining":
+ postData(data._id, eth.isMining())
+
+ break
+
+ case "peerCount":
+ postData(data._id, eth.peerCount())
+
+ break
+
+ case "countAt":
+ require(1)
+ postData(data._id, eth.txCountAt(data.args[0]))
+
+ break
+
+ case "codeAt":
+ require(1)
+ var code = eth.codeAt(data.args[0])
+ postData(data._id, code);
+
+ break
+
+ case "blockByNumber":
+ require(1)
+ var block = eth.blockByNumber(data.args[0])
+ postData(data._id, block)
+ break
+
+ case "blockByHash":
+ require(1)
+ var block = eth.blockByHash(data.args[0])
+ postData(data._id, block)
+ break
+
+ require(2)
+ var block = eth.blockByHash(data.args[0])
+ postData(data._id, block.transactions[data.args[1]])
+ break
+
+ case "transactionByHash":
+ case "transactionByNumber":
+ require(2)
+
+ var block;
+ if (data.call === "transactionByHash")
+ block = eth.blockByHash(data.args[0])
+ else
+ block = eth.blockByNumber(data.args[0])
+
+ var tx = block.transactions.get(data.args[1])
+
+ postData(data._id, tx)
+ break
+
+ case "uncleByHash":
+ case "uncleByNumber":
+ require(2)
+
+ var block;
+ if (data.call === "uncleByHash")
+ block = eth.blockByHash(data.args[0])
+ else
+ block = eth.blockByNumber(data.args[0])
+
+ var uncle = block.uncles.get(data.args[1])
+
+ postData(data._id, uncle)
+
+ break
+
+ case "transact":
+ require(5)
+
+ var tx = eth.transact(data.args)
+ postData(data._id, tx)
+
+ break
+
+ case "stateAt":
+ require(2);
+
+ var storage = eth.storageAt(data.args[0], data.args[1]);
+ postData(data._id, storage)
+
+ break
+
+ case "call":
+ require(1);
+ var ret = eth.call(data.args)
+ postData(data._id, ret)
+ break
+
+ case "balanceAt":
+ require(1);
+
+ postData(data._id, eth.balanceAt(data.args[0]));
+ break
+
+ case "watch":
+ require(2)
+ eth.watch(data.args[0], data.args[1])
+
+ case "disconnect":
+ require(1)
+ postData(data._id, null)
+ break;
+
+ case "messages":
+ require(1);
+
+ var messages = JSON.parse(eth.getMessages(data.args[0]))
+ postData(data._id, messages)
+ break
+
+ case "mutan":
+ require(1)
+
+ var code = eth.compileMutan(data.args[0])
+ postData(data._id, "0x"+code)
+ break;
+
+ case "newFilterString":
+ require(1)
+ var id = eth.newFilterString(data.args[0])
+ postData(data._id, id);
+ break;
+
+ case "newFilter":
+ require(1)
+ var id = eth.newFilter(data.args[0])
+
+ postData(data._id, id);
+ break;
+
+ case "getMessages":
+ require(1);
+
+ var messages = eth.messages(data.args[0]);
+ var m = JSON.parse(JSON.parse(JSON.stringify(messages)))
+ postData(data._id, m);
+
+ break;
+
+ case "deleteFilter":
+ require(1);
+ eth.uninstallFilter(data.args[0])
+ break;
+ }
+ } catch(e) {
+ console.log(data.call + ": " + e)
+
+ postData(data._id, null);
+ }
+ }
+
+
+ function post(seed, data) {
+ postData(data._id, data)
+ }
+
+ function require(args, num) {
+ if(args.length < num) {
+ throw("required argument count of "+num+" got "+args.length);
+ }
+ }
+ function postData(seed, data) {
+ webview.experimental.postMessage(JSON.stringify({data: data, _id: seed}))
+ }
+ function postEvent(event, data) {
+ webview.experimental.postMessage(JSON.stringify({data: data, _event: event}))
+ }
+
+ function onWatchedCb(data, id) {
+ var messages = JSON.parse(data)
+ postEvent("watched:"+id, messages)
+ }
+
+ function onNewBlockCb(block) {
+ postEvent("block:new", block)
+ }
+ function onObjectChangeCb(stateObject) {
+ postEvent("object:"+stateObject.address(), stateObject)
+ }
+ function onStorageChangeCb(storageObject) {
+ var ev = ["storage", storageObject.stateAddress, storageObject.address].join(":");
+ postEvent(ev, [storageObject.address, storageObject.value])
+ }
+ }
+
+
+ Rectangle {
+ id: sizeGrip
+ color: "gray"
+ visible: false
+ height: 10
+ anchors {
+ left: root.left
+ right: root.right
+ }
+ y: Math.round(root.height * 2 / 3)
+
+ MouseArea {
+ anchors.fill: parent
+ drag.target: sizeGrip
+ drag.minimumY: 0
+ drag.maximumY: root.height
+ drag.axis: Drag.YAxis
+ }
+ }
+
+ WebView {
+ id: inspector
+ visible: false
+ anchors {
+ left: root.left
+ right: root.right
+ top: sizeGrip.bottom
+ bottom: root.bottom
+ }
+ }
+
+ states: [
+ State {
+ name: "inspectorShown"
+ PropertyChanges {
+ target: inspector
+ }
+ }
+ ]
+ }
+}
diff --git a/mist/assets/tx.png b/cmd/mist/assets/tx.png
index 62204c315..62204c315 100644
--- a/mist/assets/tx.png
+++ b/cmd/mist/assets/tx.png
Binary files differ
diff --git a/mist/assets/util/test.html b/cmd/mist/assets/util/test.html
index d458e6670..d458e6670 100644
--- a/mist/assets/util/test.html
+++ b/cmd/mist/assets/util/test.html
diff --git a/mist/assets/wallet.png b/cmd/mist/assets/wallet.png
index 92c401e52..92c401e52 100644
--- a/mist/assets/wallet.png
+++ b/cmd/mist/assets/wallet.png
Binary files differ
diff --git a/mist/bindings.go b/cmd/mist/bindings.go
index 141c4a469..6d2342c87 100644
--- a/mist/bindings.go
+++ b/cmd/mist/bindings.go
@@ -1,16 +1,31 @@
+// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This 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
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+// MA 02110-1301 USA
+
package main
import (
"encoding/json"
- "fmt"
"os"
"strconv"
- "github.com/ethereum/eth-go/ethchain"
- "github.com/ethereum/eth-go/ethlog"
- "github.com/ethereum/eth-go/ethpipe"
- "github.com/ethereum/eth-go/ethutil"
- "github.com/ethereum/go-ethereum/utils"
+ "github.com/ethereum/go-ethereum/cmd/utils"
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/logger"
)
type plugin struct {
@@ -18,16 +33,8 @@ type plugin struct {
Path string `json:"path"`
}
-func (gui *Gui) Println(v ...interface{}) {
- gui.printLog(fmt.Sprintln(v...))
-}
-
-func (gui *Gui) Printf(format string, v ...interface{}) {
- gui.printLog(fmt.Sprintf(format, v...))
-}
-
-// Print function that logs directly to the GUI
-func (gui *Gui) printLog(s string) {
+// LogPrint writes to the GUI log.
+func (gui *Gui) LogPrint(level logger.LogLevel, msg string) {
/*
str := strings.TrimRight(s, "\n")
lines := strings.Split(str, "\n")
@@ -38,12 +45,12 @@ func (gui *Gui) printLog(s string) {
}
*/
}
-func (gui *Gui) Transact(recipient, value, gas, gasPrice, d string) (*ethpipe.JSReceipt, error) {
+func (gui *Gui) Transact(recipient, value, gas, gasPrice, d string) (string, error) {
var data string
if len(recipient) == 0 {
code, err := ethutil.Compile(d, false)
if err != nil {
- return nil, err
+ return "", err
}
data = ethutil.Bytes2Hex(code)
} else {
@@ -62,18 +69,14 @@ func (gui *Gui) GetCustomIdentifier() string {
return gui.clientIdentity.GetCustomIdentifier()
}
-func (gui *Gui) ToggleTurboMining() {
- gui.miner.ToggleTurbo()
-}
-
-// functions that allow Gui to implement interface ethlog.LogSystem
-func (gui *Gui) SetLogLevel(level ethlog.LogLevel) {
+// functions that allow Gui to implement interface guilogger.LogSystem
+func (gui *Gui) SetLogLevel(level logger.LogLevel) {
gui.logLevel = level
gui.stdLog.SetLogLevel(level)
gui.config.Save("loglevel", level)
}
-func (gui *Gui) GetLogLevel() ethlog.LogLevel {
+func (gui *Gui) GetLogLevel() logger.LogLevel {
return gui.logLevel
}
@@ -100,18 +103,18 @@ func (self *Gui) DumpState(hash, path string) {
var stateDump []byte
if len(hash) == 0 {
- stateDump = self.eth.StateManager().CurrentState().Dump()
+ stateDump = self.eth.ChainManager().State().Dump()
} else {
- var block *ethchain.Block
+ var block *types.Block
if hash[0] == '#' {
i, _ := strconv.Atoi(hash[1:])
- block = self.eth.BlockChain().GetBlockByNumber(uint64(i))
+ block = self.eth.ChainManager().GetBlockByNumber(uint64(i))
} else {
- block = self.eth.BlockChain().GetBlock(ethutil.Hex2Bytes(hash))
+ block = self.eth.ChainManager().GetBlock(ethutil.Hex2Bytes(hash))
}
if block == nil {
- logger.Infof("block err: not found %s\n", hash)
+ guilogger.Infof("block err: not found %s\n", hash)
return
}
@@ -120,29 +123,12 @@ func (self *Gui) DumpState(hash, path string) {
file, err := os.OpenFile(path[7:], os.O_CREATE|os.O_RDWR, os.ModePerm)
if err != nil {
- logger.Infoln("dump err: ", err)
+ guilogger.Infoln("dump err: ", err)
return
}
defer file.Close()
- logger.Infof("dumped state (%s) to %s\n", hash, path)
+ guilogger.Infof("dumped state (%s) to %s\n", hash, path)
file.Write(stateDump)
}
-func (gui *Gui) ToggleMining() {
- var txt string
- if gui.eth.Mining {
- utils.StopMining(gui.eth)
- txt = "Start mining"
-
- gui.getObjectByName("miningLabel").Set("visible", false)
- } else {
- utils.StartMining(gui.eth)
- gui.miner = utils.GetMiner()
- txt = "Stop mining"
-
- gui.getObjectByName("miningLabel").Set("visible", true)
- }
-
- gui.win.Root().Set("miningButtonText", txt)
-}
diff --git a/mist/debugger.go b/cmd/mist/debugger.go
index 9d1de8c42..a7a286e23 100644
--- a/mist/debugger.go
+++ b/cmd/mist/debugger.go
@@ -1,3 +1,20 @@
+// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This 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
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+// MA 02110-1301 USA
+
package main
import (
@@ -7,11 +24,11 @@ import (
"strings"
"unicode"
- "github.com/ethereum/eth-go/ethchain"
- "github.com/ethereum/eth-go/ethstate"
- "github.com/ethereum/eth-go/ethutil"
- "github.com/ethereum/eth-go/ethvm"
- "github.com/ethereum/go-ethereum/utils"
+ "github.com/ethereum/go-ethereum/cmd/utils"
+ "github.com/ethereum/go-ethereum/core"
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/state"
+ "github.com/ethereum/go-ethereum/vm"
"gopkg.in/qml.v1"
)
@@ -20,10 +37,10 @@ type DebuggerWindow struct {
engine *qml.Engine
lib *UiLib
- vm *ethvm.Vm
+ vm *vm.DebugVm
Db *Debugger
- state *ethstate.State
+ state *state.StateDB
}
func NewDebuggerWindow(lib *UiLib) *DebuggerWindow {
@@ -37,7 +54,7 @@ func NewDebuggerWindow(lib *UiLib) *DebuggerWindow {
win := component.CreateWindow(nil)
- w := &DebuggerWindow{engine: engine, win: win, lib: lib, vm: &ethvm.Vm{}}
+ w := &DebuggerWindow{engine: engine, win: win, lib: lib, vm: &vm.DebugVm{}}
w.Db = NewDebugger(w)
return w
@@ -64,7 +81,7 @@ func (self *DebuggerWindow) SetData(data string) {
func (self *DebuggerWindow) SetAsm(data []byte) {
self.win.Root().Call("clearAsm")
- dis := ethchain.Disassemble(data)
+ dis := core.Disassemble(data)
for _, str := range dis {
self.win.Root().Call("setAsm", str)
}
@@ -124,28 +141,24 @@ func (self *DebuggerWindow) Debug(valueStr, gasStr, gasPriceStr, scriptStr, data
keyPair = self.lib.eth.KeyManager().KeyPair()
)
- state := self.lib.eth.StateManager().TransState()
- account := self.lib.eth.StateManager().TransState().GetAccount(keyPair.Address())
- contract := ethstate.NewStateObject([]byte{0})
- contract.Balance = value
+ statedb := self.lib.eth.ChainManager().TransState()
+ account := self.lib.eth.ChainManager().TransState().GetAccount(keyPair.Address())
+ contract := statedb.NewStateObject([]byte{0})
+ contract.SetCode(script)
+ contract.SetBalance(value)
self.SetAsm(script)
- block := self.lib.eth.BlockChain().CurrentBlock
+ block := self.lib.eth.ChainManager().CurrentBlock()
- callerClosure := ethvm.NewClosure(&ethstate.Message{}, account, contract, script, gas, gasPrice)
- env := utils.NewEnv(state, block, account.Address(), value)
- vm := ethvm.New(env)
- vm.Verbose = true
- vm.Dbg = self.Db
+ env := utils.NewEnv(statedb, block, account.Address(), value)
- self.vm = vm
- self.Db.done = false
self.Logf("callsize %d", len(script))
go func() {
- ret, g, err := callerClosure.Call(vm, data)
- tot := new(big.Int).Mul(g, gasPrice)
- self.Logf("gas usage %v total price = %v (%v)", g, tot, ethutil.CurrencyToString(tot))
+ ret, err := env.Call(account, contract.Address(), data, gas, gasPrice, ethutil.Big0)
+ //ret, g, err := callerClosure.Call(evm, data)
+ tot := new(big.Int).Mul(env.Gas, gasPrice)
+ self.Logf("gas usage %v total price = %v (%v)", env.Gas, tot, ethutil.CurrencyToString(tot))
if err != nil {
self.Logln("exited with errors:", err)
} else {
@@ -156,7 +169,7 @@ func (self *DebuggerWindow) Debug(valueStr, gasStr, gasPriceStr, scriptStr, data
}
}
- state.Reset()
+ statedb.Reset()
if !self.Db.interrupt {
self.Db.done = true
@@ -251,13 +264,13 @@ type storeVal struct {
Key, Value string
}
-func (self *Debugger) BreakHook(pc int, op ethvm.OpCode, mem *ethvm.Memory, stack *ethvm.Stack, stateObject *ethstate.StateObject) bool {
+func (self *Debugger) BreakHook(pc int, op vm.OpCode, mem *vm.Memory, stack *vm.Stack, stateObject *state.StateObject) bool {
self.main.Logln("break on instr:", pc)
return self.halting(pc, op, mem, stack, stateObject)
}
-func (self *Debugger) StepHook(pc int, op ethvm.OpCode, mem *ethvm.Memory, stack *ethvm.Stack, stateObject *ethstate.StateObject) bool {
+func (self *Debugger) StepHook(pc int, op vm.OpCode, mem *vm.Memory, stack *vm.Stack, stateObject *state.StateObject) bool {
return self.halting(pc, op, mem, stack, stateObject)
}
@@ -269,7 +282,7 @@ func (self *Debugger) BreakPoints() []int64 {
return self.breakPoints
}
-func (d *Debugger) halting(pc int, op ethvm.OpCode, mem *ethvm.Memory, stack *ethvm.Stack, stateObject *ethstate.StateObject) bool {
+func (d *Debugger) halting(pc int, op vm.OpCode, mem *vm.Memory, stack *vm.Stack, stateObject *state.StateObject) bool {
d.win.Root().Call("setInstruction", pc)
d.win.Root().Call("clearMem")
d.win.Root().Call("clearStack")
diff --git a/cmd/mist/errors.go b/cmd/mist/errors.go
new file mode 100644
index 000000000..2069bf26d
--- /dev/null
+++ b/cmd/mist/errors.go
@@ -0,0 +1,53 @@
+// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This 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
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+// MA 02110-1301 USA
+
+package main
+
+import (
+ "fmt"
+ "os"
+
+ "gopkg.in/qml.v1"
+)
+
+func ErrorWindow(err error) {
+ engine := qml.NewEngine()
+ component, e := engine.LoadString("local", qmlErr)
+ if e != nil {
+ fmt.Println("err:", err)
+ os.Exit(1)
+ }
+
+ win := component.CreateWindow(nil)
+ win.Root().ObjectByName("label").Set("text", err.Error())
+ win.Show()
+ win.Wait()
+}
+
+const qmlErr = `
+import QtQuick 2.0; import QtQuick.Controls 1.0;
+ApplicationWindow {
+ width: 600; height: 150;
+ flags: Qt.CustomizeWindowHint | Qt.WindowTitleHint | Qt.WindowCloseButtonHint
+ title: "Error"
+ Text {
+ x: parent.width / 2 - this.width / 2;
+ y: parent.height / 2 - this.height / 2;
+ objectName: "label";
+ }
+}
+`
diff --git a/cmd/mist/ext_app.go b/cmd/mist/ext_app.go
new file mode 100644
index 000000000..33c420a7a
--- /dev/null
+++ b/cmd/mist/ext_app.go
@@ -0,0 +1,143 @@
+// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This 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
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+// MA 02110-1301 USA
+
+package main
+
+import (
+ "encoding/json"
+
+ "github.com/ethereum/go-ethereum/core"
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/event"
+ "github.com/ethereum/go-ethereum/javascript"
+ "github.com/ethereum/go-ethereum/state"
+ "github.com/ethereum/go-ethereum/ui/qt"
+ "github.com/ethereum/go-ethereum/xeth"
+ "gopkg.in/qml.v1"
+)
+
+type AppContainer interface {
+ Create() error
+ Destroy()
+
+ Window() *qml.Window
+ Engine() *qml.Engine
+
+ NewBlock(*types.Block)
+ NewWatcher(chan bool)
+ Messages(state.Messages, string)
+ Post(string, int)
+}
+
+type ExtApplication struct {
+ *xeth.JSXEth
+ eth core.EthManager
+
+ events event.Subscription
+ watcherQuitChan chan bool
+
+ filters map[string]*core.Filter
+
+ container AppContainer
+ lib *UiLib
+}
+
+func NewExtApplication(container AppContainer, lib *UiLib) *ExtApplication {
+ return &ExtApplication{
+ JSXEth: xeth.NewJSXEth(lib.eth),
+ eth: lib.eth,
+ watcherQuitChan: make(chan bool),
+ filters: make(map[string]*core.Filter),
+ container: container,
+ lib: lib,
+ }
+}
+
+func (app *ExtApplication) run() {
+ // Set the "eth" api on to the containers context
+ context := app.container.Engine().Context()
+ context.SetVar("eth", app)
+ context.SetVar("ui", app.lib)
+
+ err := app.container.Create()
+ if err != nil {
+ guilogger.Errorln(err)
+ return
+ }
+
+ // Subscribe to events
+ mux := app.lib.eth.EventMux()
+ app.events = mux.Subscribe(core.NewBlockEvent{}, state.Messages(nil))
+
+ // Call the main loop
+ go app.mainLoop()
+
+ app.container.NewWatcher(app.watcherQuitChan)
+
+ win := app.container.Window()
+ win.Show()
+ win.Wait()
+
+ app.stop()
+}
+
+func (app *ExtApplication) stop() {
+ app.events.Unsubscribe()
+
+ // Kill the main loop
+ app.watcherQuitChan <- true
+
+ app.container.Destroy()
+}
+
+func (app *ExtApplication) mainLoop() {
+ for ev := range app.events.Chan() {
+ switch ev := ev.(type) {
+ case core.NewBlockEvent:
+ app.container.NewBlock(ev.Block)
+
+ case state.Messages:
+ for id, filter := range app.filters {
+ msgs := filter.FilterMessages(ev)
+ if len(msgs) > 0 {
+ app.container.Messages(msgs, id)
+ }
+ }
+ }
+ }
+}
+
+func (self *ExtApplication) Watch(filterOptions map[string]interface{}, identifier string) {
+ self.filters[identifier] = qt.NewFilterFromMap(filterOptions, self.eth)
+}
+
+func (self *ExtApplication) GetMessages(object map[string]interface{}) string {
+ filter := qt.NewFilterFromMap(object, self.eth)
+
+ messages := filter.Find()
+ var msgs []javascript.JSMessage
+ for _, m := range messages {
+ msgs = append(msgs, javascript.NewJSMessage(m))
+ }
+
+ b, err := json.Marshal(msgs)
+ if err != nil {
+ return "{\"error\":" + err.Error() + "}"
+ }
+
+ return string(b)
+}
diff --git a/mist/flags.go b/cmd/mist/flags.go
index d2e7d3fb0..e49408181 100644
--- a/mist/flags.go
+++ b/cmd/mist/flags.go
@@ -1,8 +1,26 @@
+// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This 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
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+// MA 02110-1301 USA
+
package main
import (
"flag"
"fmt"
+ "log"
"os"
"os/user"
"path"
@@ -10,29 +28,34 @@ import (
"runtime"
"bitbucket.org/kardianos/osext"
- "github.com/ethereum/eth-go/ethlog"
+ "github.com/ethereum/go-ethereum/logger"
+ "github.com/ethereum/go-ethereum/vm"
)
-var Identifier string
-var KeyRing string
-var KeyStore string
-var StartRpc bool
-var RpcPort int
-var UseUPnP bool
-var OutboundPort string
-var ShowGenesis bool
-var AddPeer string
-var MaxPeer int
-var GenAddr bool
-var UseSeed bool
-var SecretFile string
-var ExportDir string
-var NonInteractive bool
-var Datadir string
-var LogFile string
-var ConfigFile string
-var DebugFile string
-var LogLevel int
+var (
+ Identifier string
+ KeyRing string
+ KeyStore string
+ StartRpc bool
+ StartWebSockets bool
+ RpcPort int
+ UseUPnP bool
+ OutboundPort string
+ ShowGenesis bool
+ AddPeer string
+ MaxPeer int
+ GenAddr bool
+ UseSeed bool
+ SecretFile string
+ ExportDir string
+ NonInteractive bool
+ Datadir string
+ LogFile string
+ ConfigFile string
+ DebugFile string
+ LogLevel int
+ VmType int
+)
// flags specific to gui client
var AssetPath string
@@ -44,7 +67,7 @@ func defaultAssetPath() string {
// assume a debug build and use the source directory as
// asset directory.
pwd, _ := os.Getwd()
- if pwd == path.Join(os.Getenv("GOPATH"), "src", "github.com", "ethereum", "go-ethereum", "mist") {
+ if pwd == path.Join(os.Getenv("GOPATH"), "src", "github.com", "ethereum", "go-ethereum", "cmd", "mist") {
assetPath = path.Join(pwd, "assets")
} else {
switch runtime.GOOS {
@@ -75,14 +98,16 @@ func Init() {
flag.PrintDefaults()
}
+ flag.IntVar(&VmType, "vm", 0, "Virtual Machine type: 0-1: standard, debug")
flag.StringVar(&Identifier, "id", "", "Custom client identifier")
flag.StringVar(&KeyRing, "keyring", "", "identifier for keyring to use")
flag.StringVar(&KeyStore, "keystore", "db", "system to store keyrings: db|file (db)")
flag.StringVar(&OutboundPort, "port", "30303", "listening port")
flag.BoolVar(&UseUPnP, "upnp", true, "enable UPnP support")
- flag.IntVar(&MaxPeer, "maxpeer", 10, "maximum desired peers")
+ flag.IntVar(&MaxPeer, "maxpeer", 30, "maximum desired peers")
flag.IntVar(&RpcPort, "rpcport", 8080, "port to start json-rpc server on")
flag.BoolVar(&StartRpc, "rpc", false, "start rpc server")
+ flag.BoolVar(&StartWebSockets, "ws", false, "start websocket server")
flag.BoolVar(&NonInteractive, "y", false, "non-interactive mode (say yes to confirmations)")
flag.BoolVar(&UseSeed, "seed", true, "seed peers")
flag.BoolVar(&GenAddr, "genaddr", false, "create a new priv/pub key")
@@ -92,9 +117,13 @@ func Init() {
flag.StringVar(&Datadir, "datadir", defaultDataDir(), "specifies the datadir to use")
flag.StringVar(&ConfigFile, "conf", defaultConfigFile, "config file")
flag.StringVar(&DebugFile, "debug", "", "debug file (no debugging if not set)")
- flag.IntVar(&LogLevel, "loglevel", int(ethlog.InfoLevel), "loglevel: 0-5: silent,error,warn,info,debug,debug detail)")
+ flag.IntVar(&LogLevel, "loglevel", int(logger.InfoLevel), "loglevel: 0-5: silent,error,warn,info,debug,debug detail)")
flag.StringVar(&AssetPath, "asset_path", defaultAssetPath(), "absolute path to GUI assets directory")
flag.Parse()
+
+ if VmType >= int(vm.MaxVmTy) {
+ log.Fatal("Invalid VM type ", VmType)
+ }
}
diff --git a/mist/gui.go b/cmd/mist/gui.go
index 80d4a1fc3..7775889cc 100644
--- a/mist/gui.go
+++ b/cmd/mist/gui.go
@@ -1,3 +1,20 @@
+// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This 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
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+// MA 02110-1301 USA
+
package main
import "C"
@@ -13,15 +30,15 @@ import (
"strings"
"time"
- "github.com/ethereum/eth-go"
- "github.com/ethereum/eth-go/ethchain"
- "github.com/ethereum/eth-go/ethdb"
- "github.com/ethereum/eth-go/ethlog"
- "github.com/ethereum/eth-go/ethminer"
- "github.com/ethereum/eth-go/ethpipe"
- "github.com/ethereum/eth-go/ethreact"
- "github.com/ethereum/eth-go/ethutil"
- "github.com/ethereum/eth-go/ethwire"
+ "github.com/ethereum/go-ethereum"
+ "github.com/ethereum/go-ethereum/core"
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/ethdb"
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/logger"
+ "github.com/ethereum/go-ethereum/miner"
+ "github.com/ethereum/go-ethereum/wire"
+ "github.com/ethereum/go-ethereum/xeth"
"gopkg.in/qml.v1"
)
@@ -47,8 +64,17 @@ func LoadExtension(path string) (uintptr, error) {
return ptr.Interface().(uintptr), nil
}
*/
+/*
+ vec, errr := LoadExtension("/Users/jeffrey/Desktop/build-libqmltest-Desktop_Qt_5_2_1_clang_64bit-Debug/liblibqmltest_debug.dylib")
+ fmt.Printf("Fetched vec with addr: %#x\n", vec)
+ if errr != nil {
+ fmt.Println(errr)
+ } else {
+ context.SetVar("vec", (unsafe.Pointer)(vec))
+ }
+*/
-var logger = ethlog.NewLogger("GUI")
+var guilogger = logger.NewLogger("GUI")
type Gui struct {
// The main application window
@@ -65,30 +91,30 @@ type Gui struct {
txDb *ethdb.LDBDatabase
- logLevel ethlog.LogLevel
+ logLevel logger.LogLevel
open bool
- pipe *ethpipe.JSPipe
+ pipe *xeth.JSXEth
Session string
- clientIdentity *ethwire.SimpleClientIdentity
+ clientIdentity *wire.SimpleClientIdentity
config *ethutil.ConfigManager
plugins map[string]plugin
- miner *ethminer.Miner
- stdLog ethlog.LogSystem
+ miner *miner.Miner
+ stdLog logger.LogSystem
}
// Create GUI, but doesn't start it
-func NewWindow(ethereum *eth.Ethereum, config *ethutil.ConfigManager, clientIdentity *ethwire.SimpleClientIdentity, session string, logLevel int) *Gui {
+func NewWindow(ethereum *eth.Ethereum, config *ethutil.ConfigManager, clientIdentity *wire.SimpleClientIdentity, session string, logLevel int) *Gui {
db, err := ethdb.NewLDBDatabase("tx_database")
if err != nil {
panic(err)
}
- pipe := ethpipe.NewJSPipe(ethereum)
- gui := &Gui{eth: ethereum, txDb: db, pipe: pipe, logLevel: ethlog.LogLevel(logLevel), Session: session, open: false, clientIdentity: clientIdentity, config: config, plugins: make(map[string]plugin)}
+ pipe := xeth.NewJSXEth(ethereum)
+ gui := &Gui{eth: ethereum, txDb: db, pipe: pipe, logLevel: logger.LogLevel(logLevel), Session: session, open: false, clientIdentity: clientIdentity, config: config, plugins: make(map[string]plugin)}
data, _ := ethutil.ReadAllFile(path.Join(ethutil.Config.ExecPath, "plugins.json"))
json.Unmarshal([]byte(data), &gui.plugins)
@@ -96,16 +122,17 @@ func NewWindow(ethereum *eth.Ethereum, config *ethutil.ConfigManager, clientIden
}
func (gui *Gui) Start(assetPath string) {
-
defer gui.txDb.Close()
+ guilogger.Infoln("Starting GUI")
+
// Register ethereum functions
qml.RegisterTypes("Ethereum", 1, 0, []qml.TypeSpec{{
- Init: func(p *ethpipe.JSBlock, obj qml.Object) { p.Number = 0; p.Hash = "" },
+ Init: func(p *xeth.JSBlock, obj qml.Object) { p.Number = 0; p.Hash = "" },
}, {
- Init: func(p *ethpipe.JSTransaction, obj qml.Object) { p.Value = ""; p.Hash = ""; p.Address = "" },
+ Init: func(p *xeth.JSTransaction, obj qml.Object) { p.Value = ""; p.Hash = ""; p.Address = "" },
}, {
- Init: func(p *ethpipe.KeyVal, obj qml.Object) { p.Key = ""; p.Value = "" },
+ Init: func(p *xeth.KeyVal, obj qml.Object) { p.Key = ""; p.Value = "" },
}})
// Create a new QML engine
gui.engine = qml.NewEngine()
@@ -116,16 +143,6 @@ func (gui *Gui) Start(assetPath string) {
context.SetVar("gui", gui)
context.SetVar("eth", gui.uiLib)
- /*
- vec, errr := LoadExtension("/Users/jeffrey/Desktop/build-libqmltest-Desktop_Qt_5_2_1_clang_64bit-Debug/liblibqmltest_debug.dylib")
- fmt.Printf("Fetched vec with addr: %#x\n", vec)
- if errr != nil {
- fmt.Println(errr)
- } else {
- context.SetVar("vec", (unsafe.Pointer)(vec))
- }
- */
-
// Load the main QML interface
data, _ := ethutil.Config.Db.Get([]byte("KeyRing"))
@@ -139,36 +156,35 @@ func (gui *Gui) Start(assetPath string) {
addlog = true
}
if err != nil {
- logger.Errorln("asset not found: you can set an alternative asset path on the command line using option 'asset_path'", err)
+ guilogger.Errorln("asset not found: you can set an alternative asset path on the command line using option 'asset_path'", err)
panic(err)
}
- logger.Infoln("Starting GUI")
gui.open = true
win.Show()
- // only add the gui logger after window is shown otherwise slider wont be shown
+ // only add the gui guilogger after window is shown otherwise slider wont be shown
if addlog {
- ethlog.AddLogSystem(gui)
+ logger.AddLogSystem(gui)
}
win.Wait()
- // need to silence gui logger after window closed otherwise logsystem hangs (but do not save loglevel)
- gui.logLevel = ethlog.Silence
+ // need to silence gui guilogger after window closed otherwise logsystem hangs (but do not save loglevel)
+ gui.logLevel = logger.Silence
gui.open = false
}
func (gui *Gui) Stop() {
if gui.open {
- gui.logLevel = ethlog.Silence
+ gui.logLevel = logger.Silence
gui.open = false
gui.win.Hide()
}
gui.uiLib.jsEngine.Stop()
- logger.Infoln("Stopped")
+ guilogger.Infoln("Stopped")
}
func (gui *Gui) showWallet(context *qml.Context) (*qml.Window, error) {
@@ -213,51 +229,34 @@ func (gui *Gui) createWindow(comp qml.Object) *qml.Window {
func (gui *Gui) ImportAndSetPrivKey(secret string) bool {
err := gui.eth.KeyManager().InitFromString(gui.Session, 0, secret)
if err != nil {
- logger.Errorln("unable to import: ", err)
+ guilogger.Errorln("unable to import: ", err)
return false
}
- logger.Errorln("successfully imported: ", err)
+ guilogger.Errorln("successfully imported: ", err)
return true
}
func (gui *Gui) CreateAndSetPrivKey() (string, string, string, string) {
err := gui.eth.KeyManager().Init(gui.Session, 0, true)
if err != nil {
- logger.Errorln("unable to create key: ", err)
+ guilogger.Errorln("unable to create key: ", err)
return "", "", "", ""
}
return gui.eth.KeyManager().KeyPair().AsStrings()
}
-func (gui *Gui) setInitialBlockChain() {
- sBlk := gui.eth.BlockChain().LastBlockHash
- blk := gui.eth.BlockChain().GetBlock(sBlk)
- for ; blk != nil; blk = gui.eth.BlockChain().GetBlock(sBlk) {
+func (gui *Gui) setInitialChain(ancientBlocks bool) {
+ sBlk := gui.eth.ChainManager().LastBlockHash()
+ blk := gui.eth.ChainManager().GetBlock(sBlk)
+ for ; blk != nil; blk = gui.eth.ChainManager().GetBlock(sBlk) {
sBlk = blk.PrevHash
- addr := gui.address()
-
- // Loop through all transactions to see if we missed any while being offline
- for _, tx := range blk.Transactions() {
- if bytes.Compare(tx.Sender(), addr) == 0 || bytes.Compare(tx.Recipient, addr) == 0 {
- if ok, _ := gui.txDb.Get(tx.Hash()); ok == nil {
- gui.txDb.Put(tx.Hash(), tx.RlpEncode())
- }
-
- }
- }
gui.processBlock(blk, true)
}
}
-type address struct {
- Name, Address string
-}
-
func (gui *Gui) loadAddressBook() {
view := gui.getObjectByName("infoView")
- view.Call("clearAddress")
-
nameReg := gui.pipe.World().Config().Get("NameReg")
if nameReg != nil {
nameReg.EachStorage(func(name string, value *ethutil.Value) {
@@ -270,8 +269,30 @@ func (gui *Gui) loadAddressBook() {
}
}
-func (gui *Gui) insertTransaction(window string, tx *ethchain.Transaction) {
- pipe := ethpipe.New(gui.eth)
+func (self *Gui) loadMergedMiningOptions() {
+ view := self.getObjectByName("mergedMiningModel")
+
+ nameReg := self.pipe.World().Config().Get("MergeMining")
+ if nameReg != nil {
+ i := 0
+ nameReg.EachStorage(func(name string, value *ethutil.Value) {
+ if name[0] != 0 {
+ value.Decode()
+
+ view.Call("addMergedMiningOption", struct {
+ Checked bool
+ Name, Address string
+ Id, ItemId int
+ }{false, name, ethutil.Bytes2Hex(value.Bytes()), 0, i})
+
+ i++
+ }
+ })
+ }
+}
+
+func (gui *Gui) insertTransaction(window string, tx *types.Transaction) {
+ pipe := xeth.New(gui.eth)
nameReg := pipe.World().Config().Get("NameReg")
addr := gui.address()
@@ -283,14 +304,14 @@ func (gui *Gui) insertTransaction(window string, tx *ethchain.Transaction) {
}
var (
- ptx = ethpipe.NewJSTx(tx, pipe.World().State())
- send = nameReg.Storage(tx.Sender())
- rec = nameReg.Storage(tx.Recipient)
+ ptx = xeth.NewJSTx(tx, pipe.World().State())
+ send = nameReg.Storage(tx.From())
+ rec = nameReg.Storage(tx.To())
s, r string
)
- if tx.CreatesContract() {
- rec = nameReg.Storage(tx.CreationAddress(pipe.World().State()))
+ if core.MessageCreatesContract(tx) {
+ rec = nameReg.Storage(core.AddressFromMessage(tx))
}
if send.Len() != 0 {
@@ -301,10 +322,10 @@ func (gui *Gui) insertTransaction(window string, tx *ethchain.Transaction) {
if rec.Len() != 0 {
r = strings.Trim(rec.Str(), "\x00")
} else {
- if tx.CreatesContract() {
- r = ethutil.Bytes2Hex(tx.CreationAddress(pipe.World().State()))
+ if core.MessageCreatesContract(tx) {
+ r = ethutil.Bytes2Hex(core.AddressFromMessage(tx))
} else {
- r = ethutil.Bytes2Hex(tx.Recipient)
+ r = ethutil.Bytes2Hex(tx.To())
}
}
ptx.Sender = s
@@ -318,9 +339,9 @@ func (gui *Gui) insertTransaction(window string, tx *ethchain.Transaction) {
}
func (gui *Gui) readPreviousTransactions() {
- it := gui.txDb.Db().NewIterator(nil, nil)
+ it := gui.txDb.NewIterator()
for it.Next() {
- tx := ethchain.NewTransactionFromBytes(it.Value())
+ tx := types.NewTransactionFromBytes(it.Value())
gui.insertTransaction("post", tx)
@@ -328,9 +349,9 @@ func (gui *Gui) readPreviousTransactions() {
it.Release()
}
-func (gui *Gui) processBlock(block *ethchain.Block, initial bool) {
+func (gui *Gui) processBlock(block *types.Block, initial bool) {
name := strings.Trim(gui.pipe.World().Config().Get("NameReg").Storage(block.Coinbase).Str(), "\x00")
- b := ethpipe.NewJSBlock(block)
+ b := xeth.NewJSBlock(block)
b.Name = name
gui.getObjectByName("chainView").Call("addBlock", b, initial)
@@ -360,106 +381,96 @@ func (self *Gui) getObjectByName(objectName string) qml.Object {
func (gui *Gui) update() {
// We have to wait for qml to be done loading all the windows.
for !gui.qmlDone {
- time.Sleep(500 * time.Millisecond)
+ time.Sleep(300 * time.Millisecond)
}
go func() {
- go gui.setInitialBlockChain()
+ go gui.setInitialChain(false)
gui.loadAddressBook()
+ gui.loadMergedMiningOptions()
gui.setPeerInfo()
- gui.readPreviousTransactions()
}()
for _, plugin := range gui.plugins {
- logger.Infoln("Loading plugin ", plugin.Name)
+ guilogger.Infoln("Loading plugin ", plugin.Name)
gui.win.Root().Call("addPlugin", plugin.Path, "")
}
- var (
- blockChan = make(chan ethreact.Event, 100)
- txChan = make(chan ethreact.Event, 100)
- objectChan = make(chan ethreact.Event, 100)
- peerChan = make(chan ethreact.Event, 100)
- chainSyncChan = make(chan ethreact.Event, 100)
- miningChan = make(chan ethreact.Event, 100)
- )
-
peerUpdateTicker := time.NewTicker(5 * time.Second)
generalUpdateTicker := time.NewTicker(500 * time.Millisecond)
statsUpdateTicker := time.NewTicker(5 * time.Second)
- state := gui.eth.StateManager().TransState()
+ state := gui.eth.ChainManager().TransState()
- unconfirmedFunds := new(big.Int)
- gui.win.Root().Call("setWalletValue", fmt.Sprintf("%v", ethutil.CurrencyToString(state.GetAccount(gui.address()).Balance)))
+ gui.win.Root().Call("setWalletValue", fmt.Sprintf("%v", ethutil.CurrencyToString(state.GetAccount(gui.address()).Balance())))
lastBlockLabel := gui.getObjectByName("lastBlockLabel")
miningLabel := gui.getObjectByName("miningLabel")
+ events := gui.eth.EventMux().Subscribe(
+ eth.ChainSyncEvent{},
+ eth.PeerListEvent{},
+ core.NewBlockEvent{},
+ core.TxPreEvent{},
+ core.TxPostEvent{},
+ )
+
go func() {
+ defer events.Unsubscribe()
for {
select {
- case b := <-blockChan:
- block := b.Resource.(*ethchain.Block)
- gui.processBlock(block, false)
- if bytes.Compare(block.Coinbase, gui.address()) == 0 {
- gui.setWalletValue(gui.eth.StateManager().CurrentState().GetAccount(gui.address()).Balance, nil)
+ case ev, isopen := <-events.Chan():
+ if !isopen {
+ return
}
- case txMsg := <-txChan:
- tx := txMsg.Resource.(*ethchain.Transaction)
+ switch ev := ev.(type) {
+ case core.NewBlockEvent:
+ gui.processBlock(ev.Block, false)
+ if bytes.Compare(ev.Block.Coinbase, gui.address()) == 0 {
+ gui.setWalletValue(gui.eth.ChainManager().State().GetBalance(gui.address()), nil)
+ }
- if txMsg.Name == "newTx:pre" {
- object := state.GetAccount(gui.address())
+ case core.TxPreEvent:
+ tx := ev.Tx
- if bytes.Compare(tx.Sender(), gui.address()) == 0 {
- unconfirmedFunds.Sub(unconfirmedFunds, tx.Value)
- } else if bytes.Compare(tx.Recipient, gui.address()) == 0 {
- unconfirmedFunds.Add(unconfirmedFunds, tx.Value)
- }
+ tstate := gui.eth.ChainManager().TransState()
+ cstate := gui.eth.ChainManager().State()
- gui.setWalletValue(object.Balance, unconfirmedFunds)
+ taccount := tstate.GetAccount(gui.address())
+ caccount := cstate.GetAccount(gui.address())
+ unconfirmedFunds := new(big.Int).Sub(taccount.Balance(), caccount.Balance())
+ gui.setWalletValue(taccount.Balance(), unconfirmedFunds)
gui.insertTransaction("pre", tx)
- } else {
+
+ case core.TxPostEvent:
+ tx := ev.Tx
object := state.GetAccount(gui.address())
+
if bytes.Compare(tx.Sender(), gui.address()) == 0 {
- object.SubAmount(tx.Value)
+ object.SubAmount(tx.Value())
- //gui.getObjectByName("transactionView").Call("addTx", ethpipe.NewJSTx(tx), "send")
gui.txDb.Put(tx.Hash(), tx.RlpEncode())
- } else if bytes.Compare(tx.Recipient, gui.address()) == 0 {
- object.AddAmount(tx.Value)
+ } else if bytes.Compare(tx.To(), gui.address()) == 0 {
+ object.AddAmount(tx.Value())
- //gui.getObjectByName("transactionView").Call("addTx", ethpipe.NewJSTx(tx), "recv")
gui.txDb.Put(tx.Hash(), tx.RlpEncode())
}
- gui.setWalletValue(object.Balance, nil)
-
+ gui.setWalletValue(object.Balance(), nil)
state.UpdateStateObject(object)
+
+ case eth.PeerListEvent:
+ gui.setPeerInfo()
}
- case <-objectChan:
- gui.loadAddressBook()
- case <-peerChan:
- gui.setPeerInfo()
case <-peerUpdateTicker.C:
gui.setPeerInfo()
- case msg := <-miningChan:
- if msg.Name == "miner:start" {
- gui.miner = msg.Resource.(*ethminer.Miner)
- } else {
- gui.miner = nil
- }
case <-generalUpdateTicker.C:
- statusText := "#" + gui.eth.BlockChain().CurrentBlock.Number.String()
+ statusText := "#" + gui.eth.ChainManager().CurrentBlock().Number.String()
lastBlockLabel.Set("text", statusText)
-
- if gui.miner != nil {
- pow := gui.miner.GetPow()
- miningLabel.Set("text", "Mining @ "+strconv.FormatInt(pow.GetHashrate(), 10)+"Khash")
- }
+ miningLabel.Set("text", "Mining @ "+strconv.FormatInt(gui.uiLib.miner.GetPow().GetHashrate(), 10)+"Khash")
blockLength := gui.eth.BlockPool().BlocksProcessed
chainLength := gui.eth.BlockPool().ChainLength
@@ -469,7 +480,6 @@ func (gui *Gui) update() {
dlWidget = gui.win.Root().ObjectByName("downloadIndicator")
dlLabel = gui.win.Root().ObjectByName("downloadLabel")
)
-
dlWidget.Set("value", pct)
dlLabel.Set("text", fmt.Sprintf("%d / %d", blockLength, chainLength))
@@ -478,20 +488,6 @@ func (gui *Gui) update() {
}
}
}()
-
- reactor := gui.eth.Reactor()
-
- reactor.Subscribe("newBlock", blockChan)
- reactor.Subscribe("newTx:pre", txChan)
- reactor.Subscribe("newTx:post", txChan)
- reactor.Subscribe("chainSync", chainSyncChan)
- reactor.Subscribe("miner:start", miningChan)
- reactor.Subscribe("miner:stop", miningChan)
-
- nameReg := gui.pipe.World().Config().Get("NameReg")
- reactor.Subscribe("object:"+string(nameReg.Address()), objectChan)
-
- reactor.Subscribe("peerList", peerChan)
}
func (gui *Gui) setStatsPane() {
@@ -499,7 +495,7 @@ func (gui *Gui) setStatsPane() {
runtime.ReadMemStats(&memStats)
statsPane := gui.getObjectByName("statsPane")
- statsPane.Set("text", fmt.Sprintf(`###### Mist 0.6.8 (%s) #######
+ statsPane.Set("text", fmt.Sprintf(`###### Mist %s (%s) #######
eth %d (p2p = %d)
@@ -512,7 +508,7 @@ Heap Alloc: %d
CGNext: %x
NumGC: %d
-`, runtime.Version(),
+`, Version, runtime.Version(),
eth.ProtocolVersion, eth.P2PVersion,
runtime.NumCPU, runtime.NumGoroutine(), runtime.NumCgoCall(),
memStats.Alloc, memStats.HeapAlloc,
@@ -522,7 +518,6 @@ NumGC: %d
func (gui *Gui) setPeerInfo() {
gui.win.Root().Call("setPeers", fmt.Sprintf("%d / %d", gui.eth.PeerCount(), gui.eth.MaxPeers))
-
gui.win.Root().Call("resetPeers")
for _, peer := range gui.pipe.Peers() {
gui.win.Root().Call("addPeer", peer)
diff --git a/mist/html_container.go b/cmd/mist/html_container.go
index 69edea570..b3fc219fa 100644
--- a/mist/html_container.go
+++ b/cmd/mist/html_container.go
@@ -1,3 +1,20 @@
+// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This 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
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+// MA 02110-1301 USA
+
package main
import (
@@ -10,11 +27,11 @@ import (
"path"
"path/filepath"
- "github.com/ethereum/eth-go/ethchain"
- "github.com/ethereum/eth-go/ethpipe"
- "github.com/ethereum/eth-go/ethstate"
- "github.com/ethereum/eth-go/ethutil"
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/ethutil"
"github.com/ethereum/go-ethereum/javascript"
+ "github.com/ethereum/go-ethereum/state"
+ "github.com/ethereum/go-ethereum/xeth"
"github.com/howeyc/fsnotify"
"gopkg.in/qml.v1"
)
@@ -81,12 +98,12 @@ func (app *HtmlApplication) NewWatcher(quitChan chan bool) {
app.watcher, err = fsnotify.NewWatcher()
if err != nil {
- logger.Infoln("Could not create new auto-reload watcher:", err)
+ guilogger.Infoln("Could not create new auto-reload watcher:", err)
return
}
err = app.watcher.Watch(app.RootFolder())
if err != nil {
- logger.Infoln("Could not start auto-reload watcher:", err)
+ guilogger.Infoln("Could not start auto-reload watcher:", err)
return
}
for _, folder := range app.RecursiveFolders() {
@@ -102,11 +119,11 @@ func (app *HtmlApplication) NewWatcher(quitChan chan bool) {
app.watcher.Close()
break out
case <-app.watcher.Event:
- //logger.Debugln("Got event:", ev)
+ //guilogger.Debugln("Got event:", ev)
app.webView.Call("reload")
case err := <-app.watcher.Error:
// TODO: Do something here
- logger.Infoln("Watcher error:", err)
+ guilogger.Infoln("Watcher error:", err)
}
}
}()
@@ -121,12 +138,12 @@ func (app *HtmlApplication) Window() *qml.Window {
return app.win
}
-func (app *HtmlApplication) NewBlock(block *ethchain.Block) {
- b := &ethpipe.JSBlock{Number: int(block.BlockInfo().Number), Hash: ethutil.Bytes2Hex(block.Hash())}
+func (app *HtmlApplication) NewBlock(block *types.Block) {
+ b := &xeth.JSBlock{Number: int(block.BlockInfo().Number), Hash: ethutil.Bytes2Hex(block.Hash())}
app.webView.Call("onNewBlockCb", b)
}
-func (self *HtmlApplication) Messages(messages ethstate.Messages, id string) {
+func (self *HtmlApplication) Messages(messages state.Messages, id string) {
var msgs []javascript.JSMessage
for _, m := range messages {
msgs = append(msgs, javascript.NewJSMessage(m))
diff --git a/mist/main.go b/cmd/mist/main.go
index 6e4554352..eaf0af0c7 100644
--- a/mist/main.go
+++ b/cmd/mist/main.go
@@ -1,18 +1,37 @@
+// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This 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
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+// MA 02110-1301 USA
+
package main
import (
+ "fmt"
"os"
"runtime"
+ "time"
- "github.com/ethereum/eth-go"
- "github.com/ethereum/eth-go/ethlog"
- "github.com/ethereum/go-ethereum/utils"
+ "github.com/ethereum/go-ethereum"
+ "github.com/ethereum/go-ethereum/cmd/utils"
+ "github.com/ethereum/go-ethereum/logger"
"gopkg.in/qml.v1"
)
const (
ClientIdentifier = "Mist"
- Version = "0.6.7"
+ Version = "0.7.10"
)
var ethereum *eth.Ethereum
@@ -21,7 +40,8 @@ func run() error {
// precedence: code-internal flag default < config file < environment variables < command line
Init() // parsing command line
- config := utils.InitConfig(ConfigFile, Datadir, "ETH")
+ tstart := time.Now()
+ config := utils.InitConfig(VmType, ConfigFile, Datadir, "ETH")
utils.InitDataDir(Datadir)
@@ -34,14 +54,11 @@ func run() error {
os.Exit(1)
}
-
keyManager := utils.NewKeyManager(KeyStore, Datadir, db)
// create, import, export keys
utils.KeyTasks(keyManager, KeyRing, GenAddr, SecretFile, ExportDir, NonInteractive)
-
clientIdentity := utils.NewClientIdentity(ClientIdentifier, Version, Identifier)
-
ethereum = utils.NewEthereum(db, clientIdentity, keyManager, UseUPnP, OutboundPort, MaxPeer)
if ShowGenesis {
@@ -58,7 +75,10 @@ func run() error {
utils.RegisterInterrupt(func(os.Signal) {
gui.Stop()
})
- utils.StartEthereum(ethereum, UseSeed)
+ go utils.StartEthereum(ethereum, UseSeed)
+
+ fmt.Println("ETH stack took", time.Since(tstart))
+
// gui blocks the main thread
gui.Start(AssetPath)
@@ -80,6 +100,10 @@ func main() {
utils.HandleInterrupt()
+ if StartWebSockets {
+ utils.StartWebSockets(ethereum)
+ }
+
// we need to run the interrupt callbacks in case gui is closed
// this skips if we got here by actual interrupt stopping the GUI
if !interrupted {
@@ -87,5 +111,5 @@ func main() {
}
// this blocks the thread
ethereum.WaitForShutdown()
- ethlog.Flush()
+ logger.Flush()
}
diff --git a/cmd/mist/qml_container.go b/cmd/mist/qml_container.go
new file mode 100644
index 000000000..a0a46f9b1
--- /dev/null
+++ b/cmd/mist/qml_container.go
@@ -0,0 +1,85 @@
+// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This 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
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+// MA 02110-1301 USA
+
+package main
+
+import (
+ "fmt"
+ "runtime"
+
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/state"
+ "github.com/ethereum/go-ethereum/xeth"
+ "gopkg.in/qml.v1"
+)
+
+type QmlApplication struct {
+ win *qml.Window
+ engine *qml.Engine
+ lib *UiLib
+ path string
+}
+
+func NewQmlApplication(path string, lib *UiLib) *QmlApplication {
+ engine := qml.NewEngine()
+ return &QmlApplication{engine: engine, path: path, lib: lib}
+}
+
+func (app *QmlApplication) Create() error {
+ path := string(app.path)
+
+ // For some reason for windows we get /c:/path/to/something, windows doesn't like the first slash but is fine with the others so we are removing it
+ if app.path[0] == '/' && runtime.GOOS == "windows" {
+ path = app.path[1:]
+ }
+
+ component, err := app.engine.LoadFile(path)
+ if err != nil {
+ guilogger.Warnln(err)
+ }
+ app.win = component.CreateWindow(nil)
+
+ return nil
+}
+
+func (app *QmlApplication) Destroy() {
+ app.engine.Destroy()
+}
+
+func (app *QmlApplication) NewWatcher(quitChan chan bool) {
+}
+
+// Events
+func (app *QmlApplication) NewBlock(block *types.Block) {
+ pblock := &xeth.JSBlock{Number: int(block.BlockInfo().Number), Hash: ethutil.Bytes2Hex(block.Hash())}
+ app.win.Call("onNewBlockCb", pblock)
+}
+
+func (self *QmlApplication) Messages(msgs state.Messages, id string) {
+ fmt.Println("IMPLEMENT QML APPLICATION MESSAGES METHOD")
+}
+
+// Getters
+func (app *QmlApplication) Engine() *qml.Engine {
+ return app.engine
+}
+func (app *QmlApplication) Window() *qml.Window {
+ return app.win
+}
+
+func (app *QmlApplication) Post(data string, s int) {}
diff --git a/mist/ui_lib.go b/cmd/mist/ui_lib.go
index e77336c90..fdbde50fd 100644
--- a/mist/ui_lib.go
+++ b/cmd/mist/ui_lib.go
@@ -1,3 +1,20 @@
+// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This 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
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+// MA 02110-1301 USA
+
package main
import (
@@ -7,13 +24,16 @@ import (
"strconv"
"strings"
- "github.com/ethereum/eth-go"
- "github.com/ethereum/eth-go/ethchain"
- "github.com/ethereum/eth-go/ethcrypto"
- "github.com/ethereum/eth-go/ethpipe"
- "github.com/ethereum/eth-go/ethstate"
- "github.com/ethereum/eth-go/ethutil"
+ "github.com/ethereum/go-ethereum"
+ "github.com/ethereum/go-ethereum/core"
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/ethutil"
"github.com/ethereum/go-ethereum/javascript"
+ "github.com/ethereum/go-ethereum/miner"
+ "github.com/ethereum/go-ethereum/state"
+ "github.com/ethereum/go-ethereum/ui/qt"
+ "github.com/ethereum/go-ethereum/xeth"
"gopkg.in/qml.v1"
)
@@ -24,7 +44,7 @@ type memAddr struct {
// UI Library that has some basic functionality exposed
type UiLib struct {
- *ethpipe.JSPipe
+ *xeth.JSXEth
engine *qml.Engine
eth *eth.Ethereum
connected bool
@@ -37,21 +57,26 @@ type UiLib struct {
jsEngine *javascript.JSRE
filterCallbacks map[int][]int
+
+ miner *miner.Miner
}
func NewUiLib(engine *qml.Engine, eth *eth.Ethereum, assetPath string) *UiLib {
- return &UiLib{JSPipe: ethpipe.NewJSPipe(eth), engine: engine, eth: eth, assetPath: assetPath, jsEngine: javascript.NewJSRE(eth), filterCallbacks: make(map[int][]int)} //, filters: make(map[int]*ethpipe.JSFilter)}
+ lib := &UiLib{JSXEth: xeth.NewJSXEth(eth), engine: engine, eth: eth, assetPath: assetPath, jsEngine: javascript.NewJSRE(eth), filterCallbacks: make(map[int][]int)} //, filters: make(map[int]*xeth.JSFilter)}
+ lib.miner = miner.New(eth.KeyManager().Address(), eth)
+
+ return lib
}
func (self *UiLib) Notef(args []interface{}) {
- logger.Infoln(args...)
+ guilogger.Infoln(args...)
}
func (self *UiLib) LookupDomain(domain string) string {
world := self.World()
if len(domain) > 32 {
- domain = string(ethcrypto.Sha3Bin([]byte(domain)))
+ domain = string(crypto.Sha3([]byte(domain)))
}
data := world.Config().Get("DnsReg").StorageString(domain).Bytes()
@@ -102,8 +127,11 @@ func (self *UiLib) PastPeers() *ethutil.List {
}
func (self *UiLib) ImportTx(rlpTx string) {
- tx := ethchain.NewTransactionFromBytes(ethutil.Hex2Bytes(rlpTx))
- self.eth.TxPool().QueueTransaction(tx)
+ tx := types.NewTransactionFromBytes(ethutil.Hex2Bytes(rlpTx))
+ err := self.eth.TxPool().Add(tx)
+ if err != nil {
+ guilogger.Infoln("import tx failed ", err)
+ }
}
func (self *UiLib) EvalJavascriptFile(path string) {
@@ -140,7 +168,7 @@ func (ui *UiLib) OpenBrowser() {
func (ui *UiLib) Muted(content string) {
component, err := ui.engine.LoadFile(ui.AssetPath("qml/muted.qml"))
if err != nil {
- logger.Debugln(err)
+ guilogger.Debugln(err)
return
}
@@ -172,7 +200,7 @@ func (ui *UiLib) AssetPath(p string) string {
func (self *UiLib) StartDbWithContractAndData(contractHash, data string) {
dbWindow := NewDebuggerWindow(self)
- object := self.eth.StateManager().CurrentState().GetStateObject(ethutil.Hex2Bytes(contractHash))
+ object := self.eth.ChainManager().State().GetStateObject(ethutil.Hex2Bytes(contractHash))
if len(object.Code) > 0 {
dbWindow.SetCode("0x" + ethutil.Bytes2Hex(object.Code))
}
@@ -193,28 +221,32 @@ func (self *UiLib) StartDebugger() {
dbWindow.Show()
}
-func (self *UiLib) NewFilter(object map[string]interface{}) int {
- filter, id := self.eth.InstallFilter(object)
- filter.MessageCallback = func(messages ethstate.Messages) {
- self.win.Root().Call("invokeFilterCallback", ethpipe.ToJSMessages(messages), id)
+func (self *UiLib) NewFilter(object map[string]interface{}) (id int) {
+ filter := qt.NewFilterFromMap(object, self.eth)
+ filter.MessageCallback = func(messages state.Messages) {
+ self.win.Root().Call("invokeFilterCallback", xeth.ToJSMessages(messages), id)
}
-
+ id = self.eth.InstallFilter(filter)
return id
}
-func (self *UiLib) NewFilterString(typ string) int {
- filter, id := self.eth.InstallFilter(nil)
- filter.BlockCallback = func(block *ethchain.Block) {
- self.win.Root().Call("invokeFilterCallback", "{}", id)
+func (self *UiLib) NewFilterString(typ string) (id int) {
+ filter := core.NewFilter(self.eth)
+ filter.BlockCallback = func(block *types.Block) {
+ if self.win != nil && self.win.Root() != nil {
+ self.win.Root().Call("invokeFilterCallback", "{}", id)
+ } else {
+ fmt.Println("QML is lagging")
+ }
}
-
+ id = self.eth.InstallFilter(filter)
return id
}
func (self *UiLib) Messages(id int) *ethutil.List {
filter := self.eth.GetFilter(id)
if filter != nil {
- messages := ethpipe.ToJSMessages(filter.Find())
+ messages := xeth.ToJSMessages(filter.Find())
return messages
}
@@ -277,10 +309,10 @@ func mapToTxParams(object map[string]interface{}) map[string]string {
return conv
}
-func (self *UiLib) Transact(params map[string]interface{}) (*ethpipe.JSReceipt, error) {
+func (self *UiLib) Transact(params map[string]interface{}) (string, error) {
object := mapToTxParams(params)
- return self.JSPipe.Transact(
+ return self.JSXEth.Transact(
object["from"],
object["to"],
object["value"],
@@ -302,7 +334,7 @@ func (self *UiLib) Compile(code string) (string, error) {
func (self *UiLib) Call(params map[string]interface{}) (string, error) {
object := mapToTxParams(params)
- return self.JSPipe.Execute(
+ return self.JSXEth.Execute(
object["to"],
object["value"],
object["gas"],
@@ -310,3 +342,33 @@ func (self *UiLib) Call(params map[string]interface{}) (string, error) {
object["data"],
)
}
+
+func (self *UiLib) AddLocalTransaction(to, data, gas, gasPrice, value string) int {
+ return self.miner.AddLocalTx(&miner.LocalTx{
+ To: ethutil.Hex2Bytes(to),
+ Data: ethutil.Hex2Bytes(data),
+ Gas: gas,
+ GasPrice: gasPrice,
+ Value: value,
+ }) - 1
+}
+
+func (self *UiLib) RemoveLocalTransaction(id int) {
+ self.miner.RemoveLocalTx(id)
+}
+
+func (self *UiLib) SetGasPrice(price string) {
+ self.miner.MinAcceptedGasPrice = ethutil.Big(price)
+}
+
+func (self *UiLib) ToggleMining() bool {
+ if !self.miner.Mining() {
+ self.miner.Start()
+
+ return true
+ } else {
+ self.miner.Stop()
+
+ return false
+ }
+}
diff --git a/cmd/peerserver/main.go b/cmd/peerserver/main.go
new file mode 100644
index 000000000..0fa7a9b44
--- /dev/null
+++ b/cmd/peerserver/main.go
@@ -0,0 +1,40 @@
+package main
+
+import (
+ "crypto/elliptic"
+ "fmt"
+ "log"
+ "net"
+ "os"
+
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/logger"
+ "github.com/ethereum/go-ethereum/p2p"
+)
+
+func main() {
+ logger.AddLogSystem(logger.NewStdLogSystem(os.Stdout, log.LstdFlags, logger.InfoLevel))
+ key, _ := crypto.GenerateKey()
+ marshaled := elliptic.Marshal(crypto.S256(), key.PublicKey.X, key.PublicKey.Y)
+
+ srv := p2p.Server{
+ MaxPeers: 10,
+ Identity: p2p.NewSimpleClientIdentity("Ethereum(G)", "0.1", "Peer Server Two", string(marshaled)),
+ ListenAddr: ":30301",
+ NAT: p2p.UPNP(),
+ }
+ if err := srv.Start(); err != nil {
+ fmt.Println("could not start server:", err)
+ os.Exit(1)
+ }
+
+ // add seed peers
+ seed, err := net.ResolveTCPAddr("tcp", "poc-7.ethdev.com:30300")
+ if err != nil {
+ fmt.Println("couldn't resolve:", err)
+ os.Exit(1)
+ }
+ srv.SuggestPeer(seed.IP, seed.Port, nil)
+
+ select {}
+}
diff --git a/utils/cmd.go b/cmd/utils/cmd.go
index 700542cae..db7bcd35e 100644
--- a/utils/cmd.go
+++ b/cmd/utils/cmd.go
@@ -13,18 +13,18 @@ import (
"time"
"bitbucket.org/kardianos/osext"
- "github.com/ethereum/eth-go"
- "github.com/ethereum/eth-go/ethcrypto"
- "github.com/ethereum/eth-go/ethdb"
- "github.com/ethereum/eth-go/ethlog"
- "github.com/ethereum/eth-go/ethminer"
- "github.com/ethereum/eth-go/ethpipe"
- "github.com/ethereum/eth-go/ethrpc"
- "github.com/ethereum/eth-go/ethutil"
- "github.com/ethereum/eth-go/ethwire"
+ "github.com/ethereum/go-ethereum"
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/ethdb"
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/logger"
+ "github.com/ethereum/go-ethereum/miner"
+ "github.com/ethereum/go-ethereum/rpc"
+ "github.com/ethereum/go-ethereum/wire"
+ "github.com/ethereum/go-ethereum/xeth"
)
-var logger = ethlog.NewLogger("CLI")
+var clilogger = logger.NewLogger("CLI")
var interruptCallbacks = []func(os.Signal){}
// Register interrupt handlers callbacks
@@ -38,7 +38,7 @@ func HandleInterrupt() {
go func() {
signal.Notify(c, os.Interrupt)
for sig := range c {
- logger.Errorf("Shutting down (%v) ... \n", sig)
+ clilogger.Errorf("Shutting down (%v) ... \n", sig)
RunInterruptCallbacks(sig)
}
}()
@@ -100,7 +100,7 @@ func InitDataDir(Datadir string) {
}
}
-func InitLogging(Datadir string, LogFile string, LogLevel int, DebugFile string) ethlog.LogSystem {
+func InitLogging(Datadir string, LogFile string, LogLevel int, DebugFile string) logger.LogSystem {
var writer io.Writer
if LogFile == "" {
writer = os.Stdout
@@ -108,28 +108,31 @@ func InitLogging(Datadir string, LogFile string, LogLevel int, DebugFile string)
writer = openLogFile(Datadir, LogFile)
}
- sys := ethlog.NewStdLogSystem(writer, log.LstdFlags, ethlog.LogLevel(LogLevel))
- ethlog.AddLogSystem(sys)
+ sys := logger.NewStdLogSystem(writer, log.LstdFlags, logger.LogLevel(LogLevel))
+ logger.AddLogSystem(sys)
if DebugFile != "" {
writer = openLogFile(Datadir, DebugFile)
- ethlog.AddLogSystem(ethlog.NewStdLogSystem(writer, log.LstdFlags, ethlog.DebugLevel))
+ logger.AddLogSystem(logger.NewStdLogSystem(writer, log.LstdFlags, logger.DebugLevel))
}
return sys
}
-func InitConfig(ConfigFile string, Datadir string, EnvPrefix string) *ethutil.ConfigManager {
+func InitConfig(vmType int, ConfigFile string, Datadir string, EnvPrefix string) *ethutil.ConfigManager {
InitDataDir(Datadir)
- return ethutil.ReadConfig(ConfigFile, Datadir, EnvPrefix)
+ cfg := ethutil.ReadConfig(ConfigFile, Datadir, EnvPrefix)
+ cfg.VmType = vmType
+
+ return cfg
}
func exit(err error) {
status := 0
if err != nil {
- logger.Errorln("Fatal: ", err)
+ clilogger.Errorln("Fatal: ", err)
status = 1
}
- ethlog.Flush()
+ logger.Flush()
os.Exit(status)
}
@@ -141,15 +144,14 @@ func NewDatabase() ethutil.Database {
return db
}
-func NewClientIdentity(clientIdentifier, version, customIdentifier string) *ethwire.SimpleClientIdentity {
- logger.Infoln("identity created")
- return ethwire.NewSimpleClientIdentity(clientIdentifier, version, customIdentifier)
+func NewClientIdentity(clientIdentifier, version, customIdentifier string) *wire.SimpleClientIdentity {
+ return wire.NewSimpleClientIdentity(clientIdentifier, version, customIdentifier)
}
-func NewEthereum(db ethutil.Database, clientIdentity ethwire.ClientIdentity, keyManager *ethcrypto.KeyManager, usePnp bool, OutboundPort string, MaxPeer int) *eth.Ethereum {
+func NewEthereum(db ethutil.Database, clientIdentity wire.ClientIdentity, keyManager *crypto.KeyManager, usePnp bool, OutboundPort string, MaxPeer int) *eth.Ethereum {
ethereum, err := eth.New(db, clientIdentity, keyManager, eth.CapDefault, usePnp)
if err != nil {
- logger.Fatalln("eth start err:", err)
+ clilogger.Fatalln("eth start err:", err)
}
ethereum.Port = OutboundPort
ethereum.MaxPeers = MaxPeer
@@ -157,26 +159,26 @@ func NewEthereum(db ethutil.Database, clientIdentity ethwire.ClientIdentity, key
}
func StartEthereum(ethereum *eth.Ethereum, UseSeed bool) {
- logger.Infof("Starting %s", ethereum.ClientIdentity())
+ clilogger.Infof("Starting %s", ethereum.ClientIdentity())
ethereum.Start(UseSeed)
RegisterInterrupt(func(sig os.Signal) {
ethereum.Stop()
- ethlog.Flush()
+ logger.Flush()
})
}
func ShowGenesis(ethereum *eth.Ethereum) {
- logger.Infoln(ethereum.BlockChain().Genesis())
+ clilogger.Infoln(ethereum.ChainManager().Genesis())
exit(nil)
}
-func NewKeyManager(KeyStore string, Datadir string, db ethutil.Database) *ethcrypto.KeyManager {
- var keyManager *ethcrypto.KeyManager
+func NewKeyManager(KeyStore string, Datadir string, db ethutil.Database) *crypto.KeyManager {
+ var keyManager *crypto.KeyManager
switch {
case KeyStore == "db":
- keyManager = ethcrypto.NewDBKeyManager(db)
+ keyManager = crypto.NewDBKeyManager(db)
case KeyStore == "file":
- keyManager = ethcrypto.NewFileKeyManager(Datadir)
+ keyManager = crypto.NewFileKeyManager(Datadir)
default:
exit(fmt.Errorf("unknown keystore type: %s", KeyStore))
}
@@ -189,7 +191,7 @@ func DefaultAssetPath() string {
// assume a debug build and use the source directory as
// asset directory.
pwd, _ := os.Getwd()
- if pwd == path.Join(os.Getenv("GOPATH"), "src", "github.com", "ethereum", "go-ethereum", "mist") {
+ if pwd == path.Join(os.Getenv("GOPATH"), "src", "github.com", "ethereum", "go-ethereum", "cmd", "mist") {
assetPath = path.Join(pwd, "assets")
} else {
switch runtime.GOOS {
@@ -208,7 +210,7 @@ func DefaultAssetPath() string {
return assetPath
}
-func KeyTasks(keyManager *ethcrypto.KeyManager, KeyRing string, GenAddr bool, SecretFile string, ExportDir string, NonInteractive bool) {
+func KeyTasks(keyManager *crypto.KeyManager, KeyRing string, GenAddr bool, SecretFile string, ExportDir string, NonInteractive bool) {
var err error
switch {
@@ -237,22 +239,23 @@ func KeyTasks(keyManager *ethcrypto.KeyManager, KeyRing string, GenAddr bool, Se
exit(err)
}
}
+ clilogger.Infof("Main address %x\n", keyManager.Address())
}
func StartRpc(ethereum *eth.Ethereum, RpcPort int) {
var err error
- ethereum.RpcServer, err = ethrpc.NewJsonRpcServer(ethpipe.NewJSPipe(ethereum), RpcPort)
+ ethereum.RpcServer, err = rpc.NewJsonRpcServer(xeth.NewJSXEth(ethereum), RpcPort)
if err != nil {
- logger.Errorf("Could not start RPC interface (port %v): %v", RpcPort, err)
+ clilogger.Errorf("Could not start RPC interface (port %v): %v", RpcPort, err)
} else {
go ethereum.RpcServer.Start()
}
}
-var miner *ethminer.Miner
+var gminer *miner.Miner
-func GetMiner() *ethminer.Miner {
- return miner
+func GetMiner() *miner.Miner {
+ return gminer
}
func StartMining(ethereum *eth.Ethereum) bool {
@@ -261,16 +264,16 @@ func StartMining(ethereum *eth.Ethereum) bool {
addr := ethereum.KeyManager().Address()
go func() {
- logger.Infoln("Start mining")
- if miner == nil {
- miner = ethminer.NewDefaultMiner(addr, ethereum)
+ clilogger.Infoln("Start mining")
+ if gminer == nil {
+ gminer = miner.New(addr, ethereum)
}
// Give it some time to connect with peers
time.Sleep(3 * time.Second)
for !ethereum.IsUpToDate() {
time.Sleep(5 * time.Second)
}
- miner.Start()
+ gminer.Start()
}()
RegisterInterrupt(func(os.Signal) {
StopMining(ethereum)
@@ -294,9 +297,9 @@ func FormatTransactionData(data string) []byte {
}
func StopMining(ethereum *eth.Ethereum) bool {
- if ethereum.Mining && miner != nil {
- miner.Stop()
- logger.Infoln("Stopped mining")
+ if ethereum.Mining && gminer != nil {
+ gminer.Stop()
+ clilogger.Infoln("Stopped mining")
ethereum.Mining = false
return true
@@ -307,14 +310,14 @@ func StopMining(ethereum *eth.Ethereum) bool {
// Replay block
func BlockDo(ethereum *eth.Ethereum, hash []byte) error {
- block := ethereum.BlockChain().GetBlock(hash)
+ block := ethereum.ChainManager().GetBlock(hash)
if block == nil {
return fmt.Errorf("unknown block %x", hash)
}
- parent := ethereum.BlockChain().GetBlock(block.PrevHash)
+ parent := ethereum.ChainManager().GetBlock(block.PrevHash)
- _, err := ethereum.StateManager().ApplyDiff(parent.State(), parent, block)
+ _, err := ethereum.BlockManager().TransitionState(parent.State(), parent, block)
if err != nil {
return err
}
diff --git a/cmd/utils/vm_env.go b/cmd/utils/vm_env.go
new file mode 100644
index 000000000..461a797c2
--- /dev/null
+++ b/cmd/utils/vm_env.go
@@ -0,0 +1,70 @@
+package utils
+
+import (
+ "math/big"
+
+ "github.com/ethereum/go-ethereum/core"
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/state"
+ "github.com/ethereum/go-ethereum/vm"
+)
+
+type VMEnv struct {
+ state *state.StateDB
+ block *types.Block
+
+ transactor []byte
+ value *big.Int
+
+ depth int
+ Gas *big.Int
+}
+
+func NewEnv(state *state.StateDB, block *types.Block, transactor []byte, value *big.Int) *VMEnv {
+ return &VMEnv{
+ state: state,
+ block: block,
+ transactor: transactor,
+ value: value,
+ }
+}
+
+func (self *VMEnv) Origin() []byte { return self.transactor }
+func (self *VMEnv) BlockNumber() *big.Int { return self.block.Number }
+func (self *VMEnv) PrevHash() []byte { return self.block.PrevHash }
+func (self *VMEnv) Coinbase() []byte { return self.block.Coinbase }
+func (self *VMEnv) Time() int64 { return self.block.Time }
+func (self *VMEnv) Difficulty() *big.Int { return self.block.Difficulty }
+func (self *VMEnv) BlockHash() []byte { return self.block.Hash() }
+func (self *VMEnv) Value() *big.Int { return self.value }
+func (self *VMEnv) State() *state.StateDB { return self.state }
+func (self *VMEnv) GasLimit() *big.Int { return self.block.GasLimit }
+func (self *VMEnv) Depth() int { return self.depth }
+func (self *VMEnv) SetDepth(i int) { self.depth = i }
+func (self *VMEnv) AddLog(log state.Log) {
+ self.state.AddLog(log)
+}
+func (self *VMEnv) Transfer(from, to vm.Account, amount *big.Int) error {
+ return vm.Transfer(from, to, amount)
+}
+
+func (self *VMEnv) vm(addr, data []byte, gas, price, value *big.Int) *core.Execution {
+ return core.NewExecution(self, addr, data, gas, price, value)
+}
+
+func (self *VMEnv) Call(caller vm.ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error) {
+ exe := self.vm(addr, data, gas, price, value)
+ ret, err := exe.Call(addr, caller)
+ self.Gas = exe.Gas
+
+ return ret, err
+}
+func (self *VMEnv) CallCode(caller vm.ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error) {
+ exe := self.vm(caller.Address(), data, gas, price, value)
+ return exe.Call(addr, caller)
+}
+
+func (self *VMEnv) Create(caller vm.ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error, vm.ClosureRef) {
+ exe := self.vm(addr, data, gas, price, value)
+ return exe.Create(caller)
+}
diff --git a/utils/websockets.go b/cmd/utils/websockets.go
index e89331a98..d3ba50e78 100644
--- a/utils/websockets.go
+++ b/cmd/utils/websockets.go
@@ -1,10 +1,10 @@
package utils
import (
- "github.com/ethereum/eth-go"
- "github.com/ethereum/eth-go/ethpipe"
- "github.com/ethereum/eth-go/ethutil"
- "github.com/ethereum/eth-go/websocket"
+ "github.com/ethereum/go-ethereum"
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/websocket"
+ "github.com/ethereum/go-ethereum/xeth"
)
func args(v ...interface{}) []interface{} {
@@ -21,7 +21,7 @@ func NewWebSocketServer(eth *eth.Ethereum) *WebSocketServer {
}
func (self *WebSocketServer) Serv() {
- pipe := ethpipe.NewJSPipe(self.ethereum)
+ pipe := xeth.NewJSXEth(self.ethereum)
wsServ := websocket.NewServer("/eth", ":40404")
wsServ.MessageFunc(func(c *websocket.Client, msg *websocket.Message) {
diff --git a/compression/rle/read_write.go b/compression/rle/read_write.go
new file mode 100644
index 000000000..dde0e41ab
--- /dev/null
+++ b/compression/rle/read_write.go
@@ -0,0 +1,84 @@
+package rle
+
+import (
+ "bytes"
+ "errors"
+
+ "github.com/ethereum/go-ethereum/crypto"
+)
+
+const (
+ token byte = 0xfe
+ emptyShaToken = 0xfd
+ emptyListShaToken = 0xfe
+ tokenToken = 0xff
+)
+
+var empty = crypto.Sha3([]byte(""))
+var emptyList = crypto.Sha3([]byte{0x80})
+
+func Decompress(dat []byte) ([]byte, error) {
+ buf := new(bytes.Buffer)
+
+ for i := 0; i < len(dat); i++ {
+ if dat[i] == token {
+ if i+1 < len(dat) {
+ switch dat[i+1] {
+ case emptyShaToken:
+ buf.Write(empty)
+ case emptyListShaToken:
+ buf.Write(emptyList)
+ case tokenToken:
+ buf.WriteByte(token)
+ default:
+ buf.Write(make([]byte, int(dat[i+1]-2)))
+ }
+ i++
+ } else {
+ return nil, errors.New("error reading bytes. token encountered without proceeding bytes")
+ }
+ } else {
+ buf.WriteByte(dat[i])
+ }
+ }
+
+ return buf.Bytes(), nil
+}
+
+func compressChunk(dat []byte) (ret []byte, n int) {
+ switch {
+ case dat[0] == token:
+ return []byte{token, tokenToken}, 1
+ case len(dat) > 1 && dat[0] == 0x0 && dat[1] == 0x0:
+ j := 0
+ for j <= 254 && j < len(dat) {
+ if dat[j] != 0 {
+ break
+ }
+ j++
+ }
+ return []byte{token, byte(j + 2)}, j
+ case len(dat) >= 32:
+ if dat[0] == empty[0] && bytes.Compare(dat[:32], empty) == 0 {
+ return []byte{token, emptyShaToken}, 32
+ } else if dat[0] == emptyList[0] && bytes.Compare(dat[:32], emptyList) == 0 {
+ return []byte{token, emptyListShaToken}, 32
+ }
+ fallthrough
+ default:
+ return dat[:1], 1
+ }
+}
+
+func Compress(dat []byte) []byte {
+ buf := new(bytes.Buffer)
+
+ i := 0
+ for i < len(dat) {
+ b, n := compressChunk(dat[i:])
+ buf.Write(b)
+ i += n
+ }
+
+ return buf.Bytes()
+}
diff --git a/compression/rle/read_write_test.go b/compression/rle/read_write_test.go
new file mode 100644
index 000000000..e6aac9093
--- /dev/null
+++ b/compression/rle/read_write_test.go
@@ -0,0 +1,118 @@
+package rle
+
+import (
+ "testing"
+
+ checker "gopkg.in/check.v1"
+)
+
+func Test(t *testing.T) { checker.TestingT(t) }
+
+type CompressionRleSuite struct{}
+
+var _ = checker.Suite(&CompressionRleSuite{})
+
+func (s *CompressionRleSuite) TestDecompressSimple(c *checker.C) {
+ exp := []byte{0xc5, 0xd2, 0x46, 0x1, 0x86, 0xf7, 0x23, 0x3c, 0x92, 0x7e, 0x7d, 0xb2, 0xdc, 0xc7, 0x3, 0xc0, 0xe5, 0x0, 0xb6, 0x53, 0xca, 0x82, 0x27, 0x3b, 0x7b, 0xfa, 0xd8, 0x4, 0x5d, 0x85, 0xa4, 0x70}
+ res, err := Decompress([]byte{token, 0xfd})
+ c.Assert(err, checker.IsNil)
+ c.Assert(res, checker.DeepEquals, exp)
+ // if bytes.Compare(res, exp) != 0 {
+ // t.Error("empty sha3", res)
+ // }
+
+ exp = []byte{0x56, 0xe8, 0x1f, 0x17, 0x1b, 0xcc, 0x55, 0xa6, 0xff, 0x83, 0x45, 0xe6, 0x92, 0xc0, 0xf8, 0x6e, 0x5b, 0x48, 0xe0, 0x1b, 0x99, 0x6c, 0xad, 0xc0, 0x1, 0x62, 0x2f, 0xb5, 0xe3, 0x63, 0xb4, 0x21}
+ res, err = Decompress([]byte{token, 0xfe})
+ c.Assert(err, checker.IsNil)
+ c.Assert(res, checker.DeepEquals, exp)
+ // if bytes.Compare(res, exp) != 0 {
+ // t.Error("0x80 sha3", res)
+ // }
+
+ res, err = Decompress([]byte{token, 0xff})
+ c.Assert(err, checker.IsNil)
+ c.Assert(res, checker.DeepEquals, []byte{token})
+ // if bytes.Compare(res, []byte{token}) != 0 {
+ // t.Error("token", res)
+ // }
+
+ res, err = Decompress([]byte{token, 12})
+ c.Assert(err, checker.IsNil)
+ c.Assert(res, checker.DeepEquals, make([]byte, 10))
+ // if bytes.Compare(res, make([]byte, 10)) != 0 {
+ // t.Error("10 * zero", res)
+ // }
+}
+
+// func TestDecompressMulti(t *testing.T) {
+// res, err := Decompress([]byte{token, 0xfd, token, 0xfe, token, 12})
+// if err != nil {
+// t.Error(err)
+// }
+
+// var exp []byte
+// exp = append(exp, crypto.Sha3([]byte(""))...)
+// exp = append(exp, crypto.Sha3([]byte{0x80})...)
+// exp = append(exp, make([]byte, 10)...)
+
+// if bytes.Compare(res, res) != 0 {
+// t.Error("Expected", exp, "result", res)
+// }
+// }
+
+// func TestCompressSimple(t *testing.T) {
+// res := Compress([]byte{0, 0, 0, 0, 0})
+// if bytes.Compare(res, []byte{token, 7}) != 0 {
+// t.Error("5 * zero", res)
+// }
+
+// res = Compress(crypto.Sha3([]byte("")))
+// if bytes.Compare(res, []byte{token, emptyShaToken}) != 0 {
+// t.Error("empty sha", res)
+// }
+
+// res = Compress(crypto.Sha3([]byte{0x80}))
+// if bytes.Compare(res, []byte{token, emptyListShaToken}) != 0 {
+// t.Error("empty list sha", res)
+// }
+
+// res = Compress([]byte{token})
+// if bytes.Compare(res, []byte{token, tokenToken}) != 0 {
+// t.Error("token", res)
+// }
+// }
+
+// func TestCompressMulti(t *testing.T) {
+// in := []byte{0, 0, 0, 0, 0}
+// in = append(in, crypto.Sha3([]byte(""))...)
+// in = append(in, crypto.Sha3([]byte{0x80})...)
+// in = append(in, token)
+// res := Compress(in)
+
+// exp := []byte{token, 7, token, emptyShaToken, token, emptyListShaToken, token, tokenToken}
+// if bytes.Compare(res, exp) != 0 {
+// t.Error("expected", exp, "got", res)
+// }
+// }
+
+// func TestCompressDecompress(t *testing.T) {
+// var in []byte
+
+// for i := 0; i < 20; i++ {
+// in = append(in, []byte{0, 0, 0, 0, 0}...)
+// in = append(in, crypto.Sha3([]byte(""))...)
+// in = append(in, crypto.Sha3([]byte{0x80})...)
+// in = append(in, []byte{123, 2, 19, 89, 245, 254, 255, token, 98, 233}...)
+// in = append(in, token)
+// }
+
+// c := Compress(in)
+// d, err := Decompress(c)
+// if err != nil {
+// t.Error(err)
+// }
+
+// if bytes.Compare(d, in) != 0 {
+// t.Error("multi failed\n", d, "\n", in)
+// }
+// }
diff --git a/core/.gitignore b/core/.gitignore
new file mode 100644
index 000000000..f725d58d1
--- /dev/null
+++ b/core/.gitignore
@@ -0,0 +1,12 @@
+# See http://help.github.com/ignore-files/ for more about ignoring files.
+#
+# If you find yourself ignoring temporary files generated by your text editor
+# or operating system, you probably want to add a global ignore instead:
+# git config --global core.excludesfile ~/.gitignore_global
+
+/tmp
+*/**/*un~
+*un~
+.DS_Store
+*/**/.DS_Store
+
diff --git a/core/asm.go b/core/asm.go
new file mode 100644
index 000000000..a8b3023f4
--- /dev/null
+++ b/core/asm.go
@@ -0,0 +1,50 @@
+package core
+
+import (
+ "fmt"
+ "math/big"
+
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/vm"
+)
+
+func Disassemble(script []byte) (asm []string) {
+ pc := new(big.Int)
+ for {
+ if pc.Cmp(big.NewInt(int64(len(script)))) >= 0 {
+ return
+ }
+
+ // Get the memory location of pc
+ val := script[pc.Int64()]
+ // Get the opcode (it must be an opcode!)
+ op := vm.OpCode(val)
+
+ asm = append(asm, fmt.Sprintf("%04v: %v", pc, op))
+
+ switch op {
+ case vm.PUSH1, vm.PUSH2, vm.PUSH3, vm.PUSH4, vm.PUSH5, vm.PUSH6, vm.PUSH7, vm.PUSH8,
+ vm.PUSH9, vm.PUSH10, vm.PUSH11, vm.PUSH12, vm.PUSH13, vm.PUSH14, vm.PUSH15,
+ vm.PUSH16, vm.PUSH17, vm.PUSH18, vm.PUSH19, vm.PUSH20, vm.PUSH21, vm.PUSH22,
+ vm.PUSH23, vm.PUSH24, vm.PUSH25, vm.PUSH26, vm.PUSH27, vm.PUSH28, vm.PUSH29,
+ vm.PUSH30, vm.PUSH31, vm.PUSH32:
+ pc.Add(pc, ethutil.Big1)
+ a := int64(op) - int64(vm.PUSH1) + 1
+ if int(pc.Int64()+a) > len(script) {
+ return
+ }
+
+ data := script[pc.Int64() : pc.Int64()+a]
+ if len(data) == 0 {
+ data = []byte{0}
+ }
+ asm = append(asm, fmt.Sprintf("%04v: 0x%x", pc, data))
+
+ pc.Add(pc, big.NewInt(a-1))
+ }
+
+ pc.Add(pc, ethutil.Big1)
+ }
+
+ return asm
+}
diff --git a/core/block_manager.go b/core/block_manager.go
new file mode 100644
index 000000000..2567e39c4
--- /dev/null
+++ b/core/block_manager.go
@@ -0,0 +1,371 @@
+package core
+
+import (
+ "bytes"
+ "container/list"
+ "errors"
+ "fmt"
+ "math/big"
+ "sync"
+ "time"
+
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/event"
+ "github.com/ethereum/go-ethereum/logger"
+ "github.com/ethereum/go-ethereum/pow"
+ "github.com/ethereum/go-ethereum/pow/ezp"
+ "github.com/ethereum/go-ethereum/state"
+ "github.com/ethereum/go-ethereum/wire"
+)
+
+var statelogger = logger.NewLogger("BLOCK")
+
+type Peer interface {
+ Inbound() bool
+ LastSend() time.Time
+ LastPong() int64
+ Host() []byte
+ Port() uint16
+ Version() string
+ PingTime() string
+ Connected() *int32
+ Caps() *ethutil.Value
+}
+
+type EthManager interface {
+ BlockManager() *BlockManager
+ ChainManager() *ChainManager
+ TxPool() *TxPool
+ Broadcast(msgType wire.MsgType, data []interface{})
+ PeerCount() int
+ IsMining() bool
+ IsListening() bool
+ Peers() *list.List
+ KeyManager() *crypto.KeyManager
+ ClientIdentity() wire.ClientIdentity
+ Db() ethutil.Database
+ EventMux() *event.TypeMux
+}
+
+type BlockManager struct {
+ // Mutex for locking the block processor. Blocks can only be handled one at a time
+ mutex sync.Mutex
+ // Canonical block chain
+ bc *ChainManager
+ // non-persistent key/value memory storage
+ mem map[string]*big.Int
+ // Proof of work used for validating
+ Pow pow.PoW
+
+ txpool *TxPool
+
+ // The last attempted block is mainly used for debugging purposes
+ // This does not have to be a valid block and will be set during
+ // 'Process' & canonical validation.
+ lastAttemptedBlock *types.Block
+
+ events event.Subscription
+
+ eventMux *event.TypeMux
+}
+
+func NewBlockManager(txpool *TxPool, chainManager *ChainManager, eventMux *event.TypeMux) *BlockManager {
+ sm := &BlockManager{
+ mem: make(map[string]*big.Int),
+ Pow: ezp.New(),
+ bc: chainManager,
+ eventMux: eventMux,
+ txpool: txpool,
+ }
+
+ return sm
+}
+
+func (sm *BlockManager) TransitionState(statedb *state.StateDB, parent, block *types.Block) (receipts types.Receipts, err error) {
+ coinbase := statedb.GetOrNewStateObject(block.Coinbase)
+ coinbase.SetGasPool(block.CalcGasLimit(parent))
+
+ // Process the transactions on to current block
+ receipts, _, _, _, err = sm.ApplyTransactions(coinbase, statedb, block, block.Transactions(), false)
+ if err != nil {
+ return nil, err
+ }
+
+ return receipts, nil
+}
+
+func (self *BlockManager) ApplyTransactions(coinbase *state.StateObject, state *state.StateDB, block *types.Block, txs types.Transactions, transientProcess bool) (types.Receipts, types.Transactions, types.Transactions, types.Transactions, error) {
+ var (
+ receipts types.Receipts
+ handled, unhandled types.Transactions
+ erroneous types.Transactions
+ totalUsedGas = big.NewInt(0)
+ err error
+ cumulativeSum = new(big.Int)
+ )
+
+done:
+ for i, tx := range txs {
+ // If we are mining this block and validating we want to set the logs back to 0
+ state.EmptyLogs()
+
+ txGas := new(big.Int).Set(tx.Gas())
+
+ cb := state.GetStateObject(coinbase.Address())
+ st := NewStateTransition(cb, tx, state, block)
+ _, err = st.TransitionState()
+ if err != nil {
+ switch {
+ case IsNonceErr(err):
+ err = nil // ignore error
+ continue
+ case IsGasLimitErr(err):
+ unhandled = txs[i:]
+
+ break done
+ default:
+ statelogger.Infoln(err)
+ erroneous = append(erroneous, tx)
+ err = nil
+ }
+ }
+
+ txGas.Sub(txGas, st.gas)
+ cumulativeSum.Add(cumulativeSum, new(big.Int).Mul(txGas, tx.GasPrice()))
+
+ // Update the state with pending changes
+ state.Update(txGas)
+
+ cumulative := new(big.Int).Set(totalUsedGas.Add(totalUsedGas, txGas))
+ receipt := types.NewReceipt(state.Root(), cumulative)
+ receipt.SetLogs(state.Logs())
+ receipt.Bloom = types.CreateBloom(types.Receipts{receipt})
+ chainlogger.Debugln(receipt)
+
+ // Notify all subscribers
+ if !transientProcess {
+ go self.eventMux.Post(TxPostEvent{tx})
+ }
+
+ receipts = append(receipts, receipt)
+ handled = append(handled, tx)
+
+ if ethutil.Config.Diff && ethutil.Config.DiffType == "all" {
+ state.CreateOutputForDiff()
+ }
+ }
+
+ block.Reward = cumulativeSum
+ block.GasUsed = totalUsedGas
+
+ return receipts, handled, unhandled, erroneous, err
+}
+
+func (sm *BlockManager) Process(block *types.Block) (td *big.Int, msgs state.Messages, err error) {
+ // Processing a blocks may never happen simultaneously
+ sm.mutex.Lock()
+ defer sm.mutex.Unlock()
+
+ if sm.bc.HasBlock(block.Hash()) {
+ return nil, nil, &KnownBlockError{block.Number, block.Hash()}
+ }
+
+ if !sm.bc.HasBlock(block.PrevHash) {
+ return nil, nil, ParentError(block.PrevHash)
+ }
+ parent := sm.bc.GetBlock(block.PrevHash)
+
+ return sm.ProcessWithParent(block, parent)
+}
+
+func (sm *BlockManager) ProcessWithParent(block, parent *types.Block) (td *big.Int, messages state.Messages, err error) {
+ sm.lastAttemptedBlock = block
+
+ state := parent.State().Copy()
+
+ // Defer the Undo on the Trie. If the block processing happened
+ // we don't want to undo but since undo only happens on dirty
+ // nodes this won't happen because Commit would have been called
+ // before that.
+ defer state.Reset()
+
+ // Block validation
+ if err = sm.ValidateBlock(block, parent); err != nil {
+ return
+ }
+
+ receipts, err := sm.TransitionState(state, parent, block)
+ if err != nil {
+ return
+ }
+
+ rbloom := types.CreateBloom(receipts)
+ if bytes.Compare(rbloom, block.LogsBloom) != 0 {
+ err = fmt.Errorf("unable to replicate block's bloom=%x", rbloom)
+ return
+ }
+
+ txSha := types.DeriveSha(block.Transactions())
+ if bytes.Compare(txSha, block.TxSha) != 0 {
+ err = fmt.Errorf("validating transaction root. received=%x got=%x", block.TxSha, txSha)
+ return
+ }
+
+ receiptSha := types.DeriveSha(receipts)
+ if bytes.Compare(receiptSha, block.ReceiptSha) != 0 {
+ //chainlogger.Debugf("validating receipt root. received=%x got=%x", block.ReceiptSha, receiptSha)
+ fmt.Printf("%x\n", ethutil.Encode(receipts))
+ err = fmt.Errorf("validating receipt root. received=%x got=%x", block.ReceiptSha, receiptSha)
+ return
+ }
+
+ if err = sm.AccumelateRewards(state, block, parent); err != nil {
+ return
+ }
+
+ state.Update(ethutil.Big0)
+
+ if !block.State().Cmp(state) {
+ err = fmt.Errorf("invalid merkle root. received=%x got=%x", block.Root(), state.Root())
+ return
+ }
+
+ // Calculate the new total difficulty and sync back to the db
+ if td, ok := sm.CalculateTD(block); ok {
+ // Sync the current block's state to the database and cancelling out the deferred Undo
+ state.Sync()
+
+ messages := state.Manifest().Messages
+ state.Manifest().Reset()
+
+ chainlogger.Infof("Processed block #%d (%x...)\n", block.Number, block.Hash()[0:4])
+
+ sm.txpool.RemoveSet(block.Transactions())
+
+ return td, messages, nil
+ } else {
+ return nil, nil, errors.New("total diff failed")
+ }
+}
+
+func (sm *BlockManager) CalculateTD(block *types.Block) (*big.Int, bool) {
+ uncleDiff := new(big.Int)
+ for _, uncle := range block.Uncles {
+ uncleDiff = uncleDiff.Add(uncleDiff, uncle.Difficulty)
+ }
+
+ // TD(genesis_block) = 0 and TD(B) = TD(B.parent) + sum(u.difficulty for u in B.uncles) + B.difficulty
+ td := new(big.Int)
+ td = td.Add(sm.bc.Td(), uncleDiff)
+ td = td.Add(td, block.Difficulty)
+
+ // The new TD will only be accepted if the new difficulty is
+ // is greater than the previous.
+ if td.Cmp(sm.bc.Td()) > 0 {
+ return td, true
+ }
+
+ return nil, false
+}
+
+// Validates the current block. Returns an error if the block was invalid,
+// an uncle or anything that isn't on the current block chain.
+// Validation validates easy over difficult (dagger takes longer time = difficult)
+func (sm *BlockManager) ValidateBlock(block, parent *types.Block) error {
+ expd := CalcDifficulty(block, parent)
+ if expd.Cmp(block.Difficulty) < 0 {
+ return fmt.Errorf("Difficulty check failed for block %v, %v", block.Difficulty, expd)
+ }
+
+ diff := block.Time - parent.Time
+ if diff < 0 {
+ return ValidationError("Block timestamp less then prev block %v (%v - %v)", diff, block.Time, sm.bc.CurrentBlock().Time)
+ }
+
+ /* XXX
+ // New blocks must be within the 15 minute range of the last block.
+ if diff > int64(15*time.Minute) {
+ return ValidationError("Block is too far in the future of last block (> 15 minutes)")
+ }
+ */
+
+ // Verify the nonce of the block. Return an error if it's not valid
+ if !sm.Pow.Verify(block /*block.HashNoNonce(), block.Difficulty, block.Nonce*/) {
+ return ValidationError("Block's nonce is invalid (= %v)", ethutil.Bytes2Hex(block.Nonce))
+ }
+
+ return nil
+}
+
+func (sm *BlockManager) AccumelateRewards(statedb *state.StateDB, block, parent *types.Block) error {
+ reward := new(big.Int).Set(BlockReward)
+
+ knownUncles := ethutil.Set(parent.Uncles)
+ nonces := ethutil.NewSet(block.Nonce)
+ for _, uncle := range block.Uncles {
+ if nonces.Include(uncle.Nonce) {
+ // Error not unique
+ return UncleError("Uncle not unique")
+ }
+
+ uncleParent := sm.bc.GetBlock(uncle.PrevHash)
+ if uncleParent == nil {
+ return UncleError(fmt.Sprintf("Uncle's parent unknown (%x)", uncle.PrevHash[0:4]))
+ }
+
+ if uncleParent.Number.Cmp(new(big.Int).Sub(parent.Number, big.NewInt(6))) < 0 {
+ return UncleError("Uncle too old")
+ }
+
+ if knownUncles.Include(uncle.Hash()) {
+ return UncleError("Uncle in chain")
+ }
+
+ nonces.Insert(uncle.Nonce)
+
+ r := new(big.Int)
+ r.Mul(BlockReward, big.NewInt(15)).Div(r, big.NewInt(16))
+
+ uncleAccount := statedb.GetAccount(uncle.Coinbase)
+ uncleAccount.AddAmount(r)
+
+ reward.Add(reward, new(big.Int).Div(BlockReward, big.NewInt(32)))
+ }
+
+ // Get the account associated with the coinbase
+ account := statedb.GetAccount(block.Coinbase)
+ // Reward amount of ether to the coinbase address
+ account.AddAmount(reward)
+
+ statedb.Manifest().AddMessage(&state.Message{
+ To: block.Coinbase,
+ Input: nil,
+ Origin: nil,
+ Block: block.Hash(), Timestamp: block.Time, Coinbase: block.Coinbase, Number: block.Number,
+ Value: new(big.Int).Add(reward, block.Reward),
+ })
+
+ return nil
+}
+
+func (sm *BlockManager) GetMessages(block *types.Block) (messages []*state.Message, err error) {
+ if !sm.bc.HasBlock(block.PrevHash) {
+ return nil, ParentError(block.PrevHash)
+ }
+
+ sm.lastAttemptedBlock = block
+
+ var (
+ parent = sm.bc.GetBlock(block.PrevHash)
+ state = parent.State().Copy()
+ )
+
+ defer state.Reset()
+
+ sm.TransitionState(state, parent, block)
+ sm.AccumelateRewards(state, block, parent)
+
+ return state.Manifest().Messages, nil
+}
diff --git a/core/chain_manager.go b/core/chain_manager.go
new file mode 100644
index 000000000..794ae0011
--- /dev/null
+++ b/core/chain_manager.go
@@ -0,0 +1,355 @@
+package core
+
+import (
+ "fmt"
+ "math/big"
+ "sync"
+
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/event"
+ "github.com/ethereum/go-ethereum/logger"
+ "github.com/ethereum/go-ethereum/state"
+)
+
+var chainlogger = logger.NewLogger("CHAIN")
+
+func AddTestNetFunds(block *types.Block) {
+ for _, addr := range []string{
+ "51ba59315b3a95761d0863b05ccc7a7f54703d99",
+ "e4157b34ea9615cfbde6b4fda419828124b70c78",
+ "b9c015918bdaba24b4ff057a92a3873d6eb201be",
+ "6c386a4b26f73c802f34673f7248bb118f97424a",
+ "cd2a3d9f938e13cd947ec05abc7fe734df8dd826",
+ "2ef47100e0787b915105fd5e3f4ff6752079d5cb",
+ "e6716f9544a56c530d868e4bfbacb172315bdead",
+ "1a26338f0d905e295fccb71fa9ea849ffa12aaf4",
+ } {
+ codedAddr := ethutil.Hex2Bytes(addr)
+ account := block.State().GetAccount(codedAddr)
+ account.SetBalance(ethutil.Big("1606938044258990275541962092341162602522202993782792835301376")) //ethutil.BigPow(2, 200)
+ block.State().UpdateStateObject(account)
+ }
+}
+
+func CalcDifficulty(block, parent *types.Block) *big.Int {
+ diff := new(big.Int)
+
+ adjust := new(big.Int).Rsh(parent.Difficulty, 10)
+ if block.Time >= parent.Time+5 {
+ diff.Sub(parent.Difficulty, adjust)
+ } else {
+ diff.Add(parent.Difficulty, adjust)
+ }
+
+ return diff
+}
+
+type ChainManager struct {
+ //eth EthManager
+ processor types.BlockProcessor
+ eventMux *event.TypeMux
+ genesisBlock *types.Block
+ // Last known total difficulty
+ mu sync.RWMutex
+ td *big.Int
+ lastBlockNumber uint64
+ currentBlock *types.Block
+ lastBlockHash []byte
+
+ transState *state.StateDB
+}
+
+func (self *ChainManager) Td() *big.Int {
+ self.mu.RLock()
+ defer self.mu.RUnlock()
+
+ return self.td
+}
+
+func (self *ChainManager) LastBlockNumber() uint64 {
+ self.mu.RLock()
+ defer self.mu.RUnlock()
+
+ return self.lastBlockNumber
+}
+
+func (self *ChainManager) LastBlockHash() []byte {
+ self.mu.RLock()
+ defer self.mu.RUnlock()
+
+ return self.lastBlockHash
+}
+
+func (self *ChainManager) CurrentBlock() *types.Block {
+ self.mu.RLock()
+ defer self.mu.RUnlock()
+
+ return self.currentBlock
+}
+
+func NewChainManager(mux *event.TypeMux) *ChainManager {
+ bc := &ChainManager{}
+ bc.genesisBlock = types.NewBlockFromBytes(ethutil.Encode(Genesis))
+ bc.eventMux = mux
+
+ bc.setLastBlock()
+
+ bc.transState = bc.State().Copy()
+
+ return bc
+}
+
+func (self *ChainManager) SetProcessor(proc types.BlockProcessor) {
+ self.processor = proc
+}
+
+func (self *ChainManager) State() *state.StateDB {
+ return self.CurrentBlock().State()
+}
+
+func (self *ChainManager) TransState() *state.StateDB {
+ return self.transState
+}
+
+func (bc *ChainManager) setLastBlock() {
+ data, _ := ethutil.Config.Db.Get([]byte("LastBlock"))
+ if len(data) != 0 {
+ // Prep genesis
+ AddTestNetFunds(bc.genesisBlock)
+
+ block := types.NewBlockFromBytes(data)
+ bc.currentBlock = block
+ bc.lastBlockHash = block.Hash()
+ bc.lastBlockNumber = block.Number.Uint64()
+
+ // Set the last know difficulty (might be 0x0 as initial value, Genesis)
+ bc.td = ethutil.BigD(ethutil.Config.Db.LastKnownTD())
+ } else {
+ bc.Reset()
+ }
+
+ chainlogger.Infof("Last block (#%d) %x\n", bc.lastBlockNumber, bc.currentBlock.Hash())
+}
+
+// Block creation & chain handling
+func (bc *ChainManager) NewBlock(coinbase []byte) *types.Block {
+ bc.mu.RLock()
+ defer bc.mu.RUnlock()
+
+ var root interface{}
+ hash := ZeroHash256
+
+ if bc.CurrentBlock != nil {
+ root = bc.currentBlock.Root()
+ hash = bc.lastBlockHash
+ }
+
+ block := types.CreateBlock(
+ root,
+ hash,
+ coinbase,
+ ethutil.BigPow(2, 32),
+ nil,
+ "")
+
+ parent := bc.currentBlock
+ if parent != nil {
+ block.Difficulty = CalcDifficulty(block, parent)
+ block.Number = new(big.Int).Add(bc.currentBlock.Number, ethutil.Big1)
+ block.GasLimit = block.CalcGasLimit(bc.currentBlock)
+
+ }
+
+ return block
+}
+
+func (bc *ChainManager) Reset() {
+ bc.mu.Lock()
+ defer bc.mu.Unlock()
+
+ AddTestNetFunds(bc.genesisBlock)
+
+ bc.genesisBlock.Trie().Sync()
+ // Prepare the genesis block
+ bc.write(bc.genesisBlock)
+ bc.insert(bc.genesisBlock)
+ bc.currentBlock = bc.genesisBlock
+
+ bc.setTotalDifficulty(ethutil.Big("0"))
+
+ // Set the last know difficulty (might be 0x0 as initial value, Genesis)
+ bc.td = ethutil.BigD(ethutil.Config.Db.LastKnownTD())
+}
+
+func (self *ChainManager) Export() []byte {
+ self.mu.RLock()
+ defer self.mu.RUnlock()
+
+ chainlogger.Infof("exporting %v blocks...\n", self.currentBlock.Number)
+
+ blocks := make([]*types.Block, int(self.currentBlock.Number.Int64())+1)
+ for block := self.currentBlock; block != nil; block = self.GetBlock(block.PrevHash) {
+ blocks[block.Number.Int64()] = block
+ }
+
+ return ethutil.Encode(blocks)
+}
+
+func (bc *ChainManager) insert(block *types.Block) {
+ encodedBlock := block.RlpEncode()
+ ethutil.Config.Db.Put([]byte("LastBlock"), encodedBlock)
+ bc.currentBlock = block
+ bc.lastBlockHash = block.Hash()
+}
+
+func (bc *ChainManager) write(block *types.Block) {
+ bc.writeBlockInfo(block)
+
+ encodedBlock := block.RlpEncode()
+ ethutil.Config.Db.Put(block.Hash(), encodedBlock)
+}
+
+// Accessors
+func (bc *ChainManager) Genesis() *types.Block {
+ return bc.genesisBlock
+}
+
+// Block fetching methods
+func (bc *ChainManager) HasBlock(hash []byte) bool {
+ data, _ := ethutil.Config.Db.Get(hash)
+ return len(data) != 0
+}
+
+func (self *ChainManager) GetChainHashesFromHash(hash []byte, max uint64) (chain [][]byte) {
+ block := self.GetBlock(hash)
+ if block == nil {
+ return
+ }
+
+ // XXX Could be optimised by using a different database which only holds hashes (i.e., linked list)
+ for i := uint64(0); i < max; i++ {
+ chain = append(chain, block.Hash())
+
+ if block.Number.Cmp(ethutil.Big0) <= 0 {
+ break
+ }
+
+ block = self.GetBlock(block.PrevHash)
+ }
+
+ return
+}
+
+func (self *ChainManager) GetBlock(hash []byte) *types.Block {
+ data, _ := ethutil.Config.Db.Get(hash)
+ if len(data) == 0 {
+ return nil
+ }
+
+ return types.NewBlockFromBytes(data)
+}
+
+func (self *ChainManager) GetBlockByNumber(num uint64) *types.Block {
+ self.mu.RLock()
+ defer self.mu.RUnlock()
+
+ block := self.currentBlock
+ for ; block != nil; block = self.GetBlock(block.PrevHash) {
+ if block.Number.Uint64() == num {
+ break
+ }
+ }
+
+ if block != nil && block.Number.Uint64() == 0 && num != 0 {
+ return nil
+ }
+
+ return block
+}
+
+func (bc *ChainManager) setTotalDifficulty(td *big.Int) {
+ ethutil.Config.Db.Put([]byte("LTD"), td.Bytes())
+ bc.td = td
+}
+
+func (self *ChainManager) CalcTotalDiff(block *types.Block) (*big.Int, error) {
+ parent := self.GetBlock(block.PrevHash)
+ if parent == nil {
+ return nil, fmt.Errorf("Unable to calculate total diff without known parent %x", block.PrevHash)
+ }
+
+ parentTd := parent.BlockInfo().TD
+
+ uncleDiff := new(big.Int)
+ for _, uncle := range block.Uncles {
+ uncleDiff = uncleDiff.Add(uncleDiff, uncle.Difficulty)
+ }
+
+ td := new(big.Int)
+ td = td.Add(parentTd, uncleDiff)
+ td = td.Add(td, block.Difficulty)
+
+ return td, nil
+}
+
+func (bc *ChainManager) BlockInfo(block *types.Block) types.BlockInfo {
+ bi := types.BlockInfo{}
+ data, _ := ethutil.Config.Db.Get(append(block.Hash(), []byte("Info")...))
+ bi.RlpDecode(data)
+
+ return bi
+}
+
+// Unexported method for writing extra non-essential block info to the db
+func (bc *ChainManager) writeBlockInfo(block *types.Block) {
+ bc.lastBlockNumber++
+ bi := types.BlockInfo{Number: bc.lastBlockNumber, Hash: block.Hash(), Parent: block.PrevHash, TD: bc.td}
+
+ // For now we use the block hash with the words "info" appended as key
+ ethutil.Config.Db.Put(append(block.Hash(), []byte("Info")...), bi.RlpEncode())
+}
+
+func (bc *ChainManager) Stop() {
+ if bc.CurrentBlock != nil {
+ chainlogger.Infoln("Stopped")
+ }
+}
+
+func (self *ChainManager) InsertChain(chain types.Blocks) error {
+ for _, block := range chain {
+ td, messages, err := self.processor.Process(block)
+ if err != nil {
+ if IsKnownBlockErr(err) {
+ continue
+ }
+
+ chainlogger.Infof("block #%v process failed (%x)\n", block.Number, block.Hash()[:4])
+ chainlogger.Infoln(block)
+ chainlogger.Infoln(err)
+ return err
+ }
+
+ self.mu.Lock()
+ {
+
+ self.write(block)
+ if td.Cmp(self.td) > 0 {
+ if block.Number.Cmp(new(big.Int).Add(self.currentBlock.Number, ethutil.Big1)) < 0 {
+ chainlogger.Infof("Split detected. New head #%v (%x), was #%v (%x)\n", block.Number, block.Hash()[:4], self.currentBlock.Number, self.currentBlock.Hash()[:4])
+ }
+
+ self.setTotalDifficulty(td)
+ self.insert(block)
+ self.transState = self.currentBlock.State().Copy()
+ }
+
+ }
+ self.mu.Unlock()
+
+ self.eventMux.Post(NewBlockEvent{block})
+ self.eventMux.Post(messages)
+ }
+
+ return nil
+}
diff --git a/core/chain_manager_test.go b/core/chain_manager_test.go
new file mode 100644
index 000000000..52be8b0ea
--- /dev/null
+++ b/core/chain_manager_test.go
@@ -0,0 +1,77 @@
+package core
+
+import (
+ "fmt"
+ "path"
+ "runtime"
+ "testing"
+
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/ethdb"
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/event"
+ //logpkg "github.com/ethereum/go-ethereum/logger"
+)
+
+//var Logger logpkg.LogSystem
+//var Log = logpkg.NewLogger("TEST")
+
+func init() {
+ runtime.GOMAXPROCS(runtime.NumCPU())
+ //Logger = logpkg.NewStdLogSystem(os.Stdout, log.LstdFlags, logpkg.InfoLevel)
+ //logpkg.AddLogSystem(Logger)
+
+ ethutil.ReadConfig("/tmp/ethtest", "/tmp/ethtest", "ETH")
+
+ db, err := ethdb.NewMemDatabase()
+ if err != nil {
+ panic("Could not create mem-db, failing")
+ }
+ ethutil.Config.Db = db
+}
+
+func loadChain(fn string, t *testing.T) types.Blocks {
+ c1, err := ethutil.ReadAllFile(path.Join("..", "_data", fn))
+ if err != nil {
+ fmt.Println(err)
+ t.FailNow()
+ }
+ value := ethutil.NewValueFromBytes([]byte(c1))
+ blocks := make(types.Blocks, value.Len())
+ it := value.NewIterator()
+ for it.Next() {
+ blocks[it.Idx()] = types.NewBlockFromRlpValue(it.Value())
+ }
+
+ return blocks
+}
+
+func insertChain(done chan bool, chainMan *ChainManager, chain types.Blocks, t *testing.T) {
+ err := chainMan.InsertChain(chain)
+ if err != nil {
+ fmt.Println(err)
+ t.FailNow()
+ }
+ done <- true
+}
+
+func TestChainInsertions(t *testing.T) {
+ chain1 := loadChain("chain1", t)
+ chain2 := loadChain("chain2", t)
+ var eventMux event.TypeMux
+ chainMan := NewChainManager(&eventMux)
+ txPool := NewTxPool(chainMan, nil, &eventMux)
+ blockMan := NewBlockManager(txPool, chainMan, &eventMux)
+ chainMan.SetProcessor(blockMan)
+
+ const max = 2
+ done := make(chan bool, max)
+
+ go insertChain(done, chainMan, chain1, t)
+ go insertChain(done, chainMan, chain2, t)
+
+ for i := 0; i < max; i++ {
+ <-done
+ }
+ fmt.Println(chainMan.CurrentBlock())
+}
diff --git a/core/dagger.go b/core/dagger.go
new file mode 100644
index 000000000..3039d8995
--- /dev/null
+++ b/core/dagger.go
@@ -0,0 +1,160 @@
+package core
+
+import (
+ "hash"
+ "math/big"
+ "math/rand"
+ "time"
+
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/logger"
+ "github.com/obscuren/sha3"
+)
+
+var powlogger = logger.NewLogger("POW")
+
+type Dagger struct {
+ hash *big.Int
+ xn *big.Int
+}
+
+var Found bool
+
+func (dag *Dagger) Find(obj *big.Int, resChan chan int64) {
+ r := rand.New(rand.NewSource(time.Now().UnixNano()))
+
+ for i := 0; i < 1000; i++ {
+ rnd := r.Int63()
+
+ res := dag.Eval(big.NewInt(rnd))
+ powlogger.Infof("rnd %v\nres %v\nobj %v\n", rnd, res, obj)
+ if res.Cmp(obj) < 0 {
+ // Post back result on the channel
+ resChan <- rnd
+ // Notify other threads we've found a valid nonce
+ Found = true
+ }
+
+ // Break out if found
+ if Found {
+ break
+ }
+ }
+
+ resChan <- 0
+}
+
+func (dag *Dagger) Search(hash, diff *big.Int) *big.Int {
+ // TODO fix multi threading. Somehow it results in the wrong nonce
+ amountOfRoutines := 1
+
+ dag.hash = hash
+
+ obj := ethutil.BigPow(2, 256)
+ obj = obj.Div(obj, diff)
+
+ Found = false
+ resChan := make(chan int64, 3)
+ var res int64
+
+ for k := 0; k < amountOfRoutines; k++ {
+ go dag.Find(obj, resChan)
+
+ // Wait for each go routine to finish
+ }
+ for k := 0; k < amountOfRoutines; k++ {
+ // Get the result from the channel. 0 = quit
+ if r := <-resChan; r != 0 {
+ res = r
+ }
+ }
+
+ return big.NewInt(res)
+}
+
+func (dag *Dagger) Verify(hash, diff, nonce *big.Int) bool {
+ dag.hash = hash
+
+ obj := ethutil.BigPow(2, 256)
+ obj = obj.Div(obj, diff)
+
+ return dag.Eval(nonce).Cmp(obj) < 0
+}
+
+func DaggerVerify(hash, diff, nonce *big.Int) bool {
+ dagger := &Dagger{}
+ dagger.hash = hash
+
+ obj := ethutil.BigPow(2, 256)
+ obj = obj.Div(obj, diff)
+
+ return dagger.Eval(nonce).Cmp(obj) < 0
+}
+
+func (dag *Dagger) Node(L uint64, i uint64) *big.Int {
+ if L == i {
+ return dag.hash
+ }
+
+ var m *big.Int
+ if L == 9 {
+ m = big.NewInt(16)
+ } else {
+ m = big.NewInt(3)
+ }
+
+ sha := sha3.NewKeccak256()
+ sha.Reset()
+ d := sha3.NewKeccak256()
+ b := new(big.Int)
+ ret := new(big.Int)
+
+ for k := 0; k < int(m.Uint64()); k++ {
+ d.Reset()
+ d.Write(dag.hash.Bytes())
+ d.Write(dag.xn.Bytes())
+ d.Write(big.NewInt(int64(L)).Bytes())
+ d.Write(big.NewInt(int64(i)).Bytes())
+ d.Write(big.NewInt(int64(k)).Bytes())
+
+ b.SetBytes(Sum(d))
+ pk := b.Uint64() & ((1 << ((L - 1) * 3)) - 1)
+ sha.Write(dag.Node(L-1, pk).Bytes())
+ }
+
+ ret.SetBytes(Sum(sha))
+
+ return ret
+}
+
+func Sum(sha hash.Hash) []byte {
+ //in := make([]byte, 32)
+ return sha.Sum(nil)
+}
+
+func (dag *Dagger) Eval(N *big.Int) *big.Int {
+ pow := ethutil.BigPow(2, 26)
+ dag.xn = pow.Div(N, pow)
+
+ sha := sha3.NewKeccak256()
+ sha.Reset()
+ ret := new(big.Int)
+
+ for k := 0; k < 4; k++ {
+ d := sha3.NewKeccak256()
+ b := new(big.Int)
+
+ d.Reset()
+ d.Write(dag.hash.Bytes())
+ d.Write(dag.xn.Bytes())
+ d.Write(N.Bytes())
+ d.Write(big.NewInt(int64(k)).Bytes())
+
+ b.SetBytes(Sum(d))
+ pk := (b.Uint64() & 0x1ffffff)
+
+ sha.Write(dag.Node(9, pk).Bytes())
+ }
+
+ return ret.SetBytes(Sum(sha))
+}
diff --git a/core/dagger_test.go b/core/dagger_test.go
new file mode 100644
index 000000000..e80064e6b
--- /dev/null
+++ b/core/dagger_test.go
@@ -0,0 +1,19 @@
+package core
+
+import (
+ "math/big"
+ "testing"
+
+ "github.com/ethereum/go-ethereum/ethutil"
+)
+
+func BenchmarkDaggerSearch(b *testing.B) {
+ hash := big.NewInt(0)
+ diff := ethutil.BigPow(2, 36)
+ o := big.NewInt(0) // nonce doesn't matter. We're only testing against speed, not validity
+
+ // Reset timer so the big generation isn't included in the benchmark
+ b.ResetTimer()
+ // Validate
+ DaggerVerify(hash, diff, o)
+}
diff --git a/core/error.go b/core/error.go
new file mode 100644
index 000000000..11d8c1653
--- /dev/null
+++ b/core/error.go
@@ -0,0 +1,141 @@
+package core
+
+import (
+ "fmt"
+ "math/big"
+)
+
+// Parent error. In case a parent is unknown this error will be thrown
+// by the block manager
+type ParentErr struct {
+ Message string
+}
+
+func (err *ParentErr) Error() string {
+ return err.Message
+}
+
+func ParentError(hash []byte) error {
+ return &ParentErr{Message: fmt.Sprintf("Block's parent unkown %x", hash)}
+}
+
+func IsParentErr(err error) bool {
+ _, ok := err.(*ParentErr)
+
+ return ok
+}
+
+type UncleErr struct {
+ Message string
+}
+
+func (err *UncleErr) Error() string {
+ return err.Message
+}
+
+func UncleError(str string) error {
+ return &UncleErr{Message: str}
+}
+
+func IsUncleErr(err error) bool {
+ _, ok := err.(*UncleErr)
+
+ return ok
+}
+
+// Block validation error. If any validation fails, this error will be thrown
+type ValidationErr struct {
+ Message string
+}
+
+func (err *ValidationErr) Error() string {
+ return err.Message
+}
+
+func ValidationError(format string, v ...interface{}) *ValidationErr {
+ return &ValidationErr{Message: fmt.Sprintf(format, v...)}
+}
+
+func IsValidationErr(err error) bool {
+ _, ok := err.(*ValidationErr)
+
+ return ok
+}
+
+type GasLimitErr struct {
+ Message string
+ Is, Max *big.Int
+}
+
+func IsGasLimitErr(err error) bool {
+ _, ok := err.(*GasLimitErr)
+
+ return ok
+}
+func (err *GasLimitErr) Error() string {
+ return err.Message
+}
+func GasLimitError(is, max *big.Int) *GasLimitErr {
+ return &GasLimitErr{Message: fmt.Sprintf("GasLimit error. Max %s, transaction would take it to %s", max, is), Is: is, Max: max}
+}
+
+type NonceErr struct {
+ Message string
+ Is, Exp uint64
+}
+
+func (err *NonceErr) Error() string {
+ return err.Message
+}
+
+func NonceError(is, exp uint64) *NonceErr {
+ return &NonceErr{Message: fmt.Sprintf("Nonce err. Is %d, expected %d", is, exp), Is: is, Exp: exp}
+}
+
+func IsNonceErr(err error) bool {
+ _, ok := err.(*NonceErr)
+
+ return ok
+}
+
+type OutOfGasErr struct {
+ Message string
+}
+
+func OutOfGasError() *OutOfGasErr {
+ return &OutOfGasErr{Message: "Out of gas"}
+}
+func (self *OutOfGasErr) Error() string {
+ return self.Message
+}
+
+func IsOutOfGasErr(err error) bool {
+ _, ok := err.(*OutOfGasErr)
+
+ return ok
+}
+
+type TDError struct {
+ a, b *big.Int
+}
+
+func (self *TDError) Error() string {
+ return fmt.Sprintf("incoming chain has a lower or equal TD (%v <= %v)", self.a, self.b)
+}
+func IsTDError(e error) bool {
+ _, ok := e.(*TDError)
+ return ok
+}
+
+type KnownBlockError struct {
+ number *big.Int
+ hash []byte
+}
+
+func (self *KnownBlockError) Error() string {
+ return fmt.Sprintf("block %v already known (%x)", self.number, self.hash[0:4])
+}
+func IsKnownBlockErr(e error) bool {
+ _, ok := e.(*KnownBlockError)
+ return ok
+}
diff --git a/core/events.go b/core/events.go
new file mode 100644
index 000000000..deeba3e98
--- /dev/null
+++ b/core/events.go
@@ -0,0 +1,12 @@
+package core
+
+import "github.com/ethereum/go-ethereum/core/types"
+
+// TxPreEvent is posted when a transaction enters the transaction pool.
+type TxPreEvent struct{ Tx *types.Transaction }
+
+// TxPostEvent is posted when a transaction has been processed.
+type TxPostEvent struct{ Tx *types.Transaction }
+
+// NewBlockEvent is posted when a block has been imported.
+type NewBlockEvent struct{ Block *types.Block }
diff --git a/core/execution.go b/core/execution.go
new file mode 100644
index 000000000..b7eead0dd
--- /dev/null
+++ b/core/execution.go
@@ -0,0 +1,71 @@
+package core
+
+import (
+ "fmt"
+ "math/big"
+ "time"
+
+ "github.com/ethereum/go-ethereum/state"
+ "github.com/ethereum/go-ethereum/vm"
+)
+
+type Execution struct {
+ env vm.Environment
+ address, input []byte
+ Gas, price, value *big.Int
+ SkipTransfer bool
+}
+
+func NewExecution(env vm.Environment, address, input []byte, gas, gasPrice, value *big.Int) *Execution {
+ return &Execution{env: env, address: address, input: input, Gas: gas, price: gasPrice, value: value}
+}
+
+func (self *Execution) Addr() []byte {
+ return self.address
+}
+
+func (self *Execution) Call(codeAddr []byte, caller vm.ClosureRef) ([]byte, error) {
+ // Retrieve the executing code
+ code := self.env.State().GetCode(codeAddr)
+
+ return self.exec(code, codeAddr, caller)
+}
+
+func (self *Execution) exec(code, contextAddr []byte, caller vm.ClosureRef) (ret []byte, err error) {
+ env := self.env
+ evm := vm.New(env, vm.DebugVmTy)
+
+ if env.Depth() == vm.MaxCallDepth {
+ // Consume all gas (by not returning it) and return a depth error
+ return nil, vm.DepthError{}
+ }
+
+ from, to := env.State().GetStateObject(caller.Address()), env.State().GetOrNewStateObject(self.address)
+ // Skipping transfer is used on testing for the initial call
+ if !self.SkipTransfer {
+ err = env.Transfer(from, to, self.value)
+ if err != nil {
+ caller.ReturnGas(self.Gas, self.price)
+
+ err = fmt.Errorf("Insufficient funds to transfer value. Req %v, has %v", self.value, from.Balance)
+ return
+ }
+ }
+
+ snapshot := env.State().Copy()
+ start := time.Now()
+ ret, err = evm.Run(to, caller, code, self.value, self.Gas, self.price, self.input)
+ if err != nil {
+ env.State().Set(snapshot)
+ }
+ chainlogger.Debugf("vm took %v\n", time.Since(start))
+
+ return
+}
+
+func (self *Execution) Create(caller vm.ClosureRef) (ret []byte, err error, account *state.StateObject) {
+ ret, err = self.exec(self.input, nil, caller)
+ account = self.env.State().GetStateObject(self.address)
+
+ return
+}
diff --git a/core/fees.go b/core/fees.go
new file mode 100644
index 000000000..bbce01b84
--- /dev/null
+++ b/core/fees.go
@@ -0,0 +1,7 @@
+package core
+
+import (
+ "math/big"
+)
+
+var BlockReward *big.Int = big.NewInt(1.5e+18)
diff --git a/core/filter.go b/core/filter.go
new file mode 100644
index 000000000..fb992782d
--- /dev/null
+++ b/core/filter.go
@@ -0,0 +1,200 @@
+package core
+
+import (
+ "bytes"
+ "math"
+ "math/big"
+
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/state"
+)
+
+type AccountChange struct {
+ Address, StateAddress []byte
+}
+
+// Filtering interface
+type Filter struct {
+ eth EthManager
+ earliest int64
+ latest int64
+ skip int
+ from, to [][]byte
+ max int
+
+ Altered []AccountChange
+
+ BlockCallback func(*types.Block)
+ MessageCallback func(state.Messages)
+}
+
+// Create a new filter which uses a bloom filter on blocks to figure out whether a particular block
+// is interesting or not.
+func NewFilter(eth EthManager) *Filter {
+ return &Filter{eth: eth}
+}
+
+func (self *Filter) AddAltered(address, stateAddress []byte) {
+ self.Altered = append(self.Altered, AccountChange{address, stateAddress})
+}
+
+// Set the earliest and latest block for filtering.
+// -1 = latest block (i.e., the current block)
+// hash = particular hash from-to
+func (self *Filter) SetEarliestBlock(earliest int64) {
+ self.earliest = earliest
+}
+
+func (self *Filter) SetLatestBlock(latest int64) {
+ self.latest = latest
+}
+
+func (self *Filter) SetFrom(addr [][]byte) {
+ self.from = addr
+}
+
+func (self *Filter) AddFrom(addr []byte) {
+ self.from = append(self.from, addr)
+}
+
+func (self *Filter) SetTo(addr [][]byte) {
+ self.to = addr
+}
+
+func (self *Filter) AddTo(addr []byte) {
+ self.to = append(self.to, addr)
+}
+
+func (self *Filter) SetMax(max int) {
+ self.max = max
+}
+
+func (self *Filter) SetSkip(skip int) {
+ self.skip = skip
+}
+
+// Run filters messages with the current parameters set
+func (self *Filter) Find() []*state.Message {
+ var earliestBlockNo uint64 = uint64(self.earliest)
+ if self.earliest == -1 {
+ earliestBlockNo = self.eth.ChainManager().CurrentBlock().Number.Uint64()
+ }
+ var latestBlockNo uint64 = uint64(self.latest)
+ if self.latest == -1 {
+ latestBlockNo = self.eth.ChainManager().CurrentBlock().Number.Uint64()
+ }
+
+ var (
+ messages []*state.Message
+ block = self.eth.ChainManager().GetBlockByNumber(latestBlockNo)
+ quit bool
+ )
+ for i := 0; !quit && block != nil; i++ {
+ // Quit on latest
+ switch {
+ case block.Number.Uint64() == earliestBlockNo, block.Number.Uint64() == 0:
+ quit = true
+ case self.max <= len(messages):
+ break
+ }
+
+ // Use bloom filtering to see if this block is interesting given the
+ // current parameters
+ if self.bloomFilter(block) {
+ // Get the messages of the block
+ msgs, err := self.eth.BlockManager().GetMessages(block)
+ if err != nil {
+ chainlogger.Warnln("err: filter get messages ", err)
+
+ break
+ }
+
+ messages = append(messages, self.FilterMessages(msgs)...)
+ }
+
+ block = self.eth.ChainManager().GetBlock(block.PrevHash)
+ }
+
+ skip := int(math.Min(float64(len(messages)), float64(self.skip)))
+
+ return messages[skip:]
+}
+
+func includes(addresses [][]byte, a []byte) (found bool) {
+ for _, addr := range addresses {
+ if bytes.Compare(addr, a) == 0 {
+ return true
+ }
+ }
+
+ return
+}
+
+func (self *Filter) FilterMessages(msgs []*state.Message) []*state.Message {
+ var messages []*state.Message
+
+ // Filter the messages for interesting stuff
+ for _, message := range msgs {
+ if len(self.to) > 0 && !includes(self.to, message.To) {
+ continue
+ }
+
+ if len(self.from) > 0 && !includes(self.from, message.From) {
+ continue
+ }
+
+ var match bool
+ if len(self.Altered) == 0 {
+ match = true
+ }
+
+ for _, accountChange := range self.Altered {
+ if len(accountChange.Address) > 0 && bytes.Compare(message.To, accountChange.Address) != 0 {
+ continue
+ }
+
+ if len(accountChange.StateAddress) > 0 && !includes(message.ChangedAddresses, accountChange.StateAddress) {
+ continue
+ }
+
+ match = true
+ break
+ }
+
+ if !match {
+ continue
+ }
+
+ messages = append(messages, message)
+ }
+
+ return messages
+}
+
+func (self *Filter) bloomFilter(block *types.Block) bool {
+ var fromIncluded, toIncluded bool
+ if len(self.from) > 0 {
+ for _, from := range self.from {
+ if types.BloomLookup(block.LogsBloom, from) || bytes.Equal(block.Coinbase, from) {
+ fromIncluded = true
+ break
+ }
+ }
+ } else {
+ fromIncluded = true
+ }
+
+ if len(self.to) > 0 {
+ for _, to := range self.to {
+ if types.BloomLookup(block.LogsBloom, ethutil.U256(new(big.Int).Add(ethutil.Big1, ethutil.BigD(to))).Bytes()) || bytes.Equal(block.Coinbase, to) {
+ toIncluded = true
+ break
+ }
+ }
+ } else {
+ toIncluded = true
+ }
+
+ return fromIncluded && toIncluded
+}
diff --git a/core/filter_test.go b/core/filter_test.go
new file mode 100644
index 000000000..9a8bc9592
--- /dev/null
+++ b/core/filter_test.go
@@ -0,0 +1 @@
+package core
diff --git a/core/genesis.go b/core/genesis.go
new file mode 100644
index 000000000..707154759
--- /dev/null
+++ b/core/genesis.go
@@ -0,0 +1,52 @@
+package core
+
+import (
+ "math/big"
+
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/ethutil"
+)
+
+/*
+ * This is the special genesis block.
+ */
+
+var ZeroHash256 = make([]byte, 32)
+var ZeroHash160 = make([]byte, 20)
+var ZeroHash512 = make([]byte, 64)
+var EmptyShaList = crypto.Sha3(ethutil.Encode([]interface{}{}))
+var EmptyListRoot = crypto.Sha3(ethutil.Encode(""))
+
+var GenesisHeader = []interface{}{
+ // Previous hash (none)
+ ZeroHash256,
+ // Empty uncles
+ EmptyShaList,
+ // Coinbase
+ ZeroHash160,
+ // Root state
+ EmptyShaList,
+ // tx root
+ EmptyListRoot,
+ // receipt root
+ EmptyListRoot,
+ // bloom
+ ZeroHash512,
+ // Difficulty
+ //ethutil.BigPow(2, 22),
+ big.NewInt(131072),
+ // Number
+ ethutil.Big0,
+ // Block upper gas bound
+ big.NewInt(1000000),
+ // Block gas used
+ ethutil.Big0,
+ // Time
+ ethutil.Big0,
+ // Extra
+ nil,
+ // Nonce
+ crypto.Sha3(big.NewInt(42).Bytes()),
+}
+
+var Genesis = []interface{}{GenesisHeader, []interface{}{}, []interface{}{}}
diff --git a/core/helper_test.go b/core/helper_test.go
new file mode 100644
index 000000000..b340144fd
--- /dev/null
+++ b/core/helper_test.go
@@ -0,0 +1,93 @@
+package core
+
+import (
+ "container/list"
+ "fmt"
+
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/ethdb"
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/event"
+ "github.com/ethereum/go-ethereum/wire"
+)
+
+// Implement our EthTest Manager
+type TestManager struct {
+ // stateManager *StateManager
+ eventMux *event.TypeMux
+
+ db ethutil.Database
+ txPool *TxPool
+ blockChain *ChainManager
+ Blocks []*types.Block
+}
+
+func (s *TestManager) IsListening() bool {
+ return false
+}
+
+func (s *TestManager) IsMining() bool {
+ return false
+}
+
+func (s *TestManager) PeerCount() int {
+ return 0
+}
+
+func (s *TestManager) Peers() *list.List {
+ return list.New()
+}
+
+func (s *TestManager) ChainManager() *ChainManager {
+ return s.blockChain
+}
+
+func (tm *TestManager) TxPool() *TxPool {
+ return tm.txPool
+}
+
+// func (tm *TestManager) StateManager() *StateManager {
+// return tm.stateManager
+// }
+
+func (tm *TestManager) EventMux() *event.TypeMux {
+ return tm.eventMux
+}
+func (tm *TestManager) Broadcast(msgType wire.MsgType, data []interface{}) {
+ fmt.Println("Broadcast not implemented")
+}
+
+func (tm *TestManager) ClientIdentity() wire.ClientIdentity {
+ return nil
+}
+func (tm *TestManager) KeyManager() *crypto.KeyManager {
+ return nil
+}
+
+func (tm *TestManager) Db() ethutil.Database {
+ return tm.db
+}
+
+func NewTestManager() *TestManager {
+ ethutil.ReadConfig(".ethtest", "/tmp/ethtest", "ETH")
+
+ db, err := ethdb.NewMemDatabase()
+ if err != nil {
+ fmt.Println("Could not create mem-db, failing")
+ return nil
+ }
+ ethutil.Config.Db = db
+
+ testManager := &TestManager{}
+ testManager.eventMux = new(event.TypeMux)
+ testManager.db = db
+ // testManager.txPool = NewTxPool(testManager)
+ // testManager.blockChain = NewChainManager(testManager)
+ // testManager.stateManager = NewStateManager(testManager)
+
+ // Start the tx pool
+ testManager.txPool.Start()
+
+ return testManager
+}
diff --git a/core/simple_pow.go b/core/simple_pow.go
new file mode 100644
index 000000000..9a8bc9592
--- /dev/null
+++ b/core/simple_pow.go
@@ -0,0 +1 @@
+package core
diff --git a/core/state_transition.go b/core/state_transition.go
new file mode 100644
index 000000000..7b7026c29
--- /dev/null
+++ b/core/state_transition.go
@@ -0,0 +1,238 @@
+package core
+
+import (
+ "fmt"
+ "math/big"
+
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/state"
+ "github.com/ethereum/go-ethereum/vm"
+)
+
+/*
+ * The State transitioning model
+ *
+ * A state transition is a change made when a transaction is applied to the current world state
+ * The state transitioning model does all all the necessary work to work out a valid new state root.
+ * 1) Nonce handling
+ * 2) Pre pay / buy gas of the coinbase (miner)
+ * 3) Create a new state object if the recipient is \0*32
+ * 4) Value transfer
+ * == If contract creation ==
+ * 4a) Attempt to run transaction data
+ * 4b) If valid, use result as code for the new state object
+ * == end ==
+ * 5) Run Script section
+ * 6) Derive new state root
+ */
+type StateTransition struct {
+ coinbase, receiver []byte
+ msg Message
+ gas, gasPrice *big.Int
+ initialGas *big.Int
+ value *big.Int
+ data []byte
+ state *state.StateDB
+ block *types.Block
+
+ cb, rec, sen *state.StateObject
+
+ Env vm.Environment
+}
+
+type Message interface {
+ Hash() []byte
+
+ From() []byte
+ To() []byte
+
+ GasPrice() *big.Int
+ Gas() *big.Int
+ Value() *big.Int
+
+ Nonce() uint64
+ Data() []byte
+}
+
+func AddressFromMessage(msg Message) []byte {
+ // Generate a new address
+ return crypto.Sha3(ethutil.NewValue([]interface{}{msg.From(), msg.Nonce()}).Encode())[12:]
+}
+
+func MessageCreatesContract(msg Message) bool {
+ return len(msg.To()) == 0
+}
+
+func MessageGasValue(msg Message) *big.Int {
+ return new(big.Int).Mul(msg.Gas(), msg.GasPrice())
+}
+
+func NewStateTransition(coinbase *state.StateObject, msg Message, state *state.StateDB, block *types.Block) *StateTransition {
+ return &StateTransition{coinbase.Address(), msg.To(), msg, new(big.Int), new(big.Int).Set(msg.GasPrice()), new(big.Int), msg.Value(), msg.Data(), state, block, coinbase, nil, nil, nil}
+}
+
+func (self *StateTransition) VmEnv() vm.Environment {
+ if self.Env == nil {
+ self.Env = NewEnv(self.state, self.msg, self.block)
+ }
+
+ return self.Env
+}
+
+func (self *StateTransition) Coinbase() *state.StateObject {
+ return self.state.GetOrNewStateObject(self.coinbase)
+}
+func (self *StateTransition) From() *state.StateObject {
+ return self.state.GetOrNewStateObject(self.msg.From())
+}
+func (self *StateTransition) To() *state.StateObject {
+ if self.msg != nil && MessageCreatesContract(self.msg) {
+ return nil
+ }
+ return self.state.GetOrNewStateObject(self.msg.To())
+}
+
+func (self *StateTransition) UseGas(amount *big.Int) error {
+ if self.gas.Cmp(amount) < 0 {
+ return OutOfGasError()
+ }
+ self.gas.Sub(self.gas, amount)
+
+ return nil
+}
+
+func (self *StateTransition) AddGas(amount *big.Int) {
+ self.gas.Add(self.gas, amount)
+}
+
+func (self *StateTransition) BuyGas() error {
+ var err error
+
+ sender := self.From()
+ if sender.Balance().Cmp(MessageGasValue(self.msg)) < 0 {
+ return fmt.Errorf("insufficient ETH for gas (%x). Req %v, has %v", sender.Address()[:4], MessageGasValue(self.msg), sender.Balance())
+ }
+
+ coinbase := self.Coinbase()
+ err = coinbase.BuyGas(self.msg.Gas(), self.msg.GasPrice())
+ if err != nil {
+ return err
+ }
+
+ self.AddGas(self.msg.Gas())
+ self.initialGas.Set(self.msg.Gas())
+ sender.SubAmount(MessageGasValue(self.msg))
+
+ return nil
+}
+
+func (self *StateTransition) preCheck() (err error) {
+ var (
+ msg = self.msg
+ sender = self.From()
+ )
+
+ // Make sure this transaction's nonce is correct
+ if sender.Nonce != msg.Nonce() {
+ return NonceError(msg.Nonce(), sender.Nonce)
+ }
+
+ // Pre-pay gas / Buy gas of the coinbase account
+ if err = self.BuyGas(); err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func (self *StateTransition) TransitionState() (ret []byte, err error) {
+ statelogger.Debugf("(~) %x\n", self.msg.Hash())
+
+ // XXX Transactions after this point are considered valid.
+ if err = self.preCheck(); err != nil {
+ return
+ }
+
+ var (
+ msg = self.msg
+ sender = self.From()
+ )
+
+ defer self.RefundGas()
+
+ // Increment the nonce for the next transaction
+ sender.Nonce += 1
+
+ // Transaction gas
+ if err = self.UseGas(vm.GasTx); err != nil {
+ return
+ }
+
+ // Pay data gas
+ var dgas int64
+ for _, byt := range self.data {
+ if byt != 0 {
+ dgas += vm.GasData.Int64()
+ } else {
+ dgas += 1 // This is 1/5. If GasData changes this fails
+ }
+ }
+ if err = self.UseGas(big.NewInt(dgas)); err != nil {
+ return
+ }
+
+ vmenv := self.VmEnv()
+ var ref vm.ClosureRef
+ if MessageCreatesContract(msg) {
+ contract := MakeContract(msg, self.state)
+ ret, err, ref = vmenv.Create(sender, contract.Address(), self.msg.Data(), self.gas, self.gasPrice, self.value)
+ if err == nil {
+ dataGas := big.NewInt(int64(len(ret)))
+ dataGas.Mul(dataGas, vm.GasCreateByte)
+ if err = self.UseGas(dataGas); err == nil {
+ //self.state.SetCode(ref.Address(), ret)
+ ref.SetCode(ret)
+ }
+ }
+ } else {
+ ret, err = vmenv.Call(self.From(), self.To().Address(), self.msg.Data(), self.gas, self.gasPrice, self.value)
+ }
+
+ if err != nil {
+ self.UseGas(self.gas)
+ }
+
+ return
+}
+
+// Converts an transaction in to a state object
+func MakeContract(msg Message, state *state.StateDB) *state.StateObject {
+ addr := AddressFromMessage(msg)
+
+ contract := state.GetOrNewStateObject(addr)
+ contract.InitCode = msg.Data()
+
+ return contract
+}
+
+func (self *StateTransition) RefundGas() {
+ coinbase, sender := self.Coinbase(), self.From()
+ // Return remaining gas
+ remaining := new(big.Int).Mul(self.gas, self.msg.GasPrice())
+ sender.AddAmount(remaining)
+
+ uhalf := new(big.Int).Div(self.GasUsed(), ethutil.Big2)
+ for addr, ref := range self.state.Refunds() {
+ refund := ethutil.BigMin(uhalf, ref)
+ self.gas.Add(self.gas, refund)
+ self.state.AddBalance([]byte(addr), refund.Mul(refund, self.msg.GasPrice()))
+ }
+
+ coinbase.RefundGas(self.gas, self.msg.GasPrice())
+}
+
+func (self *StateTransition) GasUsed() *big.Int {
+ return new(big.Int).Sub(self.initialGas, self.gas)
+}
diff --git a/core/transaction_pool.go b/core/transaction_pool.go
new file mode 100644
index 000000000..58c2255a4
--- /dev/null
+++ b/core/transaction_pool.go
@@ -0,0 +1,233 @@
+package core
+
+import (
+ "bytes"
+ "container/list"
+ "fmt"
+ "math/big"
+ "sync"
+
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/event"
+ "github.com/ethereum/go-ethereum/logger"
+ "github.com/ethereum/go-ethereum/state"
+ "github.com/ethereum/go-ethereum/wire"
+)
+
+var txplogger = logger.NewLogger("TXP")
+
+const txPoolQueueSize = 50
+
+type TxPoolHook chan *types.Transaction
+type TxMsgTy byte
+
+const (
+ minGasPrice = 1000000
+)
+
+var MinGasPrice = big.NewInt(10000000000000)
+
+type TxMsg struct {
+ Tx *types.Transaction
+ Type TxMsgTy
+}
+
+func EachTx(pool *list.List, it func(*types.Transaction, *list.Element) bool) {
+ for e := pool.Front(); e != nil; e = e.Next() {
+ if it(e.Value.(*types.Transaction), e) {
+ break
+ }
+ }
+}
+
+func FindTx(pool *list.List, finder func(*types.Transaction, *list.Element) bool) *types.Transaction {
+ for e := pool.Front(); e != nil; e = e.Next() {
+ if tx, ok := e.Value.(*types.Transaction); ok {
+ if finder(tx, e) {
+ return tx
+ }
+ }
+ }
+
+ return nil
+}
+
+type TxProcessor interface {
+ ProcessTransaction(tx *types.Transaction)
+}
+
+// The tx pool a thread safe transaction pool handler. In order to
+// guarantee a non blocking pool we use a queue channel which can be
+// independently read without needing access to the actual pool. If the
+// pool is being drained or synced for whatever reason the transactions
+// will simple queue up and handled when the mutex is freed.
+type TxPool struct {
+ // The mutex for accessing the Tx pool.
+ mutex sync.Mutex
+ // Queueing channel for reading and writing incoming
+ // transactions to
+ queueChan chan *types.Transaction
+ // Quiting channel
+ quit chan bool
+ // The actual pool
+ pool *list.List
+
+ SecondaryProcessor TxProcessor
+
+ subscribers []chan TxMsg
+
+ broadcaster types.Broadcaster
+ chainManager *ChainManager
+ eventMux *event.TypeMux
+}
+
+func NewTxPool(chainManager *ChainManager, broadcaster types.Broadcaster, eventMux *event.TypeMux) *TxPool {
+ return &TxPool{
+ pool: list.New(),
+ queueChan: make(chan *types.Transaction, txPoolQueueSize),
+ quit: make(chan bool),
+ chainManager: chainManager,
+ eventMux: eventMux,
+ broadcaster: broadcaster,
+ }
+}
+
+// Blocking function. Don't use directly. Use QueueTransaction instead
+func (pool *TxPool) addTransaction(tx *types.Transaction) {
+ pool.mutex.Lock()
+ defer pool.mutex.Unlock()
+
+ pool.pool.PushBack(tx)
+
+ // Broadcast the transaction to the rest of the peers
+ pool.broadcaster.Broadcast(wire.MsgTxTy, []interface{}{tx.RlpData()})
+}
+
+func (pool *TxPool) ValidateTransaction(tx *types.Transaction) error {
+ // Get the last block so we can retrieve the sender and receiver from
+ // the merkle trie
+ block := pool.chainManager.CurrentBlock
+ // Something has gone horribly wrong if this happens
+ if block == nil {
+ return fmt.Errorf("No last block on the block chain")
+ }
+
+ if len(tx.To()) != 0 && len(tx.To()) != 20 {
+ return fmt.Errorf("Invalid recipient. len = %d", len(tx.To()))
+ }
+
+ v, _, _ := tx.Curve()
+ if v > 28 || v < 27 {
+ return fmt.Errorf("tx.v != (28 || 27)")
+ }
+
+ // Get the sender
+ sender := pool.chainManager.State().GetAccount(tx.Sender())
+
+ totAmount := new(big.Int).Set(tx.Value())
+ // Make sure there's enough in the sender's account. Having insufficient
+ // funds won't invalidate this transaction but simple ignores it.
+ if sender.Balance().Cmp(totAmount) < 0 {
+ return fmt.Errorf("Insufficient amount in sender's (%x) account", tx.From())
+ }
+
+ // Increment the nonce making each tx valid only once to prevent replay
+ // attacks
+
+ return nil
+}
+
+func (self *TxPool) Add(tx *types.Transaction) error {
+ hash := tx.Hash()
+ foundTx := FindTx(self.pool, func(tx *types.Transaction, e *list.Element) bool {
+ return bytes.Compare(tx.Hash(), hash) == 0
+ })
+
+ if foundTx != nil {
+ return fmt.Errorf("Known transaction (%x)", hash[0:4])
+ }
+
+ err := self.ValidateTransaction(tx)
+ if err != nil {
+ return err
+ }
+
+ self.addTransaction(tx)
+
+ txplogger.Debugf("(t) %x => %x (%v) %x\n", tx.From()[:4], tx.To()[:4], tx.Value, tx.Hash())
+
+ // Notify the subscribers
+ go self.eventMux.Post(TxPreEvent{tx})
+
+ return nil
+}
+
+func (self *TxPool) Size() int {
+ return self.pool.Len()
+}
+
+func (pool *TxPool) CurrentTransactions() []*types.Transaction {
+ pool.mutex.Lock()
+ defer pool.mutex.Unlock()
+
+ txList := make([]*types.Transaction, pool.pool.Len())
+ i := 0
+ for e := pool.pool.Front(); e != nil; e = e.Next() {
+ tx := e.Value.(*types.Transaction)
+
+ txList[i] = tx
+
+ i++
+ }
+
+ return txList
+}
+
+func (pool *TxPool) RemoveInvalid(state *state.StateDB) {
+ pool.mutex.Lock()
+ defer pool.mutex.Unlock()
+
+ for e := pool.pool.Front(); e != nil; e = e.Next() {
+ tx := e.Value.(*types.Transaction)
+ sender := state.GetAccount(tx.Sender())
+ err := pool.ValidateTransaction(tx)
+ if err != nil || sender.Nonce >= tx.Nonce() {
+ pool.pool.Remove(e)
+ }
+ }
+}
+
+func (self *TxPool) RemoveSet(txs types.Transactions) {
+ self.mutex.Lock()
+ defer self.mutex.Unlock()
+
+ for _, tx := range txs {
+ EachTx(self.pool, func(t *types.Transaction, element *list.Element) bool {
+ if t == tx {
+ self.pool.Remove(element)
+ return true // To stop the loop
+ }
+ return false
+ })
+ }
+}
+
+func (pool *TxPool) Flush() []*types.Transaction {
+ txList := pool.CurrentTransactions()
+
+ // Recreate a new list all together
+ // XXX Is this the fastest way?
+ pool.pool = list.New()
+
+ return txList
+}
+
+func (pool *TxPool) Start() {
+ //go pool.queueHandler()
+}
+
+func (pool *TxPool) Stop() {
+ pool.Flush()
+
+ txplogger.Infoln("Stopped")
+}
diff --git a/core/types/block.go b/core/types/block.go
new file mode 100644
index 000000000..2d889f35f
--- /dev/null
+++ b/core/types/block.go
@@ -0,0 +1,416 @@
+package types
+
+import (
+ "bytes"
+ "fmt"
+ "math/big"
+ "sort"
+ "time"
+
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/state"
+ "github.com/ethereum/go-ethereum/trie"
+)
+
+type BlockInfo struct {
+ Number uint64
+ Hash []byte
+ Parent []byte
+ TD *big.Int
+}
+
+func (bi *BlockInfo) RlpDecode(data []byte) {
+ decoder := ethutil.NewValueFromBytes(data)
+
+ bi.Number = decoder.Get(0).Uint()
+ bi.Hash = decoder.Get(1).Bytes()
+ bi.Parent = decoder.Get(2).Bytes()
+ bi.TD = decoder.Get(3).BigInt()
+}
+
+func (bi *BlockInfo) RlpEncode() []byte {
+ return ethutil.Encode([]interface{}{bi.Number, bi.Hash, bi.Parent, bi.TD})
+}
+
+type Blocks []*Block
+
+func (self Blocks) AsSet() ethutil.UniqueSet {
+ set := make(ethutil.UniqueSet)
+ for _, block := range self {
+ set.Insert(block.Hash())
+ }
+
+ return set
+}
+
+type BlockBy func(b1, b2 *Block) bool
+
+func (self BlockBy) Sort(blocks Blocks) {
+ bs := blockSorter{
+ blocks: blocks,
+ by: self,
+ }
+ sort.Sort(bs)
+}
+
+type blockSorter struct {
+ blocks Blocks
+ by func(b1, b2 *Block) bool
+}
+
+func (self blockSorter) Len() int { return len(self.blocks) }
+func (self blockSorter) Swap(i, j int) {
+ self.blocks[i], self.blocks[j] = self.blocks[j], self.blocks[i]
+}
+func (self blockSorter) Less(i, j int) bool { return self.by(self.blocks[i], self.blocks[j]) }
+
+func Number(b1, b2 *Block) bool { return b1.Number.Cmp(b2.Number) < 0 }
+
+type Block struct {
+ // Hash to the previous block
+ PrevHash ethutil.Bytes
+ // Uncles of this block
+ Uncles Blocks
+ UncleSha []byte
+ // The coin base address
+ Coinbase []byte
+ // Block Trie state
+ //state *ethutil.Trie
+ state *state.StateDB
+ // Difficulty for the current block
+ Difficulty *big.Int
+ // Creation time
+ Time int64
+ // The block number
+ Number *big.Int
+ // Gas limit
+ GasLimit *big.Int
+ // Gas used
+ GasUsed *big.Int
+ // Extra data
+ Extra string
+ // Block Nonce for verification
+ Nonce ethutil.Bytes
+ // List of transactions and/or contracts
+ transactions Transactions
+ receipts Receipts
+ TxSha, ReceiptSha []byte
+ LogsBloom []byte
+
+ Reward *big.Int
+}
+
+func NewBlockFromBytes(raw []byte) *Block {
+ block := &Block{}
+ block.RlpDecode(raw)
+
+ return block
+}
+
+// New block takes a raw encoded string
+func NewBlockFromRlpValue(rlpValue *ethutil.Value) *Block {
+ block := &Block{}
+ block.RlpValueDecode(rlpValue)
+
+ return block
+}
+
+func CreateBlock(root interface{},
+ prevHash []byte,
+ base []byte,
+ Difficulty *big.Int,
+ Nonce []byte,
+ extra string) *Block {
+
+ block := &Block{
+ PrevHash: prevHash,
+ Coinbase: base,
+ Difficulty: Difficulty,
+ Nonce: Nonce,
+ Time: time.Now().Unix(),
+ Extra: extra,
+ UncleSha: nil,
+ GasUsed: new(big.Int),
+ GasLimit: new(big.Int),
+ }
+ block.SetUncles([]*Block{})
+
+ block.state = state.New(trie.New(ethutil.Config.Db, root))
+
+ return block
+}
+
+// Returns a hash of the block
+func (block *Block) Hash() ethutil.Bytes {
+ return crypto.Sha3(ethutil.NewValue(block.header()).Encode())
+ //return crypto.Sha3(block.Value().Encode())
+}
+
+func (block *Block) HashNoNonce() []byte {
+ return crypto.Sha3(ethutil.Encode(block.miningHeader()))
+}
+
+func (block *Block) State() *state.StateDB {
+ return block.state
+}
+
+func (block *Block) Transactions() Transactions {
+ return block.transactions
+}
+
+func (block *Block) CalcGasLimit(parent *Block) *big.Int {
+ if block.Number.Cmp(big.NewInt(0)) == 0 {
+ return ethutil.BigPow(10, 6)
+ }
+
+ // ((1024-1) * parent.gasLimit + (gasUsed * 6 / 5)) / 1024
+
+ previous := new(big.Int).Mul(big.NewInt(1024-1), parent.GasLimit)
+ current := new(big.Rat).Mul(new(big.Rat).SetInt(parent.GasUsed), big.NewRat(6, 5))
+ curInt := new(big.Int).Div(current.Num(), current.Denom())
+
+ result := new(big.Int).Add(previous, curInt)
+ result.Div(result, big.NewInt(1024))
+
+ min := big.NewInt(125000)
+
+ return ethutil.BigMax(min, result)
+}
+
+func (block *Block) BlockInfo() BlockInfo {
+ bi := BlockInfo{}
+ data, _ := ethutil.Config.Db.Get(append(block.Hash(), []byte("Info")...))
+ bi.RlpDecode(data)
+
+ return bi
+}
+
+func (self *Block) GetTransaction(hash []byte) *Transaction {
+ for _, tx := range self.transactions {
+ if bytes.Compare(tx.Hash(), hash) == 0 {
+ return tx
+ }
+ }
+
+ return nil
+}
+
+// Sync the block's state and contract respectively
+func (block *Block) Sync() {
+ block.state.Sync()
+}
+
+func (block *Block) Undo() {
+ // Sync the block state itself
+ block.state.Reset()
+}
+
+/////// Block Encoding
+func (block *Block) rlpReceipts() interface{} {
+ // Marshal the transactions of this block
+ encR := make([]interface{}, len(block.receipts))
+ for i, r := range block.receipts {
+ // Cast it to a string (safe)
+ encR[i] = r.RlpData()
+ }
+
+ return encR
+}
+
+func (block *Block) rlpUncles() interface{} {
+ // Marshal the transactions of this block
+ uncles := make([]interface{}, len(block.Uncles))
+ for i, uncle := range block.Uncles {
+ // Cast it to a string (safe)
+ uncles[i] = uncle.header()
+ }
+
+ return uncles
+}
+
+func (block *Block) SetUncles(uncles []*Block) {
+ block.Uncles = uncles
+ block.UncleSha = crypto.Sha3(ethutil.Encode(block.rlpUncles()))
+}
+
+func (self *Block) SetReceipts(receipts Receipts) {
+ self.receipts = receipts
+ self.ReceiptSha = DeriveSha(receipts)
+ self.LogsBloom = CreateBloom(receipts)
+}
+
+func (self *Block) SetTransactions(txs Transactions) {
+ self.transactions = txs
+ self.TxSha = DeriveSha(txs)
+}
+
+func (block *Block) Value() *ethutil.Value {
+ return ethutil.NewValue([]interface{}{block.header(), block.transactions, block.rlpUncles()})
+}
+
+func (block *Block) RlpEncode() []byte {
+ // Encode a slice interface which contains the header and the list of
+ // transactions.
+ return block.Value().Encode()
+}
+
+func (block *Block) RlpDecode(data []byte) {
+ rlpValue := ethutil.NewValueFromBytes(data)
+ block.RlpValueDecode(rlpValue)
+}
+
+func (block *Block) RlpValueDecode(decoder *ethutil.Value) {
+ block.setHeader(decoder.Get(0))
+
+ // Tx list might be empty if this is an uncle. Uncles only have their
+ // header set.
+ if decoder.Get(1).IsNil() == false { // Yes explicitness
+ //receipts := decoder.Get(1)
+ //block.receipts = make([]*Receipt, receipts.Len())
+ txs := decoder.Get(1)
+ block.transactions = make(Transactions, txs.Len())
+ for i := 0; i < txs.Len(); i++ {
+ block.transactions[i] = NewTransactionFromValue(txs.Get(i))
+ //receipt := NewRecieptFromValue(receipts.Get(i))
+ //block.transactions[i] = receipt.Tx
+ //block.receipts[i] = receipt
+ }
+
+ }
+
+ if decoder.Get(2).IsNil() == false { // Yes explicitness
+ uncles := decoder.Get(2)
+ block.Uncles = make([]*Block, uncles.Len())
+ for i := 0; i < uncles.Len(); i++ {
+ block.Uncles[i] = NewUncleBlockFromValue(uncles.Get(i))
+ }
+ }
+
+}
+
+func (self *Block) setHeader(header *ethutil.Value) {
+ self.PrevHash = header.Get(0).Bytes()
+ self.UncleSha = header.Get(1).Bytes()
+ self.Coinbase = header.Get(2).Bytes()
+ self.state = state.New(trie.New(ethutil.Config.Db, header.Get(3).Val))
+ self.TxSha = header.Get(4).Bytes()
+ self.ReceiptSha = header.Get(5).Bytes()
+ self.LogsBloom = header.Get(6).Bytes()
+ self.Difficulty = header.Get(7).BigInt()
+ self.Number = header.Get(8).BigInt()
+ self.GasLimit = header.Get(9).BigInt()
+ self.GasUsed = header.Get(10).BigInt()
+ self.Time = int64(header.Get(11).BigInt().Uint64())
+ self.Extra = header.Get(12).Str()
+ self.Nonce = header.Get(13).Bytes()
+}
+
+func NewUncleBlockFromValue(header *ethutil.Value) *Block {
+ block := &Block{}
+ block.setHeader(header)
+
+ return block
+}
+
+func (block *Block) Trie() *trie.Trie {
+ return block.state.Trie
+}
+
+func (block *Block) Root() interface{} {
+ return block.state.Root()
+}
+
+func (block *Block) Diff() *big.Int {
+ return block.Difficulty
+}
+
+func (self *Block) Receipts() []*Receipt {
+ return self.receipts
+}
+
+func (block *Block) miningHeader() []interface{} {
+ return []interface{}{
+ // Sha of the previous block
+ block.PrevHash,
+ // Sha of uncles
+ block.UncleSha,
+ // Coinbase address
+ block.Coinbase,
+ // root state
+ block.Root(),
+ // tx root
+ block.TxSha,
+ // Sha of tx
+ block.ReceiptSha,
+ // Bloom
+ block.LogsBloom,
+ // Current block Difficulty
+ block.Difficulty,
+ // The block number
+ block.Number,
+ // Block upper gas bound
+ block.GasLimit,
+ // Block gas used
+ block.GasUsed,
+ // Time the block was found?
+ block.Time,
+ // Extra data
+ block.Extra,
+ }
+}
+
+func (block *Block) header() []interface{} {
+ return append(block.miningHeader(), block.Nonce)
+}
+
+func (block *Block) String() string {
+ return fmt.Sprintf(`
+ BLOCK(%x): Size: %v
+ PrevHash: %x
+ UncleSha: %x
+ Coinbase: %x
+ Root: %x
+ TxSha %x
+ ReceiptSha: %x
+ Bloom: %x
+ Difficulty: %v
+ Number: %v
+ MaxLimit: %v
+ GasUsed: %v
+ Time: %v
+ Extra: %v
+ Nonce: %x
+ NumTx: %v
+`,
+ block.Hash(),
+ block.Size(),
+ block.PrevHash,
+ block.UncleSha,
+ block.Coinbase,
+ block.Root(),
+ block.TxSha,
+ block.ReceiptSha,
+ block.LogsBloom,
+ block.Difficulty,
+ block.Number,
+ block.GasLimit,
+ block.GasUsed,
+ block.Time,
+ block.Extra,
+ block.Nonce,
+ len(block.transactions),
+ )
+}
+
+func (self *Block) Size() ethutil.StorageSize {
+ return ethutil.StorageSize(len(self.RlpEncode()))
+}
+
+// Implement RlpEncodable
+func (self *Block) RlpData() interface{} {
+ return []interface{}{self.header(), self.transactions, self.rlpUncles()}
+}
+
+// Implement pow.Block
+func (self *Block) N() []byte { return self.Nonce }
diff --git a/core/types/bloom9.go b/core/types/bloom9.go
new file mode 100644
index 000000000..c1841e553
--- /dev/null
+++ b/core/types/bloom9.go
@@ -0,0 +1,54 @@
+package types
+
+import (
+ "math/big"
+
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/state"
+)
+
+func CreateBloom(receipts Receipts) []byte {
+ bin := new(big.Int)
+ for _, receipt := range receipts {
+ bin.Or(bin, LogsBloom(receipt.logs))
+ }
+
+ return ethutil.LeftPadBytes(bin.Bytes(), 64)
+}
+
+func LogsBloom(logs state.Logs) *big.Int {
+ bin := new(big.Int)
+ for _, log := range logs {
+ data := make([][]byte, len(log.Topics())+1)
+ data[0] = log.Address()
+
+ for i, topic := range log.Topics() {
+ data[i+1] = topic
+ }
+
+ for _, b := range data {
+ bin.Or(bin, ethutil.BigD(bloom9(crypto.Sha3(b)).Bytes()))
+ }
+ }
+
+ return bin
+}
+
+func bloom9(b []byte) *big.Int {
+ r := new(big.Int)
+ for _, i := range []int{0, 2, 4} {
+ t := big.NewInt(1)
+ b := uint(b[i+1]) + 256*(uint(b[i])&1)
+ r.Or(r, t.Lsh(t, b))
+ }
+
+ return r
+}
+
+func BloomLookup(bin, topic []byte) bool {
+ bloom := ethutil.BigD(bin)
+ cmp := bloom9(crypto.Sha3(topic))
+
+ return bloom.And(bloom, cmp).Cmp(cmp) == 0
+}
diff --git a/core/types/bloom9_test.go b/core/types/bloom9_test.go
new file mode 100644
index 000000000..74e00cac6
--- /dev/null
+++ b/core/types/bloom9_test.go
@@ -0,0 +1,31 @@
+package types
+
+/*
+import (
+ "testing"
+
+ "github.com/ethereum/go-ethereum/state"
+)
+
+func TestBloom9(t *testing.T) {
+ testCase := []byte("testtest")
+ bin := LogsBloom([]state.Log{
+ {testCase, [][]byte{[]byte("hellohello")}, nil},
+ }).Bytes()
+ res := BloomLookup(bin, testCase)
+
+ if !res {
+ t.Errorf("Bloom lookup failed")
+ }
+}
+
+
+func TestAddress(t *testing.T) {
+ block := &Block{}
+ block.Coinbase = ethutil.Hex2Bytes("22341ae42d6dd7384bc8584e50419ea3ac75b83f")
+ fmt.Printf("%x\n", crypto.Sha3(block.Coinbase))
+
+ bin := CreateBloom(block)
+ fmt.Printf("bin = %x\n", ethutil.LeftPadBytes(bin, 64))
+}
+*/
diff --git a/core/types/common.go b/core/types/common.go
new file mode 100644
index 000000000..89cb5f498
--- /dev/null
+++ b/core/types/common.go
@@ -0,0 +1,16 @@
+package types
+
+import (
+ "math/big"
+
+ "github.com/ethereum/go-ethereum/state"
+ "github.com/ethereum/go-ethereum/wire"
+)
+
+type BlockProcessor interface {
+ Process(*Block) (*big.Int, state.Messages, error)
+}
+
+type Broadcaster interface {
+ Broadcast(wire.MsgType, []interface{})
+}
diff --git a/core/types/derive_sha.go b/core/types/derive_sha.go
new file mode 100644
index 000000000..1897ff198
--- /dev/null
+++ b/core/types/derive_sha.go
@@ -0,0 +1,20 @@
+package types
+
+import (
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/trie"
+)
+
+type DerivableList interface {
+ Len() int
+ GetRlp(i int) []byte
+}
+
+func DeriveSha(list DerivableList) []byte {
+ trie := trie.New(ethutil.Config.Db, "")
+ for i := 0; i < list.Len(); i++ {
+ trie.Update(string(ethutil.NewValue(i).Encode()), string(list.GetRlp(i)))
+ }
+
+ return trie.GetRoot()
+}
diff --git a/core/types/receipt.go b/core/types/receipt.go
new file mode 100644
index 000000000..bac64e41d
--- /dev/null
+++ b/core/types/receipt.go
@@ -0,0 +1,81 @@
+package types
+
+import (
+ "bytes"
+ "fmt"
+ "math/big"
+
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/state"
+)
+
+type Receipt struct {
+ PostState []byte
+ CumulativeGasUsed *big.Int
+ Bloom []byte
+ logs state.Logs
+}
+
+func NewReceipt(root []byte, cumalativeGasUsed *big.Int) *Receipt {
+ return &Receipt{PostState: ethutil.CopyBytes(root), CumulativeGasUsed: cumalativeGasUsed}
+}
+
+func NewRecieptFromValue(val *ethutil.Value) *Receipt {
+ r := &Receipt{}
+ r.RlpValueDecode(val)
+
+ return r
+}
+
+func (self *Receipt) SetLogs(logs state.Logs) {
+ self.logs = logs
+}
+
+func (self *Receipt) RlpValueDecode(decoder *ethutil.Value) {
+ self.PostState = decoder.Get(0).Bytes()
+ self.CumulativeGasUsed = decoder.Get(1).BigInt()
+ self.Bloom = decoder.Get(2).Bytes()
+
+ it := decoder.Get(3).NewIterator()
+ for it.Next() {
+ self.logs = append(self.logs, state.NewLogFromValue(it.Value()))
+ }
+}
+
+func (self *Receipt) RlpData() interface{} {
+ return []interface{}{self.PostState, self.CumulativeGasUsed, self.Bloom, self.logs.RlpData()}
+}
+
+func (self *Receipt) RlpEncode() []byte {
+ return ethutil.Encode(self.RlpData())
+}
+
+func (self *Receipt) Cmp(other *Receipt) bool {
+ if bytes.Compare(self.PostState, other.PostState) != 0 {
+ return false
+ }
+
+ return true
+}
+
+func (self *Receipt) String() string {
+ return fmt.Sprintf("receipt{med=%x cgas=%v bloom=%x logs=%v}", self.PostState, self.CumulativeGasUsed, self.Bloom, self.logs)
+}
+
+type Receipts []*Receipt
+
+func (self Receipts) RlpData() interface{} {
+ data := make([]interface{}, len(self))
+ for i, receipt := range self {
+ data[i] = receipt.RlpData()
+ }
+
+ return data
+}
+
+func (self Receipts) RlpEncode() []byte {
+ return ethutil.Encode(self.RlpData())
+}
+
+func (self Receipts) Len() int { return len(self) }
+func (self Receipts) GetRlp(i int) []byte { return ethutil.Rlp(self[i]) }
diff --git a/core/types/transaction.go b/core/types/transaction.go
new file mode 100644
index 000000000..f6ad0774b
--- /dev/null
+++ b/core/types/transaction.go
@@ -0,0 +1,224 @@
+package types
+
+import (
+ "fmt"
+ "math/big"
+
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/obscuren/secp256k1-go"
+)
+
+func IsContractAddr(addr []byte) bool {
+ return len(addr) == 0
+}
+
+type Transaction struct {
+ nonce uint64
+ recipient []byte
+ value *big.Int
+ gas *big.Int
+ gasPrice *big.Int
+ data []byte
+ v byte
+ r, s []byte
+}
+
+func NewContractCreationTx(value, gas, gasPrice *big.Int, script []byte) *Transaction {
+ return &Transaction{recipient: nil, value: value, gas: gas, gasPrice: gasPrice, data: script}
+}
+
+func NewTransactionMessage(to []byte, value, gas, gasPrice *big.Int, data []byte) *Transaction {
+ return &Transaction{recipient: to, value: value, gasPrice: gasPrice, gas: gas, data: data}
+}
+
+func NewTransactionFromBytes(data []byte) *Transaction {
+ tx := &Transaction{}
+ tx.RlpDecode(data)
+
+ return tx
+}
+
+func NewTransactionFromValue(val *ethutil.Value) *Transaction {
+ tx := &Transaction{}
+ tx.RlpValueDecode(val)
+
+ return tx
+}
+
+func (tx *Transaction) Hash() []byte {
+ data := []interface{}{tx.nonce, tx.gasPrice, tx.gas, tx.recipient, tx.value, tx.data}
+
+ return crypto.Sha3(ethutil.NewValue(data).Encode())
+}
+
+func (self *Transaction) Data() []byte {
+ return self.data
+}
+
+func (self *Transaction) Gas() *big.Int {
+ return self.gas
+}
+
+func (self *Transaction) GasPrice() *big.Int {
+ return self.gasPrice
+}
+
+func (self *Transaction) Value() *big.Int {
+ return self.value
+}
+
+func (self *Transaction) Nonce() uint64 {
+ return self.nonce
+}
+
+func (self *Transaction) SetNonce(nonce uint64) {
+ self.nonce = nonce
+}
+
+func (self *Transaction) From() []byte {
+ return self.Sender()
+}
+
+func (self *Transaction) To() []byte {
+ return self.recipient
+}
+
+func (tx *Transaction) Curve() (v byte, r []byte, s []byte) {
+ v = tx.v
+ r = ethutil.LeftPadBytes(tx.r, 32)
+ s = ethutil.LeftPadBytes(tx.s, 32)
+
+ return
+}
+
+func (tx *Transaction) Signature(key []byte) []byte {
+ hash := tx.Hash()
+
+ sig, _ := secp256k1.Sign(hash, key)
+
+ return sig
+}
+
+func (tx *Transaction) PublicKey() []byte {
+ hash := tx.Hash()
+
+ v, r, s := tx.Curve()
+
+ sig := append(r, s...)
+ sig = append(sig, v-27)
+
+ //pubkey := crypto.Ecrecover(append(hash, sig...))
+ pubkey, _ := secp256k1.RecoverPubkey(hash, sig)
+
+ return pubkey
+}
+
+func (tx *Transaction) Sender() []byte {
+ pubkey := tx.PublicKey()
+
+ // Validate the returned key.
+ // Return nil if public key isn't in full format
+ if len(pubkey) != 0 && pubkey[0] != 4 {
+ return nil
+ }
+
+ return crypto.Sha3(pubkey[1:])[12:]
+}
+
+func (tx *Transaction) Sign(privk []byte) error {
+
+ sig := tx.Signature(privk)
+
+ tx.r = sig[:32]
+ tx.s = sig[32:64]
+ tx.v = sig[64] + 27
+
+ return nil
+}
+
+func (tx *Transaction) RlpData() interface{} {
+ data := []interface{}{tx.nonce, tx.gasPrice, tx.gas, tx.recipient, tx.value, tx.data}
+
+ return append(data, tx.v, new(big.Int).SetBytes(tx.r).Bytes(), new(big.Int).SetBytes(tx.s).Bytes())
+}
+
+func (tx *Transaction) RlpValue() *ethutil.Value {
+ return ethutil.NewValue(tx.RlpData())
+}
+
+func (tx *Transaction) RlpEncode() []byte {
+ return tx.RlpValue().Encode()
+}
+
+func (tx *Transaction) RlpDecode(data []byte) {
+ tx.RlpValueDecode(ethutil.NewValueFromBytes(data))
+}
+
+func (tx *Transaction) RlpValueDecode(decoder *ethutil.Value) {
+ tx.nonce = decoder.Get(0).Uint()
+ tx.gasPrice = decoder.Get(1).BigInt()
+ tx.gas = decoder.Get(2).BigInt()
+ tx.recipient = decoder.Get(3).Bytes()
+ tx.value = decoder.Get(4).BigInt()
+ tx.data = decoder.Get(5).Bytes()
+ tx.v = byte(decoder.Get(6).Uint())
+
+ tx.r = decoder.Get(7).Bytes()
+ tx.s = decoder.Get(8).Bytes()
+}
+
+func (tx *Transaction) String() string {
+ return fmt.Sprintf(`
+ TX(%x)
+ Contract: %v
+ From: %x
+ To: %x
+ Nonce: %v
+ GasPrice: %v
+ Gas: %v
+ Value: %v
+ Data: 0x%x
+ V: 0x%x
+ R: 0x%x
+ S: 0x%x
+ Hex: %x
+ `,
+ tx.Hash(),
+ len(tx.recipient) == 0,
+ tx.Sender(),
+ tx.recipient,
+ tx.nonce,
+ tx.gasPrice,
+ tx.gas,
+ tx.value,
+ tx.data,
+ tx.v,
+ tx.r,
+ tx.s,
+ ethutil.Encode(tx),
+ )
+}
+
+// Transaction slice type for basic sorting
+type Transactions []*Transaction
+
+func (self Transactions) RlpData() interface{} {
+ // Marshal the transactions of this block
+ enc := make([]interface{}, len(self))
+ for i, tx := range self {
+ // Cast it to a string (safe)
+ enc[i] = tx.RlpData()
+ }
+
+ return enc
+}
+func (s Transactions) Len() int { return len(s) }
+func (s Transactions) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
+func (s Transactions) GetRlp(i int) []byte { return ethutil.Rlp(s[i]) }
+
+type TxByNonce struct{ Transactions }
+
+func (s TxByNonce) Less(i, j int) bool {
+ return s.Transactions[i].nonce < s.Transactions[j].nonce
+}
diff --git a/core/types/transaction_test.go b/core/types/transaction_test.go
new file mode 100644
index 000000000..ab1254f4c
--- /dev/null
+++ b/core/types/transaction_test.go
@@ -0,0 +1 @@
+package types
diff --git a/core/vm_env.go b/core/vm_env.go
new file mode 100644
index 000000000..ad63ecf9c
--- /dev/null
+++ b/core/vm_env.go
@@ -0,0 +1,61 @@
+package core
+
+import (
+ "math/big"
+
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/state"
+ "github.com/ethereum/go-ethereum/vm"
+)
+
+type VMEnv struct {
+ state *state.StateDB
+ block *types.Block
+ msg Message
+ depth int
+}
+
+func NewEnv(state *state.StateDB, msg Message, block *types.Block) *VMEnv {
+ return &VMEnv{
+ state: state,
+ block: block,
+ msg: msg,
+ }
+}
+
+func (self *VMEnv) Origin() []byte { return self.msg.From() }
+func (self *VMEnv) BlockNumber() *big.Int { return self.block.Number }
+func (self *VMEnv) PrevHash() []byte { return self.block.PrevHash }
+func (self *VMEnv) Coinbase() []byte { return self.block.Coinbase }
+func (self *VMEnv) Time() int64 { return self.block.Time }
+func (self *VMEnv) Difficulty() *big.Int { return self.block.Difficulty }
+func (self *VMEnv) BlockHash() []byte { return self.block.Hash() }
+func (self *VMEnv) Value() *big.Int { return self.msg.Value() }
+func (self *VMEnv) State() *state.StateDB { return self.state }
+func (self *VMEnv) GasLimit() *big.Int { return self.block.GasLimit }
+func (self *VMEnv) Depth() int { return self.depth }
+func (self *VMEnv) SetDepth(i int) { self.depth = i }
+func (self *VMEnv) AddLog(log state.Log) {
+ self.state.AddLog(log)
+}
+func (self *VMEnv) Transfer(from, to vm.Account, amount *big.Int) error {
+ return vm.Transfer(from, to, amount)
+}
+
+func (self *VMEnv) vm(addr, data []byte, gas, price, value *big.Int) *Execution {
+ return NewExecution(self, addr, data, gas, price, value)
+}
+
+func (self *VMEnv) Call(me vm.ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error) {
+ exe := self.vm(addr, data, gas, price, value)
+ return exe.Call(addr, me)
+}
+func (self *VMEnv) CallCode(me vm.ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error) {
+ exe := self.vm(me.Address(), data, gas, price, value)
+ return exe.Call(addr, me)
+}
+
+func (self *VMEnv) Create(me vm.ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error, vm.ClosureRef) {
+ exe := self.vm(addr, data, gas, price, value)
+ return exe.Create(me)
+}
diff --git a/crypto/crypto.go b/crypto/crypto.go
new file mode 100644
index 000000000..b8fd78fa2
--- /dev/null
+++ b/crypto/crypto.go
@@ -0,0 +1,115 @@
+package crypto
+
+import (
+ "crypto/ecdsa"
+ "crypto/elliptic"
+ "crypto/rand"
+ "crypto/sha256"
+
+ "code.google.com/p/go.crypto/ripemd160"
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/obscuren/ecies"
+ "github.com/obscuren/secp256k1-go"
+ "github.com/obscuren/sha3"
+)
+
+func init() {
+ // specify the params for the s256 curve
+ ecies.AddParamsForCurve(S256(), ecies.ECIES_AES128_SHA256)
+}
+
+func Sha3(data []byte) []byte {
+ d := sha3.NewKeccak256()
+ d.Write(data)
+
+ return d.Sum(nil)
+}
+
+// Creates an ethereum address given the bytes and the nonce
+func CreateAddress(b []byte, nonce uint64) []byte {
+ return Sha3(ethutil.NewValue([]interface{}{b, nonce}).Encode())[12:]
+}
+
+func Sha256(data []byte) []byte {
+ hash := sha256.Sum256(data)
+
+ return hash[:]
+}
+
+func Ripemd160(data []byte) []byte {
+ ripemd := ripemd160.New()
+ ripemd.Write(data)
+
+ return ripemd.Sum(nil)
+}
+
+func Ecrecover(data []byte) []byte {
+ var in = struct {
+ hash []byte
+ sig []byte
+ }{data[:32], data[32:]}
+
+ r, _ := secp256k1.RecoverPubkey(in.hash, in.sig)
+
+ return r
+}
+
+// New methods using proper ecdsa keys from the stdlib
+func ToECDSA(prv []byte) *ecdsa.PrivateKey {
+ if len(prv) == 0 {
+ return nil
+ }
+
+ priv := new(ecdsa.PrivateKey)
+ priv.PublicKey.Curve = S256()
+ priv.D = ethutil.BigD(prv)
+ priv.PublicKey.X, priv.PublicKey.Y = S256().ScalarBaseMult(prv)
+ return priv
+}
+
+func FromECDSA(prv *ecdsa.PrivateKey) []byte {
+ if prv == nil {
+ return nil
+ }
+ return prv.D.Bytes()
+}
+
+func ToECDSAPub(pub []byte) *ecdsa.PublicKey {
+ if len(pub) == 0 {
+ return nil
+ }
+ x, y := elliptic.Unmarshal(S256(), pub)
+ return &ecdsa.PublicKey{S256(), x, y}
+}
+
+func FromECDSAPub(pub *ecdsa.PublicKey) []byte {
+ if pub == nil {
+ return nil
+ }
+ return elliptic.Marshal(S256(), pub.X, pub.Y)
+}
+
+func GenerateKey() (*ecdsa.PrivateKey, error) {
+ return ecdsa.GenerateKey(S256(), rand.Reader)
+}
+
+func SigToPub(hash, sig []byte) *ecdsa.PublicKey {
+ s := Ecrecover(append(hash, sig...))
+ x, y := elliptic.Unmarshal(S256(), s)
+
+ return &ecdsa.PublicKey{S256(), x, y}
+}
+
+func Sign(hash []byte, prv *ecdsa.PrivateKey) (sig []byte, err error) {
+ sig, err = secp256k1.Sign(hash, prv.D.Bytes())
+ return
+}
+
+func Encrypt(pub *ecdsa.PublicKey, message []byte) ([]byte, error) {
+ return ecies.Encrypt(rand.Reader, ecies.ImportECDSAPublic(pub), message, nil, nil)
+}
+
+func Decrypt(prv *ecdsa.PrivateKey, ct []byte) ([]byte, error) {
+ key := ecies.ImportECDSA(prv)
+ return key.Decrypt(rand.Reader, ct, nil, nil)
+}
diff --git a/crypto/crypto_test.go b/crypto/crypto_test.go
new file mode 100644
index 000000000..af62a02a2
--- /dev/null
+++ b/crypto/crypto_test.go
@@ -0,0 +1,36 @@
+package crypto
+
+import (
+ "bytes"
+ "encoding/hex"
+ "testing"
+)
+
+// These tests are sanity checks.
+// They should ensure that we don't e.g. use Sha3-224 instead of Sha3-256
+// and that the sha3 library uses keccak-f permutation.
+
+func TestSha3(t *testing.T) {
+ msg := []byte("abc")
+ exp, _ := hex.DecodeString("4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45")
+ checkhash(t, "Sha3-256", Sha3, msg, exp)
+}
+
+func TestSha256(t *testing.T) {
+ msg := []byte("abc")
+ exp, _ := hex.DecodeString("ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad")
+ checkhash(t, "Sha256", Sha256, msg, exp)
+}
+
+func TestRipemd160(t *testing.T) {
+ msg := []byte("abc")
+ exp, _ := hex.DecodeString("8eb208f7e05d987a9b044a8e98c6b087f15a0bfc")
+ checkhash(t, "Ripemd160", Ripemd160, msg, exp)
+}
+
+func checkhash(t *testing.T, name string, f func([]byte) []byte, msg, exp []byte) {
+ sum := f(msg)
+ if bytes.Compare(exp, sum) != 0 {
+ t.Errorf("hash %s returned wrong result.\ngot: %x\nwant: %x", name, sum, exp)
+ }
+}
diff --git a/crypto/curve.go b/crypto/curve.go
new file mode 100644
index 000000000..131a0dd2f
--- /dev/null
+++ b/crypto/curve.go
@@ -0,0 +1,363 @@
+package crypto
+
+// Copyright 2010 The Go Authors. All rights reserved.
+// Copyright 2011 ThePiachu. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package bitelliptic implements several Koblitz elliptic curves over prime
+// fields.
+
+// This package operates, internally, on Jacobian coordinates. For a given
+// (x, y) position on the curve, the Jacobian coordinates are (x1, y1, z1)
+// where x = x1/z1² and y = y1/z1³. The greatest speedups come when the whole
+// calculation can be performed within the transform (as in ScalarMult and
+// ScalarBaseMult). But even for Add and Double, it's faster to apply and
+// reverse the transform than to operate in affine coordinates.
+
+import (
+ "crypto/elliptic"
+ "io"
+ "math/big"
+ "sync"
+)
+
+// A BitCurve represents a Koblitz Curve with a=0.
+// See http://www.hyperelliptic.org/EFD/g1p/auto-shortw.html
+type BitCurve struct {
+ P *big.Int // the order of the underlying field
+ N *big.Int // the order of the base point
+ B *big.Int // the constant of the BitCurve equation
+ Gx, Gy *big.Int // (x,y) of the base point
+ BitSize int // the size of the underlying field
+}
+
+func (BitCurve *BitCurve) Params() *elliptic.CurveParams {
+ return &elliptic.CurveParams{BitCurve.P, BitCurve.N, BitCurve.B, BitCurve.Gx, BitCurve.Gy, BitCurve.BitSize}
+}
+
+// IsOnBitCurve returns true if the given (x,y) lies on the BitCurve.
+func (BitCurve *BitCurve) IsOnCurve(x, y *big.Int) bool {
+ // y² = x³ + b
+ y2 := new(big.Int).Mul(y, y) //y²
+ y2.Mod(y2, BitCurve.P) //y²%P
+
+ x3 := new(big.Int).Mul(x, x) //x²
+ x3.Mul(x3, x) //x³
+
+ x3.Add(x3, BitCurve.B) //x³+B
+ x3.Mod(x3, BitCurve.P) //(x³+B)%P
+
+ return x3.Cmp(y2) == 0
+}
+
+//TODO: double check if the function is okay
+// affineFromJacobian reverses the Jacobian transform. See the comment at the
+// top of the file.
+func (BitCurve *BitCurve) affineFromJacobian(x, y, z *big.Int) (xOut, yOut *big.Int) {
+ zinv := new(big.Int).ModInverse(z, BitCurve.P)
+ zinvsq := new(big.Int).Mul(zinv, zinv)
+
+ xOut = new(big.Int).Mul(x, zinvsq)
+ xOut.Mod(xOut, BitCurve.P)
+ zinvsq.Mul(zinvsq, zinv)
+ yOut = new(big.Int).Mul(y, zinvsq)
+ yOut.Mod(yOut, BitCurve.P)
+ return
+}
+
+// Add returns the sum of (x1,y1) and (x2,y2)
+func (BitCurve *BitCurve) Add(x1, y1, x2, y2 *big.Int) (*big.Int, *big.Int) {
+ z := new(big.Int).SetInt64(1)
+ return BitCurve.affineFromJacobian(BitCurve.addJacobian(x1, y1, z, x2, y2, z))
+}
+
+// addJacobian takes two points in Jacobian coordinates, (x1, y1, z1) and
+// (x2, y2, z2) and returns their sum, also in Jacobian form.
+func (BitCurve *BitCurve) addJacobian(x1, y1, z1, x2, y2, z2 *big.Int) (*big.Int, *big.Int, *big.Int) {
+ // See http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#addition-add-2007-bl
+ z1z1 := new(big.Int).Mul(z1, z1)
+ z1z1.Mod(z1z1, BitCurve.P)
+ z2z2 := new(big.Int).Mul(z2, z2)
+ z2z2.Mod(z2z2, BitCurve.P)
+
+ u1 := new(big.Int).Mul(x1, z2z2)
+ u1.Mod(u1, BitCurve.P)
+ u2 := new(big.Int).Mul(x2, z1z1)
+ u2.Mod(u2, BitCurve.P)
+ h := new(big.Int).Sub(u2, u1)
+ if h.Sign() == -1 {
+ h.Add(h, BitCurve.P)
+ }
+ i := new(big.Int).Lsh(h, 1)
+ i.Mul(i, i)
+ j := new(big.Int).Mul(h, i)
+
+ s1 := new(big.Int).Mul(y1, z2)
+ s1.Mul(s1, z2z2)
+ s1.Mod(s1, BitCurve.P)
+ s2 := new(big.Int).Mul(y2, z1)
+ s2.Mul(s2, z1z1)
+ s2.Mod(s2, BitCurve.P)
+ r := new(big.Int).Sub(s2, s1)
+ if r.Sign() == -1 {
+ r.Add(r, BitCurve.P)
+ }
+ r.Lsh(r, 1)
+ v := new(big.Int).Mul(u1, i)
+
+ x3 := new(big.Int).Set(r)
+ x3.Mul(x3, x3)
+ x3.Sub(x3, j)
+ x3.Sub(x3, v)
+ x3.Sub(x3, v)
+ x3.Mod(x3, BitCurve.P)
+
+ y3 := new(big.Int).Set(r)
+ v.Sub(v, x3)
+ y3.Mul(y3, v)
+ s1.Mul(s1, j)
+ s1.Lsh(s1, 1)
+ y3.Sub(y3, s1)
+ y3.Mod(y3, BitCurve.P)
+
+ z3 := new(big.Int).Add(z1, z2)
+ z3.Mul(z3, z3)
+ z3.Sub(z3, z1z1)
+ if z3.Sign() == -1 {
+ z3.Add(z3, BitCurve.P)
+ }
+ z3.Sub(z3, z2z2)
+ if z3.Sign() == -1 {
+ z3.Add(z3, BitCurve.P)
+ }
+ z3.Mul(z3, h)
+ z3.Mod(z3, BitCurve.P)
+
+ return x3, y3, z3
+}
+
+// Double returns 2*(x,y)
+func (BitCurve *BitCurve) Double(x1, y1 *big.Int) (*big.Int, *big.Int) {
+ z1 := new(big.Int).SetInt64(1)
+ return BitCurve.affineFromJacobian(BitCurve.doubleJacobian(x1, y1, z1))
+}
+
+// doubleJacobian takes a point in Jacobian coordinates, (x, y, z), and
+// returns its double, also in Jacobian form.
+func (BitCurve *BitCurve) doubleJacobian(x, y, z *big.Int) (*big.Int, *big.Int, *big.Int) {
+ // See http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#doubling-dbl-2009-l
+
+ a := new(big.Int).Mul(x, x) //X1²
+ b := new(big.Int).Mul(y, y) //Y1²
+ c := new(big.Int).Mul(b, b) //B²
+
+ d := new(big.Int).Add(x, b) //X1+B
+ d.Mul(d, d) //(X1+B)²
+ d.Sub(d, a) //(X1+B)²-A
+ d.Sub(d, c) //(X1+B)²-A-C
+ d.Mul(d, big.NewInt(2)) //2*((X1+B)²-A-C)
+
+ e := new(big.Int).Mul(big.NewInt(3), a) //3*A
+ f := new(big.Int).Mul(e, e) //E²
+
+ x3 := new(big.Int).Mul(big.NewInt(2), d) //2*D
+ x3.Sub(f, x3) //F-2*D
+ x3.Mod(x3, BitCurve.P)
+
+ y3 := new(big.Int).Sub(d, x3) //D-X3
+ y3.Mul(e, y3) //E*(D-X3)
+ y3.Sub(y3, new(big.Int).Mul(big.NewInt(8), c)) //E*(D-X3)-8*C
+ y3.Mod(y3, BitCurve.P)
+
+ z3 := new(big.Int).Mul(y, z) //Y1*Z1
+ z3.Mul(big.NewInt(2), z3) //3*Y1*Z1
+ z3.Mod(z3, BitCurve.P)
+
+ return x3, y3, z3
+}
+
+//TODO: double check if it is okay
+// ScalarMult returns k*(Bx,By) where k is a number in big-endian form.
+func (BitCurve *BitCurve) ScalarMult(Bx, By *big.Int, k []byte) (*big.Int, *big.Int) {
+ // We have a slight problem in that the identity of the group (the
+ // point at infinity) cannot be represented in (x, y) form on a finite
+ // machine. Thus the standard add/double algorithm has to be tweaked
+ // slightly: our initial state is not the identity, but x, and we
+ // ignore the first true bit in |k|. If we don't find any true bits in
+ // |k|, then we return nil, nil, because we cannot return the identity
+ // element.
+
+ Bz := new(big.Int).SetInt64(1)
+ x := Bx
+ y := By
+ z := Bz
+
+ seenFirstTrue := false
+ for _, byte := range k {
+ for bitNum := 0; bitNum < 8; bitNum++ {
+ if seenFirstTrue {
+ x, y, z = BitCurve.doubleJacobian(x, y, z)
+ }
+ if byte&0x80 == 0x80 {
+ if !seenFirstTrue {
+ seenFirstTrue = true
+ } else {
+ x, y, z = BitCurve.addJacobian(Bx, By, Bz, x, y, z)
+ }
+ }
+ byte <<= 1
+ }
+ }
+
+ if !seenFirstTrue {
+ return nil, nil
+ }
+
+ return BitCurve.affineFromJacobian(x, y, z)
+}
+
+// ScalarBaseMult returns k*G, where G is the base point of the group and k is
+// an integer in big-endian form.
+func (BitCurve *BitCurve) ScalarBaseMult(k []byte) (*big.Int, *big.Int) {
+ return BitCurve.ScalarMult(BitCurve.Gx, BitCurve.Gy, k)
+}
+
+var mask = []byte{0xff, 0x1, 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f}
+
+//TODO: double check if it is okay
+// GenerateKey returns a public/private key pair. The private key is generated
+// using the given reader, which must return random data.
+func (BitCurve *BitCurve) GenerateKey(rand io.Reader) (priv []byte, x, y *big.Int, err error) {
+ byteLen := (BitCurve.BitSize + 7) >> 3
+ priv = make([]byte, byteLen)
+
+ for x == nil {
+ _, err = io.ReadFull(rand, priv)
+ if err != nil {
+ return
+ }
+ // We have to mask off any excess bits in the case that the size of the
+ // underlying field is not a whole number of bytes.
+ priv[0] &= mask[BitCurve.BitSize%8]
+ // This is because, in tests, rand will return all zeros and we don't
+ // want to get the point at infinity and loop forever.
+ priv[1] ^= 0x42
+ x, y = BitCurve.ScalarBaseMult(priv)
+ }
+ return
+}
+
+// Marshal converts a point into the form specified in section 4.3.6 of ANSI
+// X9.62.
+func (BitCurve *BitCurve) Marshal(x, y *big.Int) []byte {
+ byteLen := (BitCurve.BitSize + 7) >> 3
+
+ ret := make([]byte, 1+2*byteLen)
+ ret[0] = 4 // uncompressed point
+
+ xBytes := x.Bytes()
+ copy(ret[1+byteLen-len(xBytes):], xBytes)
+ yBytes := y.Bytes()
+ copy(ret[1+2*byteLen-len(yBytes):], yBytes)
+ return ret
+}
+
+// Unmarshal converts a point, serialised by Marshal, into an x, y pair. On
+// error, x = nil.
+func (BitCurve *BitCurve) Unmarshal(data []byte) (x, y *big.Int) {
+ byteLen := (BitCurve.BitSize + 7) >> 3
+ if len(data) != 1+2*byteLen {
+ return
+ }
+ if data[0] != 4 { // uncompressed form
+ return
+ }
+ x = new(big.Int).SetBytes(data[1 : 1+byteLen])
+ y = new(big.Int).SetBytes(data[1+byteLen:])
+ return
+}
+
+//curve parameters taken from:
+//http://www.secg.org/collateral/sec2_final.pdf
+
+var initonce sync.Once
+var ecp160k1 *BitCurve
+var ecp192k1 *BitCurve
+var ecp224k1 *BitCurve
+var ecp256k1 *BitCurve
+
+func initAll() {
+ initS160()
+ initS192()
+ initS224()
+ initS256()
+}
+
+func initS160() {
+ // See SEC 2 section 2.4.1
+ ecp160k1 = new(BitCurve)
+ ecp160k1.P, _ = new(big.Int).SetString("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73", 16)
+ ecp160k1.N, _ = new(big.Int).SetString("0100000000000000000001B8FA16DFAB9ACA16B6B3", 16)
+ ecp160k1.B, _ = new(big.Int).SetString("0000000000000000000000000000000000000007", 16)
+ ecp160k1.Gx, _ = new(big.Int).SetString("3B4C382CE37AA192A4019E763036F4F5DD4D7EBB", 16)
+ ecp160k1.Gy, _ = new(big.Int).SetString("938CF935318FDCED6BC28286531733C3F03C4FEE", 16)
+ ecp160k1.BitSize = 160
+}
+
+func initS192() {
+ // See SEC 2 section 2.5.1
+ ecp192k1 = new(BitCurve)
+ ecp192k1.P, _ = new(big.Int).SetString("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37", 16)
+ ecp192k1.N, _ = new(big.Int).SetString("FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D", 16)
+ ecp192k1.B, _ = new(big.Int).SetString("000000000000000000000000000000000000000000000003", 16)
+ ecp192k1.Gx, _ = new(big.Int).SetString("DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D", 16)
+ ecp192k1.Gy, _ = new(big.Int).SetString("9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D", 16)
+ ecp192k1.BitSize = 192
+}
+
+func initS224() {
+ // See SEC 2 section 2.6.1
+ ecp224k1 = new(BitCurve)
+ ecp224k1.P, _ = new(big.Int).SetString("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFE56D", 16)
+ ecp224k1.N, _ = new(big.Int).SetString("010000000000000000000000000001DCE8D2EC6184CAF0A971769FB1F7", 16)
+ ecp224k1.B, _ = new(big.Int).SetString("00000000000000000000000000000000000000000000000000000005", 16)
+ ecp224k1.Gx, _ = new(big.Int).SetString("A1455B334DF099DF30FC28A169A467E9E47075A90F7E650EB6B7A45C", 16)
+ ecp224k1.Gy, _ = new(big.Int).SetString("7E089FED7FBA344282CAFBD6F7E319F7C0B0BD59E2CA4BDB556D61A5", 16)
+ ecp224k1.BitSize = 224
+}
+
+func initS256() {
+ // See SEC 2 section 2.7.1
+ ecp256k1 = new(BitCurve)
+ ecp256k1.P, _ = new(big.Int).SetString("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F", 16)
+ ecp256k1.N, _ = new(big.Int).SetString("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141", 16)
+ ecp256k1.B, _ = new(big.Int).SetString("0000000000000000000000000000000000000000000000000000000000000007", 16)
+ ecp256k1.Gx, _ = new(big.Int).SetString("79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798", 16)
+ ecp256k1.Gy, _ = new(big.Int).SetString("483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8", 16)
+ ecp256k1.BitSize = 256
+}
+
+// S160 returns a BitCurve which implements secp160k1 (see SEC 2 section 2.4.1)
+func S160() *BitCurve {
+ initonce.Do(initAll)
+ return ecp160k1
+}
+
+// S192 returns a BitCurve which implements secp192k1 (see SEC 2 section 2.5.1)
+func S192() *BitCurve {
+ initonce.Do(initAll)
+ return ecp192k1
+}
+
+// S224 returns a BitCurve which implements secp224k1 (see SEC 2 section 2.6.1)
+func S224() *BitCurve {
+ initonce.Do(initAll)
+ return ecp224k1
+}
+
+// S256 returns a BitCurve which implements secp256k1 (see SEC 2 section 2.7.1)
+func S256() *BitCurve {
+ initonce.Do(initAll)
+ return ecp256k1
+}
diff --git a/crypto/encrypt_decrypt_test.go b/crypto/encrypt_decrypt_test.go
new file mode 100644
index 000000000..85b43c406
--- /dev/null
+++ b/crypto/encrypt_decrypt_test.go
@@ -0,0 +1,40 @@
+package crypto
+
+import (
+ "bytes"
+ "fmt"
+ "testing"
+
+ "github.com/ethereum/go-ethereum/ethutil"
+)
+
+func TestBox(t *testing.T) {
+ prv1 := ToECDSA(ethutil.Hex2Bytes("4b50fa71f5c3eeb8fdc452224b2395af2fcc3d125e06c32c82e048c0559db03f"))
+ prv2 := ToECDSA(ethutil.Hex2Bytes("d0b043b4c5d657670778242d82d68a29d25d7d711127d17b8e299f156dad361a"))
+ pub2 := ToECDSAPub(ethutil.Hex2Bytes("04bd27a63c91fe3233c5777e6d3d7b39204d398c8f92655947eb5a373d46e1688f022a1632d264725cbc7dc43ee1cfebde42fa0a86d08b55d2acfbb5e9b3b48dc5"))
+
+ message := []byte("Hello, world.")
+ ct, err := Encrypt(pub2, message)
+ if err != nil {
+ fmt.Println(err.Error())
+ t.FailNow()
+ }
+
+ pt, err := Decrypt(prv2, ct)
+ if err != nil {
+ fmt.Println(err.Error())
+ t.FailNow()
+ }
+
+ if !bytes.Equal(pt, message) {
+ fmt.Println("ecies: plaintext doesn't match message")
+ t.FailNow()
+ }
+
+ _, err = Decrypt(prv1, pt)
+ if err == nil {
+ fmt.Println("ecies: encryption should not have succeeded")
+ t.FailNow()
+ }
+
+}
diff --git a/crypto/key_manager.go b/crypto/key_manager.go
new file mode 100644
index 000000000..326e559e0
--- /dev/null
+++ b/crypto/key_manager.go
@@ -0,0 +1,134 @@
+package crypto
+
+import (
+ "fmt"
+ "sync"
+
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/logger"
+)
+
+var keylogger = logger.NewLogger("KEY")
+
+type KeyManager struct {
+ keyRing *KeyRing
+ session string
+ keyStore KeyStore // interface
+ keyRings map[string]*KeyRing // cache
+ keyPair *KeyPair
+}
+
+func NewDBKeyManager(db ethutil.Database) *KeyManager {
+ return &KeyManager{keyStore: &DBKeyStore{db: db}, keyRings: make(map[string]*KeyRing)}
+}
+
+func NewFileKeyManager(basedir string) *KeyManager {
+ return &KeyManager{keyStore: &FileKeyStore{basedir: basedir}, keyRings: make(map[string]*KeyRing)}
+}
+
+func (k *KeyManager) KeyPair() *KeyPair {
+ return k.keyPair
+}
+
+func (k *KeyManager) KeyRing() *KeyPair {
+ return k.keyPair
+}
+
+func (k *KeyManager) PrivateKey() []byte {
+ return k.keyPair.PrivateKey
+}
+
+func (k *KeyManager) PublicKey() []byte {
+ return k.keyPair.PublicKey
+}
+
+func (k *KeyManager) Address() []byte {
+ return k.keyPair.Address()
+}
+
+func (k *KeyManager) save(session string, keyRing *KeyRing) error {
+ err := k.keyStore.Save(session, keyRing)
+ if err != nil {
+ return err
+ }
+ k.keyRings[session] = keyRing
+ return nil
+}
+
+func (k *KeyManager) load(session string) (*KeyRing, error) {
+ keyRing, found := k.keyRings[session]
+ if !found {
+ var err error
+ keyRing, err = k.keyStore.Load(session)
+ if err != nil {
+ return nil, err
+ }
+ }
+ return keyRing, nil
+}
+
+func cursorError(cursor int, len int) error {
+ return fmt.Errorf("cursor %d out of range (0..%d)", cursor, len)
+}
+
+func (k *KeyManager) reset(session string, cursor int, keyRing *KeyRing) error {
+ if cursor >= keyRing.Len() {
+ return cursorError(cursor, keyRing.Len())
+ }
+ lock := &sync.Mutex{}
+ lock.Lock()
+ defer lock.Unlock()
+ err := k.save(session, keyRing)
+ if err != nil {
+ return err
+ }
+ k.session = session
+ k.keyRing = keyRing
+ k.keyPair = keyRing.GetKeyPair(cursor)
+ return nil
+}
+
+func (k *KeyManager) SetCursor(cursor int) error {
+ if cursor >= k.keyRing.Len() {
+ return cursorError(cursor, k.keyRing.Len())
+ }
+ k.keyPair = k.keyRing.GetKeyPair(cursor)
+ return nil
+}
+
+func (k *KeyManager) Init(session string, cursor int, force bool) error {
+ var keyRing *KeyRing
+ if !force {
+ var err error
+ keyRing, err = k.load(session)
+ if err != nil {
+ return err
+ }
+ }
+ if keyRing == nil {
+ keyRing = NewGeneratedKeyRing(1)
+ keylogger.Infof("Created keypair. Private key: %x\n", keyRing.keys[0].PrivateKey)
+ }
+ return k.reset(session, cursor, keyRing)
+}
+
+func (k *KeyManager) InitFromSecretsFile(session string, cursor int, secretsfile string) error {
+ keyRing, err := NewKeyRingFromFile(secretsfile)
+ if err != nil {
+ return err
+ }
+ return k.reset(session, cursor, keyRing)
+}
+
+func (k *KeyManager) InitFromString(session string, cursor int, secrets string) error {
+ keyRing, err := NewKeyRingFromString(secrets)
+ if err != nil {
+ return err
+ }
+ return k.reset(session, cursor, keyRing)
+}
+
+func (k *KeyManager) Export(dir string) error {
+ fileKeyStore := FileKeyStore{dir}
+ return fileKeyStore.Save(k.session, k.keyRing)
+}
diff --git a/crypto/key_store.go b/crypto/key_store.go
new file mode 100644
index 000000000..04560a04e
--- /dev/null
+++ b/crypto/key_store.go
@@ -0,0 +1,113 @@
+package crypto
+
+import (
+ "fmt"
+ "io/ioutil"
+ "os"
+ "path"
+ "strings"
+
+ "github.com/ethereum/go-ethereum/ethutil"
+)
+
+type KeyStore interface {
+ Load(string) (*KeyRing, error)
+ Save(string, *KeyRing) error
+}
+
+type DBKeyStore struct {
+ db ethutil.Database
+}
+
+const dbKeyPrefix = "KeyRing"
+
+func (k *DBKeyStore) dbKey(session string) []byte {
+ return []byte(fmt.Sprintf("%s%s", dbKeyPrefix, session))
+}
+
+func (k *DBKeyStore) Save(session string, keyRing *KeyRing) error {
+ k.db.Put(k.dbKey(session), keyRing.RlpEncode())
+ return nil
+}
+
+func (k *DBKeyStore) Load(session string) (*KeyRing, error) {
+ data, err := k.db.Get(k.dbKey(session))
+ if err != nil {
+ return nil, nil
+ }
+ var keyRing *KeyRing
+ keyRing, err = NewKeyRingFromBytes(data)
+ if err != nil {
+ return nil, err
+ }
+ // if empty keyRing is found we return nil, no error
+ if keyRing.Len() == 0 {
+ return nil, nil
+ }
+ return keyRing, nil
+}
+
+type FileKeyStore struct {
+ basedir string
+}
+
+func (k *FileKeyStore) Save(session string, keyRing *KeyRing) error {
+ var content []byte
+ var err error
+ var privateKeys []string
+ var publicKeys []string
+ var mnemonics []string
+ var addresses []string
+ keyRing.Each(func(keyPair *KeyPair) {
+ privateKeys = append(privateKeys, ethutil.Bytes2Hex(keyPair.PrivateKey))
+ publicKeys = append(publicKeys, ethutil.Bytes2Hex(keyPair.PublicKey))
+ addresses = append(addresses, ethutil.Bytes2Hex(keyPair.Address()))
+ mnemonics = append(mnemonics, keyPair.Mnemonic())
+ })
+
+ basename := session
+ if session == "" {
+ basename = "default"
+ }
+
+ path := path.Join(k.basedir, basename)
+ content = []byte(strings.Join(privateKeys, "\n"))
+ err = ioutil.WriteFile(path+".prv", content, 0600)
+ if err != nil {
+ return err
+ }
+
+ content = []byte(strings.Join(publicKeys, "\n"))
+ err = ioutil.WriteFile(path+".pub", content, 0644)
+ if err != nil {
+ return err
+ }
+
+ content = []byte(strings.Join(addresses, "\n"))
+ err = ioutil.WriteFile(path+".addr", content, 0644)
+ if err != nil {
+ return err
+ }
+
+ content = []byte(strings.Join(mnemonics, "\n"))
+ err = ioutil.WriteFile(path+".mne", content, 0600)
+ if err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func (k *FileKeyStore) Load(session string) (*KeyRing, error) {
+ basename := session
+ if session == "" {
+ basename = "default"
+ }
+ secfile := path.Join(k.basedir, basename+".prv")
+ _, err := os.Stat(secfile)
+ // if file is not found then we return nil, no error
+ if err != nil {
+ return nil, nil
+ }
+ return NewKeyRingFromFile(secfile)
+}
diff --git a/crypto/keypair.go b/crypto/keypair.go
new file mode 100644
index 000000000..d02875ded
--- /dev/null
+++ b/crypto/keypair.go
@@ -0,0 +1,58 @@
+package crypto
+
+import (
+ "strings"
+
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/obscuren/secp256k1-go"
+)
+
+type KeyPair struct {
+ PrivateKey []byte
+ PublicKey []byte
+ address []byte
+ mnemonic string
+ // The associated account
+ // account *StateObject
+}
+
+func GenerateNewKeyPair() *KeyPair {
+ _, prv := secp256k1.GenerateKeyPair()
+ keyPair, _ := NewKeyPairFromSec(prv) // swallow error, this one cannot err
+ return keyPair
+}
+
+func NewKeyPairFromSec(seckey []byte) (*KeyPair, error) {
+ pubkey, err := secp256k1.GeneratePubKey(seckey)
+ if err != nil {
+ return nil, err
+ }
+
+ return &KeyPair{PrivateKey: seckey, PublicKey: pubkey}, nil
+}
+
+func (k *KeyPair) Address() []byte {
+ if k.address == nil {
+ k.address = Sha3(k.PublicKey[1:])[12:]
+ }
+ return k.address
+}
+
+func (k *KeyPair) Mnemonic() string {
+ if k.mnemonic == "" {
+ k.mnemonic = strings.Join(MnemonicEncode(ethutil.Bytes2Hex(k.PrivateKey)), " ")
+ }
+ return k.mnemonic
+}
+
+func (k *KeyPair) AsStrings() (string, string, string, string) {
+ return k.Mnemonic(), ethutil.Bytes2Hex(k.Address()), ethutil.Bytes2Hex(k.PrivateKey), ethutil.Bytes2Hex(k.PublicKey)
+}
+
+func (k *KeyPair) RlpEncode() []byte {
+ return k.RlpValue().Encode()
+}
+
+func (k *KeyPair) RlpValue() *ethutil.Value {
+ return ethutil.NewValue(k.PrivateKey)
+}
diff --git a/crypto/keyring.go b/crypto/keyring.go
new file mode 100644
index 000000000..eab13dbc4
--- /dev/null
+++ b/crypto/keyring.go
@@ -0,0 +1,123 @@
+package crypto
+
+import (
+ "fmt"
+ "io/ioutil"
+ "strings"
+
+ "github.com/ethereum/go-ethereum/ethutil"
+)
+
+type KeyRing struct {
+ keys []*KeyPair
+}
+
+func NewKeyRing() *KeyRing {
+ return &KeyRing{}
+}
+
+func (k *KeyRing) AddKeyPair(keyPair *KeyPair) {
+ k.keys = append(k.keys, keyPair)
+}
+
+func (k *KeyRing) GetKeyPair(i int) *KeyPair {
+ if len(k.keys) > i {
+ return k.keys[i]
+ }
+
+ return nil
+}
+
+func (k *KeyRing) Empty() bool {
+ return k.Len() == 0
+}
+
+func (k *KeyRing) Len() int {
+ return len(k.keys)
+}
+
+func (k *KeyRing) Each(f func(*KeyPair)) {
+ for _, keyPair := range k.keys {
+ f(keyPair)
+ }
+}
+
+func NewGeneratedKeyRing(len int) *KeyRing {
+ keyRing := NewKeyRing()
+ for i := 0; i < len; i++ {
+ keyRing.AddKeyPair(GenerateNewKeyPair())
+ }
+ return keyRing
+}
+
+func NewKeyRingFromFile(secfile string) (*KeyRing, error) {
+ var content []byte
+ var err error
+ content, err = ioutil.ReadFile(secfile)
+ if err != nil {
+ return nil, err
+ }
+ keyRing, err := NewKeyRingFromString(string(content))
+ if err != nil {
+ return nil, err
+ }
+ return keyRing, nil
+}
+
+func NewKeyRingFromString(content string) (*KeyRing, error) {
+ secretStrings := strings.Split(content, "\n")
+ var secrets [][]byte
+ for _, secretString := range secretStrings {
+ secret := secretString
+ words := strings.Split(secretString, " ")
+ if len(words) == 24 {
+ secret = MnemonicDecode(words)
+ } else if len(words) != 1 {
+ return nil, fmt.Errorf("Unrecognised key format")
+ }
+
+ if len(secret) != 0 {
+ secrets = append(secrets, ethutil.Hex2Bytes(secret))
+ }
+ }
+
+ return NewKeyRingFromSecrets(secrets)
+}
+
+func NewKeyRingFromSecrets(secs [][]byte) (*KeyRing, error) {
+ keyRing := NewKeyRing()
+ for _, sec := range secs {
+ keyPair, err := NewKeyPairFromSec(sec)
+ if err != nil {
+ return nil, err
+ }
+ keyRing.AddKeyPair(keyPair)
+ }
+ return keyRing, nil
+}
+
+func NewKeyRingFromBytes(data []byte) (*KeyRing, error) {
+ var secrets [][]byte
+ it := ethutil.NewValueFromBytes(data).NewIterator()
+ for it.Next() {
+ secret := it.Value().Bytes()
+ secrets = append(secrets, secret)
+ }
+ keyRing, err := NewKeyRingFromSecrets(secrets)
+ if err != nil {
+ return nil, err
+ }
+ return keyRing, nil
+}
+
+func (k *KeyRing) RlpEncode() []byte {
+ return k.RlpValue().Encode()
+}
+
+func (k *KeyRing) RlpValue() *ethutil.Value {
+ v := ethutil.EmptyValue()
+ k.Each(func(keyPair *KeyPair) {
+ v.Append(keyPair.RlpValue())
+ })
+ return v
+}
diff --git a/crypto/keys_test.go b/crypto/keys_test.go
new file mode 100644
index 000000000..56e851969
--- /dev/null
+++ b/crypto/keys_test.go
@@ -0,0 +1,122 @@
+package crypto
+
+// import (
+// "github.com/ethereum/go-ethereum/ethdb"
+// // "io/ioutil"
+// "fmt"
+// "os"
+// "path"
+// "testing"
+// )
+
+// // test if persistence layer works
+// func TestDBKeyManager(t *testing.T) {
+// memdb, _ := ethdb.NewMemDatabase()
+// keyManager0 := NewDBKeyManager(memdb)
+// err := keyManager0.Init("", 0, false)
+// if err != nil {
+// t.Error("Unexpected error: ", err)
+// }
+// keyManager1 := NewDBKeyManager(memdb)
+// err = keyManager1.Init("", 0, false)
+// if err != nil {
+// t.Error("Unexpected error: ", err)
+// }
+// if string(keyManager0.PrivateKey()) != string(keyManager1.PrivateKey()) {
+// t.Error("Expected private keys %x, %x, to be identical via db persistence", keyManager0.PrivateKey(), keyManager1.PrivateKey())
+// }
+// err = keyManager1.Init("", 0, true)
+// if err != nil {
+// t.Error("Unexpected error: ", err)
+// }
+// if string(keyManager0.PrivateKey()) == string(keyManager1.PrivateKey()) {
+// t.Error("Expected private keys %x, %x, to be be different despite db persistence if force generate", keyManager0.PrivateKey(), keyManager1.PrivateKey())
+// }
+// }
+
+// func TestFileKeyManager(t *testing.T) {
+// basedir0 := "/tmp/ethtest0"
+// os.RemoveAll(basedir0)
+// os.Mkdir(basedir0, 0777)
+
+// keyManager0 := NewFileKeyManager(basedir0)
+// err := keyManager0.Init("", 0, false)
+// if err != nil {
+// t.Error("Unexpected error: ", err)
+// }
+
+// keyManager1 := NewFileKeyManager(basedir0)
+
+// err = keyManager1.Init("", 0, false)
+// if err != nil {
+// t.Error("Unexpected error: ", err)
+// }
+// if string(keyManager0.PrivateKey()) != string(keyManager1.PrivateKey()) {
+// t.Error("Expected private keys %x, %x, to be identical via db persistence", keyManager0.PrivateKey(), keyManager1.PrivateKey())
+// }
+
+// err = keyManager1.Init("", 0, true)
+// if err != nil {
+// t.Error("Unexpected error: ", err)
+// }
+// if string(keyManager0.PrivateKey()) == string(keyManager1.PrivateKey()) {
+// t.Error("Expected private keys %x, %x, to be be different despite db persistence if force generate", keyManager0.PrivateKey(), keyManager1.PrivateKey())
+// }
+// }
+
+// // cursor errors
+// func TestCursorErrors(t *testing.T) {
+// memdb, _ := ethdb.NewMemDatabase()
+// keyManager0 := NewDBKeyManager(memdb)
+// err := keyManager0.Init("", 0, false)
+// err = keyManager0.Init("", 1, false)
+// if err == nil {
+// t.Error("Expected cursor error")
+// }
+// err = keyManager0.SetCursor(1)
+// if err == nil {
+// t.Error("Expected cursor error")
+// }
+// }
+
+// func TestExportImport(t *testing.T) {
+// memdb, _ := ethdb.NewMemDatabase()
+// keyManager0 := NewDBKeyManager(memdb)
+// err := keyManager0.Init("", 0, false)
+// basedir0 := "/tmp/ethtest0"
+// os.RemoveAll(basedir0)
+// os.Mkdir(basedir0, 0777)
+// keyManager0.Export(basedir0)
+
+// keyManager1 := NewFileKeyManager(basedir0)
+// err = keyManager1.Init("", 0, false)
+// if err != nil {
+// t.Error("Unexpected error: ", err)
+// }
+// fmt.Printf("keyRing: %v\n", keyManager0.KeyPair())
+// fmt.Printf("keyRing: %v\n", keyManager1.KeyPair())
+// if string(keyManager0.PrivateKey()) != string(keyManager1.PrivateKey()) {
+// t.Error("Expected private keys %x, %x, to be identical via export to filestore basedir", keyManager0.PrivateKey(), keyManager1.PrivateKey())
+// }
+// path.Join("")
+
+// // memdb, _ = ethdb.NewMemDatabase()
+// // keyManager2 := NewDBKeyManager(memdb)
+// // err = keyManager2.InitFromSecretsFile("", 0, path.Join(basedir0, "default.prv"))
+// // if err != nil {
+// // t.Error("Unexpected error: ", err)
+// // }
+// // if string(keyManager0.PrivateKey()) != string(keyManager2.PrivateKey()) {
+// // t.Error("Expected private keys %s, %s, to be identical via export/import prv", keyManager0.PrivateKey(), keyManager1.PrivateKey())
+// // }
+
+// // memdb, _ = ethdb.NewMemDatabase()
+// // keyManager3 := NewDBKeyManager(memdb)
+// // err = keyManager3.InitFromSecretsFile("", 0, path.Join(basedir0, "default.mne"))
+// // if err != nil {
+// // t.Error("Unexpected error: ", err)
+// // }
+// // if string(keyManager0.PrivateKey()) != string(keyManager3.PrivateKey()) {
+// // t.Error("Expected private keys %s, %s, to be identical via export/import mnemonic file", keyManager0.PrivateKey(), keyManager1.PrivateKey())
+// // }
+// }
diff --git a/crypto/mnemonic.go b/crypto/mnemonic.go
new file mode 100644
index 000000000..0d690f245
--- /dev/null
+++ b/crypto/mnemonic.go
@@ -0,0 +1,60 @@
+package crypto
+
+import (
+ "fmt"
+ "strconv"
+)
+
+// TODO: See if we can refactor this into a shared util lib if we need it multiple times
+func IndexOf(slice []string, value string) int64 {
+ for p, v := range slice {
+ if v == value {
+ return int64(p)
+ }
+ }
+ return -1
+}
+
+func MnemonicEncode(message string) []string {
+ var out []string
+ n := int64(len(MnemonicWords))
+
+ for i := 0; i < len(message); i += (len(message) / 8) {
+ x := message[i : i+8]
+ bit, _ := strconv.ParseInt(x, 16, 64)
+ w1 := (bit % n)
+ w2 := ((bit / n) + w1) % n
+ w3 := ((bit / n / n) + w2) % n
+ out = append(out, MnemonicWords[w1], MnemonicWords[w2], MnemonicWords[w3])
+ }
+ return out
+}
+
+func MnemonicDecode(wordsar []string) string {
+ var out string
+ n := int64(len(MnemonicWords))
+
+ for i := 0; i < len(wordsar); i += 3 {
+ word1 := wordsar[i]
+ word2 := wordsar[i+1]
+ word3 := wordsar[i+2]
+ w1 := IndexOf(MnemonicWords, word1)
+ w2 := IndexOf(MnemonicWords, word2)
+ w3 := IndexOf(MnemonicWords, word3)
+
+ y := (w2 - w1) % n
+ z := (w3 - w2) % n
+
+ // Golang handles modulo with negative numbers different then most languages
+ // The modulo can be negative, we don't want that.
+ if z < 0 {
+ z += n
+ }
+ if y < 0 {
+ y += n
+ }
+ x := w1 + n*(y) + n*n*(z)
+ out += fmt.Sprintf("%08x", x)
+ }
+ return out
+}
diff --git a/crypto/mnemonic_test.go b/crypto/mnemonic_test.go
new file mode 100644
index 000000000..beff476e0
--- /dev/null
+++ b/crypto/mnemonic_test.go
@@ -0,0 +1,74 @@
+package crypto
+
+import (
+ "testing"
+)
+
+func TestMnDecode(t *testing.T) {
+ words := []string{
+ "ink",
+ "balance",
+ "gain",
+ "fear",
+ "happen",
+ "melt",
+ "mom",
+ "surface",
+ "stir",
+ "bottle",
+ "unseen",
+ "expression",
+ "important",
+ "curl",
+ "grant",
+ "fairy",
+ "across",
+ "back",
+ "figure",
+ "breast",
+ "nobody",
+ "scratch",
+ "worry",
+ "yesterday",
+ }
+ encode := "c61d43dc5bb7a4e754d111dae8105b6f25356492df5e50ecb33b858d94f8c338"
+ result := MnemonicDecode(words)
+ if encode != result {
+ t.Error("We expected", encode, "got", result, "instead")
+ }
+}
+func TestMnEncode(t *testing.T) {
+ encode := "c61d43dc5bb7a4e754d111dae8105b6f25356492df5e50ecb33b858d94f8c338"
+ result := []string{
+ "ink",
+ "balance",
+ "gain",
+ "fear",
+ "happen",
+ "melt",
+ "mom",
+ "surface",
+ "stir",
+ "bottle",
+ "unseen",
+ "expression",
+ "important",
+ "curl",
+ "grant",
+ "fairy",
+ "across",
+ "back",
+ "figure",
+ "breast",
+ "nobody",
+ "scratch",
+ "worry",
+ "yesterday",
+ }
+ words := MnemonicEncode(encode)
+ for i, word := range words {
+ if word != result[i] {
+ t.Error("Mnenonic does not match:", words, result)
+ }
+ }
+}
diff --git a/crypto/mnemonic_words.go b/crypto/mnemonic_words.go
new file mode 100644
index 000000000..ebd0d2690
--- /dev/null
+++ b/crypto/mnemonic_words.go
@@ -0,0 +1,1630 @@
+package crypto
+
+var MnemonicWords []string = []string{
+ "like",
+ "just",
+ "love",
+ "know",
+ "never",
+ "want",
+ "time",
+ "out",
+ "there",
+ "make",
+ "look",
+ "eye",
+ "down",
+ "only",
+ "think",
+ "heart",
+ "back",
+ "then",
+ "into",
+ "about",
+ "more",
+ "away",
+ "still",
+ "them",
+ "take",
+ "thing",
+ "even",
+ "through",
+ "long",
+ "always",
+ "world",
+ "too",
+ "friend",
+ "tell",
+ "try",
+ "hand",
+ "thought",
+ "over",
+ "here",
+ "other",
+ "need",
+ "smile",
+ "again",
+ "much",
+ "cry",
+ "been",
+ "night",
+ "ever",
+ "little",
+ "said",
+ "end",
+ "some",
+ "those",
+ "around",
+ "mind",
+ "people",
+ "girl",
+ "leave",
+ "dream",
+ "left",
+ "turn",
+ "myself",
+ "give",
+ "nothing",
+ "really",
+ "off",
+ "before",
+ "something",
+ "find",
+ "walk",
+ "wish",
+ "good",
+ "once",
+ "place",
+ "ask",
+ "stop",
+ "keep",
+ "watch",
+ "seem",
+ "everything",
+ "wait",
+ "got",
+ "yet",
+ "made",
+ "remember",
+ "start",
+ "alone",
+ "run",
+ "hope",
+ "maybe",
+ "believe",
+ "body",
+ "hate",
+ "after",
+ "close",
+ "talk",
+ "stand",
+ "own",
+ "each",
+ "hurt",
+ "help",
+ "home",
+ "god",
+ "soul",
+ "new",
+ "many",
+ "two",
+ "inside",
+ "should",
+ "true",
+ "first",
+ "fear",
+ "mean",
+ "better",
+ "play",
+ "another",
+ "gone",
+ "change",
+ "use",
+ "wonder",
+ "someone",
+ "hair",
+ "cold",
+ "open",
+ "best",
+ "any",
+ "behind",
+ "happen",
+ "water",
+ "dark",
+ "laugh",
+ "stay",
+ "forever",
+ "name",
+ "work",
+ "show",
+ "sky",
+ "break",
+ "came",
+ "deep",
+ "door",
+ "put",
+ "black",
+ "together",
+ "upon",
+ "happy",
+ "such",
+ "great",
+ "white",
+ "matter",
+ "fill",
+ "past",
+ "please",
+ "burn",
+ "cause",
+ "enough",
+ "touch",
+ "moment",
+ "soon",
+ "voice",
+ "scream",
+ "anything",
+ "stare",
+ "sound",
+ "red",
+ "everyone",
+ "hide",
+ "kiss",
+ "truth",
+ "death",
+ "beautiful",
+ "mine",
+ "blood",
+ "broken",
+ "very",
+ "pass",
+ "next",
+ "forget",
+ "tree",
+ "wrong",
+ "air",
+ "mother",
+ "understand",
+ "lip",
+ "hit",
+ "wall",
+ "memory",
+ "sleep",
+ "free",
+ "high",
+ "realize",
+ "school",
+ "might",
+ "skin",
+ "sweet",
+ "perfect",
+ "blue",
+ "kill",
+ "breath",
+ "dance",
+ "against",
+ "fly",
+ "between",
+ "grow",
+ "strong",
+ "under",
+ "listen",
+ "bring",
+ "sometimes",
+ "speak",
+ "pull",
+ "person",
+ "become",
+ "family",
+ "begin",
+ "ground",
+ "real",
+ "small",
+ "father",
+ "sure",
+ "feet",
+ "rest",
+ "young",
+ "finally",
+ "land",
+ "across",
+ "today",
+ "different",
+ "guy",
+ "line",
+ "fire",
+ "reason",
+ "reach",
+ "second",
+ "slowly",
+ "write",
+ "eat",
+ "smell",
+ "mouth",
+ "step",
+ "learn",
+ "three",
+ "floor",
+ "promise",
+ "breathe",
+ "darkness",
+ "push",
+ "earth",
+ "guess",
+ "save",
+ "song",
+ "above",
+ "along",
+ "both",
+ "color",
+ "house",
+ "almost",
+ "sorry",
+ "anymore",
+ "brother",
+ "okay",
+ "dear",
+ "game",
+ "fade",
+ "already",
+ "apart",
+ "warm",
+ "beauty",
+ "heard",
+ "notice",
+ "question",
+ "shine",
+ "began",
+ "piece",
+ "whole",
+ "shadow",
+ "secret",
+ "street",
+ "within",
+ "finger",
+ "point",
+ "morning",
+ "whisper",
+ "child",
+ "moon",
+ "green",
+ "story",
+ "glass",
+ "kid",
+ "silence",
+ "since",
+ "soft",
+ "yourself",
+ "empty",
+ "shall",
+ "angel",
+ "answer",
+ "baby",
+ "bright",
+ "dad",
+ "path",
+ "worry",
+ "hour",
+ "drop",
+ "follow",
+ "power",
+ "war",
+ "half",
+ "flow",
+ "heaven",
+ "act",
+ "chance",
+ "fact",
+ "least",
+ "tired",
+ "children",
+ "near",
+ "quite",
+ "afraid",
+ "rise",
+ "sea",
+ "taste",
+ "window",
+ "cover",
+ "nice",
+ "trust",
+ "lot",
+ "sad",
+ "cool",
+ "force",
+ "peace",
+ "return",
+ "blind",
+ "easy",
+ "ready",
+ "roll",
+ "rose",
+ "drive",
+ "held",
+ "music",
+ "beneath",
+ "hang",
+ "mom",
+ "paint",
+ "emotion",
+ "quiet",
+ "clear",
+ "cloud",
+ "few",
+ "pretty",
+ "bird",
+ "outside",
+ "paper",
+ "picture",
+ "front",
+ "rock",
+ "simple",
+ "anyone",
+ "meant",
+ "reality",
+ "road",
+ "sense",
+ "waste",
+ "bit",
+ "leaf",
+ "thank",
+ "happiness",
+ "meet",
+ "men",
+ "smoke",
+ "truly",
+ "decide",
+ "self",
+ "age",
+ "book",
+ "form",
+ "alive",
+ "carry",
+ "escape",
+ "damn",
+ "instead",
+ "able",
+ "ice",
+ "minute",
+ "throw",
+ "catch",
+ "leg",
+ "ring",
+ "course",
+ "goodbye",
+ "lead",
+ "poem",
+ "sick",
+ "corner",
+ "desire",
+ "known",
+ "problem",
+ "remind",
+ "shoulder",
+ "suppose",
+ "toward",
+ "wave",
+ "drink",
+ "jump",
+ "woman",
+ "pretend",
+ "sister",
+ "week",
+ "human",
+ "joy",
+ "crack",
+ "grey",
+ "pray",
+ "surprise",
+ "dry",
+ "knee",
+ "less",
+ "search",
+ "bleed",
+ "caught",
+ "clean",
+ "embrace",
+ "future",
+ "king",
+ "son",
+ "sorrow",
+ "chest",
+ "hug",
+ "remain",
+ "sat",
+ "worth",
+ "blow",
+ "daddy",
+ "final",
+ "parent",
+ "tight",
+ "also",
+ "create",
+ "lonely",
+ "safe",
+ "cross",
+ "dress",
+ "evil",
+ "silent",
+ "bone",
+ "fate",
+ "perhaps",
+ "anger",
+ "class",
+ "scar",
+ "snow",
+ "tiny",
+ "tonight",
+ "continue",
+ "control",
+ "dog",
+ "edge",
+ "mirror",
+ "month",
+ "suddenly",
+ "comfort",
+ "given",
+ "loud",
+ "quickly",
+ "gaze",
+ "plan",
+ "rush",
+ "stone",
+ "town",
+ "battle",
+ "ignore",
+ "spirit",
+ "stood",
+ "stupid",
+ "yours",
+ "brown",
+ "build",
+ "dust",
+ "hey",
+ "kept",
+ "pay",
+ "phone",
+ "twist",
+ "although",
+ "ball",
+ "beyond",
+ "hidden",
+ "nose",
+ "taken",
+ "fail",
+ "float",
+ "pure",
+ "somehow",
+ "wash",
+ "wrap",
+ "angry",
+ "cheek",
+ "creature",
+ "forgotten",
+ "heat",
+ "rip",
+ "single",
+ "space",
+ "special",
+ "weak",
+ "whatever",
+ "yell",
+ "anyway",
+ "blame",
+ "job",
+ "choose",
+ "country",
+ "curse",
+ "drift",
+ "echo",
+ "figure",
+ "grew",
+ "laughter",
+ "neck",
+ "suffer",
+ "worse",
+ "yeah",
+ "disappear",
+ "foot",
+ "forward",
+ "knife",
+ "mess",
+ "somewhere",
+ "stomach",
+ "storm",
+ "beg",
+ "idea",
+ "lift",
+ "offer",
+ "breeze",
+ "field",
+ "five",
+ "often",
+ "simply",
+ "stuck",
+ "win",
+ "allow",
+ "confuse",
+ "enjoy",
+ "except",
+ "flower",
+ "seek",
+ "strength",
+ "calm",
+ "grin",
+ "gun",
+ "heavy",
+ "hill",
+ "large",
+ "ocean",
+ "shoe",
+ "sigh",
+ "straight",
+ "summer",
+ "tongue",
+ "accept",
+ "crazy",
+ "everyday",
+ "exist",
+ "grass",
+ "mistake",
+ "sent",
+ "shut",
+ "surround",
+ "table",
+ "ache",
+ "brain",
+ "destroy",
+ "heal",
+ "nature",
+ "shout",
+ "sign",
+ "stain",
+ "choice",
+ "doubt",
+ "glance",
+ "glow",
+ "mountain",
+ "queen",
+ "stranger",
+ "throat",
+ "tomorrow",
+ "city",
+ "either",
+ "fish",
+ "flame",
+ "rather",
+ "shape",
+ "spin",
+ "spread",
+ "ash",
+ "distance",
+ "finish",
+ "image",
+ "imagine",
+ "important",
+ "nobody",
+ "shatter",
+ "warmth",
+ "became",
+ "feed",
+ "flesh",
+ "funny",
+ "lust",
+ "shirt",
+ "trouble",
+ "yellow",
+ "attention",
+ "bare",
+ "bite",
+ "money",
+ "protect",
+ "amaze",
+ "appear",
+ "born",
+ "choke",
+ "completely",
+ "daughter",
+ "fresh",
+ "friendship",
+ "gentle",
+ "probably",
+ "six",
+ "deserve",
+ "expect",
+ "grab",
+ "middle",
+ "nightmare",
+ "river",
+ "thousand",
+ "weight",
+ "worst",
+ "wound",
+ "barely",
+ "bottle",
+ "cream",
+ "regret",
+ "relationship",
+ "stick",
+ "test",
+ "crush",
+ "endless",
+ "fault",
+ "itself",
+ "rule",
+ "spill",
+ "art",
+ "circle",
+ "join",
+ "kick",
+ "mask",
+ "master",
+ "passion",
+ "quick",
+ "raise",
+ "smooth",
+ "unless",
+ "wander",
+ "actually",
+ "broke",
+ "chair",
+ "deal",
+ "favorite",
+ "gift",
+ "note",
+ "number",
+ "sweat",
+ "box",
+ "chill",
+ "clothes",
+ "lady",
+ "mark",
+ "park",
+ "poor",
+ "sadness",
+ "tie",
+ "animal",
+ "belong",
+ "brush",
+ "consume",
+ "dawn",
+ "forest",
+ "innocent",
+ "pen",
+ "pride",
+ "stream",
+ "thick",
+ "clay",
+ "complete",
+ "count",
+ "draw",
+ "faith",
+ "press",
+ "silver",
+ "struggle",
+ "surface",
+ "taught",
+ "teach",
+ "wet",
+ "bless",
+ "chase",
+ "climb",
+ "enter",
+ "letter",
+ "melt",
+ "metal",
+ "movie",
+ "stretch",
+ "swing",
+ "vision",
+ "wife",
+ "beside",
+ "crash",
+ "forgot",
+ "guide",
+ "haunt",
+ "joke",
+ "knock",
+ "plant",
+ "pour",
+ "prove",
+ "reveal",
+ "steal",
+ "stuff",
+ "trip",
+ "wood",
+ "wrist",
+ "bother",
+ "bottom",
+ "crawl",
+ "crowd",
+ "fix",
+ "forgive",
+ "frown",
+ "grace",
+ "loose",
+ "lucky",
+ "party",
+ "release",
+ "surely",
+ "survive",
+ "teacher",
+ "gently",
+ "grip",
+ "speed",
+ "suicide",
+ "travel",
+ "treat",
+ "vein",
+ "written",
+ "cage",
+ "chain",
+ "conversation",
+ "date",
+ "enemy",
+ "however",
+ "interest",
+ "million",
+ "page",
+ "pink",
+ "proud",
+ "sway",
+ "themselves",
+ "winter",
+ "church",
+ "cruel",
+ "cup",
+ "demon",
+ "experience",
+ "freedom",
+ "pair",
+ "pop",
+ "purpose",
+ "respect",
+ "shoot",
+ "softly",
+ "state",
+ "strange",
+ "bar",
+ "birth",
+ "curl",
+ "dirt",
+ "excuse",
+ "lord",
+ "lovely",
+ "monster",
+ "order",
+ "pack",
+ "pants",
+ "pool",
+ "scene",
+ "seven",
+ "shame",
+ "slide",
+ "ugly",
+ "among",
+ "blade",
+ "blonde",
+ "closet",
+ "creek",
+ "deny",
+ "drug",
+ "eternity",
+ "gain",
+ "grade",
+ "handle",
+ "key",
+ "linger",
+ "pale",
+ "prepare",
+ "swallow",
+ "swim",
+ "tremble",
+ "wheel",
+ "won",
+ "cast",
+ "cigarette",
+ "claim",
+ "college",
+ "direction",
+ "dirty",
+ "gather",
+ "ghost",
+ "hundred",
+ "loss",
+ "lung",
+ "orange",
+ "present",
+ "swear",
+ "swirl",
+ "twice",
+ "wild",
+ "bitter",
+ "blanket",
+ "doctor",
+ "everywhere",
+ "flash",
+ "grown",
+ "knowledge",
+ "numb",
+ "pressure",
+ "radio",
+ "repeat",
+ "ruin",
+ "spend",
+ "unknown",
+ "buy",
+ "clock",
+ "devil",
+ "early",
+ "false",
+ "fantasy",
+ "pound",
+ "precious",
+ "refuse",
+ "sheet",
+ "teeth",
+ "welcome",
+ "add",
+ "ahead",
+ "block",
+ "bury",
+ "caress",
+ "content",
+ "depth",
+ "despite",
+ "distant",
+ "marry",
+ "purple",
+ "threw",
+ "whenever",
+ "bomb",
+ "dull",
+ "easily",
+ "grasp",
+ "hospital",
+ "innocence",
+ "normal",
+ "receive",
+ "reply",
+ "rhyme",
+ "shade",
+ "someday",
+ "sword",
+ "toe",
+ "visit",
+ "asleep",
+ "bought",
+ "center",
+ "consider",
+ "flat",
+ "hero",
+ "history",
+ "ink",
+ "insane",
+ "muscle",
+ "mystery",
+ "pocket",
+ "reflection",
+ "shove",
+ "silently",
+ "smart",
+ "soldier",
+ "spot",
+ "stress",
+ "train",
+ "type",
+ "view",
+ "whether",
+ "bus",
+ "energy",
+ "explain",
+ "holy",
+ "hunger",
+ "inch",
+ "magic",
+ "mix",
+ "noise",
+ "nowhere",
+ "prayer",
+ "presence",
+ "shock",
+ "snap",
+ "spider",
+ "study",
+ "thunder",
+ "trail",
+ "admit",
+ "agree",
+ "bag",
+ "bang",
+ "bound",
+ "butterfly",
+ "cute",
+ "exactly",
+ "explode",
+ "familiar",
+ "fold",
+ "further",
+ "pierce",
+ "reflect",
+ "scent",
+ "selfish",
+ "sharp",
+ "sink",
+ "spring",
+ "stumble",
+ "universe",
+ "weep",
+ "women",
+ "wonderful",
+ "action",
+ "ancient",
+ "attempt",
+ "avoid",
+ "birthday",
+ "branch",
+ "chocolate",
+ "core",
+ "depress",
+ "drunk",
+ "especially",
+ "focus",
+ "fruit",
+ "honest",
+ "match",
+ "palm",
+ "perfectly",
+ "pillow",
+ "pity",
+ "poison",
+ "roar",
+ "shift",
+ "slightly",
+ "thump",
+ "truck",
+ "tune",
+ "twenty",
+ "unable",
+ "wipe",
+ "wrote",
+ "coat",
+ "constant",
+ "dinner",
+ "drove",
+ "egg",
+ "eternal",
+ "flight",
+ "flood",
+ "frame",
+ "freak",
+ "gasp",
+ "glad",
+ "hollow",
+ "motion",
+ "peer",
+ "plastic",
+ "root",
+ "screen",
+ "season",
+ "sting",
+ "strike",
+ "team",
+ "unlike",
+ "victim",
+ "volume",
+ "warn",
+ "weird",
+ "attack",
+ "await",
+ "awake",
+ "built",
+ "charm",
+ "crave",
+ "despair",
+ "fought",
+ "grant",
+ "grief",
+ "horse",
+ "limit",
+ "message",
+ "ripple",
+ "sanity",
+ "scatter",
+ "serve",
+ "split",
+ "string",
+ "trick",
+ "annoy",
+ "blur",
+ "boat",
+ "brave",
+ "clearly",
+ "cling",
+ "connect",
+ "fist",
+ "forth",
+ "imagination",
+ "iron",
+ "jock",
+ "judge",
+ "lesson",
+ "milk",
+ "misery",
+ "nail",
+ "naked",
+ "ourselves",
+ "poet",
+ "possible",
+ "princess",
+ "sail",
+ "size",
+ "snake",
+ "society",
+ "stroke",
+ "torture",
+ "toss",
+ "trace",
+ "wise",
+ "bloom",
+ "bullet",
+ "cell",
+ "check",
+ "cost",
+ "darling",
+ "during",
+ "footstep",
+ "fragile",
+ "hallway",
+ "hardly",
+ "horizon",
+ "invisible",
+ "journey",
+ "midnight",
+ "mud",
+ "nod",
+ "pause",
+ "relax",
+ "shiver",
+ "sudden",
+ "value",
+ "youth",
+ "abuse",
+ "admire",
+ "blink",
+ "breast",
+ "bruise",
+ "constantly",
+ "couple",
+ "creep",
+ "curve",
+ "difference",
+ "dumb",
+ "emptiness",
+ "gotta",
+ "honor",
+ "plain",
+ "planet",
+ "recall",
+ "rub",
+ "ship",
+ "slam",
+ "soar",
+ "somebody",
+ "tightly",
+ "weather",
+ "adore",
+ "approach",
+ "bond",
+ "bread",
+ "burst",
+ "candle",
+ "coffee",
+ "cousin",
+ "crime",
+ "desert",
+ "flutter",
+ "frozen",
+ "grand",
+ "heel",
+ "hello",
+ "language",
+ "level",
+ "movement",
+ "pleasure",
+ "powerful",
+ "random",
+ "rhythm",
+ "settle",
+ "silly",
+ "slap",
+ "sort",
+ "spoken",
+ "steel",
+ "threaten",
+ "tumble",
+ "upset",
+ "aside",
+ "awkward",
+ "bee",
+ "blank",
+ "board",
+ "button",
+ "card",
+ "carefully",
+ "complain",
+ "crap",
+ "deeply",
+ "discover",
+ "drag",
+ "dread",
+ "effort",
+ "entire",
+ "fairy",
+ "giant",
+ "gotten",
+ "greet",
+ "illusion",
+ "jeans",
+ "leap",
+ "liquid",
+ "march",
+ "mend",
+ "nervous",
+ "nine",
+ "replace",
+ "rope",
+ "spine",
+ "stole",
+ "terror",
+ "accident",
+ "apple",
+ "balance",
+ "boom",
+ "childhood",
+ "collect",
+ "demand",
+ "depression",
+ "eventually",
+ "faint",
+ "glare",
+ "goal",
+ "group",
+ "honey",
+ "kitchen",
+ "laid",
+ "limb",
+ "machine",
+ "mere",
+ "mold",
+ "murder",
+ "nerve",
+ "painful",
+ "poetry",
+ "prince",
+ "rabbit",
+ "shelter",
+ "shore",
+ "shower",
+ "soothe",
+ "stair",
+ "steady",
+ "sunlight",
+ "tangle",
+ "tease",
+ "treasure",
+ "uncle",
+ "begun",
+ "bliss",
+ "canvas",
+ "cheer",
+ "claw",
+ "clutch",
+ "commit",
+ "crimson",
+ "crystal",
+ "delight",
+ "doll",
+ "existence",
+ "express",
+ "fog",
+ "football",
+ "gay",
+ "goose",
+ "guard",
+ "hatred",
+ "illuminate",
+ "mass",
+ "math",
+ "mourn",
+ "rich",
+ "rough",
+ "skip",
+ "stir",
+ "student",
+ "style",
+ "support",
+ "thorn",
+ "tough",
+ "yard",
+ "yearn",
+ "yesterday",
+ "advice",
+ "appreciate",
+ "autumn",
+ "bank",
+ "beam",
+ "bowl",
+ "capture",
+ "carve",
+ "collapse",
+ "confusion",
+ "creation",
+ "dove",
+ "feather",
+ "girlfriend",
+ "glory",
+ "government",
+ "harsh",
+ "hop",
+ "inner",
+ "loser",
+ "moonlight",
+ "neighbor",
+ "neither",
+ "peach",
+ "pig",
+ "praise",
+ "screw",
+ "shield",
+ "shimmer",
+ "sneak",
+ "stab",
+ "subject",
+ "throughout",
+ "thrown",
+ "tower",
+ "twirl",
+ "wow",
+ "army",
+ "arrive",
+ "bathroom",
+ "bump",
+ "cease",
+ "cookie",
+ "couch",
+ "courage",
+ "dim",
+ "guilt",
+ "howl",
+ "hum",
+ "husband",
+ "insult",
+ "led",
+ "lunch",
+ "mock",
+ "mostly",
+ "natural",
+ "nearly",
+ "needle",
+ "nerd",
+ "peaceful",
+ "perfection",
+ "pile",
+ "price",
+ "remove",
+ "roam",
+ "sanctuary",
+ "serious",
+ "shiny",
+ "shook",
+ "sob",
+ "stolen",
+ "tap",
+ "vain",
+ "void",
+ "warrior",
+ "wrinkle",
+ "affection",
+ "apologize",
+ "blossom",
+ "bounce",
+ "bridge",
+ "cheap",
+ "crumble",
+ "decision",
+ "descend",
+ "desperately",
+ "dig",
+ "dot",
+ "flip",
+ "frighten",
+ "heartbeat",
+ "huge",
+ "lazy",
+ "lick",
+ "odd",
+ "opinion",
+ "process",
+ "puzzle",
+ "quietly",
+ "retreat",
+ "score",
+ "sentence",
+ "separate",
+ "situation",
+ "skill",
+ "soak",
+ "square",
+ "stray",
+ "taint",
+ "task",
+ "tide",
+ "underneath",
+ "veil",
+ "whistle",
+ "anywhere",
+ "bedroom",
+ "bid",
+ "bloody",
+ "burden",
+ "careful",
+ "compare",
+ "concern",
+ "curtain",
+ "decay",
+ "defeat",
+ "describe",
+ "double",
+ "dreamer",
+ "driver",
+ "dwell",
+ "evening",
+ "flare",
+ "flicker",
+ "grandma",
+ "guitar",
+ "harm",
+ "horrible",
+ "hungry",
+ "indeed",
+ "lace",
+ "melody",
+ "monkey",
+ "nation",
+ "object",
+ "obviously",
+ "rainbow",
+ "salt",
+ "scratch",
+ "shown",
+ "shy",
+ "stage",
+ "stun",
+ "third",
+ "tickle",
+ "useless",
+ "weakness",
+ "worship",
+ "worthless",
+ "afternoon",
+ "beard",
+ "boyfriend",
+ "bubble",
+ "busy",
+ "certain",
+ "chin",
+ "concrete",
+ "desk",
+ "diamond",
+ "doom",
+ "drawn",
+ "due",
+ "felicity",
+ "freeze",
+ "frost",
+ "garden",
+ "glide",
+ "harmony",
+ "hopefully",
+ "hunt",
+ "jealous",
+ "lightning",
+ "mama",
+ "mercy",
+ "peel",
+ "physical",
+ "position",
+ "pulse",
+ "punch",
+ "quit",
+ "rant",
+ "respond",
+ "salty",
+ "sane",
+ "satisfy",
+ "savior",
+ "sheep",
+ "slept",
+ "social",
+ "sport",
+ "tuck",
+ "utter",
+ "valley",
+ "wolf",
+ "aim",
+ "alas",
+ "alter",
+ "arrow",
+ "awaken",
+ "beaten",
+ "belief",
+ "brand",
+ "ceiling",
+ "cheese",
+ "clue",
+ "confidence",
+ "connection",
+ "daily",
+ "disguise",
+ "eager",
+ "erase",
+ "essence",
+ "everytime",
+ "expression",
+ "fan",
+ "flag",
+ "flirt",
+ "foul",
+ "fur",
+ "giggle",
+ "glorious",
+ "ignorance",
+ "law",
+ "lifeless",
+ "measure",
+ "mighty",
+ "muse",
+ "north",
+ "opposite",
+ "paradise",
+ "patience",
+ "patient",
+ "pencil",
+ "petal",
+ "plate",
+ "ponder",
+ "possibly",
+ "practice",
+ "slice",
+ "spell",
+ "stock",
+ "strife",
+ "strip",
+ "suffocate",
+ "suit",
+ "tender",
+ "tool",
+ "trade",
+ "velvet",
+ "verse",
+ "waist",
+ "witch",
+ "aunt",
+ "bench",
+ "bold",
+ "cap",
+ "certainly",
+ "click",
+ "companion",
+ "creator",
+ "dart",
+ "delicate",
+ "determine",
+ "dish",
+ "dragon",
+ "drama",
+ "drum",
+ "dude",
+ "everybody",
+ "feast",
+ "forehead",
+ "former",
+ "fright",
+ "fully",
+ "gas",
+ "hook",
+ "hurl",
+ "invite",
+ "juice",
+ "manage",
+ "moral",
+ "possess",
+ "raw",
+ "rebel",
+ "royal",
+ "scale",
+ "scary",
+ "several",
+ "slight",
+ "stubborn",
+ "swell",
+ "talent",
+ "tea",
+ "terrible",
+ "thread",
+ "torment",
+ "trickle",
+ "usually",
+ "vast",
+ "violence",
+ "weave",
+ "acid",
+ "agony",
+ "ashamed",
+ "awe",
+ "belly",
+ "blend",
+ "blush",
+ "character",
+ "cheat",
+ "common",
+ "company",
+ "coward",
+ "creak",
+ "danger",
+ "deadly",
+ "defense",
+ "define",
+ "depend",
+ "desperate",
+ "destination",
+ "dew",
+ "duck",
+ "dusty",
+ "embarrass",
+ "engine",
+ "example",
+ "explore",
+ "foe",
+ "freely",
+ "frustrate",
+ "generation",
+ "glove",
+ "guilty",
+ "health",
+ "hurry",
+ "idiot",
+ "impossible",
+ "inhale",
+ "jaw",
+ "kingdom",
+ "mention",
+ "mist",
+ "moan",
+ "mumble",
+ "mutter",
+ "observe",
+ "ode",
+ "pathetic",
+ "pattern",
+ "pie",
+ "prefer",
+ "puff",
+ "rape",
+ "rare",
+ "revenge",
+ "rude",
+ "scrape",
+ "spiral",
+ "squeeze",
+ "strain",
+ "sunset",
+ "suspend",
+ "sympathy",
+ "thigh",
+ "throne",
+ "total",
+ "unseen",
+ "weapon",
+ "weary",
+}
diff --git a/ethdb/.gitignore b/ethdb/.gitignore
new file mode 100644
index 000000000..f725d58d1
--- /dev/null
+++ b/ethdb/.gitignore
@@ -0,0 +1,12 @@
+# See http://help.github.com/ignore-files/ for more about ignoring files.
+#
+# If you find yourself ignoring temporary files generated by your text editor
+# or operating system, you probably want to add a global ignore instead:
+# git config --global core.excludesfile ~/.gitignore_global
+
+/tmp
+*/**/*un~
+*un~
+.DS_Store
+*/**/.DS_Store
+
diff --git a/ethdb/README.md b/ethdb/README.md
new file mode 100644
index 000000000..5bed8eedc
--- /dev/null
+++ b/ethdb/README.md
@@ -0,0 +1,11 @@
+# ethdb
+
+The ethdb package contains the ethereum database interfaces
+
+# Installation
+
+`go get github.com/ethereum/ethdb-go`
+
+# Usage
+
+Todo :-)
diff --git a/ethdb/database.go b/ethdb/database.go
new file mode 100644
index 000000000..19aa83466
--- /dev/null
+++ b/ethdb/database.go
@@ -0,0 +1,89 @@
+package ethdb
+
+import (
+ "fmt"
+ "path"
+
+ "github.com/ethereum/go-ethereum/compression/rle"
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/syndtr/goleveldb/leveldb"
+ "github.com/syndtr/goleveldb/leveldb/iterator"
+)
+
+type LDBDatabase struct {
+ db *leveldb.DB
+ comp bool
+}
+
+func NewLDBDatabase(name string) (*LDBDatabase, error) {
+ dbPath := path.Join(ethutil.Config.ExecPath, name)
+
+ // Open the db
+ db, err := leveldb.OpenFile(dbPath, nil)
+ if err != nil {
+ return nil, err
+ }
+
+ database := &LDBDatabase{db: db, comp: true}
+
+ return database, nil
+}
+
+func (self *LDBDatabase) Put(key []byte, value []byte) {
+ if self.comp {
+ value = rle.Compress(value)
+ }
+
+ err := self.db.Put(key, value, nil)
+ if err != nil {
+ fmt.Println("Error put", err)
+ }
+}
+
+func (self *LDBDatabase) Get(key []byte) ([]byte, error) {
+ dat, err := self.db.Get(key, nil)
+ if err != nil {
+ return nil, err
+ }
+
+ if self.comp {
+ return rle.Decompress(dat)
+ }
+
+ return dat, nil
+}
+
+func (self *LDBDatabase) Delete(key []byte) error {
+ return self.db.Delete(key, nil)
+}
+
+func (self *LDBDatabase) LastKnownTD() []byte {
+ data, _ := self.Get([]byte("LTD"))
+
+ if len(data) == 0 {
+ data = []byte{0x0}
+ }
+
+ return data
+}
+
+func (self *LDBDatabase) NewIterator() iterator.Iterator {
+ return self.db.NewIterator(nil, nil)
+}
+
+func (self *LDBDatabase) Close() {
+ // Close the leveldb database
+ self.db.Close()
+}
+
+func (self *LDBDatabase) Print() {
+ iter := self.db.NewIterator(nil, nil)
+ for iter.Next() {
+ key := iter.Key()
+ value := iter.Value()
+
+ fmt.Printf("%x(%d): ", key, len(key))
+ node := ethutil.NewValueFromBytes(value)
+ fmt.Printf("%v\n", node)
+ }
+}
diff --git a/ethdb/database_test.go b/ethdb/database_test.go
new file mode 100644
index 000000000..2cbaf58e0
--- /dev/null
+++ b/ethdb/database_test.go
@@ -0,0 +1,28 @@
+package ethdb
+
+/*
+import (
+ "bytes"
+ "testing"
+)
+
+func TestCompression(t *testing.T) {
+ ethutil.ReadConfig("", "/tmp", "")
+
+ db, err := NewLDBDatabase("testdb")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ in := make([]byte, 10)
+ db.Put([]byte("test1"), in)
+ out, err := db.Get([]byte("test1"))
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if bytes.Compare(out, in) != 0 {
+ t.Error("put get", in, out)
+ }
+}
+*/
diff --git a/ethdb/memory_database.go b/ethdb/memory_database.go
new file mode 100644
index 000000000..48aa830e7
--- /dev/null
+++ b/ethdb/memory_database.go
@@ -0,0 +1,67 @@
+package ethdb
+
+import (
+ "fmt"
+
+ "github.com/ethereum/go-ethereum/ethutil"
+)
+
+/*
+ * This is a test memory database. Do not use for any production it does not get persisted
+ */
+type MemDatabase struct {
+ db map[string][]byte
+}
+
+func NewMemDatabase() (*MemDatabase, error) {
+ db := &MemDatabase{db: make(map[string][]byte)}
+
+ return db, nil
+}
+
+func (db *MemDatabase) Put(key []byte, value []byte) {
+ db.db[string(key)] = value
+}
+
+func (db *MemDatabase) Set(key []byte, value []byte) {
+ db.Put(key, value)
+}
+
+func (db *MemDatabase) Get(key []byte) ([]byte, error) {
+ return db.db[string(key)], nil
+}
+
+/*
+func (db *MemDatabase) GetKeys() []*ethutil.Key {
+ data, _ := db.Get([]byte("KeyRing"))
+
+ return []*ethutil.Key{ethutil.NewKeyFromBytes(data)}
+}
+*/
+
+func (db *MemDatabase) Delete(key []byte) error {
+ delete(db.db, string(key))
+
+ return nil
+}
+
+func (db *MemDatabase) Print() {
+ for key, val := range db.db {
+ fmt.Printf("%x(%d): ", key, len(key))
+ node := ethutil.NewValueFromBytes(val)
+ fmt.Printf("%q\n", node.Interface())
+ }
+}
+
+func (db *MemDatabase) Close() {
+}
+
+func (db *MemDatabase) LastKnownTD() []byte {
+ data, _ := db.Get([]byte("LastKnownTotalDifficulty"))
+
+ if len(data) == 0 || data == nil {
+ data = []byte{0x0}
+ }
+
+ return data
+}
diff --git a/ethereum.go b/ethereum.go
new file mode 100644
index 000000000..5d74e28e9
--- /dev/null
+++ b/ethereum.go
@@ -0,0 +1,659 @@
+package eth
+
+import (
+ "container/list"
+ "encoding/json"
+ "fmt"
+ "math/big"
+ "math/rand"
+ "net"
+ "path"
+ "strconv"
+ "strings"
+ "sync"
+ "sync/atomic"
+ "time"
+
+ "github.com/ethereum/go-ethereum/core"
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/event"
+ "github.com/ethereum/go-ethereum/logger"
+ "github.com/ethereum/go-ethereum/rpc"
+ "github.com/ethereum/go-ethereum/state"
+ "github.com/ethereum/go-ethereum/wire"
+)
+
+const (
+ seedTextFileUri string = "http://www.ethereum.org/servers.poc3.txt"
+ seedNodeAddress = "poc-7.ethdev.com:30303"
+)
+
+var loggerger = logger.NewLogger("SERV")
+
+func eachPeer(peers *list.List, callback func(*Peer, *list.Element)) {
+ // Loop thru the peers and close them (if we had them)
+ for e := peers.Front(); e != nil; e = e.Next() {
+ callback(e.Value.(*Peer), e)
+ }
+}
+
+const (
+ processReapingTimeout = 60 // TODO increase
+)
+
+type Ethereum struct {
+ // Channel for shutting down the ethereum
+ shutdownChan chan bool
+ quit chan bool
+
+ // DB interface
+ db ethutil.Database
+ // State manager for processing new blocks and managing the over all states
+ blockManager *core.BlockManager
+ // The transaction pool. Transaction can be pushed on this pool
+ // for later including in the blocks
+ txPool *core.TxPool
+ // The canonical chain
+ blockChain *core.ChainManager
+ // The block pool
+ blockPool *BlockPool
+ // Eventer
+ eventMux event.TypeMux
+ // Peers
+ peers *list.List
+ // Nonce
+ Nonce uint64
+
+ Addr net.Addr
+ Port string
+
+ blacklist [][]byte
+
+ peerMut sync.Mutex
+
+ // Capabilities for outgoing peers
+ serverCaps Caps
+
+ nat NAT
+
+ // Specifies the desired amount of maximum peers
+ MaxPeers int
+
+ Mining bool
+
+ listening bool
+
+ RpcServer *rpc.JsonRpcServer
+
+ keyManager *crypto.KeyManager
+
+ clientIdentity wire.ClientIdentity
+
+ isUpToDate bool
+
+ filterMu sync.RWMutex
+ filterId int
+ filters map[int]*core.Filter
+}
+
+func New(db ethutil.Database, clientIdentity wire.ClientIdentity, keyManager *crypto.KeyManager, caps Caps, usePnp bool) (*Ethereum, error) {
+ var err error
+ var nat NAT
+
+ if usePnp {
+ nat, err = Discover()
+ if err != nil {
+ loggerger.Debugln("UPnP failed", err)
+ }
+ }
+
+ bootstrapDb(db)
+
+ ethutil.Config.Db = db
+
+ nonce, _ := ethutil.RandomUint64()
+ ethereum := &Ethereum{
+ shutdownChan: make(chan bool),
+ quit: make(chan bool),
+ db: db,
+ peers: list.New(),
+ Nonce: nonce,
+ serverCaps: caps,
+ nat: nat,
+ keyManager: keyManager,
+ clientIdentity: clientIdentity,
+ isUpToDate: true,
+ filters: make(map[int]*core.Filter),
+ }
+
+ ethereum.blockPool = NewBlockPool(ethereum)
+ ethereum.blockChain = core.NewChainManager(ethereum.EventMux())
+ ethereum.txPool = core.NewTxPool(ethereum.blockChain, ethereum, ethereum.EventMux())
+ ethereum.blockManager = core.NewBlockManager(ethereum.txPool, ethereum.blockChain, ethereum.EventMux())
+ ethereum.blockChain.SetProcessor(ethereum.blockManager)
+
+ // Start the tx pool
+ ethereum.txPool.Start()
+
+ return ethereum, nil
+}
+
+func (s *Ethereum) KeyManager() *crypto.KeyManager {
+ return s.keyManager
+}
+
+func (s *Ethereum) ClientIdentity() wire.ClientIdentity {
+ return s.clientIdentity
+}
+
+func (s *Ethereum) ChainManager() *core.ChainManager {
+ return s.blockChain
+}
+
+func (s *Ethereum) BlockManager() *core.BlockManager {
+ return s.blockManager
+}
+
+func (s *Ethereum) TxPool() *core.TxPool {
+ return s.txPool
+}
+func (s *Ethereum) BlockPool() *BlockPool {
+ return s.blockPool
+}
+func (s *Ethereum) EventMux() *event.TypeMux {
+ return &s.eventMux
+}
+func (self *Ethereum) Db() ethutil.Database {
+ return self.db
+}
+
+func (s *Ethereum) ServerCaps() Caps {
+ return s.serverCaps
+}
+func (s *Ethereum) IsMining() bool {
+ return s.Mining
+}
+func (s *Ethereum) PeerCount() int {
+ return s.peers.Len()
+}
+func (s *Ethereum) IsUpToDate() bool {
+ upToDate := true
+ eachPeer(s.peers, func(peer *Peer, e *list.Element) {
+ if atomic.LoadInt32(&peer.connected) == 1 {
+ if peer.catchingUp == true && peer.versionKnown {
+ upToDate = false
+ }
+ }
+ })
+ return upToDate
+}
+func (s *Ethereum) PushPeer(peer *Peer) {
+ s.peers.PushBack(peer)
+}
+func (s *Ethereum) IsListening() bool {
+ return s.listening
+}
+
+func (s *Ethereum) HighestTDPeer() (td *big.Int) {
+ td = big.NewInt(0)
+
+ eachPeer(s.peers, func(p *Peer, v *list.Element) {
+ if p.td.Cmp(td) > 0 {
+ td = p.td
+ }
+ })
+
+ return
+}
+
+func (self *Ethereum) BlacklistPeer(peer *Peer) {
+ self.blacklist = append(self.blacklist, peer.pubkey)
+}
+
+func (s *Ethereum) AddPeer(conn net.Conn) {
+ peer := NewPeer(conn, s, true)
+
+ if peer != nil {
+ if s.peers.Len() < s.MaxPeers {
+ peer.Start()
+ } else {
+ loggerger.Debugf("Max connected peers reached. Not adding incoming peer.")
+ }
+ }
+}
+
+func (s *Ethereum) ProcessPeerList(addrs []string) {
+ for _, addr := range addrs {
+ // TODO Probably requires some sanity checks
+ s.ConnectToPeer(addr)
+ }
+}
+
+func (s *Ethereum) ConnectToPeer(addr string) error {
+ if s.peers.Len() < s.MaxPeers {
+ var alreadyConnected bool
+
+ ahost, aport, _ := net.SplitHostPort(addr)
+ var chost string
+
+ ips, err := net.LookupIP(ahost)
+
+ if err != nil {
+ return err
+ } else {
+ // If more then one ip is available try stripping away the ipv6 ones
+ if len(ips) > 1 {
+ var ipsv4 []net.IP
+ // For now remove the ipv6 addresses
+ for _, ip := range ips {
+ if strings.Contains(ip.String(), "::") {
+ continue
+ } else {
+ ipsv4 = append(ipsv4, ip)
+ }
+ }
+ if len(ipsv4) == 0 {
+ return fmt.Errorf("[SERV] No IPV4 addresses available for hostname")
+ }
+
+ // Pick a random ipv4 address, simulating round-robin DNS.
+ rand.Seed(time.Now().UTC().UnixNano())
+ i := rand.Intn(len(ipsv4))
+ chost = ipsv4[i].String()
+ } else {
+ if len(ips) == 0 {
+ return fmt.Errorf("[SERV] No IPs resolved for the given hostname")
+ return nil
+ }
+ chost = ips[0].String()
+ }
+ }
+
+ eachPeer(s.peers, func(p *Peer, v *list.Element) {
+ if p.conn == nil {
+ return
+ }
+ phost, pport, _ := net.SplitHostPort(p.conn.RemoteAddr().String())
+
+ if phost == chost && pport == aport {
+ alreadyConnected = true
+ //loggerger.Debugf("Peer %s already added.\n", chost)
+ return
+ }
+ })
+
+ if alreadyConnected {
+ return nil
+ }
+
+ NewOutboundPeer(addr, s, s.serverCaps)
+ }
+
+ return nil
+}
+
+func (s *Ethereum) OutboundPeers() []*Peer {
+ // Create a new peer slice with at least the length of the total peers
+ outboundPeers := make([]*Peer, s.peers.Len())
+ length := 0
+ eachPeer(s.peers, func(p *Peer, e *list.Element) {
+ if !p.inbound && p.conn != nil {
+ outboundPeers[length] = p
+ length++
+ }
+ })
+
+ return outboundPeers[:length]
+}
+
+func (s *Ethereum) InboundPeers() []*Peer {
+ // Create a new peer slice with at least the length of the total peers
+ inboundPeers := make([]*Peer, s.peers.Len())
+ length := 0
+ eachPeer(s.peers, func(p *Peer, e *list.Element) {
+ if p.inbound {
+ inboundPeers[length] = p
+ length++
+ }
+ })
+
+ return inboundPeers[:length]
+}
+
+func (s *Ethereum) InOutPeers() []*Peer {
+ // Reap the dead peers first
+ s.reapPeers()
+
+ // Create a new peer slice with at least the length of the total peers
+ inboundPeers := make([]*Peer, s.peers.Len())
+ length := 0
+ eachPeer(s.peers, func(p *Peer, e *list.Element) {
+ // Only return peers with an actual ip
+ if len(p.host) > 0 {
+ inboundPeers[length] = p
+ length++
+ }
+ })
+
+ return inboundPeers[:length]
+}
+
+func (s *Ethereum) Broadcast(msgType wire.MsgType, data []interface{}) {
+ msg := wire.NewMessage(msgType, data)
+ s.BroadcastMsg(msg)
+}
+
+func (s *Ethereum) BroadcastMsg(msg *wire.Msg) {
+ eachPeer(s.peers, func(p *Peer, e *list.Element) {
+ p.QueueMessage(msg)
+ })
+}
+
+func (s *Ethereum) Peers() *list.List {
+ return s.peers
+}
+
+func (s *Ethereum) reapPeers() {
+ eachPeer(s.peers, func(p *Peer, e *list.Element) {
+ if atomic.LoadInt32(&p.disconnect) == 1 || (p.inbound && (time.Now().Unix()-p.lastPong) > int64(5*time.Minute)) {
+ s.removePeerElement(e)
+ }
+ })
+}
+
+func (s *Ethereum) removePeerElement(e *list.Element) {
+ s.peerMut.Lock()
+ defer s.peerMut.Unlock()
+
+ s.peers.Remove(e)
+
+ s.eventMux.Post(PeerListEvent{s.peers})
+}
+
+func (s *Ethereum) RemovePeer(p *Peer) {
+ eachPeer(s.peers, func(peer *Peer, e *list.Element) {
+ if peer == p {
+ s.removePeerElement(e)
+ }
+ })
+}
+
+func (s *Ethereum) reapDeadPeerHandler() {
+ reapTimer := time.NewTicker(processReapingTimeout * time.Second)
+
+ for {
+ select {
+ case <-reapTimer.C:
+ s.reapPeers()
+ }
+ }
+}
+
+// Start the ethereum
+func (s *Ethereum) Start(seed bool) {
+ s.blockPool.Start()
+
+ // Bind to addr and port
+ ln, err := net.Listen("tcp", ":"+s.Port)
+ if err != nil {
+ loggerger.Warnf("Port %s in use. Connection listening disabled. Acting as client", s.Port)
+ s.listening = false
+ } else {
+ s.listening = true
+ // Starting accepting connections
+ loggerger.Infoln("Ready and accepting connections")
+ // Start the peer handler
+ go s.peerHandler(ln)
+ }
+
+ if s.nat != nil {
+ go s.upnpUpdateThread()
+ }
+
+ // Start the reaping processes
+ go s.reapDeadPeerHandler()
+ go s.update()
+ go s.filterLoop()
+
+ if seed {
+ s.Seed()
+ }
+ s.ConnectToPeer("localhost:40404")
+ loggerger.Infoln("Server started")
+}
+
+func (s *Ethereum) Seed() {
+ // Sorry Py person. I must blacklist. you perform badly
+ s.blacklist = append(s.blacklist, ethutil.Hex2Bytes("64656330303561383532336435376331616537643864663236623336313863373537353163636634333530626263396330346237336262623931383064393031"))
+ ips := PastPeers()
+ if len(ips) > 0 {
+ for _, ip := range ips {
+ loggerger.Infoln("Connecting to previous peer ", ip)
+ s.ConnectToPeer(ip)
+ }
+ } else {
+ loggerger.Debugln("Retrieving seed nodes")
+
+ // Eth-Go Bootstrapping
+ ips, er := net.LookupIP("seed.bysh.me")
+ if er == nil {
+ peers := []string{}
+ for _, ip := range ips {
+ node := fmt.Sprintf("%s:%d", ip.String(), 30303)
+ loggerger.Debugln("Found DNS Go Peer:", node)
+ peers = append(peers, node)
+ }
+ s.ProcessPeerList(peers)
+ }
+
+ // Official DNS Bootstrapping
+ _, nodes, err := net.LookupSRV("eth", "tcp", "ethereum.org")
+ if err == nil {
+ peers := []string{}
+ // Iterate SRV nodes
+ for _, n := range nodes {
+ target := n.Target
+ port := strconv.Itoa(int(n.Port))
+ // Resolve target to ip (Go returns list, so may resolve to multiple ips?)
+ addr, err := net.LookupHost(target)
+ if err == nil {
+ for _, a := range addr {
+ // Build string out of SRV port and Resolved IP
+ peer := net.JoinHostPort(a, port)
+ loggerger.Debugln("Found DNS Bootstrap Peer:", peer)
+ peers = append(peers, peer)
+ }
+ } else {
+ loggerger.Debugln("Couldn't resolve :", target)
+ }
+ }
+ // Connect to Peer list
+ s.ProcessPeerList(peers)
+ }
+
+ s.ConnectToPeer(seedNodeAddress)
+ }
+}
+
+func (s *Ethereum) peerHandler(listener net.Listener) {
+ for {
+ conn, err := listener.Accept()
+ if err != nil {
+ loggerger.Debugln(err)
+
+ continue
+ }
+
+ go s.AddPeer(conn)
+ }
+}
+
+func (s *Ethereum) Stop() {
+ // Stop eventMux first, it will close all subscriptions.
+ s.eventMux.Stop()
+
+ // Close the database
+ defer s.db.Close()
+
+ var ips []string
+ eachPeer(s.peers, func(p *Peer, e *list.Element) {
+ ips = append(ips, p.conn.RemoteAddr().String())
+ })
+
+ if len(ips) > 0 {
+ d, _ := json.MarshalIndent(ips, "", " ")
+ ethutil.WriteFile(path.Join(ethutil.Config.ExecPath, "known_peers.json"), d)
+ }
+
+ eachPeer(s.peers, func(p *Peer, e *list.Element) {
+ p.Stop()
+ })
+
+ close(s.quit)
+
+ if s.RpcServer != nil {
+ s.RpcServer.Stop()
+ }
+ s.txPool.Stop()
+ s.blockPool.Stop()
+
+ loggerger.Infoln("Server stopped")
+ close(s.shutdownChan)
+}
+
+// This function will wait for a shutdown and resumes main thread execution
+func (s *Ethereum) WaitForShutdown() {
+ <-s.shutdownChan
+}
+
+func (s *Ethereum) upnpUpdateThread() {
+ // Go off immediately to prevent code duplication, thereafter we renew
+ // lease every 15 minutes.
+ timer := time.NewTimer(5 * time.Minute)
+ lport, _ := strconv.ParseInt(s.Port, 10, 16)
+ first := true
+out:
+ for {
+ select {
+ case <-timer.C:
+ var err error
+ _, err = s.nat.AddPortMapping("TCP", int(lport), int(lport), "eth listen port", 20*60)
+ if err != nil {
+ loggerger.Debugln("can't add UPnP port mapping:", err)
+ break out
+ }
+ if first && err == nil {
+ _, err = s.nat.GetExternalAddress()
+ if err != nil {
+ loggerger.Debugln("UPnP can't get external address:", err)
+ continue out
+ }
+ first = false
+ }
+ timer.Reset(time.Minute * 15)
+ case <-s.quit:
+ break out
+ }
+ }
+
+ timer.Stop()
+
+ if err := s.nat.DeletePortMapping("TCP", int(lport), int(lport)); err != nil {
+ loggerger.Debugln("unable to remove UPnP port mapping:", err)
+ } else {
+ loggerger.Debugln("succesfully disestablished UPnP port mapping")
+ }
+}
+
+func (self *Ethereum) update() {
+ upToDateTimer := time.NewTicker(1 * time.Second)
+
+out:
+ for {
+ select {
+ case <-upToDateTimer.C:
+ if self.IsUpToDate() && !self.isUpToDate {
+ self.eventMux.Post(ChainSyncEvent{false})
+ self.isUpToDate = true
+ } else if !self.IsUpToDate() && self.isUpToDate {
+ self.eventMux.Post(ChainSyncEvent{true})
+ self.isUpToDate = false
+ }
+ case <-self.quit:
+ break out
+ }
+ }
+}
+
+// InstallFilter adds filter for blockchain events.
+// The filter's callbacks will run for matching blocks and messages.
+// The filter should not be modified after it has been installed.
+func (self *Ethereum) InstallFilter(filter *core.Filter) (id int) {
+ self.filterMu.Lock()
+ id = self.filterId
+ self.filters[id] = filter
+ self.filterId++
+ self.filterMu.Unlock()
+ return id
+}
+
+func (self *Ethereum) UninstallFilter(id int) {
+ self.filterMu.Lock()
+ delete(self.filters, id)
+ self.filterMu.Unlock()
+}
+
+// GetFilter retrieves a filter installed using InstallFilter.
+// The filter may not be modified.
+func (self *Ethereum) GetFilter(id int) *core.Filter {
+ self.filterMu.RLock()
+ defer self.filterMu.RUnlock()
+ return self.filters[id]
+}
+
+func (self *Ethereum) filterLoop() {
+ // Subscribe to events
+ events := self.eventMux.Subscribe(core.NewBlockEvent{}, state.Messages(nil))
+ for event := range events.Chan() {
+ switch event := event.(type) {
+ case core.NewBlockEvent:
+ self.filterMu.RLock()
+ for _, filter := range self.filters {
+ if filter.BlockCallback != nil {
+ filter.BlockCallback(event.Block)
+ }
+ }
+ self.filterMu.RUnlock()
+
+ case state.Messages:
+ self.filterMu.RLock()
+ for _, filter := range self.filters {
+ if filter.MessageCallback != nil {
+ msgs := filter.FilterMessages(event)
+ if len(msgs) > 0 {
+ filter.MessageCallback(msgs)
+ }
+ }
+ }
+ self.filterMu.RUnlock()
+ }
+ }
+}
+
+func bootstrapDb(db ethutil.Database) {
+ d, _ := db.Get([]byte("ProtocolVersion"))
+ protov := ethutil.NewValue(d).Uint()
+
+ if protov == 0 {
+ db.Put([]byte("ProtocolVersion"), ethutil.NewValue(ProtocolVersion).Bytes())
+ }
+}
+
+func PastPeers() []string {
+ var ips []string
+ data, _ := ethutil.ReadAllFile(path.Join(ethutil.Config.ExecPath, "known_peers.json"))
+ json.Unmarshal([]byte(data), &ips)
+
+ return ips
+}
diff --git a/ethereum/cmd.go b/ethereum/cmd.go
deleted file mode 100644
index 5ddc91619..000000000
--- a/ethereum/cmd.go
+++ /dev/null
@@ -1,35 +0,0 @@
-package main
-
-import (
- "io/ioutil"
- "os"
-
- "github.com/ethereum/eth-go"
- "github.com/ethereum/go-ethereum/ethereum/repl"
- "github.com/ethereum/go-ethereum/javascript"
- "github.com/ethereum/go-ethereum/utils"
-)
-
-func InitJsConsole(ethereum *eth.Ethereum) {
- repl := ethrepl.NewJSRepl(ethereum)
- go repl.Start()
- utils.RegisterInterrupt(func(os.Signal) {
- repl.Stop()
- })
-}
-
-func ExecJsFile(ethereum *eth.Ethereum, InputFile string) {
- file, err := os.Open(InputFile)
- if err != nil {
- logger.Fatalln(err)
- }
- content, err := ioutil.ReadAll(file)
- if err != nil {
- logger.Fatalln(err)
- }
- re := javascript.NewJSRE(ethereum)
- utils.RegisterInterrupt(func(os.Signal) {
- re.Stop()
- })
- re.Run(string(content))
-}
diff --git a/ethereum/repl/repl_windows.go b/ethereum/repl/repl_windows.go
deleted file mode 100644
index 4106c89bc..000000000
--- a/ethereum/repl/repl_windows.go
+++ /dev/null
@@ -1,24 +0,0 @@
-package ethrepl
-
-import (
- "bufio"
- "fmt"
- "os"
-)
-
-func (self *JSRepl) read() {
- reader := bufio.NewReader(os.Stdin)
- for {
- fmt.Printf(self.prompt)
- str, _, err := reader.ReadLine()
- if err != nil {
- fmt.Println("Error reading input", err)
- } else {
- self.parseInput(string(str))
- }
- }
-}
-
-func (self *JSRepl) PrintValue(value otto.Value) {
- fmt.Println(value)
-}
diff --git a/ethutil/.gitignore b/ethutil/.gitignore
new file mode 100644
index 000000000..f725d58d1
--- /dev/null
+++ b/ethutil/.gitignore
@@ -0,0 +1,12 @@
+# See http://help.github.com/ignore-files/ for more about ignoring files.
+#
+# If you find yourself ignoring temporary files generated by your text editor
+# or operating system, you probably want to add a global ignore instead:
+# git config --global core.excludesfile ~/.gitignore_global
+
+/tmp
+*/**/*un~
+*un~
+.DS_Store
+*/**/.DS_Store
+
diff --git a/ethutil/.travis.yml b/ethutil/.travis.yml
new file mode 100644
index 000000000..69359072d
--- /dev/null
+++ b/ethutil/.travis.yml
@@ -0,0 +1,3 @@
+language: go
+go:
+ - 1.2
diff --git a/ethutil/README.md b/ethutil/README.md
new file mode 100644
index 000000000..1ed56b71b
--- /dev/null
+++ b/ethutil/README.md
@@ -0,0 +1,139 @@
+# ethutil
+
+[![Build
+Status](https://travis-ci.org/ethereum/go-ethereum.png?branch=master)](https://travis-ci.org/ethereum/go-ethereum)
+
+The ethutil package contains the ethereum utility library.
+
+# Installation
+
+`go get github.com/ethereum/ethutil-go`
+
+# Usage
+
+## RLP (Recursive Linear Prefix) Encoding
+
+RLP Encoding is an encoding scheme utilized by the Ethereum project. It
+encodes any native value or list to string.
+
+More in depth information about the Encoding scheme see the [Wiki](http://wiki.ethereum.org/index.php/RLP)
+article.
+
+```go
+rlp := ethutil.Encode("doge")
+fmt.Printf("%q\n", rlp) // => "\0x83dog"
+
+rlp = ethutil.Encode([]interface{}{"dog", "cat"})
+fmt.Printf("%q\n", rlp) // => "\0xc8\0x83dog\0x83cat"
+decoded := ethutil.Decode(rlp)
+fmt.Println(decoded) // => ["dog" "cat"]
+```
+
+## Patricia Trie
+
+Patricie Tree is a merkle trie utilized by the Ethereum project.
+
+More in depth information about the (modified) Patricia Trie can be
+found on the [Wiki](http://wiki.ethereum.org/index.php/Patricia_Tree).
+
+The patricia trie uses a db as backend and could be anything as long as
+it satisfies the Database interface found in `ethutil/db.go`.
+
+```go
+db := NewDatabase()
+
+// db, root
+trie := ethutil.NewTrie(db, "")
+
+trie.Put("puppy", "dog")
+trie.Put("horse", "stallion")
+trie.Put("do", "verb")
+trie.Put("doge", "coin")
+
+// Look up the key "do" in the trie
+out := trie.Get("do")
+fmt.Println(out) // => verb
+
+trie.Delete("puppy")
+```
+
+The patricia trie, in combination with RLP, provides a robust,
+cryptographically authenticated data structure that can be used to store
+all (key, value) bindings.
+
+```go
+// ... Create db/trie
+
+// Note that RLP uses interface slices as list
+value := ethutil.Encode([]interface{}{"one", 2, "three", []interface{}{42}})
+// Store the RLP encoded value of the list
+trie.Put("mykey", value)
+```
+
+## Value
+
+Value is a Generic Value which is used in combination with RLP data or
+`([])interface{}` structures. It may serve as a bridge between RLP data
+and actual real values and takes care of all the type checking and
+casting. Unlike Go's `reflect.Value` it does not panic if it's unable to
+cast to the requested value. It simple returns the base value of that
+type (e.g. `Slice()` returns []interface{}, `Uint()` return 0, etc).
+
+### Creating a new Value
+
+`NewEmptyValue()` returns a new \*Value with it's initial value set to a
+`[]interface{}`
+
+`AppendList()` appends a list to the current value.
+
+`Append(v)` appends the value (v) to the current value/list.
+
+```go
+val := ethutil.NewEmptyValue().Append(1).Append("2")
+val.AppendList().Append(3)
+```
+
+### Retrieving values
+
+`Get(i)` returns the `i` item in the list.
+
+`Uint()` returns the value as an unsigned int64.
+
+`Slice()` returns the value as a interface slice.
+
+`Str()` returns the value as a string.
+
+`Bytes()` returns the value as a byte slice.
+
+`Len()` assumes current to be a slice and returns its length.
+
+`Byte()` returns the value as a single byte.
+
+```go
+val := ethutil.NewValue([]interface{}{1,"2",[]interface{}{3}})
+val.Get(0).Uint() // => 1
+val.Get(1).Str() // => "2"
+s := val.Get(2) // => Value([]interface{}{3})
+s.Get(0).Uint() // => 3
+```
+
+## Decoding
+
+Decoding streams of RLP data is simplified
+
+```go
+val := ethutil.NewValueFromBytes(rlpData)
+val.Get(0).Uint()
+```
+
+## Encoding
+
+Encoding from Value to RLP is done with the `Encode` method. The
+underlying value can be anything RLP can encode (int, str, lists, bytes)
+
+```go
+val := ethutil.NewValue([]interface{}{1,"2",[]interface{}{3}})
+rlp := val.Encode()
+// Store the rlp data
+Store(rlp)
+```
diff --git a/ethutil/big.go b/ethutil/big.go
new file mode 100644
index 000000000..2ff1c72d8
--- /dev/null
+++ b/ethutil/big.go
@@ -0,0 +1,116 @@
+package ethutil
+
+import "math/big"
+
+// Big pow
+//
+// Returns the power of two big integers
+func BigPow(a, b int) *big.Int {
+ c := new(big.Int)
+ c.Exp(big.NewInt(int64(a)), big.NewInt(int64(b)), big.NewInt(0))
+
+ return c
+}
+
+// Big
+//
+// Shortcut for new(big.Int).SetString(..., 0)
+func Big(num string) *big.Int {
+ n := new(big.Int)
+ n.SetString(num, 0)
+
+ return n
+}
+
+// BigD
+//
+// Shortcut for new(big.Int).SetBytes(...)
+func BigD(data []byte) *big.Int {
+ n := new(big.Int)
+ n.SetBytes(data)
+
+ return n
+}
+
+func BitTest(num *big.Int, i int) bool {
+ return num.Bit(i) > 0
+}
+
+// To256
+//
+// "cast" the big int to a 256 big int (i.e., limit to)
+var tt256 = new(big.Int).Lsh(big.NewInt(1), 256)
+var tt256m1 = new(big.Int).Sub(new(big.Int).Lsh(big.NewInt(1), 256), big.NewInt(1))
+var tt255 = new(big.Int).Lsh(big.NewInt(1), 255)
+
+func U256(x *big.Int) *big.Int {
+ //if x.Cmp(Big0) < 0 {
+ // return new(big.Int).Add(tt256, x)
+ // }
+
+ x.And(x, tt256m1)
+
+ return x
+}
+
+func S256(x *big.Int) *big.Int {
+ if x.Cmp(tt255) < 0 {
+ return x
+ } else {
+ // We don't want to modify x, ever
+ return new(big.Int).Sub(x, tt256)
+ }
+}
+
+func FirstBitSet(v *big.Int) int {
+ for i := 0; i < v.BitLen(); i++ {
+ if v.Bit(i) > 0 {
+ return i
+ }
+ }
+
+ return v.BitLen()
+}
+
+// Big to bytes
+//
+// Returns the bytes of a big integer with the size specified by **base**
+// Attempts to pad the byte array with zeros.
+func BigToBytes(num *big.Int, base int) []byte {
+ ret := make([]byte, base/8)
+
+ if len(num.Bytes()) > base/8 {
+ return num.Bytes()
+ }
+
+ return append(ret[:len(ret)-len(num.Bytes())], num.Bytes()...)
+}
+
+// Big copy
+//
+// Creates a copy of the given big integer
+func BigCopy(src *big.Int) *big.Int {
+ return new(big.Int).Set(src)
+}
+
+// Big max
+//
+// Returns the maximum size big integer
+func BigMax(x, y *big.Int) *big.Int {
+ if x.Cmp(y) <= 0 {
+ return y
+ }
+
+ return x
+}
+
+// Big min
+//
+// Returns the minimum size big integer
+func BigMin(x, y *big.Int) *big.Int {
+ if x.Cmp(y) >= 0 {
+ return y
+ }
+
+ return x
+}
diff --git a/ethutil/big_test.go b/ethutil/big_test.go
new file mode 100644
index 000000000..bf3c96c6d
--- /dev/null
+++ b/ethutil/big_test.go
@@ -0,0 +1,73 @@
+package ethutil
+
+import (
+ "bytes"
+ "testing"
+)
+
+func TestMisc(t *testing.T) {
+ a := Big("10")
+ b := Big("57896044618658097711785492504343953926634992332820282019728792003956564819968")
+ c := []byte{1, 2, 3, 4}
+ z := BitTest(a, 1)
+
+ if z != true {
+ t.Error("Expected true got", z)
+ }
+
+ U256(a)
+ S256(a)
+
+ U256(b)
+ S256(b)
+
+ BigD(c)
+}
+
+func TestBigMax(t *testing.T) {
+ a := Big("10")
+ b := Big("5")
+
+ max1 := BigMax(a, b)
+ if max1 != a {
+ t.Errorf("Expected %d got %d", a, max1)
+ }
+
+ max2 := BigMax(b, a)
+ if max2 != a {
+ t.Errorf("Expected %d got %d", a, max2)
+ }
+}
+
+func TestBigMin(t *testing.T) {
+ a := Big("10")
+ b := Big("5")
+
+ min1 := BigMin(a, b)
+ if min1 != b {
+ t.Errorf("Expected %d got %d", b, min1)
+ }
+
+ min2 := BigMin(b, a)
+ if min2 != b {
+ t.Errorf("Expected %d got %d", b, min2)
+ }
+}
+
+func TestBigCopy(t *testing.T) {
+ a := Big("10")
+ b := BigCopy(a)
+ c := Big("1000000000000")
+ y := BigToBytes(b, 16)
+ ybytes := []byte{0, 10}
+ z := BigToBytes(c, 16)
+ zbytes := []byte{232, 212, 165, 16, 0}
+
+ if bytes.Compare(y, ybytes) != 0 {
+ t.Error("Got", ybytes)
+ }
+
+ if bytes.Compare(z, zbytes) != 0 {
+ t.Error("Got", zbytes)
+ }
+}
diff --git a/ethutil/bytes.go b/ethutil/bytes.go
new file mode 100644
index 000000000..bd294f28a
--- /dev/null
+++ b/ethutil/bytes.go
@@ -0,0 +1,234 @@
+package ethutil
+
+import (
+ "bytes"
+ "encoding/binary"
+ "encoding/hex"
+ "fmt"
+ "math/big"
+ "strings"
+)
+
+type Bytes []byte
+
+func (self Bytes) String() string {
+ return string(self)
+}
+
+func DeleteFromByteSlice(s [][]byte, hash []byte) [][]byte {
+ for i, h := range s {
+ if bytes.Compare(h, hash) == 0 {
+ return append(s[:i:i], s[i+1:]...)
+ }
+ }
+
+ return s
+}
+
+// Number to bytes
+//
+// Returns the number in bytes with the specified base
+func NumberToBytes(num interface{}, bits int) []byte {
+ buf := new(bytes.Buffer)
+ err := binary.Write(buf, binary.BigEndian, num)
+ if err != nil {
+ fmt.Println("NumberToBytes failed:", err)
+ }
+
+ return buf.Bytes()[buf.Len()-(bits/8):]
+}
+
+// Bytes to number
+//
+// Attempts to cast a byte slice to a unsigned integer
+func BytesToNumber(b []byte) uint64 {
+ var number uint64
+
+ // Make sure the buffer is 64bits
+ data := make([]byte, 8)
+ data = append(data[:len(b)], b...)
+
+ buf := bytes.NewReader(data)
+ err := binary.Read(buf, binary.BigEndian, &number)
+ if err != nil {
+ fmt.Println("BytesToNumber failed:", err)
+ }
+
+ return number
+}
+
+// Read variable int
+//
+// Read a variable length number in big endian byte order
+func ReadVarInt(buff []byte) (ret uint64) {
+ switch l := len(buff); {
+ case l > 4:
+ d := LeftPadBytes(buff, 8)
+ binary.Read(bytes.NewReader(d), binary.BigEndian, &ret)
+ case l > 2:
+ var num uint32
+ d := LeftPadBytes(buff, 4)
+ binary.Read(bytes.NewReader(d), binary.BigEndian, &num)
+ ret = uint64(num)
+ case l > 1:
+ var num uint16
+ d := LeftPadBytes(buff, 2)
+ binary.Read(bytes.NewReader(d), binary.BigEndian, &num)
+ ret = uint64(num)
+ default:
+ var num uint8
+ binary.Read(bytes.NewReader(buff), binary.BigEndian, &num)
+ ret = uint64(num)
+ }
+
+ return
+}
+
+// Binary length
+//
+// Returns the true binary length of the given number
+func BinaryLength(num int) int {
+ if num == 0 {
+ return 0
+ }
+
+ return 1 + BinaryLength(num>>8)
+}
+
+// Copy bytes
+//
+// Returns an exact copy of the provided bytes
+func CopyBytes(b []byte) (copiedBytes []byte) {
+ copiedBytes = make([]byte, len(b))
+ copy(copiedBytes, b)
+
+ return
+}
+
+func IsHex(str string) bool {
+ l := len(str)
+ return l >= 4 && l%2 == 0 && str[0:2] == "0x"
+}
+
+func Bytes2Hex(d []byte) string {
+ return hex.EncodeToString(d)
+}
+
+func Hex2Bytes(str string) []byte {
+ h, _ := hex.DecodeString(str)
+
+ return h
+}
+
+func StringToByteFunc(str string, cb func(str string) []byte) (ret []byte) {
+ if len(str) > 1 && str[0:2] == "0x" && !strings.Contains(str, "\n") {
+ ret = Hex2Bytes(str[2:])
+ } else {
+ ret = cb(str)
+ }
+
+ return
+}
+
+func FormatData(data string) []byte {
+ if len(data) == 0 {
+ return nil
+ }
+ // Simple stupid
+ d := new(big.Int)
+ if data[0:1] == "\"" && data[len(data)-1:] == "\"" {
+ return RightPadBytes([]byte(data[1:len(data)-1]), 32)
+ } else if len(data) > 1 && data[:2] == "0x" {
+ d.SetBytes(Hex2Bytes(data[2:]))
+ } else {
+ d.SetString(data, 0)
+ }
+
+ return BigToBytes(d, 256)
+}
+
+func ParseData(data ...interface{}) (ret []byte) {
+ for _, item := range data {
+ switch t := item.(type) {
+ case string:
+ var str []byte
+ if IsHex(t) {
+ str = Hex2Bytes(t[2:])
+ } else {
+ str = []byte(t)
+ }
+
+ ret = append(ret, RightPadBytes(str, 32)...)
+ case []byte:
+ ret = append(ret, LeftPadBytes(t, 32)...)
+ }
+ }
+
+ return
+}
+
+func RightPadBytes(slice []byte, l int) []byte {
+ if l < len(slice) {
+ return slice
+ }
+
+ padded := make([]byte, l)
+ copy(padded[0:len(slice)], slice)
+
+ return padded
+}
+
+func LeftPadBytes(slice []byte, l int) []byte {
+ if l < len(slice) {
+ return slice
+ }
+
+ padded := make([]byte, l)
+ copy(padded[l-len(slice):], slice)
+
+ return padded
+}
+
+func LeftPadString(str string, l int) string {
+ if l < len(str) {
+ return str
+ }
+
+ zeros := Bytes2Hex(make([]byte, (l-len(str))/2))
+
+ return zeros + str
+
+}
+
+func RightPadString(str string, l int) string {
+ if l < len(str) {
+ return str
+ }
+
+ zeros := Bytes2Hex(make([]byte, (l-len(str))/2))
+
+ return str + zeros
+
+}
+
+func Address(slice []byte) (addr []byte) {
+ if len(slice) < 20 {
+ addr = LeftPadBytes(slice, 20)
+ } else if len(slice) > 20 {
+ addr = slice[len(slice)-20:]
+ } else {
+ addr = slice
+ }
+
+ addr = CopyBytes(addr)
+
+ return
+}
+
+func ByteSliceToInterface(slice [][]byte) (ret []interface{}) {
+ for _, i := range slice {
+ ret = append(ret, i)
+ }
+
+ return
+}
diff --git a/ethutil/bytes_test.go b/ethutil/bytes_test.go
new file mode 100644
index 000000000..179a8c7ef
--- /dev/null
+++ b/ethutil/bytes_test.go
@@ -0,0 +1,193 @@
+package ethutil
+
+import (
+ checker "gopkg.in/check.v1"
+)
+
+type BytesSuite struct{}
+
+var _ = checker.Suite(&BytesSuite{})
+
+func (s *BytesSuite) TestByteString(c *checker.C) {
+ var data Bytes
+ data = []byte{102, 111, 111}
+ exp := "foo"
+ res := data.String()
+
+ c.Assert(res, checker.Equals, exp)
+}
+
+/*
+func (s *BytesSuite) TestDeleteFromByteSlice(c *checker.C) {
+ data := []byte{1, 2, 3, 4}
+ slice := []byte{1, 2, 3, 4}
+ exp := []byte{1, 4}
+ res := DeleteFromByteSlice(data, slice)
+
+ c.Assert(res, checker.DeepEquals, exp)
+}
+
+*/
+func (s *BytesSuite) TestNumberToBytes(c *checker.C) {
+ // data1 := int(1)
+ // res1 := NumberToBytes(data1, 16)
+ // c.Check(res1, checker.Panics)
+
+ var data2 float64 = 3.141592653
+ exp2 := []byte{0xe9, 0x38}
+ res2 := NumberToBytes(data2, 16)
+ c.Assert(res2, checker.DeepEquals, exp2)
+}
+
+func (s *BytesSuite) TestBytesToNumber(c *checker.C) {
+ datasmall := []byte{0xe9, 0x38, 0xe9, 0x38}
+ datalarge := []byte{0xe9, 0x38, 0xe9, 0x38, 0xe9, 0x38, 0xe9, 0x38}
+
+ var expsmall uint64 = 0xe938e938
+ var explarge uint64 = 0x0
+
+ ressmall := BytesToNumber(datasmall)
+ reslarge := BytesToNumber(datalarge)
+
+ c.Assert(ressmall, checker.Equals, expsmall)
+ c.Assert(reslarge, checker.Equals, explarge)
+
+}
+
+func (s *BytesSuite) TestReadVarInt(c *checker.C) {
+ data8 := []byte{1, 2, 3, 4, 5, 6, 7, 8}
+ data4 := []byte{1, 2, 3, 4}
+ data2 := []byte{1, 2}
+ data1 := []byte{1}
+
+ exp8 := uint64(72623859790382856)
+ exp4 := uint64(16909060)
+ exp2 := uint64(258)
+ exp1 := uint64(1)
+
+ res8 := ReadVarInt(data8)
+ res4 := ReadVarInt(data4)
+ res2 := ReadVarInt(data2)
+ res1 := ReadVarInt(data1)
+
+ c.Assert(res8, checker.Equals, exp8)
+ c.Assert(res4, checker.Equals, exp4)
+ c.Assert(res2, checker.Equals, exp2)
+ c.Assert(res1, checker.Equals, exp1)
+}
+
+func (s *BytesSuite) TestBinaryLength(c *checker.C) {
+ data1 := 0
+ data2 := 920987656789
+
+ exp1 := 0
+ exp2 := 5
+
+ res1 := BinaryLength(data1)
+ res2 := BinaryLength(data2)
+
+ c.Assert(res1, checker.Equals, exp1)
+ c.Assert(res2, checker.Equals, exp2)
+}
+
+func (s *BytesSuite) TestCopyBytes(c *checker.C) {
+ data1 := []byte{1, 2, 3, 4}
+ exp1 := []byte{1, 2, 3, 4}
+ res1 := CopyBytes(data1)
+ c.Assert(res1, checker.DeepEquals, exp1)
+}
+
+func (s *BytesSuite) TestIsHex(c *checker.C) {
+ data1 := "a9e67e"
+ exp1 := false
+ res1 := IsHex(data1)
+ c.Assert(res1, checker.DeepEquals, exp1)
+
+ data2 := "0xa9e67e00"
+ exp2 := true
+ res2 := IsHex(data2)
+ c.Assert(res2, checker.DeepEquals, exp2)
+
+}
+
+func (s *BytesSuite) TestParseDataString(c *checker.C) {
+ res1 := ParseData("hello", "world", "0x0106")
+ data := "68656c6c6f000000000000000000000000000000000000000000000000000000776f726c640000000000000000000000000000000000000000000000000000000106000000000000000000000000000000000000000000000000000000000000"
+ exp1 := Hex2Bytes(data)
+ c.Assert(res1, checker.DeepEquals, exp1)
+}
+
+func (s *BytesSuite) TestParseDataBytes(c *checker.C) {
+ data1 := []byte{232, 212, 165, 16, 0}
+ exp1 := []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 212, 165, 16, 0}
+
+ res1 := ParseData(data1)
+ c.Assert(res1, checker.DeepEquals, exp1)
+
+}
+
+func (s *BytesSuite) TestLeftPadBytes(c *checker.C) {
+ val1 := []byte{1, 2, 3, 4}
+ exp1 := []byte{0, 0, 0, 0, 1, 2, 3, 4}
+
+ res1 := LeftPadBytes(val1, 8)
+ res2 := LeftPadBytes(val1, 2)
+
+ c.Assert(res1, checker.DeepEquals, exp1)
+ c.Assert(res2, checker.DeepEquals, val1)
+}
+
+func (s *BytesSuite) TestFormatData(c *checker.C) {
+ data1 := ""
+ data2 := "0xa9e67e00"
+ data3 := "a9e67e"
+ data4 := "\"a9e67e00\""
+
+ // exp1 := []byte{}
+ exp2 := []byte{00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 0xa9, 0xe6, 0x7e, 00}
+ exp3 := []byte{00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00}
+ exp4 := []byte{0x61, 0x39, 0x65, 0x36, 0x37, 0x65, 0x30, 0x30, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00}
+
+ res1 := FormatData(data1)
+ res2 := FormatData(data2)
+ res3 := FormatData(data3)
+ res4 := FormatData(data4)
+
+ c.Assert(res1, checker.IsNil)
+ c.Assert(res2, checker.DeepEquals, exp2)
+ c.Assert(res3, checker.DeepEquals, exp3)
+ c.Assert(res4, checker.DeepEquals, exp4)
+}
+
+func (s *BytesSuite) TestRightPadBytes(c *checker.C) {
+ val := []byte{1, 2, 3, 4}
+ exp := []byte{1, 2, 3, 4, 0, 0, 0, 0}
+
+ resstd := RightPadBytes(val, 8)
+ resshrt := RightPadBytes(val, 2)
+
+ c.Assert(resstd, checker.DeepEquals, exp)
+ c.Assert(resshrt, checker.DeepEquals, val)
+}
+
+func (s *BytesSuite) TestLeftPadString(c *checker.C) {
+ val := "test"
+ exp := "\x30\x30\x30\x30" + val
+
+ resstd := LeftPadString(val, 8)
+ resshrt := LeftPadString(val, 2)
+
+ c.Assert(resstd, checker.Equals, exp)
+ c.Assert(resshrt, checker.Equals, val)
+}
+
+func (s *BytesSuite) TestRightPadString(c *checker.C) {
+ val := "test"
+ exp := val + "\x30\x30\x30\x30"
+
+ resstd := RightPadString(val, 8)
+ resshrt := RightPadString(val, 2)
+
+ c.Assert(resstd, checker.Equals, exp)
+ c.Assert(resshrt, checker.Equals, val)
+}
diff --git a/ethutil/common.go b/ethutil/common.go
new file mode 100644
index 000000000..0a29cac6c
--- /dev/null
+++ b/ethutil/common.go
@@ -0,0 +1,87 @@
+package ethutil
+
+import (
+ "fmt"
+ "math/big"
+ "runtime"
+)
+
+func IsWindows() bool {
+ return runtime.GOOS == "windows"
+}
+
+func WindonizePath(path string) string {
+ if string(path[0]) == "/" && IsWindows() {
+ path = path[1:]
+ }
+ return path
+}
+
+// The different number of units
+var (
+ Douglas = BigPow(10, 42)
+ Einstein = BigPow(10, 21)
+ Ether = BigPow(10, 18)
+ Finney = BigPow(10, 15)
+ Szabo = BigPow(10, 12)
+ Shannon = BigPow(10, 9)
+ Babbage = BigPow(10, 6)
+ Ada = BigPow(10, 3)
+ Wei = big.NewInt(1)
+)
+
+//
+// Currency to string
+// Returns a string representing a human readable format
+func CurrencyToString(num *big.Int) string {
+ var (
+ fin *big.Int = num
+ denom string = "Wei"
+ )
+
+ switch {
+ case num.Cmp(Douglas) >= 0:
+ fin = new(big.Int).Div(num, Douglas)
+ denom = "Douglas"
+ case num.Cmp(Einstein) >= 0:
+ fin = new(big.Int).Div(num, Einstein)
+ denom = "Einstein"
+ case num.Cmp(Ether) >= 0:
+ fin = new(big.Int).Div(num, Ether)
+ denom = "Ether"
+ case num.Cmp(Finney) >= 0:
+ fin = new(big.Int).Div(num, Finney)
+ denom = "Finney"
+ case num.Cmp(Szabo) >= 0:
+ fin = new(big.Int).Div(num, Szabo)
+ denom = "Szabo"
+ case num.Cmp(Shannon) >= 0:
+ fin = new(big.Int).Div(num, Shannon)
+ denom = "Shannon"
+ case num.Cmp(Babbage) >= 0:
+ fin = new(big.Int).Div(num, Babbage)
+ denom = "Babbage"
+ case num.Cmp(Ada) >= 0:
+ fin = new(big.Int).Div(num, Ada)
+ denom = "Ada"
+ }
+
+ // TODO add comment clarifying expected behavior
+ if len(fin.String()) > 5 {
+ return fmt.Sprintf("%sE%d %s", fin.String()[0:5], len(fin.String())-5, denom)
+ }
+
+ return fmt.Sprintf("%v %s", fin, denom)
+}
+
+// Common big integers often used
+var (
+ Big1 = big.NewInt(1)
+ Big2 = big.NewInt(2)
+ Big3 = big.NewInt(3)
+ Big0 = big.NewInt(0)
+ BigTrue = Big1
+ BigFalse = Big0
+ Big32 = big.NewInt(32)
+ Big256 = big.NewInt(0xff)
+)
diff --git a/ethutil/common_test.go b/ethutil/common_test.go
new file mode 100644
index 000000000..c2b6077e9
--- /dev/null
+++ b/ethutil/common_test.go
@@ -0,0 +1,68 @@
+package ethutil
+
+import (
+ "math/big"
+ "os"
+
+ checker "gopkg.in/check.v1"
+)
+
+type CommonSuite struct{}
+
+var _ = checker.Suite(&CommonSuite{})
+
+func (s *CommonSuite) TestOS(c *checker.C) {
+ expwin := (os.PathSeparator == '\\' && os.PathListSeparator == ';')
+ res := IsWindows()
+
+ if !expwin {
+ c.Assert(res, checker.Equals, expwin, checker.Commentf("IsWindows is", res, "but path is", os.PathSeparator))
+ } else {
+ c.Assert(res, checker.Not(checker.Equals), expwin, checker.Commentf("IsWindows is", res, "but path is", os.PathSeparator))
+ }
+}
+
+func (s *CommonSuite) TestWindonziePath(c *checker.C) {
+ iswindowspath := os.PathSeparator == '\\'
+ path := "/opt/eth/test/file.ext"
+ res := WindonizePath(path)
+ ressep := string(res[0])
+
+ if !iswindowspath {
+ c.Assert(ressep, checker.Equals, "/")
+ } else {
+ c.Assert(ressep, checker.Not(checker.Equals), "/")
+ }
+}
+
+func (s *CommonSuite) TestCommon(c *checker.C) {
+ douglas := CurrencyToString(BigPow(10, 43))
+ einstein := CurrencyToString(BigPow(10, 22))
+ ether := CurrencyToString(BigPow(10, 19))
+ finney := CurrencyToString(BigPow(10, 16))
+ szabo := CurrencyToString(BigPow(10, 13))
+ shannon := CurrencyToString(BigPow(10, 10))
+ babbage := CurrencyToString(BigPow(10, 7))
+ ada := CurrencyToString(BigPow(10, 4))
+ wei := CurrencyToString(big.NewInt(10))
+
+ c.Assert(douglas, checker.Equals, "10 Douglas")
+ c.Assert(einstein, checker.Equals, "10 Einstein")
+ c.Assert(ether, checker.Equals, "10 Ether")
+ c.Assert(finney, checker.Equals, "10 Finney")
+ c.Assert(szabo, checker.Equals, "10 Szabo")
+ c.Assert(shannon, checker.Equals, "10 Shannon")
+ c.Assert(babbage, checker.Equals, "10 Babbage")
+ c.Assert(ada, checker.Equals, "10 Ada")
+ c.Assert(wei, checker.Equals, "10 Wei")
+}
+
+func (s *CommonSuite) TestLarge(c *checker.C) {
+ douglaslarge := CurrencyToString(BigPow(100000000, 43))
+ adalarge := CurrencyToString(BigPow(100000000, 4))
+ weilarge := CurrencyToString(big.NewInt(100000000))
+
+ c.Assert(douglaslarge, checker.Equals, "10000E298 Douglas")
+ c.Assert(adalarge, checker.Equals, "10000E7 Einstein")
+ c.Assert(weilarge, checker.Equals, "100 Babbage")
+}
diff --git a/ethutil/config.go b/ethutil/config.go
new file mode 100644
index 000000000..ccc7714d0
--- /dev/null
+++ b/ethutil/config.go
@@ -0,0 +1,72 @@
+package ethutil
+
+import (
+ "flag"
+ "fmt"
+ "os"
+
+ "github.com/rakyll/globalconf"
+)
+
+// Config struct
+type ConfigManager struct {
+ Db Database
+
+ ExecPath string
+ Debug bool
+ Diff bool
+ DiffType string
+ Paranoia bool
+ VmType int
+
+ conf *globalconf.GlobalConf
+}
+
+var Config *ConfigManager
+
+// Read config
+//
+// Initialize Config from Config File
+func ReadConfig(ConfigFile string, Datadir string, EnvPrefix string) *ConfigManager {
+ if Config == nil {
+ // create ConfigFile if does not exist, otherwise globalconf panic when trying to persist flags
+ if !FileExist(ConfigFile) {
+ fmt.Printf("config file '%s' doesn't exist, creating it\n", ConfigFile)
+ os.Create(ConfigFile)
+ }
+ g, err := globalconf.NewWithOptions(&globalconf.Options{
+ Filename: ConfigFile,
+ EnvPrefix: EnvPrefix,
+ })
+ if err != nil {
+ fmt.Println(err)
+ } else {
+ g.ParseAll()
+ }
+ Config = &ConfigManager{ExecPath: Datadir, Debug: true, conf: g, Paranoia: true}
+ }
+ return Config
+}
+
+// provides persistence for flags
+func (c *ConfigManager) Save(key string, value interface{}) {
+ f := &flag.Flag{Name: key, Value: newConfValue(value)}
+ c.conf.Set("", f)
+}
+
+func (c *ConfigManager) Delete(key string) {
+ c.conf.Delete("", key)
+}
+
+// private type implementing flag.Value
+type confValue struct {
+ value string
+}
+
+// generic constructor to allow persising non-string values directly
+func newConfValue(value interface{}) *confValue {
+ return &confValue{fmt.Sprintf("%v", value)}
+}
+
+func (self confValue) String() string { return self.value }
+func (self confValue) Set(s string) error { self.value = s; return nil }
diff --git a/ethutil/db.go b/ethutil/db.go
new file mode 100644
index 000000000..e02a80fca
--- /dev/null
+++ b/ethutil/db.go
@@ -0,0 +1,12 @@
+package ethutil
+
+// Database interface
+type Database interface {
+ Put(key []byte, value []byte)
+ Get(key []byte) ([]byte, error)
+ //GetKeys() []*Key
+ Delete(key []byte) error
+ LastKnownTD() []byte
+ Close()
+ Print()
+}
diff --git a/ethutil/list.go b/ethutil/list.go
new file mode 100644
index 000000000..db276f1e3
--- /dev/null
+++ b/ethutil/list.go
@@ -0,0 +1,81 @@
+package ethutil
+
+import (
+ "encoding/json"
+ "reflect"
+ "sync"
+)
+
+// The list type is an anonymous slice handler which can be used
+// for containing any slice type to use in an environment which
+// does not support slice types (e.g., JavaScript, QML)
+type List struct {
+ mut sync.Mutex
+ val interface{}
+ list reflect.Value
+ Length int
+}
+
+// Initialise a new list. Panics if non-slice type is given.
+func NewList(t interface{}) *List {
+ list := reflect.ValueOf(t)
+ if list.Kind() != reflect.Slice {
+ panic("list container initialized with a non-slice type")
+ }
+
+ return &List{sync.Mutex{}, t, list, list.Len()}
+}
+
+func EmptyList() *List {
+ return NewList([]interface{}{})
+}
+
+// Get N element from the embedded slice. Returns nil if OOB.
+func (self *List) Get(i int) interface{} {
+ if self.list.Len() > i {
+ self.mut.Lock()
+ defer self.mut.Unlock()
+
+ i := self.list.Index(i).Interface()
+
+ return i
+ }
+
+ return nil
+}
+
+func (self *List) GetAsJson(i int) interface{} {
+ e := self.Get(i)
+
+ r, _ := json.Marshal(e)
+
+ return string(r)
+}
+
+// Appends value at the end of the slice. Panics when incompatible value
+// is given.
+func (self *List) Append(v interface{}) {
+ self.mut.Lock()
+ defer self.mut.Unlock()
+
+ self.list = reflect.Append(self.list, reflect.ValueOf(v))
+ self.Length = self.list.Len()
+}
+
+// Returns the underlying slice as interface.
+func (self *List) Interface() interface{} {
+ return self.list.Interface()
+}
+
+// For JavaScript <3
+func (self *List) ToJSON() string {
+ // make(T, 0) != nil
+ list := make([]interface{}, 0)
+ for i := 0; i < self.Length; i++ {
+ list = append(list, self.Get(i))
+ }
+
+ data, _ := json.Marshal(list)
+
+ return string(data)
+}
diff --git a/ethutil/main_test.go b/ethutil/main_test.go
new file mode 100644
index 000000000..fd4278ce7
--- /dev/null
+++ b/ethutil/main_test.go
@@ -0,0 +1,9 @@
+package ethutil
+
+import (
+ "testing"
+
+ checker "gopkg.in/check.v1"
+)
+
+func Test(t *testing.T) { checker.TestingT(t) }
diff --git a/ethutil/package.go b/ethutil/package.go
new file mode 100644
index 000000000..e5df989d2
--- /dev/null
+++ b/ethutil/package.go
@@ -0,0 +1,123 @@
+package ethutil
+
+import (
+ "archive/zip"
+ "encoding/json"
+ "fmt"
+ "io"
+ "io/ioutil"
+ "strings"
+)
+
+// Manifest object
+//
+// The manifest object holds all the relevant information supplied with the
+// the manifest specified in the package
+type Manifest struct {
+ Entry string
+ Height, Width int
+}
+
+// External package
+//
+// External package contains the main html file and manifest
+type ExtPackage struct {
+ EntryHtml string
+ Manifest *Manifest
+}
+
+// Read file
+//
+// Read a given compressed file and returns the read bytes.
+// Returns an error otherwise
+func ReadFile(f *zip.File) ([]byte, error) {
+ rc, err := f.Open()
+ if err != nil {
+ return nil, err
+ }
+ defer rc.Close()
+
+ content, err := ioutil.ReadAll(rc)
+ if err != nil {
+ return nil, err
+ }
+
+ return content, nil
+}
+
+// Reads manifest
+//
+// Reads and returns a manifest object. Returns error otherwise
+func ReadManifest(m []byte) (*Manifest, error) {
+ var manifest Manifest
+
+ dec := json.NewDecoder(strings.NewReader(string(m)))
+ if err := dec.Decode(&manifest); err == io.EOF {
+ } else if err != nil {
+ return nil, err
+ }
+
+ return &manifest, nil
+}
+
+// Find file in archive
+//
+// Returns the index of the given file name if it exists. -1 if file not found
+func FindFileInArchive(fn string, files []*zip.File) (index int) {
+ index = -1
+ // Find the manifest first
+ for i, f := range files {
+ if f.Name == fn {
+ index = i
+ }
+ }
+
+ return
+}
+
+// Open package
+//
+// Opens a prepared ethereum package
+// Reads the manifest file and determines file contents and returns and
+// the external package.
+func OpenPackage(fn string) (*ExtPackage, error) {
+ r, err := zip.OpenReader(fn)
+ if err != nil {
+ return nil, err
+ }
+ defer r.Close()
+
+ manifestIndex := FindFileInArchive("manifest.json", r.File)
+
+ if manifestIndex < 0 {
+ return nil, fmt.Errorf("No manifest file found in archive")
+ }
+
+ f, err := ReadFile(r.File[manifestIndex])
+ if err != nil {
+ return nil, err
+ }
+
+ manifest, err := ReadManifest(f)
+ if err != nil {
+ return nil, err
+ }
+
+ if manifest.Entry == "" {
+ return nil, fmt.Errorf("Entry file specified but appears to be empty: %s", manifest.Entry)
+ }
+
+ entryIndex := FindFileInArchive(manifest.Entry, r.File)
+ if entryIndex < 0 {
+ return nil, fmt.Errorf("Entry file not found: '%s'", manifest.Entry)
+ }
+
+ f, err = ReadFile(r.File[entryIndex])
+ if err != nil {
+ return nil, err
+ }
+
+ extPackage := &ExtPackage{string(f), manifest}
+
+ return extPackage, nil
+}
diff --git a/ethutil/path.go b/ethutil/path.go
new file mode 100644
index 000000000..cfbc38950
--- /dev/null
+++ b/ethutil/path.go
@@ -0,0 +1,60 @@
+package ethutil
+
+import (
+ "io/ioutil"
+ "os"
+ "os/user"
+ "strings"
+)
+
+func ExpandHomePath(p string) (path string) {
+ path = p
+
+ // Check in case of paths like "/something/~/something/"
+ if path[:2] == "~/" {
+ usr, _ := user.Current()
+ dir := usr.HomeDir
+
+ path = strings.Replace(p, "~", dir, 1)
+ }
+
+ return
+}
+
+func FileExist(filePath string) bool {
+ _, err := os.Stat(filePath)
+ if err != nil && os.IsNotExist(err) {
+ return false
+ }
+
+ return true
+}
+
+func ReadAllFile(filePath string) (string, error) {
+ file, err := os.Open(filePath)
+ if err != nil {
+ return "", err
+ }
+
+ data, err := ioutil.ReadAll(file)
+ if err != nil {
+ return "", err
+ }
+
+ return string(data), nil
+}
+
+func WriteFile(filePath string, content []byte) error {
+ fh, err := os.OpenFile(filePath, os.O_TRUNC|os.O_RDWR|os.O_CREATE, os.ModePerm)
+ if err != nil {
+ return err
+ }
+ defer fh.Close()
+
+ _, err = fh.Write(content)
+ if err != nil {
+ return err
+ }
+
+ return nil
+}
diff --git a/ethutil/path_test.go b/ethutil/path_test.go
new file mode 100644
index 000000000..908c94ee7
--- /dev/null
+++ b/ethutil/path_test.go
@@ -0,0 +1,51 @@
+package ethutil
+
+import (
+ // "os"
+ "testing"
+)
+
+func TestGoodFile(t *testing.T) {
+ goodpath := "~/goethereumtest.pass"
+ path := ExpandHomePath(goodpath)
+ contentstring := "3.14159265358979323846"
+
+ err := WriteFile(path, []byte(contentstring))
+ if err != nil {
+ t.Error("Could not write file")
+ }
+
+ if !FileExist(path) {
+ t.Error("File not found at", path)
+ }
+
+ v, err := ReadAllFile(path)
+ if err != nil {
+ t.Error("Could not read file", path)
+ }
+ if v != contentstring {
+ t.Error("Expected", contentstring, "Got", v)
+ }
+
+}
+
+func TestBadFile(t *testing.T) {
+ badpath := "/this/path/should/not/exist/goethereumtest.fail"
+ path := ExpandHomePath(badpath)
+ contentstring := "3.14159265358979323846"
+
+ err := WriteFile(path, []byte(contentstring))
+ if err == nil {
+ t.Error("Wrote file, but should not be able to", path)
+ }
+
+ if FileExist(path) {
+ t.Error("Found file, but should not be able to", path)
+ }
+
+ v, err := ReadAllFile(path)
+ if err == nil {
+ t.Error("Read file, but should not be able to", v)
+ }
+
+}
diff --git a/ethutil/rand.go b/ethutil/rand.go
new file mode 100644
index 000000000..91dafec7e
--- /dev/null
+++ b/ethutil/rand.go
@@ -0,0 +1,24 @@
+package ethutil
+
+import (
+ "crypto/rand"
+ "encoding/binary"
+ "io"
+)
+
+func randomUint64(r io.Reader) (uint64, error) {
+ b := make([]byte, 8)
+ n, err := r.Read(b)
+ if n != len(b) {
+ return 0, io.ErrShortBuffer
+ }
+ if err != nil {
+ return 0, err
+ }
+ return binary.BigEndian.Uint64(b), nil
+}
+
+// RandomUint64 returns a cryptographically random uint64 value.
+func RandomUint64() (uint64, error) {
+ return randomUint64(rand.Reader)
+}
diff --git a/ethutil/rand_test.go b/ethutil/rand_test.go
new file mode 100644
index 000000000..c12698538
--- /dev/null
+++ b/ethutil/rand_test.go
@@ -0,0 +1,17 @@
+package ethutil
+
+import (
+ checker "gopkg.in/check.v1"
+)
+
+type RandomSuite struct{}
+
+var _ = checker.Suite(&RandomSuite{})
+
+func (s *RandomSuite) TestRandomUint64(c *checker.C) {
+ res1, _ := RandomUint64()
+ res2, _ := RandomUint64()
+ c.Assert(res1, checker.NotNil)
+ c.Assert(res2, checker.NotNil)
+ c.Assert(res1, checker.Not(checker.Equals), res2)
+}
diff --git a/ethutil/rlp.go b/ethutil/rlp.go
new file mode 100644
index 000000000..1bc1a58a7
--- /dev/null
+++ b/ethutil/rlp.go
@@ -0,0 +1,276 @@
+package ethutil
+
+import (
+ "bytes"
+ "fmt"
+ "math/big"
+ "reflect"
+)
+
+type RlpEncode interface {
+ RlpEncode() []byte
+}
+
+type RlpEncodeDecode interface {
+ RlpEncode
+ RlpValue() []interface{}
+}
+
+type RlpEncodable interface {
+ RlpData() interface{}
+}
+
+func Rlp(encoder RlpEncode) []byte {
+ return encoder.RlpEncode()
+}
+
+type RlpEncoder struct {
+ rlpData []byte
+}
+
+func NewRlpEncoder() *RlpEncoder {
+ encoder := &RlpEncoder{}
+
+ return encoder
+}
+func (coder *RlpEncoder) EncodeData(rlpData interface{}) []byte {
+ return Encode(rlpData)
+}
+
+const (
+ RlpEmptyList = 0x80
+ RlpEmptyStr = 0x40
+)
+
+const rlpEof = -1
+
+func Char(c []byte) int {
+ if len(c) > 0 {
+ return int(c[0])
+ }
+
+ return rlpEof
+}
+
+func DecodeWithReader(reader *bytes.Buffer) interface{} {
+ var slice []interface{}
+
+ // Read the next byte
+ char := Char(reader.Next(1))
+ switch {
+ case char <= 0x7f:
+ return char
+
+ case char <= 0xb7:
+ return reader.Next(int(char - 0x80))
+
+ case char <= 0xbf:
+ length := ReadVarInt(reader.Next(int(char - 0xb7)))
+
+ return reader.Next(int(length))
+
+ case char <= 0xf7:
+ length := int(char - 0xc0)
+ for i := 0; i < length; i++ {
+ obj := DecodeWithReader(reader)
+ slice = append(slice, obj)
+ }
+
+ return slice
+ case char <= 0xff:
+ length := ReadVarInt(reader.Next(int(char - 0xf7)))
+ for i := uint64(0); i < length; i++ {
+ obj := DecodeWithReader(reader)
+ slice = append(slice, obj)
+ }
+
+ return slice
+ default:
+ panic(fmt.Sprintf("byte not supported: %q", char))
+ }
+
+ return slice
+}
+
+var (
+ directRlp = big.NewInt(0x7f)
+ numberRlp = big.NewInt(0xb7)
+ zeroRlp = big.NewInt(0x0)
+)
+
+func intlen(i int64) (length int) {
+ for i > 0 {
+ i = i >> 8
+ length++
+ }
+ return
+}
+
+func Encode(object interface{}) []byte {
+ var buff bytes.Buffer
+
+ if object != nil {
+ switch t := object.(type) {
+ case *Value:
+ buff.Write(Encode(t.Raw()))
+ case RlpEncodable:
+ buff.Write(Encode(t.RlpData()))
+ // Code dup :-/
+ case int:
+ buff.Write(Encode(big.NewInt(int64(t))))
+ case uint:
+ buff.Write(Encode(big.NewInt(int64(t))))
+ case int8:
+ buff.Write(Encode(big.NewInt(int64(t))))
+ case int16:
+ buff.Write(Encode(big.NewInt(int64(t))))
+ case int32:
+ buff.Write(Encode(big.NewInt(int64(t))))
+ case int64:
+ buff.Write(Encode(big.NewInt(t)))
+ case uint16:
+ buff.Write(Encode(big.NewInt(int64(t))))
+ case uint32:
+ buff.Write(Encode(big.NewInt(int64(t))))
+ case uint64:
+ buff.Write(Encode(big.NewInt(int64(t))))
+ case byte:
+ buff.Write(Encode(big.NewInt(int64(t))))
+ case *big.Int:
+ // Not sure how this is possible while we check for
+ if t == nil {
+ buff.WriteByte(0xc0)
+ } else {
+ buff.Write(Encode(t.Bytes()))
+ }
+ case Bytes:
+ buff.Write(Encode([]byte(t)))
+ case []byte:
+ if len(t) == 1 && t[0] <= 0x7f {
+ buff.Write(t)
+ } else if len(t) < 56 {
+ buff.WriteByte(byte(len(t) + 0x80))
+ buff.Write(t)
+ } else {
+ b := big.NewInt(int64(len(t)))
+ buff.WriteByte(byte(len(b.Bytes()) + 0xb7))
+ buff.Write(b.Bytes())
+ buff.Write(t)
+ }
+ case string:
+ buff.Write(Encode([]byte(t)))
+ case []interface{}:
+ // Inline function for writing the slice header
+ WriteSliceHeader := func(length int) {
+ if length < 56 {
+ buff.WriteByte(byte(length + 0xc0))
+ } else {
+ b := big.NewInt(int64(length))
+ buff.WriteByte(byte(len(b.Bytes()) + 0xf7))
+ buff.Write(b.Bytes())
+ }
+ }
+
+ var b bytes.Buffer
+ for _, val := range t {
+ b.Write(Encode(val))
+ }
+ WriteSliceHeader(len(b.Bytes()))
+ buff.Write(b.Bytes())
+ default:
+ // This is how it should have been from the start
+ // needs refactoring (@fjl)
+ v := reflect.ValueOf(t)
+ switch v.Kind() {
+ case reflect.Slice:
+ var b bytes.Buffer
+ for i := 0; i < v.Len(); i++ {
+ b.Write(Encode(v.Index(i).Interface()))
+ }
+
+ blen := b.Len()
+ if blen < 56 {
+ buff.WriteByte(byte(blen) + 0xc0)
+ } else {
+ ilen := byte(intlen(int64(blen)))
+ buff.WriteByte(ilen + 0xf7)
+ t := make([]byte, ilen)
+ for i := byte(0); i < ilen; i++ {
+ t[ilen-i-1] = byte(blen >> (i * 8))
+ }
+ buff.Write(t)
+ }
+ buff.ReadFrom(&b)
+ }
+ }
+ } else {
+ // Empty list for nil
+ buff.WriteByte(0xc0)
+ }
+
+ return buff.Bytes()
+}
+
+// TODO Use a bytes.Buffer instead of a raw byte slice.
+// Cleaner code, and use draining instead of seeking the next bytes to read
+func Decode(data []byte, pos uint64) (interface{}, uint64) {
+ var slice []interface{}
+ char := int(data[pos])
+ switch {
+ case char <= 0x7f:
+ return data[pos], pos + 1
+
+ case char <= 0xb7:
+ b := uint64(data[pos]) - 0x80
+
+ return data[pos+1 : pos+1+b], pos + 1 + b
+
+ case char <= 0xbf:
+ b := uint64(data[pos]) - 0xb7
+
+ b2 := ReadVarInt(data[pos+1 : pos+1+b])
+
+ return data[pos+1+b : pos+1+b+b2], pos + 1 + b + b2
+
+ case char <= 0xf7:
+ b := uint64(data[pos]) - 0xc0
+ prevPos := pos
+ pos++
+ for i := uint64(0); i < b; {
+ var obj interface{}
+
+ // Get the next item in the data list and append it
+ obj, prevPos = Decode(data, pos)
+ slice = append(slice, obj)
+
+ // Increment i by the amount bytes read in the previous
+ // read
+ i += (prevPos - pos)
+ pos = prevPos
+ }
+ return slice, pos
+
+ case char <= 0xff:
+ l := uint64(data[pos]) - 0xf7
+ b := ReadVarInt(data[pos+1 : pos+1+l])
+
+ pos = pos + l + 1
+
+ prevPos := b
+ for i := uint64(0); i < uint64(b); {
+ var obj interface{}
+
+ obj, prevPos = Decode(data, pos)
+ slice = append(slice, obj)
+
+ i += (prevPos - pos)
+ pos = prevPos
+ }
+ return slice, pos
+
+ default:
+ panic(fmt.Sprintf("byte not supported: %q", char))
+ }
+
+ return slice, 0
+}
diff --git a/ethutil/rlp_test.go b/ethutil/rlp_test.go
new file mode 100644
index 000000000..ff98d3269
--- /dev/null
+++ b/ethutil/rlp_test.go
@@ -0,0 +1,156 @@
+package ethutil
+
+import (
+ "bytes"
+ "math/big"
+ "reflect"
+ "testing"
+)
+
+func TestNonInterfaceSlice(t *testing.T) {
+ vala := []string{"value1", "value2", "value3"}
+ valb := []interface{}{"value1", "value2", "value3"}
+ resa := Encode(vala)
+ resb := Encode(valb)
+ if !bytes.Equal(resa, resb) {
+ t.Errorf("expected []string & []interface{} to be equal")
+ }
+}
+
+func TestRlpValueEncoding(t *testing.T) {
+ val := EmptyValue()
+ val.AppendList().Append(1).Append(2).Append(3)
+ val.Append("4").AppendList().Append(5)
+
+ res := val.Encode()
+ exp := Encode([]interface{}{[]interface{}{1, 2, 3}, "4", []interface{}{5}})
+ if bytes.Compare(res, exp) != 0 {
+ t.Errorf("expected %q, got %q", res, exp)
+ }
+}
+
+func TestValueSlice(t *testing.T) {
+ val := []interface{}{
+ "value1",
+ "valeu2",
+ "value3",
+ }
+
+ value := NewValue(val)
+ splitVal := value.SliceFrom(1)
+
+ if splitVal.Len() != 2 {
+ t.Error("SliceFrom: Expected len", 2, "got", splitVal.Len())
+ }
+
+ splitVal = value.SliceTo(2)
+ if splitVal.Len() != 2 {
+ t.Error("SliceTo: Expected len", 2, "got", splitVal.Len())
+ }
+
+ splitVal = value.SliceFromTo(1, 3)
+ if splitVal.Len() != 2 {
+ t.Error("SliceFromTo: Expected len", 2, "got", splitVal.Len())
+ }
+}
+
+func TestLargeData(t *testing.T) {
+ data := make([]byte, 100000)
+ enc := Encode(data)
+ value := NewValue(enc)
+ value.Decode()
+
+ if value.Len() != len(data) {
+ t.Error("Expected data to be", len(data), "got", value.Len())
+ }
+}
+
+func TestValue(t *testing.T) {
+ value := NewValueFromBytes([]byte("\xcd\x83dog\x83god\x83cat\x01"))
+ if value.Get(0).Str() != "dog" {
+ t.Errorf("expected '%v', got '%v'", value.Get(0).Str(), "dog")
+ }
+
+ if value.Get(3).Uint() != 1 {
+ t.Errorf("expected '%v', got '%v'", value.Get(3).Uint(), 1)
+ }
+}
+
+func TestEncode(t *testing.T) {
+ strRes := "\x83dog"
+ bytes := Encode("dog")
+
+ str := string(bytes)
+ if str != strRes {
+ t.Errorf("Expected %q, got %q", strRes, str)
+ }
+
+ sliceRes := "\xcc\x83dog\x83god\x83cat"
+ strs := []interface{}{"dog", "god", "cat"}
+ bytes = Encode(strs)
+ slice := string(bytes)
+ if slice != sliceRes {
+ t.Error("Expected %q, got %q", sliceRes, slice)
+ }
+
+ intRes := "\x82\x04\x00"
+ bytes = Encode(1024)
+ if string(bytes) != intRes {
+ t.Errorf("Expected %q, got %q", intRes, bytes)
+ }
+}
+
+func TestDecode(t *testing.T) {
+ single := []byte("\x01")
+ b, _ := Decode(single, 0)
+
+ if b.(uint8) != 1 {
+ t.Errorf("Expected 1, got %q", b)
+ }
+
+ str := []byte("\x83dog")
+ b, _ = Decode(str, 0)
+ if bytes.Compare(b.([]byte), []byte("dog")) != 0 {
+ t.Errorf("Expected dog, got %q", b)
+ }
+
+ slice := []byte("\xcc\x83dog\x83god\x83cat")
+ res := []interface{}{"dog", "god", "cat"}
+ b, _ = Decode(slice, 0)
+ if reflect.DeepEqual(b, res) {
+ t.Errorf("Expected %q, got %q", res, b)
+ }
+}
+
+func TestEncodeDecodeBigInt(t *testing.T) {
+ bigInt := big.NewInt(1391787038)
+ encoded := Encode(bigInt)
+
+ value := NewValueFromBytes(encoded)
+ if value.BigInt().Cmp(bigInt) != 0 {
+ t.Errorf("Expected %v, got %v", bigInt, value.BigInt())
+ }
+}
+
+func TestEncodeDecodeBytes(t *testing.T) {
+ b := NewValue([]interface{}{[]byte{1, 2, 3, 4, 5}, byte(6)})
+ val := NewValueFromBytes(b.Encode())
+ if !b.Cmp(val) {
+ t.Errorf("Expected %v, got %v", val, b)
+ }
+}
+
+func TestEncodeZero(t *testing.T) {
+ b := NewValue(0).Encode()
+ exp := []byte{0xc0}
+ if bytes.Compare(b, exp) == 0 {
+ t.Error("Expected", exp, "got", b)
+ }
+}
+
+func BenchmarkEncodeDecode(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ bytes := Encode([]interface{}{"dog", "god", "cat"})
+ Decode(bytes, 0)
+ }
+}
diff --git a/ethutil/script_unix.go b/ethutil/script_unix.go
new file mode 100644
index 000000000..9250dda57
--- /dev/null
+++ b/ethutil/script_unix.go
@@ -0,0 +1,19 @@
+// +build !windows
+
+package ethutil
+
+import "github.com/ethereum/serpent-go"
+
+// General compile function
+func Compile(script string, silent bool) (ret []byte, err error) {
+ if len(script) > 2 {
+ byteCode, err := serpent.Compile(script)
+ if err != nil {
+ return nil, err
+ }
+
+ return byteCode, nil
+ }
+
+ return nil, nil
+}
diff --git a/ethutil/script_windows.go b/ethutil/script_windows.go
new file mode 100644
index 000000000..1dedc5f60
--- /dev/null
+++ b/ethutil/script_windows.go
@@ -0,0 +1,12 @@
+// +build windows
+
+package ethutil
+
+// General compile function
+func Compile(script string, silent bool) (ret []byte, err error) {
+ if len(script) > 2 {
+ return nil, nil
+ }
+
+ return nil, nil
+}
diff --git a/ethutil/set.go b/ethutil/set.go
new file mode 100644
index 000000000..7955edac0
--- /dev/null
+++ b/ethutil/set.go
@@ -0,0 +1,36 @@
+package ethutil
+
+type Settable interface {
+ AsSet() UniqueSet
+}
+
+type Stringable interface {
+ String() string
+}
+
+type UniqueSet map[string]struct{}
+
+func NewSet(v ...Stringable) UniqueSet {
+ set := make(UniqueSet)
+ for _, val := range v {
+ set.Insert(val)
+ }
+
+ return set
+}
+
+func (self UniqueSet) Insert(k Stringable) UniqueSet {
+ self[k.String()] = struct{}{}
+
+ return self
+}
+
+func (self UniqueSet) Include(k Stringable) bool {
+ _, ok := self[k.String()]
+
+ return ok
+}
+
+func Set(s Settable) UniqueSet {
+ return s.AsSet()
+}
diff --git a/ethutil/size.go b/ethutil/size.go
new file mode 100644
index 000000000..b4426465e
--- /dev/null
+++ b/ethutil/size.go
@@ -0,0 +1,15 @@
+package ethutil
+
+import "fmt"
+
+type StorageSize float64
+
+func (self StorageSize) String() string {
+ if self > 1000000 {
+ return fmt.Sprintf("%.2f mB", self/1000000)
+ } else if self > 1000 {
+ return fmt.Sprintf("%.2f kB", self/1000)
+ } else {
+ return fmt.Sprintf("%.2f B", self)
+ }
+}
diff --git a/ethutil/size_test.go b/ethutil/size_test.go
new file mode 100644
index 000000000..e0f28abc5
--- /dev/null
+++ b/ethutil/size_test.go
@@ -0,0 +1,23 @@
+package ethutil
+
+import (
+ checker "gopkg.in/check.v1"
+)
+
+type SizeSuite struct{}
+
+var _ = checker.Suite(&SizeSuite{})
+
+func (s *SizeSuite) TestStorageSizeString(c *checker.C) {
+ data1 := 2381273
+ data2 := 2192
+ data3 := 12
+
+ exp1 := "2.38 mB"
+ exp2 := "2.19 kB"
+ exp3 := "12.00 B"
+
+ c.Assert(StorageSize(data1).String(), checker.Equals, exp1)
+ c.Assert(StorageSize(data2).String(), checker.Equals, exp2)
+ c.Assert(StorageSize(data3).String(), checker.Equals, exp3)
+}
diff --git a/ethutil/value.go b/ethutil/value.go
new file mode 100644
index 000000000..7d4a7d98c
--- /dev/null
+++ b/ethutil/value.go
@@ -0,0 +1,401 @@
+package ethutil
+
+import (
+ "bytes"
+ "fmt"
+ "math/big"
+ "reflect"
+ "strconv"
+)
+
+// Data values are returned by the rlp decoder. The data values represents
+// one item within the rlp data structure. It's responsible for all the casting
+// It always returns something valid
+type Value struct {
+ Val interface{}
+ kind reflect.Value
+}
+
+func (val *Value) String() string {
+ return fmt.Sprintf("%x", val.Val)
+}
+
+func NewValue(val interface{}) *Value {
+ t := val
+ if v, ok := val.(*Value); ok {
+ t = v.Val
+ }
+
+ return &Value{Val: t}
+}
+
+func (val *Value) Type() reflect.Kind {
+ return reflect.TypeOf(val.Val).Kind()
+}
+
+func (val *Value) IsNil() bool {
+ return val.Val == nil
+}
+
+func (val *Value) Len() int {
+ //return val.kind.Len()
+ if data, ok := val.Val.([]interface{}); ok {
+ return len(data)
+ }
+
+ return len(val.Bytes())
+}
+
+func (val *Value) Raw() interface{} {
+ return val.Val
+}
+
+func (val *Value) Interface() interface{} {
+ return val.Val
+}
+
+func (val *Value) Uint() uint64 {
+ if Val, ok := val.Val.(uint8); ok {
+ return uint64(Val)
+ } else if Val, ok := val.Val.(uint16); ok {
+ return uint64(Val)
+ } else if Val, ok := val.Val.(uint32); ok {
+ return uint64(Val)
+ } else if Val, ok := val.Val.(uint64); ok {
+ return Val
+ } else if Val, ok := val.Val.(float32); ok {
+ return uint64(Val)
+ } else if Val, ok := val.Val.(float64); ok {
+ return uint64(Val)
+ } else if Val, ok := val.Val.(int); ok {
+ return uint64(Val)
+ } else if Val, ok := val.Val.(uint); ok {
+ return uint64(Val)
+ } else if Val, ok := val.Val.([]byte); ok {
+ return new(big.Int).SetBytes(Val).Uint64()
+ } else if Val, ok := val.Val.(*big.Int); ok {
+ return Val.Uint64()
+ }
+
+ return 0
+}
+
+func (val *Value) Int() int64 {
+ if Val, ok := val.Val.(int8); ok {
+ return int64(Val)
+ } else if Val, ok := val.Val.(int16); ok {
+ return int64(Val)
+ } else if Val, ok := val.Val.(int32); ok {
+ return int64(Val)
+ } else if Val, ok := val.Val.(int64); ok {
+ return Val
+ } else if Val, ok := val.Val.(int); ok {
+ return int64(Val)
+ } else if Val, ok := val.Val.(float32); ok {
+ return int64(Val)
+ } else if Val, ok := val.Val.(float64); ok {
+ return int64(Val)
+ } else if Val, ok := val.Val.([]byte); ok {
+ return new(big.Int).SetBytes(Val).Int64()
+ } else if Val, ok := val.Val.(*big.Int); ok {
+ return Val.Int64()
+ } else if Val, ok := val.Val.(string); ok {
+ n, _ := strconv.Atoi(Val)
+ return int64(n)
+ }
+
+ return 0
+}
+
+func (val *Value) Byte() byte {
+ if Val, ok := val.Val.(byte); ok {
+ return Val
+ }
+
+ return 0x0
+}
+
+func (val *Value) BigInt() *big.Int {
+ if a, ok := val.Val.([]byte); ok {
+ b := new(big.Int).SetBytes(a)
+
+ return b
+ } else if a, ok := val.Val.(*big.Int); ok {
+ return a
+ } else if a, ok := val.Val.(string); ok {
+ return Big(a)
+ } else {
+ return big.NewInt(int64(val.Uint()))
+ }
+
+ return big.NewInt(0)
+}
+
+func (val *Value) Str() string {
+ if a, ok := val.Val.([]byte); ok {
+ return string(a)
+ } else if a, ok := val.Val.(string); ok {
+ return a
+ } else if a, ok := val.Val.(byte); ok {
+ return string(a)
+ }
+
+ return ""
+}
+
+func (val *Value) Bytes() []byte {
+ if a, ok := val.Val.([]byte); ok {
+ return a
+ } else if s, ok := val.Val.(byte); ok {
+ return []byte{s}
+ } else if s, ok := val.Val.(string); ok {
+ return []byte(s)
+ } else if s, ok := val.Val.(*big.Int); ok {
+ return s.Bytes()
+ } else {
+ return big.NewInt(val.Int()).Bytes()
+ }
+
+ return []byte{}
+}
+
+func (val *Value) Err() error {
+ if err, ok := val.Val.(error); ok {
+ return err
+ }
+
+ return nil
+}
+
+func (val *Value) Slice() []interface{} {
+ if d, ok := val.Val.([]interface{}); ok {
+ return d
+ }
+
+ return []interface{}{}
+}
+
+func (val *Value) SliceFrom(from int) *Value {
+ slice := val.Slice()
+
+ return NewValue(slice[from:])
+}
+
+func (val *Value) SliceTo(to int) *Value {
+ slice := val.Slice()
+
+ return NewValue(slice[:to])
+}
+
+func (val *Value) SliceFromTo(from, to int) *Value {
+ slice := val.Slice()
+
+ return NewValue(slice[from:to])
+}
+
+// TODO More type checking methods
+func (val *Value) IsSlice() bool {
+ return val.Type() == reflect.Slice
+}
+
+func (val *Value) IsStr() bool {
+ return val.Type() == reflect.String
+}
+
+func (self *Value) IsErr() bool {
+ _, ok := self.Val.(error)
+ return ok
+}
+
+// Special list checking function. Something is considered
+// a list if it's of type []interface{}. The list is usually
+// used in conjunction with rlp decoded streams.
+func (val *Value) IsList() bool {
+ _, ok := val.Val.([]interface{})
+
+ return ok
+}
+
+func (val *Value) IsEmpty() bool {
+ return val.Val == nil || ((val.IsSlice() || val.IsStr()) && val.Len() == 0)
+}
+
+// Threat the value as a slice
+func (val *Value) Get(idx int) *Value {
+ if d, ok := val.Val.([]interface{}); ok {
+ // Guard for oob
+ if len(d) <= idx {
+ return NewValue(nil)
+ }
+
+ if idx < 0 {
+ return NewValue(nil)
+ }
+
+ return NewValue(d[idx])
+ }
+
+ // If this wasn't a slice you probably shouldn't be using this function
+ return NewValue(nil)
+}
+
+func (self *Value) Copy() *Value {
+ switch val := self.Val.(type) {
+ case *big.Int:
+ return NewValue(new(big.Int).Set(val))
+ case []byte:
+ return NewValue(CopyBytes(val))
+ default:
+ return NewValue(self.Val)
+ }
+
+ return nil
+}
+
+func (val *Value) Cmp(o *Value) bool {
+ return reflect.DeepEqual(val.Val, o.Val)
+}
+
+func (self *Value) DeepCmp(o *Value) bool {
+ return bytes.Compare(self.Bytes(), o.Bytes()) == 0
+}
+
+func (val *Value) Encode() []byte {
+ return Encode(val.Val)
+}
+
+// Assume that the data we have is encoded
+func (self *Value) Decode() {
+ v, _ := Decode(self.Bytes(), 0)
+ self.Val = v
+ //self.Val = DecodeWithReader(bytes.NewBuffer(self.Bytes()))
+}
+
+func NewValueFromBytes(data []byte) *Value {
+ if len(data) != 0 {
+ value := NewValue(data)
+ value.Decode()
+
+ return value
+ }
+
+ return NewValue(nil)
+}
+
+// Value setters
+func NewSliceValue(s interface{}) *Value {
+ list := EmptyValue()
+
+ if s != nil {
+ if slice, ok := s.([]interface{}); ok {
+ for _, val := range slice {
+ list.Append(val)
+ }
+ } else if slice, ok := s.([]string); ok {
+ for _, val := range slice {
+ list.Append(val)
+ }
+ }
+ }
+
+ return list
+}
+
+func EmptyValue() *Value {
+ return NewValue([]interface{}{})
+}
+
+func (val *Value) AppendList() *Value {
+ list := EmptyValue()
+ val.Val = append(val.Slice(), list)
+
+ return list
+}
+
+func (val *Value) Append(v interface{}) *Value {
+ val.Val = append(val.Slice(), v)
+
+ return val
+}
+
+const (
+ valOpAdd = iota
+ valOpDiv
+ valOpMul
+ valOpPow
+ valOpSub
+)
+
+// Math stuff
+func (self *Value) doOp(op int, other interface{}) *Value {
+ left := self.BigInt()
+ right := NewValue(other).BigInt()
+
+ switch op {
+ case valOpAdd:
+ self.Val = left.Add(left, right)
+ case valOpDiv:
+ self.Val = left.Div(left, right)
+ case valOpMul:
+ self.Val = left.Mul(left, right)
+ case valOpPow:
+ self.Val = left.Exp(left, right, Big0)
+ case valOpSub:
+ self.Val = left.Sub(left, right)
+ }
+
+ return self
+}
+
+func (self *Value) Add(other interface{}) *Value {
+ return self.doOp(valOpAdd, other)
+}
+
+func (self *Value) Sub(other interface{}) *Value {
+ return self.doOp(valOpSub, other)
+}
+
+func (self *Value) Div(other interface{}) *Value {
+ return self.doOp(valOpDiv, other)
+}
+
+func (self *Value) Mul(other interface{}) *Value {
+ return self.doOp(valOpMul, other)
+}
+
+func (self *Value) Pow(other interface{}) *Value {
+ return self.doOp(valOpPow, other)
+}
+
+type ValueIterator struct {
+ value *Value
+ currentValue *Value
+ idx int
+}
+
+func (val *Value) NewIterator() *ValueIterator {
+ return &ValueIterator{value: val}
+}
+
+func (it *ValueIterator) Len() int {
+ return it.value.Len()
+}
+
+func (it *ValueIterator) Next() bool {
+ if it.idx >= it.value.Len() {
+ return false
+ }
+
+ it.currentValue = it.value.Get(it.idx)
+ it.idx++
+
+ return true
+}
+
+func (it *ValueIterator) Value() *Value {
+ return it.currentValue
+}
+
+func (it *ValueIterator) Idx() int {
+ return it.idx - 1
+}
diff --git a/ethutil/value_test.go b/ethutil/value_test.go
new file mode 100644
index 000000000..861d35184
--- /dev/null
+++ b/ethutil/value_test.go
@@ -0,0 +1,70 @@
+package ethutil
+
+import (
+ "math/big"
+
+ checker "gopkg.in/check.v1"
+)
+
+type ValueSuite struct{}
+
+var _ = checker.Suite(&ValueSuite{})
+
+func (s *ValueSuite) TestValueCmp(c *checker.C) {
+ val1 := NewValue("hello")
+ val2 := NewValue("world")
+ c.Assert(val1.Cmp(val2), checker.Equals, false)
+
+ val3 := NewValue("hello")
+ val4 := NewValue("hello")
+ c.Assert(val3.Cmp(val4), checker.Equals, true)
+}
+
+func (s *ValueSuite) TestValueTypes(c *checker.C) {
+ str := NewValue("str")
+ num := NewValue(1)
+ inter := NewValue([]interface{}{1})
+ byt := NewValue([]byte{1, 2, 3, 4})
+ bigInt := NewValue(big.NewInt(10))
+
+ strExp := "str"
+ numExp := uint64(1)
+ interExp := []interface{}{1}
+ bytExp := []byte{1, 2, 3, 4}
+ bigExp := big.NewInt(10)
+
+ c.Assert(str.Str(), checker.Equals, strExp)
+ c.Assert(num.Uint(), checker.Equals, numExp)
+ c.Assert(NewValue(inter.Interface()).Cmp(NewValue(interExp)), checker.Equals, true)
+ c.Assert(byt.Bytes(), checker.DeepEquals, bytExp)
+ c.Assert(bigInt.BigInt(), checker.DeepEquals, bigExp)
+}
+
+func (s *ValueSuite) TestIterator(c *checker.C) {
+ value := NewValue([]interface{}{1, 2, 3})
+ iter := value.NewIterator()
+ values := []uint64{1, 2, 3}
+ i := 0
+ for iter.Next() {
+ c.Assert(values[i], checker.Equals, iter.Value().Uint())
+ i++
+ }
+}
+
+func (s *ValueSuite) TestMath(c *checker.C) {
+ data1 := NewValue(1)
+ data1.Add(1).Add(1)
+ exp1 := NewValue(3)
+ data2 := NewValue(2)
+ data2.Sub(1).Sub(1)
+ exp2 := NewValue(0)
+
+ c.Assert(data1.DeepCmp(exp1), checker.Equals, true)
+ c.Assert(data2.DeepCmp(exp2), checker.Equals, true)
+}
+
+func (s *ValueSuite) TestString(c *checker.C) {
+ data := "10"
+ exp := int64(10)
+ c.Assert(NewValue(data).Int(), checker.DeepEquals, exp)
+}
diff --git a/event/event.go b/event/event.go
new file mode 100644
index 000000000..540fbba65
--- /dev/null
+++ b/event/event.go
@@ -0,0 +1,183 @@
+// Package event implements an event multiplexer.
+package event
+
+import (
+ "errors"
+ "fmt"
+ "reflect"
+ "sync"
+)
+
+// Subscription is implemented by event subscriptions.
+type Subscription interface {
+ // Chan returns a channel that carries events.
+ // Implementations should return the same channel
+ // for any subsequent calls to Chan.
+ Chan() <-chan interface{}
+
+ // Unsubscribe stops delivery of events to a subscription.
+ // The event channel is closed.
+ // Unsubscribe can be called more than once.
+ Unsubscribe()
+}
+
+// A TypeMux dispatches events to registered receivers. Receivers can be
+// registered to handle events of certain type. Any operation
+// called after mux is stopped will return ErrMuxClosed.
+//
+// The zero value is ready to use.
+type TypeMux struct {
+ mutex sync.RWMutex
+ subm map[reflect.Type][]*muxsub
+ stopped bool
+}
+
+// ErrMuxClosed is returned when Posting on a closed TypeMux.
+var ErrMuxClosed = errors.New("event: mux closed")
+
+// Subscribe creates a subscription for events of the given types. The
+// subscription's channel is closed when it is unsubscribed
+// or the mux is closed.
+func (mux *TypeMux) Subscribe(types ...interface{}) Subscription {
+ sub := newsub(mux)
+ mux.mutex.Lock()
+ defer mux.mutex.Unlock()
+ if mux.stopped {
+ close(sub.postC)
+ } else {
+ if mux.subm == nil {
+ mux.subm = make(map[reflect.Type][]*muxsub)
+ }
+ for _, t := range types {
+ rtyp := reflect.TypeOf(t)
+ oldsubs := mux.subm[rtyp]
+ if find(oldsubs, sub) != -1 {
+ panic(fmt.Sprintf("event: duplicate type %s in Subscribe", rtyp))
+ }
+ subs := make([]*muxsub, len(oldsubs)+1)
+ copy(subs, oldsubs)
+ subs[len(oldsubs)] = sub
+ mux.subm[rtyp] = subs
+ }
+ }
+ return sub
+}
+
+// Post sends an event to all receivers registered for the given type.
+// It returns ErrMuxClosed if the mux has been stopped.
+func (mux *TypeMux) Post(ev interface{}) error {
+ rtyp := reflect.TypeOf(ev)
+ mux.mutex.RLock()
+ if mux.stopped {
+ mux.mutex.RUnlock()
+ return ErrMuxClosed
+ }
+ subs := mux.subm[rtyp]
+ mux.mutex.RUnlock()
+ for _, sub := range subs {
+ sub.deliver(ev)
+ }
+ return nil
+}
+
+// Stop closes a mux. The mux can no longer be used.
+// Future Post calls will fail with ErrMuxClosed.
+// Stop blocks until all current deliveries have finished.
+func (mux *TypeMux) Stop() {
+ mux.mutex.Lock()
+ for _, subs := range mux.subm {
+ for _, sub := range subs {
+ sub.closewait()
+ }
+ }
+ mux.subm = nil
+ mux.stopped = true
+ mux.mutex.Unlock()
+}
+
+func (mux *TypeMux) del(s *muxsub) {
+ mux.mutex.Lock()
+ for typ, subs := range mux.subm {
+ if pos := find(subs, s); pos >= 0 {
+ if len(subs) == 1 {
+ delete(mux.subm, typ)
+ } else {
+ mux.subm[typ] = posdelete(subs, pos)
+ }
+ }
+ }
+ s.mux.mutex.Unlock()
+}
+
+func find(slice []*muxsub, item *muxsub) int {
+ for i, v := range slice {
+ if v == item {
+ return i
+ }
+ }
+ return -1
+}
+
+func posdelete(slice []*muxsub, pos int) []*muxsub {
+ news := make([]*muxsub, len(slice)-1)
+ copy(news[:pos], slice[:pos])
+ copy(news[pos:], slice[pos+1:])
+ return news
+}
+
+type muxsub struct {
+ mux *TypeMux
+ closeMu sync.Mutex
+ closing chan struct{}
+ closed bool
+
+ // these two are the same channel. they are stored separately so
+ // postC can be set to nil without affecting the return value of
+ // Chan.
+ postMu sync.RWMutex
+ readC <-chan interface{}
+ postC chan<- interface{}
+}
+
+func newsub(mux *TypeMux) *muxsub {
+ c := make(chan interface{})
+ return &muxsub{
+ mux: mux,
+ readC: c,
+ postC: c,
+ closing: make(chan struct{}),
+ }
+}
+
+func (s *muxsub) Chan() <-chan interface{} {
+ return s.readC
+}
+
+func (s *muxsub) Unsubscribe() {
+ s.mux.del(s)
+ s.closewait()
+}
+
+func (s *muxsub) closewait() {
+ s.closeMu.Lock()
+ defer s.closeMu.Unlock()
+ if s.closed {
+ return
+ }
+ close(s.closing)
+ s.closed = true
+
+ s.postMu.Lock()
+ close(s.postC)
+ s.postC = nil
+ s.postMu.Unlock()
+}
+
+func (s *muxsub) deliver(ev interface{}) {
+ s.postMu.RLock()
+ select {
+ case s.postC <- ev:
+ case <-s.closing:
+ }
+ s.postMu.RUnlock()
+}
diff --git a/event/event_test.go b/event/event_test.go
new file mode 100644
index 000000000..c7c0266c1
--- /dev/null
+++ b/event/event_test.go
@@ -0,0 +1,176 @@
+package event
+
+import (
+ "math/rand"
+ "sync"
+ "testing"
+ "time"
+)
+
+type testEvent int
+
+func TestSub(t *testing.T) {
+ mux := new(TypeMux)
+ defer mux.Stop()
+
+ sub := mux.Subscribe(testEvent(0))
+ go func() {
+ if err := mux.Post(testEvent(5)); err != nil {
+ t.Errorf("Post returned unexpected error: %v", err)
+ }
+ }()
+ ev := <-sub.Chan()
+
+ if ev.(testEvent) != testEvent(5) {
+ t.Errorf("Got %v (%T), expected event %v (%T)",
+ ev, ev, testEvent(5), testEvent(5))
+ }
+}
+
+func TestMuxErrorAfterStop(t *testing.T) {
+ mux := new(TypeMux)
+ mux.Stop()
+
+ sub := mux.Subscribe(testEvent(0))
+ if _, isopen := <-sub.Chan(); isopen {
+ t.Errorf("subscription channel was not closed")
+ }
+ if err := mux.Post(testEvent(0)); err != ErrMuxClosed {
+ t.Errorf("Post error mismatch, got: %s, expected: %s", err, ErrMuxClosed)
+ }
+}
+
+func TestUnsubscribeUnblockPost(t *testing.T) {
+ mux := new(TypeMux)
+ defer mux.Stop()
+
+ sub := mux.Subscribe(testEvent(0))
+ unblocked := make(chan bool)
+ go func() {
+ mux.Post(testEvent(5))
+ unblocked <- true
+ }()
+
+ select {
+ case <-unblocked:
+ t.Errorf("Post returned before Unsubscribe")
+ default:
+ sub.Unsubscribe()
+ <-unblocked
+ }
+}
+
+func TestSubscribeDuplicateType(t *testing.T) {
+ mux := new(TypeMux)
+ expected := "event: duplicate type event.testEvent in Subscribe"
+
+ defer func() {
+ err := recover()
+ if err == nil {
+ t.Errorf("Subscribe didn't panic for duplicate type")
+ } else if err != expected {
+ t.Errorf("panic mismatch: got %#v, expected %#v", err, expected)
+ }
+ }()
+ mux.Subscribe(testEvent(1), testEvent(2))
+}
+
+func TestMuxConcurrent(t *testing.T) {
+ rand.Seed(time.Now().Unix())
+ mux := new(TypeMux)
+ defer mux.Stop()
+
+ recv := make(chan int)
+ poster := func() {
+ for {
+ err := mux.Post(testEvent(0))
+ if err != nil {
+ return
+ }
+ }
+ }
+ sub := func(i int) {
+ time.Sleep(time.Duration(rand.Intn(99)) * time.Millisecond)
+ sub := mux.Subscribe(testEvent(0))
+ <-sub.Chan()
+ sub.Unsubscribe()
+ recv <- i
+ }
+
+ go poster()
+ go poster()
+ go poster()
+ nsubs := 1000
+ for i := 0; i < nsubs; i++ {
+ go sub(i)
+ }
+
+ // wait until everyone has been served
+ counts := make(map[int]int, nsubs)
+ for i := 0; i < nsubs; i++ {
+ counts[<-recv]++
+ }
+ for i, count := range counts {
+ if count != 1 {
+ t.Errorf("receiver %d called %d times, expected only 1 call", i, count)
+ }
+ }
+}
+
+func emptySubscriber(mux *TypeMux, types ...interface{}) {
+ s := mux.Subscribe(testEvent(0))
+ go func() {
+ for _ = range s.Chan() {
+ }
+ }()
+}
+
+func BenchmarkPost3(b *testing.B) {
+ var mux = new(TypeMux)
+ defer mux.Stop()
+ emptySubscriber(mux, testEvent(0))
+ emptySubscriber(mux, testEvent(0))
+ emptySubscriber(mux, testEvent(0))
+
+ for i := 0; i < b.N; i++ {
+ mux.Post(testEvent(0))
+ }
+}
+
+func BenchmarkPostConcurrent(b *testing.B) {
+ var mux = new(TypeMux)
+ defer mux.Stop()
+ emptySubscriber(mux, testEvent(0))
+ emptySubscriber(mux, testEvent(0))
+ emptySubscriber(mux, testEvent(0))
+
+ var wg sync.WaitGroup
+ poster := func() {
+ for i := 0; i < b.N; i++ {
+ mux.Post(testEvent(0))
+ }
+ wg.Done()
+ }
+ wg.Add(5)
+ for i := 0; i < 5; i++ {
+ go poster()
+ }
+ wg.Wait()
+}
+
+// for comparison
+func BenchmarkChanSend(b *testing.B) {
+ c := make(chan interface{})
+ closed := make(chan struct{})
+ go func() {
+ for _ = range c {
+ }
+ }()
+
+ for i := 0; i < b.N; i++ {
+ select {
+ case c <- i:
+ case <-closed:
+ }
+ }
+}
diff --git a/event/example_test.go b/event/example_test.go
new file mode 100644
index 000000000..2f47f6f27
--- /dev/null
+++ b/event/example_test.go
@@ -0,0 +1,42 @@
+package event
+
+import "fmt"
+
+func ExampleTypeMux() {
+ type someEvent struct{ I int }
+ type otherEvent struct{ S string }
+ type yetAnotherEvent struct{ X, Y int }
+
+ var mux TypeMux
+
+ // Start a subscriber.
+ done := make(chan struct{})
+ sub := mux.Subscribe(someEvent{}, otherEvent{})
+ go func() {
+ for event := range sub.Chan() {
+ fmt.Printf("Received: %#v\n", event)
+ }
+ fmt.Println("done")
+ close(done)
+ }()
+
+ // Post some events.
+ mux.Post(someEvent{5})
+ mux.Post(yetAnotherEvent{X: 3, Y: 4})
+ mux.Post(someEvent{6})
+ mux.Post(otherEvent{"whoa"})
+
+ // Stop closes all subscription channels.
+ // The subscriber goroutine will print "done"
+ // and exit.
+ mux.Stop()
+
+ // Wait for subscriber to return.
+ <-done
+
+ // Output:
+ // Received: event.someEvent{I:5}
+ // Received: event.someEvent{I:6}
+ // Received: event.otherEvent{S:"whoa"}
+ // done
+}
diff --git a/event/filter/filter.go b/event/filter/filter.go
new file mode 100644
index 000000000..9817d5782
--- /dev/null
+++ b/event/filter/filter.go
@@ -0,0 +1,70 @@
+package filter
+
+import "reflect"
+
+type Filter interface {
+ Compare(Filter) bool
+ Trigger(data interface{})
+}
+
+type FilterEvent struct {
+ filter Filter
+ data interface{}
+}
+
+type Filters struct {
+ id int
+ watchers map[int]Filter
+ ch chan FilterEvent
+
+ quit chan struct{}
+}
+
+func New() *Filters {
+ return &Filters{
+ ch: make(chan FilterEvent),
+ watchers: make(map[int]Filter),
+ quit: make(chan struct{}),
+ }
+}
+
+func (self *Filters) Start() {
+ go self.loop()
+}
+
+func (self *Filters) Stop() {
+ close(self.quit)
+}
+
+func (self *Filters) Notify(filter Filter, data interface{}) {
+ self.ch <- FilterEvent{filter, data}
+}
+
+func (self *Filters) Install(watcher Filter) int {
+ self.watchers[self.id] = watcher
+ self.id++
+
+ return self.id - 1
+}
+
+func (self *Filters) Uninstall(id int) {
+ delete(self.watchers, id)
+}
+
+func (self *Filters) loop() {
+out:
+ for {
+ select {
+ case <-self.quit:
+ break out
+ case event := <-self.ch:
+ for _, watcher := range self.watchers {
+ if reflect.TypeOf(watcher) == reflect.TypeOf(event.filter) {
+ if watcher.Compare(event.filter) {
+ watcher.Trigger(event.data)
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/event/filter/filter_test.go b/event/filter/filter_test.go
new file mode 100644
index 000000000..815deb63a
--- /dev/null
+++ b/event/filter/filter_test.go
@@ -0,0 +1,34 @@
+package filter
+
+import "testing"
+
+func TestFilters(t *testing.T) {
+ var success bool
+ var failure bool
+
+ fm := New()
+ fm.Start()
+ fm.Install(Generic{
+ Str1: "hello",
+ Fn: func(data interface{}) {
+ success = data.(bool)
+ },
+ })
+ fm.Install(Generic{
+ Str1: "hello1",
+ Str2: "hello",
+ Fn: func(data interface{}) {
+ failure = true
+ },
+ })
+ fm.Notify(Generic{Str1: "hello"}, true)
+ fm.Stop()
+
+ if !success {
+ t.Error("expected 'hello' to be posted")
+ }
+
+ if failure {
+ t.Error("hello1 was triggered")
+ }
+}
diff --git a/event/filter/generic_filter.go b/event/filter/generic_filter.go
new file mode 100644
index 000000000..b04b4801e
--- /dev/null
+++ b/event/filter/generic_filter.go
@@ -0,0 +1,22 @@
+package filter
+
+type Generic struct {
+ Str1, Str2, Str3 string
+
+ Fn func(data interface{})
+}
+
+func (self Generic) Compare(f Filter) bool {
+ filter := f.(Generic)
+ if (len(self.Str1) == 0 || filter.Str1 == self.Str1) &&
+ (len(self.Str2) == 0 || filter.Str2 == self.Str2) &&
+ (len(self.Str3) == 0 || filter.Str3 == self.Str3) {
+ return true
+ }
+
+ return false
+}
+
+func (self Generic) Trigger(data interface{}) {
+ self.Fn(data)
+}
diff --git a/events.go b/events.go
new file mode 100644
index 000000000..5fff1d831
--- /dev/null
+++ b/events.go
@@ -0,0 +1,11 @@
+package eth
+
+import "container/list"
+
+type PeerListEvent struct {
+ Peers *list.List
+}
+
+type ChainSyncEvent struct {
+ InSync bool
+}
diff --git a/gocoverage.sh b/gocoverage.sh
new file mode 100755
index 000000000..35038108b
--- /dev/null
+++ b/gocoverage.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+# The script does automatic checking on a Go package and its sub-packages, including:
+# 6. test coverage (http://blog.golang.org/cover)
+
+set -e
+
+# Run test coverage on each subdirectories and merge the coverage profile.
+
+echo "mode: count" > profile.cov
+
+# Standard go tooling behavior is to ignore dirs with leading underscors
+for dir in $(find . -maxdepth 10 -not -path './.git*' -not -path '*/_*' -type d);
+do
+if ls $dir/*.go &> /dev/null; then
+ # echo $dir
+ go test -covermode=count -coverprofile=$dir/profile.tmp $dir
+ if [ -f $dir/profile.tmp ]
+ then
+ cat $dir/profile.tmp | tail -n +2 >> profile.cov
+ rm $dir/profile.tmp
+ fi
+fi
+done
+
+go tool cover -func profile.cov
+
+# To submit the test coverage result to coveralls.io,
+# use goveralls (https://github.com/mattn/goveralls)
+# goveralls -coverprofile=profile.cov -service=travis-ci
diff --git a/install.sh b/install.sh
index 9719a1afc..30a3802e4 100755
--- a/install.sh
+++ b/install.sh
@@ -1,15 +1,20 @@
#!/bin/sh
if [ "$1" == "" ]; then
- echo "Usage $0 executable branch ethereum develop"
- echo "executable ethereum or ethereal"
- echo "branch develop or master"
+ echo "Usage $0 executable branch"
+ echo "executable ethereum | mist"
+ echo "branch develop | master"
exit
fi
exe=$1
+path=$exe
branch=$2
+if [ "$branch" == "develop" ]; then
+ path="cmd/$exe"
+fi
+
# Test if go is installed
command -v go >/dev/null 2>&1 || { echo >&2 "Unable to find 'go'. This script requires go."; exit 1; }
@@ -19,39 +24,30 @@ if [ "$GOPATH" == "" ]; then
exit
fi
-echo "go get -u -d github.com/ethereum/go-ethereum/$exe"
-go get -v -u -d github.com/ethereum/go-ethereum/$exe
-if [ $? != 0 ]; then
- echo "go get failed"
- exit
-fi
+echo "changing branch to $branch"
+cd $GOPATH/src/github.com/ethereum/go-ethereum
+git checkout $branch
-echo "serpent-go"
-cd $GOPATH/src/github.com/obscuren/serpent-go
+# installing package dependencies doesn't work for develop
+# branch as go get always pulls from master head
+# so build will continue to fail, but this installs locally
+# for people who git clone since go install will manage deps
-echo "init submodule"
-git submodule init
-git submodule update
+#echo "go get -u -d github.com/ethereum/go-ethereum/$path"
+#go get -v -u -d github.com/ethereum/go-ethereum/$path
+#if [ $? != 0 ]; then
+# echo "go get failed"
+# exit
+#fi
-echo "eth-go"
-cd $GOPATH/src/github.com/ethereum/eth-go
-git checkout $branch
+cd $GOPATH/src/github.com/ethereum/go-ethereum/$path
-echo "go-ethereum"
-cd $GOPATH/src/github.com/ethereum/go-ethereum/$exe
-git checkout $branch
-
-if [ "$exe" == "ethereal" ]; then
- echo "Building ethereal GUI. Assuming Qt is installed. If this step"
+if [ "$exe" == "mist" ]; then
+ echo "Building Mist GUI. Assuming Qt is installed. If this step"
echo "fails; please refer to: https://github.com/ethereum/go-ethereum/wiki/Building-Ethereum(Go)"
else
echo "Building ethereum CLI."
fi
go install
-if [ $? == 0 ]; then
- echo "go install failed"
- exit
-fi
-
echo "done. Please run $exe :-)"
diff --git a/install_deps.sh b/install_deps.sh
new file mode 100755
index 000000000..73a313324
--- /dev/null
+++ b/install_deps.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+set -e
+
+TEST_DEPS=$(go list -f '{{.Imports}} {{.TestImports}} {{.XTestImports}}' github.com/ethereum/go-ethereum/... | sed -e 's/\[//g' | sed -e 's/\]//g' | sed -e 's/C //g')
+if [ "$TEST_DEPS" ]; then
+ go get -race $TEST_DEPS
+fi
diff --git a/javascript/javascript_runtime.go b/javascript/javascript_runtime.go
index ffc672a63..a26f0154e 100644
--- a/javascript/javascript_runtime.go
+++ b/javascript/javascript_runtime.go
@@ -7,27 +7,26 @@ import (
"path"
"path/filepath"
- "github.com/ethereum/eth-go"
- "github.com/ethereum/eth-go/ethchain"
- "github.com/ethereum/eth-go/ethlog"
- "github.com/ethereum/eth-go/ethpipe"
- "github.com/ethereum/eth-go/ethreact"
- "github.com/ethereum/eth-go/ethstate"
- "github.com/ethereum/eth-go/ethutil"
- "github.com/ethereum/go-ethereum/utils"
+ "github.com/ethereum/go-ethereum"
+ "github.com/ethereum/go-ethereum/cmd/utils"
+ "github.com/ethereum/go-ethereum/core"
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/event"
+ "github.com/ethereum/go-ethereum/logger"
+ "github.com/ethereum/go-ethereum/state"
+ "github.com/ethereum/go-ethereum/xeth"
"github.com/obscuren/otto"
)
-var jsrelogger = ethlog.NewLogger("JSRE")
+var jsrelogger = logger.NewLogger("JSRE")
type JSRE struct {
ethereum *eth.Ethereum
Vm *otto.Otto
- pipe *ethpipe.JSPipe
+ pipe *xeth.JSXEth
- blockChan chan ethreact.Event
- changeChan chan ethreact.Event
- quitChan chan bool
+ events event.Subscription
objectCb map[string][]otto.Value
}
@@ -42,7 +41,7 @@ func (jsre *JSRE) LoadExtFile(path string) {
}
func (jsre *JSRE) LoadIntFile(file string) {
- assetPath := path.Join(os.Getenv("GOPATH"), "src", "github.com", "ethereum", "go-ethereum", "mist", "assets", "ext")
+ assetPath := path.Join(os.Getenv("GOPATH"), "src", "github.com", "ethereum", "go-ethereum", "cmd", "mist", "assets", "ext")
jsre.LoadExtFile(path.Join(assetPath, file))
}
@@ -50,10 +49,8 @@ func NewJSRE(ethereum *eth.Ethereum) *JSRE {
re := &JSRE{
ethereum,
otto.New(),
- ethpipe.NewJSPipe(ethereum),
- make(chan ethreact.Event, 10),
- make(chan ethreact.Event, 10),
- make(chan bool),
+ xeth.NewJSXEth(ethereum),
+ nil,
make(map[string][]otto.Value),
}
@@ -64,13 +61,13 @@ func NewJSRE(ethereum *eth.Ethereum) *JSRE {
re.LoadIntFile("string.js")
re.LoadIntFile("big.js")
+ // Subscribe to events
+ mux := ethereum.EventMux()
+ re.events = mux.Subscribe(core.NewBlockEvent{})
+
// We have to make sure that, whoever calls this, calls "Stop"
go re.mainLoop()
- // Subscribe to events
- reactor := ethereum.Reactor()
- reactor.Subscribe("newBlock", re.blockChan)
-
re.Bind("eth", &JSEthereum{re.pipe, re.Vm, ethereum})
re.initStdFuncs()
@@ -105,25 +102,12 @@ func (self *JSRE) Require(file string) error {
}
func (self *JSRE) Stop() {
- // Kill the main loop
- self.quitChan <- true
-
- close(self.blockChan)
- close(self.quitChan)
- close(self.changeChan)
+ self.events.Unsubscribe()
jsrelogger.Infoln("stopped")
}
func (self *JSRE) mainLoop() {
-out:
- for {
- select {
- case <-self.quitChan:
- break out
- case block := <-self.blockChan:
- if _, ok := block.Resource.(*ethchain.Block); ok {
- }
- }
+ for _ = range self.events.Chan() {
}
}
@@ -137,6 +121,7 @@ func (self *JSRE) initStdFuncs() {
eth.Set("startMining", self.startMining)
eth.Set("execBlock", self.execBlock)
eth.Set("dump", self.dump)
+ eth.Set("export", self.export)
}
/*
@@ -144,16 +129,16 @@ func (self *JSRE) initStdFuncs() {
*/
func (self *JSRE) dump(call otto.FunctionCall) otto.Value {
- var state *ethstate.State
+ var state *state.StateDB
if len(call.ArgumentList) > 0 {
- var block *ethchain.Block
+ var block *types.Block
if call.Argument(0).IsNumber() {
num, _ := call.Argument(0).ToInteger()
- block = self.ethereum.BlockChain().GetBlockByNumber(uint64(num))
+ block = self.ethereum.ChainManager().GetBlockByNumber(uint64(num))
} else if call.Argument(0).IsString() {
hash, _ := call.Argument(0).ToString()
- block = self.ethereum.BlockChain().GetBlock(ethutil.Hex2Bytes(hash))
+ block = self.ethereum.ChainManager().GetBlock(ethutil.Hex2Bytes(hash))
} else {
fmt.Println("invalid argument for dump. Either hex string or number")
}
@@ -166,7 +151,7 @@ func (self *JSRE) dump(call otto.FunctionCall) otto.Value {
state = block.State()
} else {
- state = self.ethereum.StateManager().CurrentState()
+ state = self.ethereum.ChainManager().State()
}
v, _ := self.Vm.ToValue(state.Dump())
@@ -201,13 +186,13 @@ func (self *JSRE) watch(call otto.FunctionCall) otto.Value {
if storageCallback {
self.objectCb[addr+storageAddr] = append(self.objectCb[addr+storageAddr], cb)
- event := "storage:" + string(ethutil.Hex2Bytes(addr)) + ":" + string(ethutil.Hex2Bytes(storageAddr))
- self.ethereum.Reactor().Subscribe(event, self.changeChan)
+ // event := "storage:" + string(ethutil.Hex2Bytes(addr)) + ":" + string(ethutil.Hex2Bytes(storageAddr))
+ // self.ethereum.EventMux().Subscribe(event, self.changeChan)
} else {
self.objectCb[addr] = append(self.objectCb[addr], cb)
- event := "object:" + string(ethutil.Hex2Bytes(addr))
- self.ethereum.Reactor().Subscribe(event, self.changeChan)
+ // event := "object:" + string(ethutil.Hex2Bytes(addr))
+ // self.ethereum.EventMux().Subscribe(event, self.changeChan)
}
return otto.UndefinedValue()
@@ -252,3 +237,20 @@ func (self *JSRE) execBlock(call otto.FunctionCall) otto.Value {
return otto.TrueValue()
}
+
+func (self *JSRE) export(call otto.FunctionCall) otto.Value {
+ fn, err := call.Argument(0).ToString()
+ if err != nil {
+ fmt.Println(err)
+ return otto.FalseValue()
+ }
+
+ data := self.ethereum.ChainManager().Export()
+
+ if err := ethutil.WriteFile(fn, data); err != nil {
+ fmt.Println(err)
+ return otto.FalseValue()
+ }
+
+ return otto.TrueValue()
+}
diff --git a/javascript/js_lib.go b/javascript/js_lib.go
index a3e9b8a5b..dd1fe5f4d 100644
--- a/javascript/js_lib.go
+++ b/javascript/js_lib.go
@@ -44,9 +44,11 @@ function pp(object) {
function prettyPrint(/* */) {
var args = arguments;
+ var ret = "";
for(var i = 0, l = args.length; i < l; i++) {
- console.log(pp(args[i]))
+ ret += pp(args[i]) + "\n";
}
+ return ret;
}
var print = prettyPrint;
diff --git a/javascript/types.go b/javascript/types.go
index 53a2977a8..d5acaecce 100644
--- a/javascript/types.go
+++ b/javascript/types.go
@@ -3,16 +3,16 @@ package javascript
import (
"fmt"
- "github.com/ethereum/eth-go"
- "github.com/ethereum/eth-go/ethchain"
- "github.com/ethereum/eth-go/ethpipe"
- "github.com/ethereum/eth-go/ethstate"
- "github.com/ethereum/eth-go/ethutil"
+ "github.com/ethereum/go-ethereum"
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/state"
+ "github.com/ethereum/go-ethereum/ui"
+ "github.com/ethereum/go-ethereum/xeth"
"github.com/obscuren/otto"
)
type JSStateObject struct {
- *ethpipe.JSObject
+ *xeth.JSObject
eth *JSEthereum
}
@@ -30,7 +30,7 @@ func (self *JSStateObject) EachStorage(call otto.FunctionCall) otto.Value {
// The JSEthereum object attempts to wrap the PEthereum object and returns
// meaningful javascript objects
type JSBlock struct {
- *ethpipe.JSBlock
+ *xeth.JSBlock
eth *JSEthereum
}
@@ -51,7 +51,7 @@ type JSMessage struct {
Number int32 `json:"number"`
}
-func NewJSMessage(message *ethstate.Message) JSMessage {
+func NewJSMessage(message *state.Message) JSMessage {
return JSMessage{
To: ethutil.Bytes2Hex(message.To),
From: ethutil.Bytes2Hex(message.From),
@@ -67,33 +67,33 @@ func NewJSMessage(message *ethstate.Message) JSMessage {
}
type JSEthereum struct {
- *ethpipe.JSPipe
+ *xeth.JSXEth
vm *otto.Otto
ethereum *eth.Ethereum
}
func (self *JSEthereum) GetBlock(hash string) otto.Value {
- return self.toVal(&JSBlock{self.JSPipe.BlockByHash(hash), self})
+ return self.toVal(&JSBlock{self.JSXEth.BlockByHash(hash), self})
}
func (self *JSEthereum) GetPeers() otto.Value {
- return self.toVal(self.JSPipe.Peers())
+ return self.toVal(self.JSXEth.Peers())
}
func (self *JSEthereum) GetKey() otto.Value {
- return self.toVal(self.JSPipe.Key())
+ return self.toVal(self.JSXEth.Key())
}
func (self *JSEthereum) GetStateObject(addr string) otto.Value {
- return self.toVal(&JSStateObject{ethpipe.NewJSObject(self.JSPipe.World().SafeGet(ethutil.Hex2Bytes(addr))), self})
+ return self.toVal(&JSStateObject{xeth.NewJSObject(self.JSXEth.World().SafeGet(ethutil.Hex2Bytes(addr))), self})
}
func (self *JSEthereum) Peers() otto.Value {
- return self.toVal(self.JSPipe.Peers())
+ return self.toVal(self.JSXEth.Peers())
}
func (self *JSEthereum) Transact(key, recipient, valueStr, gasStr, gasPriceStr, dataStr string) otto.Value {
- r, err := self.JSPipe.Transact(key, recipient, valueStr, gasStr, gasPriceStr, dataStr)
+ r, err := self.JSXEth.Transact(key, recipient, valueStr, gasStr, gasPriceStr, dataStr)
if err != nil {
fmt.Println(err)
@@ -104,7 +104,7 @@ func (self *JSEthereum) Transact(key, recipient, valueStr, gasStr, gasPriceStr,
}
func (self *JSEthereum) Create(key, valueStr, gasStr, gasPriceStr, scriptStr string) otto.Value {
- r, err := self.JSPipe.Transact(key, "", valueStr, gasStr, gasPriceStr, scriptStr)
+ r, err := self.JSXEth.Transact(key, "", valueStr, gasStr, gasPriceStr, scriptStr)
if err != nil {
fmt.Println(err)
@@ -128,7 +128,7 @@ func (self *JSEthereum) toVal(v interface{}) otto.Value {
}
func (self *JSEthereum) Messages(object map[string]interface{}) otto.Value {
- filter := ethchain.NewFilterFromMap(object, self.ethereum)
+ filter := ui.NewFilterFromMap(object, self.ethereum)
messages := filter.Find()
var msgs []JSMessage
diff --git a/logger/example_test.go b/logger/example_test.go
new file mode 100644
index 000000000..c624252b8
--- /dev/null
+++ b/logger/example_test.go
@@ -0,0 +1,21 @@
+package logger
+
+import "os"
+
+func ExampleLogger() {
+ logger := NewLogger("TAG")
+ logger.Infoln("so awesome") // prints [TAG] so awesome
+ logger.Infof("this %q is raw", "coin") // prints [TAG] this "coin" is raw
+}
+
+func ExampleLogSystem() {
+ filename := "test.log"
+ file, _ := os.OpenFile(filename, os.O_RDWR|os.O_CREATE, os.ModePerm)
+ fileLog := NewStdLogSystem(file, 0, WarnLevel)
+ AddLogSystem(fileLog)
+
+ stdoutLog := NewStdLogSystem(os.Stdout, 0, WarnLevel)
+ AddLogSystem(stdoutLog)
+
+ NewLogger("TAG").Warnln("reactor meltdown") // writes to both logs
+}
diff --git a/logger/loggers.go b/logger/loggers.go
new file mode 100644
index 000000000..1bf7bfa0e
--- /dev/null
+++ b/logger/loggers.go
@@ -0,0 +1,248 @@
+/*
+Package logger implements a multi-output leveled logger.
+
+Other packages use tagged logger to send log messages to shared
+(process-wide) logging engine. The shared logging engine dispatches to
+multiple log systems. The log level can be set separately per log
+system.
+
+Logging is asynchronous and does not block the caller. Message
+formatting is performed by the caller goroutine to avoid incorrect
+logging of mutable state.
+*/
+package logger
+
+import (
+ "fmt"
+ "io"
+ "log"
+ "os"
+ "sync"
+ "sync/atomic"
+)
+
+// LogSystem is implemented by log output devices.
+// All methods can be called concurrently from multiple goroutines.
+type LogSystem interface {
+ GetLogLevel() LogLevel
+ SetLogLevel(i LogLevel)
+ LogPrint(LogLevel, string)
+}
+
+type message struct {
+ level LogLevel
+ msg string
+}
+
+type LogLevel uint8
+
+const (
+ // Standard log levels
+ Silence LogLevel = iota
+ ErrorLevel
+ WarnLevel
+ InfoLevel
+ DebugLevel
+ DebugDetailLevel
+)
+
+var (
+ logMessageC = make(chan message)
+ addSystemC = make(chan LogSystem)
+ flushC = make(chan chan struct{})
+ resetC = make(chan chan struct{})
+)
+
+func init() {
+ go dispatchLoop()
+}
+
+// each system can buffer this many messages before
+// blocking incoming log messages.
+const sysBufferSize = 500
+
+func dispatchLoop() {
+ var (
+ systems []LogSystem
+ systemIn []chan message
+ systemWG sync.WaitGroup
+ )
+ bootSystem := func(sys LogSystem) {
+ in := make(chan message, sysBufferSize)
+ systemIn = append(systemIn, in)
+ systemWG.Add(1)
+ go sysLoop(sys, in, &systemWG)
+ }
+
+ for {
+ select {
+ case msg := <-logMessageC:
+ for _, c := range systemIn {
+ c <- msg
+ }
+
+ case sys := <-addSystemC:
+ systems = append(systems, sys)
+ bootSystem(sys)
+
+ case waiter := <-resetC:
+ // reset means terminate all systems
+ for _, c := range systemIn {
+ close(c)
+ }
+ systems = nil
+ systemIn = nil
+ systemWG.Wait()
+ close(waiter)
+
+ case waiter := <-flushC:
+ // flush means reboot all systems
+ for _, c := range systemIn {
+ close(c)
+ }
+ systemIn = nil
+ systemWG.Wait()
+ for _, sys := range systems {
+ bootSystem(sys)
+ }
+ close(waiter)
+ }
+ }
+}
+
+func sysLoop(sys LogSystem, in <-chan message, wg *sync.WaitGroup) {
+ for msg := range in {
+ if sys.GetLogLevel() >= msg.level {
+ sys.LogPrint(msg.level, msg.msg)
+ }
+ }
+ wg.Done()
+}
+
+// Reset removes all active log systems.
+// It blocks until all current messages have been delivered.
+func Reset() {
+ waiter := make(chan struct{})
+ resetC <- waiter
+ <-waiter
+}
+
+// Flush waits until all current log messages have been dispatched to
+// the active log systems.
+func Flush() {
+ waiter := make(chan struct{})
+ flushC <- waiter
+ <-waiter
+}
+
+// AddLogSystem starts printing messages to the given LogSystem.
+func AddLogSystem(sys LogSystem) {
+ addSystemC <- sys
+}
+
+// A Logger prints messages prefixed by a given tag. It provides named
+// Printf and Println style methods for all loglevels. Each ethereum
+// component should have its own logger with a unique prefix.
+type Logger struct {
+ tag string
+}
+
+func NewLogger(tag string) *Logger {
+ return &Logger{"[" + tag + "] "}
+}
+
+func (logger *Logger) sendln(level LogLevel, v ...interface{}) {
+ logMessageC <- message{level, logger.tag + fmt.Sprintln(v...)}
+}
+
+func (logger *Logger) sendf(level LogLevel, format string, v ...interface{}) {
+ logMessageC <- message{level, logger.tag + fmt.Sprintf(format, v...)}
+}
+
+// Errorln writes a message with ErrorLevel.
+func (logger *Logger) Errorln(v ...interface{}) {
+ logger.sendln(ErrorLevel, v...)
+}
+
+// Warnln writes a message with WarnLevel.
+func (logger *Logger) Warnln(v ...interface{}) {
+ logger.sendln(WarnLevel, v...)
+}
+
+// Infoln writes a message with InfoLevel.
+func (logger *Logger) Infoln(v ...interface{}) {
+ logger.sendln(InfoLevel, v...)
+}
+
+// Debugln writes a message with DebugLevel.
+func (logger *Logger) Debugln(v ...interface{}) {
+ logger.sendln(DebugLevel, v...)
+}
+
+// DebugDetailln writes a message with DebugDetailLevel.
+func (logger *Logger) DebugDetailln(v ...interface{}) {
+ logger.sendln(DebugDetailLevel, v...)
+}
+
+// Errorf writes a message with ErrorLevel.
+func (logger *Logger) Errorf(format string, v ...interface{}) {
+ logger.sendf(ErrorLevel, format, v...)
+}
+
+// Warnf writes a message with WarnLevel.
+func (logger *Logger) Warnf(format string, v ...interface{}) {
+ logger.sendf(WarnLevel, format, v...)
+}
+
+// Infof writes a message with InfoLevel.
+func (logger *Logger) Infof(format string, v ...interface{}) {
+ logger.sendf(InfoLevel, format, v...)
+}
+
+// Debugf writes a message with DebugLevel.
+func (logger *Logger) Debugf(format string, v ...interface{}) {
+ logger.sendf(DebugLevel, format, v...)
+}
+
+// DebugDetailf writes a message with DebugDetailLevel.
+func (logger *Logger) DebugDetailf(format string, v ...interface{}) {
+ logger.sendf(DebugDetailLevel, format, v...)
+}
+
+// Fatalln writes a message with ErrorLevel and exits the program.
+func (logger *Logger) Fatalln(v ...interface{}) {
+ logger.sendln(ErrorLevel, v...)
+ Flush()
+ os.Exit(0)
+}
+
+// Fatalf writes a message with ErrorLevel and exits the program.
+func (logger *Logger) Fatalf(format string, v ...interface{}) {
+ logger.sendf(ErrorLevel, format, v...)
+ Flush()
+ os.Exit(0)
+}
+
+// NewStdLogSystem creates a LogSystem that prints to the given writer.
+// The flag values are defined package log.
+func NewStdLogSystem(writer io.Writer, flags int, level LogLevel) LogSystem {
+ logger := log.New(writer, "", flags)
+ return &stdLogSystem{logger, uint32(level)}
+}
+
+type stdLogSystem struct {
+ logger *log.Logger
+ level uint32
+}
+
+func (t *stdLogSystem) LogPrint(level LogLevel, msg string) {
+ t.logger.Print(msg)
+}
+
+func (t *stdLogSystem) SetLogLevel(i LogLevel) {
+ atomic.StoreUint32(&t.level, uint32(i))
+}
+
+func (t *stdLogSystem) GetLogLevel() LogLevel {
+ return LogLevel(atomic.LoadUint32(&t.level))
+}
diff --git a/logger/loggers_test.go b/logger/loggers_test.go
new file mode 100644
index 000000000..adc4df016
--- /dev/null
+++ b/logger/loggers_test.go
@@ -0,0 +1,174 @@
+package logger
+
+import (
+ "io/ioutil"
+ "math/rand"
+ "os"
+ "sync"
+ "testing"
+ "time"
+)
+
+type TestLogSystem struct {
+ mutex sync.Mutex
+ output string
+ level LogLevel
+}
+
+func (ls *TestLogSystem) LogPrint(level LogLevel, msg string) {
+ ls.mutex.Lock()
+ ls.output += msg
+ ls.mutex.Unlock()
+}
+
+func (ls *TestLogSystem) SetLogLevel(i LogLevel) {
+ ls.mutex.Lock()
+ ls.level = i
+ ls.mutex.Unlock()
+}
+
+func (ls *TestLogSystem) GetLogLevel() LogLevel {
+ ls.mutex.Lock()
+ defer ls.mutex.Unlock()
+ return ls.level
+}
+
+func (ls *TestLogSystem) CheckOutput(t *testing.T, expected string) {
+ ls.mutex.Lock()
+ output := ls.output
+ ls.mutex.Unlock()
+ if output != expected {
+ t.Errorf("log output mismatch:\n got: %q\n want: %q\n", output, expected)
+ }
+}
+
+type blockedLogSystem struct {
+ LogSystem
+ unblock chan struct{}
+}
+
+func (ls blockedLogSystem) LogPrint(level LogLevel, msg string) {
+ <-ls.unblock
+ ls.LogSystem.LogPrint(level, msg)
+}
+
+func TestLoggerFlush(t *testing.T) {
+ Reset()
+
+ logger := NewLogger("TEST")
+ ls := blockedLogSystem{&TestLogSystem{level: WarnLevel}, make(chan struct{})}
+ AddLogSystem(ls)
+ for i := 0; i < 5; i++ {
+ // these writes shouldn't hang even though ls is blocked
+ logger.Errorf(".")
+ }
+
+ beforeFlush := time.Now()
+ time.AfterFunc(80*time.Millisecond, func() { close(ls.unblock) })
+ Flush() // this should hang for approx. 80ms
+ if blockd := time.Now().Sub(beforeFlush); blockd < 80*time.Millisecond {
+ t.Errorf("Flush didn't block long enough, blocked for %v, should've been >= 80ms", blockd)
+ }
+
+ ls.LogSystem.(*TestLogSystem).CheckOutput(t, "[TEST] .[TEST] .[TEST] .[TEST] .[TEST] .")
+}
+
+func TestLoggerPrintln(t *testing.T) {
+ Reset()
+
+ logger := NewLogger("TEST")
+ testLogSystem := &TestLogSystem{level: WarnLevel}
+ AddLogSystem(testLogSystem)
+ logger.Errorln("error")
+ logger.Warnln("warn")
+ logger.Infoln("info")
+ logger.Debugln("debug")
+ Flush()
+
+ testLogSystem.CheckOutput(t, "[TEST] error\n[TEST] warn\n")
+}
+
+func TestLoggerPrintf(t *testing.T) {
+ Reset()
+
+ logger := NewLogger("TEST")
+ testLogSystem := &TestLogSystem{level: WarnLevel}
+ AddLogSystem(testLogSystem)
+ logger.Errorf("error to %v\n", []int{1, 2, 3})
+ logger.Warnf("warn %%d %d", 5)
+ logger.Infof("info")
+ logger.Debugf("debug")
+ Flush()
+ testLogSystem.CheckOutput(t, "[TEST] error to [1 2 3]\n[TEST] warn %d 5")
+}
+
+func TestMultipleLogSystems(t *testing.T) {
+ Reset()
+
+ logger := NewLogger("TEST")
+ testLogSystem0 := &TestLogSystem{level: ErrorLevel}
+ testLogSystem1 := &TestLogSystem{level: WarnLevel}
+ AddLogSystem(testLogSystem0)
+ AddLogSystem(testLogSystem1)
+ logger.Errorln("error")
+ logger.Warnln("warn")
+ Flush()
+
+ testLogSystem0.CheckOutput(t, "[TEST] error\n")
+ testLogSystem1.CheckOutput(t, "[TEST] error\n[TEST] warn\n")
+}
+
+func TestFileLogSystem(t *testing.T) {
+ Reset()
+
+ logger := NewLogger("TEST")
+ filename := "test.log"
+ file, _ := os.OpenFile(filename, os.O_RDWR|os.O_CREATE, os.ModePerm)
+ testLogSystem := NewStdLogSystem(file, 0, WarnLevel)
+ AddLogSystem(testLogSystem)
+ logger.Errorf("error to %s\n", filename)
+ logger.Warnln("warn")
+ Flush()
+ contents, _ := ioutil.ReadFile(filename)
+ output := string(contents)
+ if output != "[TEST] error to test.log\n[TEST] warn\n" {
+ t.Error("Expected contents of file 'test.log': '[TEST] error to test.log\\n[TEST] warn\\n', got ", output)
+ } else {
+ os.Remove(filename)
+ }
+}
+
+func TestNoLogSystem(t *testing.T) {
+ Reset()
+
+ logger := NewLogger("TEST")
+ logger.Warnln("warn")
+ Flush()
+}
+
+func TestConcurrentAddSystem(t *testing.T) {
+ rand.Seed(time.Now().Unix())
+ Reset()
+
+ logger := NewLogger("TEST")
+ stop := make(chan struct{})
+ writer := func() {
+ select {
+ case <-stop:
+ return
+ default:
+ logger.Infoln("foo")
+ Flush()
+ }
+ }
+
+ go writer()
+ go writer()
+
+ stopTime := time.Now().Add(100 * time.Millisecond)
+ for time.Now().Before(stopTime) {
+ time.Sleep(time.Duration(rand.Intn(20)) * time.Millisecond)
+ AddLogSystem(NewStdLogSystem(ioutil.Discard, 0, InfoLevel))
+ }
+ close(stop)
+}
diff --git a/miner/miner.go b/miner/miner.go
new file mode 100644
index 000000000..f63096b63
--- /dev/null
+++ b/miner/miner.go
@@ -0,0 +1,261 @@
+/*
+ This file is part of go-ethereum
+
+ go-ethereum 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.
+
+ go-ethereum 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 General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
+*/
+/**
+ * @authors
+ * Jeffrey Wilcke <i@jev.io>
+ * @date 2014
+ *
+ */
+
+package miner
+
+import (
+ "math/big"
+ "sort"
+
+ "github.com/ethereum/go-ethereum"
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/pow"
+ "github.com/ethereum/go-ethereum/pow/ezp"
+
+ "github.com/ethereum/go-ethereum/core"
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/event"
+ "github.com/ethereum/go-ethereum/logger"
+ "github.com/ethereum/go-ethereum/wire"
+)
+
+type LocalTx struct {
+ To []byte `json:"to"`
+ Data []byte `json:"data"`
+ Gas string `json:"gas"`
+ GasPrice string `json:"gasPrice"`
+ Value string `json:"value"`
+}
+
+func (self *LocalTx) Sign(key []byte) *types.Transaction {
+ return nil
+}
+
+var minerlogger = logger.NewLogger("MINER")
+
+type Miner struct {
+ eth *eth.Ethereum
+ events event.Subscription
+
+ uncles types.Blocks
+ localTxs map[int]*LocalTx
+ localTxId int
+
+ pow pow.PoW
+ quitCh chan struct{}
+ powQuitCh chan struct{}
+
+ Coinbase []byte
+
+ mining bool
+
+ MinAcceptedGasPrice *big.Int
+}
+
+func New(coinbase []byte, eth *eth.Ethereum) *Miner {
+ return &Miner{
+ eth: eth,
+ powQuitCh: make(chan struct{}),
+ pow: ezp.New(),
+ mining: false,
+ localTxs: make(map[int]*LocalTx),
+ MinAcceptedGasPrice: big.NewInt(10000000000000),
+ Coinbase: coinbase,
+ }
+}
+
+func (self *Miner) GetPow() pow.PoW {
+ return self.pow
+}
+
+func (self *Miner) AddLocalTx(tx *LocalTx) int {
+ minerlogger.Infof("Added local tx (%x %v / %v)\n", tx.To[0:4], tx.GasPrice, tx.Value)
+
+ self.localTxId++
+ self.localTxs[self.localTxId] = tx
+ self.eth.EventMux().Post(tx)
+
+ return self.localTxId
+}
+
+func (self *Miner) RemoveLocalTx(id int) {
+ if tx := self.localTxs[id]; tx != nil {
+ minerlogger.Infof("Removed local tx (%x %v / %v)\n", tx.To[0:4], tx.GasPrice, tx.Value)
+ }
+ self.eth.EventMux().Post(&LocalTx{})
+
+ delete(self.localTxs, id)
+}
+
+func (self *Miner) Start() {
+ if self.mining {
+ return
+ }
+
+ minerlogger.Infoln("Starting mining operations")
+ self.mining = true
+ self.quitCh = make(chan struct{})
+ self.powQuitCh = make(chan struct{})
+
+ mux := self.eth.EventMux()
+ self.events = mux.Subscribe(core.NewBlockEvent{}, core.TxPreEvent{}, &LocalTx{})
+
+ go self.update()
+ go self.mine()
+}
+
+func (self *Miner) Stop() {
+ if !self.mining {
+ return
+ }
+
+ self.mining = false
+
+ minerlogger.Infoln("Stopping mining operations")
+
+ self.events.Unsubscribe()
+
+ close(self.quitCh)
+ close(self.powQuitCh)
+}
+
+func (self *Miner) Mining() bool {
+ return self.mining
+}
+
+func (self *Miner) update() {
+out:
+ for {
+ select {
+ case event := <-self.events.Chan():
+ switch event := event.(type) {
+ case core.NewBlockEvent:
+ block := event.Block
+ if self.eth.ChainManager().HasBlock(block.Hash()) {
+ self.reset()
+ self.eth.TxPool().RemoveSet(block.Transactions())
+ go self.mine()
+ } else if true {
+ // do uncle stuff
+ }
+ case core.TxPreEvent, *LocalTx:
+ self.reset()
+ go self.mine()
+ }
+ case <-self.quitCh:
+ break out
+ }
+ }
+}
+
+func (self *Miner) reset() {
+ close(self.powQuitCh)
+ self.powQuitCh = make(chan struct{})
+}
+
+func (self *Miner) mine() {
+ var (
+ blockManager = self.eth.BlockManager()
+ chainMan = self.eth.ChainManager()
+ block = chainMan.NewBlock(self.Coinbase)
+ )
+
+ // Apply uncles
+ if len(self.uncles) > 0 {
+ block.SetUncles(self.uncles)
+ }
+
+ parent := chainMan.GetBlock(block.PrevHash)
+ coinbase := block.State().GetOrNewStateObject(block.Coinbase)
+ coinbase.SetGasPool(block.CalcGasLimit(parent))
+
+ transactions := self.finiliseTxs()
+
+ // Accumulate all valid transactions and apply them to the new state
+ // Error may be ignored. It's not important during mining
+ receipts, txs, _, erroneous, err := blockManager.ApplyTransactions(coinbase, block.State(), block, transactions, true)
+ if err != nil {
+ minerlogger.Debugln(err)
+ }
+ self.eth.TxPool().RemoveSet(erroneous)
+
+ block.SetTransactions(txs)
+ block.SetReceipts(receipts)
+
+ // Accumulate the rewards included for this block
+ blockManager.AccumelateRewards(block.State(), block, parent)
+
+ block.State().Update(ethutil.Big0)
+
+ minerlogger.Infof("Mining on block. Includes %v transactions", len(transactions))
+
+ // Find a valid nonce
+ nonce := self.pow.Search(block, self.powQuitCh)
+ if nonce != nil {
+ block.Nonce = nonce
+ err := chainMan.InsertChain(types.Blocks{block})
+ if err != nil {
+ minerlogger.Infoln(err)
+ } else {
+ self.eth.Broadcast(wire.MsgBlockTy, []interface{}{block.Value().Val})
+
+ minerlogger.Infof("🔨 Mined block %x\n", block.Hash())
+ minerlogger.Infoln(block)
+ }
+
+ go self.mine()
+ }
+}
+
+func (self *Miner) finiliseTxs() types.Transactions {
+ // Sort the transactions by nonce in case of odd network propagation
+ actualSize := len(self.localTxs) // See copy below
+ txs := make(types.Transactions, actualSize+self.eth.TxPool().Size())
+
+ state := self.eth.ChainManager().TransState()
+ // XXX This has to change. Coinbase is, for new, same as key.
+ key := self.eth.KeyManager()
+ for i, ltx := range self.localTxs {
+ tx := types.NewTransactionMessage(ltx.To, ethutil.Big(ltx.Value), ethutil.Big(ltx.Gas), ethutil.Big(ltx.GasPrice), ltx.Data)
+ tx.SetNonce(state.GetNonce(self.Coinbase))
+ state.SetNonce(self.Coinbase, tx.Nonce()+1)
+
+ tx.Sign(key.PrivateKey())
+
+ txs[i] = tx
+ }
+
+ // Faster than append
+ for _, tx := range self.eth.TxPool().CurrentTransactions() {
+ if tx.GasPrice().Cmp(self.MinAcceptedGasPrice) >= 0 {
+ txs[actualSize] = tx
+ actualSize++
+ }
+ }
+
+ newTransactions := make(types.Transactions, actualSize)
+ copy(newTransactions, txs[:actualSize])
+ sort.Sort(types.TxByNonce{newTransactions})
+
+ return newTransactions
+}
diff --git a/mist/assets/ext/http.js b/mist/assets/ext/http.js
deleted file mode 100644
index 725ce8e6b..000000000
--- a/mist/assets/ext/http.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// this function is included locally, but you can also include separately via a header definition
-function request(url, callback) {
- var xhr = new XMLHttpRequest();
- xhr.onreadystatechange = (function(req) {
- return function() {
- if(req.readyState === 4) {
- callback(req);
- }
- }
- })(xhr);
- xhr.open('GET', url, true);
- xhr.send('');
-}
diff --git a/mist/assets/ext/qml_messaging.js b/mist/assets/ext/qml_messaging.js
deleted file mode 100644
index 8222c848d..000000000
--- a/mist/assets/ext/qml_messaging.js
+++ /dev/null
@@ -1,13 +0,0 @@
-function HandleMessage(data) {
- var message;
- try { message = JSON.parse(data) } catch(e) {};
-
- if(message) {
- switch(message.type) {
- case "coinbase":
- return eth.coinBase();
- case "block":
- return eth.blockByNumber(0);
- }
- }
-}
diff --git a/mist/assets/ext/qt_messaging_adapter.js b/mist/assets/ext/qt_messaging_adapter.js
deleted file mode 100644
index ff6976177..000000000
--- a/mist/assets/ext/qt_messaging_adapter.js
+++ /dev/null
@@ -1,21 +0,0 @@
-window._messagingAdapter = function(data) {
- navigator.qt.postMessage(data);
-};
-
-navigator.qt.onmessage = function(ev) {
- var data = JSON.parse(ev.data)
-
- if(data._event !== undefined) {
- eth.trigger(data._event, data.data);
- } else {
- if(data._seed) {
- var cb = eth._callbacks[data._seed];
- if(cb) {
- cb.call(this, data.data)
-
- // Remove the "trigger" callback
- delete eth._callbacks[ev._seed];
- }
- }
- }
-}
diff --git a/mist/assets/qml/views/javascript.qml b/mist/assets/qml/views/javascript.qml
deleted file mode 100644
index ea05c4148..000000000
--- a/mist/assets/qml/views/javascript.qml
+++ /dev/null
@@ -1,45 +0,0 @@
-import QtQuick 2.0
-import QtQuick.Controls 1.0;
-import QtQuick.Layouts 1.0;
-import QtQuick.Dialogs 1.0;
-import QtQuick.Window 2.1;
-import QtQuick.Controls.Styles 1.1
-import Ethereum 1.0
-
-Rectangle {
- property var title: "JavaScript"
- property var iconSource: "../tx.png"
- property var menuItem
-
- objectName: "javascriptView"
- visible: false
- anchors.fill: parent
-
- TextField {
- id: input
- anchors {
- left: parent.left
- right: parent.right
- bottom: parent.bottom
- }
- height: 20
-
- Keys.onReturnPressed: {
- var res = eth.evalJavascriptString(this.text);
- this.text = "";
-
- output.append(res)
- }
- }
-
- TextArea {
- id: output
- text: "> JSRE Ready..."
- anchors {
- top: parent.top
- left: parent.left
- right: parent.right
- bottom: input.top
- }
- }
-}
diff --git a/mist/assets/qml/webapp.qml b/mist/assets/qml/webapp.qml
deleted file mode 100644
index 09e6a83ad..000000000
--- a/mist/assets/qml/webapp.qml
+++ /dev/null
@@ -1,417 +0,0 @@
-import QtQuick 2.0
-import QtWebKit 3.0
-import QtWebKit.experimental 1.0
-import QtQuick.Controls 1.0;
-import QtQuick.Controls.Styles 1.0
-import QtQuick.Layouts 1.0;
-import QtQuick.Window 2.1;
-import Ethereum 1.0
-
-import "../ext/qml_messaging.js" as Messaging
-
-//ApplicationWindow {
- Rectangle {
- id: window
- property var title: "Browser"
- property var iconSource: "../browser.png"
- property var menuItem
-
- property alias url: webview.url
- property alias webView: webview
-
- property var cleanPath: false
- property var open: function(url) {
- if(!window.cleanPath) {
- var uri = url;
- if(!/.*\:\/\/.*/.test(uri)) {
- uri = "http://" + uri;
- }
-
- var reg = /(^https?\:\/\/(?:www\.)?)([a-zA-Z0-9_\-]*\.eth)(.*)/
-
- if(reg.test(uri)) {
- uri.replace(reg, function(match, pre, domain, path) {
- uri = pre;
-
- var lookup = eth.lookupDomain(domain.substring(0, domain.length - 4));
- var ip = [];
- for(var i = 0, l = lookup.length; i < l; i++) {
- ip.push(lookup.charCodeAt(i))
- }
-
- if(ip.length != 0) {
- uri += lookup;
- } else {
- uri += domain;
- }
-
- uri += path;
- });
- }
-
- window.cleanPath = true;
-
- webview.url = uri;
-
- //uriNav.text = uri.text.replace(/(^https?\:\/\/(?:www\.)?)([a-zA-Z0-9_\-]*\.\w{2,3})(.*)/, "$1$2<span style='color:#CCC'>$3</span>");
- uriNav.text = uri;
- } else {
- // Prevent inf loop.
- window.cleanPath = false;
- }
- }
-
- Component.onCompleted: {
- webview.url = "http://etherian.io"
- }
-
- signal messages(var messages, int id);
- onMessages: {
- // Bit of a cheat to get proper JSON
- var m = JSON.parse(JSON.parse(JSON.stringify(messages)))
- webview.postEvent("messages", [m, id]);
- }
-
- Item {
- objectName: "root"
- id: root
- anchors.fill: parent
- state: "inspectorShown"
-
- RowLayout {
- id: navBar
- height: 40
- anchors {
- left: parent.left
- right: parent.right
- leftMargin: 7
- }
-
- Button {
- id: back
- onClicked: {
- webview.goBack()
- }
- style: ButtonStyle {
- background: Image {
- source: "../back.png"
- width: 30
- height: 30
- }
- }
- }
-
- TextField {
- anchors {
- left: back.right
- right: toggleInspector.left
- leftMargin: 5
- rightMargin: 5
- }
- text: "http://etherian.io"
- id: uriNav
- y: parent.height / 2 - this.height / 2
-
- Keys.onReturnPressed: {
- webview.url = this.text;
- }
- }
-
- Button {
- id: toggleInspector
- anchors {
- right: parent.right
- }
- iconSource: "../bug.png"
- onClicked: {
- if(inspector.visible == true){
- inspector.visible = false
- }else{
- inspector.visible = true
- inspector.url = webview.experimental.remoteInspectorUrl
- }
- }
- }
- }
-
-
- WebView {
- objectName: "webView"
- id: webview
- anchors {
- left: parent.left
- right: parent.right
- bottom: parent.bottom
- top: navBar.bottom
- }
-
- //property var cleanPath: false
- onNavigationRequested: {
- window.open(request.url.toString());
- }
-
- function sendMessage(data) {
- webview.experimental.postMessage(JSON.stringify(data))
- }
-
- onTitleChanged: {
- var data = Messaging.HandleMessage(title);
- if(data) {
- sendMessage(data)
- }
- }
-
- experimental.preferences.javascriptEnabled: true
- experimental.preferences.navigatorQtObjectEnabled: true
- experimental.preferences.developerExtrasEnabled: true
- experimental.userScripts: ["../ext/qt_messaging_adapter.js", "../ext/q.js", "../ext/big.js", "../ext/string.js", "../ext/html_messaging.js"]
- experimental.onMessageReceived: {
- console.log("[onMessageReceived]: ", message.data)
- // TODO move to messaging.js
- var data = JSON.parse(message.data)
-
- try {
- switch(data.call) {
- case "compile":
- postData(data._seed, eth.compile(data.args[0]))
- break
-
- case "getCoinBase":
- postData(data._seed, eth.coinBase())
-
- break
-
- case "getIsListening":
- postData(data._seed, eth.isListening())
-
- break
-
- case "getIsMining":
- postData(data._seed, eth.isMining())
-
- break
-
- case "getPeerCount":
- postData(data._seed, eth.peerCount())
-
- break
-
- case "getCountAt":
- require(1)
- postData(data._seed, eth.txCountAt(data.args[0]))
-
- break
-
- case "getCodeAt":
- require(1)
- var code = eth.codeAt(data.args[0])
- postData(data._seed, code);
-
- break
-
- case "getBlockByNumber":
- var block = eth.blockByNumber(data.args[0])
- postData(data._seed, block)
-
- break
-
- case "getBlockByHash":
- var block = eth.blockByHash(data.args[0])
- postData(data._seed, block)
-
- break
-
- case "transact":
- require(5)
-
- var tx = eth.transact(data.args)
- postData(data._seed, tx)
-
- break
-
- case "getStorageAt":
- require(2);
-
- var storage = eth.storageAt(data.args[0], data.args[1]);
- postData(data._seed, storage)
-
- break
-
- case "call":
- require(1);
- var ret = eth.call(data.args)
- postData(data._seed, ret)
-
- break
-
- case "getEachStorage":
- require(1);
- var storage = JSON.parse(eth.eachStorage(data.args[0]))
- postData(data._seed, storage)
-
- break
-
- case "getTransactionsFor":
- require(1);
- var txs = eth.transactionsFor(data.args[0], true)
- postData(data._seed, txs)
-
- break
-
- case "getBalanceAt":
- require(1);
-
- postData(data._seed, eth.balanceAt(data.args[0]));
-
- break
-
- case "getKey":
- var key = eth.key().privateKey;
-
- postData(data._seed, key)
- break
-
- case "watch":
- require(2)
- eth.watch(data.args[0], data.args[1])
-
- case "disconnect":
- require(1)
- postData(data._seed, null)
-
- break;
-
- case "getSecretToAddress":
- require(1)
-
- var addr = eth.secretToAddress(data.args[0])
- console.log("getsecret", addr)
- postData(data._seed, addr)
-
- break;
-
- case "messages":
- require(1);
-
- var messages = JSON.parse(eth.getMessages(data.args[0]))
- postData(data._seed, messages)
-
- break
-
- case "mutan":
- require(1)
-
- var code = eth.compileMutan(data.args[0])
- postData(data._seed, "0x"+code)
-
- break;
-
- case "newFilterString":
- require(1)
- var id = eth.newFilterString(data.args[0])
- postData(data._seed, id);
- break;
- case "newFilter":
- require(1)
- var id = eth.newFilter(data.args[0])
-
- postData(data._seed, id);
- break;
-
- case "getMessages":
- require(1);
-
- var messages = eth.messages(data.args[0]);
- var m = JSON.parse(JSON.parse(JSON.stringify(messages)))
- postData(data._seed, m);
-
- break;
-
- case "deleteFilter":
- require(1);
- eth.uninstallFilter(data.args[0])
- break;
- }
- } catch(e) {
- console.log(data.call + ": " + e)
-
- postData(data._seed, null);
- }
- }
-
-
- function post(seed, data) {
- postData(data._seed, data)
- }
-
- function require(args, num) {
- if(args.length < num) {
- throw("required argument count of "+num+" got "+args.length);
- }
- }
- function postData(seed, data) {
- webview.experimental.postMessage(JSON.stringify({data: data, _seed: seed}))
- }
- function postEvent(event, data) {
- webview.experimental.postMessage(JSON.stringify({data: data, _event: event}))
- }
-
- function onWatchedCb(data, id) {
- var messages = JSON.parse(data)
- postEvent("watched:"+id, messages)
- }
-
- function onNewBlockCb(block) {
- postEvent("block:new", block)
- }
- function onObjectChangeCb(stateObject) {
- postEvent("object:"+stateObject.address(), stateObject)
- }
- function onStorageChangeCb(storageObject) {
- var ev = ["storage", storageObject.stateAddress, storageObject.address].join(":");
- postEvent(ev, [storageObject.address, storageObject.value])
- }
- }
-
-
- Rectangle {
- id: sizeGrip
- color: "gray"
- visible: false
- height: 10
- anchors {
- left: root.left
- right: root.right
- }
- y: Math.round(root.height * 2 / 3)
-
- MouseArea {
- anchors.fill: parent
- drag.target: sizeGrip
- drag.minimumY: 0
- drag.maximumY: root.height
- drag.axis: Drag.YAxis
- }
- }
-
- WebView {
- id: inspector
- visible: false
- anchors {
- left: root.left
- right: root.right
- top: sizeGrip.bottom
- bottom: root.bottom
- }
- }
-
- states: [
- State {
- name: "inspectorShown"
- PropertyChanges {
- target: inspector
- }
- }
- ]
- }
- }
diff --git a/mist/errors.go b/mist/errors.go
deleted file mode 100644
index 409b7a281..000000000
--- a/mist/errors.go
+++ /dev/null
@@ -1,36 +0,0 @@
-package main
-
-import (
- "fmt"
- "os"
-
- "gopkg.in/qml.v1"
-)
-
-func ErrorWindow(err error) {
- engine := qml.NewEngine()
- component, e := engine.LoadString("local", qmlErr)
- if e != nil {
- fmt.Println("err:", err)
- os.Exit(1)
- }
-
- win := component.CreateWindow(nil)
- win.Root().ObjectByName("label").Set("text", err.Error())
- win.Show()
- win.Wait()
-}
-
-const qmlErr = `
-import QtQuick 2.0; import QtQuick.Controls 1.0;
-ApplicationWindow {
- width: 600; height: 150;
- flags: Qt.CustomizeWindowHint | Qt.WindowTitleHint | Qt.WindowCloseButtonHint
- title: "Error"
- Text {
- x: parent.width / 2 - this.width / 2;
- y: parent.height / 2 - this.height / 2;
- objectName: "label";
- }
-}
-`
diff --git a/mist/ext_app.go b/mist/ext_app.go
deleted file mode 100644
index 514084c97..000000000
--- a/mist/ext_app.go
+++ /dev/null
@@ -1,145 +0,0 @@
-package main
-
-import (
- "encoding/json"
-
- "github.com/ethereum/eth-go/ethchain"
- "github.com/ethereum/eth-go/ethpipe"
- "github.com/ethereum/eth-go/ethreact"
- "github.com/ethereum/eth-go/ethstate"
- "github.com/ethereum/go-ethereum/javascript"
- "gopkg.in/qml.v1"
-)
-
-type AppContainer interface {
- Create() error
- Destroy()
-
- Window() *qml.Window
- Engine() *qml.Engine
-
- NewBlock(*ethchain.Block)
- NewWatcher(chan bool)
- Messages(ethstate.Messages, string)
- Post(string, int)
-}
-
-type ExtApplication struct {
- *ethpipe.JSPipe
- eth ethchain.EthManager
-
- blockChan chan ethreact.Event
- messageChan chan ethreact.Event
- quitChan chan bool
- watcherQuitChan chan bool
-
- filters map[string]*ethchain.Filter
-
- container AppContainer
- lib *UiLib
-}
-
-func NewExtApplication(container AppContainer, lib *UiLib) *ExtApplication {
- app := &ExtApplication{
- ethpipe.NewJSPipe(lib.eth),
- lib.eth,
- make(chan ethreact.Event, 100),
- make(chan ethreact.Event, 100),
- make(chan bool),
- make(chan bool),
- make(map[string]*ethchain.Filter),
- container,
- lib,
- }
-
- return app
-}
-
-func (app *ExtApplication) run() {
- // Set the "eth" api on to the containers context
- context := app.container.Engine().Context()
- context.SetVar("eth", app)
- context.SetVar("ui", app.lib)
-
- err := app.container.Create()
- if err != nil {
- logger.Errorln(err)
- return
- }
-
- // Call the main loop
- go app.mainLoop()
-
- // Subscribe to events
- reactor := app.lib.eth.Reactor()
- reactor.Subscribe("newBlock", app.blockChan)
- reactor.Subscribe("messages", app.messageChan)
-
- app.container.NewWatcher(app.watcherQuitChan)
-
- win := app.container.Window()
- win.Show()
- win.Wait()
-
- app.stop()
-}
-
-func (app *ExtApplication) stop() {
- // Clean up
- reactor := app.lib.eth.Reactor()
- reactor.Unsubscribe("newBlock", app.blockChan)
-
- // Kill the main loop
- app.quitChan <- true
- app.watcherQuitChan <- true
-
- close(app.blockChan)
- close(app.quitChan)
-
- app.container.Destroy()
-}
-
-func (app *ExtApplication) mainLoop() {
-out:
- for {
- select {
- case <-app.quitChan:
- break out
- case block := <-app.blockChan:
- if block, ok := block.Resource.(*ethchain.Block); ok {
- app.container.NewBlock(block)
- }
- case msg := <-app.messageChan:
- if messages, ok := msg.Resource.(ethstate.Messages); ok {
- for id, filter := range app.filters {
- msgs := filter.FilterMessages(messages)
- if len(msgs) > 0 {
- app.container.Messages(msgs, id)
- }
- }
- }
- }
- }
-
-}
-
-func (self *ExtApplication) Watch(filterOptions map[string]interface{}, identifier string) {
- self.filters[identifier] = ethchain.NewFilterFromMap(filterOptions, self.eth)
-}
-
-func (self *ExtApplication) GetMessages(object map[string]interface{}) string {
- filter := ethchain.NewFilterFromMap(object, self.eth)
-
- messages := filter.Find()
- var msgs []javascript.JSMessage
- for _, m := range messages {
- msgs = append(msgs, javascript.NewJSMessage(m))
- }
-
- b, err := json.Marshal(msgs)
- if err != nil {
- return "{\"error\":" + err.Error() + "}"
- }
-
- return string(b)
-}
diff --git a/mist/qml_container.go b/mist/qml_container.go
deleted file mode 100644
index 85bd7c699..000000000
--- a/mist/qml_container.go
+++ /dev/null
@@ -1,68 +0,0 @@
-package main
-
-import (
- "fmt"
- "runtime"
-
- "github.com/ethereum/eth-go/ethchain"
- "github.com/ethereum/eth-go/ethpipe"
- "github.com/ethereum/eth-go/ethstate"
- "github.com/ethereum/eth-go/ethutil"
- "gopkg.in/qml.v1"
-)
-
-type QmlApplication struct {
- win *qml.Window
- engine *qml.Engine
- lib *UiLib
- path string
-}
-
-func NewQmlApplication(path string, lib *UiLib) *QmlApplication {
- engine := qml.NewEngine()
- return &QmlApplication{engine: engine, path: path, lib: lib}
-}
-
-func (app *QmlApplication) Create() error {
- path := string(app.path)
-
- // For some reason for windows we get /c:/path/to/something, windows doesn't like the first slash but is fine with the others so we are removing it
- if app.path[0] == '/' && runtime.GOOS == "windows" {
- path = app.path[1:]
- }
-
- component, err := app.engine.LoadFile(path)
- if err != nil {
- logger.Warnln(err)
- }
- app.win = component.CreateWindow(nil)
-
- return nil
-}
-
-func (app *QmlApplication) Destroy() {
- app.engine.Destroy()
-}
-
-func (app *QmlApplication) NewWatcher(quitChan chan bool) {
-}
-
-// Events
-func (app *QmlApplication) NewBlock(block *ethchain.Block) {
- pblock := &ethpipe.JSBlock{Number: int(block.BlockInfo().Number), Hash: ethutil.Bytes2Hex(block.Hash())}
- app.win.Call("onNewBlockCb", pblock)
-}
-
-func (self *QmlApplication) Messages(msgs ethstate.Messages, id string) {
- fmt.Println("IMPLEMENT QML APPLICATION MESSAGES METHOD")
-}
-
-// Getters
-func (app *QmlApplication) Engine() *qml.Engine {
- return app.engine
-}
-func (app *QmlApplication) Window() *qml.Window {
- return app.win
-}
-
-func (app *QmlApplication) Post(data string, s int) {}
diff --git a/nat.go b/nat.go
new file mode 100644
index 000000000..999308eb2
--- /dev/null
+++ b/nat.go
@@ -0,0 +1,12 @@
+package eth
+
+import (
+ "net"
+)
+
+// protocol is either "udp" or "tcp"
+type NAT interface {
+ GetExternalAddress() (addr net.IP, err error)
+ AddPortMapping(protocol string, externalPort, internalPort int, description string, timeout int) (mappedExternalPort int, err error)
+ DeletePortMapping(protocol string, externalPort, internalPort int) (err error)
+}
diff --git a/natpmp.go b/natpmp.go
new file mode 100644
index 000000000..489342a4b
--- /dev/null
+++ b/natpmp.go
@@ -0,0 +1,55 @@
+package eth
+
+import (
+ "fmt"
+ "net"
+
+ natpmp "github.com/jackpal/go-nat-pmp"
+)
+
+// Adapt the NAT-PMP protocol to the NAT interface
+
+// TODO:
+// + Register for changes to the external address.
+// + Re-register port mapping when router reboots.
+// + A mechanism for keeping a port mapping registered.
+
+type natPMPClient struct {
+ client *natpmp.Client
+}
+
+func NewNatPMP(gateway net.IP) (nat NAT) {
+ return &natPMPClient{natpmp.NewClient(gateway)}
+}
+
+func (n *natPMPClient) GetExternalAddress() (addr net.IP, err error) {
+ response, err := n.client.GetExternalAddress()
+ if err != nil {
+ return
+ }
+ ip := response.ExternalIPAddress
+ addr = net.IPv4(ip[0], ip[1], ip[2], ip[3])
+ return
+}
+
+func (n *natPMPClient) AddPortMapping(protocol string, externalPort, internalPort int,
+ description string, timeout int) (mappedExternalPort int, err error) {
+ if timeout <= 0 {
+ err = fmt.Errorf("timeout must not be <= 0")
+ return
+ }
+ // Note order of port arguments is switched between our AddPortMapping and the client's AddPortMapping.
+ response, err := n.client.AddPortMapping(protocol, internalPort, externalPort, timeout)
+ if err != nil {
+ return
+ }
+ mappedExternalPort = int(response.MappedExternalPort)
+ return
+}
+
+func (n *natPMPClient) DeletePortMapping(protocol string, externalPort, internalPort int) (err error) {
+ // To destroy a mapping, send an add-port with
+ // an internalPort of the internal port to destroy, an external port of zero and a time of zero.
+ _, err = n.client.AddPortMapping(protocol, internalPort, 0, 0)
+ return
+}
diff --git a/natupnp.go b/natupnp.go
new file mode 100644
index 000000000..c7f9eeb62
--- /dev/null
+++ b/natupnp.go
@@ -0,0 +1,338 @@
+package eth
+
+// Just enough UPnP to be able to forward ports
+//
+
+import (
+ "bytes"
+ "encoding/xml"
+ "errors"
+ "net"
+ "net/http"
+ "os"
+ "strconv"
+ "strings"
+ "time"
+)
+
+type upnpNAT struct {
+ serviceURL string
+ ourIP string
+}
+
+func Discover() (nat NAT, err error) {
+ ssdp, err := net.ResolveUDPAddr("udp4", "239.255.255.250:1900")
+ if err != nil {
+ return
+ }
+ conn, err := net.ListenPacket("udp4", ":0")
+ if err != nil {
+ return
+ }
+ socket := conn.(*net.UDPConn)
+ defer socket.Close()
+
+ err = socket.SetDeadline(time.Now().Add(10 * time.Second))
+ if err != nil {
+ return
+ }
+
+ st := "ST: urn:schemas-upnp-org:device:InternetGatewayDevice:1\r\n"
+ buf := bytes.NewBufferString(
+ "M-SEARCH * HTTP/1.1\r\n" +
+ "HOST: 239.255.255.250:1900\r\n" +
+ st +
+ "MAN: \"ssdp:discover\"\r\n" +
+ "MX: 2\r\n\r\n")
+ message := buf.Bytes()
+ answerBytes := make([]byte, 1024)
+ for i := 0; i < 3; i++ {
+ _, err = socket.WriteToUDP(message, ssdp)
+ if err != nil {
+ return
+ }
+ var n int
+ n, _, err = socket.ReadFromUDP(answerBytes)
+ if err != nil {
+ continue
+ // socket.Close()
+ // return
+ }
+ answer := string(answerBytes[0:n])
+ if strings.Index(answer, "\r\n"+st) < 0 {
+ continue
+ }
+ // HTTP header field names are case-insensitive.
+ // http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2
+ locString := "\r\nlocation: "
+ answer = strings.ToLower(answer)
+ locIndex := strings.Index(answer, locString)
+ if locIndex < 0 {
+ continue
+ }
+ loc := answer[locIndex+len(locString):]
+ endIndex := strings.Index(loc, "\r\n")
+ if endIndex < 0 {
+ continue
+ }
+ locURL := loc[0:endIndex]
+ var serviceURL string
+ serviceURL, err = getServiceURL(locURL)
+ if err != nil {
+ return
+ }
+ var ourIP string
+ ourIP, err = getOurIP()
+ if err != nil {
+ return
+ }
+ nat = &upnpNAT{serviceURL: serviceURL, ourIP: ourIP}
+ return
+ }
+ err = errors.New("UPnP port discovery failed.")
+ return
+}
+
+// service represents the Service type in an UPnP xml description.
+// Only the parts we care about are present and thus the xml may have more
+// fields than present in the structure.
+type service struct {
+ ServiceType string `xml:"serviceType"`
+ ControlURL string `xml:"controlURL"`
+}
+
+// deviceList represents the deviceList type in an UPnP xml description.
+// Only the parts we care about are present and thus the xml may have more
+// fields than present in the structure.
+type deviceList struct {
+ XMLName xml.Name `xml:"deviceList"`
+ Device []device `xml:"device"`
+}
+
+// serviceList represents the serviceList type in an UPnP xml description.
+// Only the parts we care about are present and thus the xml may have more
+// fields than present in the structure.
+type serviceList struct {
+ XMLName xml.Name `xml:"serviceList"`
+ Service []service `xml:"service"`
+}
+
+// device represents the device type in an UPnP xml description.
+// Only the parts we care about are present and thus the xml may have more
+// fields than present in the structure.
+type device struct {
+ XMLName xml.Name `xml:"device"`
+ DeviceType string `xml:"deviceType"`
+ DeviceList deviceList `xml:"deviceList"`
+ ServiceList serviceList `xml:"serviceList"`
+}
+
+// specVersion represents the specVersion in a UPnP xml description.
+// Only the parts we care about are present and thus the xml may have more
+// fields than present in the structure.
+type specVersion struct {
+ XMLName xml.Name `xml:"specVersion"`
+ Major int `xml:"major"`
+ Minor int `xml:"minor"`
+}
+
+// root represents the Root document for a UPnP xml description.
+// Only the parts we care about are present and thus the xml may have more
+// fields than present in the structure.
+type root struct {
+ XMLName xml.Name `xml:"root"`
+ SpecVersion specVersion
+ Device device
+}
+
+func getChildDevice(d *device, deviceType string) *device {
+ dl := d.DeviceList.Device
+ for i := 0; i < len(dl); i++ {
+ if dl[i].DeviceType == deviceType {
+ return &dl[i]
+ }
+ }
+ return nil
+}
+
+func getChildService(d *device, serviceType string) *service {
+ sl := d.ServiceList.Service
+ for i := 0; i < len(sl); i++ {
+ if sl[i].ServiceType == serviceType {
+ return &sl[i]
+ }
+ }
+ return nil
+}
+
+func getOurIP() (ip string, err error) {
+ hostname, err := os.Hostname()
+ if err != nil {
+ return
+ }
+ p, err := net.LookupIP(hostname)
+ if err != nil && len(p) > 0 {
+ return
+ }
+ return p[0].String(), nil
+}
+
+func getServiceURL(rootURL string) (url string, err error) {
+ r, err := http.Get(rootURL)
+ if err != nil {
+ return
+ }
+ defer r.Body.Close()
+ if r.StatusCode >= 400 {
+ err = errors.New(string(r.StatusCode))
+ return
+ }
+ var root root
+ err = xml.NewDecoder(r.Body).Decode(&root)
+
+ if err != nil {
+ return
+ }
+ a := &root.Device
+ if a.DeviceType != "urn:schemas-upnp-org:device:InternetGatewayDevice:1" {
+ err = errors.New("No InternetGatewayDevice")
+ return
+ }
+ b := getChildDevice(a, "urn:schemas-upnp-org:device:WANDevice:1")
+ if b == nil {
+ err = errors.New("No WANDevice")
+ return
+ }
+ c := getChildDevice(b, "urn:schemas-upnp-org:device:WANConnectionDevice:1")
+ if c == nil {
+ err = errors.New("No WANConnectionDevice")
+ return
+ }
+ d := getChildService(c, "urn:schemas-upnp-org:service:WANIPConnection:1")
+ if d == nil {
+ err = errors.New("No WANIPConnection")
+ return
+ }
+ url = combineURL(rootURL, d.ControlURL)
+ return
+}
+
+func combineURL(rootURL, subURL string) string {
+ protocolEnd := "://"
+ protoEndIndex := strings.Index(rootURL, protocolEnd)
+ a := rootURL[protoEndIndex+len(protocolEnd):]
+ rootIndex := strings.Index(a, "/")
+ return rootURL[0:protoEndIndex+len(protocolEnd)+rootIndex] + subURL
+}
+
+func soapRequest(url, function, message string) (r *http.Response, err error) {
+ fullMessage := "<?xml version=\"1.0\" ?>" +
+ "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\r\n" +
+ "<s:Body>" + message + "</s:Body></s:Envelope>"
+
+ req, err := http.NewRequest("POST", url, strings.NewReader(fullMessage))
+ if err != nil {
+ return nil, err
+ }
+ req.Header.Set("Content-Type", "text/xml ; charset=\"utf-8\"")
+ req.Header.Set("User-Agent", "Darwin/10.0.0, UPnP/1.0, MiniUPnPc/1.3")
+ //req.Header.Set("Transfer-Encoding", "chunked")
+ req.Header.Set("SOAPAction", "\"urn:schemas-upnp-org:service:WANIPConnection:1#"+function+"\"")
+ req.Header.Set("Connection", "Close")
+ req.Header.Set("Cache-Control", "no-cache")
+ req.Header.Set("Pragma", "no-cache")
+
+ // log.Stderr("soapRequest ", req)
+ //fmt.Println(fullMessage)
+
+ r, err = http.DefaultClient.Do(req)
+ if err != nil {
+ return
+ }
+
+ if r.Body != nil {
+ defer r.Body.Close()
+ }
+
+ if r.StatusCode >= 400 {
+ // log.Stderr(function, r.StatusCode)
+ err = errors.New("Error " + strconv.Itoa(r.StatusCode) + " for " + function)
+ r = nil
+ return
+ }
+ return
+}
+
+type statusInfo struct {
+ externalIpAddress string
+}
+
+func (n *upnpNAT) getStatusInfo() (info statusInfo, err error) {
+
+ message := "<u:GetStatusInfo xmlns:u=\"urn:schemas-upnp-org:service:WANIPConnection:1\">\r\n" +
+ "</u:GetStatusInfo>"
+
+ var response *http.Response
+ response, err = soapRequest(n.serviceURL, "GetStatusInfo", message)
+ if err != nil {
+ return
+ }
+
+ // TODO: Write a soap reply parser. It has to eat the Body and envelope tags...
+
+ response.Body.Close()
+ return
+}
+
+func (n *upnpNAT) GetExternalAddress() (addr net.IP, err error) {
+ info, err := n.getStatusInfo()
+ if err != nil {
+ return
+ }
+ addr = net.ParseIP(info.externalIpAddress)
+ return
+}
+
+func (n *upnpNAT) AddPortMapping(protocol string, externalPort, internalPort int, description string, timeout int) (mappedExternalPort int, err error) {
+ // A single concatenation would break ARM compilation.
+ message := "<u:AddPortMapping xmlns:u=\"urn:schemas-upnp-org:service:WANIPConnection:1\">\r\n" +
+ "<NewRemoteHost></NewRemoteHost><NewExternalPort>" + strconv.Itoa(externalPort)
+ message += "</NewExternalPort><NewProtocol>" + protocol + "</NewProtocol>"
+ message += "<NewInternalPort>" + strconv.Itoa(internalPort) + "</NewInternalPort>" +
+ "<NewInternalClient>" + n.ourIP + "</NewInternalClient>" +
+ "<NewEnabled>1</NewEnabled><NewPortMappingDescription>"
+ message += description +
+ "</NewPortMappingDescription><NewLeaseDuration>" + strconv.Itoa(timeout) +
+ "</NewLeaseDuration></u:AddPortMapping>"
+
+ var response *http.Response
+ response, err = soapRequest(n.serviceURL, "AddPortMapping", message)
+ if err != nil {
+ return
+ }
+
+ // TODO: check response to see if the port was forwarded
+ // log.Println(message, response)
+ mappedExternalPort = externalPort
+ _ = response
+ return
+}
+
+func (n *upnpNAT) DeletePortMapping(protocol string, externalPort, internalPort int) (err error) {
+
+ message := "<u:DeletePortMapping xmlns:u=\"urn:schemas-upnp-org:service:WANIPConnection:1\">\r\n" +
+ "<NewRemoteHost></NewRemoteHost><NewExternalPort>" + strconv.Itoa(externalPort) +
+ "</NewExternalPort><NewProtocol>" + protocol + "</NewProtocol>" +
+ "</u:DeletePortMapping>"
+
+ var response *http.Response
+ response, err = soapRequest(n.serviceURL, "DeletePortMapping", message)
+ if err != nil {
+ return
+ }
+
+ // TODO: check response to see if the port was deleted
+ // log.Println(message, response)
+ _ = response
+ return
+}
diff --git a/p2p/client_identity.go b/p2p/client_identity.go
new file mode 100644
index 000000000..bc865b63b
--- /dev/null
+++ b/p2p/client_identity.go
@@ -0,0 +1,63 @@
+package p2p
+
+import (
+ "fmt"
+ "runtime"
+)
+
+// ClientIdentity represents the identity of a peer.
+type ClientIdentity interface {
+ String() string // human readable identity
+ Pubkey() []byte // 512-bit public key
+}
+
+type SimpleClientIdentity struct {
+ clientIdentifier string
+ version string
+ customIdentifier string
+ os string
+ implementation string
+ pubkey string
+}
+
+func NewSimpleClientIdentity(clientIdentifier string, version string, customIdentifier string, pubkey string) *SimpleClientIdentity {
+ clientIdentity := &SimpleClientIdentity{
+ clientIdentifier: clientIdentifier,
+ version: version,
+ customIdentifier: customIdentifier,
+ os: runtime.GOOS,
+ implementation: runtime.Version(),
+ pubkey: pubkey,
+ }
+
+ return clientIdentity
+}
+
+func (c *SimpleClientIdentity) init() {
+}
+
+func (c *SimpleClientIdentity) String() string {
+ var id string
+ if len(c.customIdentifier) > 0 {
+ id = "/" + c.customIdentifier
+ }
+
+ return fmt.Sprintf("%s/v%s%s/%s/%s",
+ c.clientIdentifier,
+ c.version,
+ id,
+ c.os,
+ c.implementation)
+}
+
+func (c *SimpleClientIdentity) Pubkey() []byte {
+ return []byte(c.pubkey)
+}
+
+func (c *SimpleClientIdentity) SetCustomIdentifier(customIdentifier string) {
+ c.customIdentifier = customIdentifier
+}
+
+func (c *SimpleClientIdentity) GetCustomIdentifier() string {
+ return c.customIdentifier
+}
diff --git a/p2p/client_identity_test.go b/p2p/client_identity_test.go
new file mode 100644
index 000000000..40b0e6f5e
--- /dev/null
+++ b/p2p/client_identity_test.go
@@ -0,0 +1,30 @@
+package p2p
+
+import (
+ "fmt"
+ "runtime"
+ "testing"
+)
+
+func TestClientIdentity(t *testing.T) {
+ clientIdentity := NewSimpleClientIdentity("Ethereum(G)", "0.5.16", "test", "pubkey")
+ clientString := clientIdentity.String()
+ expected := fmt.Sprintf("Ethereum(G)/v0.5.16/test/%s/%s", runtime.GOOS, runtime.Version())
+ if clientString != expected {
+ t.Errorf("Expected clientIdentity to be %v, got %v", expected, clientString)
+ }
+ customIdentifier := clientIdentity.GetCustomIdentifier()
+ if customIdentifier != "test" {
+ t.Errorf("Expected clientIdentity.GetCustomIdentifier() to be 'test', got %v", customIdentifier)
+ }
+ clientIdentity.SetCustomIdentifier("test2")
+ customIdentifier = clientIdentity.GetCustomIdentifier()
+ if customIdentifier != "test2" {
+ t.Errorf("Expected clientIdentity.GetCustomIdentifier() to be 'test2', got %v", customIdentifier)
+ }
+ clientString = clientIdentity.String()
+ expected = fmt.Sprintf("Ethereum(G)/v0.5.16/test2/%s/%s", runtime.GOOS, runtime.Version())
+ if clientString != expected {
+ t.Errorf("Expected clientIdentity to be %v, got %v", expected, clientString)
+ }
+}
diff --git a/p2p/message.go b/p2p/message.go
new file mode 100644
index 000000000..f5418ff47
--- /dev/null
+++ b/p2p/message.go
@@ -0,0 +1,232 @@
+package p2p
+
+import (
+ "bytes"
+ "encoding/binary"
+ "errors"
+ "io"
+ "io/ioutil"
+ "math/big"
+ "sync/atomic"
+
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/rlp"
+)
+
+// Msg defines the structure of a p2p message.
+//
+// Note that a Msg can only be sent once since the Payload reader is
+// consumed during sending. It is not possible to create a Msg and
+// send it any number of times. If you want to reuse an encoded
+// structure, encode the payload into a byte array and create a
+// separate Msg with a bytes.Reader as Payload for each send.
+type Msg struct {
+ Code uint64
+ Size uint32 // size of the paylod
+ Payload io.Reader
+}
+
+// NewMsg creates an RLP-encoded message with the given code.
+func NewMsg(code uint64, params ...interface{}) Msg {
+ buf := new(bytes.Buffer)
+ for _, p := range params {
+ buf.Write(ethutil.Encode(p))
+ }
+ return Msg{Code: code, Size: uint32(buf.Len()), Payload: buf}
+}
+
+func encodePayload(params ...interface{}) []byte {
+ buf := new(bytes.Buffer)
+ for _, p := range params {
+ buf.Write(ethutil.Encode(p))
+ }
+ return buf.Bytes()
+}
+
+// Decode parse the RLP content of a message into
+// the given value, which must be a pointer.
+//
+// For the decoding rules, please see package rlp.
+func (msg Msg) Decode(val interface{}) error {
+ s := rlp.NewListStream(msg.Payload, uint64(msg.Size))
+ return s.Decode(val)
+}
+
+// Discard reads any remaining payload data into a black hole.
+func (msg Msg) Discard() error {
+ _, err := io.Copy(ioutil.Discard, msg.Payload)
+ return err
+}
+
+type MsgReader interface {
+ ReadMsg() (Msg, error)
+}
+
+type MsgWriter interface {
+ // WriteMsg sends an existing message.
+ // The Payload reader of the message is consumed.
+ // Note that messages can be sent only once.
+ WriteMsg(Msg) error
+
+ // EncodeMsg writes an RLP-encoded message with the given
+ // code and data elements.
+ EncodeMsg(code uint64, data ...interface{}) error
+}
+
+// MsgReadWriter provides reading and writing of encoded messages.
+type MsgReadWriter interface {
+ MsgReader
+ MsgWriter
+}
+
+var magicToken = []byte{34, 64, 8, 145}
+
+func writeMsg(w io.Writer, msg Msg) error {
+ // TODO: handle case when Size + len(code) + len(listhdr) overflows uint32
+ code := ethutil.Encode(uint32(msg.Code))
+ listhdr := makeListHeader(msg.Size + uint32(len(code)))
+ payloadLen := uint32(len(listhdr)) + uint32(len(code)) + msg.Size
+
+ start := make([]byte, 8)
+ copy(start, magicToken)
+ binary.BigEndian.PutUint32(start[4:], payloadLen)
+
+ for _, b := range [][]byte{start, listhdr, code} {
+ if _, err := w.Write(b); err != nil {
+ return err
+ }
+ }
+ _, err := io.CopyN(w, msg.Payload, int64(msg.Size))
+ return err
+}
+
+func makeListHeader(length uint32) []byte {
+ if length < 56 {
+ return []byte{byte(length + 0xc0)}
+ }
+ enc := big.NewInt(int64(length)).Bytes()
+ lenb := byte(len(enc)) + 0xf7
+ return append([]byte{lenb}, enc...)
+}
+
+// readMsg reads a message header from r.
+// It takes an rlp.ByteReader to ensure that the decoding doesn't buffer.
+func readMsg(r rlp.ByteReader) (msg Msg, err error) {
+ // read magic and payload size
+ start := make([]byte, 8)
+ if _, err = io.ReadFull(r, start); err != nil {
+ return msg, newPeerError(errRead, "%v", err)
+ }
+ if !bytes.HasPrefix(start, magicToken) {
+ return msg, newPeerError(errMagicTokenMismatch, "got %x, want %x", start[:4], magicToken)
+ }
+ size := binary.BigEndian.Uint32(start[4:])
+
+ // decode start of RLP message to get the message code
+ posr := &postrack{r, 0}
+ s := rlp.NewStream(posr)
+ if _, err := s.List(); err != nil {
+ return msg, err
+ }
+ code, err := s.Uint()
+ if err != nil {
+ return msg, err
+ }
+ payloadsize := size - posr.p
+ return Msg{code, payloadsize, io.LimitReader(r, int64(payloadsize))}, nil
+}
+
+// postrack wraps an rlp.ByteReader with a position counter.
+type postrack struct {
+ r rlp.ByteReader
+ p uint32
+}
+
+func (r *postrack) Read(buf []byte) (int, error) {
+ n, err := r.r.Read(buf)
+ r.p += uint32(n)
+ return n, err
+}
+
+func (r *postrack) ReadByte() (byte, error) {
+ b, err := r.r.ReadByte()
+ if err == nil {
+ r.p++
+ }
+ return b, err
+}
+
+// MsgPipe creates a message pipe. Reads on one end are matched
+// with writes on the other. The pipe is full-duplex, both ends
+// implement MsgReadWriter.
+func MsgPipe() (*MsgPipeRW, *MsgPipeRW) {
+ var (
+ c1, c2 = make(chan Msg), make(chan Msg)
+ closing = make(chan struct{})
+ closed = new(int32)
+ rw1 = &MsgPipeRW{c1, c2, closing, closed}
+ rw2 = &MsgPipeRW{c2, c1, closing, closed}
+ )
+ return rw1, rw2
+}
+
+// ErrPipeClosed is returned from pipe operations after the
+// pipe has been closed.
+var ErrPipeClosed = errors.New("p2p: read or write on closed message pipe")
+
+// MsgPipeRW is an endpoint of a MsgReadWriter pipe.
+type MsgPipeRW struct {
+ w chan<- Msg
+ r <-chan Msg
+ closing chan struct{}
+ closed *int32
+}
+
+// WriteMsg sends a messsage on the pipe.
+// It blocks until the receiver has consumed the message payload.
+func (p *MsgPipeRW) WriteMsg(msg Msg) error {
+ if atomic.LoadInt32(p.closed) == 0 {
+ consumed := make(chan struct{}, 1)
+ msg.Payload = &eofSignal{msg.Payload, int64(msg.Size), consumed}
+ select {
+ case p.w <- msg:
+ if msg.Size > 0 {
+ // wait for payload read or discard
+ <-consumed
+ }
+ return nil
+ case <-p.closing:
+ }
+ }
+ return ErrPipeClosed
+}
+
+// EncodeMsg is a convenient shorthand for sending an RLP-encoded message.
+func (p *MsgPipeRW) EncodeMsg(code uint64, data ...interface{}) error {
+ return p.WriteMsg(NewMsg(code, data...))
+}
+
+// ReadMsg returns a message sent on the other end of the pipe.
+func (p *MsgPipeRW) ReadMsg() (Msg, error) {
+ if atomic.LoadInt32(p.closed) == 0 {
+ select {
+ case msg := <-p.r:
+ return msg, nil
+ case <-p.closing:
+ }
+ }
+ return Msg{}, ErrPipeClosed
+}
+
+// Close unblocks any pending ReadMsg and WriteMsg calls on both ends
+// of the pipe. They will return ErrPipeClosed. Note that Close does
+// not interrupt any reads from a message payload.
+func (p *MsgPipeRW) Close() error {
+ if atomic.AddInt32(p.closed, 1) != 1 {
+ // someone else is already closing
+ atomic.StoreInt32(p.closed, 1) // avoid overflow
+ return nil
+ }
+ close(p.closing)
+ return nil
+}
diff --git a/p2p/message_test.go b/p2p/message_test.go
new file mode 100644
index 000000000..066d2516d
--- /dev/null
+++ b/p2p/message_test.go
@@ -0,0 +1,133 @@
+package p2p
+
+import (
+ "bytes"
+ "fmt"
+ "io/ioutil"
+ "runtime"
+ "testing"
+ "time"
+
+ "github.com/ethereum/go-ethereum/ethutil"
+)
+
+func TestNewMsg(t *testing.T) {
+ msg := NewMsg(3, 1, "000")
+ if msg.Code != 3 {
+ t.Errorf("incorrect code %d, want %d", msg.Code)
+ }
+ if msg.Size != 5 {
+ t.Errorf("incorrect size %d, want %d", msg.Size, 5)
+ }
+ pl, _ := ioutil.ReadAll(msg.Payload)
+ expect := []byte{0x01, 0x83, 0x30, 0x30, 0x30}
+ if !bytes.Equal(pl, expect) {
+ t.Errorf("incorrect payload content, got %x, want %x", pl, expect)
+ }
+}
+
+func TestEncodeDecodeMsg(t *testing.T) {
+ msg := NewMsg(3, 1, "000")
+ buf := new(bytes.Buffer)
+ if err := writeMsg(buf, msg); err != nil {
+ t.Fatalf("encodeMsg error: %v", err)
+ }
+ // t.Logf("encoded: %x", buf.Bytes())
+
+ decmsg, err := readMsg(buf)
+ if err != nil {
+ t.Fatalf("readMsg error: %v", err)
+ }
+ if decmsg.Code != 3 {
+ t.Errorf("incorrect code %d, want %d", decmsg.Code, 3)
+ }
+ if decmsg.Size != 5 {
+ t.Errorf("incorrect size %d, want %d", decmsg.Size, 5)
+ }
+
+ var data struct {
+ I uint
+ S string
+ }
+ if err := decmsg.Decode(&data); err != nil {
+ t.Fatalf("Decode error: %v", err)
+ }
+ if data.I != 1 {
+ t.Errorf("incorrect data.I: got %v, expected %d", data.I, 1)
+ }
+ if data.S != "000" {
+ t.Errorf("incorrect data.S: got %q, expected %q", data.S, "000")
+ }
+}
+
+func TestDecodeRealMsg(t *testing.T) {
+ data := ethutil.Hex2Bytes("2240089100000080f87e8002b5457468657265756d282b2b292f5065657220536572766572204f6e652f76302e372e382f52656c656173652f4c696e75782f672b2bc082765fb84086dd80b7aefd6a6d2e3b93f4f300a86bfb6ef7bdc97cb03f793db6bb")
+ msg, err := readMsg(bytes.NewReader(data))
+ if err != nil {
+ t.Fatalf("unexpected error: %v", err)
+ }
+
+ if msg.Code != 0 {
+ t.Errorf("incorrect code %d, want %d", msg.Code, 0)
+ }
+}
+
+func ExampleMsgPipe() {
+ rw1, rw2 := MsgPipe()
+ go func() {
+ rw1.EncodeMsg(8, []byte{0, 0})
+ rw1.EncodeMsg(5, []byte{1, 1})
+ rw1.Close()
+ }()
+
+ for {
+ msg, err := rw2.ReadMsg()
+ if err != nil {
+ break
+ }
+ var data [1][]byte
+ msg.Decode(&data)
+ fmt.Printf("msg: %d, %x\n", msg.Code, data[0])
+ }
+ // Output:
+ // msg: 8, 0000
+ // msg: 5, 0101
+}
+
+func TestMsgPipeUnblockWrite(t *testing.T) {
+loop:
+ for i := 0; i < 100; i++ {
+ rw1, rw2 := MsgPipe()
+ done := make(chan struct{})
+ go func() {
+ if err := rw1.EncodeMsg(1); err == nil {
+ t.Error("EncodeMsg returned nil error")
+ } else if err != ErrPipeClosed {
+ t.Error("EncodeMsg returned wrong error: got %v, want %v", err, ErrPipeClosed)
+ }
+ close(done)
+ }()
+
+ // this call should ensure that EncodeMsg is waiting to
+ // deliver sometimes. if this isn't done, Close is likely to
+ // be executed before EncodeMsg starts and then we won't test
+ // all the cases.
+ runtime.Gosched()
+
+ rw2.Close()
+ select {
+ case <-done:
+ case <-time.After(200 * time.Millisecond):
+ t.Errorf("write didn't unblock")
+ break loop
+ }
+ }
+}
+
+// This test should panic if concurrent close isn't implemented correctly.
+func TestMsgPipeConcurrentClose(t *testing.T) {
+ rw1, _ := MsgPipe()
+ for i := 0; i < 10; i++ {
+ go rw1.Close()
+ }
+}
diff --git a/p2p/natpmp.go b/p2p/natpmp.go
new file mode 100644
index 000000000..6714678c4
--- /dev/null
+++ b/p2p/natpmp.go
@@ -0,0 +1,55 @@
+package p2p
+
+import (
+ "fmt"
+ "net"
+ "time"
+
+ natpmp "github.com/jackpal/go-nat-pmp"
+)
+
+// Adapt the NAT-PMP protocol to the NAT interface
+
+// TODO:
+// + Register for changes to the external address.
+// + Re-register port mapping when router reboots.
+// + A mechanism for keeping a port mapping registered.
+// + Discover gateway address automatically.
+
+type natPMPClient struct {
+ client *natpmp.Client
+}
+
+// PMP returns a NAT traverser that uses NAT-PMP. The provided gateway
+// address should be the IP of your router.
+func PMP(gateway net.IP) (nat NAT) {
+ return &natPMPClient{natpmp.NewClient(gateway)}
+}
+
+func (*natPMPClient) String() string {
+ return "NAT-PMP"
+}
+
+func (n *natPMPClient) GetExternalAddress() (net.IP, error) {
+ response, err := n.client.GetExternalAddress()
+ if err != nil {
+ return nil, err
+ }
+ return response.ExternalIPAddress[:], nil
+}
+
+func (n *natPMPClient) AddPortMapping(protocol string, extport, intport int, name string, lifetime time.Duration) error {
+ if lifetime <= 0 {
+ return fmt.Errorf("lifetime must not be <= 0")
+ }
+ // Note order of port arguments is switched between our AddPortMapping and the client's AddPortMapping.
+ _, err := n.client.AddPortMapping(protocol, intport, extport, int(lifetime/time.Second))
+ return err
+}
+
+func (n *natPMPClient) DeletePortMapping(protocol string, externalPort, internalPort int) (err error) {
+ // To destroy a mapping, send an add-port with
+ // an internalPort of the internal port to destroy, an external port of zero and a time of zero.
+ _, err = n.client.AddPortMapping(protocol, internalPort, 0, 0)
+ return
+}
diff --git a/p2p/natupnp.go b/p2p/natupnp.go
new file mode 100644
index 000000000..2e0d8ce8d
--- /dev/null
+++ b/p2p/natupnp.go
@@ -0,0 +1,341 @@
+package p2p
+
+// Just enough UPnP to be able to forward ports
+//
+
+import (
+ "bytes"
+ "encoding/xml"
+ "errors"
+ "fmt"
+ "net"
+ "net/http"
+ "os"
+ "strconv"
+ "strings"
+ "time"
+)
+
+const (
+ upnpDiscoverAttempts = 3
+ upnpDiscoverTimeout = 5 * time.Second
+)
+
+// UPNP returns a NAT port mapper that uses UPnP. It will attempt to
+// discover the address of your router using UDP broadcasts.
+func UPNP() NAT {
+ return &upnpNAT{}
+}
+
+type upnpNAT struct {
+ serviceURL string
+ ourIP string
+}
+
+func (n *upnpNAT) String() string {
+ return "UPNP"
+}
+
+func (n *upnpNAT) discover() error {
+ if n.serviceURL != "" {
+ // already discovered
+ return nil
+ }
+
+ ssdp, err := net.ResolveUDPAddr("udp4", "239.255.255.250:1900")
+ if err != nil {
+ return err
+ }
+ // TODO: try on all network interfaces simultaneously.
+ // Broadcasting on 0.0.0.0 could select a random interface
+ // to send on (platform specific).
+ conn, err := net.ListenPacket("udp4", ":0")
+ if err != nil {
+ return err
+ }
+ defer conn.Close()
+
+ conn.SetDeadline(time.Now().Add(10 * time.Second))
+ st := "ST: urn:schemas-upnp-org:device:InternetGatewayDevice:1\r\n"
+ buf := bytes.NewBufferString(
+ "M-SEARCH * HTTP/1.1\r\n" +
+ "HOST: 239.255.255.250:1900\r\n" +
+ st +
+ "MAN: \"ssdp:discover\"\r\n" +
+ "MX: 2\r\n\r\n")
+ message := buf.Bytes()
+ answerBytes := make([]byte, 1024)
+ for i := 0; i < upnpDiscoverAttempts; i++ {
+ _, err = conn.WriteTo(message, ssdp)
+ if err != nil {
+ return err
+ }
+ nn, _, err := conn.ReadFrom(answerBytes)
+ if err != nil {
+ continue
+ }
+ answer := string(answerBytes[0:nn])
+ if strings.Index(answer, "\r\n"+st) < 0 {
+ continue
+ }
+ // HTTP header field names are case-insensitive.
+ // http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2
+ locString := "\r\nlocation: "
+ answer = strings.ToLower(answer)
+ locIndex := strings.Index(answer, locString)
+ if locIndex < 0 {
+ continue
+ }
+ loc := answer[locIndex+len(locString):]
+ endIndex := strings.Index(loc, "\r\n")
+ if endIndex < 0 {
+ continue
+ }
+ locURL := loc[0:endIndex]
+ var serviceURL string
+ serviceURL, err = getServiceURL(locURL)
+ if err != nil {
+ return err
+ }
+ var ourIP string
+ ourIP, err = getOurIP()
+ if err != nil {
+ return err
+ }
+ n.serviceURL = serviceURL
+ n.ourIP = ourIP
+ return nil
+ }
+ return errors.New("UPnP port discovery failed.")
+}
+
+func (n *upnpNAT) GetExternalAddress() (addr net.IP, err error) {
+ if err := n.discover(); err != nil {
+ return nil, err
+ }
+ info, err := n.getStatusInfo()
+ return net.ParseIP(info.externalIpAddress), err
+}
+
+func (n *upnpNAT) AddPortMapping(protocol string, extport, intport int, description string, lifetime time.Duration) error {
+ if err := n.discover(); err != nil {
+ return err
+ }
+
+ // A single concatenation would break ARM compilation.
+ message := "<u:AddPortMapping xmlns:u=\"urn:schemas-upnp-org:service:WANIPConnection:1\">\r\n" +
+ "<NewRemoteHost></NewRemoteHost><NewExternalPort>" + strconv.Itoa(extport)
+ message += "</NewExternalPort><NewProtocol>" + protocol + "</NewProtocol>"
+ message += "<NewInternalPort>" + strconv.Itoa(extport) + "</NewInternalPort>" +
+ "<NewInternalClient>" + n.ourIP + "</NewInternalClient>" +
+ "<NewEnabled>1</NewEnabled><NewPortMappingDescription>"
+ message += description +
+ "</NewPortMappingDescription><NewLeaseDuration>" + fmt.Sprint(lifetime/time.Second) +
+ "</NewLeaseDuration></u:AddPortMapping>"
+
+ // TODO: check response to see if the port was forwarded
+ _, err := soapRequest(n.serviceURL, "AddPortMapping", message)
+ return err
+}
+
+func (n *upnpNAT) DeletePortMapping(protocol string, externalPort, internalPort int) error {
+ if err := n.discover(); err != nil {
+ return err
+ }
+
+ message := "<u:DeletePortMapping xmlns:u=\"urn:schemas-upnp-org:service:WANIPConnection:1\">\r\n" +
+ "<NewRemoteHost></NewRemoteHost><NewExternalPort>" + strconv.Itoa(externalPort) +
+ "</NewExternalPort><NewProtocol>" + protocol + "</NewProtocol>" +
+ "</u:DeletePortMapping>"
+
+ // TODO: check response to see if the port was deleted
+ _, err := soapRequest(n.serviceURL, "DeletePortMapping", message)
+ return err
+}
+
+type statusInfo struct {
+ externalIpAddress string
+}
+
+func (n *upnpNAT) getStatusInfo() (info statusInfo, err error) {
+ message := "<u:GetStatusInfo xmlns:u=\"urn:schemas-upnp-org:service:WANIPConnection:1\">\r\n" +
+ "</u:GetStatusInfo>"
+
+ var response *http.Response
+ response, err = soapRequest(n.serviceURL, "GetStatusInfo", message)
+ if err != nil {
+ return
+ }
+
+ // TODO: Write a soap reply parser. It has to eat the Body and envelope tags...
+
+ response.Body.Close()
+ return
+}
+
+// service represents the Service type in an UPnP xml description.
+// Only the parts we care about are present and thus the xml may have more
+// fields than present in the structure.
+type service struct {
+ ServiceType string `xml:"serviceType"`
+ ControlURL string `xml:"controlURL"`
+}
+
+// deviceList represents the deviceList type in an UPnP xml description.
+// Only the parts we care about are present and thus the xml may have more
+// fields than present in the structure.
+type deviceList struct {
+ XMLName xml.Name `xml:"deviceList"`
+ Device []device `xml:"device"`
+}
+
+// serviceList represents the serviceList type in an UPnP xml description.
+// Only the parts we care about are present and thus the xml may have more
+// fields than present in the structure.
+type serviceList struct {
+ XMLName xml.Name `xml:"serviceList"`
+ Service []service `xml:"service"`
+}
+
+// device represents the device type in an UPnP xml description.
+// Only the parts we care about are present and thus the xml may have more
+// fields than present in the structure.
+type device struct {
+ XMLName xml.Name `xml:"device"`
+ DeviceType string `xml:"deviceType"`
+ DeviceList deviceList `xml:"deviceList"`
+ ServiceList serviceList `xml:"serviceList"`
+}
+
+// specVersion represents the specVersion in a UPnP xml description.
+// Only the parts we care about are present and thus the xml may have more
+// fields than present in the structure.
+type specVersion struct {
+ XMLName xml.Name `xml:"specVersion"`
+ Major int `xml:"major"`
+ Minor int `xml:"minor"`
+}
+
+// root represents the Root document for a UPnP xml description.
+// Only the parts we care about are present and thus the xml may have more
+// fields than present in the structure.
+type root struct {
+ XMLName xml.Name `xml:"root"`
+ SpecVersion specVersion
+ Device device
+}
+
+func getChildDevice(d *device, deviceType string) *device {
+ dl := d.DeviceList.Device
+ for i := 0; i < len(dl); i++ {
+ if dl[i].DeviceType == deviceType {
+ return &dl[i]
+ }
+ }
+ return nil
+}
+
+func getChildService(d *device, serviceType string) *service {
+ sl := d.ServiceList.Service
+ for i := 0; i < len(sl); i++ {
+ if sl[i].ServiceType == serviceType {
+ return &sl[i]
+ }
+ }
+ return nil
+}
+
+func getOurIP() (ip string, err error) {
+ hostname, err := os.Hostname()
+ if err != nil {
+ return
+ }
+ p, err := net.LookupIP(hostname)
+ if err != nil && len(p) > 0 {
+ return
+ }
+ return p[0].String(), nil
+}
+
+func getServiceURL(rootURL string) (url string, err error) {
+ r, err := http.Get(rootURL)
+ if err != nil {
+ return
+ }
+ defer r.Body.Close()
+ if r.StatusCode >= 400 {
+ err = errors.New(string(r.StatusCode))
+ return
+ }
+ var root root
+ err = xml.NewDecoder(r.Body).Decode(&root)
+
+ if err != nil {
+ return
+ }
+ a := &root.Device
+ if a.DeviceType != "urn:schemas-upnp-org:device:InternetGatewayDevice:1" {
+ err = errors.New("No InternetGatewayDevice")
+ return
+ }
+ b := getChildDevice(a, "urn:schemas-upnp-org:device:WANDevice:1")
+ if b == nil {
+ err = errors.New("No WANDevice")
+ return
+ }
+ c := getChildDevice(b, "urn:schemas-upnp-org:device:WANConnectionDevice:1")
+ if c == nil {
+ err = errors.New("No WANConnectionDevice")
+ return
+ }
+ d := getChildService(c, "urn:schemas-upnp-org:service:WANIPConnection:1")
+ if d == nil {
+ err = errors.New("No WANIPConnection")
+ return
+ }
+ url = combineURL(rootURL, d.ControlURL)
+ return
+}
+
+func combineURL(rootURL, subURL string) string {
+ protocolEnd := "://"
+ protoEndIndex := strings.Index(rootURL, protocolEnd)
+ a := rootURL[protoEndIndex+len(protocolEnd):]
+ rootIndex := strings.Index(a, "/")
+ return rootURL[0:protoEndIndex+len(protocolEnd)+rootIndex] + subURL
+}
+
+func soapRequest(url, function, message string) (r *http.Response, err error) {
+ fullMessage := "<?xml version=\"1.0\" ?>" +
+ "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\r\n" +
+ "<s:Body>" + message + "</s:Body></s:Envelope>"
+
+ req, err := http.NewRequest("POST", url, strings.NewReader(fullMessage))
+ if err != nil {
+ return
+ }
+ req.Header.Set("Content-Type", "text/xml ; charset=\"utf-8\"")
+ req.Header.Set("User-Agent", "Darwin/10.0.0, UPnP/1.0, MiniUPnPc/1.3")
+ //req.Header.Set("Transfer-Encoding", "chunked")
+ req.Header.Set("SOAPAction", "\"urn:schemas-upnp-org:service:WANIPConnection:1#"+function+"\"")
+ req.Header.Set("Connection", "Close")
+ req.Header.Set("Cache-Control", "no-cache")
+ req.Header.Set("Pragma", "no-cache")
+
+ r, err = http.DefaultClient.Do(req)
+ if err != nil {
+ return
+ }
+
+ if r.Body != nil {
+ defer r.Body.Close()
+ }
+
+ if r.StatusCode >= 400 {
+ // log.Stderr(function, r.StatusCode)
+ err = errors.New("Error " + strconv.Itoa(r.StatusCode) + " for " + function)
+ r = nil
+ return
+ }
+ return
+}
diff --git a/p2p/peer.go b/p2p/peer.go
new file mode 100644
index 000000000..86c4d7ab5
--- /dev/null
+++ b/p2p/peer.go
@@ -0,0 +1,462 @@
+package p2p
+
+import (
+ "bufio"
+ "bytes"
+ "fmt"
+ "io"
+ "io/ioutil"
+ "net"
+ "sort"
+ "sync"
+ "time"
+
+ "github.com/ethereum/go-ethereum/event"
+ "github.com/ethereum/go-ethereum/logger"
+)
+
+// peerAddr is the structure of a peer list element.
+// It is also a valid net.Addr.
+type peerAddr struct {
+ IP net.IP
+ Port uint64
+ Pubkey []byte // optional
+}
+
+func newPeerAddr(addr net.Addr, pubkey []byte) *peerAddr {
+ n := addr.Network()
+ if n != "tcp" && n != "tcp4" && n != "tcp6" {
+ // for testing with non-TCP
+ return &peerAddr{net.ParseIP("127.0.0.1"), 30303, pubkey}
+ }
+ ta := addr.(*net.TCPAddr)
+ return &peerAddr{ta.IP, uint64(ta.Port), pubkey}
+}
+
+func (d peerAddr) Network() string {
+ if d.IP.To4() != nil {
+ return "tcp4"
+ } else {
+ return "tcp6"
+ }
+}
+
+func (d peerAddr) String() string {
+ return fmt.Sprintf("%v:%d", d.IP, d.Port)
+}
+
+func (d peerAddr) RlpData() interface{} {
+ return []interface{}{d.IP, d.Port, d.Pubkey}
+}
+
+// Peer represents a remote peer.
+type Peer struct {
+ // Peers have all the log methods.
+ // Use them to display messages related to the peer.
+ *logger.Logger
+
+ infolock sync.Mutex
+ identity ClientIdentity
+ caps []Cap
+ listenAddr *peerAddr // what remote peer is listening on
+ dialAddr *peerAddr // non-nil if dialing
+
+ // The mutex protects the connection
+ // so only one protocol can write at a time.
+ writeMu sync.Mutex
+ conn net.Conn
+ bufconn *bufio.ReadWriter
+
+ // These fields maintain the running protocols.
+ protocols []Protocol
+ runBaseProtocol bool // for testing
+
+ runlock sync.RWMutex // protects running
+ running map[string]*proto
+
+ protoWG sync.WaitGroup
+ protoErr chan error
+ closed chan struct{}
+ disc chan DiscReason
+
+ activity event.TypeMux // for activity events
+
+ slot int // index into Server peer list
+
+ // These fields are kept so base protocol can access them.
+ // TODO: this should be one or more interfaces
+ ourID ClientIdentity // client id of the Server
+ ourListenAddr *peerAddr // listen addr of Server, nil if not listening
+ newPeerAddr chan<- *peerAddr // tell server about received peers
+ otherPeers func() []*Peer // should return the list of all peers
+ pubkeyHook func(*peerAddr) error // called at end of handshake to validate pubkey
+}
+
+// NewPeer returns a peer for testing purposes.
+func NewPeer(id ClientIdentity, caps []Cap) *Peer {
+ conn, _ := net.Pipe()
+ peer := newPeer(conn, nil, nil)
+ peer.setHandshakeInfo(id, nil, caps)
+ close(peer.closed)
+ return peer
+}
+
+func newServerPeer(server *Server, conn net.Conn, dialAddr *peerAddr) *Peer {
+ p := newPeer(conn, server.Protocols, dialAddr)
+ p.ourID = server.Identity
+ p.newPeerAddr = server.peerConnect
+ p.otherPeers = server.Peers
+ p.pubkeyHook = server.verifyPeer
+ p.runBaseProtocol = true
+
+ // laddr can be updated concurrently by NAT traversal.
+ // newServerPeer must be called with the server lock held.
+ if server.laddr != nil {
+ p.ourListenAddr = newPeerAddr(server.laddr, server.Identity.Pubkey())
+ }
+ return p
+}
+
+func newPeer(conn net.Conn, protocols []Protocol, dialAddr *peerAddr) *Peer {
+ p := &Peer{
+ Logger: logger.NewLogger("P2P " + conn.RemoteAddr().String()),
+ conn: conn,
+ dialAddr: dialAddr,
+ bufconn: bufio.NewReadWriter(bufio.NewReader(conn), bufio.NewWriter(conn)),
+ protocols: protocols,
+ running: make(map[string]*proto),
+ disc: make(chan DiscReason),
+ protoErr: make(chan error),
+ closed: make(chan struct{}),
+ }
+ return p
+}
+
+// Identity returns the client identity of the remote peer. The
+// identity can be nil if the peer has not yet completed the
+// handshake.
+func (p *Peer) Identity() ClientIdentity {
+ p.infolock.Lock()
+ defer p.infolock.Unlock()
+ return p.identity
+}
+
+// Caps returns the capabilities (supported subprotocols) of the remote peer.
+func (p *Peer) Caps() []Cap {
+ p.infolock.Lock()
+ defer p.infolock.Unlock()
+ return p.caps
+}
+
+func (p *Peer) setHandshakeInfo(id ClientIdentity, laddr *peerAddr, caps []Cap) {
+ p.infolock.Lock()
+ p.identity = id
+ p.listenAddr = laddr
+ p.caps = caps
+ p.infolock.Unlock()
+}
+
+// RemoteAddr returns the remote address of the network connection.
+func (p *Peer) RemoteAddr() net.Addr {
+ return p.conn.RemoteAddr()
+}
+
+// LocalAddr returns the local address of the network connection.
+func (p *Peer) LocalAddr() net.Addr {
+ return p.conn.LocalAddr()
+}
+
+// Disconnect terminates the peer connection with the given reason.
+// It returns immediately and does not wait until the connection is closed.
+func (p *Peer) Disconnect(reason DiscReason) {
+ select {
+ case p.disc <- reason:
+ case <-p.closed:
+ }
+}
+
+// String implements fmt.Stringer.
+func (p *Peer) String() string {
+ kind := "inbound"
+ p.infolock.Lock()
+ if p.dialAddr != nil {
+ kind = "outbound"
+ }
+ p.infolock.Unlock()
+ return fmt.Sprintf("Peer(%p %v %s)", p, p.conn.RemoteAddr(), kind)
+}
+
+const (
+ // maximum amount of time allowed for reading a message
+ msgReadTimeout = 5 * time.Second
+ // maximum amount of time allowed for writing a message
+ msgWriteTimeout = 5 * time.Second
+ // messages smaller than this many bytes will be read at
+ // once before passing them to a protocol.
+ wholePayloadSize = 64 * 1024
+)
+
+var (
+ inactivityTimeout = 2 * time.Second
+ disconnectGracePeriod = 2 * time.Second
+)
+
+func (p *Peer) loop() (reason DiscReason, err error) {
+ defer p.activity.Stop()
+ defer p.closeProtocols()
+ defer close(p.closed)
+ defer p.conn.Close()
+
+ // read loop
+ readMsg := make(chan Msg)
+ readErr := make(chan error)
+ readNext := make(chan bool, 1)
+ protoDone := make(chan struct{}, 1)
+ go p.readLoop(readMsg, readErr, readNext)
+ readNext <- true
+
+ if p.runBaseProtocol {
+ p.startBaseProtocol()
+ }
+
+loop:
+ for {
+ select {
+ case msg := <-readMsg:
+ // a new message has arrived.
+ var wait bool
+ if wait, err = p.dispatch(msg, protoDone); err != nil {
+ p.Errorf("msg dispatch error: %v\n", err)
+ reason = discReasonForError(err)
+ break loop
+ }
+ if !wait {
+ // Msg has already been read completely, continue with next message.
+ readNext <- true
+ }
+ p.activity.Post(time.Now())
+ case <-protoDone:
+ // protocol has consumed the message payload,
+ // we can continue reading from the socket.
+ readNext <- true
+
+ case err := <-readErr:
+ // read failed. there is no need to run the
+ // polite disconnect sequence because the connection
+ // is probably dead anyway.
+ // TODO: handle write errors as well
+ return DiscNetworkError, err
+ case err = <-p.protoErr:
+ reason = discReasonForError(err)
+ break loop
+ case reason = <-p.disc:
+ break loop
+ }
+ }
+
+ // wait for read loop to return.
+ close(readNext)
+ <-readErr
+ // tell the remote end to disconnect
+ done := make(chan struct{})
+ go func() {
+ p.conn.SetDeadline(time.Now().Add(disconnectGracePeriod))
+ p.writeMsg(NewMsg(discMsg, reason), disconnectGracePeriod)
+ io.Copy(ioutil.Discard, p.conn)
+ close(done)
+ }()
+ select {
+ case <-done:
+ case <-time.After(disconnectGracePeriod):
+ }
+ return reason, err
+}
+
+func (p *Peer) readLoop(msgc chan<- Msg, errc chan<- error, unblock <-chan bool) {
+ for _ = range unblock {
+ p.conn.SetReadDeadline(time.Now().Add(msgReadTimeout))
+ if msg, err := readMsg(p.bufconn); err != nil {
+ errc <- err
+ } else {
+ msgc <- msg
+ }
+ }
+ close(errc)
+}
+
+func (p *Peer) dispatch(msg Msg, protoDone chan struct{}) (wait bool, err error) {
+ proto, err := p.getProto(msg.Code)
+ if err != nil {
+ return false, err
+ }
+ if msg.Size <= wholePayloadSize {
+ // optimization: msg is small enough, read all
+ // of it and move on to the next message
+ buf, err := ioutil.ReadAll(msg.Payload)
+ if err != nil {
+ return false, err
+ }
+ msg.Payload = bytes.NewReader(buf)
+ proto.in <- msg
+ } else {
+ wait = true
+ pr := &eofSignal{msg.Payload, int64(msg.Size), protoDone}
+ msg.Payload = pr
+ proto.in <- msg
+ }
+ return wait, nil
+}
+
+func (p *Peer) startBaseProtocol() {
+ p.runlock.Lock()
+ defer p.runlock.Unlock()
+ p.running[""] = p.startProto(0, Protocol{
+ Length: baseProtocolLength,
+ Run: runBaseProtocol,
+ })
+}
+
+// startProtocols starts matching named subprotocols.
+func (p *Peer) startSubprotocols(caps []Cap) {
+ sort.Sort(capsByName(caps))
+
+ p.runlock.Lock()
+ defer p.runlock.Unlock()
+ offset := baseProtocolLength
+outer:
+ for _, cap := range caps {
+ for _, proto := range p.protocols {
+ if proto.Name == cap.Name &&
+ proto.Version == cap.Version &&
+ p.running[cap.Name] == nil {
+ p.running[cap.Name] = p.startProto(offset, proto)
+ offset += proto.Length
+ continue outer
+ }
+ }
+ }
+}
+
+func (p *Peer) startProto(offset uint64, impl Protocol) *proto {
+ rw := &proto{
+ in: make(chan Msg),
+ offset: offset,
+ maxcode: impl.Length,
+ peer: p,
+ }
+ p.protoWG.Add(1)
+ go func() {
+ err := impl.Run(p, rw)
+ if err == nil {
+ p.Infof("protocol %q returned", impl.Name)
+ err = newPeerError(errMisc, "protocol returned")
+ } else {
+ p.Errorf("protocol %q error: %v\n", impl.Name, err)
+ }
+ select {
+ case p.protoErr <- err:
+ case <-p.closed:
+ }
+ p.protoWG.Done()
+ }()
+ return rw
+}
+
+// getProto finds the protocol responsible for handling
+// the given message code.
+func (p *Peer) getProto(code uint64) (*proto, error) {
+ p.runlock.RLock()
+ defer p.runlock.RUnlock()
+ for _, proto := range p.running {
+ if code >= proto.offset && code < proto.offset+proto.maxcode {
+ return proto, nil
+ }
+ }
+ return nil, newPeerError(errInvalidMsgCode, "%d", code)
+}
+
+func (p *Peer) closeProtocols() {
+ p.runlock.RLock()
+ for _, p := range p.running {
+ close(p.in)
+ }
+ p.runlock.RUnlock()
+ p.protoWG.Wait()
+}
+
+// writeProtoMsg sends the given message on behalf of the given named protocol.
+func (p *Peer) writeProtoMsg(protoName string, msg Msg) error {
+ p.runlock.RLock()
+ proto, ok := p.running[protoName]
+ p.runlock.RUnlock()
+ if !ok {
+ return fmt.Errorf("protocol %s not handled by peer", protoName)
+ }
+ if msg.Code >= proto.maxcode {
+ return newPeerError(errInvalidMsgCode, "code %x is out of range for protocol %q", msg.Code, protoName)
+ }
+ msg.Code += proto.offset
+ return p.writeMsg(msg, msgWriteTimeout)
+}
+
+// writeMsg writes a message to the connection.
+func (p *Peer) writeMsg(msg Msg, timeout time.Duration) error {
+ p.writeMu.Lock()
+ defer p.writeMu.Unlock()
+ p.conn.SetWriteDeadline(time.Now().Add(timeout))
+ if err := writeMsg(p.bufconn, msg); err != nil {
+ return newPeerError(errWrite, "%v", err)
+ }
+ return p.bufconn.Flush()
+}
+
+type proto struct {
+ name string
+ in chan Msg
+ maxcode, offset uint64
+ peer *Peer
+}
+
+func (rw *proto) WriteMsg(msg Msg) error {
+ if msg.Code >= rw.maxcode {
+ return newPeerError(errInvalidMsgCode, "not handled")
+ }
+ msg.Code += rw.offset
+ return rw.peer.writeMsg(msg, msgWriteTimeout)
+}
+
+func (rw *proto) EncodeMsg(code uint64, data ...interface{}) error {
+ return rw.WriteMsg(NewMsg(code, data))
+}
+
+func (rw *proto) ReadMsg() (Msg, error) {
+ msg, ok := <-rw.in
+ if !ok {
+ return msg, io.EOF
+ }
+ msg.Code -= rw.offset
+ return msg, nil
+}
+
+// eofSignal wraps a reader with eof signaling. the eof channel is
+// closed when the wrapped reader returns an error or when count bytes
+// have been read.
+//
+type eofSignal struct {
+ wrapped io.Reader
+ count int64
+ eof chan<- struct{}
+}
+
+// note: when using eofSignal to detect whether a message payload
+// has been read, Read might not be called for zero sized messages.
+
+func (r *eofSignal) Read(buf []byte) (int, error) {
+ n, err := r.wrapped.Read(buf)
+ r.count -= int64(n)
+ if (err != nil || r.count <= 0) && r.eof != nil {
+ r.eof <- struct{}{} // tell Peer that msg has been consumed
+ r.eof = nil
+ }
+ return n, err
+}
diff --git a/p2p/peer_error.go b/p2p/peer_error.go
new file mode 100644
index 000000000..0eb7ec838
--- /dev/null
+++ b/p2p/peer_error.go
@@ -0,0 +1,133 @@
+package p2p
+
+import (
+ "fmt"
+)
+
+const (
+ errMagicTokenMismatch = iota
+ errRead
+ errWrite
+ errMisc
+ errInvalidMsgCode
+ errInvalidMsg
+ errP2PVersionMismatch
+ errPubkeyMissing
+ errPubkeyInvalid
+ errPubkeyForbidden
+ errProtocolBreach
+ errPingTimeout
+ errInvalidNetworkId
+ errInvalidProtocolVersion
+)
+
+var errorToString = map[int]string{
+ errMagicTokenMismatch: "Magic token mismatch",
+ errRead: "Read error",
+ errWrite: "Write error",
+ errMisc: "Misc error",
+ errInvalidMsgCode: "Invalid message code",
+ errInvalidMsg: "Invalid message",
+ errP2PVersionMismatch: "P2P Version Mismatch",
+ errPubkeyMissing: "Public key missing",
+ errPubkeyInvalid: "Public key invalid",
+ errPubkeyForbidden: "Public key forbidden",
+ errProtocolBreach: "Protocol Breach",
+ errPingTimeout: "Ping timeout",
+ errInvalidNetworkId: "Invalid network id",
+ errInvalidProtocolVersion: "Invalid protocol version",
+}
+
+type peerError struct {
+ Code int
+ message string
+}
+
+func newPeerError(code int, format string, v ...interface{}) *peerError {
+ desc, ok := errorToString[code]
+ if !ok {
+ panic("invalid error code")
+ }
+ err := &peerError{code, desc}
+ if format != "" {
+ err.message += ": " + fmt.Sprintf(format, v...)
+ }
+ return err
+}
+
+func (self *peerError) Error() string {
+ return self.message
+}
+
+type DiscReason byte
+
+const (
+ DiscRequested DiscReason = 0x00
+ DiscNetworkError = 0x01
+ DiscProtocolError = 0x02
+ DiscUselessPeer = 0x03
+ DiscTooManyPeers = 0x04
+ DiscAlreadyConnected = 0x05
+ DiscIncompatibleVersion = 0x06
+ DiscInvalidIdentity = 0x07
+ DiscQuitting = 0x08
+ DiscUnexpectedIdentity = 0x09
+ DiscSelf = 0x0a
+ DiscReadTimeout = 0x0b
+ DiscSubprotocolError = 0x10
+)
+
+var discReasonToString = [DiscSubprotocolError + 1]string{
+ DiscRequested: "Disconnect requested",
+ DiscNetworkError: "Network error",
+ DiscProtocolError: "Breach of protocol",
+ DiscUselessPeer: "Useless peer",
+ DiscTooManyPeers: "Too many peers",
+ DiscAlreadyConnected: "Already connected",
+ DiscIncompatibleVersion: "Incompatible P2P protocol version",
+ DiscInvalidIdentity: "Invalid node identity",
+ DiscQuitting: "Client quitting",
+ DiscUnexpectedIdentity: "Unexpected identity",
+ DiscSelf: "Connected to self",
+ DiscReadTimeout: "Read timeout",
+ DiscSubprotocolError: "Subprotocol error",
+}
+
+func (d DiscReason) String() string {
+ if len(discReasonToString) < int(d) {
+ return fmt.Sprintf("Unknown Reason(%d)", d)
+ }
+ return discReasonToString[d]
+}
+
+type discRequestedError DiscReason
+
+func (err discRequestedError) Error() string {
+ return fmt.Sprintf("disconnect requested: %v", DiscReason(err))
+}
+
+func discReasonForError(err error) DiscReason {
+ if reason, ok := err.(discRequestedError); ok {
+ return DiscReason(reason)
+ }
+ peerError, ok := err.(*peerError)
+ if !ok {
+ return DiscSubprotocolError
+ }
+ switch peerError.Code {
+ case errP2PVersionMismatch:
+ return DiscIncompatibleVersion
+ case errPubkeyMissing, errPubkeyInvalid:
+ return DiscInvalidIdentity
+ case errPubkeyForbidden:
+ return DiscUselessPeer
+ case errInvalidMsgCode, errMagicTokenMismatch, errProtocolBreach:
+ return DiscProtocolError
+ case errPingTimeout:
+ return DiscReadTimeout
+ case errRead, errWrite, errMisc:
+ return DiscNetworkError
+ default:
+ return DiscSubprotocolError
+ }
+}
diff --git a/p2p/peer_test.go b/p2p/peer_test.go
new file mode 100644
index 000000000..f7759786e
--- /dev/null
+++ b/p2p/peer_test.go
@@ -0,0 +1,295 @@
+package p2p
+
+import (
+ "bufio"
+ "bytes"
+ "encoding/hex"
+ "io"
+ "io/ioutil"
+ "net"
+ "reflect"
+ "testing"
+ "time"
+)
+
+var discard = Protocol{
+ Name: "discard",
+ Length: 1,
+ Run: func(p *Peer, rw MsgReadWriter) error {
+ for {
+ msg, err := rw.ReadMsg()
+ if err != nil {
+ return err
+ }
+ if err = msg.Discard(); err != nil {
+ return err
+ }
+ }
+ },
+}
+
+func testPeer(protos []Protocol) (net.Conn, *Peer, <-chan error) {
+ conn1, conn2 := net.Pipe()
+ id := NewSimpleClientIdentity("test", "0", "0", "public key")
+ peer := newPeer(conn1, protos, nil)
+ peer.ourID = id
+ peer.pubkeyHook = func(*peerAddr) error { return nil }
+ errc := make(chan error, 1)
+ go func() {
+ _, err := peer.loop()
+ errc <- err
+ }()
+ return conn2, peer, errc
+}
+
+func TestPeerProtoReadMsg(t *testing.T) {
+ defer testlog(t).detach()
+
+ done := make(chan struct{})
+ proto := Protocol{
+ Name: "a",
+ Length: 5,
+ Run: func(peer *Peer, rw MsgReadWriter) error {
+ msg, err := rw.ReadMsg()
+ if err != nil {
+ t.Errorf("read error: %v", err)
+ }
+ if msg.Code != 2 {
+ t.Errorf("incorrect msg code %d relayed to protocol", msg.Code)
+ }
+ data, err := ioutil.ReadAll(msg.Payload)
+ if err != nil {
+ t.Errorf("payload read error: %v", err)
+ }
+ expdata, _ := hex.DecodeString("0183303030")
+ if !bytes.Equal(expdata, data) {
+ t.Errorf("incorrect msg data %x", data)
+ }
+ close(done)
+ return nil
+ },
+ }
+
+ net, peer, errc := testPeer([]Protocol{proto})
+ defer net.Close()
+ peer.startSubprotocols([]Cap{proto.cap()})
+
+ writeMsg(net, NewMsg(18, 1, "000"))
+ select {
+ case <-done:
+ case err := <-errc:
+ t.Errorf("peer returned: %v", err)
+ case <-time.After(2 * time.Second):
+ t.Errorf("receive timeout")
+ }
+}
+
+func TestPeerProtoReadLargeMsg(t *testing.T) {
+ defer testlog(t).detach()
+
+ msgsize := uint32(10 * 1024 * 1024)
+ done := make(chan struct{})
+ proto := Protocol{
+ Name: "a",
+ Length: 5,
+ Run: func(peer *Peer, rw MsgReadWriter) error {
+ msg, err := rw.ReadMsg()
+ if err != nil {
+ t.Errorf("read error: %v", err)
+ }
+ if msg.Size != msgsize+4 {
+ t.Errorf("incorrect msg.Size, got %d, expected %d", msg.Size, msgsize)
+ }
+ msg.Discard()
+ close(done)
+ return nil
+ },
+ }
+
+ net, peer, errc := testPeer([]Protocol{proto})
+ defer net.Close()
+ peer.startSubprotocols([]Cap{proto.cap()})
+
+ writeMsg(net, NewMsg(18, make([]byte, msgsize)))
+ select {
+ case <-done:
+ case err := <-errc:
+ t.Errorf("peer returned: %v", err)
+ case <-time.After(2 * time.Second):
+ t.Errorf("receive timeout")
+ }
+}
+
+func TestPeerProtoEncodeMsg(t *testing.T) {
+ defer testlog(t).detach()
+
+ proto := Protocol{
+ Name: "a",
+ Length: 2,
+ Run: func(peer *Peer, rw MsgReadWriter) error {
+ if err := rw.EncodeMsg(2); err == nil {
+ t.Error("expected error for out-of-range msg code, got nil")
+ }
+ if err := rw.EncodeMsg(1); err != nil {
+ t.Errorf("write error: %v", err)
+ }
+ return nil
+ },
+ }
+ net, peer, _ := testPeer([]Protocol{proto})
+ defer net.Close()
+ peer.startSubprotocols([]Cap{proto.cap()})
+
+ bufr := bufio.NewReader(net)
+ msg, err := readMsg(bufr)
+ if err != nil {
+ t.Errorf("read error: %v", err)
+ }
+ if msg.Code != 17 {
+ t.Errorf("incorrect message code: got %d, expected %d", msg.Code, 17)
+ }
+}
+
+func TestPeerWrite(t *testing.T) {
+ defer testlog(t).detach()
+
+ net, peer, peerErr := testPeer([]Protocol{discard})
+ defer net.Close()
+ peer.startSubprotocols([]Cap{discard.cap()})
+
+ // test write errors
+ if err := peer.writeProtoMsg("b", NewMsg(3)); err == nil {
+ t.Errorf("expected error for unknown protocol, got nil")
+ }
+ if err := peer.writeProtoMsg("discard", NewMsg(8)); err == nil {
+ t.Errorf("expected error for out-of-range msg code, got nil")
+ } else if perr, ok := err.(*peerError); !ok || perr.Code != errInvalidMsgCode {
+ t.Errorf("wrong error for out-of-range msg code, got %#v", err)
+ }
+
+ // setup for reading the message on the other end
+ read := make(chan struct{})
+ go func() {
+ bufr := bufio.NewReader(net)
+ msg, err := readMsg(bufr)
+ if err != nil {
+ t.Errorf("read error: %v", err)
+ } else if msg.Code != 16 {
+ t.Errorf("wrong code, got %d, expected %d", msg.Code, 16)
+ }
+ msg.Discard()
+ close(read)
+ }()
+
+ // test succcessful write
+ if err := peer.writeProtoMsg("discard", NewMsg(0)); err != nil {
+ t.Errorf("expect no error for known protocol: %v", err)
+ }
+ select {
+ case <-read:
+ case err := <-peerErr:
+ t.Fatalf("peer stopped: %v", err)
+ }
+}
+
+func TestPeerActivity(t *testing.T) {
+ // shorten inactivityTimeout while this test is running
+ oldT := inactivityTimeout
+ defer func() { inactivityTimeout = oldT }()
+ inactivityTimeout = 20 * time.Millisecond
+
+ net, peer, peerErr := testPeer([]Protocol{discard})
+ defer net.Close()
+ peer.startSubprotocols([]Cap{discard.cap()})
+
+ sub := peer.activity.Subscribe(time.Time{})
+ defer sub.Unsubscribe()
+
+ for i := 0; i < 6; i++ {
+ writeMsg(net, NewMsg(16))
+ select {
+ case <-sub.Chan():
+ case <-time.After(inactivityTimeout / 2):
+ t.Fatal("no event within ", inactivityTimeout/2)
+ case err := <-peerErr:
+ t.Fatal("peer error", err)
+ }
+ }
+
+ select {
+ case <-time.After(inactivityTimeout * 2):
+ case <-sub.Chan():
+ t.Fatal("got activity event while connection was inactive")
+ case err := <-peerErr:
+ t.Fatal("peer error", err)
+ }
+}
+
+func TestNewPeer(t *testing.T) {
+ id := NewSimpleClientIdentity("clientid", "version", "customid", "pubkey")
+ caps := []Cap{{"foo", 2}, {"bar", 3}}
+ p := NewPeer(id, caps)
+ if !reflect.DeepEqual(p.Caps(), caps) {
+ t.Errorf("Caps mismatch: got %v, expected %v", p.Caps(), caps)
+ }
+ if p.Identity() != id {
+ t.Errorf("Identity mismatch: got %v, expected %v", p.Identity(), id)
+ }
+ // Should not hang.
+ p.Disconnect(DiscAlreadyConnected)
+}
+
+func TestEOFSignal(t *testing.T) {
+ rb := make([]byte, 10)
+
+ // empty reader
+ eof := make(chan struct{}, 1)
+ sig := &eofSignal{new(bytes.Buffer), 0, eof}
+ if n, err := sig.Read(rb); n != 0 || err != io.EOF {
+ t.Errorf("Read returned unexpected values: (%v, %v)", n, err)
+ }
+ select {
+ case <-eof:
+ default:
+ t.Error("EOF chan not signaled")
+ }
+
+ // count before error
+ eof = make(chan struct{}, 1)
+ sig = &eofSignal{bytes.NewBufferString("aaaaaaaa"), 4, eof}
+ if n, err := sig.Read(rb); n != 8 || err != nil {
+ t.Errorf("Read returned unexpected values: (%v, %v)", n, err)
+ }
+ select {
+ case <-eof:
+ default:
+ t.Error("EOF chan not signaled")
+ }
+
+ // error before count
+ eof = make(chan struct{}, 1)
+ sig = &eofSignal{bytes.NewBufferString("aaaa"), 999, eof}
+ if n, err := sig.Read(rb); n != 4 || err != nil {
+ t.Errorf("Read returned unexpected values: (%v, %v)", n, err)
+ }
+ if n, err := sig.Read(rb); n != 0 || err != io.EOF {
+ t.Errorf("Read returned unexpected values: (%v, %v)", n, err)
+ }
+ select {
+ case <-eof:
+ default:
+ t.Error("EOF chan not signaled")
+ }
+
+ // no signal if neither occurs
+ eof = make(chan struct{}, 1)
+ sig = &eofSignal{bytes.NewBufferString("aaaaaaaaaaaaaaaaaaaaa"), 999, eof}
+ if n, err := sig.Read(rb); n != 10 || err != nil {
+ t.Errorf("Read returned unexpected values: (%v, %v)", n, err)
+ }
+ select {
+ case <-eof:
+ t.Error("unexpected EOF signal")
+ default:
+ }
+}
diff --git a/p2p/protocol.go b/p2p/protocol.go
new file mode 100644
index 000000000..3f52205f5
--- /dev/null
+++ b/p2p/protocol.go
@@ -0,0 +1,294 @@
+package p2p
+
+import (
+ "bytes"
+ "time"
+
+ "github.com/ethereum/go-ethereum/ethutil"
+)
+
+// Protocol represents a P2P subprotocol implementation.
+type Protocol struct {
+ // Name should contain the official protocol name,
+ // often a three-letter word.
+ Name string
+
+ // Version should contain the version number of the protocol.
+ Version uint
+
+ // Length should contain the number of message codes used
+ // by the protocol.
+ Length uint64
+
+ // Run is called in a new groutine when the protocol has been
+ // negotiated with a peer. It should read and write messages from
+ // rw. The Payload for each message must be fully consumed.
+ //
+ // The peer connection is closed when Start returns. It should return
+ // any protocol-level error (such as an I/O error) that is
+ // encountered.
+ Run func(peer *Peer, rw MsgReadWriter) error
+}
+
+func (p Protocol) cap() Cap {
+ return Cap{p.Name, p.Version}
+}
+
+const (
+ baseProtocolVersion = 2
+ baseProtocolLength = uint64(16)
+ baseProtocolMaxMsgSize = 10 * 1024 * 1024
+)
+
+const (
+ // devp2p message codes
+ handshakeMsg = 0x00
+ discMsg = 0x01
+ pingMsg = 0x02
+ pongMsg = 0x03
+ getPeersMsg = 0x04
+ peersMsg = 0x05
+)
+
+// handshake is the structure of a handshake list.
+type handshake struct {
+ Version uint64
+ ID string
+ Caps []Cap
+ ListenPort uint64
+ NodeID []byte
+}
+
+func (h *handshake) String() string {
+ return h.ID
+}
+func (h *handshake) Pubkey() []byte {
+ return h.NodeID
+}
+
+// Cap is the structure of a peer capability.
+type Cap struct {
+ Name string
+ Version uint
+}
+
+func (cap Cap) RlpData() interface{} {
+ return []interface{}{cap.Name, cap.Version}
+}
+
+type capsByName []Cap
+
+func (cs capsByName) Len() int { return len(cs) }
+func (cs capsByName) Less(i, j int) bool { return cs[i].Name < cs[j].Name }
+func (cs capsByName) Swap(i, j int) { cs[i], cs[j] = cs[j], cs[i] }
+
+type baseProtocol struct {
+ rw MsgReadWriter
+ peer *Peer
+}
+
+func runBaseProtocol(peer *Peer, rw MsgReadWriter) error {
+ bp := &baseProtocol{rw, peer}
+ if err := bp.doHandshake(rw); err != nil {
+ return err
+ }
+ // run main loop
+ quit := make(chan error, 1)
+ go func() {
+ for {
+ if err := bp.handle(rw); err != nil {
+ quit <- err
+ break
+ }
+ }
+ }()
+ return bp.loop(quit)
+}
+
+var pingTimeout = 2 * time.Second
+
+func (bp *baseProtocol) loop(quit <-chan error) error {
+ ping := time.NewTimer(pingTimeout)
+ activity := bp.peer.activity.Subscribe(time.Time{})
+ lastActive := time.Time{}
+ defer ping.Stop()
+ defer activity.Unsubscribe()
+
+ getPeersTick := time.NewTicker(10 * time.Second)
+ defer getPeersTick.Stop()
+ err := bp.rw.EncodeMsg(getPeersMsg)
+
+ for err == nil {
+ select {
+ case err = <-quit:
+ return err
+ case <-getPeersTick.C:
+ err = bp.rw.EncodeMsg(getPeersMsg)
+ case event := <-activity.Chan():
+ ping.Reset(pingTimeout)
+ lastActive = event.(time.Time)
+ case t := <-ping.C:
+ if lastActive.Add(pingTimeout * 2).Before(t) {
+ err = newPeerError(errPingTimeout, "")
+ } else if lastActive.Add(pingTimeout).Before(t) {
+ err = bp.rw.EncodeMsg(pingMsg)
+ }
+ }
+ }
+ return err
+}
+
+func (bp *baseProtocol) handle(rw MsgReadWriter) error {
+ msg, err := rw.ReadMsg()
+ if err != nil {
+ return err
+ }
+ if msg.Size > baseProtocolMaxMsgSize {
+ return newPeerError(errMisc, "message too big")
+ }
+ // make sure that the payload has been fully consumed
+ defer msg.Discard()
+
+ switch msg.Code {
+ case handshakeMsg:
+ return newPeerError(errProtocolBreach, "extra handshake received")
+
+ case discMsg:
+ var reason [1]DiscReason
+ if err := msg.Decode(&reason); err != nil {
+ return err
+ }
+ return discRequestedError(reason[0])
+
+ case pingMsg:
+ return bp.rw.EncodeMsg(pongMsg)
+
+ case pongMsg:
+
+ case getPeersMsg:
+ peers := bp.peerList()
+ // this is dangerous. the spec says that we should _delay_
+ // sending the response if no new information is available.
+ // this means that would need to send a response later when
+ // new peers become available.
+ //
+ // TODO: add event mechanism to notify baseProtocol for new peers
+ if len(peers) > 0 {
+ return bp.rw.EncodeMsg(peersMsg, peers)
+ }
+
+ case peersMsg:
+ var peers []*peerAddr
+ if err := msg.Decode(&peers); err != nil {
+ return err
+ }
+ for _, addr := range peers {
+ bp.peer.Debugf("received peer suggestion: %v", addr)
+ bp.peer.newPeerAddr <- addr
+ }
+
+ default:
+ return newPeerError(errInvalidMsgCode, "unknown message code %v", msg.Code)
+ }
+ return nil
+}
+
+func (bp *baseProtocol) doHandshake(rw MsgReadWriter) error {
+ // send our handshake
+ if err := rw.WriteMsg(bp.handshakeMsg()); err != nil {
+ return err
+ }
+
+ // read and handle remote handshake
+ msg, err := rw.ReadMsg()
+ if err != nil {
+ return err
+ }
+ if msg.Code != handshakeMsg {
+ return newPeerError(errProtocolBreach, "first message must be handshake, got %x", msg.Code)
+ }
+ if msg.Size > baseProtocolMaxMsgSize {
+ return newPeerError(errMisc, "message too big")
+ }
+
+ var hs handshake
+ if err := msg.Decode(&hs); err != nil {
+ return err
+ }
+
+ // validate handshake info
+ if hs.Version != baseProtocolVersion {
+ return newPeerError(errP2PVersionMismatch, "Require protocol %d, received %d\n",
+ baseProtocolVersion, hs.Version)
+ }
+ if len(hs.NodeID) == 0 {
+ return newPeerError(errPubkeyMissing, "")
+ }
+ if len(hs.NodeID) != 64 {
+ return newPeerError(errPubkeyInvalid, "require 512 bit, got %v", len(hs.NodeID)*8)
+ }
+ if da := bp.peer.dialAddr; da != nil {
+ // verify that the peer we wanted to connect to
+ // actually holds the target public key.
+ if da.Pubkey != nil && !bytes.Equal(da.Pubkey, hs.NodeID) {
+ return newPeerError(errPubkeyForbidden, "dial address pubkey mismatch")
+ }
+ }
+ pa := newPeerAddr(bp.peer.conn.RemoteAddr(), hs.NodeID)
+ if err := bp.peer.pubkeyHook(pa); err != nil {
+ return newPeerError(errPubkeyForbidden, "%v", err)
+ }
+
+ // TODO: remove Caps with empty name
+
+ var addr *peerAddr
+ if hs.ListenPort != 0 {
+ addr = newPeerAddr(bp.peer.conn.RemoteAddr(), hs.NodeID)
+ addr.Port = hs.ListenPort
+ }
+ bp.peer.setHandshakeInfo(&hs, addr, hs.Caps)
+ bp.peer.startSubprotocols(hs.Caps)
+ return nil
+}
+
+func (bp *baseProtocol) handshakeMsg() Msg {
+ var (
+ port uint64
+ caps []interface{}
+ )
+ if bp.peer.ourListenAddr != nil {
+ port = bp.peer.ourListenAddr.Port
+ }
+ for _, proto := range bp.peer.protocols {
+ caps = append(caps, proto.cap())
+ }
+ return NewMsg(handshakeMsg,
+ baseProtocolVersion,
+ bp.peer.ourID.String(),
+ caps,
+ port,
+ bp.peer.ourID.Pubkey()[1:],
+ )
+}
+
+func (bp *baseProtocol) peerList() []ethutil.RlpEncodable {
+ peers := bp.peer.otherPeers()
+ ds := make([]ethutil.RlpEncodable, 0, len(peers))
+ for _, p := range peers {
+ p.infolock.Lock()
+ addr := p.listenAddr
+ p.infolock.Unlock()
+ // filter out this peer and peers that are not listening or
+ // have not completed the handshake.
+ // TODO: track previously sent peers and exclude them as well.
+ if p == bp.peer || addr == nil {
+ continue
+ }
+ ds = append(ds, addr)
+ }
+ ourAddr := bp.peer.ourListenAddr
+ if ourAddr != nil && !ourAddr.IP.IsLoopback() && !ourAddr.IP.IsUnspecified() {
+ ds = append(ds, ourAddr)
+ }
+ return ds
+}
diff --git a/p2p/protocol_test.go b/p2p/protocol_test.go
new file mode 100644
index 000000000..65f26fb12
--- /dev/null
+++ b/p2p/protocol_test.go
@@ -0,0 +1,58 @@
+package p2p
+
+import (
+ "fmt"
+ "testing"
+)
+
+func TestBaseProtocolDisconnect(t *testing.T) {
+ peer := NewPeer(NewSimpleClientIdentity("p1", "", "", "foo"), nil)
+ peer.ourID = NewSimpleClientIdentity("p2", "", "", "bar")
+ peer.pubkeyHook = func(*peerAddr) error { return nil }
+
+ rw1, rw2 := MsgPipe()
+ done := make(chan struct{})
+ go func() {
+ if err := expectMsg(rw2, handshakeMsg); err != nil {
+ t.Error(err)
+ }
+ err := rw2.EncodeMsg(handshakeMsg,
+ baseProtocolVersion,
+ "",
+ []interface{}{},
+ 0,
+ make([]byte, 64),
+ )
+ if err != nil {
+ t.Error(err)
+ }
+ if err := expectMsg(rw2, getPeersMsg); err != nil {
+ t.Error(err)
+ }
+ if err := rw2.EncodeMsg(discMsg, DiscQuitting); err != nil {
+ t.Error(err)
+ }
+ close(done)
+ }()
+
+ if err := runBaseProtocol(peer, rw1); err == nil {
+ t.Errorf("base protocol returned without error")
+ } else if reason, ok := err.(discRequestedError); !ok || reason != DiscQuitting {
+ t.Errorf("base protocol returned wrong error: %v", err)
+ }
+ <-done
+}
+
+func expectMsg(r MsgReader, code uint64) error {
+ msg, err := r.ReadMsg()
+ if err != nil {
+ return err
+ }
+ if err := msg.Discard(); err != nil {
+ return err
+ }
+ if msg.Code != code {
+ return fmt.Errorf("wrong message code: got %d, expected %d", msg.Code, code)
+ }
+ return nil
+}
diff --git a/p2p/server.go b/p2p/server.go
new file mode 100644
index 000000000..8a6087566
--- /dev/null
+++ b/p2p/server.go
@@ -0,0 +1,467 @@
+package p2p
+
+import (
+ "bytes"
+ "errors"
+ "fmt"
+ "net"
+ "sync"
+ "time"
+
+ "github.com/ethereum/go-ethereum/logger"
+)
+
+const (
+ outboundAddressPoolSize = 500
+ defaultDialTimeout = 10 * time.Second
+ portMappingUpdateInterval = 15 * time.Minute
+ portMappingTimeout = 20 * time.Minute
+)
+
+var srvlog = logger.NewLogger("P2P Server")
+
+// Server manages all peer connections.
+//
+// The fields of Server are used as configuration parameters.
+// You should set them before starting the Server. Fields may not be
+// modified while the server is running.
+type Server struct {
+ // This field must be set to a valid client identity.
+ Identity ClientIdentity
+
+ // MaxPeers is the maximum number of peers that can be
+ // connected. It must be greater than zero.
+ MaxPeers int
+
+ // Protocols should contain the protocols supported
+ // by the server. Matching protocols are launched for
+ // each peer.
+ Protocols []Protocol
+
+ // If Blacklist is set to a non-nil value, the given Blacklist
+ // is used to verify peer connections.
+ Blacklist Blacklist
+
+ // If ListenAddr is set to a non-nil address, the server
+ // will listen for incoming connections.
+ //
+ // If the port is zero, the operating system will pick a port. The
+ // ListenAddr field will be updated with the actual address when
+ // the server is started.
+ ListenAddr string
+
+ // If set to a non-nil value, the given NAT port mapper
+ // is used to make the listening port available to the
+ // Internet.
+ NAT NAT
+
+ // If Dialer is set to a non-nil value, the given Dialer
+ // is used to dial outbound peer connections.
+ Dialer *net.Dialer
+
+ // If NoDial is true, the server will not dial any peers.
+ NoDial bool
+
+ // Hook for testing. This is useful because we can inhibit
+ // the whole protocol stack.
+ newPeerFunc peerFunc
+
+ lock sync.RWMutex
+ running bool
+ listener net.Listener
+ laddr *net.TCPAddr // real listen addr
+ peers []*Peer
+ peerSlots chan int
+ peerCount int
+
+ quit chan struct{}
+ wg sync.WaitGroup
+ peerConnect chan *peerAddr
+ peerDisconnect chan *Peer
+}
+
+// NAT is implemented by NAT traversal methods.
+type NAT interface {
+ GetExternalAddress() (net.IP, error)
+ AddPortMapping(protocol string, extport, intport int, name string, lifetime time.Duration) error
+ DeletePortMapping(protocol string, extport, intport int) error
+
+ // Should return name of the method.
+ String() string
+}
+
+type peerFunc func(srv *Server, c net.Conn, dialAddr *peerAddr) *Peer
+
+// Peers returns all connected peers.
+func (srv *Server) Peers() (peers []*Peer) {
+ srv.lock.RLock()
+ defer srv.lock.RUnlock()
+ for _, peer := range srv.peers {
+ if peer != nil {
+ peers = append(peers, peer)
+ }
+ }
+ return
+}
+
+// PeerCount returns the number of connected peers.
+func (srv *Server) PeerCount() int {
+ srv.lock.RLock()
+ defer srv.lock.RUnlock()
+ return srv.peerCount
+}
+
+// SuggestPeer injects an address into the outbound address pool.
+func (srv *Server) SuggestPeer(ip net.IP, port int, nodeID []byte) {
+ select {
+ case srv.peerConnect <- &peerAddr{ip, uint64(port), nodeID}:
+ default: // don't block
+ }
+}
+
+// Broadcast sends an RLP-encoded message to all connected peers.
+// This method is deprecated and will be removed later.
+func (srv *Server) Broadcast(protocol string, code uint64, data ...interface{}) {
+ var payload []byte
+ if data != nil {
+ payload = encodePayload(data...)
+ }
+ srv.lock.RLock()
+ defer srv.lock.RUnlock()
+ for _, peer := range srv.peers {
+ if peer != nil {
+ var msg = Msg{Code: code}
+ if data != nil {
+ msg.Payload = bytes.NewReader(payload)
+ msg.Size = uint32(len(payload))
+ }
+ peer.writeProtoMsg(protocol, msg)
+ }
+ }
+}
+
+// Start starts running the server.
+// Servers can be re-used and started again after stopping.
+func (srv *Server) Start() (err error) {
+ srv.lock.Lock()
+ defer srv.lock.Unlock()
+ if srv.running {
+ return errors.New("server already running")
+ }
+ srvlog.Infoln("Starting Server")
+
+ // initialize fields
+ if srv.Identity == nil {
+ return fmt.Errorf("Server.Identity must be set to a non-nil identity")
+ }
+ if srv.MaxPeers <= 0 {
+ return fmt.Errorf("Server.MaxPeers must be > 0")
+ }
+ srv.quit = make(chan struct{})
+ srv.peers = make([]*Peer, srv.MaxPeers)
+ srv.peerSlots = make(chan int, srv.MaxPeers)
+ srv.peerConnect = make(chan *peerAddr, outboundAddressPoolSize)
+ srv.peerDisconnect = make(chan *Peer)
+ if srv.newPeerFunc == nil {
+ srv.newPeerFunc = newServerPeer
+ }
+ if srv.Blacklist == nil {
+ srv.Blacklist = NewBlacklist()
+ }
+ if srv.Dialer == nil {
+ srv.Dialer = &net.Dialer{Timeout: defaultDialTimeout}
+ }
+
+ if srv.ListenAddr != "" {
+ if err := srv.startListening(); err != nil {
+ return err
+ }
+ }
+ if !srv.NoDial {
+ srv.wg.Add(1)
+ go srv.dialLoop()
+ }
+ if srv.NoDial && srv.ListenAddr == "" {
+ srvlog.Warnln("I will be kind-of useless, neither dialing nor listening.")
+ }
+
+ // make all slots available
+ for i := range srv.peers {
+ srv.peerSlots <- i
+ }
+ // note: discLoop is not part of WaitGroup
+ go srv.discLoop()
+ srv.running = true
+ return nil
+}
+
+func (srv *Server) startListening() error {
+ listener, err := net.Listen("tcp", srv.ListenAddr)
+ if err != nil {
+ return err
+ }
+ srv.ListenAddr = listener.Addr().String()
+ srv.laddr = listener.Addr().(*net.TCPAddr)
+ srv.listener = listener
+ srv.wg.Add(1)
+ go srv.listenLoop()
+ if !srv.laddr.IP.IsLoopback() && srv.NAT != nil {
+ srv.wg.Add(1)
+ go srv.natLoop(srv.laddr.Port)
+ }
+ return nil
+}
+
+// Stop terminates the server and all active peer connections.
+// It blocks until all active connections have been closed.
+func (srv *Server) Stop() {
+ srv.lock.Lock()
+ if !srv.running {
+ srv.lock.Unlock()
+ return
+ }
+ srv.running = false
+ srv.lock.Unlock()
+
+ srvlog.Infoln("Stopping server")
+ if srv.listener != nil {
+ // this unblocks listener Accept
+ srv.listener.Close()
+ }
+ close(srv.quit)
+ for _, peer := range srv.Peers() {
+ peer.Disconnect(DiscQuitting)
+ }
+ srv.wg.Wait()
+
+ // wait till they actually disconnect
+ // this is checked by claiming all peerSlots.
+ // slots become available as the peers disconnect.
+ for i := 0; i < cap(srv.peerSlots); i++ {
+ <-srv.peerSlots
+ }
+ // terminate discLoop
+ close(srv.peerDisconnect)
+}
+
+func (srv *Server) discLoop() {
+ for peer := range srv.peerDisconnect {
+ // peer has just disconnected. free up its slot.
+ srvlog.Infof("%v is gone", peer)
+ srv.peerSlots <- peer.slot
+ srv.lock.Lock()
+ srv.peers[peer.slot] = nil
+ srv.lock.Unlock()
+ }
+}
+
+// main loop for adding connections via listening
+func (srv *Server) listenLoop() {
+ defer srv.wg.Done()
+
+ srvlog.Infoln("Listening on", srv.listener.Addr())
+ for {
+ select {
+ case slot := <-srv.peerSlots:
+ conn, err := srv.listener.Accept()
+ if err != nil {
+ srv.peerSlots <- slot
+ return
+ }
+ srvlog.Debugf("Accepted conn %v (slot %d)\n", conn.RemoteAddr(), slot)
+ srv.addPeer(conn, nil, slot)
+ case <-srv.quit:
+ return
+ }
+ }
+}
+
+func (srv *Server) natLoop(port int) {
+ defer srv.wg.Done()
+ for {
+ srv.updatePortMapping(port)
+ select {
+ case <-time.After(portMappingUpdateInterval):
+ // one more round
+ case <-srv.quit:
+ srv.removePortMapping(port)
+ return
+ }
+ }
+}
+
+func (srv *Server) updatePortMapping(port int) {
+ srvlog.Infoln("Attempting to map port", port, "with", srv.NAT)
+ err := srv.NAT.AddPortMapping("tcp", port, port, "ethereum p2p", portMappingTimeout)
+ if err != nil {
+ srvlog.Errorln("Port mapping error:", err)
+ return
+ }
+ extip, err := srv.NAT.GetExternalAddress()
+ if err != nil {
+ srvlog.Errorln("Error getting external IP:", err)
+ return
+ }
+ srv.lock.Lock()
+ extaddr := *(srv.listener.Addr().(*net.TCPAddr))
+ extaddr.IP = extip
+ srvlog.Infoln("Mapped port, external addr is", &extaddr)
+ srv.laddr = &extaddr
+ srv.lock.Unlock()
+}
+
+func (srv *Server) removePortMapping(port int) {
+ srvlog.Infoln("Removing port mapping for", port, "with", srv.NAT)
+ srv.NAT.DeletePortMapping("tcp", port, port)
+}
+
+func (srv *Server) dialLoop() {
+ defer srv.wg.Done()
+ var (
+ suggest chan *peerAddr
+ slot *int
+ slots = srv.peerSlots
+ )
+ for {
+ select {
+ case i := <-slots:
+ // we need a peer in slot i, slot reserved
+ slot = &i
+ // now we can watch for candidate peers in the next loop
+ suggest = srv.peerConnect
+ // do not consume more until candidate peer is found
+ slots = nil
+
+ case desc := <-suggest:
+ // candidate peer found, will dial out asyncronously
+ // if connection fails slot will be released
+ go srv.dialPeer(desc, *slot)
+ // we can watch if more peers needed in the next loop
+ slots = srv.peerSlots
+ // until then we dont care about candidate peers
+ suggest = nil
+
+ case <-srv.quit:
+ // give back the currently reserved slot
+ if slot != nil {
+ srv.peerSlots <- *slot
+ }
+ return
+ }
+ }
+}
+
+// connect to peer via dial out
+func (srv *Server) dialPeer(desc *peerAddr, slot int) {
+ srvlog.Debugf("Dialing %v (slot %d)\n", desc, slot)
+ conn, err := srv.Dialer.Dial(desc.Network(), desc.String())
+ if err != nil {
+ srvlog.Errorf("Dial error: %v", err)
+ srv.peerSlots <- slot
+ return
+ }
+ go srv.addPeer(conn, desc, slot)
+}
+
+// creates the new peer object and inserts it into its slot
+func (srv *Server) addPeer(conn net.Conn, desc *peerAddr, slot int) *Peer {
+ srv.lock.Lock()
+ defer srv.lock.Unlock()
+ if !srv.running {
+ conn.Close()
+ srv.peerSlots <- slot // release slot
+ return nil
+ }
+ peer := srv.newPeerFunc(srv, conn, desc)
+ peer.slot = slot
+ srv.peers[slot] = peer
+ srv.peerCount++
+ go func() { peer.loop(); srv.peerDisconnect <- peer }()
+ return peer
+}
+
+// removes peer: sending disconnect msg, stop peer, remove rom list/table, release slot
+func (srv *Server) removePeer(peer *Peer) {
+ srv.lock.Lock()
+ defer srv.lock.Unlock()
+ srvlog.Debugf("Removing peer %v %v (slot %v)\n", peer, peer.slot)
+ if srv.peers[peer.slot] != peer {
+ srvlog.Warnln("Invalid peer to remove:", peer)
+ return
+ }
+ // remove from list and index
+ srv.peerCount--
+ srv.peers[peer.slot] = nil
+ // release slot to signal need for a new peer, last!
+ srv.peerSlots <- peer.slot
+}
+
+func (srv *Server) verifyPeer(addr *peerAddr) error {
+ if srv.Blacklist.Exists(addr.Pubkey) {
+ return errors.New("blacklisted")
+ }
+ if bytes.Equal(srv.Identity.Pubkey()[1:], addr.Pubkey) {
+ return newPeerError(errPubkeyForbidden, "not allowed to connect to srv")
+ }
+ srv.lock.RLock()
+ defer srv.lock.RUnlock()
+ for _, peer := range srv.peers {
+ if peer != nil {
+ id := peer.Identity()
+ if id != nil && bytes.Equal(id.Pubkey(), addr.Pubkey) {
+ return errors.New("already connected")
+ }
+ }
+ }
+ return nil
+}
+
+type Blacklist interface {
+ Get([]byte) (bool, error)
+ Put([]byte) error
+ Delete([]byte) error
+ Exists(pubkey []byte) (ok bool)
+}
+
+type BlacklistMap struct {
+ blacklist map[string]bool
+ lock sync.RWMutex
+}
+
+func NewBlacklist() *BlacklistMap {
+ return &BlacklistMap{
+ blacklist: make(map[string]bool),
+ }
+}
+
+func (self *BlacklistMap) Get(pubkey []byte) (bool, error) {
+ self.lock.RLock()
+ defer self.lock.RUnlock()
+ v, ok := self.blacklist[string(pubkey)]
+ var err error
+ if !ok {
+ err = fmt.Errorf("not found")
+ }
+ return v, err
+}
+
+func (self *BlacklistMap) Exists(pubkey []byte) (ok bool) {
+ self.lock.RLock()
+ defer self.lock.RUnlock()
+ _, ok = self.blacklist[string(pubkey)]
+ return
+}
+
+func (self *BlacklistMap) Put(pubkey []byte) error {
+ self.lock.RLock()
+ defer self.lock.RUnlock()
+ self.blacklist[string(pubkey)] = true
+ return nil
+}
+
+func (self *BlacklistMap) Delete(pubkey []byte) error {
+ self.lock.RLock()
+ defer self.lock.RUnlock()
+ delete(self.blacklist, string(pubkey))
+ return nil
+}
diff --git a/p2p/server_test.go b/p2p/server_test.go
new file mode 100644
index 000000000..5c0d08d39
--- /dev/null
+++ b/p2p/server_test.go
@@ -0,0 +1,161 @@
+package p2p
+
+import (
+ "bytes"
+ "io"
+ "net"
+ "sync"
+ "testing"
+ "time"
+)
+
+func startTestServer(t *testing.T, pf peerFunc) *Server {
+ server := &Server{
+ Identity: NewSimpleClientIdentity("clientIdentifier", "version", "customIdentifier", "pubkey"),
+ MaxPeers: 10,
+ ListenAddr: "127.0.0.1:0",
+ newPeerFunc: pf,
+ }
+ if err := server.Start(); err != nil {
+ t.Fatalf("Could not start server: %v", err)
+ }
+ return server
+}
+
+func TestServerListen(t *testing.T) {
+ defer testlog(t).detach()
+
+ // start the test server
+ connected := make(chan *Peer)
+ srv := startTestServer(t, func(srv *Server, conn net.Conn, dialAddr *peerAddr) *Peer {
+ if conn == nil {
+ t.Error("peer func called with nil conn")
+ }
+ if dialAddr != nil {
+ t.Error("peer func called with non-nil dialAddr")
+ }
+ peer := newPeer(conn, nil, dialAddr)
+ connected <- peer
+ return peer
+ })
+ defer close(connected)
+ defer srv.Stop()
+
+ // dial the test server
+ conn, err := net.DialTimeout("tcp", srv.ListenAddr, 5*time.Second)
+ if err != nil {
+ t.Fatalf("could not dial: %v", err)
+ }
+ defer conn.Close()
+
+ select {
+ case peer := <-connected:
+ if peer.conn.LocalAddr().String() != conn.RemoteAddr().String() {
+ t.Errorf("peer started with wrong conn: got %v, want %v",
+ peer.conn.LocalAddr(), conn.RemoteAddr())
+ }
+ case <-time.After(1 * time.Second):
+ t.Error("server did not accept within one second")
+ }
+}
+
+func TestServerDial(t *testing.T) {
+ defer testlog(t).detach()
+
+ // run a fake TCP server to handle the connection.
+ listener, err := net.Listen("tcp", "127.0.0.1:0")
+ if err != nil {
+ t.Fatalf("could not setup listener: %v")
+ }
+ defer listener.Close()
+ accepted := make(chan net.Conn)
+ go func() {
+ conn, err := listener.Accept()
+ if err != nil {
+ t.Error("acccept error:", err)
+ }
+ conn.Close()
+ accepted <- conn
+ }()
+
+ // start the test server
+ connected := make(chan *Peer)
+ srv := startTestServer(t, func(srv *Server, conn net.Conn, dialAddr *peerAddr) *Peer {
+ if conn == nil {
+ t.Error("peer func called with nil conn")
+ }
+ peer := newPeer(conn, nil, dialAddr)
+ connected <- peer
+ return peer
+ })
+ defer close(connected)
+ defer srv.Stop()
+
+ // tell the server to connect.
+ connAddr := newPeerAddr(listener.Addr(), nil)
+ srv.peerConnect <- connAddr
+
+ select {
+ case conn := <-accepted:
+ select {
+ case peer := <-connected:
+ if peer.conn.RemoteAddr().String() != conn.LocalAddr().String() {
+ t.Errorf("peer started with wrong conn: got %v, want %v",
+ peer.conn.RemoteAddr(), conn.LocalAddr())
+ }
+ if peer.dialAddr != connAddr {
+ t.Errorf("peer started with wrong dialAddr: got %v, want %v",
+ peer.dialAddr, connAddr)
+ }
+ case <-time.After(1 * time.Second):
+ t.Error("server did not launch peer within one second")
+ }
+
+ case <-time.After(1 * time.Second):
+ t.Error("server did not connect within one second")
+ }
+}
+
+func TestServerBroadcast(t *testing.T) {
+ defer testlog(t).detach()
+ var connected sync.WaitGroup
+ srv := startTestServer(t, func(srv *Server, c net.Conn, dialAddr *peerAddr) *Peer {
+ peer := newPeer(c, []Protocol{discard}, dialAddr)
+ peer.startSubprotocols([]Cap{discard.cap()})
+ connected.Done()
+ return peer
+ })
+ defer srv.Stop()
+
+ // dial a bunch of conns
+ var conns = make([]net.Conn, 8)
+ connected.Add(len(conns))
+ deadline := time.Now().Add(3 * time.Second)
+ dialer := &net.Dialer{Deadline: deadline}
+ for i := range conns {
+ conn, err := dialer.Dial("tcp", srv.ListenAddr)
+ if err != nil {
+ t.Fatalf("conn %d: dial error: %v", i, err)
+ }
+ defer conn.Close()
+ conn.SetDeadline(deadline)
+ conns[i] = conn
+ }
+ connected.Wait()
+
+ // broadcast one message
+ srv.Broadcast("discard", 0, "foo")
+ goldbuf := new(bytes.Buffer)
+ writeMsg(goldbuf, NewMsg(16, "foo"))
+ golden := goldbuf.Bytes()
+
+ // check that the message has been written everywhere
+ for i, conn := range conns {
+ buf := make([]byte, len(golden))
+ if _, err := io.ReadFull(conn, buf); err != nil {
+ t.Errorf("conn %d: read error: %v", i, err)
+ } else if !bytes.Equal(buf, golden) {
+ t.Errorf("conn %d: msg mismatch\ngot: %x\nwant: %x", i, buf, golden)
+ }
+ }
+}
diff --git a/p2p/testlog_test.go b/p2p/testlog_test.go
new file mode 100644
index 000000000..951d43243
--- /dev/null
+++ b/p2p/testlog_test.go
@@ -0,0 +1,28 @@
+package p2p
+
+import (
+ "testing"
+
+ "github.com/ethereum/go-ethereum/logger"
+)
+
+type testLogger struct{ t *testing.T }
+
+func testlog(t *testing.T) testLogger {
+ logger.Reset()
+ l := testLogger{t}
+ logger.AddLogSystem(l)
+ return l
+}
+
+func (testLogger) GetLogLevel() logger.LogLevel { return logger.DebugLevel }
+func (testLogger) SetLogLevel(logger.LogLevel) {}
+
+func (l testLogger) LogPrint(level logger.LogLevel, msg string) {
+ l.t.Logf("%s", msg)
+}
+
+func (testLogger) detach() {
+ logger.Flush()
+ logger.Reset()
+}
diff --git a/p2p/testpoc7.go b/p2p/testpoc7.go
new file mode 100644
index 000000000..c0cc5c544
--- /dev/null
+++ b/p2p/testpoc7.go
@@ -0,0 +1,40 @@
+// +build none
+
+package main
+
+import (
+ "fmt"
+ "log"
+ "net"
+ "os"
+
+ "github.com/ethereum/go-ethereum/logger"
+ "github.com/ethereum/go-ethereum/p2p"
+ "github.com/obscuren/secp256k1-go"
+)
+
+func main() {
+ logger.AddLogSystem(logger.NewStdLogSystem(os.Stdout, log.LstdFlags, logger.DebugLevel))
+
+ pub, _ := secp256k1.GenerateKeyPair()
+ srv := p2p.Server{
+ MaxPeers: 10,
+ Identity: p2p.NewSimpleClientIdentity("test", "1.0", "", string(pub)),
+ ListenAddr: ":30303",
+ NAT: p2p.PMP(net.ParseIP("10.0.0.1")),
+ }
+ if err := srv.Start(); err != nil {
+ fmt.Println("could not start server:", err)
+ os.Exit(1)
+ }
+
+ // add seed peers
+ seed, err := net.ResolveTCPAddr("tcp", "poc-7.ethdev.com:30303")
+ if err != nil {
+ fmt.Println("couldn't resolve:", err)
+ os.Exit(1)
+ }
+ srv.SuggestPeer(seed.IP, seed.Port, nil)
+
+ select {}
+}
diff --git a/peer.go b/peer.go
new file mode 100644
index 000000000..13f0239d4
--- /dev/null
+++ b/peer.go
@@ -0,0 +1,881 @@
+package eth
+
+import (
+ "bytes"
+ "container/list"
+ "fmt"
+ "math"
+ "math/big"
+ "net"
+ "strconv"
+ "strings"
+ "sync/atomic"
+ "time"
+
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/logger"
+ "github.com/ethereum/go-ethereum/wire"
+)
+
+var peerlogger = logger.NewLogger("PEER")
+
+const (
+ // The size of the output buffer for writing messages
+ outputBufferSize = 50
+ // Current protocol version
+ ProtocolVersion = 49
+ // Current P2P version
+ P2PVersion = 2
+ // Ethereum network version
+ NetVersion = 0
+ // Interval for ping/pong message
+ pingPongTimer = 2 * time.Second
+)
+
+type DiscReason byte
+
+const (
+ // Values are given explicitly instead of by iota because these values are
+ // defined by the wire protocol spec; it is easier for humans to ensure
+ // correctness when values are explicit.
+ DiscRequested DiscReason = iota
+ DiscReTcpSysErr
+ DiscBadProto
+ DiscBadPeer
+ DiscTooManyPeers
+ DiscConnDup
+ DiscGenesisErr
+ DiscProtoErr
+ DiscQuitting
+)
+
+var discReasonToString = []string{
+ "requested",
+ "TCP sys error",
+ "bad protocol",
+ "useless peer",
+ "too many peers",
+ "already connected",
+ "wrong genesis block",
+ "incompatible network",
+ "quitting",
+}
+
+func (d DiscReason) String() string {
+ if len(discReasonToString) < int(d) {
+ return "Unknown"
+ }
+
+ return discReasonToString[d]
+}
+
+// Peer capabilities
+type Caps byte
+
+const (
+ CapPeerDiscTy Caps = 1 << iota
+ CapTxTy
+ CapChainTy
+
+ CapDefault = CapChainTy | CapTxTy | CapPeerDiscTy
+)
+
+var capsToString = map[Caps]string{
+ CapPeerDiscTy: "Peer discovery",
+ CapTxTy: "Transaction relaying",
+ CapChainTy: "Block chain relaying",
+}
+
+func (c Caps) IsCap(cap Caps) bool {
+ return c&cap > 0
+}
+
+func (c Caps) String() string {
+ var caps []string
+ if c.IsCap(CapPeerDiscTy) {
+ caps = append(caps, capsToString[CapPeerDiscTy])
+ }
+ if c.IsCap(CapChainTy) {
+ caps = append(caps, capsToString[CapChainTy])
+ }
+ if c.IsCap(CapTxTy) {
+ caps = append(caps, capsToString[CapTxTy])
+ }
+
+ return strings.Join(caps, " | ")
+}
+
+type Peer struct {
+ // Ethereum interface
+ ethereum *Ethereum
+ // Net connection
+ conn net.Conn
+ // Output queue which is used to communicate and handle messages
+ outputQueue chan *wire.Msg
+ // Quit channel
+ quit chan bool
+ // Determines whether it's an inbound or outbound peer
+ inbound bool
+ // Flag for checking the peer's connectivity state
+ connected int32
+ disconnect int32
+ // Last known message send
+ lastSend time.Time
+ // Indicated whether a verack has been send or not
+ // This flag is used by writeMessage to check if messages are allowed
+ // to be send or not. If no version is known all messages are ignored.
+ versionKnown bool
+ statusKnown bool
+
+ // Last received pong message
+ lastPong int64
+ lastBlockReceived time.Time
+ doneFetchingHashes bool
+ lastHashAt time.Time
+ lastHashRequestedAt time.Time
+
+ host []byte
+ port uint16
+ caps Caps
+ td *big.Int
+ bestHash []byte
+ lastReceivedHash []byte
+ requestedHashes [][]byte
+
+ // This peer's public key
+ pubkey []byte
+
+ // Indicated whether the node is catching up or not
+ catchingUp bool
+ diverted bool
+ blocksRequested int
+
+ version string
+
+ // We use this to give some kind of pingtime to a node, not very accurate, could be improved.
+ pingTime time.Duration
+ pingStartTime time.Time
+
+ lastRequestedBlock *types.Block
+
+ protocolCaps *ethutil.Value
+}
+
+func NewPeer(conn net.Conn, ethereum *Ethereum, inbound bool) *Peer {
+ pubkey := ethereum.KeyManager().PublicKey()[1:]
+
+ return &Peer{
+ outputQueue: make(chan *wire.Msg, outputBufferSize),
+ quit: make(chan bool),
+ ethereum: ethereum,
+ conn: conn,
+ inbound: inbound,
+ disconnect: 0,
+ connected: 1,
+ port: 30303,
+ pubkey: pubkey,
+ blocksRequested: 10,
+ caps: ethereum.ServerCaps(),
+ version: ethereum.ClientIdentity().String(),
+ protocolCaps: ethutil.NewValue(nil),
+ td: big.NewInt(0),
+ doneFetchingHashes: true,
+ }
+}
+
+func NewOutboundPeer(addr string, ethereum *Ethereum, caps Caps) *Peer {
+ p := &Peer{
+ outputQueue: make(chan *wire.Msg, outputBufferSize),
+ quit: make(chan bool),
+ ethereum: ethereum,
+ inbound: false,
+ connected: 0,
+ disconnect: 0,
+ port: 30303,
+ caps: caps,
+ version: ethereum.ClientIdentity().String(),
+ protocolCaps: ethutil.NewValue(nil),
+ td: big.NewInt(0),
+ doneFetchingHashes: true,
+ }
+
+ // Set up the connection in another goroutine so we don't block the main thread
+ go func() {
+ conn, err := p.Connect(addr)
+ if err != nil {
+ //peerlogger.Debugln("Connection to peer failed. Giving up.", err)
+ p.Stop()
+ return
+ }
+ p.conn = conn
+
+ // Atomically set the connection state
+ atomic.StoreInt32(&p.connected, 1)
+ atomic.StoreInt32(&p.disconnect, 0)
+
+ p.Start()
+ }()
+
+ return p
+}
+
+func (self *Peer) Connect(addr string) (conn net.Conn, err error) {
+ const maxTries = 3
+ for attempts := 0; attempts < maxTries; attempts++ {
+ conn, err = net.DialTimeout("tcp", addr, 10*time.Second)
+ if err != nil {
+ time.Sleep(time.Duration(attempts*20) * time.Second)
+ continue
+ }
+
+ // Success
+ return
+ }
+
+ return
+}
+
+// Getters
+func (p *Peer) PingTime() string {
+ return p.pingTime.String()
+}
+func (p *Peer) Inbound() bool {
+ return p.inbound
+}
+func (p *Peer) LastSend() time.Time {
+ return p.lastSend
+}
+func (p *Peer) LastPong() int64 {
+ return p.lastPong
+}
+func (p *Peer) Host() []byte {
+ return p.host
+}
+func (p *Peer) Port() uint16 {
+ return p.port
+}
+func (p *Peer) Version() string {
+ return p.version
+}
+func (p *Peer) Connected() *int32 {
+ return &p.connected
+}
+
+// Setters
+func (p *Peer) SetVersion(version string) {
+ p.version = version
+}
+
+// Outputs any RLP encoded data to the peer
+func (p *Peer) QueueMessage(msg *wire.Msg) {
+ if atomic.LoadInt32(&p.connected) != 1 {
+ return
+ }
+ p.outputQueue <- msg
+}
+
+func (p *Peer) writeMessage(msg *wire.Msg) {
+ // Ignore the write if we're not connected
+ if atomic.LoadInt32(&p.connected) != 1 {
+ return
+ }
+
+ if !p.versionKnown {
+ switch msg.Type {
+ case wire.MsgHandshakeTy: // Ok
+ default: // Anything but ack is allowed
+ return
+ }
+ } else {
+ /*
+ if !p.statusKnown {
+ switch msg.Type {
+ case wire.MsgStatusTy: // Ok
+ default: // Anything but ack is allowed
+ return
+ }
+ }
+ */
+ }
+
+ peerlogger.DebugDetailf("(%v) <= %v\n", p.conn.RemoteAddr(), formatMessage(msg))
+
+ err := wire.WriteMessage(p.conn, msg)
+ if err != nil {
+ peerlogger.Debugln(" Can't send message:", err)
+ // Stop the client if there was an error writing to it
+ p.Stop()
+ return
+ }
+}
+
+// Outbound message handler. Outbound messages are handled here
+func (p *Peer) HandleOutbound() {
+ // The ping timer. Makes sure that every 2 minutes a ping is send to the peer
+ pingTimer := time.NewTicker(pingPongTimer)
+ serviceTimer := time.NewTicker(10 * time.Second)
+
+out:
+ for {
+ skip:
+ select {
+ // Main message queue. All outbound messages are processed through here
+ case msg := <-p.outputQueue:
+ if !p.statusKnown {
+ switch msg.Type {
+ case wire.MsgTxTy, wire.MsgGetBlockHashesTy, wire.MsgBlockHashesTy, wire.MsgGetBlocksTy, wire.MsgBlockTy:
+ break skip
+ }
+ }
+
+ switch msg.Type {
+ case wire.MsgGetBlockHashesTy:
+ p.lastHashRequestedAt = time.Now()
+ }
+
+ p.writeMessage(msg)
+ p.lastSend = time.Now()
+
+ // Ping timer
+ case <-pingTimer.C:
+ p.writeMessage(wire.NewMessage(wire.MsgPingTy, ""))
+ p.pingStartTime = time.Now()
+
+ // Service timer takes care of peer broadcasting, transaction
+ // posting or block posting
+ case <-serviceTimer.C:
+ p.QueueMessage(wire.NewMessage(wire.MsgGetPeersTy, ""))
+
+ case <-p.quit:
+ // Break out of the for loop if a quit message is posted
+ break out
+ }
+ }
+
+clean:
+ // This loop is for draining the output queue and anybody waiting for us
+ for {
+ select {
+ case <-p.outputQueue:
+ // TODO
+ default:
+ break clean
+ }
+ }
+}
+
+func formatMessage(msg *wire.Msg) (ret string) {
+ ret = fmt.Sprintf("%v %v", msg.Type, msg.Data)
+
+ /*
+ XXX Commented out because I need the log level here to determine
+ if i should or shouldn't generate this message
+ */
+ /*
+ switch msg.Type {
+ case wire.MsgPeersTy:
+ ret += fmt.Sprintf("(%d entries)", msg.Data.Len())
+ case wire.MsgBlockTy:
+ b1, b2 := chain.NewBlockFromRlpValue(msg.Data.Get(0)), ethchain.NewBlockFromRlpValue(msg.Data.Get(msg.Data.Len()-1))
+ ret += fmt.Sprintf("(%d entries) %x - %x", msg.Data.Len(), b1.Hash()[0:4], b2.Hash()[0:4])
+ case wire.MsgBlockHashesTy:
+ h1, h2 := msg.Data.Get(0).Bytes(), msg.Data.Get(msg.Data.Len()-1).Bytes()
+ ret += fmt.Sprintf("(%d entries) %x - %x", msg.Data.Len(), h1, h2)
+ }
+ */
+
+ return
+}
+
+// Inbound handler. Inbound messages are received here and passed to the appropriate methods
+func (p *Peer) HandleInbound() {
+ for atomic.LoadInt32(&p.disconnect) == 0 {
+
+ // HMM?
+ time.Sleep(50 * time.Millisecond)
+ // Wait for a message from the peer
+ msgs, err := wire.ReadMessages(p.conn)
+ if err != nil {
+ peerlogger.Debugln(err)
+ }
+ for _, msg := range msgs {
+ peerlogger.DebugDetailf("(%v) => %v\n", p.conn.RemoteAddr(), formatMessage(msg))
+
+ switch msg.Type {
+ case wire.MsgHandshakeTy:
+ // Version message
+ p.handleHandshake(msg)
+
+ //if p.caps.IsCap(CapPeerDiscTy) {
+ p.QueueMessage(wire.NewMessage(wire.MsgGetPeersTy, ""))
+ //}
+
+ case wire.MsgDiscTy:
+ p.Stop()
+ peerlogger.Infoln("Disconnect peer: ", DiscReason(msg.Data.Get(0).Uint()))
+ case wire.MsgPingTy:
+ // Respond back with pong
+ p.QueueMessage(wire.NewMessage(wire.MsgPongTy, ""))
+ case wire.MsgPongTy:
+ // If we received a pong back from a peer we set the
+ // last pong so the peer handler knows this peer is still
+ // active.
+ p.lastPong = time.Now().Unix()
+ p.pingTime = time.Since(p.pingStartTime)
+ case wire.MsgTxTy:
+ // If the message was a transaction queue the transaction
+ // in the TxPool where it will undergo validation and
+ // processing when a new block is found
+ for i := 0; i < msg.Data.Len(); i++ {
+ tx := types.NewTransactionFromValue(msg.Data.Get(i))
+ err := p.ethereum.TxPool().Add(tx)
+ if err != nil {
+ peerlogger.Infoln(err)
+ } else {
+ peerlogger.Infof("tx OK (%x)\n", tx.Hash()[0:4])
+ }
+ }
+ case wire.MsgGetPeersTy:
+ // Peer asked for list of connected peers
+ //p.pushPeers()
+ case wire.MsgPeersTy:
+ // Received a list of peers (probably because MsgGetPeersTy was send)
+ data := msg.Data
+ // Create new list of possible peers for the ethereum to process
+ peers := make([]string, data.Len())
+ // Parse each possible peer
+ for i := 0; i < data.Len(); i++ {
+ value := data.Get(i)
+ peers[i] = unpackAddr(value.Get(0), value.Get(1).Uint())
+ }
+
+ // Connect to the list of peers
+ p.ethereum.ProcessPeerList(peers)
+
+ case wire.MsgStatusTy:
+ // Handle peer's status msg
+ p.handleStatus(msg)
+ }
+
+ // TMP
+ if p.statusKnown {
+ switch msg.Type {
+
+ case wire.MsgGetBlockHashesTy:
+ if msg.Data.Len() < 2 {
+ peerlogger.Debugln("err: argument length invalid ", msg.Data.Len())
+ }
+
+ hash := msg.Data.Get(0).Bytes()
+ amount := msg.Data.Get(1).Uint()
+
+ hashes := p.ethereum.ChainManager().GetChainHashesFromHash(hash, amount)
+
+ p.QueueMessage(wire.NewMessage(wire.MsgBlockHashesTy, ethutil.ByteSliceToInterface(hashes)))
+
+ case wire.MsgGetBlocksTy:
+ // Limit to max 300 blocks
+ max := int(math.Min(float64(msg.Data.Len()), 300.0))
+ var blocks []interface{}
+
+ for i := 0; i < max; i++ {
+ hash := msg.Data.Get(i).Bytes()
+ block := p.ethereum.ChainManager().GetBlock(hash)
+ if block != nil {
+ blocks = append(blocks, block.Value().Raw())
+ }
+ }
+
+ p.QueueMessage(wire.NewMessage(wire.MsgBlockTy, blocks))
+
+ case wire.MsgBlockHashesTy:
+ p.catchingUp = true
+
+ blockPool := p.ethereum.blockPool
+
+ foundCommonHash := false
+ p.lastHashAt = time.Now()
+
+ it := msg.Data.NewIterator()
+ for it.Next() {
+ hash := it.Value().Bytes()
+ p.lastReceivedHash = hash
+
+ if blockPool.HasCommonHash(hash) {
+ foundCommonHash = true
+
+ break
+ }
+
+ blockPool.AddHash(hash, p)
+ }
+
+ if !foundCommonHash {
+ p.FetchHashes()
+ } else {
+ peerlogger.Infof("Found common hash (%x...)\n", p.lastReceivedHash[0:4])
+ p.doneFetchingHashes = true
+ }
+
+ case wire.MsgBlockTy:
+ p.catchingUp = true
+
+ blockPool := p.ethereum.blockPool
+
+ it := msg.Data.NewIterator()
+ for it.Next() {
+ block := types.NewBlockFromRlpValue(it.Value())
+ blockPool.Add(block, p)
+
+ p.lastBlockReceived = time.Now()
+ }
+ case wire.MsgNewBlockTy:
+ var (
+ blockPool = p.ethereum.blockPool
+ block = types.NewBlockFromRlpValue(msg.Data.Get(0))
+ td = msg.Data.Get(1).BigInt()
+ )
+
+ if td.Cmp(blockPool.td) > 0 {
+ p.ethereum.blockPool.AddNew(block, p)
+ }
+ }
+
+ }
+ }
+ }
+
+ p.Stop()
+}
+
+func (self *Peer) FetchBlocks(hashes [][]byte) {
+ if len(hashes) > 0 {
+ peerlogger.Debugf("Fetching blocks (%d)\n", len(hashes))
+
+ self.QueueMessage(wire.NewMessage(wire.MsgGetBlocksTy, ethutil.ByteSliceToInterface(hashes)))
+ }
+}
+
+func (self *Peer) FetchHashes() bool {
+ blockPool := self.ethereum.blockPool
+
+ return blockPool.FetchHashes(self)
+}
+
+func (self *Peer) FetchingHashes() bool {
+ return !self.doneFetchingHashes
+}
+
+// General update method
+func (self *Peer) update() {
+ serviceTimer := time.NewTicker(100 * time.Millisecond)
+
+out:
+ for {
+ select {
+ case <-serviceTimer.C:
+ if self.IsCap("eth") {
+ var (
+ sinceBlock = time.Since(self.lastBlockReceived)
+ )
+
+ if sinceBlock > 5*time.Second {
+ self.catchingUp = false
+ }
+ }
+ case <-self.quit:
+ break out
+ }
+ }
+
+ serviceTimer.Stop()
+}
+
+func (p *Peer) Start() {
+ peerHost, peerPort, _ := net.SplitHostPort(p.conn.LocalAddr().String())
+ servHost, servPort, _ := net.SplitHostPort(p.conn.RemoteAddr().String())
+
+ if p.inbound {
+ p.host, p.port = packAddr(peerHost, peerPort)
+ } else {
+ p.host, p.port = packAddr(servHost, servPort)
+ }
+
+ err := p.pushHandshake()
+ if err != nil {
+ peerlogger.Debugln("Peer can't send outbound version ack", err)
+
+ p.Stop()
+
+ return
+ }
+
+ go p.HandleOutbound()
+ // Run the inbound handler in a new goroutine
+ go p.HandleInbound()
+ // Run the general update handler
+ go p.update()
+
+ // Wait a few seconds for startup and then ask for an initial ping
+ time.Sleep(2 * time.Second)
+ p.writeMessage(wire.NewMessage(wire.MsgPingTy, ""))
+ p.pingStartTime = time.Now()
+
+}
+
+func (p *Peer) Stop() {
+ p.StopWithReason(DiscRequested)
+}
+
+func (p *Peer) StopWithReason(reason DiscReason) {
+ if atomic.AddInt32(&p.disconnect, 1) != 1 {
+ return
+ }
+
+ // Pre-emptively remove the peer; don't wait for reaping. We already know it's dead if we are here
+ p.ethereum.RemovePeer(p)
+
+ close(p.quit)
+ if atomic.LoadInt32(&p.connected) != 0 {
+ p.writeMessage(wire.NewMessage(wire.MsgDiscTy, reason))
+ p.conn.Close()
+ }
+}
+
+func (p *Peer) peersMessage() *wire.Msg {
+ outPeers := make([]interface{}, len(p.ethereum.InOutPeers()))
+ // Serialise each peer
+ for i, peer := range p.ethereum.InOutPeers() {
+ // Don't return localhost as valid peer
+ if !net.ParseIP(peer.conn.RemoteAddr().String()).IsLoopback() {
+ outPeers[i] = peer.RlpData()
+ }
+ }
+
+ // Return the message to the peer with the known list of connected clients
+ return wire.NewMessage(wire.MsgPeersTy, outPeers)
+}
+
+// Pushes the list of outbound peers to the client when requested
+func (p *Peer) pushPeers() {
+ p.QueueMessage(p.peersMessage())
+}
+
+func (self *Peer) pushStatus() {
+ msg := wire.NewMessage(wire.MsgStatusTy, []interface{}{
+ uint32(ProtocolVersion),
+ uint32(NetVersion),
+ self.ethereum.ChainManager().Td(),
+ self.ethereum.ChainManager().CurrentBlock().Hash(),
+ self.ethereum.ChainManager().Genesis().Hash(),
+ })
+
+ self.QueueMessage(msg)
+}
+
+func (self *Peer) handleStatus(msg *wire.Msg) {
+ c := msg.Data
+
+ var (
+ //protoVersion = c.Get(0).Uint()
+ netVersion = c.Get(1).Uint()
+ td = c.Get(2).BigInt()
+ bestHash = c.Get(3).Bytes()
+ genesis = c.Get(4).Bytes()
+ )
+
+ if bytes.Compare(self.ethereum.ChainManager().Genesis().Hash(), genesis) != 0 {
+ loggerger.Warnf("Invalid genisis hash %x. Disabling [eth]\n", genesis)
+ return
+ }
+
+ if netVersion != NetVersion {
+ loggerger.Warnf("Invalid network version %d. Disabling [eth]\n", netVersion)
+ return
+ }
+
+ /*
+ if protoVersion != ProtocolVersion {
+ loggerger.Warnf("Invalid protocol version %d. Disabling [eth]\n", protoVersion)
+ return
+ }
+ */
+
+ // Get the td and last hash
+ self.td = td
+ self.bestHash = bestHash
+ self.lastReceivedHash = bestHash
+
+ self.statusKnown = true
+
+ // Compare the total TD with the blockchain TD. If remote is higher
+ // fetch hashes from highest TD node.
+ self.FetchHashes()
+
+ loggerger.Infof("Peer is [eth] capable. (TD = %v ~ %x)", self.td, self.bestHash)
+
+}
+
+func (p *Peer) pushHandshake() error {
+ pubkey := p.ethereum.KeyManager().PublicKey()
+ msg := wire.NewMessage(wire.MsgHandshakeTy, []interface{}{
+ P2PVersion, []byte(p.version), []interface{}{[]interface{}{"eth", ProtocolVersion}}, p.port, pubkey[1:],
+ })
+
+ p.QueueMessage(msg)
+
+ return nil
+}
+
+func (p *Peer) handleHandshake(msg *wire.Msg) {
+ c := msg.Data
+
+ var (
+ p2pVersion = c.Get(0).Uint()
+ clientId = c.Get(1).Str()
+ caps = c.Get(2)
+ port = c.Get(3).Uint()
+ pub = c.Get(4).Bytes()
+ )
+
+ // Check correctness of p2p protocol version
+ if p2pVersion != P2PVersion {
+ peerlogger.Debugf("Invalid P2P version. Require protocol %d, received %d\n", P2PVersion, p2pVersion)
+ p.Stop()
+ return
+ }
+
+ // Handle the pub key (validation, uniqueness)
+ if len(pub) == 0 {
+ peerlogger.Warnln("Pubkey required, not supplied in handshake.")
+ p.Stop()
+ return
+ }
+
+ // Self connect detection
+ pubkey := p.ethereum.KeyManager().PublicKey()
+ if bytes.Compare(pubkey[1:], pub) == 0 {
+ p.Stop()
+
+ return
+ }
+
+ // Check for blacklisting
+ for _, pk := range p.ethereum.blacklist {
+ if bytes.Compare(pk, pub) == 0 {
+ peerlogger.Debugf("Blacklisted peer tried to connect (%x...)\n", pubkey[0:4])
+ p.StopWithReason(DiscBadPeer)
+
+ return
+ }
+ }
+
+ usedPub := 0
+ // This peer is already added to the peerlist so we expect to find a double pubkey at least once
+ eachPeer(p.ethereum.Peers(), func(peer *Peer, e *list.Element) {
+ if bytes.Compare(pub, peer.pubkey) == 0 {
+ usedPub++
+ }
+ })
+
+ if usedPub > 0 {
+ peerlogger.Debugf("Pubkey %x found more then once. Already connected to client.", p.pubkey)
+ p.Stop()
+ return
+ }
+ p.pubkey = pub
+
+ // If this is an inbound connection send an ack back
+ if p.inbound {
+ p.port = uint16(port)
+ }
+
+ p.SetVersion(clientId)
+
+ p.versionKnown = true
+
+ p.ethereum.PushPeer(p)
+ p.ethereum.eventMux.Post(PeerListEvent{p.ethereum.Peers()})
+
+ p.protocolCaps = caps
+
+ it := caps.NewIterator()
+ var capsStrs []string
+ for it.Next() {
+ cap := it.Value().Get(0).Str()
+ ver := it.Value().Get(1).Uint()
+ switch cap {
+ case "eth":
+ if ver != ProtocolVersion {
+ loggerger.Warnf("Invalid protocol version %d. Disabling [eth]\n", ver)
+ continue
+ }
+ p.pushStatus()
+ }
+
+ capsStrs = append(capsStrs, fmt.Sprintf("%s/%d", cap, ver))
+ }
+
+ peerlogger.Infof("Added peer (%s) %d / %d (%v)\n", p.conn.RemoteAddr(), p.ethereum.Peers().Len(), p.ethereum.MaxPeers, capsStrs)
+
+ peerlogger.Debugln(p)
+}
+
+func (self *Peer) IsCap(cap string) bool {
+ capsIt := self.protocolCaps.NewIterator()
+ for capsIt.Next() {
+ if capsIt.Value().Str() == cap {
+ return true
+ }
+ }
+
+ return false
+}
+
+func (self *Peer) Caps() *ethutil.Value {
+ return self.protocolCaps
+}
+
+func (p *Peer) String() string {
+ var strBoundType string
+ if p.inbound {
+ strBoundType = "inbound"
+ } else {
+ strBoundType = "outbound"
+ }
+ var strConnectType string
+ if atomic.LoadInt32(&p.disconnect) == 0 {
+ strConnectType = "connected"
+ } else {
+ strConnectType = "disconnected"
+ }
+
+ return fmt.Sprintf("[%s] (%s) %v %s", strConnectType, strBoundType, p.conn.RemoteAddr(), p.version)
+
+}
+
+func (p *Peer) RlpData() []interface{} {
+ return []interface{}{p.host, p.port, p.pubkey}
+}
+
+func packAddr(address, _port string) (host []byte, port uint16) {
+ p, _ := strconv.Atoi(_port)
+ port = uint16(p)
+
+ h := net.ParseIP(address)
+ if ip := h.To4(); ip != nil {
+ host = []byte(ip)
+ } else {
+ host = []byte(h)
+ }
+
+ return
+}
+
+func unpackAddr(value *ethutil.Value, p uint64) string {
+ host, _ := net.IP(value.Bytes()).MarshalText()
+ prt := strconv.Itoa(int(p))
+
+ return net.JoinHostPort(string(host), prt)
+}
diff --git a/pow/ar/block.go b/pow/ar/block.go
new file mode 100644
index 000000000..2124b53b4
--- /dev/null
+++ b/pow/ar/block.go
@@ -0,0 +1,12 @@
+package ar
+
+import (
+ "math/big"
+
+ "github.com/ethereum/go-ethereum/trie"
+)
+
+type Block interface {
+ Trie() *trie.Trie
+ Diff() *big.Int
+}
diff --git a/pow/ar/ops.go b/pow/ar/ops.go
new file mode 100644
index 000000000..3a099be08
--- /dev/null
+++ b/pow/ar/ops.go
@@ -0,0 +1,54 @@
+package ar
+
+import "math/big"
+
+const lenops int64 = 9
+
+type OpsFunc func(a, b *big.Int) *big.Int
+
+var ops [lenops]OpsFunc
+
+func init() {
+ ops[0] = Add
+ ops[1] = Mul
+ ops[2] = Mod
+ ops[3] = Xor
+ ops[4] = And
+ ops[5] = Or
+ ops[6] = Sub1
+ ops[7] = XorSub
+ ops[8] = Rsh
+}
+
+func Add(x, y *big.Int) *big.Int {
+ return new(big.Int).Add(x, y)
+}
+func Mul(x, y *big.Int) *big.Int {
+ return new(big.Int).Mul(x, y)
+}
+func Mod(x, y *big.Int) *big.Int {
+ return new(big.Int).Mod(x, y)
+}
+func Xor(x, y *big.Int) *big.Int {
+ return new(big.Int).Xor(x, y)
+}
+func And(x, y *big.Int) *big.Int {
+ return new(big.Int).And(x, y)
+}
+func Or(x, y *big.Int) *big.Int {
+ return new(big.Int).Or(x, y)
+}
+func Sub1(x, y *big.Int) *big.Int {
+ a := big.NewInt(-1)
+ a.Sub(a, x)
+
+ return a
+}
+func XorSub(x, y *big.Int) *big.Int {
+ t := Sub1(x, nil)
+
+ return t.Xor(t, y)
+}
+func Rsh(x, y *big.Int) *big.Int {
+ return new(big.Int).Rsh(x, uint(y.Uint64()%64))
+}
diff --git a/pow/ar/pow.go b/pow/ar/pow.go
new file mode 100644
index 000000000..8991a674b
--- /dev/null
+++ b/pow/ar/pow.go
@@ -0,0 +1,122 @@
+package ar
+
+import (
+ "math/big"
+
+ "github.com/ethereum/go-ethereum/ethutil"
+)
+
+type Entry struct {
+ op OpsFunc
+ i, j *big.Int
+}
+
+type Tape struct {
+ tape []Entry
+ block Block
+}
+
+func NewTape(block Block) *Tape {
+ return &Tape{nil, block}
+}
+
+func (self *Tape) gen(w, h int64, gen NumberGenerator) {
+ self.tape = nil
+
+ for v := int64(0); v < h; v++ {
+ op := ops[gen.rand64(lenops).Int64()]
+ r := gen.rand64(100).Uint64()
+
+ var j *big.Int
+ if r < 20 && v > 20 {
+ j = self.tape[len(self.tape)-1].i
+ } else {
+ j = gen.rand64(w)
+ }
+
+ i := gen.rand64(w)
+ self.tape = append(self.tape, Entry{op, i, j})
+ }
+}
+
+func (self *Tape) runTape(w, h int64, gen NumberGenerator) *big.Int {
+ var mem []*big.Int
+ for i := int64(0); i < w; i++ {
+ mem = append(mem, gen.rand(ethutil.BigPow(2, 64)))
+ }
+
+ set := func(i, j int) Entry {
+ entry := self.tape[i*100+j]
+ mem[entry.i.Uint64()] = entry.op(entry.i, entry.j)
+
+ return entry
+ }
+
+ dir := true
+ for i := 0; i < int(h)/100; i++ {
+ var entry Entry
+ if dir {
+ for j := 0; j < 100; j++ {
+ entry = set(i, j)
+ }
+ } else {
+ for j := 99; i >= 0; j-- {
+ entry = set(i, j)
+ }
+ }
+
+ t := mem[entry.i.Uint64()]
+ if big.NewInt(2).Cmp(new(big.Int).Mod(t, big.NewInt(37))) < 0 {
+ dir = !dir
+ }
+ }
+
+ return Sha3(mem)
+}
+
+func (self *Tape) Verify(header, nonce []byte) bool {
+ n := ethutil.BigD(nonce)
+
+ var w int64 = 10000
+ var h int64 = 150000
+ gen := Rnd(Sha3([]interface{}{header, new(big.Int).Div(n, big.NewInt(1000))}))
+ self.gen(w, h, gen)
+
+ gen = Rnd(Sha3([]interface{}{header, new(big.Int).Mod(n, big.NewInt(1000))}))
+ hash := self.runTape(w, h, gen)
+
+ it := self.block.Trie().Iterator()
+ next := it.Next(string(new(big.Int).Mod(hash, ethutil.BigPow(2, 160)).Bytes()))
+
+ req := ethutil.BigPow(2, 256)
+ req.Div(req, self.block.Diff())
+ return Sha3([]interface{}{hash, next}).Cmp(req) < 0
+}
+
+func (self *Tape) Run(header []byte) []byte {
+ nonce := big.NewInt(0)
+ var w int64 = 10000
+ var h int64 = 150000
+
+ req := ethutil.BigPow(2, 256)
+ req.Div(req, self.block.Diff())
+
+ for {
+ if new(big.Int).Mod(nonce, b(1000)).Cmp(b(0)) == 0 {
+ gen := Rnd(Sha3([]interface{}{header, new(big.Int).Div(nonce, big.NewInt(1000))}))
+ self.gen(w, h, gen)
+ }
+
+ gen := Rnd(Sha3([]interface{}{header, new(big.Int).Mod(nonce, big.NewInt(1000))}))
+ hash := self.runTape(w, h, gen)
+
+ it := self.block.Trie().Iterator()
+ next := it.Next(string(new(big.Int).Mod(hash, ethutil.BigPow(2, 160)).Bytes()))
+
+ if Sha3([]interface{}{hash, next}).Cmp(req) < 0 {
+ return nonce.Bytes()
+ } else {
+ nonce.Add(nonce, ethutil.Big1)
+ }
+ }
+}
diff --git a/pow/ar/pow_test.go b/pow/ar/pow_test.go
new file mode 100644
index 000000000..b1ebf9281
--- /dev/null
+++ b/pow/ar/pow_test.go
@@ -0,0 +1,47 @@
+package ar
+
+import (
+ "fmt"
+ "math/big"
+ "testing"
+
+ "github.com/ethereum/go-ethereum/ethdb"
+ "github.com/ethereum/go-ethereum/trie"
+)
+
+type TestBlock struct {
+ trie *trie.Trie
+}
+
+func NewTestBlock() *TestBlock {
+ db, _ := ethdb.NewMemDatabase()
+ return &TestBlock{
+ trie: trie.New(db, ""),
+ }
+}
+
+func (self *TestBlock) Diff() *big.Int {
+ return b(10)
+}
+
+func (self *TestBlock) Trie() *trie.Trie {
+ return self.trie
+}
+
+func (self *TestBlock) Hash() []byte {
+ a := make([]byte, 32)
+ a[0] = 10
+ a[1] = 2
+ return a
+}
+
+func TestPow(t *testing.T) {
+ entry := make([]byte, 32)
+ entry[0] = 255
+
+ block := NewTestBlock()
+
+ pow := NewTape(block)
+ nonce := pow.Run(block.Hash())
+ fmt.Println("Found nonce", nonce)
+}
diff --git a/pow/ar/rnd.go b/pow/ar/rnd.go
new file mode 100644
index 000000000..c62f4e062
--- /dev/null
+++ b/pow/ar/rnd.go
@@ -0,0 +1,66 @@
+package ar
+
+import (
+ "math/big"
+
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/ethutil"
+)
+
+var b = big.NewInt
+
+type Node interface {
+ Big() *big.Int
+}
+
+type ByteNode []byte
+
+func (self ByteNode) Big() *big.Int {
+ return ethutil.BigD(ethutil.Encode([]byte(self)))
+}
+
+func Sha3(v interface{}) *big.Int {
+ if b, ok := v.(*big.Int); ok {
+ return ethutil.BigD(crypto.Sha3(b.Bytes()))
+ } else if b, ok := v.([]interface{}); ok {
+ return ethutil.BigD(crypto.Sha3(ethutil.Encode(b)))
+ } else if s, ok := v.([]*big.Int); ok {
+ v := make([]interface{}, len(s))
+ for i, b := range s {
+ v[i] = b
+ }
+
+ return ethutil.BigD(crypto.Sha3(ethutil.Encode(v)))
+ }
+
+ return nil
+}
+
+type NumberGenerator interface {
+ rand(r *big.Int) *big.Int
+ rand64(r int64) *big.Int
+}
+
+type rnd struct {
+ seed *big.Int
+}
+
+func Rnd(s *big.Int) rnd {
+ return rnd{s}
+}
+
+func (self rnd) rand(r *big.Int) *big.Int {
+ o := b(0).Mod(self.seed, r)
+
+ self.seed.Div(self.seed, r)
+
+ if self.seed.Cmp(ethutil.BigPow(2, 64)) < 0 {
+ self.seed = Sha3(self.seed)
+ }
+
+ return o
+}
+
+func (self rnd) rand64(r int64) *big.Int {
+ return self.rand(b(r))
+}
diff --git a/pow/block.go b/pow/block.go
new file mode 100644
index 000000000..4759e19fb
--- /dev/null
+++ b/pow/block.go
@@ -0,0 +1,9 @@
+package pow
+
+import "math/big"
+
+type Block interface {
+ Diff() *big.Int
+ HashNoNonce() []byte
+ N() []byte
+}
diff --git a/pow/ezp/pow.go b/pow/ezp/pow.go
new file mode 100644
index 000000000..bfe3ea098
--- /dev/null
+++ b/pow/ezp/pow.go
@@ -0,0 +1,89 @@
+package ezp
+
+import (
+ "math/big"
+ "math/rand"
+ "time"
+
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/logger"
+ "github.com/ethereum/go-ethereum/pow"
+ "github.com/obscuren/sha3"
+)
+
+var powlogger = logger.NewLogger("POW")
+
+type EasyPow struct {
+ hash *big.Int
+ HashRate int64
+ turbo bool
+}
+
+func New() *EasyPow {
+ return &EasyPow{turbo: true}
+}
+
+func (pow *EasyPow) GetHashrate() int64 {
+ return pow.HashRate
+}
+
+func (pow *EasyPow) Turbo(on bool) {
+ pow.turbo = on
+}
+
+func (pow *EasyPow) Search(block pow.Block, stop <-chan struct{}) []byte {
+ r := rand.New(rand.NewSource(time.Now().UnixNano()))
+ hash := block.HashNoNonce()
+ diff := block.Diff()
+ i := int64(0)
+ start := time.Now().UnixNano()
+ t := time.Now()
+
+ for {
+ select {
+ case <-stop:
+ powlogger.Infoln("Breaking from mining")
+ pow.HashRate = 0
+ return nil
+ default:
+ i++
+
+ if time.Since(t) > (1 * time.Second) {
+ elapsed := time.Now().UnixNano() - start
+ hashes := ((float64(1e9) / float64(elapsed)) * float64(i)) / 1000
+ pow.HashRate = int64(hashes)
+ powlogger.Infoln("Hashing @", pow.HashRate, "khash")
+
+ t = time.Now()
+ }
+
+ sha := crypto.Sha3(big.NewInt(r.Int63()).Bytes())
+ if pow.verify(hash, diff, sha) {
+ return sha
+ }
+ }
+
+ if !pow.turbo {
+ time.Sleep(20 * time.Microsecond)
+ }
+ }
+
+ return nil
+}
+
+func (pow *EasyPow) verify(hash []byte, diff *big.Int, nonce []byte) bool {
+ sha := sha3.NewKeccak256()
+
+ d := append(hash, nonce...)
+ sha.Write(d)
+
+ verification := new(big.Int).Div(ethutil.BigPow(2, 256), diff)
+ res := ethutil.U256(ethutil.BigD(sha.Sum(nil)))
+
+ return res.Cmp(verification) <= 0
+}
+
+func (pow *EasyPow) Verify(block pow.Block) bool {
+ return pow.verify(block.HashNoNonce(), block.Diff(), block.N())
+}
diff --git a/pow/pow.go b/pow/pow.go
new file mode 100644
index 000000000..c94ee40ba
--- /dev/null
+++ b/pow/pow.go
@@ -0,0 +1,8 @@
+package pow
+
+type PoW interface {
+ Search(block Block, stop <-chan struct{}) []byte
+ Verify(block Block) bool
+ GetHashrate() int64
+ Turbo(bool)
+}
diff --git a/profile.cov b/profile.cov
new file mode 100644
index 000000000..e92cd379f
--- /dev/null
+++ b/profile.cov
@@ -0,0 +1,3038 @@
+mode: count
+github.com/ethereum/go-ethereum/chain/state_transition.go:40.134,42.2 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:44.60,45.20 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:49.2,50.16 2 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:45.20,47.3 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:52.58,53.21 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:57.2,59.17 2 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:53.21,55.3 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:61.60,62.49 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:66.2,66.21 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:70.2,71.17 2 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:62.49,64.3 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:66.21,68.3 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:74.60,75.30 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:78.2,80.12 2 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:75.30,77.3 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:83.54,85.2 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:87.45,91.50 3 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:95.2,97.16 3 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:101.2,104.12 3 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:91.50,93.3 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:97.16,99.3 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:107.42,114.2 4 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:116.53,123.30 2 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:128.2,128.37 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:132.2,132.12 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:123.30,125.3 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:128.37,130.3 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:135.60,139.39 2 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:143.2,155.45 4 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:160.2,162.46 3 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:166.2,166.42 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:170.2,172.26 2 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:198.2,207.41 2 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:264.2,264.8 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:139.39,141.3 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:155.45,157.3 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:162.46,164.3 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:166.42,168.3 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:172.26,181.22 5 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:186.3,186.33 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:181.22,183.4 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:187.4,196.3 4 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:207.41,214.20 3 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:220.3,221.20 2 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:214.20,218.4 2 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:222.4,223.29 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:223.29,225.21 2 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:231.4,231.20 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:225.21,229.5 2 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:267.122,281.2 5 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:284.81,291.2 4 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:34.79,35.48 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:35.48,36.42 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:36.42,37.9 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:42.102,43.48 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:51.2,51.12 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:43.48,44.49 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:44.49,45.21 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:45.21,47.5 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:80.45,87.2 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:90.59,98.2 4 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:100.70,105.18 2 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:109.2,109.55 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:113.2,113.38 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:119.2,124.41 3 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:128.2,128.21 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:137.2,137.12 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:105.18,107.3 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:109.55,111.3 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:113.38,115.3 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:124.41,126.3 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:128.21,129.51 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:129.51,131.4 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:140.36,142.6 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:142.6,143.10 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:144.3,146.83 2 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:150.4,150.22 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:155.4,156.18 2 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:170.3,171.13 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:146.83,148.5 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:150.22,151.10 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:156.18,158.5 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:158.6,169.5 5 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:176.61,178.2 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:180.64,186.53 5 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:194.2,194.15 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:186.53,192.3 3 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:197.55,201.53 3 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:201.53,205.45 4 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:205.45,207.4 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:211.55,215.25 3 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:215.25,216.76 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:216.76,217.15 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:221.4,221.16 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:217.15,220.5 2 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:226.50,234.2 3 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:236.29,238.2 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:240.28,246.2 3 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:78.57,89.2 4 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:91.35,93.2 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:95.34,97.2 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:99.53,101.2 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:103.51,105.2 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:107.52,109.2 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:111.55,115.2 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:117.54,119.2 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:121.232,131.25 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:178.2,180.53 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:131.25,140.17 6 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:159.3,173.62 10 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:140.17,142.11 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:143.4,145.13 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:146.4,149.15 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:150.4,154.13 4 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:173.62,175.4 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:183.99,188.34 3 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:192.2,192.37 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:195.2,197.44 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:188.34,190.3 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:192.37,194.3 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:200.121,211.61 4 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:215.2,216.16 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:220.2,221.44 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:226.2,227.54 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:233.2,233.55 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:238.2,238.66 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:244.2,245.49 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:250.2,252.31 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:258.2,258.41 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:211.61,213.3 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:216.16,218.3 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:221.44,224.3 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:227.54,230.3 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:233.55,236.3 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:238.66,241.3 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:245.49,248.3 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:252.31,255.3 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:258.41,272.3 7 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:272.4,274.3 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:277.120,283.16 4 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:287.2,287.22 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:283.16,285.3 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:290.74,292.37 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:297.2,303.26 4 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:310.2,310.19 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:292.37,294.3 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:303.26,308.3 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:316.73,318.36 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:322.2,323.14 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:335.2,335.72 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:339.2,339.12 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:318.36,320.3 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:323.14,325.3 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:335.72,337.3 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:342.97,347.37 4 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:378.2,382.12 3 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:347.37,348.34 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:353.3,354.25 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:358.3,358.81 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:362.3,362.40 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:366.3,374.68 6 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:348.34,351.4 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:354.25,356.4 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:358.81,360.4 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:362.40,364.4 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:385.96,386.37 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:390.2,403.39 6 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:386.37,388.3 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:34.40,36.2 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:38.62,40.2 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:45.54,47.2 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:49.50,51.2 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:53.44,55.2 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:57.42,59.2 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:61.42,63.2 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:65.40,67.2 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:69.37,71.2 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:73.39,75.2 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:78.45,80.25 2 0
+github.com/ethereum/go-ethereum/chain/filter.go:83.2,84.23 2 0
+github.com/ethereum/go-ethereum/chain/filter.go:88.2,93.41 2 0
+github.com/ethereum/go-ethereum/chain/filter.go:119.2,121.24 2 0
+github.com/ethereum/go-ethereum/chain/filter.go:80.25,82.3 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:84.23,86.3 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:93.41,95.10 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:104.3,104.30 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:116.3,116.59 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:96.3,97.15 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:98.3,99.9 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:104.30,107.18 2 0
+github.com/ethereum/go-ethereum/chain/filter.go:113.4,113.61 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:107.18,110.10 2 0
+github.com/ethereum/go-ethereum/chain/filter.go:124.58,125.33 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:131.2,131.8 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:125.33,126.34 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:126.34,128.4 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:134.76,138.31 2 0
+github.com/ethereum/go-ethereum/chain/filter.go:172.2,172.17 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:138.31,139.57 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:143.3,143.63 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:147.3,148.29 2 0
+github.com/ethereum/go-ethereum/chain/filter.go:152.3,152.46 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:165.3,165.13 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:169.3,169.39 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:139.57,140.12 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:143.63,144.12 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:148.29,150.4 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:152.46,153.95 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:157.4,157.110 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:161.4,162.9 2 0
+github.com/ethereum/go-ethereum/chain/filter.go:153.95,154.13 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:157.110,158.13 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:165.13,166.12 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:175.58,177.24 2 0
+github.com/ethereum/go-ethereum/chain/filter.go:188.2,188.22 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:199.2,199.35 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:177.24,178.34 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:178.34,179.48 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:179.48,181.10 2 0
+github.com/ethereum/go-ethereum/chain/filter.go:184.4,186.3 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:188.22,189.30 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:189.30,190.114 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:190.114,192.10 2 0
+github.com/ethereum/go-ethereum/chain/filter.go:195.4,197.3 1 0
+github.com/ethereum/go-ethereum/chain/error.go:14.38,16.2 1 0
+github.com/ethereum/go-ethereum/chain/error.go:18.37,20.2 1 0
+github.com/ethereum/go-ethereum/chain/error.go:22.34,26.2 2 0
+github.com/ethereum/go-ethereum/chain/error.go:32.37,34.2 1 0
+github.com/ethereum/go-ethereum/chain/error.go:36.35,38.2 1 0
+github.com/ethereum/go-ethereum/chain/error.go:40.33,44.2 2 0
+github.com/ethereum/go-ethereum/chain/error.go:51.42,53.2 1 0
+github.com/ethereum/go-ethereum/chain/error.go:55.70,57.2 1 0
+github.com/ethereum/go-ethereum/chain/error.go:59.38,63.2 2 0
+github.com/ethereum/go-ethereum/chain/error.go:70.36,74.2 2 0
+github.com/ethereum/go-ethereum/chain/error.go:75.40,77.2 1 0
+github.com/ethereum/go-ethereum/chain/error.go:78.51,80.2 1 0
+github.com/ethereum/go-ethereum/chain/error.go:87.37,89.2 1 0
+github.com/ethereum/go-ethereum/chain/error.go:91.43,93.2 1 0
+github.com/ethereum/go-ethereum/chain/error.go:95.33,99.2 2 0
+github.com/ethereum/go-ethereum/chain/error.go:105.35,107.2 1 0
+github.com/ethereum/go-ethereum/chain/error.go:108.41,110.2 1 0
+github.com/ethereum/go-ethereum/chain/error.go:112.36,116.2 2 0
+github.com/ethereum/go-ethereum/chain/error.go:122.37,124.2 1 0
+github.com/ethereum/go-ethereum/chain/error.go:125.30,128.2 2 0
+github.com/ethereum/go-ethereum/chain/vm_env.go:17.83,23.2 1 0
+github.com/ethereum/go-ethereum/chain/vm_env.go:25.43,25.70 1 0
+github.com/ethereum/go-ethereum/chain/vm_env.go:26.43,26.71 1 0
+github.com/ethereum/go-ethereum/chain/vm_env.go:27.43,27.73 1 0
+github.com/ethereum/go-ethereum/chain/vm_env.go:28.43,28.73 1 0
+github.com/ethereum/go-ethereum/chain/vm_env.go:29.43,29.69 1 0
+github.com/ethereum/go-ethereum/chain/vm_env.go:30.43,30.75 1 0
+github.com/ethereum/go-ethereum/chain/vm_env.go:31.43,31.71 1 0
+github.com/ethereum/go-ethereum/chain/vm_env.go:32.43,32.67 1 0
+github.com/ethereum/go-ethereum/chain/vm_env.go:33.43,33.64 1 0
+github.com/ethereum/go-ethereum/chain/vm_env.go:34.43,34.73 1 0
+github.com/ethereum/go-ethereum/chain/vm_env.go:35.43,37.2 1 0
+github.com/ethereum/go-ethereum/chain/vm_env.go:38.73,40.2 1 0
+github.com/ethereum/go-ethereum/chain/asm.go:11.48,13.6 2 0
+github.com/ethereum/go-ethereum/chain/asm.go:49.2,49.12 1 0
+github.com/ethereum/go-ethereum/chain/asm.go:13.6,14.50 1 0
+github.com/ethereum/go-ethereum/chain/asm.go:19.3,25.13 4 0
+github.com/ethereum/go-ethereum/chain/asm.go:46.3,46.27 1 0
+github.com/ethereum/go-ethereum/chain/asm.go:14.50,16.4 1 0
+github.com/ethereum/go-ethereum/chain/asm.go:26.3,33.39 3 0
+github.com/ethereum/go-ethereum/chain/asm.go:37.4,38.22 2 0
+github.com/ethereum/go-ethereum/chain/asm.go:41.4,43.31 2 0
+github.com/ethereum/go-ethereum/chain/asm.go:33.39,35.5 1 0
+github.com/ethereum/go-ethereum/chain/asm.go:38.22,40.5 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:17.42,27.4 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:27.4,32.3 4 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:35.58,39.33 3 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:45.2,45.13 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:39.33,41.3 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:41.4,43.3 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:63.38,71.2 4 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:73.67,75.2 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:77.40,79.20 2 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:94.2,94.88 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:79.20,90.3 6 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:90.4,92.3 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:98.64,102.28 3 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:107.2,118.19 4 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:125.2,125.14 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:102.28,105.3 2 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:118.19,123.3 3 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:128.33,140.2 6 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:143.49,154.2 6 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:157.48,159.2 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:162.52,165.2 2 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:167.92,169.18 2 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:174.2,174.35 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:185.2,185.8 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:169.18,171.3 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:174.35,178.42 2 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:182.3,182.40 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:178.42,179.9 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:188.62,190.20 2 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:203.2,203.38 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:190.20,191.31 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:200.3,200.13 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:191.31,193.63 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:193.63,194.63 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:194.63,196.6 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:206.69,208.60 2 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:214.2,214.60 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:218.2,218.14 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:208.60,209.35 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:209.35,210.9 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:214.60,216.3 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:221.57,224.2 2 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:226.79,228.19 2 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:232.2,235.37 3 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:239.2,243.16 4 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:228.19,230.3 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:235.37,237.3 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:246.71,252.2 4 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:255.60,261.2 3 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:263.32,264.28 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:264.28,266.3 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:269.72,271.2 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:274.99,275.49 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:284.2,285.26 2 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:275.49,282.3 4 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:285.26,288.3 2 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:291.81,293.15 2 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:295.2,295.49 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:321.2,321.26 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:326.2,328.8 2 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:293.15,293.42 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:295.49,302.20 2 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:307.3,309.17 3 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:317.3,318.24 2 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:302.20,305.4 2 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:309.17,316.4 5 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:321.26,324.3 2 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:341.48,344.31 2 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:348.2,348.14 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:344.31,346.3 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:351.44,353.48 2 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:357.2,357.28 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:353.48,355.3 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:365.48,368.2 2 0
+github.com/ethereum/go-ethereum/chain/dagger.go:31.41,33.2 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:35.36,37.2 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:39.77,47.6 7 0
+github.com/ethereum/go-ethereum/chain/dagger.go:76.2,76.12 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:47.6,48.10 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:71.3,71.17 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:49.3,52.14 3 0
+github.com/ethereum/go-ethereum/chain/dagger.go:53.3,56.41 2 0
+github.com/ethereum/go-ethereum/chain/dagger.go:65.4,66.35 2 0
+github.com/ethereum/go-ethereum/chain/dagger.go:56.41,63.5 5 0
+github.com/ethereum/go-ethereum/chain/dagger.go:66.35,68.5 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:71.17,73.4 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:79.75,92.2 8 0
+github.com/ethereum/go-ethereum/chain/dagger.go:94.44,95.2 0 0
+github.com/ethereum/go-ethereum/chain/dagger.go:104.59,107.28 2 0
+github.com/ethereum/go-ethereum/chain/dagger.go:125.2,125.14 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:107.28,112.23 4 0
+github.com/ethereum/go-ethereum/chain/dagger.go:120.3,120.12 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:112.23,117.4 2 0
+github.com/ethereum/go-ethereum/chain/dagger.go:120.12,121.9 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:128.57,141.40 8 0
+github.com/ethereum/go-ethereum/chain/dagger.go:146.2,146.40 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:153.2,153.24 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:141.40,145.3 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:146.40,148.29 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:148.29,150.4 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:156.60,163.2 4 0
+github.com/ethereum/go-ethereum/chain/dagger.go:165.52,173.2 5 0
+github.com/ethereum/go-ethereum/chain/dagger.go:175.54,176.12 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:180.2,181.12 2 0
+github.com/ethereum/go-ethereum/chain/dagger.go:187.2,193.39 6 0
+github.com/ethereum/go-ethereum/chain/dagger.go:206.2,208.12 2 0
+github.com/ethereum/go-ethereum/chain/dagger.go:176.12,178.3 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:181.12,183.3 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:183.4,185.3 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:193.39,204.3 9 0
+github.com/ethereum/go-ethereum/chain/dagger.go:211.32,214.2 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:216.46,224.25 6 0
+github.com/ethereum/go-ethereum/chain/dagger.go:240.2,240.31 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:224.25,238.3 10 0
+github.com/ethereum/go-ethereum/chain/types/block.go:23.45,30.2 5 0
+github.com/ethereum/go-ethereum/chain/types/block.go:32.41,34.2 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:38.46,40.29 2 0
+github.com/ethereum/go-ethereum/chain/types/block.go:44.2,44.12 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:40.29,42.3 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:49.41,55.2 2 0
+github.com/ethereum/go-ethereum/chain/types/block.go:62.35,62.62 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:63.40,65.2 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:66.45,66.95 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:68.33,68.72 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:104.43,109.2 3 0
+github.com/ethereum/go-ethereum/chain/types/block.go:112.59,117.2 3 0
+github.com/ethereum/go-ethereum/chain/types/block.go:124.23,143.2 4 0
+github.com/ethereum/go-ethereum/chain/types/block.go:146.42,149.2 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:151.42,153.2 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:155.42,157.2 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:159.49,161.2 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:163.58,164.42 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:170.2,179.36 7 0
+github.com/ethereum/go-ethereum/chain/types/block.go:164.42,166.3 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:182.43,188.2 4 0
+github.com/ethereum/go-ethereum/chain/types/block.go:190.61,191.39 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:197.2,197.12 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:191.39,192.42 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:192.42,194.4 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:201.28,203.2 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:205.28,208.2 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:211.47,214.35 2 0
+github.com/ethereum/go-ethereum/chain/types/block.go:219.2,219.13 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:214.35,217.3 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:222.45,225.37 2 0
+github.com/ethereum/go-ethereum/chain/types/block.go:230.2,230.15 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:225.37,228.3 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:233.48,236.2 2 0
+github.com/ethereum/go-ethereum/chain/types/block.go:238.51,242.2 3 0
+github.com/ethereum/go-ethereum/chain/types/block.go:244.54,247.2 2 0
+github.com/ethereum/go-ethereum/chain/types/block.go:249.44,251.2 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:253.40,257.2 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:259.44,262.2 2 0
+github.com/ethereum/go-ethereum/chain/types/block.go:264.60,269.37 2 0
+github.com/ethereum/go-ethereum/chain/types/block.go:283.2,283.37 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:269.37,274.34 3 0
+github.com/ethereum/go-ethereum/chain/types/block.go:274.34,279.4 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:283.37,286.37 3 0
+github.com/ethereum/go-ethereum/chain/types/block.go:286.37,288.4 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:293.53,309.2 15 0
+github.com/ethereum/go-ethereum/chain/types/block.go:311.59,316.2 3 0
+github.com/ethereum/go-ethereum/chain/types/block.go:318.39,320.2 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:322.40,324.2 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:326.37,328.2 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:330.42,332.2 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:334.50,365.2 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:367.44,369.2 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:371.37,410.2 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:412.47,414.2 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:417.42,419.2 1 0
+github.com/ethereum/go-ethereum/chain/types/bloom9.go:11.44,13.35 2 0
+github.com/ethereum/go-ethereum/chain/types/bloom9.go:17.2,17.46 1 0
+github.com/ethereum/go-ethereum/chain/types/bloom9.go:13.35,15.3 1 0
+github.com/ethereum/go-ethereum/chain/types/bloom9.go:20.42,22.27 2 0
+github.com/ethereum/go-ethereum/chain/types/bloom9.go:37.2,37.12 1 0
+github.com/ethereum/go-ethereum/chain/types/bloom9.go:22.27,24.36 2 0
+github.com/ethereum/go-ethereum/chain/types/bloom9.go:28.3,28.26 1 0
+github.com/ethereum/go-ethereum/chain/types/bloom9.go:24.36,26.4 1 0
+github.com/ethereum/go-ethereum/chain/types/bloom9.go:28.26,30.4 1 0
+github.com/ethereum/go-ethereum/chain/types/bloom9.go:40.32,42.35 2 0
+github.com/ethereum/go-ethereum/chain/types/bloom9.go:48.2,48.10 1 0
+github.com/ethereum/go-ethereum/chain/types/bloom9.go:42.35,46.3 3 0
+github.com/ethereum/go-ethereum/chain/types/bloom9.go:51.42,56.2 3 0
+github.com/ethereum/go-ethereum/chain/types/derive_sha.go:13.43,15.34 2 0
+github.com/ethereum/go-ethereum/chain/types/derive_sha.go:19.2,19.23 1 0
+github.com/ethereum/go-ethereum/chain/types/derive_sha.go:15.34,17.3 1 0
+github.com/ethereum/go-ethereum/chain/types/receipt.go:19.67,21.2 1 0
+github.com/ethereum/go-ethereum/chain/types/receipt.go:23.55,28.2 3 0
+github.com/ethereum/go-ethereum/chain/types/receipt.go:30.47,32.2 1 0
+github.com/ethereum/go-ethereum/chain/types/receipt.go:34.61,40.16 5 0
+github.com/ethereum/go-ethereum/chain/types/receipt.go:40.16,42.3 1 0
+github.com/ethereum/go-ethereum/chain/types/receipt.go:45.44,47.2 1 0
+github.com/ethereum/go-ethereum/chain/types/receipt.go:49.41,51.2 1 0
+github.com/ethereum/go-ethereum/chain/types/receipt.go:53.47,54.57 1 0
+github.com/ethereum/go-ethereum/chain/types/receipt.go:58.2,58.13 1 0
+github.com/ethereum/go-ethereum/chain/types/receipt.go:54.57,56.3 1 0
+github.com/ethereum/go-ethereum/chain/types/receipt.go:61.38,63.2 1 0
+github.com/ethereum/go-ethereum/chain/types/receipt.go:67.43,67.63 1 0
+github.com/ethereum/go-ethereum/chain/types/receipt.go:68.43,68.74 1 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:15.39,18.2 1 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:34.87,36.2 1 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:38.96,40.2 1 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:42.56,47.2 3 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:49.63,54.2 3 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:56.46,58.2 1 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:60.48,63.2 2 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:65.38,69.2 2 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:71.47,73.2 1 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:76.42,78.2 1 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:80.67,88.2 2 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:90.53,96.2 3 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:98.43,112.2 7 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:114.40,119.40 2 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:123.2,123.37 1 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:119.40,121.3 1 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:126.49,135.2 5 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:137.46,143.2 2 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:145.50,147.2 1 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:149.43,151.2 1 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:153.47,155.2 1 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:157.63,169.34 10 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:169.34,171.3 1 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:174.40,201.2 1 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:206.48,209.26 2 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:214.2,214.12 1 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:209.26,212.3 1 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:216.44,216.61 1 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:217.44,217.71 1 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:218.44,218.72 1 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:222.40,224.2 1 0
+github.com/ethereum/go-ethereum/compression/rle/read_write.go:20.45,23.32 2 4
+github.com/ethereum/go-ethereum/compression/rle/read_write.go:45.2,45.25 1 4
+github.com/ethereum/go-ethereum/compression/rle/read_write.go:23.32,24.22 1 4
+github.com/ethereum/go-ethereum/compression/rle/read_write.go:24.22,25.22 1 4
+github.com/ethereum/go-ethereum/compression/rle/read_write.go:25.22,26.21 1 4
+github.com/ethereum/go-ethereum/compression/rle/read_write.go:36.5,36.8 1 4
+github.com/ethereum/go-ethereum/compression/rle/read_write.go:27.5,28.22 1 1
+github.com/ethereum/go-ethereum/compression/rle/read_write.go:29.5,30.26 1 1
+github.com/ethereum/go-ethereum/compression/rle/read_write.go:31.5,32.26 1 1
+github.com/ethereum/go-ethereum/compression/rle/read_write.go:33.5,34.46 1 1
+github.com/ethereum/go-ethereum/compression/rle/read_write.go:37.6,39.5 1 0
+github.com/ethereum/go-ethereum/compression/rle/read_write.go:40.5,42.4 1 0
+github.com/ethereum/go-ethereum/compression/rle/read_write.go:48.52,49.9 1 0
+github.com/ethereum/go-ethereum/compression/rle/read_write.go:50.2,51.38 1 0
+github.com/ethereum/go-ethereum/compression/rle/read_write.go:52.2,54.32 2 0
+github.com/ethereum/go-ethereum/compression/rle/read_write.go:60.3,60.39 1 0
+github.com/ethereum/go-ethereum/compression/rle/read_write.go:61.2,62.64 1 0
+github.com/ethereum/go-ethereum/compression/rle/read_write.go:67.3,67.14 1 0
+github.com/ethereum/go-ethereum/compression/rle/read_write.go:68.2,69.20 1 0
+github.com/ethereum/go-ethereum/compression/rle/read_write.go:54.32,55.19 1 0
+github.com/ethereum/go-ethereum/compression/rle/read_write.go:58.4,58.7 1 0
+github.com/ethereum/go-ethereum/compression/rle/read_write.go:55.19,56.10 1 0
+github.com/ethereum/go-ethereum/compression/rle/read_write.go:62.64,64.4 1 0
+github.com/ethereum/go-ethereum/compression/rle/read_write.go:64.5,64.79 1 0
+github.com/ethereum/go-ethereum/compression/rle/read_write.go:64.79,66.4 1 0
+github.com/ethereum/go-ethereum/compression/rle/read_write.go:73.34,77.19 3 0
+github.com/ethereum/go-ethereum/compression/rle/read_write.go:83.2,83.20 1 0
+github.com/ethereum/go-ethereum/compression/rle/read_write.go:77.19,81.3 3 0
+github.com/ethereum/go-ethereum/crypto/crypto.go:13.31,18.2 3 1
+github.com/ethereum/go-ethereum/crypto/crypto.go:21.51,23.2 1 0
+github.com/ethereum/go-ethereum/crypto/crypto.go:25.33,29.2 2 1
+github.com/ethereum/go-ethereum/crypto/crypto.go:31.36,36.2 3 1
+github.com/ethereum/go-ethereum/crypto/crypto.go:38.36,47.2 3 0
+github.com/ethereum/go-ethereum/crypto/key_manager.go:18.55,20.2 1 0
+github.com/ethereum/go-ethereum/crypto/key_manager.go:22.52,24.2 1 0
+github.com/ethereum/go-ethereum/crypto/key_manager.go:26.41,28.2 1 0
+github.com/ethereum/go-ethereum/crypto/key_manager.go:30.41,32.2 1 0
+github.com/ethereum/go-ethereum/crypto/key_manager.go:34.42,36.2 1 0
+github.com/ethereum/go-ethereum/crypto/key_manager.go:38.41,40.2 1 0
+github.com/ethereum/go-ethereum/crypto/key_manager.go:42.39,44.2 1 0
+github.com/ethereum/go-ethereum/crypto/key_manager.go:46.67,48.16 2 0
+github.com/ethereum/go-ethereum/crypto/key_manager.go:51.2,52.12 2 0
+github.com/ethereum/go-ethereum/crypto/key_manager.go:48.16,50.3 1 0
+github.com/ethereum/go-ethereum/crypto/key_manager.go:55.61,57.12 2 0
+github.com/ethereum/go-ethereum/crypto/key_manager.go:64.2,64.21 1 0
+github.com/ethereum/go-ethereum/crypto/key_manager.go:57.12,60.17 3 0
+github.com/ethereum/go-ethereum/crypto/key_manager.go:60.17,62.4 1 0
+github.com/ethereum/go-ethereum/crypto/key_manager.go:67.45,69.2 1 0
+github.com/ethereum/go-ethereum/crypto/key_manager.go:71.80,72.29 1 0
+github.com/ethereum/go-ethereum/crypto/key_manager.go:75.2,79.16 5 0
+github.com/ethereum/go-ethereum/crypto/key_manager.go:82.2,85.12 4 0
+github.com/ethereum/go-ethereum/crypto/key_manager.go:72.29,74.3 1 0
+github.com/ethereum/go-ethereum/crypto/key_manager.go:79.16,81.3 1 0
+github.com/ethereum/go-ethereum/crypto/key_manager.go:88.50,89.31 1 0
+github.com/ethereum/go-ethereum/crypto/key_manager.go:92.2,93.12 2 0
+github.com/ethereum/go-ethereum/crypto/key_manager.go:89.31,91.3 1 0
+github.com/ethereum/go-ethereum/crypto/key_manager.go:96.73,98.12 2 0
+github.com/ethereum/go-ethereum/crypto/key_manager.go:105.2,105.20 1 0
+github.com/ethereum/go-ethereum/crypto/key_manager.go:108.2,108.42 1 0
+github.com/ethereum/go-ethereum/crypto/key_manager.go:98.12,101.17 3 0
+github.com/ethereum/go-ethereum/crypto/key_manager.go:101.17,103.4 1 0
+github.com/ethereum/go-ethereum/crypto/key_manager.go:105.20,107.3 1 0
+github.com/ethereum/go-ethereum/crypto/key_manager.go:111.96,113.16 2 0
+github.com/ethereum/go-ethereum/crypto/key_manager.go:116.2,116.42 1 0
+github.com/ethereum/go-ethereum/crypto/key_manager.go:113.16,115.3 1 0
+github.com/ethereum/go-ethereum/crypto/key_manager.go:119.87,121.16 2 0
+github.com/ethereum/go-ethereum/crypto/key_manager.go:124.2,124.42 1 0
+github.com/ethereum/go-ethereum/crypto/key_manager.go:121.16,123.3 1 0
+github.com/ethereum/go-ethereum/crypto/key_manager.go:127.47,130.2 2 0
+github.com/ethereum/go-ethereum/crypto/key_store.go:24.51,26.2 1 0
+github.com/ethereum/go-ethereum/crypto/key_store.go:28.67,31.2 2 0
+github.com/ethereum/go-ethereum/crypto/key_store.go:33.61,35.16 2 0
+github.com/ethereum/go-ethereum/crypto/key_store.go:38.2,40.16 3 0
+github.com/ethereum/go-ethereum/crypto/key_store.go:44.2,44.24 1 0
+github.com/ethereum/go-ethereum/crypto/key_store.go:47.2,47.21 1 0
+github.com/ethereum/go-ethereum/crypto/key_store.go:35.16,37.3 1 0
+github.com/ethereum/go-ethereum/crypto/key_store.go:40.16,42.3 1 0
+github.com/ethereum/go-ethereum/crypto/key_store.go:44.24,46.3 1 0
+github.com/ethereum/go-ethereum/crypto/key_store.go:54.69,61.38 7 0
+github.com/ethereum/go-ethereum/crypto/key_store.go:68.2,69.19 2 0
+github.com/ethereum/go-ethereum/crypto/key_store.go:73.2,76.16 4 0
+github.com/ethereum/go-ethereum/crypto/key_store.go:80.2,82.16 3 0
+github.com/ethereum/go-ethereum/crypto/key_store.go:86.2,88.16 3 0
+github.com/ethereum/go-ethereum/crypto/key_store.go:92.2,94.16 3 0
+github.com/ethereum/go-ethereum/crypto/key_store.go:98.2,98.12 1 0
+github.com/ethereum/go-ethereum/crypto/key_store.go:61.38,66.3 4 0
+github.com/ethereum/go-ethereum/crypto/key_store.go:69.19,71.3 1 0
+github.com/ethereum/go-ethereum/crypto/key_store.go:76.16,78.3 1 0
+github.com/ethereum/go-ethereum/crypto/key_store.go:82.16,84.3 1 0
+github.com/ethereum/go-ethereum/crypto/key_store.go:88.16,90.3 1 0
+github.com/ethereum/go-ethereum/crypto/key_store.go:94.16,96.3 1 0
+github.com/ethereum/go-ethereum/crypto/key_store.go:101.63,103.19 2 0
+github.com/ethereum/go-ethereum/crypto/key_store.go:106.2,109.16 3 0
+github.com/ethereum/go-ethereum/crypto/key_store.go:112.2,112.36 1 0
+github.com/ethereum/go-ethereum/crypto/key_store.go:103.19,105.3 1 0
+github.com/ethereum/go-ethereum/crypto/key_store.go:109.16,111.3 1 0
+github.com/ethereum/go-ethereum/crypto/keypair.go:19.36,23.2 3 0
+github.com/ethereum/go-ethereum/crypto/keypair.go:25.57,27.16 2 0
+github.com/ethereum/go-ethereum/crypto/keypair.go:31.2,31.61 1 0
+github.com/ethereum/go-ethereum/crypto/keypair.go:27.16,29.3 1 0
+github.com/ethereum/go-ethereum/crypto/keypair.go:34.36,35.22 1 0
+github.com/ethereum/go-ethereum/crypto/keypair.go:38.2,38.18 1 0
+github.com/ethereum/go-ethereum/crypto/keypair.go:35.22,37.3 1 0
+github.com/ethereum/go-ethereum/crypto/keypair.go:41.37,42.22 1 0
+github.com/ethereum/go-ethereum/crypto/keypair.go:45.2,45.19 1 0
+github.com/ethereum/go-ethereum/crypto/keypair.go:42.22,44.3 1 0
+github.com/ethereum/go-ethereum/crypto/keypair.go:48.64,50.2 1 0
+github.com/ethereum/go-ethereum/crypto/keypair.go:52.38,54.2 1 0
+github.com/ethereum/go-ethereum/crypto/keypair.go:56.45,58.2 1 0
+github.com/ethereum/go-ethereum/crypto/keyring.go:15.28,17.2 1 0
+github.com/ethereum/go-ethereum/crypto/keyring.go:19.48,21.2 1 0
+github.com/ethereum/go-ethereum/crypto/keyring.go:23.46,24.21 1 0
+github.com/ethereum/go-ethereum/crypto/keyring.go:28.2,28.12 1 0
+github.com/ethereum/go-ethereum/crypto/keyring.go:24.21,26.3 1 0
+github.com/ethereum/go-ethereum/crypto/keyring.go:31.32,33.2 1 0
+github.com/ethereum/go-ethereum/crypto/keyring.go:35.29,37.2 1 0
+github.com/ethereum/go-ethereum/crypto/keyring.go:39.42,40.33 1 0
+github.com/ethereum/go-ethereum/crypto/keyring.go:40.33,42.3 1 0
+github.com/ethereum/go-ethereum/crypto/keyring.go:45.44,47.27 2 0
+github.com/ethereum/go-ethereum/crypto/keyring.go:50.2,50.16 1 0
+github.com/ethereum/go-ethereum/crypto/keyring.go:47.27,49.3 1 0
+github.com/ethereum/go-ethereum/crypto/keyring.go:53.59,57.16 4 0
+github.com/ethereum/go-ethereum/crypto/keyring.go:60.2,61.16 2 0
+github.com/ethereum/go-ethereum/crypto/keyring.go:64.2,64.21 1 0
+github.com/ethereum/go-ethereum/crypto/keyring.go:57.16,59.3 1 0
+github.com/ethereum/go-ethereum/crypto/keyring.go:61.16,63.3 1 0
+github.com/ethereum/go-ethereum/crypto/keyring.go:67.61,70.45 3 0
+github.com/ethereum/go-ethereum/crypto/keyring.go:84.2,84.39 1 0
+github.com/ethereum/go-ethereum/crypto/keyring.go:70.45,73.23 3 0
+github.com/ethereum/go-ethereum/crypto/keyring.go:79.3,79.23 1 0
+github.com/ethereum/go-ethereum/crypto/keyring.go:73.23,75.4 1 0
+github.com/ethereum/go-ethereum/crypto/keyring.go:75.5,75.29 1 0
+github.com/ethereum/go-ethereum/crypto/keyring.go:75.29,77.4 1 0
+github.com/ethereum/go-ethereum/crypto/keyring.go:79.23,81.4 1 0
+github.com/ethereum/go-ethereum/crypto/keyring.go:87.61,89.27 2 0
+github.com/ethereum/go-ethereum/crypto/keyring.go:96.2,96.21 1 0
+github.com/ethereum/go-ethereum/crypto/keyring.go:89.27,91.17 2 0
+github.com/ethereum/go-ethereum/crypto/keyring.go:94.3,94.30 1 0
+github.com/ethereum/go-ethereum/crypto/keyring.go:91.17,93.4 1 0
+github.com/ethereum/go-ethereum/crypto/keyring.go:99.57,102.16 3 0
+github.com/ethereum/go-ethereum/crypto/keyring.go:106.2,107.16 2 0
+github.com/ethereum/go-ethereum/crypto/keyring.go:110.2,110.21 1 0
+github.com/ethereum/go-ethereum/crypto/keyring.go:102.16,105.3 2 0
+github.com/ethereum/go-ethereum/crypto/keyring.go:107.16,109.3 1 0
+github.com/ethereum/go-ethereum/crypto/keyring.go:113.38,115.2 1 0
+github.com/ethereum/go-ethereum/crypto/keyring.go:117.45,119.32 2 0
+github.com/ethereum/go-ethereum/crypto/keyring.go:122.2,122.10 1 0
+github.com/ethereum/go-ethereum/crypto/keyring.go:119.32,121.3 1 0
+github.com/ethereum/go-ethereum/crypto/mnemonic.go:9.50,10.26 1 24
+github.com/ethereum/go-ethereum/crypto/mnemonic.go:15.2,15.11 1 0
+github.com/ethereum/go-ethereum/crypto/mnemonic.go:10.26,11.17 1 18817
+github.com/ethereum/go-ethereum/crypto/mnemonic.go:11.17,13.4 1 24
+github.com/ethereum/go-ethereum/crypto/mnemonic.go:18.46,22.56 3 1
+github.com/ethereum/go-ethereum/crypto/mnemonic.go:30.2,30.12 1 1
+github.com/ethereum/go-ethereum/crypto/mnemonic.go:22.56,29.3 6 8
+github.com/ethereum/go-ethereum/crypto/mnemonic.go:33.46,37.39 3 1
+github.com/ethereum/go-ethereum/crypto/mnemonic.go:59.2,59.12 1 1
+github.com/ethereum/go-ethereum/crypto/mnemonic.go:37.39,50.12 9 8
+github.com/ethereum/go-ethereum/crypto/mnemonic.go:53.3,53.12 1 8
+github.com/ethereum/go-ethereum/crypto/mnemonic.go:56.3,57.32 2 8
+github.com/ethereum/go-ethereum/crypto/mnemonic.go:50.12,52.4 1 4
+github.com/ethereum/go-ethereum/crypto/mnemonic.go:53.12,55.4 1 2
+github.com/ethereum/go-ethereum/ethdb/memory_database.go:16.45,20.2 2 0
+github.com/ethereum/go-ethereum/ethdb/memory_database.go:22.54,24.2 1 0
+github.com/ethereum/go-ethereum/ethdb/memory_database.go:26.56,28.2 1 0
+github.com/ethereum/go-ethereum/ethdb/memory_database.go:38.49,42.2 2 0
+github.com/ethereum/go-ethereum/ethdb/memory_database.go:44.32,45.30 1 0
+github.com/ethereum/go-ethereum/ethdb/memory_database.go:45.30,49.3 3 0
+github.com/ethereum/go-ethereum/ethdb/memory_database.go:52.32,53.2 0 0
+github.com/ethereum/go-ethereum/ethdb/memory_database.go:55.45,58.35 2 0
+github.com/ethereum/go-ethereum/ethdb/memory_database.go:62.2,62.13 1 0
+github.com/ethereum/go-ethereum/ethdb/memory_database.go:58.35,60.3 1 0
+github.com/ethereum/go-ethereum/ethdb/database.go:18.56,23.16 3 0
+github.com/ethereum/go-ethereum/ethdb/database.go:27.2,29.22 2 0
+github.com/ethereum/go-ethereum/ethdb/database.go:23.16,25.3 1 0
+github.com/ethereum/go-ethereum/ethdb/database.go:32.56,33.15 1 0
+github.com/ethereum/go-ethereum/ethdb/database.go:37.2,38.16 2 0
+github.com/ethereum/go-ethereum/ethdb/database.go:33.15,35.3 1 0
+github.com/ethereum/go-ethereum/ethdb/database.go:38.16,40.3 1 0
+github.com/ethereum/go-ethereum/ethdb/database.go:43.58,45.16 2 0
+github.com/ethereum/go-ethereum/ethdb/database.go:49.2,49.15 1 0
+github.com/ethereum/go-ethereum/ethdb/database.go:53.2,53.17 1 0
+github.com/ethereum/go-ethereum/ethdb/database.go:45.16,47.3 1 0
+github.com/ethereum/go-ethereum/ethdb/database.go:49.15,51.3 1 0
+github.com/ethereum/go-ethereum/ethdb/database.go:56.51,58.2 1 0
+github.com/ethereum/go-ethereum/ethdb/database.go:60.47,63.20 2 0
+github.com/ethereum/go-ethereum/ethdb/database.go:67.2,67.13 1 0
+github.com/ethereum/go-ethereum/ethdb/database.go:63.20,65.3 1 0
+github.com/ethereum/go-ethereum/ethdb/database.go:70.58,72.2 1 0
+github.com/ethereum/go-ethereum/ethdb/database.go:74.34,77.2 1 0
+github.com/ethereum/go-ethereum/ethdb/database.go:79.34,81.18 2 0
+github.com/ethereum/go-ethereum/ethdb/database.go:81.18,88.3 5 0
+github.com/ethereum/go-ethereum/ethutil/bytes.go:14.35,16.2 1 1
+github.com/ethereum/go-ethereum/ethutil/bytes.go:18.60,19.22 1 0
+github.com/ethereum/go-ethereum/ethutil/bytes.go:25.2,25.10 1 0
+github.com/ethereum/go-ethereum/ethutil/bytes.go:19.22,20.34 1 0
+github.com/ethereum/go-ethereum/ethutil/bytes.go:20.34,22.4 1 0
+github.com/ethereum/go-ethereum/ethutil/bytes.go:31.54,34.16 3 1
+github.com/ethereum/go-ethereum/ethutil/bytes.go:38.2,38.41 1 1
+github.com/ethereum/go-ethereum/ethutil/bytes.go:34.16,36.3 1 0
+github.com/ethereum/go-ethereum/ethutil/bytes.go:44.37,53.16 6 2
+github.com/ethereum/go-ethereum/ethutil/bytes.go:57.2,57.15 1 2
+github.com/ethereum/go-ethereum/ethutil/bytes.go:53.16,55.3 1 0
+github.com/ethereum/go-ethereum/ethutil/bytes.go:63.43,64.25 1 5
+github.com/ethereum/go-ethereum/ethutil/bytes.go:84.2,84.8 1 5
+github.com/ethereum/go-ethereum/ethutil/bytes.go:65.2,67.58 2 1
+github.com/ethereum/go-ethereum/ethutil/bytes.go:68.2,72.20 4 2
+github.com/ethereum/go-ethereum/ethutil/bytes.go:73.2,77.20 4 1
+github.com/ethereum/go-ethereum/ethutil/bytes.go:78.2,81.20 3 1
+github.com/ethereum/go-ethereum/ethutil/bytes.go:90.32,91.14 1 7
+github.com/ethereum/go-ethereum/ethutil/bytes.go:95.2,95.33 1 5
+github.com/ethereum/go-ethereum/ethutil/bytes.go:91.14,93.3 1 2
+github.com/ethereum/go-ethereum/ethutil/bytes.go:101.47,106.2 3 1
+github.com/ethereum/go-ethereum/ethutil/bytes.go:108.29,111.2 2 5
+github.com/ethereum/go-ethereum/ethutil/bytes.go:113.33,115.2 1 2
+github.com/ethereum/go-ethereum/ethutil/bytes.go:117.35,121.2 2 3
+github.com/ethereum/go-ethereum/ethutil/bytes.go:123.76,124.70 1 0
+github.com/ethereum/go-ethereum/ethutil/bytes.go:130.2,130.8 1 0
+github.com/ethereum/go-ethereum/ethutil/bytes.go:124.70,126.3 1 0
+github.com/ethereum/go-ethereum/ethutil/bytes.go:126.4,128.3 1 0
+github.com/ethereum/go-ethereum/ethutil/bytes.go:133.37,134.20 1 4
+github.com/ethereum/go-ethereum/ethutil/bytes.go:138.2,139.53 2 3
+github.com/ethereum/go-ethereum/ethutil/bytes.go:147.2,147.27 1 2
+github.com/ethereum/go-ethereum/ethutil/bytes.go:134.20,136.3 1 1
+github.com/ethereum/go-ethereum/ethutil/bytes.go:139.53,141.3 1 1
+github.com/ethereum/go-ethereum/ethutil/bytes.go:141.4,141.46 1 2
+github.com/ethereum/go-ethereum/ethutil/bytes.go:141.46,143.3 1 1
+github.com/ethereum/go-ethereum/ethutil/bytes.go:143.4,145.3 1 1
+github.com/ethereum/go-ethereum/ethutil/bytes.go:150.50,151.28 1 2
+github.com/ethereum/go-ethereum/ethutil/bytes.go:167.2,167.8 1 2
+github.com/ethereum/go-ethereum/ethutil/bytes.go:151.28,152.27 1 4
+github.com/ethereum/go-ethereum/ethutil/bytes.go:153.3,155.16 2 3
+github.com/ethereum/go-ethereum/ethutil/bytes.go:161.4,161.48 1 3
+github.com/ethereum/go-ethereum/ethutil/bytes.go:162.3,163.45 1 1
+github.com/ethereum/go-ethereum/ethutil/bytes.go:155.16,157.5 1 1
+github.com/ethereum/go-ethereum/ethutil/bytes.go:157.6,159.5 1 2
+github.com/ethereum/go-ethereum/ethutil/bytes.go:170.48,171.20 1 6
+github.com/ethereum/go-ethereum/ethutil/bytes.go:175.2,178.15 3 5
+github.com/ethereum/go-ethereum/ethutil/bytes.go:171.20,173.3 1 1
+github.com/ethereum/go-ethereum/ethutil/bytes.go:181.47,182.20 1 7
+github.com/ethereum/go-ethereum/ethutil/bytes.go:186.2,189.15 3 6
+github.com/ethereum/go-ethereum/ethutil/bytes.go:182.20,184.3 1 1
+github.com/ethereum/go-ethereum/ethutil/bytes.go:192.46,193.18 1 2
+github.com/ethereum/go-ethereum/ethutil/bytes.go:197.2,199.20 2 1
+github.com/ethereum/go-ethereum/ethutil/bytes.go:193.18,195.3 1 1
+github.com/ethereum/go-ethereum/ethutil/bytes.go:203.47,204.18 1 2
+github.com/ethereum/go-ethereum/ethutil/bytes.go:208.2,210.20 2 1
+github.com/ethereum/go-ethereum/ethutil/bytes.go:204.18,206.3 1 1
+github.com/ethereum/go-ethereum/ethutil/bytes.go:214.42,215.21 1 0
+github.com/ethereum/go-ethereum/ethutil/bytes.go:223.2,225.8 2 0
+github.com/ethereum/go-ethereum/ethutil/bytes.go:215.21,217.3 1 0
+github.com/ethereum/go-ethereum/ethutil/bytes.go:217.4,217.28 1 0
+github.com/ethereum/go-ethereum/ethutil/bytes.go:217.28,219.3 1 0
+github.com/ethereum/go-ethereum/ethutil/bytes.go:219.4,221.3 1 0
+github.com/ethereum/go-ethereum/ethutil/bytes.go:228.63,229.26 1 0
+github.com/ethereum/go-ethereum/ethutil/bytes.go:233.2,233.8 1 0
+github.com/ethereum/go-ethereum/ethutil/bytes.go:229.26,231.3 1 0
+github.com/ethereum/go-ethereum/ethutil/path.go:10.45,14.22 2 2
+github.com/ethereum/go-ethereum/ethutil/path.go:21.2,21.8 1 2
+github.com/ethereum/go-ethereum/ethutil/path.go:14.22,19.3 3 1
+github.com/ethereum/go-ethereum/ethutil/path.go:24.38,26.38 2 2
+github.com/ethereum/go-ethereum/ethutil/path.go:30.2,30.13 1 1
+github.com/ethereum/go-ethereum/ethutil/path.go:26.38,28.3 1 1
+github.com/ethereum/go-ethereum/ethutil/path.go:33.51,35.16 2 2
+github.com/ethereum/go-ethereum/ethutil/path.go:39.2,40.16 2 1
+github.com/ethereum/go-ethereum/ethutil/path.go:44.2,44.26 1 1
+github.com/ethereum/go-ethereum/ethutil/path.go:35.16,37.3 1 1
+github.com/ethereum/go-ethereum/ethutil/path.go:40.16,42.3 1 0
+github.com/ethereum/go-ethereum/ethutil/path.go:47.55,49.16 2 2
+github.com/ethereum/go-ethereum/ethutil/path.go:52.2,55.16 3 1
+github.com/ethereum/go-ethereum/ethutil/path.go:59.2,59.12 1 1
+github.com/ethereum/go-ethereum/ethutil/path.go:49.16,51.3 1 1
+github.com/ethereum/go-ethereum/ethutil/path.go:55.16,57.3 1 0
+github.com/ethereum/go-ethereum/ethutil/script_unix.go:15.66,16.21 1 0
+github.com/ethereum/go-ethereum/ethutil/script_unix.go:48.2,48.17 1 0
+github.com/ethereum/go-ethereum/ethutil/script_unix.go:16.21,19.41 2 0
+github.com/ethereum/go-ethereum/ethutil/script_unix.go:19.41,20.16 1 0
+github.com/ethereum/go-ethereum/ethutil/script_unix.go:21.4,23.19 2 0
+github.com/ethereum/go-ethereum/ethutil/script_unix.go:27.5,27.25 1 0
+github.com/ethereum/go-ethereum/ethutil/script_unix.go:23.19,25.6 1 0
+github.com/ethereum/go-ethereum/ethutil/script_unix.go:29.5,34.23 4 0
+github.com/ethereum/go-ethereum/ethutil/script_unix.go:44.4,44.24 1 0
+github.com/ethereum/go-ethereum/ethutil/script_unix.go:34.23,36.31 2 0
+github.com/ethereum/go-ethereum/ethutil/script_unix.go:41.5,41.39 1 0
+github.com/ethereum/go-ethereum/ethutil/script_unix.go:36.31,37.19 1 0
+github.com/ethereum/go-ethereum/ethutil/script_unix.go:37.19,39.7 1 0
+github.com/ethereum/go-ethereum/ethutil/size.go:7.41,8.20 1 3
+github.com/ethereum/go-ethereum/ethutil/size.go:8.20,10.3 1 1
+github.com/ethereum/go-ethereum/ethutil/size.go:10.4,10.24 1 2
+github.com/ethereum/go-ethereum/ethutil/size.go:10.24,12.3 1 1
+github.com/ethereum/go-ethereum/ethutil/size.go:12.4,14.3 1 1
+github.com/ethereum/go-ethereum/ethutil/rlp.go:22.36,24.2 1 0
+github.com/ethereum/go-ethereum/ethutil/rlp.go:30.34,34.2 2 0
+github.com/ethereum/go-ethereum/ethutil/rlp.go:35.65,37.2 1 0
+github.com/ethereum/go-ethereum/ethutil/rlp.go:46.25,47.16 1 0
+github.com/ethereum/go-ethereum/ethutil/rlp.go:51.2,51.15 1 0
+github.com/ethereum/go-ethereum/ethutil/rlp.go:47.16,49.3 1 0
+github.com/ethereum/go-ethereum/ethutil/rlp.go:54.57,59.9 3 0
+github.com/ethereum/go-ethereum/ethutil/rlp.go:91.2,91.14 1 0
+github.com/ethereum/go-ethereum/ethutil/rlp.go:60.2,61.14 1 0
+github.com/ethereum/go-ethereum/ethutil/rlp.go:63.2,64.39 1 0
+github.com/ethereum/go-ethereum/ethutil/rlp.go:66.2,69.34 2 0
+github.com/ethereum/go-ethereum/ethutil/rlp.go:71.2,73.31 2 0
+github.com/ethereum/go-ethereum/ethutil/rlp.go:78.3,78.15 1 0
+github.com/ethereum/go-ethereum/ethutil/rlp.go:79.2,81.39 2 0
+github.com/ethereum/go-ethereum/ethutil/rlp.go:86.3,86.15 1 0
+github.com/ethereum/go-ethereum/ethutil/rlp.go:87.2,88.53 1 0
+github.com/ethereum/go-ethereum/ethutil/rlp.go:73.31,76.4 2 0
+github.com/ethereum/go-ethereum/ethutil/rlp.go:81.39,84.4 2 0
+github.com/ethereum/go-ethereum/ethutil/rlp.go:100.40,103.19 2 59
+github.com/ethereum/go-ethereum/ethutil/rlp.go:177.2,177.21 1 59
+github.com/ethereum/go-ethereum/ethutil/rlp.go:103.19,104.29 1 59
+github.com/ethereum/go-ethereum/ethutil/rlp.go:105.3,106.31 1 2
+github.com/ethereum/go-ethereum/ethutil/rlp.go:107.3,108.35 1 0
+github.com/ethereum/go-ethereum/ethutil/rlp.go:110.3,111.44 1 10
+github.com/ethereum/go-ethereum/ethutil/rlp.go:112.3,113.44 1 0
+github.com/ethereum/go-ethereum/ethutil/rlp.go:114.3,115.44 1 0
+github.com/ethereum/go-ethereum/ethutil/rlp.go:116.3,117.44 1 0
+github.com/ethereum/go-ethereum/ethutil/rlp.go:118.3,119.44 1 0
+github.com/ethereum/go-ethereum/ethutil/rlp.go:120.3,121.37 1 0
+github.com/ethereum/go-ethereum/ethutil/rlp.go:122.3,123.44 1 0
+github.com/ethereum/go-ethereum/ethutil/rlp.go:124.3,125.44 1 0
+github.com/ethereum/go-ethereum/ethutil/rlp.go:126.3,127.44 1 0
+github.com/ethereum/go-ethereum/ethutil/rlp.go:128.3,129.44 1 1
+github.com/ethereum/go-ethereum/ethutil/rlp.go:130.3,132.16 1 12
+github.com/ethereum/go-ethereum/ethutil/rlp.go:137.3,138.33 1 0
+github.com/ethereum/go-ethereum/ethutil/rlp.go:139.3,140.35 1 20
+github.com/ethereum/go-ethereum/ethutil/rlp.go:151.3,152.33 1 6
+github.com/ethereum/go-ethereum/ethutil/rlp.go:153.3,155.41 1 8
+github.com/ethereum/go-ethereum/ethutil/rlp.go:165.4,166.26 2 8
+github.com/ethereum/go-ethereum/ethutil/rlp.go:169.4,170.25 2 8
+github.com/ethereum/go-ethereum/ethutil/rlp.go:132.16,134.5 1 0
+github.com/ethereum/go-ethereum/ethutil/rlp.go:134.6,136.5 1 12
+github.com/ethereum/go-ethereum/ethutil/rlp.go:140.35,142.5 1 11
+github.com/ethereum/go-ethereum/ethutil/rlp.go:142.6,142.26 1 9
+github.com/ethereum/go-ethereum/ethutil/rlp.go:142.26,145.5 2 8
+github.com/ethereum/go-ethereum/ethutil/rlp.go:145.6,150.5 4 1
+github.com/ethereum/go-ethereum/ethutil/rlp.go:155.41,156.20 1 8
+github.com/ethereum/go-ethereum/ethutil/rlp.go:156.20,158.6 1 8
+github.com/ethereum/go-ethereum/ethutil/rlp.go:158.7,162.6 3 0
+github.com/ethereum/go-ethereum/ethutil/rlp.go:166.26,168.5 1 19
+github.com/ethereum/go-ethereum/ethutil/rlp.go:172.4,175.3 1 0
+github.com/ethereum/go-ethereum/ethutil/rlp.go:182.60,185.9 3 16
+github.com/ethereum/go-ethereum/ethutil/rlp.go:241.2,241.17 1 0
+github.com/ethereum/go-ethereum/ethutil/rlp.go:186.2,187.28 1 3
+github.com/ethereum/go-ethereum/ethutil/rlp.go:189.2,192.44 2 9
+github.com/ethereum/go-ethereum/ethutil/rlp.go:194.2,199.54 3 1
+github.com/ethereum/go-ethereum/ethutil/rlp.go:201.2,205.30 4 3
+github.com/ethereum/go-ethereum/ethutil/rlp.go:217.3,217.20 1 3
+github.com/ethereum/go-ethereum/ethutil/rlp.go:219.2,226.38 5 0
+github.com/ethereum/go-ethereum/ethutil/rlp.go:235.3,235.20 1 0
+github.com/ethereum/go-ethereum/ethutil/rlp.go:237.2,238.53 1 0
+github.com/ethereum/go-ethereum/ethutil/rlp.go:205.30,216.4 5 9
+github.com/ethereum/go-ethereum/ethutil/rlp.go:226.38,234.4 5 0
+github.com/ethereum/go-ethereum/ethutil/set.go:13.40,15.24 2 0
+github.com/ethereum/go-ethereum/ethutil/set.go:19.2,19.12 1 0
+github.com/ethereum/go-ethereum/ethutil/set.go:15.24,17.3 1 0
+github.com/ethereum/go-ethereum/ethutil/set.go:22.54,26.2 2 0
+github.com/ethereum/go-ethereum/ethutil/set.go:28.50,32.2 2 0
+github.com/ethereum/go-ethereum/ethutil/set.go:34.32,36.2 1 0
+github.com/ethereum/go-ethereum/ethutil/big.go:8.32,13.2 3 18
+github.com/ethereum/go-ethereum/ethutil/big.go:18.31,23.2 3 8
+github.com/ethereum/go-ethereum/ethutil/big.go:28.33,33.2 3 1
+github.com/ethereum/go-ethereum/ethutil/big.go:35.40,37.2 1 1
+github.com/ethereum/go-ethereum/ethutil/big.go:46.32,54.2 2 2
+github.com/ethereum/go-ethereum/ethutil/big.go:56.32,57.22 1 2
+github.com/ethereum/go-ethereum/ethutil/big.go:57.22,59.3 1 1
+github.com/ethereum/go-ethereum/ethutil/big.go:59.4,62.3 1 1
+github.com/ethereum/go-ethereum/ethutil/big.go:69.48,72.31 2 4
+github.com/ethereum/go-ethereum/ethutil/big.go:76.2,76.64 1 3
+github.com/ethereum/go-ethereum/ethutil/big.go:72.31,74.3 1 1
+github.com/ethereum/go-ethereum/ethutil/big.go:82.37,84.2 1 1
+github.com/ethereum/go-ethereum/ethutil/big.go:89.37,90.19 1 2
+github.com/ethereum/go-ethereum/ethutil/big.go:94.2,94.10 1 1
+github.com/ethereum/go-ethereum/ethutil/big.go:90.19,92.3 1 1
+github.com/ethereum/go-ethereum/ethutil/big.go:100.37,101.19 1 2
+github.com/ethereum/go-ethereum/ethutil/big.go:105.2,105.10 1 1
+github.com/ethereum/go-ethereum/ethutil/big.go:101.19,103.3 1 1
+github.com/ethereum/go-ethereum/ethutil/config.go:30.85,31.19 1 0
+github.com/ethereum/go-ethereum/ethutil/config.go:48.2,48.15 1 0
+github.com/ethereum/go-ethereum/ethutil/config.go:31.19,33.29 1 0
+github.com/ethereum/go-ethereum/ethutil/config.go:37.3,41.17 2 0
+github.com/ethereum/go-ethereum/ethutil/config.go:46.3,46.83 1 0
+github.com/ethereum/go-ethereum/ethutil/config.go:33.29,36.4 2 0
+github.com/ethereum/go-ethereum/ethutil/config.go:41.17,43.4 1 0
+github.com/ethereum/go-ethereum/ethutil/config.go:43.5,45.4 1 0
+github.com/ethereum/go-ethereum/ethutil/config.go:52.61,55.2 2 0
+github.com/ethereum/go-ethereum/ethutil/config.go:57.44,59.2 1 0
+github.com/ethereum/go-ethereum/ethutil/config.go:67.49,69.2 1 0
+github.com/ethereum/go-ethereum/ethutil/config.go:71.43,71.64 1 0
+github.com/ethereum/go-ethereum/ethutil/config.go:72.43,72.73 2 0
+github.com/ethereum/go-ethereum/ethutil/list.go:20.35,22.34 2 0
+github.com/ethereum/go-ethereum/ethutil/list.go:26.2,26.49 1 0
+github.com/ethereum/go-ethereum/ethutil/list.go:22.34,24.3 1 0
+github.com/ethereum/go-ethereum/ethutil/list.go:29.24,31.2 1 0
+github.com/ethereum/go-ethereum/ethutil/list.go:34.42,35.25 1 0
+github.com/ethereum/go-ethereum/ethutil/list.go:44.2,44.12 1 0
+github.com/ethereum/go-ethereum/ethutil/list.go:35.25,42.3 4 0
+github.com/ethereum/go-ethereum/ethutil/list.go:47.48,53.2 3 0
+github.com/ethereum/go-ethereum/ethutil/list.go:57.41,63.2 4 0
+github.com/ethereum/go-ethereum/ethutil/list.go:66.43,68.2 1 0
+github.com/ethereum/go-ethereum/ethutil/list.go:71.35,74.35 2 0
+github.com/ethereum/go-ethereum/ethutil/list.go:78.2,80.21 2 0
+github.com/ethereum/go-ethereum/ethutil/list.go:74.35,76.3 1 0
+github.com/ethereum/go-ethereum/ethutil/package.go:33.44,35.16 2 0
+github.com/ethereum/go-ethereum/ethutil/package.go:38.2,41.16 3 0
+github.com/ethereum/go-ethereum/ethutil/package.go:45.2,45.21 1 0
+github.com/ethereum/go-ethereum/ethutil/package.go:35.16,37.3 1 0
+github.com/ethereum/go-ethereum/ethutil/package.go:41.16,43.3 1 0
+github.com/ethereum/go-ethereum/ethutil/package.go:51.48,55.49 3 0
+github.com/ethereum/go-ethereum/ethutil/package.go:60.2,60.23 1 0
+github.com/ethereum/go-ethereum/ethutil/package.go:55.49,56.3 0 0
+github.com/ethereum/go-ethereum/ethutil/package.go:56.4,56.23 1 0
+github.com/ethereum/go-ethereum/ethutil/package.go:56.23,58.3 1 0
+github.com/ethereum/go-ethereum/ethutil/package.go:66.66,69.26 2 0
+github.com/ethereum/go-ethereum/ethutil/package.go:75.2,75.8 1 0
+github.com/ethereum/go-ethereum/ethutil/package.go:69.26,70.19 1 0
+github.com/ethereum/go-ethereum/ethutil/package.go:70.19,72.4 1 0
+github.com/ethereum/go-ethereum/ethutil/package.go:83.50,85.16 2 0
+github.com/ethereum/go-ethereum/ethutil/package.go:88.2,92.23 3 0
+github.com/ethereum/go-ethereum/ethutil/package.go:96.2,97.16 2 0
+github.com/ethereum/go-ethereum/ethutil/package.go:101.2,102.16 2 0
+github.com/ethereum/go-ethereum/ethutil/package.go:106.2,106.26 1 0
+github.com/ethereum/go-ethereum/ethutil/package.go:110.2,111.20 2 0
+github.com/ethereum/go-ethereum/ethutil/package.go:115.2,116.16 2 0
+github.com/ethereum/go-ethereum/ethutil/package.go:120.2,122.24 2 0
+github.com/ethereum/go-ethereum/ethutil/package.go:85.16,87.3 1 0
+github.com/ethereum/go-ethereum/ethutil/package.go:92.23,94.3 1 0
+github.com/ethereum/go-ethereum/ethutil/package.go:97.16,99.3 1 0
+github.com/ethereum/go-ethereum/ethutil/package.go:102.16,104.3 1 0
+github.com/ethereum/go-ethereum/ethutil/package.go:106.26,108.3 1 0
+github.com/ethereum/go-ethereum/ethutil/package.go:111.20,113.3 1 0
+github.com/ethereum/go-ethereum/ethutil/package.go:116.16,118.3 1 0
+github.com/ethereum/go-ethereum/ethutil/common.go:9.23,11.2 1 2
+github.com/ethereum/go-ethereum/ethutil/common.go:13.40,14.43 1 1
+github.com/ethereum/go-ethereum/ethutil/common.go:17.2,17.13 1 1
+github.com/ethereum/go-ethereum/ethutil/common.go:14.43,16.3 1 0
+github.com/ethereum/go-ethereum/ethutil/common.go:36.44,42.9 2 12
+github.com/ethereum/go-ethereum/ethutil/common.go:70.2,70.27 1 12
+github.com/ethereum/go-ethereum/ethutil/common.go:74.2,74.41 1 10
+github.com/ethereum/go-ethereum/ethutil/common.go:43.2,45.20 2 2
+github.com/ethereum/go-ethereum/ethutil/common.go:46.2,48.21 2 2
+github.com/ethereum/go-ethereum/ethutil/common.go:49.2,51.18 2 1
+github.com/ethereum/go-ethereum/ethutil/common.go:52.2,54.19 2 1
+github.com/ethereum/go-ethereum/ethutil/common.go:55.2,57.18 2 1
+github.com/ethereum/go-ethereum/ethutil/common.go:58.2,60.20 2 1
+github.com/ethereum/go-ethereum/ethutil/common.go:61.2,63.20 2 2
+github.com/ethereum/go-ethereum/ethutil/common.go:64.2,66.16 2 1
+github.com/ethereum/go-ethereum/ethutil/common.go:70.27,72.3 1 2
+github.com/ethereum/go-ethereum/ethutil/rand.go:9.48,12.17 3 2
+github.com/ethereum/go-ethereum/ethutil/rand.go:15.2,15.16 1 2
+github.com/ethereum/go-ethereum/ethutil/rand.go:18.2,18.40 1 2
+github.com/ethereum/go-ethereum/ethutil/rand.go:12.17,14.3 1 0
+github.com/ethereum/go-ethereum/ethutil/rand.go:15.16,17.3 1 0
+github.com/ethereum/go-ethereum/ethutil/rand.go:22.37,24.2 1 2
+github.com/ethereum/go-ethereum/ethutil/value.go:19.35,21.2 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:23.39,25.31 2 39
+github.com/ethereum/go-ethereum/ethutil/value.go:29.2,29.23 1 39
+github.com/ethereum/go-ethereum/ethutil/value.go:25.31,27.3 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:32.39,34.2 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:36.32,38.2 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:40.29,42.45 1 8
+github.com/ethereum/go-ethereum/ethutil/value.go:46.2,46.25 1 1
+github.com/ethereum/go-ethereum/ethutil/value.go:42.45,44.3 1 7
+github.com/ethereum/go-ethereum/ethutil/value.go:49.37,51.2 1 2
+github.com/ethereum/go-ethereum/ethutil/value.go:53.43,55.2 1 1
+github.com/ethereum/go-ethereum/ethutil/value.go:57.33,58.36 1 11
+github.com/ethereum/go-ethereum/ethutil/value.go:80.2,80.10 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:58.36,60.3 1 1
+github.com/ethereum/go-ethereum/ethutil/value.go:60.4,60.44 1 10
+github.com/ethereum/go-ethereum/ethutil/value.go:60.44,62.3 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:62.4,62.44 1 10
+github.com/ethereum/go-ethereum/ethutil/value.go:62.44,64.3 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:64.4,64.44 1 10
+github.com/ethereum/go-ethereum/ethutil/value.go:64.44,66.3 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:66.4,66.45 1 10
+github.com/ethereum/go-ethereum/ethutil/value.go:66.45,68.3 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:68.4,68.45 1 10
+github.com/ethereum/go-ethereum/ethutil/value.go:68.45,70.3 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:70.4,70.41 1 10
+github.com/ethereum/go-ethereum/ethutil/value.go:70.41,72.3 1 10
+github.com/ethereum/go-ethereum/ethutil/value.go:72.4,72.42 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:72.42,74.3 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:74.4,74.44 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:74.44,76.3 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:76.4,76.46 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:76.46,78.3 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:83.31,84.35 1 3
+github.com/ethereum/go-ethereum/ethutil/value.go:107.2,107.10 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:84.35,86.3 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:86.4,86.43 1 3
+github.com/ethereum/go-ethereum/ethutil/value.go:86.43,88.3 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:88.4,88.43 1 3
+github.com/ethereum/go-ethereum/ethutil/value.go:88.43,90.3 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:90.4,90.43 1 3
+github.com/ethereum/go-ethereum/ethutil/value.go:90.43,92.3 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:92.4,92.41 1 3
+github.com/ethereum/go-ethereum/ethutil/value.go:92.41,94.3 1 2
+github.com/ethereum/go-ethereum/ethutil/value.go:94.4,94.45 1 1
+github.com/ethereum/go-ethereum/ethutil/value.go:94.45,96.3 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:96.4,96.45 1 1
+github.com/ethereum/go-ethereum/ethutil/value.go:96.45,98.3 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:98.4,98.44 1 1
+github.com/ethereum/go-ethereum/ethutil/value.go:98.44,100.3 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:100.4,100.46 1 1
+github.com/ethereum/go-ethereum/ethutil/value.go:100.46,102.3 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:102.4,102.44 1 1
+github.com/ethereum/go-ethereum/ethutil/value.go:102.44,105.3 2 1
+github.com/ethereum/go-ethereum/ethutil/value.go:110.31,111.35 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:115.2,115.12 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:111.35,113.3 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:118.37,119.35 1 10
+github.com/ethereum/go-ethereum/ethutil/value.go:131.2,131.22 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:119.35,123.3 2 1
+github.com/ethereum/go-ethereum/ethutil/value.go:123.4,123.44 1 9
+github.com/ethereum/go-ethereum/ethutil/value.go:123.44,125.3 1 3
+github.com/ethereum/go-ethereum/ethutil/value.go:125.4,125.42 1 6
+github.com/ethereum/go-ethereum/ethutil/value.go:125.42,127.3 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:127.4,129.3 1 6
+github.com/ethereum/go-ethereum/ethutil/value.go:134.32,135.35 1 2
+github.com/ethereum/go-ethereum/ethutil/value.go:143.2,143.11 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:135.35,137.3 1 1
+github.com/ethereum/go-ethereum/ethutil/value.go:137.4,137.42 1 1
+github.com/ethereum/go-ethereum/ethutil/value.go:137.42,139.3 1 1
+github.com/ethereum/go-ethereum/ethutil/value.go:139.4,139.40 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:139.40,141.3 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:146.34,147.35 1 10
+github.com/ethereum/go-ethereum/ethutil/value.go:159.2,159.17 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:147.35,149.3 1 6
+github.com/ethereum/go-ethereum/ethutil/value.go:149.4,149.40 1 4
+github.com/ethereum/go-ethereum/ethutil/value.go:149.40,151.3 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:151.4,151.42 1 4
+github.com/ethereum/go-ethereum/ethutil/value.go:151.42,153.3 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:153.4,153.44 1 4
+github.com/ethereum/go-ethereum/ethutil/value.go:153.44,155.3 1 2
+github.com/ethereum/go-ethereum/ethutil/value.go:155.4,157.3 1 2
+github.com/ethereum/go-ethereum/ethutil/value.go:162.31,163.36 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:167.2,167.12 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:163.36,165.3 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:170.41,171.42 1 10
+github.com/ethereum/go-ethereum/ethutil/value.go:175.2,175.24 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:171.42,173.3 1 10
+github.com/ethereum/go-ethereum/ethutil/value.go:178.46,182.2 2 1
+github.com/ethereum/go-ethereum/ethutil/value.go:184.42,188.2 2 1
+github.com/ethereum/go-ethereum/ethutil/value.go:190.52,194.2 2 1
+github.com/ethereum/go-ethereum/ethutil/value.go:197.34,199.2 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:201.32,203.2 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:205.33,208.2 2 0
+github.com/ethereum/go-ethereum/ethutil/value.go:213.33,217.2 2 0
+github.com/ethereum/go-ethereum/ethutil/value.go:219.34,221.2 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:224.39,225.42 1 5
+github.com/ethereum/go-ethereum/ethutil/value.go:239.2,239.22 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:225.42,227.20 1 5
+github.com/ethereum/go-ethereum/ethutil/value.go:231.3,231.14 1 5
+github.com/ethereum/go-ethereum/ethutil/value.go:235.3,235.26 1 5
+github.com/ethereum/go-ethereum/ethutil/value.go:227.20,229.4 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:231.14,233.4 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:242.34,243.32 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:252.2,252.12 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:244.2,245.41 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:246.2,247.34 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:248.2,249.28 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:255.38,257.2 1 4
+github.com/ethereum/go-ethereum/ethutil/value.go:259.43,261.2 1 2
+github.com/ethereum/go-ethereum/ethutil/value.go:263.35,265.2 1 3
+github.com/ethereum/go-ethereum/ethutil/value.go:268.29,272.2 2 4
+github.com/ethereum/go-ethereum/ethutil/value.go:274.44,275.20 1 3
+github.com/ethereum/go-ethereum/ethutil/value.go:282.2,282.22 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:275.20,280.3 3 3
+github.com/ethereum/go-ethereum/ethutil/value.go:286.42,289.14 2 0
+github.com/ethereum/go-ethereum/ethutil/value.go:301.2,301.13 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:289.14,290.41 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:290.41,291.30 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:291.30,293.5 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:294.5,294.43 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:294.43,295.30 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:295.30,297.5 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:304.26,306.2 1 3
+github.com/ethereum/go-ethereum/ethutil/value.go:308.39,313.2 3 2
+github.com/ethereum/go-ethereum/ethutil/value.go:315.48,319.2 2 5
+github.com/ethereum/go-ethereum/ethutil/value.go:330.59,334.12 3 4
+github.com/ethereum/go-ethereum/ethutil/value.go:347.2,347.13 1 4
+github.com/ethereum/go-ethereum/ethutil/value.go:335.2,336.35 1 2
+github.com/ethereum/go-ethereum/ethutil/value.go:337.2,338.35 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:339.2,340.35 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:341.2,342.41 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:343.2,344.35 1 2
+github.com/ethereum/go-ethereum/ethutil/value.go:350.50,352.2 1 2
+github.com/ethereum/go-ethereum/ethutil/value.go:354.50,356.2 1 2
+github.com/ethereum/go-ethereum/ethutil/value.go:358.50,360.2 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:362.50,364.2 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:366.50,368.2 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:376.48,378.2 1 1
+github.com/ethereum/go-ethereum/ethutil/value.go:380.36,382.2 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:384.38,385.30 1 4
+github.com/ethereum/go-ethereum/ethutil/value.go:389.2,392.13 3 3
+github.com/ethereum/go-ethereum/ethutil/value.go:385.30,387.3 1 1
+github.com/ethereum/go-ethereum/ethutil/value.go:395.41,397.2 1 3
+github.com/ethereum/go-ethereum/ethutil/value.go:399.36,401.2 1 0
+github.com/ethereum/go-ethereum/event/event.go:41.66,45.17 4 1005
+github.com/ethereum/go-ethereum/event/event.go:63.2,63.12 1 1004
+github.com/ethereum/go-ethereum/event/event.go:45.17,47.3 1 1
+github.com/ethereum/go-ethereum/event/event.go:47.4,48.22 1 1004
+github.com/ethereum/go-ethereum/event/event.go:51.3,51.27 1 1004
+github.com/ethereum/go-ethereum/event/event.go:48.22,50.4 1 5
+github.com/ethereum/go-ethereum/event/event.go:51.27,54.32 3 1006
+github.com/ethereum/go-ethereum/event/event.go:57.4,60.25 4 1005
+github.com/ethereum/go-ethereum/event/event.go:54.32,56.5 1 1
+github.com/ethereum/go-ethereum/event/event.go:68.48,71.17 3 6657815
+github.com/ethereum/go-ethereum/event/event.go:75.2,77.27 3 6657811
+github.com/ethereum/go-ethereum/event/event.go:80.2,80.12 1 6657811
+github.com/ethereum/go-ethereum/event/event.go:71.17,74.3 2 4
+github.com/ethereum/go-ethereum/event/event.go:77.27,79.3 1 4004
+github.com/ethereum/go-ethereum/event/event.go:86.28,88.32 2 5
+github.com/ethereum/go-ethereum/event/event.go:93.2,95.20 3 5
+github.com/ethereum/go-ethereum/event/event.go:88.32,89.28 1 3
+github.com/ethereum/go-ethereum/event/event.go:89.28,91.4 1 3
+github.com/ethereum/go-ethereum/event/event.go:98.36,100.34 2 1001
+github.com/ethereum/go-ethereum/event/event.go:109.2,109.22 1 1001
+github.com/ethereum/go-ethereum/event/event.go:100.34,101.37 1 1001
+github.com/ethereum/go-ethereum/event/event.go:101.37,102.22 1 1001
+github.com/ethereum/go-ethereum/event/event.go:102.22,104.5 1 5
+github.com/ethereum/go-ethereum/event/event.go:104.6,106.5 1 996
+github.com/ethereum/go-ethereum/event/event.go:112.46,113.26 1 2007
+github.com/ethereum/go-ethereum/event/event.go:118.2,118.11 1 1005
+github.com/ethereum/go-ethereum/event/event.go:113.26,114.16 1 17982
+github.com/ethereum/go-ethereum/event/event.go:114.16,116.4 1 1002
+github.com/ethereum/go-ethereum/event/event.go:121.52,126.2 4 996
+github.com/ethereum/go-ethereum/event/event.go:142.35,150.2 2 1005
+github.com/ethereum/go-ethereum/event/event.go:152.44,154.2 1 1003
+github.com/ethereum/go-ethereum/event/event.go:156.32,159.2 2 1001
+github.com/ethereum/go-ethereum/event/event.go:161.30,164.14 3 1004
+github.com/ethereum/go-ethereum/event/event.go:167.2,173.19 6 1003
+github.com/ethereum/go-ethereum/event/event.go:164.14,166.3 1 1
+github.com/ethereum/go-ethereum/event/event.go:176.42,178.9 2 4004
+github.com/ethereum/go-ethereum/event/event.go:182.2,182.20 1 4004
+github.com/ethereum/go-ethereum/event/event.go:179.2,179.21 0 1004
+github.com/ethereum/go-ethereum/event/event.go:180.2,180.19 0 3000
+github.com/ethereum/go-ethereum/logger/loggers.go:56.13,58.2 1 1
+github.com/ethereum/go-ethereum/logger/loggers.go:64.21,70.36 2 1
+github.com/ethereum/go-ethereum/logger/loggers.go:77.2,77.6 1 1
+github.com/ethereum/go-ethereum/logger/loggers.go:70.36,75.3 4 22
+github.com/ethereum/go-ethereum/logger/loggers.go:77.6,78.10 1 52
+github.com/ethereum/go-ethereum/logger/loggers.go:79.3,80.31 1 20
+github.com/ethereum/go-ethereum/logger/loggers.go:84.3,86.19 2 16
+github.com/ethereum/go-ethereum/logger/loggers.go:88.3,90.31 1 7
+github.com/ethereum/go-ethereum/logger/loggers.go:93.4,96.17 4 7
+github.com/ethereum/go-ethereum/logger/loggers.go:98.3,100.31 1 8
+github.com/ethereum/go-ethereum/logger/loggers.go:103.4,105.32 3 8
+github.com/ethereum/go-ethereum/logger/loggers.go:108.4,108.17 1 8
+github.com/ethereum/go-ethereum/logger/loggers.go:80.31,82.5 1 19
+github.com/ethereum/go-ethereum/logger/loggers.go:90.31,92.5 1 6
+github.com/ethereum/go-ethereum/logger/loggers.go:100.31,102.5 1 6
+github.com/ethereum/go-ethereum/logger/loggers.go:105.32,107.5 1 6
+github.com/ethereum/go-ethereum/logger/loggers.go:113.68,114.22 1 22
+github.com/ethereum/go-ethereum/logger/loggers.go:119.2,119.11 1 12
+github.com/ethereum/go-ethereum/logger/loggers.go:114.22,115.37 1 19
+github.com/ethereum/go-ethereum/logger/loggers.go:115.37,117.4 1 14
+github.com/ethereum/go-ethereum/logger/loggers.go:124.14,128.2 3 7
+github.com/ethereum/go-ethereum/logger/loggers.go:132.14,136.2 3 8
+github.com/ethereum/go-ethereum/logger/loggers.go:139.34,141.2 1 16
+github.com/ethereum/go-ethereum/logger/loggers.go:150.36,152.2 1 7
+github.com/ethereum/go-ethereum/logger/loggers.go:154.64,156.2 1 10
+github.com/ethereum/go-ethereum/logger/loggers.go:158.78,160.2 1 10
+github.com/ethereum/go-ethereum/logger/loggers.go:163.49,165.2 1 2
+github.com/ethereum/go-ethereum/logger/loggers.go:168.48,170.2 1 4
+github.com/ethereum/go-ethereum/logger/loggers.go:173.48,175.2 1 3
+github.com/ethereum/go-ethereum/logger/loggers.go:178.49,180.2 1 1
+github.com/ethereum/go-ethereum/logger/loggers.go:183.55,185.2 1 0
+github.com/ethereum/go-ethereum/logger/loggers.go:188.63,190.2 1 7
+github.com/ethereum/go-ethereum/logger/loggers.go:193.62,195.2 1 1
+github.com/ethereum/go-ethereum/logger/loggers.go:198.62,200.2 1 1
+github.com/ethereum/go-ethereum/logger/loggers.go:203.63,205.2 1 1
+github.com/ethereum/go-ethereum/logger/loggers.go:208.69,210.2 1 0
+github.com/ethereum/go-ethereum/logger/loggers.go:213.49,217.2 3 0
+github.com/ethereum/go-ethereum/logger/loggers.go:220.63,224.2 3 0
+github.com/ethereum/go-ethereum/logger/loggers.go:228.77,231.2 2 11
+github.com/ethereum/go-ethereum/logger/loggers.go:238.61,240.2 1 2
+github.com/ethereum/go-ethereum/logger/loggers.go:242.48,244.2 1 0
+github.com/ethereum/go-ethereum/logger/loggers.go:246.47,248.2 1 2
+github.com/ethereum/go-ethereum/p2p/client_identity.go:23.133,34.2 2 6
+github.com/ethereum/go-ethereum/p2p/client_identity.go:36.39,37.2 0 0
+github.com/ethereum/go-ethereum/p2p/client_identity.go:39.48,41.33 2 11
+github.com/ethereum/go-ethereum/p2p/client_identity.go:45.2,50.20 1 11
+github.com/ethereum/go-ethereum/p2p/client_identity.go:41.33,43.3 1 11
+github.com/ethereum/go-ethereum/p2p/client_identity.go:53.48,55.2 1 23
+github.com/ethereum/go-ethereum/p2p/client_identity.go:57.77,59.2 1 1
+github.com/ethereum/go-ethereum/p2p/client_identity.go:61.61,63.2 1 2
+github.com/ethereum/go-ethereum/p2p/natpmp.go:21.42,23.2 1 0
+github.com/ethereum/go-ethereum/p2p/natpmp.go:25.70,27.16 2 0
+github.com/ethereum/go-ethereum/p2p/natpmp.go:30.2,32.8 3 0
+github.com/ethereum/go-ethereum/p2p/natpmp.go:27.16,29.3 1 0
+github.com/ethereum/go-ethereum/p2p/natpmp.go:36.71,37.18 1 0
+github.com/ethereum/go-ethereum/p2p/natpmp.go:42.2,43.16 2 0
+github.com/ethereum/go-ethereum/p2p/natpmp.go:46.2,47.8 2 0
+github.com/ethereum/go-ethereum/p2p/natpmp.go:37.18,40.3 2 0
+github.com/ethereum/go-ethereum/p2p/natpmp.go:43.16,45.3 1 0
+github.com/ethereum/go-ethereum/p2p/natpmp.go:50.103,55.2 2 0
+github.com/ethereum/go-ethereum/p2p/peer_error.go:60.79,62.9 2 17
+github.com/ethereum/go-ethereum/p2p/peer_error.go:65.2,67.34 3 17
+github.com/ethereum/go-ethereum/p2p/peer_error.go:62.9,64.3 1 0
+github.com/ethereum/go-ethereum/p2p/peer_error.go:70.39,72.2 1 15
+github.com/ethereum/go-ethereum/p2p/peer_error.go:74.44,76.2 1 19
+github.com/ethereum/go-ethereum/p2p/protocol.go:81.37,82.38 1 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:86.2,86.30 1 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:82.38,84.3 1 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:95.48,101.2 2 10
+github.com/ethereum/go-ethereum/p2p/protocol.go:103.35,104.22 1 10
+github.com/ethereum/go-ethereum/p2p/protocol.go:104.22,112.3 2 7
+github.com/ethereum/go-ethereum/p2p/protocol.go:115.34,116.2 0 10
+github.com/ethereum/go-ethereum/p2p/protocol.go:118.34,121.2 2 6
+github.com/ethereum/go-ethereum/p2p/protocol.go:123.37,125.2 1 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:127.41,129.2 1 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:131.44,133.2 1 16
+github.com/ethereum/go-ethereum/p2p/protocol.go:135.64,138.25 3 8
+github.com/ethereum/go-ethereum/p2p/protocol.go:138.25,140.3 1 8
+github.com/ethereum/go-ethereum/p2p/protocol.go:140.4,142.3 1 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:145.66,146.32 1 3
+github.com/ethereum/go-ethereum/p2p/protocol.go:176.2,176.17 1 1
+github.com/ethereum/go-ethereum/p2p/protocol.go:146.32,148.3 1 1
+github.com/ethereum/go-ethereum/p2p/protocol.go:148.4,149.42 1 2
+github.com/ethereum/go-ethereum/p2p/protocol.go:154.3,154.21 1 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:149.42,153.4 3 2
+github.com/ethereum/go-ethereum/p2p/protocol.go:155.3,160.5 2 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:161.3,163.19 2 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:164.3,164.16 0 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:165.3,167.65 1 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:170.3,171.25 1 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:172.3,173.73 1 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:167.65,169.5 1 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:179.62,183.2 2 21
+github.com/ethereum/go-ethereum/p2p/protocol.go:185.91,189.22 4 2
+github.com/ethereum/go-ethereum/p2p/protocol.go:189.22,191.3 1 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:194.49,196.16 2 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:196.16,201.3 4 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:204.53,207.29 3 1
+github.com/ethereum/go-ethereum/p2p/protocol.go:212.2,224.30 4 1
+github.com/ethereum/go-ethereum/p2p/protocol.go:230.2,230.22 1 1
+github.com/ethereum/go-ethereum/p2p/protocol.go:235.2,235.23 1 1
+github.com/ethereum/go-ethereum/p2p/protocol.go:241.2,241.82 1 1
+github.com/ethereum/go-ethereum/p2p/protocol.go:247.2,247.77 1 1
+github.com/ethereum/go-ethereum/p2p/protocol.go:253.2,253.23 1 1
+github.com/ethereum/go-ethereum/p2p/protocol.go:263.2,264.20 2 1
+github.com/ethereum/go-ethereum/p2p/protocol.go:268.2,277.8 5 1
+github.com/ethereum/go-ethereum/p2p/protocol.go:207.29,210.3 2 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:224.30,227.3 2 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:230.22,233.3 2 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:235.23,238.3 2 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:241.82,244.3 2 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:247.77,250.3 2 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:253.23,255.57 2 1
+github.com/ethereum/go-ethereum/p2p/protocol.go:255.57,258.4 2 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:258.5,260.4 1 1
+github.com/ethereum/go-ethereum/p2p/protocol.go:264.20,267.3 2 3
+github.com/ethereum/go-ethereum/p2p/server.go:32.35,36.2 1 6
+github.com/ethereum/go-ethereum/p2p/server.go:38.60,43.9 5 0
+github.com/ethereum/go-ethereum/p2p/server.go:46.2,46.15 1 0
+github.com/ethereum/go-ethereum/p2p/server.go:43.9,45.3 1 0
+github.com/ethereum/go-ethereum/p2p/server.go:49.59,54.2 4 1
+github.com/ethereum/go-ethereum/p2p/server.go:56.52,61.2 4 0
+github.com/ethereum/go-ethereum/p2p/server.go:63.55,68.2 4 0
+github.com/ethereum/go-ethereum/p2p/server.go:98.129,101.33 2 5
+github.com/ethereum/go-ethereum/p2p/server.go:104.2,130.32 5 5
+github.com/ethereum/go-ethereum/p2p/server.go:133.2,133.13 1 5
+github.com/ethereum/go-ethereum/p2p/server.go:101.33,103.3 1 3
+github.com/ethereum/go-ethereum/p2p/server.go:130.32,132.3 1 10
+github.com/ethereum/go-ethereum/p2p/server.go:136.79,139.2 2 0
+github.com/ethereum/go-ethereum/p2p/server.go:141.74,144.2 2 0
+github.com/ethereum/go-ethereum/p2p/server.go:146.53,148.2 1 1
+github.com/ethereum/go-ethereum/p2p/server.go:150.58,155.16 4 1
+github.com/ethereum/go-ethereum/p2p/server.go:168.2,168.8 1 1
+github.com/ethereum/go-ethereum/p2p/server.go:155.16,157.37 2 1
+github.com/ethereum/go-ethereum/p2p/server.go:161.3,161.25 1 1
+github.com/ethereum/go-ethereum/p2p/server.go:157.37,160.4 2 2
+github.com/ethereum/go-ethereum/p2p/server.go:161.25,163.4 1 0
+github.com/ethereum/go-ethereum/p2p/server.go:163.5,166.4 2 1
+github.com/ethereum/go-ethereum/p2p/server.go:171.45,174.34 3 0
+github.com/ethereum/go-ethereum/p2p/server.go:179.2,179.8 1 0
+github.com/ethereum/go-ethereum/p2p/server.go:174.34,175.18 1 0
+github.com/ethereum/go-ethereum/p2p/server.go:175.18,177.4 1 0
+github.com/ethereum/go-ethereum/p2p/server.go:182.37,186.2 3 1
+github.com/ethereum/go-ethereum/p2p/server.go:190.48,193.9 1 0
+github.com/ethereum/go-ethereum/p2p/server.go:194.2,195.34 1 0
+github.com/ethereum/go-ethereum/p2p/server.go:196.2,196.10 0 0
+github.com/ethereum/go-ethereum/p2p/server.go:200.61,202.2 1 7
+github.com/ethereum/go-ethereum/p2p/server.go:204.43,206.2 1 7
+github.com/ethereum/go-ethereum/p2p/server.go:208.41,210.2 1 7
+github.com/ethereum/go-ethereum/p2p/server.go:212.58,215.34 3 1
+github.com/ethereum/go-ethereum/p2p/server.go:215.34,216.18 1 2
+github.com/ethereum/go-ethereum/p2p/server.go:216.18,218.4 1 2
+github.com/ethereum/go-ethereum/p2p/server.go:223.51,225.12 2 4
+github.com/ethereum/go-ethereum/p2p/server.go:237.2,237.10 1 4
+github.com/ethereum/go-ethereum/p2p/server.go:249.2,249.33 1 4
+github.com/ethereum/go-ethereum/p2p/server.go:225.12,227.17 2 3
+github.com/ethereum/go-ethereum/p2p/server.go:227.17,231.4 3 0
+github.com/ethereum/go-ethereum/p2p/server.go:231.5,235.4 3 3
+github.com/ethereum/go-ethereum/p2p/server.go:237.10,239.17 2 3
+github.com/ethereum/go-ethereum/p2p/server.go:239.17,243.4 3 0
+github.com/ethereum/go-ethereum/p2p/server.go:243.5,247.4 3 3
+github.com/ethereum/go-ethereum/p2p/server.go:252.28,255.18 2 4
+github.com/ethereum/go-ethereum/p2p/server.go:263.2,263.20 1 4
+github.com/ethereum/go-ethereum/p2p/server.go:271.2,277.34 6 4
+github.com/ethereum/go-ethereum/p2p/server.go:282.2,283.32 2 4
+github.com/ethereum/go-ethereum/p2p/server.go:291.2,295.6 3 4
+github.com/ethereum/go-ethereum/p2p/server.go:305.2,305.33 1 4
+github.com/ethereum/go-ethereum/p2p/server.go:255.18,261.3 5 3
+github.com/ethereum/go-ethereum/p2p/server.go:263.20,269.3 5 3
+github.com/ethereum/go-ethereum/p2p/server.go:277.34,278.18 1 8
+github.com/ethereum/go-ethereum/p2p/server.go:278.18,280.4 1 6
+github.com/ethereum/go-ethereum/p2p/server.go:283.32,288.3 1 6
+github.com/ethereum/go-ethereum/p2p/server.go:295.6,296.10 1 8
+github.com/ethereum/go-ethereum/p2p/server.go:297.3,300.26 3 8
+github.com/ethereum/go-ethereum/p2p/server.go:300.26,301.14 1 4
+github.com/ethereum/go-ethereum/p2p/server.go:309.63,310.6 1 3
+github.com/ethereum/go-ethereum/p2p/server.go:310.6,311.10 1 2591
+github.com/ethereum/go-ethereum/p2p/server.go:312.3,313.46 1 2588
+github.com/ethereum/go-ethereum/p2p/server.go:314.3,318.10 4 3
+github.com/ethereum/go-ethereum/p2p/server.go:325.56,330.6 4 3
+github.com/ethereum/go-ethereum/p2p/server.go:330.6,331.10 1 10
+github.com/ethereum/go-ethereum/p2p/server.go:332.3,338.15 3 4
+github.com/ethereum/go-ethereum/p2p/server.go:339.3,346.21 3 3
+github.com/ethereum/go-ethereum/p2p/server.go:347.3,348.31 1 0
+github.com/ethereum/go-ethereum/p2p/server.go:349.3,350.41 1 3
+github.com/ethereum/go-ethereum/p2p/server.go:353.4,355.10 3 3
+github.com/ethereum/go-ethereum/p2p/server.go:350.41,352.5 1 1
+github.com/ethereum/go-ethereum/p2p/server.go:361.61,366.11 4 6
+github.com/ethereum/go-ethereum/p2p/server.go:369.2,369.8 1 6
+github.com/ethereum/go-ethereum/p2p/server.go:366.11,368.3 1 0
+github.com/ethereum/go-ethereum/p2p/server.go:373.73,376.16 3 2588
+github.com/ethereum/go-ethereum/p2p/server.go:383.2,383.16 1 2588
+github.com/ethereum/go-ethereum/p2p/server.go:376.16,379.17 3 3
+github.com/ethereum/go-ethereum/p2p/server.go:379.17,381.4 1 0
+github.com/ethereum/go-ethereum/p2p/server.go:383.16,386.3 2 2585
+github.com/ethereum/go-ethereum/p2p/server.go:386.4,389.3 2 3
+github.com/ethereum/go-ethereum/p2p/server.go:393.84,396.16 3 3
+github.com/ethereum/go-ethereum/p2p/server.go:399.2,399.16 1 3
+github.com/ethereum/go-ethereum/p2p/server.go:396.16,398.3 1 3
+github.com/ethereum/go-ethereum/p2p/server.go:399.16,402.3 2 0
+github.com/ethereum/go-ethereum/p2p/server.go:402.4,404.3 1 3
+github.com/ethereum/go-ethereum/p2p/server.go:408.86,411.17 3 6
+github.com/ethereum/go-ethereum/p2p/server.go:411.17,415.3 3 0
+github.com/ethereum/go-ethereum/p2p/server.go:415.4,424.3 7 6
+github.com/ethereum/go-ethereum/p2p/server.go:428.59,435.17 6 6
+github.com/ethereum/go-ethereum/p2p/server.go:441.2,459.24 13 6
+github.com/ethereum/go-ethereum/p2p/server.go:435.17,439.3 3 0
+github.com/ethereum/go-ethereum/p2p/server.go:463.38,467.2 3 8
+github.com/ethereum/go-ethereum/p2p/server.go:469.74,471.35 1 1
+github.com/ethereum/go-ethereum/p2p/server.go:475.2,477.34 3 1
+github.com/ethereum/go-ethereum/p2p/server.go:482.2,483.12 2 1
+github.com/ethereum/go-ethereum/p2p/server.go:471.35,473.3 1 0
+github.com/ethereum/go-ethereum/p2p/server.go:477.34,478.82 1 2
+github.com/ethereum/go-ethereum/p2p/server.go:478.82,480.4 1 0
+github.com/ethereum/go-ethereum/p2p/connection.go:32.32,35.2 2 18
+github.com/ethereum/go-ethereum/p2p/connection.go:37.33,40.2 2 18
+github.com/ethereum/go-ethereum/p2p/connection.go:42.35,46.2 3 18
+github.com/ethereum/go-ethereum/p2p/connection.go:48.36,52.2 3 18
+github.com/ethereum/go-ethereum/p2p/connection.go:54.72,64.2 1 18
+github.com/ethereum/go-ethereum/p2p/connection.go:66.46,68.2 1 18
+github.com/ethereum/go-ethereum/p2p/connection.go:70.47,72.2 1 19
+github.com/ethereum/go-ethereum/p2p/connection.go:74.51,76.2 1 8
+github.com/ethereum/go-ethereum/p2p/connection.go:78.37,86.6 7 18
+github.com/ethereum/go-ethereum/p2p/connection.go:86.6,89.23 2 304
+github.com/ethereum/go-ethereum/p2p/connection.go:96.3,96.10 1 304
+github.com/ethereum/go-ethereum/p2p/connection.go:89.23,92.4 2 12
+github.com/ethereum/go-ethereum/p2p/connection.go:92.5,94.4 1 292
+github.com/ethereum/go-ethereum/p2p/connection.go:97.3,98.32 1 136
+github.com/ethereum/go-ethereum/p2p/connection.go:99.3,100.18 1 136
+github.com/ethereum/go-ethereum/p2p/connection.go:112.4,112.46 1 136
+github.com/ethereum/go-ethereum/p2p/connection.go:113.3,115.42 2 7
+github.com/ethereum/go-ethereum/p2p/connection.go:120.4,120.46 1 7
+github.com/ethereum/go-ethereum/p2p/connection.go:121.3,122.25 1 7
+github.com/ethereum/go-ethereum/p2p/connection.go:123.3,126.10 3 18
+github.com/ethereum/go-ethereum/p2p/connection.go:100.18,101.43 1 133
+github.com/ethereum/go-ethereum/p2p/connection.go:101.43,103.6 1 129
+github.com/ethereum/go-ethereum/p2p/connection.go:103.7,103.25 1 4
+github.com/ethereum/go-ethereum/p2p/connection.go:103.25,105.6 1 0
+github.com/ethereum/go-ethereum/p2p/connection.go:105.7,107.6 1 4
+github.com/ethereum/go-ethereum/p2p/connection.go:108.6,111.5 2 3
+github.com/ethereum/go-ethereum/p2p/connection.go:115.42,117.5 1 0
+github.com/ethereum/go-ethereum/p2p/connection.go:117.6,119.5 1 7
+github.com/ethereum/go-ethereum/p2p/connection.go:132.38,136.6 4 18
+github.com/ethereum/go-ethereum/p2p/connection.go:136.6,137.35 1 56
+github.com/ethereum/go-ethereum/p2p/connection.go:141.3,141.10 1 56
+github.com/ethereum/go-ethereum/p2p/connection.go:137.35,140.4 2 19
+github.com/ethereum/go-ethereum/p2p/connection.go:142.3,143.38 1 19
+github.com/ethereum/go-ethereum/p2p/connection.go:144.3,145.18 1 19
+github.com/ethereum/go-ethereum/p2p/connection.go:151.3,154.10 3 18
+github.com/ethereum/go-ethereum/p2p/connection.go:145.18,148.5 2 19
+github.com/ethereum/go-ethereum/p2p/connection.go:148.6,150.5 1 0
+github.com/ethereum/go-ethereum/p2p/connection.go:159.43,166.2 4 19
+github.com/ethereum/go-ethereum/p2p/connection.go:168.39,169.34 1 19
+github.com/ethereum/go-ethereum/p2p/connection.go:169.34,173.3 3 0
+github.com/ethereum/go-ethereum/p2p/connection.go:176.69,180.15 4 19
+github.com/ethereum/go-ethereum/p2p/connection.go:184.2,184.13 1 19
+github.com/ethereum/go-ethereum/p2p/connection.go:180.15,183.3 2 0
+github.com/ethereum/go-ethereum/p2p/connection.go:187.74,199.6 8 136
+github.com/ethereum/go-ethereum/p2p/connection.go:248.2,248.13 1 136
+github.com/ethereum/go-ethereum/p2p/connection.go:199.6,203.28 1 152
+github.com/ethereum/go-ethereum/p2p/connection.go:218.3,218.12 1 17
+github.com/ethereum/go-ethereum/p2p/connection.go:203.28,205.11 2 145
+github.com/ethereum/go-ethereum/p2p/connection.go:216.4,216.39 1 10
+github.com/ethereum/go-ethereum/p2p/connection.go:205.11,207.38 2 135
+github.com/ethereum/go-ethereum/p2p/connection.go:214.5,214.14 1 135
+github.com/ethereum/go-ethereum/p2p/connection.go:207.38,208.15 1 2
+github.com/ethereum/go-ethereum/p2p/connection.go:208.15,210.7 1 1
+github.com/ethereum/go-ethereum/p2p/connection.go:210.8,212.7 1 1
+github.com/ethereum/go-ethereum/p2p/connection.go:218.12,220.50 1 10
+github.com/ethereum/go-ethereum/p2p/connection.go:224.4,227.18 3 9
+github.com/ethereum/go-ethereum/p2p/connection.go:220.50,222.10 2 1
+github.com/ethereum/go-ethereum/p2p/connection.go:227.18,229.5 1 8
+github.com/ethereum/go-ethereum/p2p/connection.go:229.6,232.5 2 1
+github.com/ethereum/go-ethereum/p2p/connection.go:233.5,239.4 4 7
+github.com/ethereum/go-ethereum/p2p/connection.go:251.82,253.6 2 136
+github.com/ethereum/go-ethereum/p2p/connection.go:274.2,274.13 1 136
+github.com/ethereum/go-ethereum/p2p/connection.go:253.6,259.41 4 136
+github.com/ethereum/go-ethereum/p2p/connection.go:259.41,260.21 1 136
+github.com/ethereum/go-ethereum/p2p/connection.go:263.4,263.42 1 136
+github.com/ethereum/go-ethereum/p2p/connection.go:260.21,262.5 1 10
+github.com/ethereum/go-ethereum/p2p/connection.go:263.42,264.10 1 136
+github.com/ethereum/go-ethereum/p2p/connection.go:266.5,272.4 4 0
+github.com/ethereum/go-ethereum/p2p/message.go:16.33,18.2 1 54
+github.com/ethereum/go-ethereum/p2p/message.go:20.40,22.2 1 5
+github.com/ethereum/go-ethereum/p2p/message.go:24.72,43.2 1 37
+github.com/ethereum/go-ethereum/p2p/message.go:45.60,59.2 5 5
+github.com/ethereum/go-ethereum/p2p/message.go:61.41,63.2 1 5
+github.com/ethereum/go-ethereum/p2p/message.go:67.54,68.28 1 28
+github.com/ethereum/go-ethereum/p2p/message.go:74.2,74.8 1 28
+github.com/ethereum/go-ethereum/p2p/message.go:68.28,71.3 2 27
+github.com/ethereum/go-ethereum/p2p/message.go:71.4,73.3 1 1
+github.com/ethereum/go-ethereum/p2p/messenger.go:28.104,41.2 2 10
+github.com/ethereum/go-ethereum/p2p/messenger.go:43.32,49.2 5 10
+github.com/ethereum/go-ethereum/p2p/messenger.go:51.31,56.42 4 10
+github.com/ethereum/go-ethereum/p2p/messenger.go:59.2,62.19 4 10
+github.com/ethereum/go-ethereum/p2p/messenger.go:56.42,58.3 1 14
+github.com/ethereum/go-ethereum/p2p/messenger.go:65.36,67.6 2 10
+github.com/ethereum/go-ethereum/p2p/messenger.go:67.6,68.10 1 14
+github.com/ethereum/go-ethereum/p2p/messenger.go:69.3,71.10 1 4
+github.com/ethereum/go-ethereum/p2p/messenger.go:76.3,78.10 2 10
+github.com/ethereum/go-ethereum/p2p/messenger.go:71.10,73.5 1 4
+github.com/ethereum/go-ethereum/p2p/messenger.go:73.6,75.5 1 0
+github.com/ethereum/go-ethereum/p2p/messenger.go:88.47,97.16 3 4
+github.com/ethereum/go-ethereum/p2p/messenger.go:102.2,103.16 2 4
+github.com/ethereum/go-ethereum/p2p/messenger.go:108.2,114.6 5 4
+github.com/ethereum/go-ethereum/p2p/messenger.go:97.16,100.3 2 0
+github.com/ethereum/go-ethereum/p2p/messenger.go:103.16,106.3 2 0
+github.com/ethereum/go-ethereum/p2p/messenger.go:114.6,115.10 1 4
+github.com/ethereum/go-ethereum/p2p/messenger.go:116.3,118.10 1 4
+github.com/ethereum/go-ethereum/p2p/messenger.go:123.3,124.10 1 0
+github.com/ethereum/go-ethereum/p2p/messenger.go:118.10,120.5 1 0
+github.com/ethereum/go-ethereum/p2p/messenger.go:120.6,122.5 1 4
+github.com/ethereum/go-ethereum/p2p/messenger.go:134.82,138.42 4 4
+github.com/ethereum/go-ethereum/p2p/messenger.go:144.2,144.67 1 0
+github.com/ethereum/go-ethereum/p2p/messenger.go:138.42,139.20 1 5
+github.com/ethereum/go-ethereum/p2p/messenger.go:142.3,142.16 1 1
+github.com/ethereum/go-ethereum/p2p/messenger.go:139.20,141.4 1 4
+github.com/ethereum/go-ethereum/p2p/messenger.go:147.128,152.6 4 8
+github.com/ethereum/go-ethereum/p2p/messenger.go:152.6,153.10 1 19
+github.com/ethereum/go-ethereum/p2p/messenger.go:154.3,155.10 1 10
+github.com/ethereum/go-ethereum/p2p/messenger.go:162.3,163.14 1 9
+github.com/ethereum/go-ethereum/p2p/messenger.go:155.10,158.5 2 3
+github.com/ethereum/go-ethereum/p2p/messenger.go:158.6,161.5 1 7
+github.com/ethereum/go-ethereum/p2p/messenger.go:163.14,167.5 3 1
+github.com/ethereum/go-ethereum/p2p/messenger.go:167.6,172.5 4 8
+github.com/ethereum/go-ethereum/p2p/messenger.go:177.57,182.33 5 3
+github.com/ethereum/go-ethereum/p2p/messenger.go:182.33,184.9 2 5
+github.com/ethereum/go-ethereum/p2p/messenger.go:184.9,194.4 8 4
+github.com/ethereum/go-ethereum/p2p/messenger.go:194.5,197.4 1 1
+github.com/ethereum/go-ethereum/p2p/messenger.go:201.63,206.23 5 26
+github.com/ethereum/go-ethereum/p2p/messenger.go:214.2,216.28 2 24
+github.com/ethereum/go-ethereum/p2p/messenger.go:219.2,219.12 1 24
+github.com/ethereum/go-ethereum/p2p/messenger.go:206.23,209.10 3 5
+github.com/ethereum/go-ethereum/p2p/messenger.go:212.3,212.29 1 3
+github.com/ethereum/go-ethereum/p2p/messenger.go:209.10,211.4 1 2
+github.com/ethereum/go-ethereum/p2p/messenger.go:216.28,218.3 1 18
+github.com/ethereum/go-ethereum/p2p/natupnp.go:23.54,25.16 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:28.2,29.16 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:32.2,36.16 4 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:40.2,49.32 5 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:92.2,93.8 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:25.16,27.3 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:29.16,31.3 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:36.16,38.3 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:49.32,51.17 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:54.3,56.17 3 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:61.3,62.43 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:67.3,70.19 4 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:73.3,75.19 3 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:78.3,81.17 4 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:84.3,86.17 3 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:89.3,90.9 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:51.17,53.4 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:56.17,57.12 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:62.43,63.12 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:70.19,71.12 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:75.19,76.12 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:81.17,83.4 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:86.17,88.4 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:148.59,150.31 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:155.2,155.12 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:150.31,151.37 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:151.37,153.4 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:158.62,160.31 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:165.2,165.12 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:160.31,161.39 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:161.39,163.4 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:168.40,170.16 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:173.2,174.30 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:177.2,177.27 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:170.16,172.3 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:174.30,176.3 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:180.60,182.16 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:185.2,186.25 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:190.2,193.16 3 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:196.2,197.75 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:201.2,202.14 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:206.2,207.14 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:211.2,212.14 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:216.2,217.8 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:182.16,184.3 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:186.25,189.3 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:193.16,195.3 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:197.75,200.3 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:202.14,205.3 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:207.14,210.3 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:212.14,215.3 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:220.48,226.2 5 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:228.79,234.16 3 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:237.2,246.16 8 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:250.2,250.19 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:254.2,254.25 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:260.2,260.8 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:234.16,236.3 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:246.16,248.3 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:250.19,252.3 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:254.25,259.3 3 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:267.64,274.16 4 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:280.2,281.8 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:274.16,276.3 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:284.65,286.16 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:289.2,290.8 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:286.16,288.3 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:293.152,307.16 7 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:313.2,315.8 3 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:307.16,309.3 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:318.98,327.16 4 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:333.2,334.8 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:327.16,329.3 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:57.55,62.2 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:64.63,70.2 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:72.71,73.26 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:81.2,81.50 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:73.26,75.23 2 0
+github.com/ethereum/go-ethereum/p2p/network.go:79.3,79.21 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:75.23,78.4 2 0
+github.com/ethereum/go-ethereum/p2p/network.go:84.45,85.22 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:99.2,99.8 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:86.2,86.12 0 0
+github.com/ethereum/go-ethereum/p2p/network.go:87.2,89.18 2 0
+github.com/ethereum/go-ethereum/p2p/network.go:94.2,95.42 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:96.2,97.57 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:89.18,91.4 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:91.5,93.4 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:102.32,106.2 3 0
+github.com/ethereum/go-ethereum/p2p/network.go:108.63,110.16 2 0
+github.com/ethereum/go-ethereum/p2p/network.go:115.2,115.8 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:110.16,112.3 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:112.4,114.3 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:118.46,122.6 3 0
+github.com/ethereum/go-ethereum/p2p/network.go:141.2,142.28 2 0
+github.com/ethereum/go-ethereum/p2p/network.go:122.6,123.10 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:124.3,127.53 3 0
+github.com/ethereum/go-ethereum/p2p/network.go:130.3,131.30 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:135.3,137.13 2 0
+github.com/ethereum/go-ethereum/p2p/network.go:127.53,129.5 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:131.30,132.54 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:132.54,133.6 0 0
+github.com/ethereum/go-ethereum/p2p/network.go:142.28,143.73 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:143.73,145.4 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:145.5,147.4 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:151.74,153.16 2 0
+github.com/ethereum/go-ethereum/p2p/network.go:159.2,159.17 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:153.16,158.3 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:162.69,164.16 2 0
+github.com/ethereum/go-ethereum/p2p/network.go:169.2,169.17 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:164.16,168.3 3 0
+github.com/ethereum/go-ethereum/p2p/network.go:172.65,173.39 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:177.2,179.16 3 0
+github.com/ethereum/go-ethereum/p2p/network.go:183.2,183.19 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:188.2,188.18 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:195.2,195.8 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:173.39,175.3 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:179.16,182.3 2 0
+github.com/ethereum/go-ethereum/p2p/network.go:183.19,187.3 3 0
+github.com/ethereum/go-ethereum/p2p/network.go:188.18,192.3 2 0
+github.com/ethereum/go-ethereum/p2p/network.go:192.4,194.3 1 0
+github.com/ethereum/go-ethereum/p2p/peer.go:24.42,26.2 1 9
+github.com/ethereum/go-ethereum/p2p/peer.go:28.51,30.2 1 0
+github.com/ethereum/go-ethereum/p2p/peer.go:32.36,34.2 1 9
+github.com/ethereum/go-ethereum/p2p/peer.go:36.83,52.2 8 7
+github.com/ethereum/go-ethereum/p2p/peer.go:54.35,56.18 2 20
+github.com/ethereum/go-ethereum/p2p/peer.go:61.2,61.89 1 18
+github.com/ethereum/go-ethereum/p2p/peer.go:56.18,58.3 1 9
+github.com/ethereum/go-ethereum/p2p/peer.go:58.4,60.3 1 9
+github.com/ethereum/go-ethereum/p2p/peer.go:64.58,66.2 1 24
+github.com/ethereum/go-ethereum/p2p/peer.go:68.27,71.2 2 7
+github.com/ethereum/go-ethereum/p2p/peer.go:73.26,79.2 2 7
+github.com/ethereum/go-ethereum/p2p/peer.go:81.39,83.2 1 2
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:25.153,33.2 1 8
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:35.39,37.2 1 8
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:39.38,43.2 3 8
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:45.40,46.6 1 8
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:46.6,47.10 1 19
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:48.3,49.10 1 11
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:55.3,57.10 2 8
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:49.10,52.5 2 11
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:52.6,54.5 1 0
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:62.60,64.24 2 11
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:83.2,83.40 1 11
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:86.2,86.31 1 11
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:65.2,66.35 1 0
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:67.2,68.31 1 0
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:69.2,70.27 1 0
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:71.2,72.29 1 0
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:73.2,74.27 1 0
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:75.2,76.28 1 11
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:77.2,78.32 1 0
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:79.2,80.47 1 0
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:83.40,85.3 1 0
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:86.31,91.3 1 11
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:94.69,95.24 1 0
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:96.2,97.11 1 0
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:98.2,99.11 1 0
+github.com/ethereum/go-ethereum/pow/ar/ops.go:11.13,21.2 9 1
+github.com/ethereum/go-ethereum/pow/ar/ops.go:23.34,25.2 1 899964
+github.com/ethereum/go-ethereum/pow/ar/ops.go:26.34,28.2 1 6
+github.com/ethereum/go-ethereum/pow/ar/ops.go:29.34,31.2 1 12
+github.com/ethereum/go-ethereum/pow/ar/ops.go:32.34,34.2 1 12
+github.com/ethereum/go-ethereum/pow/ar/ops.go:35.34,37.2 1 0
+github.com/ethereum/go-ethereum/pow/ar/ops.go:38.33,40.2 1 0
+github.com/ethereum/go-ethereum/pow/ar/ops.go:41.35,46.2 3 6
+github.com/ethereum/go-ethereum/pow/ar/ops.go:47.37,51.2 2 6
+github.com/ethereum/go-ethereum/pow/ar/ops.go:52.34,54.2 1 0
+github.com/ethereum/go-ethereum/pow/ar/pow.go:19.33,21.2 1 1
+github.com/ethereum/go-ethereum/pow/ar/pow.go:23.56,26.32 2 1
+github.com/ethereum/go-ethereum/pow/ar/pow.go:26.32,31.23 4 150000
+github.com/ethereum/go-ethereum/pow/ar/pow.go:37.3,38.49 2 150000
+github.com/ethereum/go-ethereum/pow/ar/pow.go:31.23,33.4 1 149979
+github.com/ethereum/go-ethereum/pow/ar/pow.go:33.5,35.4 1 21
+github.com/ethereum/go-ethereum/pow/ar/pow.go:42.69,44.32 2 6
+github.com/ethereum/go-ethereum/pow/ar/pow.go:48.2,48.30 1 6
+github.com/ethereum/go-ethereum/pow/ar/pow.go:55.2,56.34 2 6
+github.com/ethereum/go-ethereum/pow/ar/pow.go:74.2,74.18 1 6
+github.com/ethereum/go-ethereum/pow/ar/pow.go:44.32,46.3 1 60000
+github.com/ethereum/go-ethereum/pow/ar/pow.go:48.30,53.3 3 900000
+github.com/ethereum/go-ethereum/pow/ar/pow.go:56.34,58.10 2 9000
+github.com/ethereum/go-ethereum/pow/ar/pow.go:68.3,69.65 2 9000
+github.com/ethereum/go-ethereum/pow/ar/pow.go:58.10,59.29 1 9000
+github.com/ethereum/go-ethereum/pow/ar/pow.go:59.29,61.5 1 900000
+github.com/ethereum/go-ethereum/pow/ar/pow.go:62.5,63.29 1 0
+github.com/ethereum/go-ethereum/pow/ar/pow.go:63.29,65.5 1 0
+github.com/ethereum/go-ethereum/pow/ar/pow.go:69.65,71.4 1 0
+github.com/ethereum/go-ethereum/pow/ar/pow.go:77.53,94.2 12 0
+github.com/ethereum/go-ethereum/pow/ar/pow.go:96.45,104.6 6 1
+github.com/ethereum/go-ethereum/pow/ar/pow.go:104.6,105.54 1 6
+github.com/ethereum/go-ethereum/pow/ar/pow.go:110.3,116.51 5 6
+github.com/ethereum/go-ethereum/pow/ar/pow.go:105.54,108.4 2 1
+github.com/ethereum/go-ethereum/pow/ar/pow.go:116.51,118.4 1 1
+github.com/ethereum/go-ethereum/pow/ar/pow.go:118.5,120.4 1 5
+github.com/ethereum/go-ethereum/pow/ar/rnd.go:18.37,20.2 1 0
+github.com/ethereum/go-ethereum/pow/ar/rnd.go:22.35,23.31 1 510007
+github.com/ethereum/go-ethereum/pow/ar/rnd.go:36.2,36.12 1 0
+github.com/ethereum/go-ethereum/pow/ar/rnd.go:23.31,25.3 1 509988
+github.com/ethereum/go-ethereum/pow/ar/rnd.go:25.4,25.43 1 19
+github.com/ethereum/go-ethereum/pow/ar/rnd.go:25.43,27.3 1 13
+github.com/ethereum/go-ethereum/pow/ar/rnd.go:27.4,27.40 1 6
+github.com/ethereum/go-ethereum/pow/ar/rnd.go:27.40,29.23 2 6
+github.com/ethereum/go-ethereum/pow/ar/rnd.go:33.3,33.54 1 6
+github.com/ethereum/go-ethereum/pow/ar/rnd.go:29.23,31.4 1 60000
+github.com/ethereum/go-ethereum/pow/ar/rnd.go:48.26,50.2 1 7
+github.com/ethereum/go-ethereum/pow/ar/rnd.go:52.43,57.46 3 510021
+github.com/ethereum/go-ethereum/pow/ar/rnd.go:61.2,61.10 1 510021
+github.com/ethereum/go-ethereum/pow/ar/rnd.go:57.46,59.3 1 509988
+github.com/ethereum/go-ethereum/pow/ar/rnd.go:64.42,66.2 1 450021
+github.com/ethereum/go-ethereum/ptrie/hashnode.go:7.36,9.2 1 0
+github.com/ethereum/go-ethereum/ptrie/hashnode.go:11.45,13.2 1 0
+github.com/ethereum/go-ethereum/ptrie/hashnode.go:15.42,17.2 1 2
+github.com/ethereum/go-ethereum/ptrie/hashnode.go:20.36,20.50 1 0
+github.com/ethereum/go-ethereum/ptrie/hashnode.go:21.36,21.51 1 0
+github.com/ethereum/go-ethereum/ptrie/hashnode.go:22.36,22.51 1 0
+github.com/ethereum/go-ethereum/ptrie/node.go:17.51,17.78 1 0
+github.com/ethereum/go-ethereum/ptrie/node.go:18.51,18.78 1 0
+github.com/ethereum/go-ethereum/ptrie/node.go:19.51,19.78 1 2
+github.com/ethereum/go-ethereum/ptrie/node.go:20.51,20.91 1 81
+github.com/ethereum/go-ethereum/ptrie/node.go:21.51,21.90 1 18
+github.com/ethereum/go-ethereum/ptrie/node.go:24.50,26.34 2 12
+github.com/ethereum/go-ethereum/ptrie/node.go:34.2,34.42 1 12
+github.com/ethereum/go-ethereum/ptrie/node.go:26.34,27.18 1 204
+github.com/ethereum/go-ethereum/ptrie/node.go:27.18,29.4 1 95
+github.com/ethereum/go-ethereum/ptrie/node.go:29.5,31.4 1 109
+github.com/ethereum/go-ethereum/ptrie/node.go:38.51,40.2 1 49
+github.com/ethereum/go-ethereum/ptrie/shortnode.go:11.63,13.2 1 147
+github.com/ethereum/go-ethereum/ptrie/shortnode.go:14.37,18.2 2 85
+github.com/ethereum/go-ethereum/ptrie/shortnode.go:19.37,19.52 1 0
+github.com/ethereum/go-ethereum/ptrie/shortnode.go:20.37,20.52 1 0
+github.com/ethereum/go-ethereum/ptrie/shortnode.go:22.46,24.2 1 97
+github.com/ethereum/go-ethereum/ptrie/shortnode.go:25.43,27.2 1 76
+github.com/ethereum/go-ethereum/ptrie/shortnode.go:29.37,31.2 1 85
+github.com/ethereum/go-ethereum/ptrie/trie.go:19.42,21.2 1 7
+github.com/ethereum/go-ethereum/ptrie/trie.go:22.48,24.2 1 76
+github.com/ethereum/go-ethereum/ptrie/trie.go:33.23,35.2 1 6
+github.com/ethereum/go-ethereum/ptrie/trie.go:37.46,46.2 6 2
+github.com/ethereum/go-ethereum/ptrie/trie.go:49.33,49.55 1 0
+github.com/ethereum/go-ethereum/ptrie/trie.go:50.33,52.22 2 7
+github.com/ethereum/go-ethereum/ptrie/trie.go:63.2,65.13 2 7
+github.com/ethereum/go-ethereum/ptrie/trie.go:52.22,54.33 2 7
+github.com/ethereum/go-ethereum/ptrie/trie.go:54.33,56.4 1 7
+github.com/ethereum/go-ethereum/ptrie/trie.go:56.5,58.4 1 0
+github.com/ethereum/go-ethereum/ptrie/trie.go:59.4,61.3 1 0
+github.com/ethereum/go-ethereum/ptrie/trie.go:68.56,68.106 1 74
+github.com/ethereum/go-ethereum/ptrie/trie.go:69.50,75.21 4 74
+github.com/ethereum/go-ethereum/ptrie/trie.go:81.2,81.18 1 74
+github.com/ethereum/go-ethereum/ptrie/trie.go:75.21,77.3 1 70
+github.com/ethereum/go-ethereum/ptrie/trie.go:77.4,79.3 1 4
+github.com/ethereum/go-ethereum/ptrie/trie.go:84.48,84.80 1 4
+github.com/ethereum/go-ethereum/ptrie/trie.go:85.42,92.14 5 4
+github.com/ethereum/go-ethereum/ptrie/trie.go:96.2,96.12 1 1
+github.com/ethereum/go-ethereum/ptrie/trie.go:92.14,94.3 1 3
+github.com/ethereum/go-ethereum/ptrie/trie.go:99.49,99.84 1 0
+github.com/ethereum/go-ethereum/ptrie/trie.go:100.43,108.2 5 0
+github.com/ethereum/go-ethereum/ptrie/trie.go:110.66,111.19 1 298
+github.com/ethereum/go-ethereum/ptrie/trie.go:115.2,115.17 1 285
+github.com/ethereum/go-ethereum/ptrie/trie.go:119.2,119.29 1 206
+github.com/ethereum/go-ethereum/ptrie/trie.go:111.19,113.3 1 13
+github.com/ethereum/go-ethereum/ptrie/trie.go:115.17,117.3 1 79
+github.com/ethereum/go-ethereum/ptrie/trie.go:120.2,123.26 3 76
+github.com/ethereum/go-ethereum/ptrie/trie.go:127.3,129.28 3 76
+github.com/ethereum/go-ethereum/ptrie/trie.go:139.3,139.23 1 76
+github.com/ethereum/go-ethereum/ptrie/trie.go:143.3,143.50 1 63
+github.com/ethereum/go-ethereum/ptrie/trie.go:145.2,149.13 3 130
+github.com/ethereum/go-ethereum/ptrie/trie.go:151.2,152.24 1 0
+github.com/ethereum/go-ethereum/ptrie/trie.go:123.26,125.4 1 0
+github.com/ethereum/go-ethereum/ptrie/trie.go:129.28,131.4 1 54
+github.com/ethereum/go-ethereum/ptrie/trie.go:131.5,138.4 6 22
+github.com/ethereum/go-ethereum/ptrie/trie.go:139.23,141.4 1 13
+github.com/ethereum/go-ethereum/ptrie/trie.go:156.51,157.19 1 15
+github.com/ethereum/go-ethereum/ptrie/trie.go:161.2,161.17 1 12
+github.com/ethereum/go-ethereum/ptrie/trie.go:165.2,165.29 1 12
+github.com/ethereum/go-ethereum/ptrie/trie.go:157.19,159.3 1 3
+github.com/ethereum/go-ethereum/ptrie/trie.go:161.17,163.3 1 0
+github.com/ethereum/go-ethereum/ptrie/trie.go:166.2,170.57 3 5
+github.com/ethereum/go-ethereum/ptrie/trie.go:174.3,174.13 1 1
+github.com/ethereum/go-ethereum/ptrie/trie.go:175.2,176.45 1 7
+github.com/ethereum/go-ethereum/ptrie/trie.go:177.2,178.24 1 0
+github.com/ethereum/go-ethereum/ptrie/trie.go:170.57,172.4 1 4
+github.com/ethereum/go-ethereum/ptrie/trie.go:182.54,183.19 1 10
+github.com/ethereum/go-ethereum/ptrie/trie.go:187.2,187.29 1 10
+github.com/ethereum/go-ethereum/ptrie/trie.go:183.19,185.3 1 0
+github.com/ethereum/go-ethereum/ptrie/trie.go:188.2,191.26 3 4
+github.com/ethereum/go-ethereum/ptrie/trie.go:210.2,215.27 4 6
+github.com/ethereum/go-ethereum/ptrie/trie.go:225.3,226.16 2 6
+github.com/ethereum/go-ethereum/ptrie/trie.go:242.3,242.15 1 6
+github.com/ethereum/go-ethereum/ptrie/trie.go:244.2,245.24 1 0
+github.com/ethereum/go-ethereum/ptrie/trie.go:191.26,193.4 1 4
+github.com/ethereum/go-ethereum/ptrie/trie.go:193.5,193.42 1 0
+github.com/ethereum/go-ethereum/ptrie/trie.go:193.42,197.33 3 0
+github.com/ethereum/go-ethereum/ptrie/trie.go:205.4,205.12 1 0
+github.com/ethereum/go-ethereum/ptrie/trie.go:198.4,200.48 2 0
+github.com/ethereum/go-ethereum/ptrie/trie.go:201.4,202.44 1 0
+github.com/ethereum/go-ethereum/ptrie/trie.go:206.5,208.4 1 0
+github.com/ethereum/go-ethereum/ptrie/trie.go:215.27,216.29 1 102
+github.com/ethereum/go-ethereum/ptrie/trie.go:216.29,217.18 1 10
+github.com/ethereum/go-ethereum/ptrie/trie.go:217.18,219.6 1 6
+github.com/ethereum/go-ethereum/ptrie/trie.go:219.7,221.6 1 4
+github.com/ethereum/go-ethereum/ptrie/trie.go:226.16,228.4 1 0
+github.com/ethereum/go-ethereum/ptrie/trie.go:228.5,228.22 1 6
+github.com/ethereum/go-ethereum/ptrie/trie.go:228.22,230.33 2 2
+github.com/ethereum/go-ethereum/ptrie/trie.go:231.4,234.49 2 0
+github.com/ethereum/go-ethereum/ptrie/trie.go:235.4,236.68 1 2
+github.com/ethereum/go-ethereum/ptrie/trie.go:238.5,240.4 1 4
+github.com/ethereum/go-ethereum/ptrie/trie.go:250.53,252.11 2 95
+github.com/ethereum/go-ethereum/ptrie/trie.go:253.2,254.105 1 3
+github.com/ethereum/go-ethereum/ptrie/trie.go:255.2,257.26 2 5
+github.com/ethereum/go-ethereum/ptrie/trie.go:260.3,260.15 1 5
+github.com/ethereum/go-ethereum/ptrie/trie.go:261.2,262.34 1 25
+github.com/ethereum/go-ethereum/ptrie/trie.go:263.2,264.41 1 62
+github.com/ethereum/go-ethereum/ptrie/trie.go:257.26,259.4 1 85
+github.com/ethereum/go-ethereum/ptrie/trie.go:268.41,269.29 1 200
+github.com/ethereum/go-ethereum/ptrie/trie.go:270.2,272.28 2 5
+github.com/ethereum/go-ethereum/ptrie/trie.go:273.2,274.14 1 195
+github.com/ethereum/go-ethereum/ptrie/trie.go:278.48,280.21 2 103
+github.com/ethereum/go-ethereum/ptrie/trie.go:287.2,287.23 1 27
+github.com/ethereum/go-ethereum/ptrie/trie.go:280.21,285.3 3 76
+github.com/ethereum/go-ethereum/ptrie/valuenode.go:8.46,8.61 1 0
+github.com/ethereum/go-ethereum/ptrie/valuenode.go:9.46,9.66 1 3
+github.com/ethereum/go-ethereum/ptrie/valuenode.go:10.46,10.61 1 0
+github.com/ethereum/go-ethereum/ptrie/valuenode.go:11.46,11.61 1 0
+github.com/ethereum/go-ethereum/ptrie/valuenode.go:12.46,12.66 1 0
+github.com/ethereum/go-ethereum/ptrie/valuenode.go:13.46,13.66 1 135
+github.com/ethereum/go-ethereum/ptrie/fullnode.go:8.37,10.2 1 27
+github.com/ethereum/go-ethereum/ptrie/fullnode.go:12.36,12.51 1 0
+github.com/ethereum/go-ethereum/ptrie/fullnode.go:13.36,16.2 2 0
+github.com/ethereum/go-ethereum/ptrie/fullnode.go:18.35,18.50 1 136
+github.com/ethereum/go-ethereum/ptrie/fullnode.go:21.42,22.34 1 0
+github.com/ethereum/go-ethereum/ptrie/fullnode.go:28.2,28.8 1 0
+github.com/ethereum/go-ethereum/ptrie/fullnode.go:22.34,23.18 1 0
+github.com/ethereum/go-ethereum/ptrie/fullnode.go:23.18,25.4 1 0
+github.com/ethereum/go-ethereum/ptrie/fullnode.go:31.42,33.2 1 27
+github.com/ethereum/go-ethereum/ptrie/fullnode.go:35.45,37.34 2 33
+github.com/ethereum/go-ethereum/ptrie/fullnode.go:45.2,45.10 1 33
+github.com/ethereum/go-ethereum/ptrie/fullnode.go:37.34,38.18 1 561
+github.com/ethereum/go-ethereum/ptrie/fullnode.go:38.18,40.4 1 136
+github.com/ethereum/go-ethereum/ptrie/fullnode.go:40.5,42.4 1 425
+github.com/ethereum/go-ethereum/ptrie/fullnode.go:48.47,50.2 1 265
+github.com/ethereum/go-ethereum/ptrie/fullnode.go:52.40,53.31 1 249
+github.com/ethereum/go-ethereum/ptrie/fullnode.go:58.2,58.12 1 134
+github.com/ethereum/go-ethereum/ptrie/fullnode.go:53.31,57.3 2 115
+github.com/ethereum/go-ethereum/rlp/decode.go:69.50,71.2 1 73
+github.com/ethereum/go-ethereum/rlp/decode.go:73.47,75.9 2 2
+github.com/ethereum/go-ethereum/rlp/decode.go:76.2,77.19 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:78.2,79.20 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:80.2,81.23 1 0
+github.com/ethereum/go-ethereum/rlp/decode.go:85.52,87.16 2 36
+github.com/ethereum/go-ethereum/rlp/decode.go:90.2,91.12 2 31
+github.com/ethereum/go-ethereum/rlp/decode.go:87.16,89.3 1 5
+github.com/ethereum/go-ethereum/rlp/decode.go:94.53,96.16 2 24
+github.com/ethereum/go-ethereum/rlp/decode.go:99.2,100.12 2 16
+github.com/ethereum/go-ethereum/rlp/decode.go:96.16,98.3 1 8
+github.com/ethereum/go-ethereum/rlp/decode.go:103.55,105.16 2 7
+github.com/ethereum/go-ethereum/rlp/decode.go:108.2,109.12 2 5
+github.com/ethereum/go-ethereum/rlp/decode.go:105.16,107.3 1 2
+github.com/ethereum/go-ethereum/rlp/decode.go:112.60,114.2 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:116.55,118.16 2 4
+github.com/ethereum/go-ethereum/rlp/decode.go:121.2,122.14 2 3
+github.com/ethereum/go-ethereum/rlp/decode.go:126.2,127.12 2 3
+github.com/ethereum/go-ethereum/rlp/decode.go:118.16,120.3 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:122.14,125.3 2 2
+github.com/ethereum/go-ethereum/rlp/decode.go:132.57,134.89 2 8
+github.com/ethereum/go-ethereum/rlp/decode.go:141.2,142.16 2 5
+github.com/ethereum/go-ethereum/rlp/decode.go:145.2,146.33 2 5
+github.com/ethereum/go-ethereum/rlp/decode.go:149.2,149.50 1 5
+github.com/ethereum/go-ethereum/rlp/decode.go:152.2,152.17 1 5
+github.com/ethereum/go-ethereum/rlp/decode.go:134.89,135.34 1 3
+github.com/ethereum/go-ethereum/rlp/decode.go:135.34,137.4 1 2
+github.com/ethereum/go-ethereum/rlp/decode.go:137.5,139.4 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:142.16,144.3 1 0
+github.com/ethereum/go-ethereum/rlp/decode.go:146.33,148.3 1 2
+github.com/ethereum/go-ethereum/rlp/decode.go:149.50,151.3 1 9
+github.com/ethereum/go-ethereum/rlp/decode.go:161.83,163.16 2 20
+github.com/ethereum/go-ethereum/rlp/decode.go:166.2,166.15 1 20
+github.com/ethereum/go-ethereum/rlp/decode.go:175.2,176.6 2 14
+github.com/ethereum/go-ethereum/rlp/decode.go:203.2,203.19 1 11
+github.com/ethereum/go-ethereum/rlp/decode.go:211.2,211.20 1 11
+github.com/ethereum/go-ethereum/rlp/decode.go:163.16,165.3 1 0
+github.com/ethereum/go-ethereum/rlp/decode.go:166.15,167.34 1 6
+github.com/ethereum/go-ethereum/rlp/decode.go:172.3,172.21 1 6
+github.com/ethereum/go-ethereum/rlp/decode.go:167.34,169.4 1 3
+github.com/ethereum/go-ethereum/rlp/decode.go:169.5,171.4 1 3
+github.com/ethereum/go-ethereum/rlp/decode.go:176.6,177.18 1 49
+github.com/ethereum/go-ethereum/rlp/decode.go:180.3,180.34 1 48
+github.com/ethereum/go-ethereum/rlp/decode.go:196.3,196.50 1 48
+github.com/ethereum/go-ethereum/rlp/decode.go:201.3,201.6 1 35
+github.com/ethereum/go-ethereum/rlp/decode.go:177.18,179.4 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:180.34,182.22 1 23
+github.com/ethereum/go-ethereum/rlp/decode.go:191.4,191.22 1 23
+github.com/ethereum/go-ethereum/rlp/decode.go:182.22,184.19 2 9
+github.com/ethereum/go-ethereum/rlp/decode.go:187.5,189.18 3 9
+github.com/ethereum/go-ethereum/rlp/decode.go:184.19,186.6 1 7
+github.com/ethereum/go-ethereum/rlp/decode.go:191.22,193.5 1 23
+github.com/ethereum/go-ethereum/rlp/decode.go:196.50,197.9 1 11
+github.com/ethereum/go-ethereum/rlp/decode.go:198.5,198.24 1 37
+github.com/ethereum/go-ethereum/rlp/decode.go:198.24,200.4 1 2
+github.com/ethereum/go-ethereum/rlp/decode.go:203.19,204.34 1 9
+github.com/ethereum/go-ethereum/rlp/decode.go:204.34,207.4 1 3
+github.com/ethereum/go-ethereum/rlp/decode.go:207.5,209.4 1 6
+github.com/ethereum/go-ethereum/rlp/decode.go:214.58,216.16 2 8
+github.com/ethereum/go-ethereum/rlp/decode.go:219.2,219.18 1 7
+github.com/ethereum/go-ethereum/rlp/decode.go:222.2,223.16 2 4
+github.com/ethereum/go-ethereum/rlp/decode.go:226.2,226.12 1 4
+github.com/ethereum/go-ethereum/rlp/decode.go:216.16,218.3 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:219.18,221.3 1 3
+github.com/ethereum/go-ethereum/rlp/decode.go:223.16,225.3 1 4
+github.com/ethereum/go-ethereum/rlp/decode.go:231.58,233.16 2 18
+github.com/ethereum/go-ethereum/rlp/decode.go:236.2,236.14 1 18
+github.com/ethereum/go-ethereum/rlp/decode.go:256.2,256.12 1 8
+github.com/ethereum/go-ethereum/rlp/decode.go:233.16,235.3 1 0
+github.com/ethereum/go-ethereum/rlp/decode.go:237.2,238.21 1 3
+github.com/ethereum/go-ethereum/rlp/decode.go:241.3,243.15 3 2
+github.com/ethereum/go-ethereum/rlp/decode.go:244.2,245.31 1 9
+github.com/ethereum/go-ethereum/rlp/decode.go:248.3,249.43 2 7
+github.com/ethereum/go-ethereum/rlp/decode.go:252.3,252.23 1 6
+github.com/ethereum/go-ethereum/rlp/decode.go:253.2,254.51 1 6
+github.com/ethereum/go-ethereum/rlp/decode.go:238.21,240.4 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:245.31,247.4 1 2
+github.com/ethereum/go-ethereum/rlp/decode.go:249.43,251.4 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:259.41,261.37 2 14
+github.com/ethereum/go-ethereum/rlp/decode.go:261.37,263.3 1 35
+github.com/ethereum/go-ethereum/rlp/decode.go:271.59,273.38 2 4
+github.com/ethereum/go-ethereum/rlp/decode.go:282.2,282.56 1 4
+github.com/ethereum/go-ethereum/rlp/decode.go:300.2,300.17 1 4
+github.com/ethereum/go-ethereum/rlp/decode.go:273.38,274.41 1 11
+github.com/ethereum/go-ethereum/rlp/decode.go:274.41,276.18 2 10
+github.com/ethereum/go-ethereum/rlp/decode.go:279.4,279.43 1 10
+github.com/ethereum/go-ethereum/rlp/decode.go:276.18,278.5 1 0
+github.com/ethereum/go-ethereum/rlp/decode.go:282.56,283.36 1 9
+github.com/ethereum/go-ethereum/rlp/decode.go:286.3,286.28 1 9
+github.com/ethereum/go-ethereum/rlp/decode.go:295.3,295.44 1 9
+github.com/ethereum/go-ethereum/rlp/decode.go:298.3,298.13 1 9
+github.com/ethereum/go-ethereum/rlp/decode.go:283.36,285.4 1 0
+github.com/ethereum/go-ethereum/rlp/decode.go:286.28,288.18 2 19
+github.com/ethereum/go-ethereum/rlp/decode.go:288.18,290.10 1 3
+github.com/ethereum/go-ethereum/rlp/decode.go:291.6,291.25 1 16
+github.com/ethereum/go-ethereum/rlp/decode.go:291.25,293.5 1 0
+github.com/ethereum/go-ethereum/rlp/decode.go:295.44,297.4 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:303.56,306.16 3 5
+github.com/ethereum/go-ethereum/rlp/decode.go:309.2,309.56 1 5
+github.com/ethereum/go-ethereum/rlp/decode.go:324.2,324.17 1 5
+github.com/ethereum/go-ethereum/rlp/decode.go:306.16,308.3 1 0
+github.com/ethereum/go-ethereum/rlp/decode.go:309.56,311.48 2 13
+github.com/ethereum/go-ethereum/rlp/decode.go:315.3,316.18 2 8
+github.com/ethereum/go-ethereum/rlp/decode.go:319.3,319.60 1 8
+github.com/ethereum/go-ethereum/rlp/decode.go:322.3,322.13 1 8
+github.com/ethereum/go-ethereum/rlp/decode.go:311.48,314.4 2 5
+github.com/ethereum/go-ethereum/rlp/decode.go:316.18,318.4 1 8
+github.com/ethereum/go-ethereum/rlp/decode.go:319.60,321.4 1 8
+github.com/ethereum/go-ethereum/rlp/decode.go:329.58,331.16 2 9
+github.com/ethereum/go-ethereum/rlp/decode.go:334.2,334.18 1 8
+github.com/ethereum/go-ethereum/rlp/decode.go:347.2,347.12 1 8
+github.com/ethereum/go-ethereum/rlp/decode.go:331.16,333.3 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:334.18,336.71 2 2
+github.com/ethereum/go-ethereum/rlp/decode.go:339.3,339.17 1 2
+github.com/ethereum/go-ethereum/rlp/decode.go:336.71,338.4 1 0
+github.com/ethereum/go-ethereum/rlp/decode.go:340.4,342.17 2 6
+github.com/ethereum/go-ethereum/rlp/decode.go:345.3,345.30 1 6
+github.com/ethereum/go-ethereum/rlp/decode.go:342.17,344.4 1 0
+github.com/ethereum/go-ethereum/rlp/decode.go:352.61,354.2 1 5
+github.com/ethereum/go-ethereum/rlp/decode.go:356.56,361.46 1 2
+github.com/ethereum/go-ethereum/rlp/decode.go:364.2,364.47 1 2
+github.com/ethereum/go-ethereum/rlp/decode.go:361.46,363.3 1 2
+github.com/ethereum/go-ethereum/rlp/decode.go:376.31,377.11 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:378.2,379.16 1 0
+github.com/ethereum/go-ethereum/rlp/decode.go:380.2,381.18 1 0
+github.com/ethereum/go-ethereum/rlp/decode.go:382.2,383.16 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:384.2,385.39 1 0
+github.com/ethereum/go-ethereum/rlp/decode.go:435.38,437.2 1 109
+github.com/ethereum/go-ethereum/rlp/decode.go:442.42,444.16 2 25
+github.com/ethereum/go-ethereum/rlp/decode.go:447.2,447.14 1 23
+github.com/ethereum/go-ethereum/rlp/decode.go:444.16,446.3 1 2
+github.com/ethereum/go-ethereum/rlp/decode.go:448.2,450.32 2 8
+github.com/ethereum/go-ethereum/rlp/decode.go:451.2,453.38 2 12
+github.com/ethereum/go-ethereum/rlp/decode.go:456.3,456.16 1 11
+github.com/ethereum/go-ethereum/rlp/decode.go:457.2,458.32 1 3
+github.com/ethereum/go-ethereum/rlp/decode.go:453.38,455.4 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:465.41,467.2 1 31
+github.com/ethereum/go-ethereum/rlp/decode.go:469.52,471.16 2 91
+github.com/ethereum/go-ethereum/rlp/decode.go:474.2,474.14 1 75
+github.com/ethereum/go-ethereum/rlp/decode.go:471.16,473.3 1 16
+github.com/ethereum/go-ethereum/rlp/decode.go:475.2,477.32 2 62
+github.com/ethereum/go-ethereum/rlp/decode.go:478.2,479.31 1 11
+github.com/ethereum/go-ethereum/rlp/decode.go:482.3,482.32 1 7
+github.com/ethereum/go-ethereum/rlp/decode.go:483.2,484.30 1 2
+github.com/ethereum/go-ethereum/rlp/decode.go:479.31,481.4 1 4
+github.com/ethereum/go-ethereum/rlp/decode.go:491.50,493.16 2 40
+github.com/ethereum/go-ethereum/rlp/decode.go:496.2,496.18 1 39
+github.com/ethereum/go-ethereum/rlp/decode.go:499.2,502.18 4 37
+github.com/ethereum/go-ethereum/rlp/decode.go:493.16,495.3 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:496.18,498.3 1 2
+github.com/ethereum/go-ethereum/rlp/decode.go:507.34,508.23 1 31
+github.com/ethereum/go-ethereum/rlp/decode.go:511.2,512.25 2 30
+github.com/ethereum/go-ethereum/rlp/decode.go:515.2,516.22 2 28
+github.com/ethereum/go-ethereum/rlp/decode.go:519.2,521.12 3 28
+github.com/ethereum/go-ethereum/rlp/decode.go:508.23,510.3 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:512.25,514.3 1 2
+github.com/ethereum/go-ethereum/rlp/decode.go:516.22,518.3 1 3
+github.com/ethereum/go-ethereum/rlp/decode.go:527.48,528.16 1 73
+github.com/ethereum/go-ethereum/rlp/decode.go:531.2,533.32 3 72
+github.com/ethereum/go-ethereum/rlp/decode.go:536.2,536.18 1 71
+github.com/ethereum/go-ethereum/rlp/decode.go:539.2,540.16 2 70
+github.com/ethereum/go-ethereum/rlp/decode.go:543.2,543.37 1 69
+github.com/ethereum/go-ethereum/rlp/decode.go:528.16,530.3 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:533.32,535.3 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:536.18,538.3 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:540.16,542.3 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:557.61,559.22 2 224
+github.com/ethereum/go-ethereum/rlp/decode.go:562.2,562.16 1 224
+github.com/ethereum/go-ethereum/rlp/decode.go:572.2,572.45 1 201
+github.com/ethereum/go-ethereum/rlp/decode.go:575.2,575.28 1 200
+github.com/ethereum/go-ethereum/rlp/decode.go:559.22,561.3 1 94
+github.com/ethereum/go-ethereum/rlp/decode.go:562.16,563.40 1 192
+github.com/ethereum/go-ethereum/rlp/decode.go:566.3,567.17 2 175
+github.com/ethereum/go-ethereum/rlp/decode.go:570.3,570.30 1 169
+github.com/ethereum/go-ethereum/rlp/decode.go:563.40,565.4 1 17
+github.com/ethereum/go-ethereum/rlp/decode.go:567.17,569.4 1 6
+github.com/ethereum/go-ethereum/rlp/decode.go:572.45,574.3 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:578.65,580.16 2 175
+github.com/ethereum/go-ethereum/rlp/decode.go:583.2,584.9 2 170
+github.com/ethereum/go-ethereum/rlp/decode.go:580.16,582.3 1 5
+github.com/ethereum/go-ethereum/rlp/decode.go:585.2,589.22 2 76
+github.com/ethereum/go-ethereum/rlp/decode.go:590.2,595.39 1 37
+github.com/ethereum/go-ethereum/rlp/decode.go:596.2,604.27 2 6
+github.com/ethereum/go-ethereum/rlp/decode.go:605.2,611.37 1 47
+github.com/ethereum/go-ethereum/rlp/decode.go:612.2,620.25 2 4
+github.com/ethereum/go-ethereum/rlp/decode.go:624.54,625.15 1 17
+github.com/ethereum/go-ethereum/rlp/decode.go:632.2,633.29 2 11
+github.com/ethereum/go-ethereum/rlp/decode.go:636.2,637.48 2 11
+github.com/ethereum/go-ethereum/rlp/decode.go:625.15,627.20 2 6
+github.com/ethereum/go-ethereum/rlp/decode.go:630.3,630.24 1 6
+github.com/ethereum/go-ethereum/rlp/decode.go:627.20,629.4 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:633.29,635.3 1 44
+github.com/ethereum/go-ethereum/rlp/decode.go:640.51,643.33 3 30
+github.com/ethereum/go-ethereum/rlp/decode.go:647.2,647.19 1 30
+github.com/ethereum/go-ethereum/rlp/decode.go:650.2,650.12 1 30
+github.com/ethereum/go-ethereum/rlp/decode.go:643.33,646.3 2 27
+github.com/ethereum/go-ethereum/rlp/decode.go:647.19,649.3 1 3
+github.com/ethereum/go-ethereum/rlp/decode.go:653.43,656.39 3 181
+github.com/ethereum/go-ethereum/rlp/decode.go:659.2,659.15 1 181
+github.com/ethereum/go-ethereum/rlp/decode.go:656.39,658.3 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:662.37,664.22 2 211
+github.com/ethereum/go-ethereum/rlp/decode.go:664.22,666.3 1 76
+github.com/ethereum/go-ethereum/rlp/typecache.go:21.58,25.17 4 70
+github.com/ethereum/go-ethereum/rlp/typecache.go:29.2,31.29 3 21
+github.com/ethereum/go-ethereum/rlp/typecache.go:25.17,27.3 1 49
+github.com/ethereum/go-ethereum/rlp/typecache.go:34.59,36.17 2 41
+github.com/ethereum/go-ethereum/rlp/typecache.go:43.2,45.16 3 27
+github.com/ethereum/go-ethereum/rlp/typecache.go:50.2,51.28 2 26
+github.com/ethereum/go-ethereum/rlp/typecache.go:36.17,39.3 1 14
+github.com/ethereum/go-ethereum/rlp/typecache.go:45.16,49.3 2 1
+github.com/ethereum/go-ethereum/rlp/typecache.go:59.64,62.9 3 27
+github.com/ethereum/go-ethereum/rlp/typecache.go:86.2,86.18 1 27
+github.com/ethereum/go-ethereum/rlp/typecache.go:63.2,64.31 1 1
+github.com/ethereum/go-ethereum/rlp/typecache.go:65.2,66.36 1 2
+github.com/ethereum/go-ethereum/rlp/typecache.go:67.2,68.30 1 1
+github.com/ethereum/go-ethereum/rlp/typecache.go:69.2,70.35 1 1
+github.com/ethereum/go-ethereum/rlp/typecache.go:71.2,72.37 1 2
+github.com/ethereum/go-ethereum/rlp/typecache.go:73.2,74.30 1 1
+github.com/ethereum/go-ethereum/rlp/typecache.go:75.2,76.43 1 8
+github.com/ethereum/go-ethereum/rlp/typecache.go:77.2,78.45 1 4
+github.com/ethereum/go-ethereum/rlp/typecache.go:79.2,80.42 1 5
+github.com/ethereum/go-ethereum/rlp/typecache.go:81.2,82.33 1 1
+github.com/ethereum/go-ethereum/rlp/typecache.go:83.2,84.64 1 1
+github.com/ethereum/go-ethereum/rlp/typecache.go:89.37,91.2 1 22
+github.com/ethereum/go-ethereum/state/dump.go:23.34,29.70 2 1
+github.com/ethereum/go-ethereum/state/dump.go:42.2,43.16 2 1
+github.com/ethereum/go-ethereum/state/dump.go:47.2,47.13 1 1
+github.com/ethereum/go-ethereum/state/dump.go:29.70,35.66 4 0
+github.com/ethereum/go-ethereum/state/dump.go:39.3,39.59 1 0
+github.com/ethereum/go-ethereum/state/dump.go:35.66,38.4 2 0
+github.com/ethereum/go-ethereum/state/dump.go:43.16,45.3 1 0
+github.com/ethereum/go-ethereum/state/dump.go:51.48,53.59 2 0
+github.com/ethereum/go-ethereum/state/dump.go:53.59,55.3 1 0
+github.com/ethereum/go-ethereum/state/errors.go:13.36,17.2 2 0
+github.com/ethereum/go-ethereum/state/errors.go:18.40,20.2 1 0
+github.com/ethereum/go-ethereum/state/errors.go:21.51,23.2 1 0
+github.com/ethereum/go-ethereum/state/log.go:16.51,23.16 3 0
+github.com/ethereum/go-ethereum/state/log.go:27.2,27.12 1 0
+github.com/ethereum/go-ethereum/state/log.go:23.16,25.3 1 0
+github.com/ethereum/go-ethereum/state/log.go:30.40,32.2 1 0
+github.com/ethereum/go-ethereum/state/log.go:34.34,36.2 1 0
+github.com/ethereum/go-ethereum/state/log.go:40.40,42.27 2 0
+github.com/ethereum/go-ethereum/state/log.go:46.2,46.13 1 0
+github.com/ethereum/go-ethereum/state/log.go:42.27,44.3 1 0
+github.com/ethereum/go-ethereum/state/log.go:49.34,51.27 2 0
+github.com/ethereum/go-ethereum/state/log.go:54.2,54.47 1 0
+github.com/ethereum/go-ethereum/state/log.go:51.27,53.3 1 0
+github.com/ethereum/go-ethereum/state/manifest.go:16.30,21.2 3 6
+github.com/ethereum/go-ethereum/state/manifest.go:23.28,25.2 1 6
+github.com/ethereum/go-ethereum/state/manifest.go:27.57,31.2 2 0
+github.com/ethereum/go-ethereum/state/manifest.go:49.52,51.2 1 0
+github.com/ethereum/go-ethereum/state/manifest.go:53.38,55.2 1 0
+github.com/ethereum/go-ethereum/state/state.go:32.34,34.2 1 6
+github.com/ethereum/go-ethereum/state/state.go:36.32,38.2 1 0
+github.com/ethereum/go-ethereum/state/state.go:40.37,42.2 1 0
+github.com/ethereum/go-ethereum/state/state.go:44.32,46.2 1 0
+github.com/ethereum/go-ethereum/state/state.go:49.53,51.24 2 0
+github.com/ethereum/go-ethereum/state/state.go:55.2,55.21 1 0
+github.com/ethereum/go-ethereum/state/state.go:51.24,53.3 1 0
+github.com/ethereum/go-ethereum/state/state.go:58.61,61.38 2 0
+github.com/ethereum/go-ethereum/state/state.go:65.2,65.66 1 0
+github.com/ethereum/go-ethereum/state/state.go:61.38,63.3 1 0
+github.com/ethereum/go-ethereum/state/state.go:68.61,70.24 2 0
+github.com/ethereum/go-ethereum/state/state.go:70.24,72.3 1 0
+github.com/ethereum/go-ethereum/state/state.go:75.49,77.24 2 0
+github.com/ethereum/go-ethereum/state/state.go:81.2,81.10 1 0
+github.com/ethereum/go-ethereum/state/state.go:77.24,79.3 1 0
+github.com/ethereum/go-ethereum/state/state.go:84.56,86.24 2 0
+github.com/ethereum/go-ethereum/state/state.go:86.24,88.3 1 0
+github.com/ethereum/go-ethereum/state/state.go:91.48,93.24 2 0
+github.com/ethereum/go-ethereum/state/state.go:97.2,97.12 1 0
+github.com/ethereum/go-ethereum/state/state.go:93.24,95.3 1 0
+github.com/ethereum/go-ethereum/state/state.go:100.49,102.24 2 0
+github.com/ethereum/go-ethereum/state/state.go:106.2,106.12 1 0
+github.com/ethereum/go-ethereum/state/state.go:102.24,104.3 1 0
+github.com/ethereum/go-ethereum/state/state.go:109.66,111.24 2 0
+github.com/ethereum/go-ethereum/state/state.go:111.24,113.3 1 0
+github.com/ethereum/go-ethereum/state/state.go:116.45,118.24 2 0
+github.com/ethereum/go-ethereum/state/state.go:124.2,124.14 1 0
+github.com/ethereum/go-ethereum/state/state.go:118.24,122.3 2 0
+github.com/ethereum/go-ethereum/state/state.go:132.64,135.37 2 0
+github.com/ethereum/go-ethereum/state/state.go:139.2,139.65 1 0
+github.com/ethereum/go-ethereum/state/state.go:135.37,137.3 1 0
+github.com/ethereum/go-ethereum/state/state.go:143.64,147.2 2 0
+github.com/ethereum/go-ethereum/state/state.go:150.61,154.24 3 3
+github.com/ethereum/go-ethereum/state/state.go:158.2,159.20 2 1
+github.com/ethereum/go-ethereum/state/state.go:163.2,166.20 3 0
+github.com/ethereum/go-ethereum/state/state.go:154.24,156.3 1 2
+github.com/ethereum/go-ethereum/state/state.go:159.20,161.3 1 1
+github.com/ethereum/go-ethereum/state/state.go:169.56,171.2 1 0
+github.com/ethereum/go-ethereum/state/state.go:174.66,176.24 2 1
+github.com/ethereum/go-ethereum/state/state.go:180.2,180.20 1 1
+github.com/ethereum/go-ethereum/state/state.go:176.24,178.3 1 1
+github.com/ethereum/go-ethereum/state/state.go:184.61,193.2 5 1
+github.com/ethereum/go-ethereum/state/state.go:196.57,198.2 1 0
+github.com/ethereum/go-ethereum/state/state.go:204.40,206.2 1 0
+github.com/ethereum/go-ethereum/state/state.go:208.34,209.22 1 2
+github.com/ethereum/go-ethereum/state/state.go:226.2,226.12 1 0
+github.com/ethereum/go-ethereum/state/state.go:209.22,211.49 2 2
+github.com/ethereum/go-ethereum/state/state.go:215.3,215.41 1 2
+github.com/ethereum/go-ethereum/state/state.go:219.3,223.15 4 2
+github.com/ethereum/go-ethereum/state/state.go:211.49,213.4 1 1
+github.com/ethereum/go-ethereum/state/state.go:215.41,217.4 1 0
+github.com/ethereum/go-ethereum/state/state.go:229.38,230.18 1 1
+github.com/ethereum/go-ethereum/state/state.go:234.2,237.24 4 1
+github.com/ethereum/go-ethereum/state/state.go:230.18,232.3 1 0
+github.com/ethereum/go-ethereum/state/state.go:240.31,242.2 1 0
+github.com/ethereum/go-ethereum/state/state.go:245.25,249.45 2 0
+github.com/ethereum/go-ethereum/state/state.go:258.2,258.11 1 0
+github.com/ethereum/go-ethereum/state/state.go:249.45,250.31 1 0
+github.com/ethereum/go-ethereum/state/state.go:255.3,255.22 1 0
+github.com/ethereum/go-ethereum/state/state.go:250.31,251.12 1 0
+github.com/ethereum/go-ethereum/state/state.go:262.24,264.45 1 0
+github.com/ethereum/go-ethereum/state/state.go:272.2,274.11 2 0
+github.com/ethereum/go-ethereum/state/state.go:264.45,265.31 1 0
+github.com/ethereum/go-ethereum/state/state.go:269.3,269.27 1 0
+github.com/ethereum/go-ethereum/state/state.go:265.31,266.12 1 0
+github.com/ethereum/go-ethereum/state/state.go:277.28,280.2 2 0
+github.com/ethereum/go-ethereum/state/state.go:282.29,286.40 2 0
+github.com/ethereum/go-ethereum/state/state.go:290.2,290.48 1 0
+github.com/ethereum/go-ethereum/state/state.go:302.2,302.13 1 0
+github.com/ethereum/go-ethereum/state/state.go:286.40,288.3 1 0
+github.com/ethereum/go-ethereum/state/state.go:290.48,291.25 1 0
+github.com/ethereum/go-ethereum/state/state.go:291.25,294.4 2 0
+github.com/ethereum/go-ethereum/state/state.go:294.5,298.4 2 0
+github.com/ethereum/go-ethereum/state/state.go:302.13,304.13 2 0
+github.com/ethereum/go-ethereum/state/state.go:304.13,308.4 2 0
+github.com/ethereum/go-ethereum/state/state.go:312.41,314.2 1 0
+github.com/ethereum/go-ethereum/state/state.go:317.42,318.48 1 0
+github.com/ethereum/go-ethereum/state/state.go:318.48,320.3 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:14.34,16.2 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:20.36,22.31 2 1
+github.com/ethereum/go-ethereum/state/state_object.go:27.2,27.12 1 1
+github.com/ethereum/go-ethereum/state/state_object.go:22.31,25.3 1 1
+github.com/ethereum/go-ethereum/state/state_object.go:55.34,58.2 2 0
+github.com/ethereum/go-ethereum/state/state_object.go:60.47,70.2 6 2
+github.com/ethereum/go-ethereum/state/state_object.go:72.78,78.2 4 0
+github.com/ethereum/go-ethereum/state/state_object.go:80.65,85.2 3 0
+github.com/ethereum/go-ethereum/state/state_object.go:87.44,90.2 2 0
+github.com/ethereum/go-ethereum/state/state_object.go:92.59,94.2 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:96.63,98.2 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:100.66,102.2 1 1
+github.com/ethereum/go-ethereum/state/state_object.go:103.73,105.2 1 2
+github.com/ethereum/go-ethereum/state/state_object.go:107.62,109.2 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:111.60,115.18 3 1
+github.com/ethereum/go-ethereum/state/state_object.go:123.2,123.14 1 1
+github.com/ethereum/go-ethereum/state/state_object.go:115.18,118.21 2 0
+github.com/ethereum/go-ethereum/state/state_object.go:118.21,120.4 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:126.67,129.2 2 2
+github.com/ethereum/go-ethereum/state/state_object.go:132.60,134.39 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:140.2,141.49 2 0
+github.com/ethereum/go-ethereum/state/state_object.go:134.39,138.3 2 0
+github.com/ethereum/go-ethereum/state/state_object.go:141.49,143.31 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:143.31,145.4 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:149.33,150.39 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:161.2,162.12 2 0
+github.com/ethereum/go-ethereum/state/state_object.go:150.39,151.23 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:158.3,158.35 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:151.23,155.12 2 0
+github.com/ethereum/go-ethereum/state/state_object.go:162.12,166.3 2 0
+github.com/ethereum/go-ethereum/state/state_object.go:169.60,170.39 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:174.2,174.62 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:170.39,172.3 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:177.51,181.2 2 0
+github.com/ethereum/go-ethereum/state/state_object.go:182.50,182.74 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:184.51,188.2 2 0
+github.com/ethereum/go-ethereum/state/state_object.go:189.50,189.74 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:191.51,193.2 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:195.45,195.68 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:202.54,202.56 0 0
+github.com/ethereum/go-ethereum/state/state_object.go:203.61,205.30 2 0
+github.com/ethereum/go-ethereum/state/state_object.go:209.2,211.12 2 0
+github.com/ethereum/go-ethereum/state/state_object.go:205.30,207.3 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:214.56,218.2 2 0
+github.com/ethereum/go-ethereum/state/state_object.go:220.60,221.31 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:225.2,230.12 4 0
+github.com/ethereum/go-ethereum/state/state_object.go:221.31,223.3 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:233.57,240.2 4 0
+github.com/ethereum/go-ethereum/state/state_object.go:242.46,247.23 5 1
+github.com/ethereum/go-ethereum/state/state_object.go:250.2,256.20 6 1
+github.com/ethereum/go-ethereum/state/state_object.go:247.23,249.3 1 1
+github.com/ethereum/go-ethereum/state/state_object.go:259.56,261.2 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:267.36,269.2 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:272.40,274.2 1 1
+github.com/ethereum/go-ethereum/state/state_object.go:277.35,279.2 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:282.48,284.2 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:286.40,288.2 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:295.42,297.2 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:299.48,301.2 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:303.46,315.2 8 0
+github.com/ethereum/go-ethereum/trie/encoding.go:9.44,11.37 2 17
+github.com/ethereum/go-ethereum/trie/encoding.go:15.2,15.21 1 17
+github.com/ethereum/go-ethereum/trie/encoding.go:19.2,21.17 3 17
+github.com/ethereum/go-ethereum/trie/encoding.go:27.2,28.40 2 17
+github.com/ethereum/go-ethereum/trie/encoding.go:32.2,32.22 1 17
+github.com/ethereum/go-ethereum/trie/encoding.go:11.37,13.3 1 9
+github.com/ethereum/go-ethereum/trie/encoding.go:15.21,17.3 1 9
+github.com/ethereum/go-ethereum/trie/encoding.go:21.17,23.3 1 9
+github.com/ethereum/go-ethereum/trie/encoding.go:23.4,25.3 1 8
+github.com/ethereum/go-ethereum/trie/encoding.go:28.40,30.3 1 46
+github.com/ethereum/go-ethereum/trie/encoding.go:35.39,38.18 3 12
+github.com/ethereum/go-ethereum/trie/encoding.go:41.2,41.20 1 12
+github.com/ethereum/go-ethereum/trie/encoding.go:47.2,47.13 1 12
+github.com/ethereum/go-ethereum/trie/encoding.go:38.18,40.3 1 7
+github.com/ethereum/go-ethereum/trie/encoding.go:41.20,43.3 1 6
+github.com/ethereum/go-ethereum/trie/encoding.go:43.4,45.3 1 6
+github.com/ethereum/go-ethereum/trie/encoding.go:50.42,55.24 4 21
+github.com/ethereum/go-ethereum/trie/encoding.go:58.2,60.17 2 21
+github.com/ethereum/go-ethereum/trie/encoding.go:55.24,57.3 1 152
+github.com/ethereum/go-ethereum/trie/encoding.go:63.39,67.24 3 0
+github.com/ethereum/go-ethereum/trie/encoding.go:73.2,75.20 2 0
+github.com/ethereum/go-ethereum/trie/encoding.go:67.24,68.13 1 0
+github.com/ethereum/go-ethereum/trie/encoding.go:68.13,70.4 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:18.44,19.21 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:23.2,23.21 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:32.2,32.19 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:19.21,21.3 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:23.21,25.17 2 0
+github.com/ethereum/go-ethereum/trie/iterator.go:29.3,29.17 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:25.17,27.4 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:43.40,45.2 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:47.70,48.23 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:73.2,73.12 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:49.2,55.11 4 0
+github.com/ethereum/go-ethereum/trie/iterator.go:56.2,57.29 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:61.3,61.33 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:67.2,70.79 2 0
+github.com/ethereum/go-ethereum/trie/iterator.go:57.29,59.4 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:61.33,63.16 2 0
+github.com/ethereum/go-ethereum/trie/iterator.go:63.16,65.5 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:76.83,77.35 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:129.2,129.12 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:78.2,79.13 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:80.2,81.19 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:90.3,91.19 2 0
+github.com/ethereum/go-ethereum/trie/iterator.go:95.3,95.27 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:102.2,104.22 2 0
+github.com/ethereum/go-ethereum/trie/iterator.go:81.19,85.16 3 0
+github.com/ethereum/go-ethereum/trie/iterator.go:85.16,87.5 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:91.19,93.4 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:95.27,98.16 3 0
+github.com/ethereum/go-ethereum/trie/iterator.go:98.16,100.5 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:104.22,105.49 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:105.49,110.5 3 0
+github.com/ethereum/go-ethereum/trie/iterator.go:111.5,115.26 4 0
+github.com/ethereum/go-ethereum/trie/iterator.go:123.4,123.18 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:115.26,117.5 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:117.6,117.49 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:117.49,119.5 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:119.6,121.5 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:123.18,125.5 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:133.47,143.2 6 0
+github.com/ethereum/go-ethereum/trie/slice.go:9.39,10.22 1 0
+github.com/ethereum/go-ethereum/trie/slice.go:13.2,13.22 1 0
+github.com/ethereum/go-ethereum/trie/slice.go:18.2,18.13 1 0
+github.com/ethereum/go-ethereum/trie/slice.go:10.22,12.3 1 0
+github.com/ethereum/go-ethereum/trie/slice.go:13.22,14.16 1 0
+github.com/ethereum/go-ethereum/trie/slice.go:14.16,16.4 1 0
+github.com/ethereum/go-ethereum/trie/slice.go:22.44,25.17 2 6
+github.com/ethereum/go-ethereum/trie/slice.go:32.2,32.10 1 6
+github.com/ethereum/go-ethereum/trie/slice.go:25.17,26.19 1 11
+github.com/ethereum/go-ethereum/trie/slice.go:29.3,29.6 1 7
+github.com/ethereum/go-ethereum/trie/slice.go:26.19,27.9 1 4
+github.com/ethereum/go-ethereum/trie/slice.go:35.29,37.2 1 0
+github.com/ethereum/go-ethereum/trie/slice.go:39.31,40.16 1 0
+github.com/ethereum/go-ethereum/trie/slice.go:44.2,44.10 1 0
+github.com/ethereum/go-ethereum/trie/slice.go:40.16,42.3 1 0
+github.com/ethereum/go-ethereum/trie/slice.go:47.35,48.21 1 0
+github.com/ethereum/go-ethereum/trie/slice.go:52.2,52.35 1 0
+github.com/ethereum/go-ethereum/trie/slice.go:48.21,50.3 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:12.44,15.59 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:19.2,19.59 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:15.59,17.3 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:22.27,24.2 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:41.64,43.2 1 16
+github.com/ethereum/go-ethereum/trie/trie.go:45.29,47.2 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:55.43,57.2 1 1
+github.com/ethereum/go-ethereum/trie/trie.go:59.69,63.29 3 26
+github.com/ethereum/go-ethereum/trie/trie.go:72.2,72.10 1 10
+github.com/ethereum/go-ethereum/trie/trie.go:63.29,70.3 4 16
+github.com/ethereum/go-ethereum/trie/trie.go:75.52,77.2 1 25
+github.com/ethereum/go-ethereum/trie/trie.go:79.52,81.37 1 13
+github.com/ethereum/go-ethereum/trie/trie.go:86.2,90.15 3 0
+github.com/ethereum/go-ethereum/trie/trie.go:97.2,99.14 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:81.37,83.3 1 13
+github.com/ethereum/go-ethereum/trie/trie.go:90.15,91.31 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:91.31,94.4 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:102.40,106.2 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:108.30,110.20 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:114.2,114.37 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:120.2,124.28 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:110.20,112.3 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:114.37,115.17 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:115.17,118.4 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:124.28,126.3 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:129.28,130.37 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:135.2,135.23 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:130.37,131.17 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:131.17,133.4 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:152.45,154.32 2 2
+github.com/ethereum/go-ethereum/trie/trie.go:160.2,160.21 1 2
+github.com/ethereum/go-ethereum/trie/trie.go:154.32,156.3 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:156.4,158.3 1 2
+github.com/ethereum/go-ethereum/trie/trie.go:163.55,172.2 5 1
+github.com/ethereum/go-ethereum/trie/trie.go:174.45,175.26 1 9
+github.com/ethereum/go-ethereum/trie/trie.go:176.2,182.24 1 1
+github.com/ethereum/go-ethereum/trie/trie.go:183.2,184.19 1 7
+github.com/ethereum/go-ethereum/trie/trie.go:185.2,186.46 1 1
+github.com/ethereum/go-ethereum/trie/trie.go:194.42,201.17 5 8
+github.com/ethereum/go-ethereum/trie/trie.go:206.2,206.17 1 8
+github.com/ethereum/go-ethereum/trie/trie.go:201.17,203.3 1 6
+github.com/ethereum/go-ethereum/trie/trie.go:203.4,205.3 1 2
+github.com/ethereum/go-ethereum/trie/trie.go:209.39,217.2 5 0
+github.com/ethereum/go-ethereum/trie/trie.go:219.35,227.2 5 0
+github.com/ethereum/go-ethereum/trie/trie.go:229.36,230.31 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:231.2,232.14 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:235.3,235.19 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:236.2,237.18 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:241.3,241.11 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:242.2,243.72 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:232.14,234.4 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:237.18,239.4 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:248.37,250.2 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:253.29,255.39 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:259.2,259.13 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:255.39,257.3 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:263.23,266.2 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:268.23,271.2 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:273.31,275.2 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:277.67,280.48 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:284.2,287.17 3 0
+github.com/ethereum/go-ethereum/trie/trie.go:304.2,304.28 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:280.48,282.3 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:287.17,289.3 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:289.4,289.24 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:289.24,294.57 3 0
+github.com/ethereum/go-ethereum/trie/trie.go:294.57,296.4 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:296.5,298.4 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:299.4,299.25 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:299.25,301.3 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:307.57,310.23 2 18
+github.com/ethereum/go-ethereum/trie/trie.go:314.2,315.19 2 13
+github.com/ethereum/go-ethereum/trie/trie.go:321.2,323.13 2 13
+github.com/ethereum/go-ethereum/trie/trie.go:310.23,312.3 1 5
+github.com/ethereum/go-ethereum/trie/trie.go:315.19,317.3 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:317.4,317.26 1 13
+github.com/ethereum/go-ethereum/trie/trie.go:317.26,319.3 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:326.84,328.2 1 6
+github.com/ethereum/go-ethereum/trie/trie.go:330.50,333.2 1 25
+github.com/ethereum/go-ethereum/trie/trie.go:335.44,337.25 2 13
+github.com/ethereum/go-ethereum/trie/trie.go:340.2,340.14 1 13
+github.com/ethereum/go-ethereum/trie/trie.go:337.25,339.3 1 221
+github.com/ethereum/go-ethereum/trie/trie.go:343.89,344.19 1 22
+github.com/ethereum/go-ethereum/trie/trie.go:349.2,350.33 2 19
+github.com/ethereum/go-ethereum/trie/trie.go:356.2,358.28 2 12
+github.com/ethereum/go-ethereum/trie/trie.go:412.2,412.25 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:344.19,346.3 1 3
+github.com/ethereum/go-ethereum/trie/trie.go:350.33,354.3 2 7
+github.com/ethereum/go-ethereum/trie/trie.go:358.28,365.26 3 6
+github.com/ethereum/go-ethereum/trie/trie.go:370.3,372.31 3 6
+github.com/ethereum/go-ethereum/trie/trie.go:388.3,388.26 1 6
+github.com/ethereum/go-ethereum/trie/trie.go:365.26,368.4 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:372.31,375.4 1 2
+github.com/ethereum/go-ethereum/trie/trie.go:375.5,386.4 6 4
+github.com/ethereum/go-ethereum/trie/trie.go:388.26,391.4 1 1
+github.com/ethereum/go-ethereum/trie/trie.go:391.5,394.4 2 5
+github.com/ethereum/go-ethereum/trie/trie.go:395.4,400.27 2 6
+github.com/ethereum/go-ethereum/trie/trie.go:407.3,409.24 2 6
+github.com/ethereum/go-ethereum/trie/trie.go:400.27,402.18 2 102
+github.com/ethereum/go-ethereum/trie/trie.go:402.18,404.5 1 102
+github.com/ethereum/go-ethereum/trie/trie.go:415.70,416.19 1 5
+github.com/ethereum/go-ethereum/trie/trie.go:421.2,423.33 2 5
+github.com/ethereum/go-ethereum/trie/trie.go:430.2,432.28 2 5
+github.com/ethereum/go-ethereum/trie/trie.go:502.2,502.28 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:416.19,418.3 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:423.33,428.3 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:432.28,438.26 3 2
+github.com/ethereum/go-ethereum/trie/trie.go:438.26,442.4 1 2
+github.com/ethereum/go-ethereum/trie/trie.go:442.5,442.42 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:442.42,447.24 4 0
+github.com/ethereum/go-ethereum/trie/trie.go:456.4,456.25 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:447.24,450.5 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:450.6,452.5 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:457.5,459.4 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:460.4,465.27 3 3
+github.com/ethereum/go-ethereum/trie/trie.go:472.3,474.27 3 3
+github.com/ethereum/go-ethereum/trie/trie.go:483.3,483.19 1 3
+github.com/ethereum/go-ethereum/trie/trie.go:499.3,499.24 1 3
+github.com/ethereum/go-ethereum/trie/trie.go:465.27,467.18 2 51
+github.com/ethereum/go-ethereum/trie/trie.go:467.18,469.5 1 51
+github.com/ethereum/go-ethereum/trie/trie.go:474.27,475.18 1 51
+github.com/ethereum/go-ethereum/trie/trie.go:475.18,476.21 1 5
+github.com/ethereum/go-ethereum/trie/trie.go:476.21,478.6 1 3
+github.com/ethereum/go-ethereum/trie/trie.go:478.7,480.6 1 2
+github.com/ethereum/go-ethereum/trie/trie.go:483.19,485.4 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:485.5,485.25 1 3
+github.com/ethereum/go-ethereum/trie/trie.go:485.25,487.25 2 1
+github.com/ethereum/go-ethereum/trie/trie.go:487.25,489.5 1 1
+github.com/ethereum/go-ethereum/trie/trie.go:489.6,489.31 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:489.31,492.5 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:494.5,496.4 1 2
+github.com/ethereum/go-ethereum/trie/trie.go:516.44,518.2 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:520.40,522.2 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:526.62,527.28 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:527.28,530.37 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:530.37,532.4 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:532.5,533.25 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:533.25,535.5 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:535.6,538.5 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:540.4,541.42 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:541.42,542.48 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:542.48,544.5 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:544.6,545.39 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:545.39,547.6 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:547.7,549.19 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:549.19,552.7 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:559.46,562.2 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:564.44,565.24 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:569.2,571.16 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:565.24,567.3 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:574.37,576.27 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:579.2,579.23 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:576.27,578.3 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:582.38,584.2 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:586.40,588.2 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:592.47,594.2 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:596.77,598.2 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:600.94,601.28 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:601.28,605.70 3 0
+github.com/ethereum/go-ethereum/trie/trie.go:605.70,607.4 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:607.5,608.25 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:608.25,610.5 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:610.6,612.5 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:614.4,615.42 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:615.42,617.48 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:617.48,619.5 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:619.6,620.72 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:620.72,622.6 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:622.7,624.19 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:624.19,626.7 1 0
+github.com/ethereum/go-ethereum/vm/stack.go:25.24,27.2 1 4
+github.com/ethereum/go-ethereum/vm/stack.go:29.36,31.2 1 0
+github.com/ethereum/go-ethereum/vm/stack.go:33.28,35.2 1 141
+github.com/ethereum/go-ethereum/vm/stack.go:37.33,44.2 4 42
+github.com/ethereum/go-ethereum/vm/stack.go:46.46,53.2 4 20
+github.com/ethereum/go-ethereum/vm/stack.go:55.34,59.2 2 16
+github.com/ethereum/go-ethereum/vm/stack.go:61.47,65.2 2 0
+github.com/ethereum/go-ethereum/vm/stack.go:67.52,71.2 2 0
+github.com/ethereum/go-ethereum/vm/stack.go:73.39,77.2 2 0
+github.com/ethereum/go-ethereum/vm/stack.go:79.35,81.2 1 84
+github.com/ethereum/go-ethereum/vm/stack.go:83.50,86.29 2 0
+github.com/ethereum/go-ethereum/vm/stack.go:91.2,91.12 1 0
+github.com/ethereum/go-ethereum/vm/stack.go:86.29,89.3 2 0
+github.com/ethereum/go-ethereum/vm/stack.go:94.26,96.22 2 0
+github.com/ethereum/go-ethereum/vm/stack.go:103.2,103.30 1 0
+github.com/ethereum/go-ethereum/vm/stack.go:96.22,97.31 1 0
+github.com/ethereum/go-ethereum/vm/stack.go:97.31,99.4 1 0
+github.com/ethereum/go-ethereum/vm/stack.go:100.4,102.3 1 0
+github.com/ethereum/go-ethereum/vm/stack.go:110.26,112.2 1 3
+github.com/ethereum/go-ethereum/vm/stack.go:114.56,115.20 1 2
+github.com/ethereum/go-ethereum/vm/stack.go:115.20,118.24 3 2
+github.com/ethereum/go-ethereum/vm/stack.go:128.3,128.43 1 2
+github.com/ethereum/go-ethereum/vm/stack.go:118.24,121.16 2 2
+github.com/ethereum/go-ethereum/vm/stack.go:121.16,126.5 2 2
+github.com/ethereum/go-ethereum/vm/stack.go:132.38,133.28 1 28
+github.com/ethereum/go-ethereum/vm/stack.go:133.28,135.3 1 8
+github.com/ethereum/go-ethereum/vm/stack.go:138.49,139.32 1 4
+github.com/ethereum/go-ethereum/vm/stack.go:145.2,145.12 1 0
+github.com/ethereum/go-ethereum/vm/stack.go:139.32,143.3 2 4
+github.com/ethereum/go-ethereum/vm/stack.go:148.59,149.35 1 0
+github.com/ethereum/go-ethereum/vm/stack.go:157.2,157.8 1 0
+github.com/ethereum/go-ethereum/vm/stack.go:149.35,155.3 4 0
+github.com/ethereum/go-ethereum/vm/stack.go:160.28,162.2 1 139
+github.com/ethereum/go-ethereum/vm/stack.go:164.32,166.2 1 0
+github.com/ethereum/go-ethereum/vm/stack.go:168.26,170.22 2 0
+github.com/ethereum/go-ethereum/vm/stack.go:179.2,179.37 1 0
+github.com/ethereum/go-ethereum/vm/stack.go:170.22,172.45 2 0
+github.com/ethereum/go-ethereum/vm/stack.go:172.45,175.4 2 0
+github.com/ethereum/go-ethereum/vm/stack.go:176.4,178.3 1 0
+github.com/ethereum/go-ethereum/vm/address.go:19.55,21.2 1 2
+github.com/ethereum/go-ethereum/vm/address.go:29.35,31.2 1 1
+github.com/ethereum/go-ethereum/vm/address.go:33.38,35.2 1 1
+github.com/ethereum/go-ethereum/vm/address.go:37.38,39.15 1 0
+github.com/ethereum/go-ethereum/vm/address.go:41.2,41.29 1 0
+github.com/ethereum/go-ethereum/vm/address.go:39.15,39.28 1 0
+github.com/ethereum/go-ethereum/vm/execution.go:19.103,21.2 1 2
+github.com/ethereum/go-ethereum/vm/execution.go:23.38,25.2 1 0
+github.com/ethereum/go-ethereum/vm/execution.go:27.81,32.2 2 2
+github.com/ethereum/go-ethereum/vm/execution.go:34.92,39.15 4 2
+github.com/ethereum/go-ethereum/vm/execution.go:46.2,56.24 3 2
+github.com/ethereum/go-ethereum/vm/execution.go:60.2,60.16 1 2
+github.com/ethereum/go-ethereum/vm/execution.go:90.2,90.8 1 2
+github.com/ethereum/go-ethereum/vm/execution.go:39.15,40.39 1 2
+github.com/ethereum/go-ethereum/vm/execution.go:43.3,43.57 1 2
+github.com/ethereum/go-ethereum/vm/execution.go:40.39,42.4 1 0
+github.com/ethereum/go-ethereum/vm/execution.go:56.24,58.3 1 2
+github.com/ethereum/go-ethereum/vm/execution.go:60.16,64.3 2 0
+github.com/ethereum/go-ethereum/vm/execution.go:64.4,68.40 3 2
+github.com/ethereum/go-ethereum/vm/execution.go:68.40,69.32 1 2
+github.com/ethereum/go-ethereum/vm/execution.go:69.32,72.5 2 2
+github.com/ethereum/go-ethereum/vm/execution.go:73.5,78.39 3 0
+github.com/ethereum/go-ethereum/vm/execution.go:85.4,86.20 2 0
+github.com/ethereum/go-ethereum/vm/execution.go:78.39,82.5 2 0
+github.com/ethereum/go-ethereum/vm/execution.go:93.74,95.2 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:20.52,21.13 1 4
+github.com/ethereum/go-ethereum/vm/vm.go:22.2,23.25 1 3
+github.com/ethereum/go-ethereum/vm/vm.go:24.2,25.23 1 1
+github.com/ethereum/go-ethereum/vm/vm.go:29.70,33.15 2 1
+github.com/ethereum/go-ethereum/vm/vm.go:41.2,41.28 1 1
+github.com/ethereum/go-ethereum/vm/vm.go:45.2,52.25 1 1
+github.com/ethereum/go-ethereum/vm/vm.go:59.2,59.6 1 1
+github.com/ethereum/go-ethereum/vm/vm.go:33.15,34.31 1 1
+github.com/ethereum/go-ethereum/vm/vm.go:34.31,37.4 2 1
+github.com/ethereum/go-ethereum/vm/vm.go:41.28,43.3 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:52.25,53.23 1 15
+github.com/ethereum/go-ethereum/vm/vm.go:53.23,55.5 1 1
+github.com/ethereum/go-ethereum/vm/vm.go:59.6,68.44 5 22
+github.com/ethereum/go-ethereum/vm/vm.go:72.3,75.13 3 22
+github.com/ethereum/go-ethereum/vm/vm.go:144.3,144.39 1 22
+github.com/ethereum/go-ethereum/vm/vm.go:158.3,158.27 1 22
+github.com/ethereum/go-ethereum/vm/vm.go:166.3,168.13 2 22
+github.com/ethereum/go-ethereum/vm/vm.go:707.3,707.7 1 21
+github.com/ethereum/go-ethereum/vm/vm.go:68.44,70.4 1 24
+github.com/ethereum/go-ethereum/vm/vm.go:76.3,77.25 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:78.3,79.25 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:80.3,81.21 1 3
+github.com/ethereum/go-ethereum/vm/vm.go:82.3,86.65 4 0
+github.com/ethereum/go-ethereum/vm/vm.go:93.4,93.43 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:94.3,95.23 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:96.3,98.52 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:99.3,102.52 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:103.3,105.51 2 4
+github.com/ethereum/go-ethereum/vm/vm.go:106.3,109.69 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:110.3,115.69 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:116.3,119.69 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:120.3,123.69 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:124.3,127.82 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:128.3,136.37 6 0
+github.com/ethereum/go-ethereum/vm/vm.go:137.3,141.82 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:86.65,88.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:88.6,88.73 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:88.73,90.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:90.6,92.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:144.39,149.50 4 4
+github.com/ethereum/go-ethereum/vm/vm.go:149.50,155.5 4 2
+github.com/ethereum/go-ethereum/vm/vm.go:158.27,164.4 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:170.3,179.20 5 3
+github.com/ethereum/go-ethereum/vm/vm.go:180.3,189.20 5 0
+github.com/ethereum/go-ethereum/vm/vm.go:190.3,199.20 5 0
+github.com/ethereum/go-ethereum/vm/vm.go:200.3,204.32 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:208.4,211.20 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:212.3,216.32 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:231.4,231.20 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:232.3,240.20 5 0
+github.com/ethereum/go-ethereum/vm/vm.go:241.3,245.32 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:260.4,260.20 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:262.3,270.20 5 1
+github.com/ethereum/go-ethereum/vm/vm.go:271.3,277.20 4 0
+github.com/ethereum/go-ethereum/vm/vm.go:278.3,282.20 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:287.3,292.20 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:298.3,302.26 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:307.3,312.20 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:318.3,323.21 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:328.3,331.35 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:338.3,342.30 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:343.3,347.29 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:348.3,352.30 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:353.3,356.85 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:363.3,375.20 8 0
+github.com/ethereum/go-ethereum/vm/vm.go:376.3,388.20 8 0
+github.com/ethereum/go-ethereum/vm/vm.go:391.3,396.34 4 0
+github.com/ethereum/go-ethereum/vm/vm.go:399.3,400.47 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:402.3,408.23 4 0
+github.com/ethereum/go-ethereum/vm/vm.go:410.3,413.36 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:415.3,417.36 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:419.3,422.21 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:424.3,432.32 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:439.4,439.34 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:440.3,442.29 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:444.3,452.19 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:459.4,461.26 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:462.3,464.25 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:472.4,473.17 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:475.3,477.25 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:485.4,492.19 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:499.4,501.30 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:502.3,503.29 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:506.3,509.38 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:511.3,514.38 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:516.3,519.32 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:521.3,524.22 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:526.3,529.26 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:531.3,533.29 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:536.3,544.36 5 11
+github.com/ethereum/go-ethereum/vm/vm.go:545.3,547.15 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:548.3,550.17 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:551.3,553.18 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:555.3,559.19 4 0
+github.com/ethereum/go-ethereum/vm/vm.go:561.3,565.61 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:567.3,572.53 4 4
+github.com/ethereum/go-ethereum/vm/vm.go:574.3,579.28 4 3
+github.com/ethereum/go-ethereum/vm/vm.go:581.3,586.49 4 0
+github.com/ethereum/go-ethereum/vm/vm.go:588.3,593.12 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:594.3,597.38 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:606.3,606.17 0 0
+github.com/ethereum/go-ethereum/vm/vm.go:607.3,608.31 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:609.3,610.44 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:611.3,612.27 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:614.3,637.18 8 0
+github.com/ethereum/go-ethereum/vm/vm.go:649.3,664.22 8 0
+github.com/ethereum/go-ethereum/vm/vm.go:670.4,672.18 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:680.3,685.35 4 0
+github.com/ethereum/go-ethereum/vm/vm.go:686.3,695.15 5 0
+github.com/ethereum/go-ethereum/vm/vm.go:696.3,698.35 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:699.3,704.67 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:204.32,206.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:216.32,218.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:218.6,220.53 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:226.5,228.15 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:220.53,222.6 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:222.7,224.6 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:245.32,247.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:247.6,249.32 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:255.5,257.15 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:249.32,251.6 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:251.7,253.6 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:282.20,284.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:284.6,286.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:292.20,294.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:294.6,296.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:302.26,304.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:304.6,306.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:312.20,314.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:314.6,316.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:323.21,325.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:325.6,327.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:331.35,333.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:333.6,335.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:356.85,360.5 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:360.6,362.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:432.32,437.5 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:452.19,455.5 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:455.6,455.28 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:455.28,457.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:464.25,468.5 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:468.6,470.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:477.25,481.5 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:481.6,483.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:492.19,495.5 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:495.6,495.28 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:495.28,497.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:597.38,600.43 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:604.5,604.13 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:600.43,602.6 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:637.18,643.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:643.6,647.5 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:664.22,666.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:666.6,668.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:672.18,674.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:674.6,678.5 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:711.35,713.2 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:715.29,717.2 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:719.72,719.87 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:720.72,720.87 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:32.43,34.25 2 3
+github.com/ethereum/go-ethereum/vm/vm_debug.go:38.2,38.57 1 3
+github.com/ethereum/go-ethereum/vm/vm_debug.go:34.25,36.3 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:41.75,44.22 2 3
+github.com/ethereum/go-ethereum/vm/vm_debug.go:60.2,70.30 1 3
+github.com/ethereum/go-ethereum/vm/vm_debug.go:100.2,100.21 1 3
+github.com/ethereum/go-ethereum/vm/vm_debug.go:105.2,105.28 1 3
+github.com/ethereum/go-ethereum/vm/vm_debug.go:109.2,111.6 2 3
+github.com/ethereum/go-ethereum/vm/vm_debug.go:44.22,46.16 1 3
+github.com/ethereum/go-ethereum/vm/vm_debug.go:46.16,47.32 1 3
+github.com/ethereum/go-ethereum/vm/vm_debug.go:47.32,56.5 4 1
+github.com/ethereum/go-ethereum/vm/vm_debug.go:70.30,71.23 1 33
+github.com/ethereum/go-ethereum/vm/vm_debug.go:71.23,73.5 1 1
+github.com/ethereum/go-ethereum/vm/vm_debug.go:76.34,81.14 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:95.4,95.15 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:81.14,83.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:83.6,85.64 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:91.5,91.12 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:85.64,87.6 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:87.7,87.43 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:87.43,89.6 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:100.21,102.3 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:105.28,107.3 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:111.6,122.30 5 80
+github.com/ethereum/go-ethereum/vm/vm_debug.go:139.3,140.44 2 80
+github.com/ethereum/go-ethereum/vm/vm_debug.go:146.3,150.13 3 80
+github.com/ethereum/go-ethereum/vm/vm_debug.go:253.3,253.39 1 79
+github.com/ethereum/go-ethereum/vm/vm_debug.go:270.3,273.27 3 79
+github.com/ethereum/go-ethereum/vm/vm_debug.go:283.3,283.13 1 79
+github.com/ethereum/go-ethereum/vm/vm_debug.go:917.3,921.22 3 77
+github.com/ethereum/go-ethereum/vm/vm_debug.go:122.30,123.14 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:131.4,132.19 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:136.4,136.92 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:124.4,125.98 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:125.98,128.6 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:132.19,134.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:140.44,141.37 1 88
+github.com/ethereum/go-ethereum/vm/vm_debug.go:141.37,143.5 1 88
+github.com/ethereum/go-ethereum/vm/vm_debug.go:152.3,153.14 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:154.3,155.14 1 10
+github.com/ethereum/go-ethereum/vm/vm_debug.go:156.3,157.14 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:158.3,160.14 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:161.3,163.14 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:164.3,171.52 6 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:173.3,174.25 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:175.3,178.25 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:179.3,182.21 2 9
+github.com/ethereum/go-ethereum/vm/vm_debug.go:184.3,190.65 5 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:201.4,201.46 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:202.3,204.23 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:205.3,207.52 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:208.3,211.52 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:212.3,214.51 2 10
+github.com/ethereum/go-ethereum/vm/vm_debug.go:215.3,218.69 2 2
+github.com/ethereum/go-ethereum/vm/vm_debug.go:219.3,224.69 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:225.3,228.69 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:229.3,232.69 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:233.3,236.82 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:237.3,245.37 6 2
+github.com/ethereum/go-ethereum/vm/vm_debug.go:246.3,250.82 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:190.65,193.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:193.6,193.73 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:193.73,197.5 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:197.6,200.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:253.39,258.50 4 12
+github.com/ethereum/go-ethereum/vm/vm_debug.go:258.50,266.5 5 6
+github.com/ethereum/go-ethereum/vm/vm_debug.go:273.27,281.4 4 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:285.3,295.20 6 9
+github.com/ethereum/go-ethereum/vm/vm_debug.go:296.3,306.20 6 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:307.3,317.20 6 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:318.3,322.32 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:326.4,330.20 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:331.3,336.32 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:351.4,352.20 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:353.3,358.32 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:364.4,367.20 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:368.3,373.32 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:388.4,389.20 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:391.3,402.20 6 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:403.3,405.17 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:422.3,428.20 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:429.3,433.20 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:438.3,443.20 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:449.3,453.26 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:458.3,463.20 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:469.3,474.21 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:479.3,481.35 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:488.3,492.30 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:493.3,497.29 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:498.3,502.30 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:503.3,506.34 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:514.4,516.20 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:517.3,530.20 8 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:531.3,544.20 8 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:547.3,553.31 4 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:555.3,558.44 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:559.3,566.45 4 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:567.3,572.33 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:573.3,577.33 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:578.3,583.32 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:584.3,591.32 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:598.4,600.34 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:601.3,605.28 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:606.3,614.19 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:621.4,625.72 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:626.3,628.25 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:636.4,639.28 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:640.3,642.25 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:650.4,657.19 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:664.4,668.72 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:669.3,672.40 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:675.3,680.37 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:681.3,686.37 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:687.3,692.33 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:693.3,698.43 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:699.3,704.47 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:705.3,706.35 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:709.3,720.41 8 47
+github.com/ethereum/go-ethereum/vm/vm_debug.go:721.3,722.15 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:723.3,729.151 4 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:732.3,736.62 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:737.3,742.27 5 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:746.4,749.30 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:750.3,755.40 4 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:756.3,761.32 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:762.3,768.42 4 10
+github.com/ethereum/go-ethereum/vm/vm_debug.go:769.3,774.59 4 9
+github.com/ethereum/go-ethereum/vm/vm_debug.go:775.3,780.30 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:784.4,784.59 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:785.3,789.12 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:790.3,793.38 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:799.3,799.17 0 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:800.3,801.18 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:802.3,803.44 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:804.3,805.27 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:807.3,831.18 9 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:844.4,847.23 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:850.3,865.22 8 2
+github.com/ethereum/go-ethereum/vm/vm_debug.go:871.4,873.18 3 2
+github.com/ethereum/go-ethereum/vm/vm_debug.go:882.4,885.23 2 2
+github.com/ethereum/go-ethereum/vm/vm_debug.go:889.3,895.35 4 2
+github.com/ethereum/go-ethereum/vm/vm_debug.go:896.3,903.15 4 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:904.3,907.35 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:908.3,914.67 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:322.32,324.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:336.32,338.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:338.6,340.53 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:346.5,348.15 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:340.53,342.6 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:342.7,344.6 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:358.32,360.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:360.6,362.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:373.32,375.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:375.6,377.32 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:383.5,385.15 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:377.32,379.6 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:379.7,381.6 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:405.17,410.39 5 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:416.5,420.20 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:410.39,412.6 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:412.7,414.6 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:433.20,435.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:435.6,437.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:443.20,445.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:445.6,447.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:453.26,455.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:455.6,457.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:463.20,465.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:465.6,467.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:474.21,476.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:476.6,478.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:481.35,483.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:483.6,485.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:506.34,510.5 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:510.6,512.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:591.32,596.5 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:614.19,617.5 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:617.6,617.28 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:617.28,619.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:628.25,632.5 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:632.6,634.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:642.25,646.5 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:646.6,648.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:657.19,660.5 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:660.6,660.28 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:660.28,662.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:729.151,731.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:742.27,744.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:780.30,782.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:793.38,796.13 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:831.18,838.5 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:838.6,842.5 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:847.23,849.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:865.22,867.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:867.6,869.5 1 2
+github.com/ethereum/go-ethereum/vm/vm_debug.go:873.18,877.5 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:877.6,881.5 2 2
+github.com/ethereum/go-ethereum/vm/vm_debug.go:885.23,887.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:921.22,922.51 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:922.51,923.41 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:923.41,926.98 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:926.98,928.7 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:929.7,929.29 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:929.29,930.97 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:930.97,932.7 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:940.77,941.31 1 248
+github.com/ethereum/go-ethereum/vm/vm_debug.go:945.2,945.13 1 248
+github.com/ethereum/go-ethereum/vm/vm_debug.go:941.31,943.3 1 248
+github.com/ethereum/go-ethereum/vm/vm_debug.go:948.44,949.31 1 82
+github.com/ethereum/go-ethereum/vm/vm_debug.go:954.2,954.13 1 82
+github.com/ethereum/go-ethereum/vm/vm_debug.go:949.31,952.3 2 82
+github.com/ethereum/go-ethereum/vm/vm_debug.go:957.40,959.2 1 4
+github.com/ethereum/go-ethereum/vm/vm_debug.go:961.34,963.2 1 0
+github.com/ethereum/go-ethereum/vm/closure.go:34.126,46.2 5 4
+github.com/ethereum/go-ethereum/vm/closure.go:49.57,51.14 2 3
+github.com/ethereum/go-ethereum/vm/closure.go:55.2,55.10 1 3
+github.com/ethereum/go-ethereum/vm/closure.go:51.14,53.3 1 0
+github.com/ethereum/go-ethereum/vm/closure.go:58.50,60.2 1 0
+github.com/ethereum/go-ethereum/vm/closure.go:62.39,64.2 1 102
+github.com/ethereum/go-ethereum/vm/closure.go:66.39,67.21 1 102
+github.com/ethereum/go-ethereum/vm/closure.go:71.2,71.10 1 0
+github.com/ethereum/go-ethereum/vm/closure.go:67.21,69.3 1 102
+github.com/ethereum/go-ethereum/vm/closure.go:74.45,75.42 1 11
+github.com/ethereum/go-ethereum/vm/closure.go:79.2,79.24 1 11
+github.com/ethereum/go-ethereum/vm/closure.go:75.42,77.3 1 0
+github.com/ethereum/go-ethereum/vm/closure.go:82.54,83.72 1 47
+github.com/ethereum/go-ethereum/vm/closure.go:87.2,89.34 2 47
+github.com/ethereum/go-ethereum/vm/closure.go:83.72,85.3 1 0
+github.com/ethereum/go-ethereum/vm/closure.go:92.62,94.2 1 0
+github.com/ethereum/go-ethereum/vm/closure.go:96.36,98.2 1 16
+github.com/ethereum/go-ethereum/vm/closure.go:100.82,106.2 3 4
+github.com/ethereum/go-ethereum/vm/closure.go:108.45,113.2 2 4
+github.com/ethereum/go-ethereum/vm/closure.go:115.45,116.24 1 102
+github.com/ethereum/go-ethereum/vm/closure.go:121.2,124.13 3 102
+github.com/ethereum/go-ethereum/vm/closure.go:116.24,118.3 1 0
+github.com/ethereum/go-ethereum/vm/closure.go:128.50,132.2 2 0
+github.com/ethereum/go-ethereum/vm/closure.go:134.47,136.2 1 2
+github.com/ethereum/go-ethereum/vm/closure.go:138.39,140.2 1 0
+github.com/ethereum/go-ethereum/vm/closure.go:142.51,144.2 1 0
+github.com/ethereum/go-ethereum/vm/common.go:46.44,47.30 1 20
+github.com/ethereum/go-ethereum/vm/common.go:51.2,51.33 1 18
+github.com/ethereum/go-ethereum/vm/common.go:47.30,49.3 1 2
+github.com/ethereum/go-ethereum/vm/common.go:55.29,57.2 1 94
+github.com/ethereum/go-ethereum/vm/common.go:60.40,63.59 2 0
+github.com/ethereum/go-ethereum/vm/common.go:67.2,67.12 1 0
+github.com/ethereum/go-ethereum/vm/common.go:63.59,65.3 1 0
+github.com/ethereum/go-ethereum/vm/types.go:328.33,330.19 2 81
+github.com/ethereum/go-ethereum/vm/types.go:334.2,334.12 1 81
+github.com/ethereum/go-ethereum/vm/types.go:330.19,332.3 1 0
+github.com/ethereum/go-ethereum/vm/asm.go:10.48,12.6 2 0
+github.com/ethereum/go-ethereum/vm/asm.go:44.2,44.8 1 0
+github.com/ethereum/go-ethereum/vm/asm.go:12.6,13.50 1 0
+github.com/ethereum/go-ethereum/vm/asm.go:18.3,24.13 4 0
+github.com/ethereum/go-ethereum/vm/asm.go:41.3,41.27 1 0
+github.com/ethereum/go-ethereum/vm/asm.go:13.50,15.4 1 0
+github.com/ethereum/go-ethereum/vm/asm.go:25.3,28.39 3 0
+github.com/ethereum/go-ethereum/vm/asm.go:32.4,33.22 2 0
+github.com/ethereum/go-ethereum/vm/asm.go:36.4,38.31 2 0
+github.com/ethereum/go-ethereum/vm/asm.go:28.39,30.5 1 0
+github.com/ethereum/go-ethereum/vm/asm.go:33.22,35.5 1 0
+github.com/ethereum/go-ethereum/vm/errors.go:12.43,14.2 1 0
+github.com/ethereum/go-ethereum/vm/errors.go:16.42,18.2 1 0
+github.com/ethereum/go-ethereum/vm/errors.go:20.31,23.2 2 2
+github.com/ethereum/go-ethereum/vm/errors.go:29.40,31.2 1 0
+github.com/ethereum/go-ethereum/vm/errors.go:33.39,35.2 1 0
+github.com/ethereum/go-ethereum/vm/errors.go:37.30,40.2 2 0
+github.com/ethereum/go-ethereum/vm/errors.go:44.39,46.2 1 0
+github.com/ethereum/go-ethereum/vm/errors.go:48.33,51.2 2 2
+github.com/ethereum/go-ethereum/vm/analysis.go:9.63,14.50 4 3
+github.com/ethereum/go-ethereum/vm/analysis.go:34.2,34.8 1 3
+github.com/ethereum/go-ethereum/vm/analysis.go:14.50,16.13 2 117
+github.com/ethereum/go-ethereum/vm/analysis.go:17.3,19.33 2 61
+github.com/ethereum/go-ethereum/vm/analysis.go:23.4,24.13 2 61
+github.com/ethereum/go-ethereum/vm/analysis.go:25.3,26.10 1 0
+github.com/ethereum/go-ethereum/vm/analysis.go:30.3,31.14 1 56
+github.com/ethereum/go-ethereum/vm/analysis.go:19.33,21.5 1 61
+github.com/ethereum/go-ethereum/vm/analysis.go:26.10,28.5 1 0
+github.com/ethereum/go-ethereum/vm/environment.go:38.56,39.36 1 0
+github.com/ethereum/go-ethereum/vm/environment.go:43.2,50.12 3 0
+github.com/ethereum/go-ethereum/vm/environment.go:39.36,41.3 1 0
+github.com/ethereum/go-ethereum/wire/client_identity.go:21.118,31.2 2 1
+github.com/ethereum/go-ethereum/wire/client_identity.go:33.39,34.2 0 0
+github.com/ethereum/go-ethereum/wire/client_identity.go:36.48,38.33 2 2
+github.com/ethereum/go-ethereum/wire/client_identity.go:42.2,47.20 1 2
+github.com/ethereum/go-ethereum/wire/client_identity.go:38.33,40.3 1 2
+github.com/ethereum/go-ethereum/wire/client_identity.go:50.77,52.2 1 1
+github.com/ethereum/go-ethereum/wire/client_identity.go:54.61,56.2 1 2
+github.com/ethereum/go-ethereum/wire/messages2.go:23.37,25.2 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:28.37,29.36 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:33.2,36.12 3 0
+github.com/ethereum/go-ethereum/wire/messages2.go:29.36,31.3 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:43.68,47.26 3 0
+github.com/ethereum/go-ethereum/wire/messages2.go:58.2,67.16 6 0
+github.com/ethereum/go-ethereum/wire/messages2.go:71.2,71.12 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:47.26,48.59 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:48.59,50.4 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:50.5,50.50 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:50.50,52.4 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:52.5,54.4 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:67.16,69.3 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:74.101,75.20 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:79.2,79.20 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:84.2,84.46 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:88.2,90.40 3 0
+github.com/ethereum/go-ethereum/wire/messages2.go:94.2,106.8 6 0
+github.com/ethereum/go-ethereum/wire/messages2.go:75.20,77.3 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:79.20,81.3 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:84.46,86.3 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:90.40,92.3 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:112.52,114.15 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:122.2,124.6 3 0
+github.com/ethereum/go-ethereum/wire/messages2.go:149.2,151.78 3 0
+github.com/ethereum/go-ethereum/wire/messages2.go:159.2,159.8 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:114.15,115.31 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:115.31,117.4 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:124.6,131.27 4 0
+github.com/ethereum/go-ethereum/wire/messages2.go:144.3,145.18 2 0
+github.com/ethereum/go-ethereum/wire/messages2.go:131.27,132.28 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:132.28,135.5 2 0
+github.com/ethereum/go-ethereum/wire/messages2.go:135.6,136.10 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:140.5,140.20 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:140.20,141.9 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:151.78,154.17 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:154.17,156.4 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:162.82,163.20 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:167.2,167.20 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:172.2,172.46 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:176.2,178.40 3 0
+github.com/ethereum/go-ethereum/wire/messages2.go:182.2,194.8 6 0
+github.com/ethereum/go-ethereum/wire/messages2.go:163.20,165.3 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:167.20,169.3 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:172.46,174.3 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:178.40,180.3 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:197.50,199.2 1 0
+github.com/ethereum/go-ethereum/wire/messaging.go:62.35,64.2 1 0
+github.com/ethereum/go-ethereum/wire/messaging.go:72.57,77.2 1 0
+github.com/ethereum/go-ethereum/wire/messaging.go:84.59,86.15 1 0
+github.com/ethereum/go-ethereum/wire/messaging.go:92.2,98.6 2 0
+github.com/ethereum/go-ethereum/wire/messaging.go:145.2,145.29 1 0
+github.com/ethereum/go-ethereum/wire/messaging.go:155.2,155.8 1 0
+github.com/ethereum/go-ethereum/wire/messaging.go:86.15,87.31 1 0
+github.com/ethereum/go-ethereum/wire/messaging.go:87.31,89.4 1 0
+github.com/ethereum/go-ethereum/wire/messaging.go:98.6,104.27 4 0
+github.com/ethereum/go-ethereum/wire/messaging.go:113.3,113.31 1 0
+github.com/ethereum/go-ethereum/wire/messaging.go:120.3,121.21 2 0
+github.com/ethereum/go-ethereum/wire/messaging.go:134.3,134.29 1 0
+github.com/ethereum/go-ethereum/wire/messaging.go:104.27,105.28 1 0
+github.com/ethereum/go-ethereum/wire/messaging.go:105.28,108.5 2 0
+github.com/ethereum/go-ethereum/wire/messaging.go:108.6,109.10 1 0
+github.com/ethereum/go-ethereum/wire/messaging.go:113.31,117.12 2 0
+github.com/ethereum/go-ethereum/wire/messaging.go:121.21,123.48 1 0
+github.com/ethereum/go-ethereum/wire/messaging.go:128.4,131.19 2 0
+github.com/ethereum/go-ethereum/wire/messaging.go:123.48,125.5 1 0
+github.com/ethereum/go-ethereum/wire/messaging.go:134.29,139.22 4 0
+github.com/ethereum/go-ethereum/wire/messaging.go:139.22,140.10 1 0
+github.com/ethereum/go-ethereum/wire/messaging.go:145.29,153.3 4 0
+github.com/ethereum/go-ethereum/wire/messaging.go:160.50,174.16 7 0
+github.com/ethereum/go-ethereum/wire/messaging.go:178.2,178.12 1 0
+github.com/ethereum/go-ethereum/wire/messaging.go:174.16,176.3 1 0
diff --git a/ptrie/cache.go b/ptrie/cache.go
new file mode 100644
index 000000000..721dc4cf6
--- /dev/null
+++ b/ptrie/cache.go
@@ -0,0 +1,42 @@
+package ptrie
+
+type Backend interface {
+ Get([]byte) ([]byte, error)
+ Put([]byte, []byte)
+}
+
+type Cache struct {
+ store map[string][]byte
+ backend Backend
+}
+
+func NewCache(backend Backend) *Cache {
+ return &Cache{make(map[string][]byte), backend}
+}
+
+func (self *Cache) Get(key []byte) []byte {
+ data := self.store[string(key)]
+ if data == nil {
+ data, _ = self.backend.Get(key)
+ }
+
+ return data
+}
+
+func (self *Cache) Put(key []byte, data []byte) {
+ self.store[string(key)] = data
+}
+
+func (self *Cache) Flush() {
+ for k, v := range self.store {
+ self.backend.Put([]byte(k), v)
+ }
+
+ // This will eventually grow too large. We'd could
+ // do a make limit on storage and push out not-so-popular nodes.
+ //self.Reset()
+}
+
+func (self *Cache) Reset() {
+ self.store = make(map[string][]byte)
+}
diff --git a/ptrie/fullnode.go b/ptrie/fullnode.go
new file mode 100644
index 000000000..7a7f7d22d
--- /dev/null
+++ b/ptrie/fullnode.go
@@ -0,0 +1,69 @@
+package ptrie
+
+type FullNode struct {
+ trie *Trie
+ nodes [17]Node
+}
+
+func NewFullNode(t *Trie) *FullNode {
+ return &FullNode{trie: t}
+}
+
+func (self *FullNode) Dirty() bool { return true }
+func (self *FullNode) Value() Node {
+ self.nodes[16] = self.trie.trans(self.nodes[16])
+ return self.nodes[16]
+}
+func (self *FullNode) Branches() []Node {
+ return self.nodes[:16]
+}
+
+func (self *FullNode) Copy() Node {
+ nnode := NewFullNode(self.trie)
+ for i, node := range self.nodes {
+ nnode.nodes[i] = node
+ }
+
+ return nnode
+}
+
+// Returns the length of non-nil nodes
+func (self *FullNode) Len() (amount int) {
+ for _, node := range self.nodes {
+ if node != nil {
+ amount++
+ }
+ }
+
+ return
+}
+
+func (self *FullNode) Hash() interface{} {
+ return self.trie.store(self)
+}
+
+func (self *FullNode) RlpData() interface{} {
+ t := make([]interface{}, 17)
+ for i, node := range self.nodes {
+ if node != nil {
+ t[i] = node.Hash()
+ } else {
+ t[i] = ""
+ }
+ }
+
+ return t
+}
+
+func (self *FullNode) set(k byte, value Node) {
+ self.nodes[int(k)] = value
+}
+
+func (self *FullNode) branch(i byte) Node {
+ if self.nodes[int(i)] != nil {
+ self.nodes[int(i)] = self.trie.trans(self.nodes[int(i)])
+
+ return self.nodes[int(i)]
+ }
+ return nil
+}
diff --git a/ptrie/hashnode.go b/ptrie/hashnode.go
new file mode 100644
index 000000000..4c17569d7
--- /dev/null
+++ b/ptrie/hashnode.go
@@ -0,0 +1,22 @@
+package ptrie
+
+type HashNode struct {
+ key []byte
+}
+
+func NewHash(key []byte) *HashNode {
+ return &HashNode{key}
+}
+
+func (self *HashNode) RlpData() interface{} {
+ return self.key
+}
+
+func (self *HashNode) Hash() interface{} {
+ return self.key
+}
+
+// These methods will never be called but we have to satisfy Node interface
+func (self *HashNode) Value() Node { return nil }
+func (self *HashNode) Dirty() bool { return true }
+func (self *HashNode) Copy() Node { return self }
diff --git a/ptrie/iterator.go b/ptrie/iterator.go
new file mode 100644
index 000000000..5714bdbc8
--- /dev/null
+++ b/ptrie/iterator.go
@@ -0,0 +1,115 @@
+package ptrie
+
+import (
+ "bytes"
+
+ "github.com/ethereum/go-ethereum/trie"
+)
+
+type Iterator struct {
+ trie *Trie
+
+ Key []byte
+ Value []byte
+}
+
+func NewIterator(trie *Trie) *Iterator {
+ return &Iterator{trie: trie, Key: []byte{0}}
+}
+
+func (self *Iterator) Next() bool {
+ self.trie.mu.Lock()
+ defer self.trie.mu.Unlock()
+
+ key := trie.RemTerm(trie.CompactHexDecode(string(self.Key)))
+ k := self.next(self.trie.root, key)
+
+ self.Key = []byte(trie.DecodeCompact(k))
+
+ return len(k) > 0
+
+}
+
+func (self *Iterator) next(node Node, key []byte) []byte {
+ if node == nil {
+ return nil
+ }
+
+ switch node := node.(type) {
+ case *FullNode:
+ if len(key) > 0 {
+ k := self.next(node.branch(key[0]), key[1:])
+ if k != nil {
+ return append([]byte{key[0]}, k...)
+ }
+ }
+
+ var r byte
+ if len(key) > 0 {
+ r = key[0] + 1
+ }
+
+ for i := r; i < 16; i++ {
+ k := self.key(node.branch(byte(i)))
+ if k != nil {
+ return append([]byte{i}, k...)
+ }
+ }
+
+ case *ShortNode:
+ k := trie.RemTerm(node.Key())
+ if vnode, ok := node.Value().(*ValueNode); ok {
+ if bytes.Compare([]byte(k), key) > 0 {
+ self.Value = vnode.Val()
+ return k
+ }
+ } else {
+ cnode := node.Value()
+
+ var ret []byte
+ skey := key[len(k):]
+ if trie.BeginsWith(key, k) {
+ ret = self.next(cnode, skey)
+ } else if bytes.Compare(k, key[:len(k)]) > 0 {
+ ret = self.key(node)
+ }
+
+ if ret != nil {
+ return append(k, ret...)
+ }
+ }
+ }
+
+ return nil
+}
+
+func (self *Iterator) key(node Node) []byte {
+ switch node := node.(type) {
+ case *ShortNode:
+ // Leaf node
+ if vnode, ok := node.Value().(*ValueNode); ok {
+ k := trie.RemTerm(node.Key())
+ self.Value = vnode.Val()
+
+ return k
+ } else {
+ k := trie.RemTerm(node.Key())
+ return append(k, self.key(node.Value())...)
+ }
+ case *FullNode:
+ if node.Value() != nil {
+ self.Value = node.Value().(*ValueNode).Val()
+
+ return []byte{16}
+ }
+
+ for i := 0; i < 16; i++ {
+ k := self.key(node.branch(byte(i)))
+ if k != nil {
+ return append([]byte{byte(i)}, k...)
+ }
+ }
+ }
+
+ return nil
+}
diff --git a/ptrie/iterator_test.go b/ptrie/iterator_test.go
new file mode 100644
index 000000000..acfc03d63
--- /dev/null
+++ b/ptrie/iterator_test.go
@@ -0,0 +1,33 @@
+package ptrie
+
+import "testing"
+
+func TestIterator(t *testing.T) {
+ trie := NewEmpty()
+ vals := []struct{ k, v string }{
+ {"do", "verb"},
+ {"ether", "wookiedoo"},
+ {"horse", "stallion"},
+ {"shaman", "horse"},
+ {"doge", "coin"},
+ {"dog", "puppy"},
+ {"somethingveryoddindeedthis is", "myothernodedata"},
+ }
+ v := make(map[string]bool)
+ for _, val := range vals {
+ v[val.k] = false
+ trie.UpdateString(val.k, val.v)
+ }
+ trie.Commit()
+
+ it := trie.Iterator()
+ for it.Next() {
+ v[string(it.Key)] = true
+ }
+
+ for k, found := range v {
+ if !found {
+ t.Error("iterator didn't find", k)
+ }
+ }
+}
diff --git a/ptrie/node.go b/ptrie/node.go
new file mode 100644
index 000000000..2c85dbce7
--- /dev/null
+++ b/ptrie/node.go
@@ -0,0 +1,40 @@
+package ptrie
+
+import "fmt"
+
+var indices = []string{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "[17]"}
+
+type Node interface {
+ Value() Node
+ Copy() Node // All nodes, for now, return them self
+ Dirty() bool
+ fstring(string) string
+ Hash() interface{}
+ RlpData() interface{}
+}
+
+// Value node
+func (self *ValueNode) String() string { return self.fstring("") }
+func (self *FullNode) String() string { return self.fstring("") }
+func (self *ShortNode) String() string { return self.fstring("") }
+func (self *ValueNode) fstring(ind string) string { return fmt.Sprintf("%s ", self.data) }
+func (self *HashNode) fstring(ind string) string { return fmt.Sprintf("%x ", self.key) }
+
+// Full node
+func (self *FullNode) fstring(ind string) string {
+ resp := fmt.Sprintf("[\n%s ", ind)
+ for i, node := range self.nodes {
+ if node == nil {
+ resp += fmt.Sprintf("%s: <nil> ", indices[i])
+ } else {
+ resp += fmt.Sprintf("%s: %v", indices[i], node.fstring(ind+" "))
+ }
+ }
+
+ return resp + fmt.Sprintf("\n%s] ", ind)
+}
+
+// Short node
+func (self *ShortNode) fstring(ind string) string {
+ return fmt.Sprintf("[ %s: %v ] ", self.key, self.value.fstring(ind+" "))
+}
diff --git a/ptrie/shortnode.go b/ptrie/shortnode.go
new file mode 100644
index 000000000..73ff2914b
--- /dev/null
+++ b/ptrie/shortnode.go
@@ -0,0 +1,31 @@
+package ptrie
+
+import "github.com/ethereum/go-ethereum/trie"
+
+type ShortNode struct {
+ trie *Trie
+ key []byte
+ value Node
+}
+
+func NewShortNode(t *Trie, key []byte, value Node) *ShortNode {
+ return &ShortNode{t, []byte(trie.CompactEncode(key)), value}
+}
+func (self *ShortNode) Value() Node {
+ self.value = self.trie.trans(self.value)
+
+ return self.value
+}
+func (self *ShortNode) Dirty() bool { return true }
+func (self *ShortNode) Copy() Node { return NewShortNode(self.trie, self.key, self.value) }
+
+func (self *ShortNode) RlpData() interface{} {
+ return []interface{}{self.key, self.value.Hash()}
+}
+func (self *ShortNode) Hash() interface{} {
+ return self.trie.store(self)
+}
+
+func (self *ShortNode) Key() []byte {
+ return trie.CompactDecode(string(self.key))
+}
diff --git a/ptrie/trie.go b/ptrie/trie.go
new file mode 100644
index 000000000..9fe9ea52a
--- /dev/null
+++ b/ptrie/trie.go
@@ -0,0 +1,312 @@
+package ptrie
+
+import (
+ "bytes"
+ "container/list"
+ "fmt"
+ "sync"
+
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/trie"
+)
+
+func ParanoiaCheck(t1 *Trie, backend Backend) (bool, *Trie) {
+ t2 := New(nil, backend)
+
+ it := t1.Iterator()
+ for it.Next() {
+ t2.Update(it.Key, it.Value)
+ }
+
+ return bytes.Compare(t2.Hash(), t1.Hash()) == 0, t2
+}
+
+type Trie struct {
+ mu sync.Mutex
+ root Node
+ roothash []byte
+ cache *Cache
+
+ revisions *list.List
+}
+
+func New(root []byte, backend Backend) *Trie {
+ trie := &Trie{}
+ trie.revisions = list.New()
+ trie.roothash = root
+ trie.cache = NewCache(backend)
+
+ if root != nil {
+ value := ethutil.NewValueFromBytes(trie.cache.Get(root))
+ trie.root = trie.mknode(value)
+ }
+
+ return trie
+}
+
+func (self *Trie) Iterator() *Iterator {
+ return NewIterator(self)
+}
+
+// Legacy support
+func (self *Trie) Root() []byte { return self.Hash() }
+func (self *Trie) Hash() []byte {
+ var hash []byte
+ if self.root != nil {
+ //hash = self.root.Hash().([]byte)
+ t := self.root.Hash()
+ if byts, ok := t.([]byte); ok {
+ hash = byts
+ } else {
+ hash = crypto.Sha3(ethutil.Encode(self.root.RlpData()))
+ }
+ } else {
+ hash = crypto.Sha3(ethutil.Encode(""))
+ }
+
+ if !bytes.Equal(hash, self.roothash) {
+ self.revisions.PushBack(self.roothash)
+ self.roothash = hash
+ }
+
+ return hash
+}
+func (self *Trie) Commit() {
+ // Hash first
+ self.Hash()
+
+ self.cache.Flush()
+}
+
+// Reset should only be called if the trie has been hashed
+func (self *Trie) Reset() {
+ self.cache.Reset()
+
+ revision := self.revisions.Remove(self.revisions.Back()).([]byte)
+ self.roothash = revision
+ value := ethutil.NewValueFromBytes(self.cache.Get(self.roothash))
+ self.root = self.mknode(value)
+}
+
+func (self *Trie) UpdateString(key, value string) Node { return self.Update([]byte(key), []byte(value)) }
+func (self *Trie) Update(key, value []byte) Node {
+ self.mu.Lock()
+ defer self.mu.Unlock()
+
+ k := trie.CompactHexDecode(string(key))
+
+ if len(value) != 0 {
+ self.root = self.insert(self.root, k, &ValueNode{self, value})
+ } else {
+ self.root = self.delete(self.root, k)
+ }
+
+ return self.root
+}
+
+func (self *Trie) GetString(key string) []byte { return self.Get([]byte(key)) }
+func (self *Trie) Get(key []byte) []byte {
+ self.mu.Lock()
+ defer self.mu.Unlock()
+
+ k := trie.CompactHexDecode(string(key))
+
+ n := self.get(self.root, k)
+ if n != nil {
+ return n.(*ValueNode).Val()
+ }
+
+ return nil
+}
+
+func (self *Trie) DeleteString(key string) Node { return self.Delete([]byte(key)) }
+func (self *Trie) Delete(key []byte) Node {
+ self.mu.Lock()
+ defer self.mu.Unlock()
+
+ k := trie.CompactHexDecode(string(key))
+ self.root = self.delete(self.root, k)
+
+ return self.root
+}
+
+func (self *Trie) insert(node Node, key []byte, value Node) Node {
+ if len(key) == 0 {
+ return value
+ }
+
+ if node == nil {
+ return NewShortNode(self, key, value)
+ }
+
+ switch node := node.(type) {
+ case *ShortNode:
+ k := node.Key()
+ cnode := node.Value()
+ if bytes.Equal(k, key) {
+ return NewShortNode(self, key, value)
+ }
+
+ var n Node
+ matchlength := trie.MatchingNibbleLength(key, k)
+ if matchlength == len(k) {
+ n = self.insert(cnode, key[matchlength:], value)
+ } else {
+ pnode := self.insert(nil, k[matchlength+1:], cnode)
+ nnode := self.insert(nil, key[matchlength+1:], value)
+ fulln := NewFullNode(self)
+ fulln.set(k[matchlength], pnode)
+ fulln.set(key[matchlength], nnode)
+ n = fulln
+ }
+ if matchlength == 0 {
+ return n
+ }
+
+ return NewShortNode(self, key[:matchlength], n)
+
+ case *FullNode:
+ cpy := node.Copy().(*FullNode)
+ cpy.set(key[0], self.insert(node.branch(key[0]), key[1:], value))
+
+ return cpy
+
+ default:
+ panic("Invalid node")
+ }
+}
+
+func (self *Trie) get(node Node, key []byte) Node {
+ if len(key) == 0 {
+ return node
+ }
+
+ if node == nil {
+ return nil
+ }
+
+ switch node := node.(type) {
+ case *ShortNode:
+ k := node.Key()
+ cnode := node.Value()
+
+ if len(key) >= len(k) && bytes.Equal(k, key[:len(k)]) {
+ return self.get(cnode, key[len(k):])
+ }
+
+ return nil
+ case *FullNode:
+ return self.get(node.branch(key[0]), key[1:])
+ default:
+ panic(fmt.Sprintf("%T: invalid node: %v", node, node))
+ }
+}
+
+func (self *Trie) delete(node Node, key []byte) Node {
+ if len(key) == 0 {
+ return nil
+ }
+
+ switch node := node.(type) {
+ case *ShortNode:
+ k := node.Key()
+ cnode := node.Value()
+ if bytes.Equal(key, k) {
+ return nil
+ } else if bytes.Equal(key[:len(k)], k) {
+ child := self.delete(cnode, key[len(k):])
+
+ var n Node
+ switch child := child.(type) {
+ case *ShortNode:
+ nkey := append(k, child.Key()...)
+ n = NewShortNode(self, nkey, child.Value())
+ case *FullNode:
+ n = NewShortNode(self, node.key, child)
+ }
+
+ return n
+ } else {
+ return node
+ }
+
+ case *FullNode:
+ n := node.Copy().(*FullNode)
+ n.set(key[0], self.delete(n.branch(key[0]), key[1:]))
+
+ pos := -1
+ for i := 0; i < 17; i++ {
+ if n.branch(byte(i)) != nil {
+ if pos == -1 {
+ pos = i
+ } else {
+ pos = -2
+ }
+ }
+ }
+
+ var nnode Node
+ if pos == 16 {
+ nnode = NewShortNode(self, []byte{16}, n.branch(byte(pos)))
+ } else if pos >= 0 {
+ cnode := n.branch(byte(pos))
+ switch cnode := cnode.(type) {
+ case *ShortNode:
+ // Stitch keys
+ k := append([]byte{byte(pos)}, cnode.Key()...)
+ nnode = NewShortNode(self, k, cnode.Value())
+ case *FullNode:
+ nnode = NewShortNode(self, []byte{byte(pos)}, n.branch(byte(pos)))
+ }
+ } else {
+ nnode = n
+ }
+
+ return nnode
+
+ default:
+ panic("Invalid node")
+ }
+}
+
+// casting functions and cache storing
+func (self *Trie) mknode(value *ethutil.Value) Node {
+ l := value.Len()
+ switch l {
+ case 2:
+ return NewShortNode(self, trie.CompactDecode(string(value.Get(0).Bytes())), self.mknode(value.Get(1)))
+ case 17:
+ fnode := NewFullNode(self)
+ for i := 0; i < l; i++ {
+ fnode.set(byte(i), self.mknode(value.Get(i)))
+ }
+ return fnode
+ case 32:
+ return &HashNode{value.Bytes()}
+ default:
+ return &ValueNode{self, value.Bytes()}
+ }
+}
+
+func (self *Trie) trans(node Node) Node {
+ switch node := node.(type) {
+ case *HashNode:
+ value := ethutil.NewValueFromBytes(self.cache.Get(node.key))
+ return self.mknode(value)
+ default:
+ return node
+ }
+}
+
+func (self *Trie) store(node Node) interface{} {
+ data := ethutil.Encode(node)
+ if len(data) >= 32 {
+ key := crypto.Sha3(data)
+ self.cache.Put(key, data)
+
+ return key
+ }
+
+ return node.RlpData()
+}
diff --git a/ptrie/trie_test.go b/ptrie/trie_test.go
new file mode 100644
index 000000000..5b1c64140
--- /dev/null
+++ b/ptrie/trie_test.go
@@ -0,0 +1,259 @@
+package ptrie
+
+import (
+ "bytes"
+ "fmt"
+ "testing"
+
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/ethutil"
+)
+
+type Db map[string][]byte
+
+func (self Db) Get(k []byte) ([]byte, error) { return self[string(k)], nil }
+func (self Db) Put(k, v []byte) { self[string(k)] = v }
+
+// Used for testing
+func NewEmpty() *Trie {
+ return New(nil, make(Db))
+}
+
+func TestEmptyTrie(t *testing.T) {
+ trie := NewEmpty()
+ res := trie.Hash()
+ exp := crypto.Sha3(ethutil.Encode(""))
+ if !bytes.Equal(res, exp) {
+ t.Errorf("expected %x got %x", exp, res)
+ }
+}
+
+func TestInsert(t *testing.T) {
+ trie := NewEmpty()
+
+ trie.UpdateString("doe", "reindeer")
+ trie.UpdateString("dog", "puppy")
+ trie.UpdateString("dogglesworth", "cat")
+
+ exp := ethutil.Hex2Bytes("8aad789dff2f538bca5d8ea56e8abe10f4c7ba3a5dea95fea4cd6e7c3a1168d3")
+ root := trie.Hash()
+ if !bytes.Equal(root, exp) {
+ t.Errorf("exp %x got %x", exp, root)
+ }
+
+ trie = NewEmpty()
+ trie.UpdateString("A", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")
+
+ exp = ethutil.Hex2Bytes("d23786fb4a010da3ce639d66d5e904a11dbc02746d1ce25029e53290cabf28ab")
+ root = trie.Hash()
+ if !bytes.Equal(root, exp) {
+ t.Errorf("exp %x got %x", exp, root)
+ }
+}
+
+func TestGet(t *testing.T) {
+ trie := NewEmpty()
+
+ trie.UpdateString("doe", "reindeer")
+ trie.UpdateString("dog", "puppy")
+ trie.UpdateString("dogglesworth", "cat")
+
+ res := trie.GetString("dog")
+ if !bytes.Equal(res, []byte("puppy")) {
+ t.Errorf("expected puppy got %x", res)
+ }
+
+ unknown := trie.GetString("unknown")
+ if unknown != nil {
+ t.Errorf("expected nil got %x", unknown)
+ }
+}
+
+func TestDelete(t *testing.T) {
+ trie := NewEmpty()
+
+ vals := []struct{ k, v string }{
+ {"do", "verb"},
+ {"ether", "wookiedoo"},
+ {"horse", "stallion"},
+ {"shaman", "horse"},
+ {"doge", "coin"},
+ {"ether", ""},
+ {"dog", "puppy"},
+ {"shaman", ""},
+ }
+ for _, val := range vals {
+ if val.v != "" {
+ trie.UpdateString(val.k, val.v)
+ } else {
+ trie.DeleteString(val.k)
+ }
+ }
+
+ hash := trie.Hash()
+ exp := ethutil.Hex2Bytes("5991bb8c6514148a29db676a14ac506cd2cd5775ace63c30a4fe457715e9ac84")
+ if !bytes.Equal(hash, exp) {
+ t.Errorf("expected %x got %x", exp, hash)
+ }
+}
+
+func TestEmptyValues(t *testing.T) {
+ trie := NewEmpty()
+
+ vals := []struct{ k, v string }{
+ {"do", "verb"},
+ {"ether", "wookiedoo"},
+ {"horse", "stallion"},
+ {"shaman", "horse"},
+ {"doge", "coin"},
+ {"ether", ""},
+ {"dog", "puppy"},
+ {"shaman", ""},
+ }
+ for _, val := range vals {
+ trie.UpdateString(val.k, val.v)
+ }
+
+ hash := trie.Hash()
+ exp := ethutil.Hex2Bytes("5991bb8c6514148a29db676a14ac506cd2cd5775ace63c30a4fe457715e9ac84")
+ if !bytes.Equal(hash, exp) {
+ t.Errorf("expected %x got %x", exp, hash)
+ }
+}
+
+func TestReplication(t *testing.T) {
+ trie := NewEmpty()
+ vals := []struct{ k, v string }{
+ {"do", "verb"},
+ {"ether", "wookiedoo"},
+ {"horse", "stallion"},
+ {"shaman", "horse"},
+ {"doge", "coin"},
+ {"ether", ""},
+ {"dog", "puppy"},
+ {"shaman", ""},
+ {"somethingveryoddindeedthis is", "myothernodedata"},
+ }
+ for _, val := range vals {
+ trie.UpdateString(val.k, val.v)
+ }
+ trie.Commit()
+
+ trie2 := New(trie.roothash, trie.cache.backend)
+ if string(trie2.GetString("horse")) != "stallion" {
+ t.Error("expected to have harse => stallion")
+ }
+
+ hash := trie2.Hash()
+ exp := trie.Hash()
+ if !bytes.Equal(hash, exp) {
+ t.Errorf("root failure. expected %x got %x", exp, hash)
+ }
+
+}
+
+func TestReset(t *testing.T) {
+ trie := NewEmpty()
+ vals := []struct{ k, v string }{
+ {"do", "verb"},
+ {"ether", "wookiedoo"},
+ {"horse", "stallion"},
+ }
+ for _, val := range vals {
+ trie.UpdateString(val.k, val.v)
+ }
+ trie.Commit()
+
+ before := ethutil.CopyBytes(trie.roothash)
+ trie.UpdateString("should", "revert")
+ trie.Hash()
+ // Should have no effect
+ trie.Hash()
+ trie.Hash()
+ // ###
+
+ trie.Reset()
+ after := ethutil.CopyBytes(trie.roothash)
+
+ if !bytes.Equal(before, after) {
+ t.Errorf("expected roots to be equal. %x - %x", before, after)
+ }
+}
+
+func TestParanoia(t *testing.T) {
+ t.Skip()
+ trie := NewEmpty()
+
+ vals := []struct{ k, v string }{
+ {"do", "verb"},
+ {"ether", "wookiedoo"},
+ {"horse", "stallion"},
+ {"shaman", "horse"},
+ {"doge", "coin"},
+ {"ether", ""},
+ {"dog", "puppy"},
+ {"shaman", ""},
+ {"somethingveryoddindeedthis is", "myothernodedata"},
+ }
+ for _, val := range vals {
+ trie.UpdateString(val.k, val.v)
+ }
+ trie.Commit()
+
+ ok, t2 := ParanoiaCheck(trie, trie.cache.backend)
+ if !ok {
+ t.Errorf("trie paranoia check failed %x %x", trie.roothash, t2.roothash)
+ }
+}
+
+// Not an actual test
+func TestOutput(t *testing.T) {
+ t.Skip()
+
+ base := "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ trie := NewEmpty()
+ for i := 0; i < 50; i++ {
+ trie.UpdateString(fmt.Sprintf("%s%d", base, i), "valueeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee")
+ }
+ fmt.Println("############################## FULL ################################")
+ fmt.Println(trie.root)
+
+ trie.Commit()
+ fmt.Println("############################## SMALL ################################")
+ trie2 := New(trie.roothash, trie.cache.backend)
+ trie2.GetString(base + "20")
+ fmt.Println(trie2.root)
+}
+
+func BenchmarkGets(b *testing.B) {
+ trie := NewEmpty()
+ vals := []struct{ k, v string }{
+ {"do", "verb"},
+ {"ether", "wookiedoo"},
+ {"horse", "stallion"},
+ {"shaman", "horse"},
+ {"doge", "coin"},
+ {"ether", ""},
+ {"dog", "puppy"},
+ {"shaman", ""},
+ {"somethingveryoddindeedthis is", "myothernodedata"},
+ }
+ for _, val := range vals {
+ trie.UpdateString(val.k, val.v)
+ }
+
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ trie.Get([]byte("horse"))
+ }
+}
+
+func BenchmarkUpdate(b *testing.B) {
+ trie := NewEmpty()
+
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ trie.UpdateString(fmt.Sprintf("aaaaaaaaa%d", i), "value")
+ }
+ trie.Hash()
+}
diff --git a/ptrie/valuenode.go b/ptrie/valuenode.go
new file mode 100644
index 000000000..c593eb6c6
--- /dev/null
+++ b/ptrie/valuenode.go
@@ -0,0 +1,13 @@
+package ptrie
+
+type ValueNode struct {
+ trie *Trie
+ data []byte
+}
+
+func (self *ValueNode) Value() Node { return self } // Best not to call :-)
+func (self *ValueNode) Val() []byte { return self.data }
+func (self *ValueNode) Dirty() bool { return true }
+func (self *ValueNode) Copy() Node { return &ValueNode{self.trie, self.data} }
+func (self *ValueNode) RlpData() interface{} { return self.data }
+func (self *ValueNode) Hash() interface{} { return self.data }
diff --git a/rlp/decode.go b/rlp/decode.go
new file mode 100644
index 000000000..712d9fcf1
--- /dev/null
+++ b/rlp/decode.go
@@ -0,0 +1,743 @@
+package rlp
+
+import (
+ "bufio"
+ "encoding/binary"
+ "errors"
+ "fmt"
+ "io"
+ "math/big"
+ "reflect"
+)
+
+var (
+ errNoPointer = errors.New("rlp: interface given to Decode must be a pointer")
+ errDecodeIntoNil = errors.New("rlp: pointer given to Decode must not be nil")
+)
+
+// Decoder is implemented by types that require custom RLP
+// decoding rules or need to decode into private fields.
+//
+// The DecodeRLP method should read one value from the given
+// Stream. It is not forbidden to read less or more, but it might
+// be confusing.
+type Decoder interface {
+ DecodeRLP(*Stream) error
+}
+
+// Decode parses RLP-encoded data from r and stores the result in the
+// value pointed to by val. Val must be a non-nil pointer. If r does
+// not implement ByteReader, Decode will do its own buffering.
+//
+// Decode uses the following type-dependent decoding rules:
+//
+// If the type implements the Decoder interface, decode calls
+// DecodeRLP.
+//
+// To decode into a pointer, Decode will set the pointer to nil if the
+// input has size zero or the input is a single byte with value zero.
+// If the input has nonzero size, Decode will allocate a new value of
+// the type being pointed to.
+//
+// To decode into a struct, Decode expects the input to be an RLP
+// list. The decoded elements of the list are assigned to each public
+// field in the order given by the struct's definition. If the input
+// list has too few elements, no error is returned and the remaining
+// fields will have the zero value.
+// Recursive struct types are supported.
+//
+// To decode into a slice, the input must be a list and the resulting
+// slice will contain the input elements in order.
+// As a special case, if the slice has a byte-size element type, the input
+// can also be an RLP string.
+//
+// To decode into a Go string, the input must be an RLP string. The
+// bytes are taken as-is and will not necessarily be valid UTF-8.
+//
+// To decode into an unsigned integer type, the input must also be an RLP
+// string. The bytes are interpreted as a big endian representation of
+// the integer. If the RLP string is larger than the bit size of the
+// type, Decode will return an error. Decode also supports *big.Int.
+// There is no size limit for big integers.
+//
+// To decode into an interface value, Decode stores one of these
+// in the value:
+//
+// []interface{}, for RLP lists
+// []byte, for RLP strings
+//
+// Non-empty interface types are not supported, nor are booleans,
+// signed integers, floating point numbers, maps, channels and
+// functions.
+func Decode(r io.Reader, val interface{}) error {
+ return NewStream(r).Decode(val)
+}
+
+type decodeError struct {
+ msg string
+ typ reflect.Type
+}
+
+func (err decodeError) Error() string {
+ return fmt.Sprintf("rlp: %s for %v", err.msg, err.typ)
+}
+
+func wrapStreamError(err error, typ reflect.Type) error {
+ switch err {
+ case ErrExpectedList:
+ return decodeError{"expected input list", typ}
+ case ErrExpectedString:
+ return decodeError{"expected input string or byte", typ}
+ case errUintOverflow:
+ return decodeError{"input string too long", typ}
+ case errNotAtEOL:
+ return decodeError{"input list has too many elements", typ}
+ }
+ return err
+}
+
+var (
+ decoderInterface = reflect.TypeOf(new(Decoder)).Elem()
+ bigInt = reflect.TypeOf(big.Int{})
+)
+
+func makeDecoder(typ reflect.Type) (dec decoder, err error) {
+ kind := typ.Kind()
+ switch {
+ case typ.Implements(decoderInterface):
+ return decodeDecoder, nil
+ case kind != reflect.Ptr && reflect.PtrTo(typ).Implements(decoderInterface):
+ return decodeDecoderNoPtr, nil
+ case typ.AssignableTo(reflect.PtrTo(bigInt)):
+ return decodeBigInt, nil
+ case typ.AssignableTo(bigInt):
+ return decodeBigIntNoPtr, nil
+ case isUint(kind):
+ return decodeUint, nil
+ case kind == reflect.String:
+ return decodeString, nil
+ case kind == reflect.Slice || kind == reflect.Array:
+ return makeListDecoder(typ)
+ case kind == reflect.Struct:
+ return makeStructDecoder(typ)
+ case kind == reflect.Ptr:
+ return makePtrDecoder(typ)
+ case kind == reflect.Interface && typ.NumMethod() == 0:
+ return decodeInterface, nil
+ default:
+ return nil, fmt.Errorf("rlp: type %v is not RLP-serializable", typ)
+ }
+}
+
+func decodeUint(s *Stream, val reflect.Value) error {
+ typ := val.Type()
+ num, err := s.uint(typ.Bits())
+ if err != nil {
+ return wrapStreamError(err, val.Type())
+ }
+ val.SetUint(num)
+ return nil
+}
+
+func decodeString(s *Stream, val reflect.Value) error {
+ b, err := s.Bytes()
+ if err != nil {
+ return wrapStreamError(err, val.Type())
+ }
+ val.SetString(string(b))
+ return nil
+}
+
+func decodeBigIntNoPtr(s *Stream, val reflect.Value) error {
+ return decodeBigInt(s, val.Addr())
+}
+
+func decodeBigInt(s *Stream, val reflect.Value) error {
+ b, err := s.Bytes()
+ if err != nil {
+ return wrapStreamError(err, val.Type())
+ }
+ i := val.Interface().(*big.Int)
+ if i == nil {
+ i = new(big.Int)
+ val.Set(reflect.ValueOf(i))
+ }
+ i.SetBytes(b)
+ return nil
+}
+
+func makeListDecoder(typ reflect.Type) (decoder, error) {
+ etype := typ.Elem()
+ if etype.Kind() == reflect.Uint8 && !reflect.PtrTo(etype).Implements(decoderInterface) {
+ if typ.Kind() == reflect.Array {
+ return decodeByteArray, nil
+ } else {
+ return decodeByteSlice, nil
+ }
+ }
+ etypeinfo, err := cachedTypeInfo1(etype)
+ if err != nil {
+ return nil, err
+ }
+
+ if typ.Kind() == reflect.Array {
+ return func(s *Stream, val reflect.Value) error {
+ return decodeListArray(s, val, etypeinfo.decoder)
+ }, nil
+ }
+ return func(s *Stream, val reflect.Value) error {
+ return decodeListSlice(s, val, etypeinfo.decoder)
+ }, nil
+}
+
+func decodeListSlice(s *Stream, val reflect.Value, elemdec decoder) error {
+ size, err := s.List()
+ if err != nil {
+ return wrapStreamError(err, val.Type())
+ }
+ if size == 0 {
+ val.Set(reflect.MakeSlice(val.Type(), 0, 0))
+ return s.ListEnd()
+ }
+
+ i := 0
+ for ; ; i++ {
+ // grow slice if necessary
+ if i >= val.Cap() {
+ newcap := val.Cap() + val.Cap()/2
+ if newcap < 4 {
+ newcap = 4
+ }
+ newv := reflect.MakeSlice(val.Type(), val.Len(), newcap)
+ reflect.Copy(newv, val)
+ val.Set(newv)
+ }
+ if i >= val.Len() {
+ val.SetLen(i + 1)
+ }
+ // decode into element
+ if err := elemdec(s, val.Index(i)); err == EOL {
+ break
+ } else if err != nil {
+ return err
+ }
+ }
+ if i < val.Len() {
+ val.SetLen(i)
+ }
+ return s.ListEnd()
+}
+
+func decodeListArray(s *Stream, val reflect.Value, elemdec decoder) error {
+ size, err := s.List()
+ if err != nil {
+ return err
+ }
+ if size == 0 {
+ zero(val, 0)
+ return s.ListEnd()
+ }
+
+ // The approach here is stolen from package json, although we differ
+ // in the semantics for arrays. package json discards remaining
+ // elements that would not fit into the array. We generate an error in
+ // this case because we'd be losing information.
+ vlen := val.Len()
+ i := 0
+ for ; i < vlen; i++ {
+ if err := elemdec(s, val.Index(i)); err == EOL {
+ break
+ } else if err != nil {
+ return err
+ }
+ }
+ if i < vlen {
+ zero(val, i)
+ }
+ return wrapStreamError(s.ListEnd(), val.Type())
+}
+
+func decodeByteSlice(s *Stream, val reflect.Value) error {
+ kind, _, err := s.Kind()
+ if err != nil {
+ return err
+ }
+ if kind == List {
+ return decodeListSlice(s, val, decodeUint)
+ }
+ b, err := s.Bytes()
+ if err == nil {
+ val.SetBytes(b)
+ }
+ return err
+}
+
+func decodeByteArray(s *Stream, val reflect.Value) error {
+ kind, size, err := s.Kind()
+ if err != nil {
+ return err
+ }
+ switch kind {
+ case Byte:
+ if val.Len() == 0 {
+ return decodeError{"input string too long", val.Type()}
+ }
+ bv, _ := s.Uint()
+ val.Index(0).SetUint(bv)
+ zero(val, 1)
+ case String:
+ if uint64(val.Len()) < size {
+ return decodeError{"input string too long", val.Type()}
+ }
+ slice := val.Slice(0, int(size)).Interface().([]byte)
+ if err := s.readFull(slice); err != nil {
+ return err
+ }
+ zero(val, int(size))
+ case List:
+ return decodeListArray(s, val, decodeUint)
+ }
+ return nil
+}
+
+func zero(val reflect.Value, start int) {
+ z := reflect.Zero(val.Type().Elem())
+ end := val.Len()
+ for i := start; i < end; i++ {
+ val.Index(i).Set(z)
+ }
+}
+
+type field struct {
+ index int
+ info *typeinfo
+}
+
+func makeStructDecoder(typ reflect.Type) (decoder, error) {
+ var fields []field
+ for i := 0; i < typ.NumField(); i++ {
+ if f := typ.Field(i); f.PkgPath == "" { // exported
+ info, err := cachedTypeInfo1(f.Type)
+ if err != nil {
+ return nil, err
+ }
+ fields = append(fields, field{i, info})
+ }
+ }
+ dec := func(s *Stream, val reflect.Value) (err error) {
+ if _, err = s.List(); err != nil {
+ return wrapStreamError(err, typ)
+ }
+ for _, f := range fields {
+ err = f.info.decoder(s, val.Field(f.index))
+ if err == EOL {
+ // too few elements. leave the rest at their zero value.
+ break
+ } else if err != nil {
+ return err
+ }
+ }
+ return wrapStreamError(s.ListEnd(), typ)
+ }
+ return dec, nil
+}
+
+func makePtrDecoder(typ reflect.Type) (decoder, error) {
+ etype := typ.Elem()
+ etypeinfo, err := cachedTypeInfo1(etype)
+ if err != nil {
+ return nil, err
+ }
+ dec := func(s *Stream, val reflect.Value) (err error) {
+ _, size, err := s.Kind()
+ if err != nil || size == 0 && s.byteval == 0 {
+ val.Set(reflect.Zero(typ)) // set to nil
+ return err
+ }
+ newval := val
+ if val.IsNil() {
+ newval = reflect.New(etype)
+ }
+ if err = etypeinfo.decoder(s, newval.Elem()); err == nil {
+ val.Set(newval)
+ }
+ return err
+ }
+ return dec, nil
+}
+
+var ifsliceType = reflect.TypeOf([]interface{}{})
+
+func decodeInterface(s *Stream, val reflect.Value) error {
+ kind, _, err := s.Kind()
+ if err != nil {
+ return err
+ }
+ if kind == List {
+ slice := reflect.New(ifsliceType).Elem()
+ if err := decodeListSlice(s, slice, decodeInterface); err != nil {
+ return err
+ }
+ val.Set(slice)
+ } else {
+ b, err := s.Bytes()
+ if err != nil {
+ return err
+ }
+ val.Set(reflect.ValueOf(b))
+ }
+ return nil
+}
+
+// This decoder is used for non-pointer values of types
+// that implement the Decoder interface using a pointer receiver.
+func decodeDecoderNoPtr(s *Stream, val reflect.Value) error {
+ return val.Addr().Interface().(Decoder).DecodeRLP(s)
+}
+
+func decodeDecoder(s *Stream, val reflect.Value) error {
+ // Decoder instances are not handled using the pointer rule if the type
+ // implements Decoder with pointer receiver (i.e. always)
+ // because it might handle empty values specially.
+ // We need to allocate one here in this case, like makePtrDecoder does.
+ if val.Kind() == reflect.Ptr && val.IsNil() {
+ val.Set(reflect.New(val.Type().Elem()))
+ }
+ return val.Interface().(Decoder).DecodeRLP(s)
+}
+
+// Kind represents the kind of value contained in an RLP stream.
+type Kind int
+
+const (
+ Byte Kind = iota
+ String
+ List
+)
+
+func (k Kind) String() string {
+ switch k {
+ case Byte:
+ return "Byte"
+ case String:
+ return "String"
+ case List:
+ return "List"
+ default:
+ return fmt.Sprintf("Unknown(%d)", k)
+ }
+}
+
+var (
+ // EOL is returned when the end of the current list
+ // has been reached during streaming.
+ EOL = errors.New("rlp: end of list")
+
+ // Other errors
+ ErrExpectedString = errors.New("rlp: expected String or Byte")
+ ErrExpectedList = errors.New("rlp: expected List")
+ ErrElemTooLarge = errors.New("rlp: element is larger than containing list")
+
+ // internal errors
+ errNotInList = errors.New("rlp: call of ListEnd outside of any list")
+ errNotAtEOL = errors.New("rlp: call of ListEnd not positioned at EOL")
+)
+
+// ByteReader must be implemented by any input reader for a Stream. It
+// is implemented by e.g. bufio.Reader and bytes.Reader.
+type ByteReader interface {
+ io.Reader
+ io.ByteReader
+}
+
+// Stream can be used for piecemeal decoding of an input stream. This
+// is useful if the input is very large or if the decoding rules for a
+// type depend on the input structure. Stream does not keep an
+// internal buffer. After decoding a value, the input reader will be
+// positioned just before the type information for the next value.
+//
+// When decoding a list and the input position reaches the declared
+// length of the list, all operations will return error EOL.
+// The end of the list must be acknowledged using ListEnd to continue
+// reading the enclosing list.
+//
+// Stream is not safe for concurrent use.
+type Stream struct {
+ r ByteReader
+ uintbuf []byte
+
+ kind Kind // kind of value ahead
+ size uint64 // size of value ahead
+ byteval byte // value of single byte in type tag
+ stack []listpos
+}
+
+type listpos struct{ pos, size uint64 }
+
+// NewStream creates a new stream reading from r.
+// If r does not implement ByteReader, the Stream will
+// introduce its own buffering.
+func NewStream(r io.Reader) *Stream {
+ s := new(Stream)
+ s.Reset(r)
+ return s
+}
+
+// NewListStream creates a new stream that pretends to be positioned
+// at an encoded list of the given length.
+func NewListStream(r io.Reader, len uint64) *Stream {
+ s := new(Stream)
+ s.Reset(r)
+ s.kind = List
+ s.size = len
+ return s
+}
+
+// Bytes reads an RLP string and returns its contents as a byte slice.
+// If the input does not contain an RLP string, the returned
+// error will be ErrExpectedString.
+func (s *Stream) Bytes() ([]byte, error) {
+ kind, size, err := s.Kind()
+ if err != nil {
+ return nil, err
+ }
+ switch kind {
+ case Byte:
+ s.kind = -1 // rearm Kind
+ return []byte{s.byteval}, nil
+ case String:
+ b := make([]byte, size)
+ if err = s.readFull(b); err != nil {
+ return nil, err
+ }
+ return b, nil
+ default:
+ return nil, ErrExpectedString
+ }
+}
+
+var errUintOverflow = errors.New("rlp: uint overflow")
+
+// Uint reads an RLP string of up to 8 bytes and returns its contents
+// as an unsigned integer. If the input does not contain an RLP string, the
+// returned error will be ErrExpectedString.
+func (s *Stream) Uint() (uint64, error) {
+ return s.uint(64)
+}
+
+func (s *Stream) uint(maxbits int) (uint64, error) {
+ kind, size, err := s.Kind()
+ if err != nil {
+ return 0, err
+ }
+ switch kind {
+ case Byte:
+ s.kind = -1 // rearm Kind
+ return uint64(s.byteval), nil
+ case String:
+ if size > uint64(maxbits/8) {
+ return 0, errUintOverflow
+ }
+ return s.readUint(byte(size))
+ default:
+ return 0, ErrExpectedString
+ }
+}
+
+// List starts decoding an RLP list. If the input does not contain a
+// list, the returned error will be ErrExpectedList. When the list's
+// end has been reached, any Stream operation will return EOL.
+func (s *Stream) List() (size uint64, err error) {
+ kind, size, err := s.Kind()
+ if err != nil {
+ return 0, err
+ }
+ if kind != List {
+ return 0, ErrExpectedList
+ }
+ s.stack = append(s.stack, listpos{0, size})
+ s.kind = -1
+ s.size = 0
+ return size, nil
+}
+
+// ListEnd returns to the enclosing list.
+// The input reader must be positioned at the end of a list.
+func (s *Stream) ListEnd() error {
+ if len(s.stack) == 0 {
+ return errNotInList
+ }
+ tos := s.stack[len(s.stack)-1]
+ if tos.pos != tos.size {
+ return errNotAtEOL
+ }
+ s.stack = s.stack[:len(s.stack)-1] // pop
+ if len(s.stack) > 0 {
+ s.stack[len(s.stack)-1].pos += tos.size
+ }
+ s.kind = -1
+ s.size = 0
+ return nil
+}
+
+// Decode decodes a value and stores the result in the value pointed
+// to by val. Please see the documentation for the Decode function
+// to learn about the decoding rules.
+func (s *Stream) Decode(val interface{}) error {
+ if val == nil {
+ return errDecodeIntoNil
+ }
+ rval := reflect.ValueOf(val)
+ rtyp := rval.Type()
+ if rtyp.Kind() != reflect.Ptr {
+ return errNoPointer
+ }
+ if rval.IsNil() {
+ return errDecodeIntoNil
+ }
+ info, err := cachedTypeInfo(rtyp.Elem())
+ if err != nil {
+ return err
+ }
+ return info.decoder(s, rval.Elem())
+}
+
+// Reset discards any information about the current decoding context
+// and starts reading from r. If r does not also implement ByteReader,
+// Stream will do its own buffering.
+func (s *Stream) Reset(r io.Reader) {
+ bufr, ok := r.(ByteReader)
+ if !ok {
+ bufr = bufio.NewReader(r)
+ }
+ s.r = bufr
+ s.stack = s.stack[:0]
+ s.size = 0
+ s.kind = -1
+ if s.uintbuf == nil {
+ s.uintbuf = make([]byte, 8)
+ }
+}
+
+// Kind returns the kind and size of the next value in the
+// input stream.
+//
+// The returned size is the number of bytes that make up the value.
+// For kind == Byte, the size is zero because the value is
+// contained in the type tag.
+//
+// The first call to Kind will read size information from the input
+// reader and leave it positioned at the start of the actual bytes of
+// the value. Subsequent calls to Kind (until the value is decoded)
+// will not advance the input reader and return cached information.
+func (s *Stream) Kind() (kind Kind, size uint64, err error) {
+ var tos *listpos
+ if len(s.stack) > 0 {
+ tos = &s.stack[len(s.stack)-1]
+ }
+ if s.kind < 0 {
+ if tos != nil && tos.pos == tos.size {
+ return 0, 0, EOL
+ }
+ kind, size, err = s.readKind()
+ if err != nil {
+ return 0, 0, err
+ }
+ s.kind, s.size = kind, size
+ }
+ if tos != nil && tos.pos+s.size > tos.size {
+ return 0, 0, ErrElemTooLarge
+ }
+ return s.kind, s.size, nil
+}
+
+func (s *Stream) readKind() (kind Kind, size uint64, err error) {
+ b, err := s.readByte()
+ if err != nil {
+ return 0, 0, err
+ }
+ s.byteval = 0
+ switch {
+ case b < 0x80:
+ // For a single byte whose value is in the [0x00, 0x7F] range, that byte
+ // is its own RLP encoding.
+ s.byteval = b
+ return Byte, 0, nil
+ case b < 0xB8:
+ // Otherwise, if a string is 0-55 bytes long,
+ // the RLP encoding consists of a single byte with value 0x80 plus the
+ // length of the string followed by the string. The range of the first
+ // byte is thus [0x80, 0xB7].
+ return String, uint64(b - 0x80), nil
+ case b < 0xC0:
+ // If a string is more than 55 bytes long, the
+ // RLP encoding consists of a single byte with value 0xB7 plus the length
+ // of the length of the string in binary form, followed by the length of
+ // the string, followed by the string. For example, a length-1024 string
+ // would be encoded as 0xB90400 followed by the string. The range of
+ // the first byte is thus [0xB8, 0xBF].
+ size, err = s.readUint(b - 0xB7)
+ return String, size, err
+ case b < 0xF8:
+ // If the total payload of a list
+ // (i.e. the combined length of all its items) is 0-55 bytes long, the
+ // RLP encoding consists of a single byte with value 0xC0 plus the length
+ // of the list followed by the concatenation of the RLP encodings of the
+ // items. The range of the first byte is thus [0xC0, 0xF7].
+ return List, uint64(b - 0xC0), nil
+ default:
+ // If the total payload of a list is more than 55 bytes long,
+ // the RLP encoding consists of a single byte with value 0xF7
+ // plus the length of the length of the payload in binary
+ // form, followed by the length of the payload, followed by
+ // the concatenation of the RLP encodings of the items. The
+ // range of the first byte is thus [0xF8, 0xFF].
+ size, err = s.readUint(b - 0xF7)
+ return List, size, err
+ }
+}
+
+func (s *Stream) readUint(size byte) (uint64, error) {
+ if size == 1 {
+ b, err := s.readByte()
+ if err == io.EOF {
+ err = io.ErrUnexpectedEOF
+ }
+ return uint64(b), err
+ }
+ start := int(8 - size)
+ for i := 0; i < start; i++ {
+ s.uintbuf[i] = 0
+ }
+ err := s.readFull(s.uintbuf[start:])
+ return binary.BigEndian.Uint64(s.uintbuf), err
+}
+
+func (s *Stream) readFull(buf []byte) (err error) {
+ s.willRead(uint64(len(buf)))
+ var nn, n int
+ for n < len(buf) && err == nil {
+ nn, err = s.r.Read(buf[n:])
+ n += nn
+ }
+ if err == io.EOF {
+ err = io.ErrUnexpectedEOF
+ }
+ return err
+}
+
+func (s *Stream) readByte() (byte, error) {
+ s.willRead(1)
+ b, err := s.r.ReadByte()
+ if len(s.stack) > 0 && err == io.EOF {
+ err = io.ErrUnexpectedEOF
+ }
+ return b, err
+}
+
+func (s *Stream) willRead(n uint64) {
+ s.kind = -1 // rearm Kind
+ if len(s.stack) > 0 {
+ s.stack[len(s.stack)-1].pos += n
+ }
+}
diff --git a/rlp/decode_test.go b/rlp/decode_test.go
new file mode 100644
index 000000000..7a1743937
--- /dev/null
+++ b/rlp/decode_test.go
@@ -0,0 +1,527 @@
+package rlp
+
+import (
+ "bytes"
+ "encoding/hex"
+ "fmt"
+ "io"
+ "math/big"
+ "reflect"
+ "testing"
+
+ "github.com/ethereum/go-ethereum/ethutil"
+)
+
+func TestStreamKind(t *testing.T) {
+ tests := []struct {
+ input string
+ wantKind Kind
+ wantLen uint64
+ }{
+ {"00", Byte, 0},
+ {"01", Byte, 0},
+ {"7F", Byte, 0},
+ {"80", String, 0},
+ {"B7", String, 55},
+ {"B800", String, 0},
+ {"B90400", String, 1024},
+ {"BA000400", String, 1024},
+ {"BB00000400", String, 1024},
+ {"BFFFFFFFFFFFFFFFFF", String, ^uint64(0)},
+ {"C0", List, 0},
+ {"C8", List, 8},
+ {"F7", List, 55},
+ {"F800", List, 0},
+ {"F804", List, 4},
+ {"F90400", List, 1024},
+ {"FFFFFFFFFFFFFFFFFF", List, ^uint64(0)},
+ }
+
+ for i, test := range tests {
+ s := NewStream(bytes.NewReader(unhex(test.input)))
+ kind, len, err := s.Kind()
+ if err != nil {
+ t.Errorf("test %d: Type returned error: %v", i, err)
+ continue
+ }
+ if kind != test.wantKind {
+ t.Errorf("test %d: kind mismatch: got %d, want %d", i, kind, test.wantKind)
+ }
+ if len != test.wantLen {
+ t.Errorf("test %d: len mismatch: got %d, want %d", i, len, test.wantLen)
+ }
+ }
+}
+
+func TestNewListStream(t *testing.T) {
+ ls := NewListStream(bytes.NewReader(unhex("0101010101")), 3)
+ if k, size, err := ls.Kind(); k != List || size != 3 || err != nil {
+ t.Errorf("Kind() returned (%v, %d, %v), expected (List, 3, nil)", k, size, err)
+ }
+ if size, err := ls.List(); size != 3 || err != nil {
+ t.Errorf("List() returned (%d, %v), expected (3, nil)", size, err)
+ }
+ for i := 0; i < 3; i++ {
+ if val, err := ls.Uint(); val != 1 || err != nil {
+ t.Errorf("Uint() returned (%d, %v), expected (1, nil)", val, err)
+ }
+ }
+ if err := ls.ListEnd(); err != nil {
+ t.Errorf("ListEnd() returned %v, expected (3, nil)", err)
+ }
+}
+
+func TestStreamErrors(t *testing.T) {
+ type calls []string
+ tests := []struct {
+ string
+ calls
+ error
+ }{
+ {"", calls{"Kind"}, io.EOF},
+ {"", calls{"List"}, io.EOF},
+ {"", calls{"Uint"}, io.EOF},
+ {"C0", calls{"Bytes"}, ErrExpectedString},
+ {"C0", calls{"Uint"}, ErrExpectedString},
+ {"81", calls{"Bytes"}, io.ErrUnexpectedEOF},
+ {"81", calls{"Uint"}, io.ErrUnexpectedEOF},
+ {"BFFFFFFFFFFFFFFF", calls{"Bytes"}, io.ErrUnexpectedEOF},
+ {"89000000000000000001", calls{"Uint"}, errUintOverflow},
+ {"00", calls{"List"}, ErrExpectedList},
+ {"80", calls{"List"}, ErrExpectedList},
+ {"C0", calls{"List", "Uint"}, EOL},
+ {"C801", calls{"List", "Uint", "Uint"}, io.ErrUnexpectedEOF},
+ {"C8C9", calls{"List", "Kind"}, ErrElemTooLarge},
+ {"C3C2010201", calls{"List", "List", "Uint", "Uint", "ListEnd", "Uint"}, EOL},
+ {"00", calls{"ListEnd"}, errNotInList},
+ {"C40102", calls{"List", "Uint", "ListEnd"}, errNotAtEOL},
+ }
+
+testfor:
+ for i, test := range tests {
+ s := NewStream(bytes.NewReader(unhex(test.string)))
+ rs := reflect.ValueOf(s)
+ for j, call := range test.calls {
+ fval := rs.MethodByName(call)
+ ret := fval.Call(nil)
+ err := "<nil>"
+ if lastret := ret[len(ret)-1].Interface(); lastret != nil {
+ err = lastret.(error).Error()
+ }
+ if j == len(test.calls)-1 {
+ if err != test.error.Error() {
+ t.Errorf("test %d: last call (%s) error mismatch\ngot: %s\nwant: %v",
+ i, call, err, test.error)
+ }
+ } else if err != "<nil>" {
+ t.Errorf("test %d: call %d (%s) unexpected error: %q", i, j, call, err)
+ continue testfor
+ }
+ }
+ }
+}
+
+func TestStreamList(t *testing.T) {
+ s := NewStream(bytes.NewReader(unhex("C80102030405060708")))
+
+ len, err := s.List()
+ if err != nil {
+ t.Fatalf("List error: %v", err)
+ }
+ if len != 8 {
+ t.Fatalf("List returned invalid length, got %d, want 8", len)
+ }
+
+ for i := uint64(1); i <= 8; i++ {
+ v, err := s.Uint()
+ if err != nil {
+ t.Fatalf("Uint error: %v", err)
+ }
+ if i != v {
+ t.Errorf("Uint returned wrong value, got %d, want %d", v, i)
+ }
+ }
+
+ if _, err := s.Uint(); err != EOL {
+ t.Errorf("Uint error mismatch, got %v, want %v", err, EOL)
+ }
+ if err = s.ListEnd(); err != nil {
+ t.Fatalf("ListEnd error: %v", err)
+ }
+}
+
+func TestDecodeErrors(t *testing.T) {
+ r := bytes.NewReader(nil)
+
+ if err := Decode(r, nil); err != errDecodeIntoNil {
+ t.Errorf("Decode(r, nil) error mismatch, got %q, want %q", err, errDecodeIntoNil)
+ }
+
+ var nilptr *struct{}
+ if err := Decode(r, nilptr); err != errDecodeIntoNil {
+ t.Errorf("Decode(r, nilptr) error mismatch, got %q, want %q", err, errDecodeIntoNil)
+ }
+
+ if err := Decode(r, struct{}{}); err != errNoPointer {
+ t.Errorf("Decode(r, struct{}{}) error mismatch, got %q, want %q", err, errNoPointer)
+ }
+
+ expectErr := "rlp: type chan bool is not RLP-serializable"
+ if err := Decode(r, new(chan bool)); err == nil || err.Error() != expectErr {
+ t.Errorf("Decode(r, new(chan bool)) error mismatch, got %q, want %q", err, expectErr)
+ }
+
+ if err := Decode(r, new(uint)); err != io.EOF {
+ t.Errorf("Decode(r, new(int)) error mismatch, got %q, want %q", err, io.EOF)
+ }
+}
+
+type decodeTest struct {
+ input string
+ ptr interface{}
+ value interface{}
+ error string
+}
+
+type simplestruct struct {
+ A uint
+ B string
+}
+
+type recstruct struct {
+ I uint
+ Child *recstruct
+}
+
+var (
+ veryBigInt = big.NewInt(0).Add(
+ big.NewInt(0).Lsh(big.NewInt(0xFFFFFFFFFFFFFF), 16),
+ big.NewInt(0xFFFF),
+ )
+)
+
+var (
+ sharedByteArray [5]byte
+ sharedPtr = new(*uint)
+)
+
+var decodeTests = []decodeTest{
+ // integers
+ {input: "05", ptr: new(uint32), value: uint32(5)},
+ {input: "80", ptr: new(uint32), value: uint32(0)},
+ {input: "8105", ptr: new(uint32), value: uint32(5)},
+ {input: "820505", ptr: new(uint32), value: uint32(0x0505)},
+ {input: "83050505", ptr: new(uint32), value: uint32(0x050505)},
+ {input: "8405050505", ptr: new(uint32), value: uint32(0x05050505)},
+ {input: "850505050505", ptr: new(uint32), error: "rlp: input string too long for uint32"},
+ {input: "C0", ptr: new(uint32), error: "rlp: expected input string or byte for uint32"},
+
+ // slices
+ {input: "C0", ptr: new([]uint), value: []uint{}},
+ {input: "C80102030405060708", ptr: new([]uint), value: []uint{1, 2, 3, 4, 5, 6, 7, 8}},
+
+ // arrays
+ {input: "C0", ptr: new([5]uint), value: [5]uint{}},
+ {input: "C50102030405", ptr: new([5]uint), value: [5]uint{1, 2, 3, 4, 5}},
+ {input: "C6010203040506", ptr: new([5]uint), error: "rlp: input list has too many elements for [5]uint"},
+
+ // byte slices
+ {input: "01", ptr: new([]byte), value: []byte{1}},
+ {input: "80", ptr: new([]byte), value: []byte{}},
+ {input: "8D6162636465666768696A6B6C6D", ptr: new([]byte), value: []byte("abcdefghijklm")},
+ {input: "C0", ptr: new([]byte), value: []byte{}},
+ {input: "C3010203", ptr: new([]byte), value: []byte{1, 2, 3}},
+ {input: "C3820102", ptr: new([]byte), error: "rlp: input string too long for uint8"},
+
+ // byte arrays
+ {input: "01", ptr: new([5]byte), value: [5]byte{1}},
+ {input: "80", ptr: new([5]byte), value: [5]byte{}},
+ {input: "850102030405", ptr: new([5]byte), value: [5]byte{1, 2, 3, 4, 5}},
+ {input: "C0", ptr: new([5]byte), value: [5]byte{}},
+ {input: "C3010203", ptr: new([5]byte), value: [5]byte{1, 2, 3, 0, 0}},
+ {input: "C3820102", ptr: new([5]byte), error: "rlp: input string too long for uint8"},
+ {input: "86010203040506", ptr: new([5]byte), error: "rlp: input string too long for [5]uint8"},
+ {input: "850101", ptr: new([5]byte), error: io.ErrUnexpectedEOF.Error()},
+
+ // byte array reuse (should be zeroed)
+ {input: "850102030405", ptr: &sharedByteArray, value: [5]byte{1, 2, 3, 4, 5}},
+ {input: "8101", ptr: &sharedByteArray, value: [5]byte{1}}, // kind: String
+ {input: "850102030405", ptr: &sharedByteArray, value: [5]byte{1, 2, 3, 4, 5}},
+ {input: "01", ptr: &sharedByteArray, value: [5]byte{1}}, // kind: Byte
+ {input: "C3010203", ptr: &sharedByteArray, value: [5]byte{1, 2, 3, 0, 0}},
+ {input: "C101", ptr: &sharedByteArray, value: [5]byte{1}}, // kind: List
+
+ // zero sized byte arrays
+ {input: "80", ptr: new([0]byte), value: [0]byte{}},
+ {input: "C0", ptr: new([0]byte), value: [0]byte{}},
+ {input: "01", ptr: new([0]byte), error: "rlp: input string too long for [0]uint8"},
+ {input: "8101", ptr: new([0]byte), error: "rlp: input string too long for [0]uint8"},
+
+ // strings
+ {input: "00", ptr: new(string), value: "\000"},
+ {input: "8D6162636465666768696A6B6C6D", ptr: new(string), value: "abcdefghijklm"},
+ {input: "C0", ptr: new(string), error: "rlp: expected input string or byte for string"},
+
+ // big ints
+ {input: "01", ptr: new(*big.Int), value: big.NewInt(1)},
+ {input: "89FFFFFFFFFFFFFFFFFF", ptr: new(*big.Int), value: veryBigInt},
+ {input: "10", ptr: new(big.Int), value: *big.NewInt(16)}, // non-pointer also works
+ {input: "C0", ptr: new(*big.Int), error: "rlp: expected input string or byte for *big.Int"},
+
+ // structs
+ {input: "C0", ptr: new(simplestruct), value: simplestruct{0, ""}},
+ {input: "C105", ptr: new(simplestruct), value: simplestruct{5, ""}},
+ {input: "C50583343434", ptr: new(simplestruct), value: simplestruct{5, "444"}},
+ {input: "C3010101", ptr: new(simplestruct), error: "rlp: input list has too many elements for rlp.simplestruct"},
+ {
+ input: "C501C302C103",
+ ptr: new(recstruct),
+ value: recstruct{1, &recstruct{2, &recstruct{3, nil}}},
+ },
+
+ // pointers
+ {input: "00", ptr: new(*uint), value: (*uint)(nil)},
+ {input: "80", ptr: new(*uint), value: (*uint)(nil)},
+ {input: "C0", ptr: new(*uint), value: (*uint)(nil)},
+ {input: "07", ptr: new(*uint), value: uintp(7)},
+ {input: "8108", ptr: new(*uint), value: uintp(8)},
+ {input: "C109", ptr: new(*[]uint), value: &[]uint{9}},
+ {input: "C58403030303", ptr: new(*[][]byte), value: &[][]byte{{3, 3, 3, 3}}},
+
+ // pointer should be reset to nil
+ {input: "05", ptr: sharedPtr, value: uintp(5)},
+ {input: "80", ptr: sharedPtr, value: (*uint)(nil)},
+
+ // interface{}
+ {input: "00", ptr: new(interface{}), value: []byte{0}},
+ {input: "01", ptr: new(interface{}), value: []byte{1}},
+ {input: "80", ptr: new(interface{}), value: []byte{}},
+ {input: "850505050505", ptr: new(interface{}), value: []byte{5, 5, 5, 5, 5}},
+ {input: "C0", ptr: new(interface{}), value: []interface{}{}},
+ {input: "C50183040404", ptr: new(interface{}), value: []interface{}{[]byte{1}, []byte{4, 4, 4}}},
+}
+
+func uintp(i uint) *uint { return &i }
+
+func runTests(t *testing.T, decode func([]byte, interface{}) error) {
+ for i, test := range decodeTests {
+ input, err := hex.DecodeString(test.input)
+ if err != nil {
+ t.Errorf("test %d: invalid hex input %q", i, test.input)
+ continue
+ }
+ err = decode(input, test.ptr)
+ if err != nil && test.error == "" {
+ t.Errorf("test %d: unexpected Decode error: %v\ndecoding into %T\ninput %q",
+ i, err, test.ptr, test.input)
+ continue
+ }
+ if test.error != "" && fmt.Sprint(err) != test.error {
+ t.Errorf("test %d: Decode error mismatch\ngot %v\nwant %v\ndecoding into %T\ninput %q",
+ i, err, test.error, test.ptr, test.input)
+ continue
+ }
+ deref := reflect.ValueOf(test.ptr).Elem().Interface()
+ if err == nil && !reflect.DeepEqual(deref, test.value) {
+ t.Errorf("test %d: value mismatch\ngot %#v\nwant %#v\ndecoding into %T\ninput %q",
+ i, deref, test.value, test.ptr, test.input)
+ }
+ }
+}
+
+func TestDecodeWithByteReader(t *testing.T) {
+ runTests(t, func(input []byte, into interface{}) error {
+ return Decode(bytes.NewReader(input), into)
+ })
+}
+
+// dumbReader reads from a byte slice but does not
+// implement ReadByte.
+type dumbReader []byte
+
+func (r *dumbReader) Read(buf []byte) (n int, err error) {
+ if len(*r) == 0 {
+ return 0, io.EOF
+ }
+ n = copy(buf, *r)
+ *r = (*r)[n:]
+ return n, nil
+}
+
+func TestDecodeWithNonByteReader(t *testing.T) {
+ runTests(t, func(input []byte, into interface{}) error {
+ r := dumbReader(input)
+ return Decode(&r, into)
+ })
+}
+
+func TestDecodeStreamReset(t *testing.T) {
+ s := NewStream(nil)
+ runTests(t, func(input []byte, into interface{}) error {
+ s.Reset(bytes.NewReader(input))
+ return s.Decode(into)
+ })
+}
+
+type testDecoder struct{ called bool }
+
+func (t *testDecoder) DecodeRLP(s *Stream) error {
+ if _, err := s.Uint(); err != nil {
+ return err
+ }
+ t.called = true
+ return nil
+}
+
+func TestDecodeDecoder(t *testing.T) {
+ var s struct {
+ T1 testDecoder
+ T2 *testDecoder
+ T3 **testDecoder
+ }
+ if err := Decode(bytes.NewReader(unhex("C3010203")), &s); err != nil {
+ t.Fatalf("Decode error: %v", err)
+ }
+
+ if !s.T1.called {
+ t.Errorf("DecodeRLP was not called for (non-pointer) testDecoder")
+ }
+
+ if s.T2 == nil {
+ t.Errorf("*testDecoder has not been allocated")
+ } else if !s.T2.called {
+ t.Errorf("DecodeRLP was not called for *testDecoder")
+ }
+
+ if s.T3 == nil || *s.T3 == nil {
+ t.Errorf("**testDecoder has not been allocated")
+ } else if !(*s.T3).called {
+ t.Errorf("DecodeRLP was not called for **testDecoder")
+ }
+}
+
+type byteDecoder byte
+
+func (bd *byteDecoder) DecodeRLP(s *Stream) error {
+ _, err := s.Uint()
+ *bd = 255
+ return err
+}
+
+func (bd byteDecoder) called() bool {
+ return bd == 255
+}
+
+// This test verifies that the byte slice/byte array logic
+// does not kick in for element types implementing Decoder.
+func TestDecoderInByteSlice(t *testing.T) {
+ var slice []byteDecoder
+ if err := Decode(bytes.NewReader(unhex("C101")), &slice); err != nil {
+ t.Errorf("unexpected Decode error %v", err)
+ } else if !slice[0].called() {
+ t.Errorf("DecodeRLP not called for slice element")
+ }
+
+ var array [1]byteDecoder
+ if err := Decode(bytes.NewReader(unhex("C101")), &array); err != nil {
+ t.Errorf("unexpected Decode error %v", err)
+ } else if !array[0].called() {
+ t.Errorf("DecodeRLP not called for array element")
+ }
+}
+
+func ExampleDecode() {
+ input, _ := hex.DecodeString("C90A1486666F6F626172")
+
+ type example struct {
+ A, B uint
+ private uint // private fields are ignored
+ String string
+ }
+
+ var s example
+ err := Decode(bytes.NewReader(input), &s)
+ if err != nil {
+ fmt.Printf("Error: %v\n", err)
+ } else {
+ fmt.Printf("Decoded value: %#v\n", s)
+ }
+ // Output:
+ // Decoded value: rlp.example{A:0xa, B:0x14, private:0x0, String:"foobar"}
+}
+
+func ExampleStream() {
+ input, _ := hex.DecodeString("C90A1486666F6F626172")
+ s := NewStream(bytes.NewReader(input))
+
+ // Check what kind of value lies ahead
+ kind, size, _ := s.Kind()
+ fmt.Printf("Kind: %v size:%d\n", kind, size)
+
+ // Enter the list
+ if _, err := s.List(); err != nil {
+ fmt.Printf("List error: %v\n", err)
+ return
+ }
+
+ // Decode elements
+ fmt.Println(s.Uint())
+ fmt.Println(s.Uint())
+ fmt.Println(s.Bytes())
+
+ // Acknowledge end of list
+ if err := s.ListEnd(); err != nil {
+ fmt.Printf("ListEnd error: %v\n", err)
+ }
+ // Output:
+ // Kind: List size:9
+ // 10 <nil>
+ // 20 <nil>
+ // [102 111 111 98 97 114] <nil>
+}
+
+func BenchmarkDecode(b *testing.B) {
+ enc := encTest(90000)
+ b.SetBytes(int64(len(enc)))
+ b.ReportAllocs()
+ b.ResetTimer()
+
+ for i := 0; i < b.N; i++ {
+ var s []int
+ r := bytes.NewReader(enc)
+ if err := Decode(r, &s); err != nil {
+ b.Fatalf("Decode error: %v", err)
+ }
+ }
+}
+
+func BenchmarkDecodeIntSliceReuse(b *testing.B) {
+ enc := encTest(100000)
+ b.SetBytes(int64(len(enc)))
+ b.ReportAllocs()
+ b.ResetTimer()
+
+ var s []int
+ for i := 0; i < b.N; i++ {
+ r := bytes.NewReader(enc)
+ if err := Decode(r, &s); err != nil {
+ b.Fatalf("Decode error: %v", err)
+ }
+ }
+}
+
+func encTest(n int) []byte {
+ s := make([]interface{}, n)
+ for i := 0; i < n; i++ {
+ s[i] = i
+ }
+ return ethutil.Encode(s)
+}
+
+func unhex(str string) []byte {
+ b, err := hex.DecodeString(str)
+ if err != nil {
+ panic(fmt.Sprintf("invalid hex string: %q", str))
+ }
+ return b
+}
diff --git a/rlp/doc.go b/rlp/doc.go
new file mode 100644
index 000000000..aab98ea43
--- /dev/null
+++ b/rlp/doc.go
@@ -0,0 +1,17 @@
+/*
+Package rlp implements the RLP serialization format.
+
+The purpose of RLP (Recursive Linear Prefix) qis to encode arbitrarily
+nested arrays of binary data, and RLP is the main encoding method used
+to serialize objects in Ethereum. The only purpose of RLP is to encode
+structure; encoding specific atomic data types (eg. strings, ints,
+floats) is left up to higher-order protocols; in Ethereum integers
+must be represented in big endian binary form with no leading zeroes
+(thus making the integer value zero be equivalent to the empty byte
+array).
+
+RLP values are distinguished by a type tag. The type tag precedes the
+value in the input stream and defines the size and kind of the bytes
+that follow.
+*/
+package rlp
diff --git a/rlp/typecache.go b/rlp/typecache.go
new file mode 100644
index 000000000..52e68a3c5
--- /dev/null
+++ b/rlp/typecache.go
@@ -0,0 +1,62 @@
+package rlp
+
+import (
+ "reflect"
+ "sync"
+)
+
+type decoder func(*Stream, reflect.Value) error
+
+type typeinfo struct {
+ decoder
+}
+
+var (
+ typeCacheMutex sync.RWMutex
+ typeCache = make(map[reflect.Type]*typeinfo)
+)
+
+func cachedTypeInfo(typ reflect.Type) (*typeinfo, error) {
+ typeCacheMutex.RLock()
+ info := typeCache[typ]
+ typeCacheMutex.RUnlock()
+ if info != nil {
+ return info, nil
+ }
+ // not in the cache, need to generate info for this type.
+ typeCacheMutex.Lock()
+ defer typeCacheMutex.Unlock()
+ return cachedTypeInfo1(typ)
+}
+
+func cachedTypeInfo1(typ reflect.Type) (*typeinfo, error) {
+ info := typeCache[typ]
+ if info != nil {
+ // another goroutine got the write lock first
+ return info, nil
+ }
+ // put a dummmy value into the cache before generating.
+ // if the generator tries to lookup itself, it will get
+ // the dummy value and won't call itself recursively.
+ typeCache[typ] = new(typeinfo)
+ info, err := genTypeInfo(typ)
+ if err != nil {
+ // remove the dummy value if the generator fails
+ delete(typeCache, typ)
+ return nil, err
+ }
+ *typeCache[typ] = *info
+ return typeCache[typ], err
+}
+
+func genTypeInfo(typ reflect.Type) (info *typeinfo, err error) {
+ info = new(typeinfo)
+ if info.decoder, err = makeDecoder(typ); err != nil {
+ return nil, err
+ }
+ return info, nil
+}
+
+func isUint(k reflect.Kind) bool {
+ return k >= reflect.Uint && k <= reflect.Uintptr
+}
diff --git a/rpc/json.go b/rpc/json.go
new file mode 100644
index 000000000..e467f9a34
--- /dev/null
+++ b/rpc/json.go
@@ -0,0 +1,20 @@
+package rpc
+
+import (
+ "encoding/json"
+ "io"
+)
+
+type jsonWrapper struct{}
+
+func (self jsonWrapper) Send(writer io.Writer, v interface{}) (n int, err error) {
+ var payload []byte
+ payload, err = json.Marshal(v)
+ if err != nil {
+ return 0, err
+ }
+
+ return writer.Write(payload)
+}
+
+var JSON jsonWrapper
diff --git a/rpc/message.go b/rpc/message.go
new file mode 100644
index 000000000..c8103eded
--- /dev/null
+++ b/rpc/message.go
@@ -0,0 +1,14 @@
+package rpc
+
+import "github.com/ethereum/go-ethereum/ethutil"
+
+type Message struct {
+ Call string `json:"call"`
+ Args []interface{} `json:"args"`
+ Id int `json:"_id"`
+ Data interface{} `json:"data"`
+}
+
+func (self *Message) Arguments() *ethutil.Value {
+ return ethutil.NewValue(self.Args)
+}
diff --git a/rpc/packages.go b/rpc/packages.go
new file mode 100644
index 000000000..5535e6e79
--- /dev/null
+++ b/rpc/packages.go
@@ -0,0 +1,311 @@
+package rpc
+
+import (
+ "encoding/json"
+ "errors"
+ "math/big"
+ "strings"
+
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/xeth"
+)
+
+type EthereumApi struct {
+ pipe *xeth.JSXEth
+}
+
+type JsonArgs interface {
+ requirements() error
+}
+
+type BlockResponse struct {
+ JsonResponse
+}
+type GetBlockArgs struct {
+ BlockNumber int
+ Hash string
+}
+
+type ErrorResponse struct {
+ Error bool `json:"error"`
+ ErrorText string `json:"errorText"`
+}
+
+type JsonResponse interface {
+}
+
+type SuccessRes struct {
+ Error bool `json:"error"`
+ Result JsonResponse `json:"result"`
+}
+
+func NewSuccessRes(object JsonResponse) string {
+ e := SuccessRes{Error: false, Result: object}
+ res, err := json.Marshal(e)
+ if err != nil {
+ // This should never happen
+ panic("Creating json error response failed, help")
+ }
+ success := string(res)
+ return success
+}
+
+func NewErrorResponse(msg string) error {
+ e := ErrorResponse{Error: true, ErrorText: msg}
+ res, err := json.Marshal(e)
+ if err != nil {
+ // This should never happen
+ panic("Creating json error response failed, help")
+ }
+ newErr := errors.New(string(res))
+ return newErr
+}
+
+func (b *GetBlockArgs) requirements() error {
+ if b.BlockNumber == 0 && b.Hash == "" {
+ return NewErrorResponse("GetBlock requires either a block 'number' or a block 'hash' as argument")
+ }
+ return nil
+}
+
+func (p *EthereumApi) GetBlock(args *GetBlockArgs, reply *string) error {
+ err := args.requirements()
+ if err != nil {
+ return err
+ }
+
+ block := p.pipe.BlockByHash(args.Hash)
+ *reply = NewSuccessRes(block)
+ return nil
+}
+
+type NewTxArgs struct {
+ Sec string
+ Recipient string
+ Value string
+ Gas string
+ GasPrice string
+ Init string
+ Body string
+}
+type TxResponse struct {
+ Hash string
+}
+
+func (a *NewTxArgs) requirements() error {
+ if a.Recipient == "" {
+ return NewErrorResponse("Transact requires a 'recipient' address as argument")
+ }
+ if a.Value == "" {
+ return NewErrorResponse("Transact requires a 'value' as argument")
+ }
+ if a.Gas == "" {
+ return NewErrorResponse("Transact requires a 'gas' value as argument")
+ }
+ if a.GasPrice == "" {
+ return NewErrorResponse("Transact requires a 'gasprice' value as argument")
+ }
+ return nil
+}
+
+func (a *NewTxArgs) requirementsContract() error {
+ if a.Value == "" {
+ return NewErrorResponse("Create requires a 'value' as argument")
+ }
+ if a.Gas == "" {
+ return NewErrorResponse("Create requires a 'gas' value as argument")
+ }
+ if a.GasPrice == "" {
+ return NewErrorResponse("Create requires a 'gasprice' value as argument")
+ }
+ if a.Body == "" {
+ return NewErrorResponse("Create requires a 'body' value as argument")
+ }
+ return nil
+}
+
+func (p *EthereumApi) Transact(args *NewTxArgs, reply *string) error {
+ err := args.requirements()
+ if err != nil {
+ return err
+ }
+ result, _ := p.pipe.Transact(p.pipe.Key().PrivateKey, args.Recipient, args.Value, args.Gas, args.GasPrice, args.Body)
+ *reply = NewSuccessRes(result)
+ return nil
+}
+
+func (p *EthereumApi) Create(args *NewTxArgs, reply *string) error {
+ err := args.requirementsContract()
+ if err != nil {
+ return err
+ }
+
+ result, _ := p.pipe.Transact(p.pipe.Key().PrivateKey, "", args.Value, args.Gas, args.GasPrice, args.Body)
+ *reply = NewSuccessRes(result)
+ return nil
+}
+
+type PushTxArgs struct {
+ Tx string
+}
+
+func (a *PushTxArgs) requirementsPushTx() error {
+ if a.Tx == "" {
+ return NewErrorResponse("PushTx requires a 'tx' as argument")
+ }
+ return nil
+}
+
+func (p *EthereumApi) PushTx(args *PushTxArgs, reply *string) error {
+ err := args.requirementsPushTx()
+ if err != nil {
+ return err
+ }
+ result, _ := p.pipe.PushTx(args.Tx)
+ *reply = NewSuccessRes(result)
+ return nil
+}
+
+func (p *EthereumApi) GetKey(args interface{}, reply *string) error {
+ *reply = NewSuccessRes(p.pipe.Key())
+ return nil
+}
+
+type GetStorageArgs struct {
+ Address string
+ Key string
+}
+
+func (a *GetStorageArgs) requirements() error {
+ if a.Address == "" {
+ return NewErrorResponse("GetStorageAt requires an 'address' value as argument")
+ }
+ if a.Key == "" {
+ return NewErrorResponse("GetStorageAt requires an 'key' value as argument")
+ }
+ return nil
+}
+
+type GetStorageAtRes struct {
+ Key string `json:"key"`
+ Value string `json:"value"`
+ Address string `json:"address"`
+}
+
+func (p *EthereumApi) GetStorageAt(args *GetStorageArgs, reply *string) error {
+ err := args.requirements()
+ if err != nil {
+ return err
+ }
+
+ state := p.pipe.World().SafeGet(ethutil.Hex2Bytes(args.Address))
+
+ var hx string
+ if strings.Index(args.Key, "0x") == 0 {
+ hx = string([]byte(args.Key)[2:])
+ } else {
+ // Convert the incoming string (which is a bigint) into hex
+ i, _ := new(big.Int).SetString(args.Key, 10)
+ hx = ethutil.Bytes2Hex(i.Bytes())
+ }
+ jsonlogger.Debugf("GetStorageAt(%s, %s)\n", args.Address, hx)
+ value := state.Storage(ethutil.Hex2Bytes(hx))
+ *reply = NewSuccessRes(GetStorageAtRes{Address: args.Address, Key: args.Key, Value: value.Str()})
+ return nil
+}
+
+type GetTxCountArgs struct {
+ Address string `json:"address"`
+}
+type GetTxCountRes struct {
+ Nonce int `json:"nonce"`
+}
+
+func (a *GetTxCountArgs) requirements() error {
+ if a.Address == "" {
+ return NewErrorResponse("GetTxCountAt requires an 'address' value as argument")
+ }
+ return nil
+}
+
+type GetPeerCountRes struct {
+ PeerCount int `json:"peerCount"`
+}
+
+func (p *EthereumApi) GetPeerCount(args *interface{}, reply *string) error {
+ *reply = NewSuccessRes(GetPeerCountRes{PeerCount: p.pipe.PeerCount()})
+ return nil
+}
+
+type GetListeningRes struct {
+ IsListening bool `json:"isListening"`
+}
+
+func (p *EthereumApi) GetIsListening(args *interface{}, reply *string) error {
+ *reply = NewSuccessRes(GetListeningRes{IsListening: p.pipe.IsListening()})
+ return nil
+}
+
+type GetCoinbaseRes struct {
+ Coinbase string `json:"coinbase"`
+}
+
+func (p *EthereumApi) GetCoinbase(args *interface{}, reply *string) error {
+ *reply = NewSuccessRes(GetCoinbaseRes{Coinbase: p.pipe.CoinBase()})
+ return nil
+}
+
+type GetMiningRes struct {
+ IsMining bool `json:"isMining"`
+}
+
+func (p *EthereumApi) GetIsMining(args *interface{}, reply *string) error {
+ *reply = NewSuccessRes(GetMiningRes{IsMining: p.pipe.IsMining()})
+ return nil
+}
+
+func (p *EthereumApi) GetTxCountAt(args *GetTxCountArgs, reply *string) error {
+ err := args.requirements()
+ if err != nil {
+ return err
+ }
+ state := p.pipe.TxCountAt(args.Address)
+ *reply = NewSuccessRes(GetTxCountRes{Nonce: state})
+ return nil
+}
+
+type GetBalanceArgs struct {
+ Address string
+}
+
+func (a *GetBalanceArgs) requirements() error {
+ if a.Address == "" {
+ return NewErrorResponse("GetBalanceAt requires an 'address' value as argument")
+ }
+ return nil
+}
+
+type BalanceRes struct {
+ Balance string `json:"balance"`
+ Address string `json:"address"`
+}
+
+func (p *EthereumApi) GetBalanceAt(args *GetBalanceArgs, reply *string) error {
+ err := args.requirements()
+ if err != nil {
+ return err
+ }
+ state := p.pipe.World().SafeGet(ethutil.Hex2Bytes(args.Address))
+ *reply = NewSuccessRes(BalanceRes{Balance: state.Balance().String(), Address: args.Address})
+ return nil
+}
+
+type TestRes struct {
+ JsonResponse `json:"-"`
+ Answer int `json:"answer"`
+}
+
+func (p *EthereumApi) Test(args *GetBlockArgs, reply *string) error {
+ *reply = NewSuccessRes(TestRes{Answer: 15})
+ return nil
+}
diff --git a/rpc/server.go b/rpc/server.go
new file mode 100644
index 000000000..983dc6c33
--- /dev/null
+++ b/rpc/server.go
@@ -0,0 +1,67 @@
+package rpc
+
+import (
+ "fmt"
+ "net"
+ "net/rpc"
+ "net/rpc/jsonrpc"
+
+ "github.com/ethereum/go-ethereum/logger"
+ "github.com/ethereum/go-ethereum/xeth"
+)
+
+var jsonlogger = logger.NewLogger("JSON")
+
+type JsonRpcServer struct {
+ quit chan bool
+ listener net.Listener
+ pipe *xeth.JSXEth
+}
+
+func (s *JsonRpcServer) exitHandler() {
+out:
+ for {
+ select {
+ case <-s.quit:
+ s.listener.Close()
+ break out
+ }
+ }
+
+ jsonlogger.Infoln("Shutdown JSON-RPC server")
+}
+
+func (s *JsonRpcServer) Stop() {
+ close(s.quit)
+}
+
+func (s *JsonRpcServer) Start() {
+ jsonlogger.Infoln("Starting JSON-RPC server")
+ go s.exitHandler()
+ rpc.Register(&EthereumApi{pipe: s.pipe})
+ rpc.HandleHTTP()
+
+ for {
+ conn, err := s.listener.Accept()
+ if err != nil {
+ jsonlogger.Infoln("Error starting JSON-RPC:", err)
+ break
+ }
+ jsonlogger.Debugln("Incoming request.")
+ go jsonrpc.ServeConn(conn)
+ }
+}
+
+func NewJsonRpcServer(pipe *xeth.JSXEth, port int) (*JsonRpcServer, error) {
+ sport := fmt.Sprintf(":%d", port)
+ l, err := net.Listen("tcp", sport)
+ if err != nil {
+ return nil, err
+ }
+
+ return &JsonRpcServer{
+ listener: l,
+ quit: make(chan bool),
+ pipe: pipe,
+ }, nil
+}
diff --git a/rpc/writer.go b/rpc/writer.go
new file mode 100644
index 000000000..4cc39f577
--- /dev/null
+++ b/rpc/writer.go
@@ -0,0 +1,75 @@
+package rpc
+
+/*
+func pack(id int, v ...interface{}) Message {
+ return Message{Data: v, Id: id}
+}
+
+func WriteOn(msg *Message, writer io.Writer) {
+ //msg := &Message{Seed: seed, Data: data}
+
+ switch msg.Call {
+ case "compile":
+ data := ethutil.NewValue(msg.Args)
+ bcode, err := ethutil.Compile(data.Get(0).Str(), false)
+ if err != nil {
+ JSON.Send(writer, pack(msg.Id, err.Error()))
+ }
+
+ code := ethutil.Bytes2Hex(bcode)
+
+ JSON.Send(writer, pack(msg.Id, code, nil))
+ case "block":
+ args := msg.Arguments()
+
+ block := pipe.BlockByNumber(int32(args.Get(0).Uint()))
+
+ JSON.Send(writer, pack(msg.Id, block))
+ case "transact":
+ if mp, ok := msg.Args[0].(map[string]interface{}); ok {
+ object := mapToTxParams(mp)
+ JSON.Send(
+ writer,
+ pack(msg.Id, args(pipe.Transact(object["from"], object["to"], object["value"], object["gas"], object["gasPrice"], object["data"]))),
+ )
+
+ }
+ case "coinbase":
+ JSON.Send(writer, pack(msg.Id, pipe.CoinBase(), msg.Seed))
+
+ case "listening":
+ JSON.Send(writer, pack(msg.Id, pipe.IsListening()))
+
+ case "mining":
+ JSON.Send(writer, pack(msg.Id, pipe.IsMining()))
+
+ case "peerCoint":
+ JSON.Send(writer, pack(msg.Id, pipe.PeerCount()))
+
+ case "countAt":
+ args := msg.Arguments()
+
+ JSON.Send(writer, pack(msg.Id, pipe.TxCountAt(args.Get(0).Str())))
+
+ case "codeAt":
+ args := msg.Arguments()
+
+ JSON.Send(writer, pack(msg.Id, len(pipe.CodeAt(args.Get(0).Str()))))
+
+ case "stateAt":
+ args := msg.Arguments()
+
+ JSON.Send(writer, pack(msg.Id, pipe.StorageAt(args.Get(0).Str(), args.Get(1).Str())))
+
+ case "balanceAt":
+ args := msg.Arguments()
+
+ JSON.Send(writer, pack(msg.Id, pipe.BalanceAt(args.Get(0).Str())))
+
+ case "newFilter":
+ case "newFilterString":
+ case "messages":
+ // TODO
+ }
+}
+*/
diff --git a/state/dump.go b/state/dump.go
new file mode 100644
index 000000000..c1f5ecf3a
--- /dev/null
+++ b/state/dump.go
@@ -0,0 +1,56 @@
+package state
+
+import (
+ "encoding/json"
+ "fmt"
+
+ "github.com/ethereum/go-ethereum/ethutil"
+)
+
+type Account struct {
+ Balance string `json:"balance"`
+ Nonce uint64 `json:"nonce"`
+ Root string `json:"root"`
+ CodeHash string `json:"codeHash"`
+ Storage map[string]string `json:"storage"`
+}
+
+type World struct {
+ Root string `json:"root"`
+ Accounts map[string]Account `json:"accounts"`
+}
+
+func (self *StateDB) Dump() []byte {
+ world := World{
+ Root: ethutil.Bytes2Hex(self.Trie.GetRoot()),
+ Accounts: make(map[string]Account),
+ }
+
+ self.Trie.NewIterator().Each(func(key string, value *ethutil.Value) {
+ stateObject := NewStateObjectFromBytes([]byte(key), value.Bytes())
+
+ account := Account{Balance: stateObject.balance.String(), Nonce: stateObject.Nonce, Root: ethutil.Bytes2Hex(stateObject.Root()), CodeHash: ethutil.Bytes2Hex(stateObject.codeHash)}
+ account.Storage = make(map[string]string)
+
+ stateObject.EachStorage(func(key string, value *ethutil.Value) {
+ value.Decode()
+ account.Storage[ethutil.Bytes2Hex([]byte(key))] = ethutil.Bytes2Hex(value.Bytes())
+ })
+ world.Accounts[ethutil.Bytes2Hex([]byte(key))] = account
+ })
+
+ json, err := json.MarshalIndent(world, "", " ")
+ if err != nil {
+ fmt.Println("dump err", err)
+ }
+
+ return json
+}
+
+// Debug stuff
+func (self *StateObject) CreateOutputForDiff() {
+ fmt.Printf("%x %x %x %x\n", self.Address(), self.State.Root(), self.balance.Bytes(), self.Nonce)
+ self.EachStorage(func(addr string, value *ethutil.Value) {
+ fmt.Printf("%x %x\n", addr, value.Bytes())
+ })
+}
diff --git a/state/errors.go b/state/errors.go
new file mode 100644
index 000000000..5a847d38b
--- /dev/null
+++ b/state/errors.go
@@ -0,0 +1,23 @@
+package state
+
+import (
+ "fmt"
+ "math/big"
+)
+
+type GasLimitErr struct {
+ Message string
+ Is, Max *big.Int
+}
+
+func IsGasLimitErr(err error) bool {
+ _, ok := err.(*GasLimitErr)
+
+ return ok
+}
+func (err *GasLimitErr) Error() string {
+ return err.Message
+}
+func GasLimitError(is, max *big.Int) *GasLimitErr {
+ return &GasLimitErr{Message: fmt.Sprintf("GasLimit error. Max %s, transaction would take it to %s", max, is), Is: is, Max: max}
+}
diff --git a/state/log.go b/state/log.go
new file mode 100644
index 000000000..46360f4aa
--- /dev/null
+++ b/state/log.go
@@ -0,0 +1,78 @@
+package state
+
+import (
+ "fmt"
+
+ "github.com/ethereum/go-ethereum/ethutil"
+)
+
+type Log interface {
+ ethutil.RlpEncodable
+
+ Address() []byte
+ Topics() [][]byte
+ Data() []byte
+}
+
+type StateLog struct {
+ address []byte
+ topics [][]byte
+ data []byte
+}
+
+func NewLog(address []byte, topics [][]byte, data []byte) *StateLog {
+ return &StateLog{address, topics, data}
+}
+
+func (self *StateLog) Address() []byte {
+ return self.address
+}
+
+func (self *StateLog) Topics() [][]byte {
+ return self.topics
+}
+
+func (self *StateLog) Data() []byte {
+ return self.data
+}
+
+func NewLogFromValue(decoder *ethutil.Value) *StateLog {
+ log := &StateLog{
+ address: decoder.Get(0).Bytes(),
+ data: decoder.Get(2).Bytes(),
+ }
+
+ it := decoder.Get(1).NewIterator()
+ for it.Next() {
+ log.topics = append(log.topics, it.Value().Bytes())
+ }
+
+ return log
+}
+
+func (self *StateLog) RlpData() interface{} {
+ return []interface{}{self.address, ethutil.ByteSliceToInterface(self.topics), self.data}
+}
+
+func (self *StateLog) String() string {
+ return fmt.Sprintf(`log: %x %x %x`, self.address, self.topics, self.data)
+}
+
+type Logs []Log
+
+func (self Logs) RlpData() interface{} {
+ data := make([]interface{}, len(self))
+ for i, log := range self {
+ data[i] = log.RlpData()
+ }
+
+ return data
+}
+
+func (self Logs) String() (ret string) {
+ for _, log := range self {
+ ret += fmt.Sprintf("%v", log)
+ }
+
+ return "[" + ret + "]"
+}
diff --git a/state/main_test.go b/state/main_test.go
new file mode 100644
index 000000000..f3d3f7e23
--- /dev/null
+++ b/state/main_test.go
@@ -0,0 +1,9 @@
+package state
+
+import (
+ "testing"
+
+ checker "gopkg.in/check.v1"
+)
+
+func Test(t *testing.T) { checker.TestingT(t) }
diff --git a/state/manifest.go b/state/manifest.go
new file mode 100644
index 000000000..21cd04a1a
--- /dev/null
+++ b/state/manifest.go
@@ -0,0 +1,55 @@
+package state
+
+import (
+ "fmt"
+ "math/big"
+)
+
+// Object manifest
+//
+// The object manifest is used to keep changes to the state so we can keep track of the changes
+// that occurred during a state transitioning phase.
+type Manifest struct {
+ Messages Messages
+}
+
+func NewManifest() *Manifest {
+ m := &Manifest{}
+ m.Reset()
+
+ return m
+}
+
+func (m *Manifest) Reset() {
+ m.Messages = nil
+}
+
+func (self *Manifest) AddMessage(msg *Message) *Message {
+ self.Messages = append(self.Messages, msg)
+
+ return msg
+}
+
+type Messages []*Message
+type Message struct {
+ To, From []byte
+ Input []byte
+ Output []byte
+ Path int
+ Origin []byte
+ Timestamp int64
+ Coinbase []byte
+ Block []byte
+ Number *big.Int
+ Value *big.Int
+
+ ChangedAddresses [][]byte
+}
+
+func (self *Message) AddStorageChange(addr []byte) {
+ self.ChangedAddresses = append(self.ChangedAddresses, addr)
+}
+
+func (self *Message) String() string {
+ return fmt.Sprintf("Message{to: %x from: %x input: %x output: %x origin: %x coinbase: %x block: %x number: %v timestamp: %d path: %d value: %v", self.To, self.From, self.Input, self.Output, self.Origin, self.Coinbase, self.Block, self.Number, self.Timestamp, self.Path, self.Value)
+}
diff --git a/state/state.go b/state/state.go
new file mode 100644
index 000000000..f77da72f0
--- /dev/null
+++ b/state/state.go
@@ -0,0 +1,325 @@
+package state
+
+import (
+ "math/big"
+
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/logger"
+ "github.com/ethereum/go-ethereum/trie"
+)
+
+var statelogger = logger.NewLogger("STATE")
+
+// StateDBs within the ethereum protocol are used to store anything
+// within the merkle trie. StateDBs take care of caching and storing
+// nested states. It's the general query interface to retrieve:
+// * Contracts
+// * Accounts
+type StateDB struct {
+ // The trie for this structure
+ Trie *trie.Trie
+
+ stateObjects map[string]*StateObject
+
+ manifest *Manifest
+
+ refund map[string]*big.Int
+
+ logs Logs
+}
+
+// Create a new state from a given trie
+func New(trie *trie.Trie) *StateDB {
+ return &StateDB{Trie: trie, stateObjects: make(map[string]*StateObject), manifest: NewManifest(), refund: make(map[string]*big.Int)}
+}
+
+func (self *StateDB) EmptyLogs() {
+ self.logs = nil
+}
+
+func (self *StateDB) AddLog(log Log) {
+ self.logs = append(self.logs, log)
+}
+
+func (self *StateDB) Logs() Logs {
+ return self.logs
+}
+
+// Retrieve the balance from the given address or 0 if object not found
+func (self *StateDB) GetBalance(addr []byte) *big.Int {
+ stateObject := self.GetStateObject(addr)
+ if stateObject != nil {
+ return stateObject.balance
+ }
+
+ return ethutil.Big0
+}
+
+func (self *StateDB) Refund(addr []byte, gas *big.Int) {
+ if self.refund[string(addr)] == nil {
+ self.refund[string(addr)] = new(big.Int)
+ }
+ self.refund[string(addr)].Add(self.refund[string(addr)], gas)
+}
+
+func (self *StateDB) AddBalance(addr []byte, amount *big.Int) {
+ stateObject := self.GetStateObject(addr)
+ if stateObject != nil {
+ stateObject.AddBalance(amount)
+ }
+}
+
+func (self *StateDB) GetNonce(addr []byte) uint64 {
+ stateObject := self.GetStateObject(addr)
+ if stateObject != nil {
+ return stateObject.Nonce
+ }
+
+ return 0
+}
+
+func (self *StateDB) SetNonce(addr []byte, nonce uint64) {
+ stateObject := self.GetStateObject(addr)
+ if stateObject != nil {
+ stateObject.Nonce = nonce
+ }
+}
+
+func (self *StateDB) GetCode(addr []byte) []byte {
+ stateObject := self.GetStateObject(addr)
+ if stateObject != nil {
+ return stateObject.Code
+ }
+
+ return nil
+}
+
+func (self *StateDB) SetCode(addr, code []byte) {
+ stateObject := self.GetStateObject(addr)
+ if stateObject != nil {
+ stateObject.SetCode(code)
+ }
+}
+
+func (self *StateDB) GetState(a, b []byte) []byte {
+ stateObject := self.GetStateObject(a)
+ if stateObject != nil {
+ return stateObject.GetState(b).Bytes()
+ }
+
+ return nil
+}
+
+func (self *StateDB) SetState(addr, key []byte, value interface{}) {
+ stateObject := self.GetStateObject(addr)
+ if stateObject != nil {
+ stateObject.SetState(key, ethutil.NewValue(value))
+ }
+}
+
+func (self *StateDB) Delete(addr []byte) bool {
+ stateObject := self.GetStateObject(addr)
+ if stateObject != nil {
+ stateObject.MarkForDeletion()
+
+ return true
+ }
+
+ return false
+}
+
+//
+// Setting, updating & deleting state object methods
+//
+
+// Update the given state object and apply it to state trie
+func (self *StateDB) UpdateStateObject(stateObject *StateObject) {
+ addr := stateObject.Address()
+
+ if len(stateObject.CodeHash()) > 0 {
+ ethutil.Config.Db.Put(stateObject.CodeHash(), stateObject.Code)
+ }
+
+ self.Trie.Update(string(addr), string(stateObject.RlpEncode()))
+}
+
+// Delete the given state object and delete it from the state trie
+func (self *StateDB) DeleteStateObject(stateObject *StateObject) {
+ self.Trie.Delete(string(stateObject.Address()))
+
+ delete(self.stateObjects, string(stateObject.Address()))
+}
+
+// Retrieve a state object given my the address. Nil if not found
+func (self *StateDB) GetStateObject(addr []byte) *StateObject {
+ addr = ethutil.Address(addr)
+
+ stateObject := self.stateObjects[string(addr)]
+ if stateObject != nil {
+ return stateObject
+ }
+
+ data := self.Trie.Get(string(addr))
+ if len(data) == 0 {
+ return nil
+ }
+
+ stateObject = NewStateObjectFromBytes(addr, []byte(data))
+ self.SetStateObject(stateObject)
+
+ return stateObject
+}
+
+func (self *StateDB) SetStateObject(object *StateObject) {
+ self.stateObjects[string(object.address)] = object
+}
+
+// Retrieve a state object or create a new state object if nil
+func (self *StateDB) GetOrNewStateObject(addr []byte) *StateObject {
+ stateObject := self.GetStateObject(addr)
+ if stateObject == nil {
+ stateObject = self.NewStateObject(addr)
+ }
+
+ return stateObject
+}
+
+// Create a state object whether it exist in the trie or not
+func (self *StateDB) NewStateObject(addr []byte) *StateObject {
+ addr = ethutil.Address(addr)
+
+ statelogger.Debugf("(+) %x\n", addr)
+
+ stateObject := NewStateObject(addr)
+ self.stateObjects[string(addr)] = stateObject
+
+ return stateObject
+}
+
+// Deprecated
+func (self *StateDB) GetAccount(addr []byte) *StateObject {
+ return self.GetOrNewStateObject(addr)
+}
+
+//
+// Setting, copying of the state methods
+//
+
+func (s *StateDB) Cmp(other *StateDB) bool {
+ return s.Trie.Cmp(other.Trie)
+}
+
+func (self *StateDB) Copy() *StateDB {
+ if self.Trie != nil {
+ state := New(self.Trie.Copy())
+ for k, stateObject := range self.stateObjects {
+ state.stateObjects[k] = stateObject.Copy()
+ }
+
+ for addr, refund := range self.refund {
+ state.refund[addr] = new(big.Int).Set(refund)
+ }
+
+ logs := make(Logs, len(self.logs))
+ copy(logs, self.logs)
+ state.logs = logs
+
+ return state
+ }
+
+ return nil
+}
+
+func (self *StateDB) Set(state *StateDB) {
+ if state == nil {
+ panic("Tried setting 'state' to nil through 'Set'")
+ }
+
+ self.Trie = state.Trie
+ self.stateObjects = state.stateObjects
+ self.refund = state.refund
+ self.logs = state.logs
+}
+
+func (s *StateDB) Root() []byte {
+ return s.Trie.GetRoot()
+}
+
+// Resets the trie and all siblings
+func (s *StateDB) Reset() {
+ s.Trie.Undo()
+
+ // Reset all nested states
+ for _, stateObject := range s.stateObjects {
+ if stateObject.State == nil {
+ continue
+ }
+
+ stateObject.Reset()
+ }
+
+ s.Empty()
+}
+
+// Syncs the trie and all siblings
+func (s *StateDB) Sync() {
+ // Sync all nested states
+ for _, stateObject := range s.stateObjects {
+ if stateObject.State == nil {
+ continue
+ }
+
+ stateObject.State.Sync()
+ }
+
+ s.Trie.Sync()
+
+ s.Empty()
+}
+
+func (self *StateDB) Empty() {
+ self.stateObjects = make(map[string]*StateObject)
+ self.refund = make(map[string]*big.Int)
+}
+
+func (self *StateDB) Refunds() map[string]*big.Int {
+ return self.refund
+}
+
+func (self *StateDB) Update(gasUsed *big.Int) {
+ var deleted bool
+
+ self.refund = make(map[string]*big.Int)
+
+ for _, stateObject := range self.stateObjects {
+ if stateObject.remove {
+ self.DeleteStateObject(stateObject)
+ deleted = true
+ } else {
+ stateObject.Sync()
+
+ self.UpdateStateObject(stateObject)
+ }
+ }
+
+ // FIXME trie delete is broken
+ if deleted {
+ valid, t2 := trie.ParanoiaCheck(self.Trie)
+ if !valid {
+ statelogger.Infof("Warn: PARANOIA: Different state root during copy %x vs %x\n", self.Trie.GetRoot(), t2.GetRoot())
+
+ self.Trie = t2
+ }
+ }
+}
+
+func (self *StateDB) Manifest() *Manifest {
+ return self.manifest
+}
+
+// Debug stuff
+func (self *StateDB) CreateOutputForDiff() {
+ for _, stateObject := range self.stateObjects {
+ stateObject.CreateOutputForDiff()
+ }
+}
diff --git a/state/state_object.go b/state/state_object.go
new file mode 100644
index 000000000..b8af4e702
--- /dev/null
+++ b/state/state_object.go
@@ -0,0 +1,320 @@
+package state
+
+import (
+ "fmt"
+ "math/big"
+
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/trie"
+)
+
+type Code []byte
+
+func (self Code) String() string {
+ return string(self) //strings.Join(Disassemble(self), " ")
+}
+
+type Storage map[string]*ethutil.Value
+
+func (self Storage) Copy() Storage {
+ cpy := make(Storage)
+ for key, value := range self {
+ // XXX Do we need a 'value' copy or is this sufficient?
+ cpy[key] = value
+ }
+
+ return cpy
+}
+
+type StateObject struct {
+ // Address of the object
+ address []byte
+ // Shared attributes
+ balance *big.Int
+ codeHash []byte
+ Nonce uint64
+ // Contract related attributes
+ State *StateDB
+ Code Code
+ InitCode Code
+
+ storage Storage
+
+ // Total gas pool is the total amount of gas currently
+ // left if this object is the coinbase. Gas is directly
+ // purchased of the coinbase.
+ gasPool *big.Int
+
+ // Mark for deletion
+ // When an object is marked for deletion it will be delete from the trie
+ // during the "update" phase of the state transition
+ remove bool
+}
+
+func (self *StateObject) Reset() {
+ self.storage = make(Storage)
+ self.State.Reset()
+}
+
+func NewStateObject(addr []byte) *StateObject {
+ // This to ensure that it has 20 bytes (and not 0 bytes), thus left or right pad doesn't matter.
+ address := ethutil.Address(addr)
+
+ object := &StateObject{address: address, balance: new(big.Int), gasPool: new(big.Int)}
+ object.State = New(trie.New(ethutil.Config.Db, ""))
+ object.storage = make(Storage)
+ object.gasPool = new(big.Int)
+
+ return object
+}
+
+func NewContract(address []byte, balance *big.Int, root []byte) *StateObject {
+ contract := NewStateObject(address)
+ contract.balance = balance
+ contract.State = New(trie.New(ethutil.Config.Db, string(root)))
+
+ return contract
+}
+
+func NewStateObjectFromBytes(address, data []byte) *StateObject {
+ object := &StateObject{address: address}
+ object.RlpDecode(data)
+
+ return object
+}
+
+func (self *StateObject) MarkForDeletion() {
+ self.remove = true
+ statelogger.DebugDetailf("%x: #%d %v (deletion)\n", self.Address(), self.Nonce, self.balance)
+}
+
+func (c *StateObject) GetAddr(addr []byte) *ethutil.Value {
+ return ethutil.NewValueFromBytes([]byte(c.State.Trie.Get(string(addr))))
+}
+
+func (c *StateObject) SetAddr(addr []byte, value interface{}) {
+ c.State.Trie.Update(string(addr), string(ethutil.NewValue(value).Encode()))
+}
+
+func (self *StateObject) GetStorage(key *big.Int) *ethutil.Value {
+ return self.GetState(key.Bytes())
+}
+func (self *StateObject) SetStorage(key *big.Int, value *ethutil.Value) {
+ self.SetState(key.Bytes(), value)
+}
+
+func (self *StateObject) Storage() map[string]*ethutil.Value {
+ return self.storage
+}
+
+func (self *StateObject) GetState(k []byte) *ethutil.Value {
+ key := ethutil.LeftPadBytes(k, 32)
+
+ value := self.storage[string(key)]
+ if value == nil {
+ value = self.GetAddr(key)
+
+ if !value.IsNil() {
+ self.storage[string(key)] = value
+ }
+ }
+
+ return value
+}
+
+func (self *StateObject) SetState(k []byte, value *ethutil.Value) {
+ key := ethutil.LeftPadBytes(k, 32)
+ self.storage[string(key)] = value.Copy()
+}
+
+// Iterate over each storage address and yield callback
+func (self *StateObject) EachStorage(cb trie.EachCallback) {
+ // First loop over the uncommit/cached values in storage
+ for key, value := range self.storage {
+ // XXX Most iterators Fns as it stands require encoded values
+ encoded := ethutil.NewValue(value.Encode())
+ cb(key, encoded)
+ }
+
+ it := self.State.Trie.NewIterator()
+ it.Each(func(key string, value *ethutil.Value) {
+ // If it's cached don't call the callback.
+ if self.storage[key] == nil {
+ cb(key, value)
+ }
+ })
+}
+
+func (self *StateObject) Sync() {
+ for key, value := range self.storage {
+ if value.Len() == 0 {
+ self.State.Trie.Delete(string(key))
+ continue
+ }
+
+ self.SetAddr([]byte(key), value)
+ }
+
+ valid, t2 := trie.ParanoiaCheck(self.State.Trie)
+ if !valid {
+ statelogger.Infof("Warn: PARANOIA: Different state storage root during copy %x vs %x\n", self.State.Root(), t2.GetRoot())
+
+ self.State.Trie = t2
+ }
+}
+
+func (c *StateObject) GetInstr(pc *big.Int) *ethutil.Value {
+ if int64(len(c.Code)-1) < pc.Int64() {
+ return ethutil.NewValue(0)
+ }
+
+ return ethutil.NewValueFromBytes([]byte{c.Code[pc.Int64()]})
+}
+
+func (c *StateObject) AddBalance(amount *big.Int) {
+ c.SetBalance(new(big.Int).Add(c.balance, amount))
+
+ statelogger.Debugf("%x: #%d %v (+ %v)\n", c.Address(), c.Nonce, c.balance, amount)
+}
+func (c *StateObject) AddAmount(amount *big.Int) { c.AddBalance(amount) }
+
+func (c *StateObject) SubBalance(amount *big.Int) {
+ c.SetBalance(new(big.Int).Sub(c.balance, amount))
+
+ statelogger.Debugf("%x: #%d %v (- %v)\n", c.Address(), c.Nonce, c.balance, amount)
+}
+func (c *StateObject) SubAmount(amount *big.Int) { c.SubBalance(amount) }
+
+func (c *StateObject) SetBalance(amount *big.Int) {
+ c.balance = amount
+}
+
+func (self *StateObject) Balance() *big.Int { return self.balance }
+
+//
+// Gas setters and getters
+//
+
+// Return the gas back to the origin. Used by the Virtual machine or Closures
+func (c *StateObject) ReturnGas(gas, price *big.Int) {}
+func (c *StateObject) ConvertGas(gas, price *big.Int) error {
+ total := new(big.Int).Mul(gas, price)
+ if total.Cmp(c.balance) > 0 {
+ return fmt.Errorf("insufficient amount: %v, %v", c.balance, total)
+ }
+
+ c.SubAmount(total)
+
+ return nil
+}
+
+func (self *StateObject) SetGasPool(gasLimit *big.Int) {
+ self.gasPool = new(big.Int).Set(gasLimit)
+
+ statelogger.Debugf("%x: gas (+ %v)", self.Address(), self.gasPool)
+}
+
+func (self *StateObject) BuyGas(gas, price *big.Int) error {
+ if self.gasPool.Cmp(gas) < 0 {
+ return GasLimitError(self.gasPool, gas)
+ }
+
+ rGas := new(big.Int).Set(gas)
+ rGas.Mul(rGas, price)
+
+ self.AddAmount(rGas)
+
+ return nil
+}
+
+func (self *StateObject) RefundGas(gas, price *big.Int) {
+ self.gasPool.Add(self.gasPool, gas)
+
+ rGas := new(big.Int).Set(gas)
+ rGas.Mul(rGas, price)
+
+ self.balance.Sub(self.balance, rGas)
+}
+
+func (self *StateObject) Copy() *StateObject {
+ stateObject := NewStateObject(self.Address())
+ stateObject.balance.Set(self.balance)
+ stateObject.codeHash = ethutil.CopyBytes(self.codeHash)
+ stateObject.Nonce = self.Nonce
+ if self.State != nil {
+ stateObject.State = self.State.Copy()
+ }
+ stateObject.Code = ethutil.CopyBytes(self.Code)
+ stateObject.InitCode = ethutil.CopyBytes(self.InitCode)
+ stateObject.storage = self.storage.Copy()
+ stateObject.gasPool.Set(self.gasPool)
+ stateObject.remove = self.remove
+
+ return stateObject
+}
+
+func (self *StateObject) Set(stateObject *StateObject) {
+ *self = *stateObject
+}
+
+//
+// Attribute accessors
+//
+
+func (c *StateObject) N() *big.Int {
+ return big.NewInt(int64(c.Nonce))
+}
+
+// Returns the address of the contract/account
+func (c *StateObject) Address() []byte {
+ return c.address
+}
+
+// Returns the initialization Code
+func (c *StateObject) Init() Code {
+ return c.InitCode
+}
+
+func (self *StateObject) Root() []byte {
+ return self.State.Trie.GetRoot()
+}
+
+func (self *StateObject) SetCode(code []byte) {
+ self.Code = code
+}
+
+//
+// Encoding
+//
+
+// State object encoding methods
+func (c *StateObject) RlpEncode() []byte {
+ return ethutil.Encode([]interface{}{c.Nonce, c.balance, c.Root(), c.CodeHash()})
+}
+
+func (c *StateObject) CodeHash() ethutil.Bytes {
+ return crypto.Sha3(c.Code)
+}
+
+func (c *StateObject) RlpDecode(data []byte) {
+ decoder := ethutil.NewValueFromBytes(data)
+
+ c.Nonce = decoder.Get(0).Uint()
+ c.balance = decoder.Get(1).BigInt()
+ c.State = New(trie.New(ethutil.Config.Db, decoder.Get(2).Interface()))
+ c.storage = make(map[string]*ethutil.Value)
+ c.gasPool = new(big.Int)
+
+ c.codeHash = decoder.Get(3).Bytes()
+
+ c.Code, _ = ethutil.Config.Db.Get(c.codeHash)
+}
+
+// Storage change object. Used by the manifest for notifying changes to
+// the sub channels.
+type StorageState struct {
+ StateAddress []byte
+ Address []byte
+ Value *big.Int
+}
diff --git a/state/state_test.go b/state/state_test.go
new file mode 100644
index 000000000..28e4fc5da
--- /dev/null
+++ b/state/state_test.go
@@ -0,0 +1,61 @@
+package state
+
+import (
+ checker "gopkg.in/check.v1"
+
+ "github.com/ethereum/go-ethereum/ethdb"
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/trie"
+)
+
+type StateSuite struct {
+ state *StateDB
+}
+
+var _ = checker.Suite(&StateSuite{})
+
+// var ZeroHash256 = make([]byte, 32)
+
+func (s *StateSuite) TestDump(c *checker.C) {
+ key := []byte{0x01}
+ value := "foo"
+ node := []interface{}{key, value}
+ s.state.Trie.Put(node)
+ dump := s.state.Dump()
+ c.Assert(dump, checker.NotNil)
+}
+
+func (s *StateSuite) SetUpTest(c *checker.C) {
+ db, _ := ethdb.NewMemDatabase()
+ ethutil.ReadConfig(".ethtest", "/tmp/ethtest", "")
+ ethutil.Config.Db = db
+ s.state = New(trie.New(db, ""))
+}
+
+func (s *StateSuite) TestSnapshot(c *checker.C) {
+ stateobjaddr := []byte("aa")
+ storageaddr := ethutil.Big("0")
+ data1 := ethutil.NewValue(42)
+ data2 := ethutil.NewValue(43)
+
+ // get state object
+ stateObject := s.state.GetOrNewStateObject(stateobjaddr)
+ // set inital state object value
+ stateObject.SetStorage(storageaddr, data1)
+ // get snapshot of current state
+ snapshot := s.state.Copy()
+
+ // get state object. is this strictly necessary?
+ stateObject = s.state.GetStateObject(stateobjaddr)
+ // set new state object value
+ stateObject.SetStorage(storageaddr, data2)
+ // restore snapshot
+ s.state.Set(snapshot)
+
+ // get state object
+ stateObject = s.state.GetStateObject(stateobjaddr)
+ // get state storage value
+ res := stateObject.GetStorage(storageaddr)
+
+ c.Assert(data1, checker.DeepEquals, res)
+}
diff --git a/tests/files/BasicTests/blockgenesistest.json b/tests/files/BasicTests/blockgenesistest.json
new file mode 100644
index 000000000..8ad5590f1
--- /dev/null
+++ b/tests/files/BasicTests/blockgenesistest.json
@@ -0,0 +1,20 @@
+[
+ {
+ "inputs": {
+ },
+ "result": "f892f88ea00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493479400000000000000000000000000000000000000008080834000008087038d7ea4c68000830f4240808080a004994f67dc55b09e814ab7ffc8df3686b4afb2bb53e60eae97ef043fe03fb829c0c0"
+ },
+ {
+ "inputs": {
+ "cd2a3d9f938e13cd947ec05abc7fe734df8dd826": 100000000000000000000
+ },
+ "result": "f8b2f8aea00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a05e5b074eca68ed6f5cf3ef14712b7c97f431a41deff21e3f211cf687f618026780834000008087038d7ea4c68000830f4240808080a004994f67dc55b09e814ab7ffc8df3686b4afb2bb53e60eae97ef043fe03fb829c0c0"
+ },
+ {
+ "inputs": {
+ "cd2a3d9f938e13cd947ec05abc7fe734df8dd826": 99000000000000000000,
+ "13978aee95f38490e9769c39b2773ed763d9cd5f": 1000000000000000000
+ },
+ "result": "f8b2f8aea00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0b1062e564d1bdb302a2feae46e837fef59c4f8a408967009dcc48327d80d8fff80834000008087038d7ea4c68000830f4240808080a004994f67dc55b09e814ab7ffc8df3686b4afb2bb53e60eae97ef043fe03fb829c0c0"
+ }
+]
diff --git a/tests/files/BasicTests/genesishashestest.json b/tests/files/BasicTests/genesishashestest.json
new file mode 100644
index 000000000..ba733e36e
--- /dev/null
+++ b/tests/files/BasicTests/genesishashestest.json
@@ -0,0 +1,15 @@
+{
+ "genesis_rlp_hex": "f9012ef90129a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0c67c70f5d7d3049337d1dcc0503a249881120019a8e7322774dbfe57b463718ca056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b840000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080830f4240808080a004994f67dc55b09e814ab7ffc8df3686b4afb2bb53e60eae97ef043fe03fb829c0c0",
+ "genesis_state_root": "c67c70f5d7d3049337d1dcc0503a249881120019a8e7322774dbfe57b463718c",
+ "initial_alloc": {
+ "51ba59315b3a95761d0863b05ccc7a7f54703d99": "1606938044258990275541962092341162602522202993782792835301376",
+ "e4157b34ea9615cfbde6b4fda419828124b70c78": "1606938044258990275541962092341162602522202993782792835301376",
+ "b9c015918bdaba24b4ff057a92a3873d6eb201be": "1606938044258990275541962092341162602522202993782792835301376",
+ "6c386a4b26f73c802f34673f7248bb118f97424a": "1606938044258990275541962092341162602522202993782792835301376",
+ "cd2a3d9f938e13cd947ec05abc7fe734df8dd826": "1606938044258990275541962092341162602522202993782792835301376",
+ "2ef47100e0787b915105fd5e3f4ff6752079d5cb": "1606938044258990275541962092341162602522202993782792835301376",
+ "e6716f9544a56c530d868e4bfbacb172315bdead": "1606938044258990275541962092341162602522202993782792835301376",
+ "1a26338f0d905e295fccb71fa9ea849ffa12aaf4": "1606938044258990275541962092341162602522202993782792835301376"
+ },
+ "genesis_hash": "779b1b620b03c0fb24963e183d5e88e3dbe4484e3f6e2aa05942e3be7b48e179"
+}
diff --git a/tests/files/BasicTests/hexencodetest.json b/tests/files/BasicTests/hexencodetest.json
new file mode 100644
index 000000000..26c5bc7ed
--- /dev/null
+++ b/tests/files/BasicTests/hexencodetest.json
@@ -0,0 +1,62 @@
+{
+ "zz,odd,open": {
+ "seq": [ 0, 0, 1, 2, 3, 4, 5 ],
+ "term": false,
+ "out": "10012345"
+ },
+ "z,even,open": {
+ "seq": [ 0, 1, 2, 3, 4, 5 ],
+ "term": false,
+ "out": "00012345"
+ },
+ "nz,odd,open": {
+ "seq": [ 1, 2, 3, 4, 5 ],
+ "term": false,
+ "out": "112345"
+ },
+ "zz,even,open": {
+ "seq": [ 0, 0, 1, 2, 3, 4 ],
+ "term": false,
+ "out": "00001234"
+ },
+ "z,odd,open": {
+ "seq": [ 0, 1, 2, 3, 4 ],
+ "term": false,
+ "out": "101234"
+ },
+ "nz,even,open": {
+ "seq": [ 1, 2, 3, 4 ],
+ "term": false,
+ "out": "001234"
+ },
+ "zz,odd,term": {
+ "seq": [ 0, 0, 1, 2, 3, 4, 5 ],
+ "term": true,
+ "out": "30012345"
+ },
+ "z,even,term": {
+ "seq": [ 0, 1, 2, 3, 4, 5 ],
+ "term": true,
+ "out": "20012345"
+ },
+ "nz,odd,term": {
+ "seq": [ 1, 2, 3, 4, 5 ],
+ "term": true,
+ "out": "312345"
+ },
+ "zz,even,term": {
+ "seq": [ 0, 0, 1, 2, 3, 4 ],
+ "term": true,
+ "out": "20001234"
+ },
+ "z,odd,term": {
+ "seq": [ 0, 1, 2, 3, 4 ],
+ "term": true,
+ "out": "301234"
+ },
+ "nz,even,term": {
+ "seq": [ 1, 2, 3, 4 ],
+ "term": true,
+ "out": "201234"
+ }
+}
diff --git a/tests/files/BasicTests/keyaddrtest.json b/tests/files/BasicTests/keyaddrtest.json
new file mode 100644
index 000000000..c65b2ae33
--- /dev/null
+++ b/tests/files/BasicTests/keyaddrtest.json
@@ -0,0 +1,22 @@
+[
+ {
+ "seed": "cow",
+ "key": "c85ef7d79691fe79573b1a7064c19c1a9819ebdbd1faaab1a8ec92344438aaf4",
+ "addr": "cd2a3d9f938e13cd947ec05abc7fe734df8dd826",
+ "sig_of_emptystring": {
+ "v": "27",
+ "r": "55022946425863772466282515086640833500580355555249003729267710149987842051473",
+ "s": "3021698389129950584349170550428805649435913935175976180112863059249983907949"
+ }
+ },
+ {
+ "seed": "horse",
+ "key": "c87f65ff3f271bf5dc8643484f66b200109caffe4bf98c4cb393dc35740b28c0",
+ "addr": "13978aee95f38490e9769c39b2773ed763d9cd5f",
+ "sig_of_emptystring": {
+ "v": "28",
+ "r": "20570452350081260599473412372903969148670549754219103025003129053348571714359",
+ "s": "76892551129780267788164835941580941601518827936179476514262023835864819088004"
+ }
+ }
+]
diff --git a/tests/files/BasicTests/rlptest.json b/tests/files/BasicTests/rlptest.json
new file mode 100644
index 000000000..19adbb8e2
--- /dev/null
+++ b/tests/files/BasicTests/rlptest.json
@@ -0,0 +1,146 @@
+{
+ "emptystring": {
+ "in": "",
+ "out": "80"
+ },
+ "shortstring": {
+ "in": "dog",
+ "out": "83646f67"
+ },
+ "shortstring2": {
+ "in": "Lorem ipsum dolor sit amet, consectetur adipisicing eli",
+ "out": "b74c6f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e7365637465747572206164697069736963696e6720656c69"
+ },
+ "longstring": {
+ "in": "Lorem ipsum dolor sit amet, consectetur adipisicing elit",
+ "out": "b8384c6f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e7365637465747572206164697069736963696e6720656c6974"
+ },
+ "longstring2": {
+ "in": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur mauris magna, suscipit sed vehicula non, iaculis faucibus tortor. Proin suscipit ultricies malesuada. Duis tortor elit, dictum quis tristique eu, ultrices at risus. Morbi a est imperdiet mi ullamcorper aliquet suscipit nec lorem. Aenean quis leo mollis, vulputate elit varius, consequat enim. Nulla ultrices turpis justo, et posuere urna consectetur nec. Proin non convallis metus. Donec tempor ipsum in mauris congue sollicitudin. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Suspendisse convallis sem vel massa faucibus, eget lacinia lacus tempor. Nulla quis ultricies purus. Proin auctor rhoncus nibh condimentum mollis. Aliquam consequat enim at metus luctus, a eleifend purus egestas. Curabitur at nibh metus. Nam bibendum, neque at auctor tristique, lorem libero aliquet arcu, non interdum tellus lectus sit amet eros. Cras rhoncus, metus ac ornare cursus, dolor justo ultrices metus, at ullamcorper volutpat",
+ "out": "b904004c6f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e73656374657475722061646970697363696e6720656c69742e20437572616269747572206d6175726973206d61676e612c20737573636970697420736564207665686963756c61206e6f6e2c20696163756c697320666175636962757320746f72746f722e2050726f696e20737573636970697420756c74726963696573206d616c6573756164612e204475697320746f72746f7220656c69742c2064696374756d2071756973207472697374697175652065752c20756c7472696365732061742072697375732e204d6f72626920612065737420696d70657264696574206d6920756c6c616d636f7270657220616c6971756574207375736369706974206e6563206c6f72656d2e2041656e65616e2071756973206c656f206d6f6c6c69732c2076756c70757461746520656c6974207661726975732c20636f6e73657175617420656e696d2e204e756c6c6120756c74726963657320747572706973206a7573746f2c20657420706f73756572652075726e6120636f6e7365637465747572206e65632e2050726f696e206e6f6e20636f6e76616c6c6973206d657475732e20446f6e65632074656d706f7220697073756d20696e206d617572697320636f6e67756520736f6c6c696369747564696e2e20566573746962756c756d20616e746520697073756d207072696d697320696e206661756369627573206f726369206c756374757320657420756c74726963657320706f737565726520637562696c69612043757261653b2053757370656e646973736520636f6e76616c6c69732073656d2076656c206d617373612066617563696275732c2065676574206c6163696e6961206c616375732074656d706f722e204e756c6c61207175697320756c747269636965732070757275732e2050726f696e20617563746f722072686f6e637573206e69626820636f6e64696d656e74756d206d6f6c6c69732e20416c697175616d20636f6e73657175617420656e696d206174206d65747573206c75637475732c206120656c656966656e6420707572757320656765737461732e20437572616269747572206174206e696268206d657475732e204e616d20626962656e64756d2c206e6571756520617420617563746f72207472697374697175652c206c6f72656d206c696265726f20616c697175657420617263752c206e6f6e20696e74657264756d2074656c6c7573206c65637475732073697420616d65742065726f732e20437261732072686f6e6375732c206d65747573206163206f726e617265206375727375732c20646f6c6f72206a7573746f20756c747269636573206d657475732c20617420756c6c616d636f7270657220766f6c7574706174"
+ },
+ "zero": {
+ "in": 0,
+ "out": "80"
+ },
+ "smallint": {
+ "in": 1,
+ "out": "01"
+ },
+ "smallint2": {
+ "in": 16,
+ "out": "10"
+ },
+ "smallint3": {
+ "in": 79,
+ "out": "4f"
+ },
+ "smallint4": {
+ "in": 127,
+ "out": "7f"
+ },
+ "mediumint1": {
+ "in": 128,
+ "out": "8180"
+ },
+ "mediumint2": {
+ "in": 1000,
+ "out": "8203e8"
+ },
+ "mediumint3": {
+ "in": 100000,
+ "out": "830186a0"
+ },
+ "mediumint4": {
+ "in": "#83729609699884896815286331701780722",
+ "out": "8F102030405060708090A0B0C0D0E0F2"
+ },
+ "mediumint5": {
+ "in": "#105315505618206987246253880190783558935785933862974822347068935681",
+ "out": "9C0100020003000400050006000700080009000A000B000C000D000E01"
+ },
+ "emptylist": {
+ "in": [],
+ "out": "c0"
+ },
+ "stringlist": {
+ "in": [ "dog", "god", "cat" ],
+ "out": "cc83646f6783676f6483636174"
+ },
+ "multilist": {
+ "in": [ "zw", [ 4 ], 1 ],
+ "out": "c6827a77c10401"
+ },
+ "shortListMax1": {
+ "in": [ "asdf", "qwer", "zxcv", "asdf","qwer", "zxcv", "asdf", "qwer", "zxcv", "asdf", "qwer"],
+ "out": "F784617364668471776572847a78637684617364668471776572847a78637684617364668471776572847a78637684617364668471776572"
+ },
+ "longList1" : {
+ "in" : [
+ ["asdf","qwer","zxcv"],
+ ["asdf","qwer","zxcv"],
+ ["asdf","qwer","zxcv"],
+ ["asdf","qwer","zxcv"]
+ ],
+ "out": "F840CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376"
+ },
+ "longList2" : {
+ "in" : [
+ ["asdf","qwer","zxcv"],
+ ["asdf","qwer","zxcv"],
+ ["asdf","qwer","zxcv"],
+ ["asdf","qwer","zxcv"],
+ ["asdf","qwer","zxcv"],
+ ["asdf","qwer","zxcv"],
+ ["asdf","qwer","zxcv"],
+ ["asdf","qwer","zxcv"],
+ ["asdf","qwer","zxcv"],
+ ["asdf","qwer","zxcv"],
+ ["asdf","qwer","zxcv"],
+ ["asdf","qwer","zxcv"],
+ ["asdf","qwer","zxcv"],
+ ["asdf","qwer","zxcv"],
+ ["asdf","qwer","zxcv"],
+ ["asdf","qwer","zxcv"],
+ ["asdf","qwer","zxcv"],
+ ["asdf","qwer","zxcv"],
+ ["asdf","qwer","zxcv"],
+ ["asdf","qwer","zxcv"],
+ ["asdf","qwer","zxcv"],
+ ["asdf","qwer","zxcv"],
+ ["asdf","qwer","zxcv"],
+ ["asdf","qwer","zxcv"],
+ ["asdf","qwer","zxcv"],
+ ["asdf","qwer","zxcv"],
+ ["asdf","qwer","zxcv"],
+ ["asdf","qwer","zxcv"],
+ ["asdf","qwer","zxcv"],
+ ["asdf","qwer","zxcv"],
+ ["asdf","qwer","zxcv"],
+ ["asdf","qwer","zxcv"]
+ ],
+ "out": "F90200CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376"
+ },
+
+ "listsoflists": {
+ "in": [ [ [], [] ], [] ],
+ "out": "c4c2c0c0c0"
+ },
+ "listsoflists2": {
+ "in": [ [], [[]], [ [], [[]] ] ],
+ "out": "c7c0c1c0c3c0c1c0"
+ },
+ "dictTest1" : {
+ "in" : [
+ ["key1", "val1"],
+ ["key2", "val2"],
+ ["key3", "val3"],
+ ["key4", "val4"]
+ ],
+ "out" : "ECCA846b6579318476616c31CA846b6579328476616c32CA846b6579338476616c33CA846b6579348476616c34"
+ },
+ "bigint": {
+ "in": "#115792089237316195423570985008687907853269984665640564039457584007913129639936",
+ "out": "a1010000000000000000000000000000000000000000000000000000000000000000"
+ }
+}
diff --git a/tests/files/BasicTests/txtest.json b/tests/files/BasicTests/txtest.json
new file mode 100644
index 000000000..1261d0766
--- /dev/null
+++ b/tests/files/BasicTests/txtest.json
@@ -0,0 +1,24 @@
+[
+ {
+ "key": "c85ef7d79691fe79573b1a7064c19c1a9819ebdbd1faaab1a8ec92344438aaf4",
+ "nonce": 0,
+ "gasprice": 1000000000000,
+ "startgas": 10000,
+ "to": "13978aee95f38490e9769c39b2773ed763d9cd5f",
+ "value": 10000000000000000,
+ "data": "",
+ "unsigned": "eb8085e8d4a510008227109413978aee95f38490e9769c39b2773ed763d9cd5f872386f26fc1000080808080",
+ "signed": "f86b8085e8d4a510008227109413978aee95f38490e9769c39b2773ed763d9cd5f872386f26fc10000801ba0eab47c1a49bf2fe5d40e01d313900e19ca485867d462fe06e139e3a536c6d4f4a014a569d327dcda4b29f74f93c0e9729d2f49ad726e703f9cd90dbb0fbf6649f1"
+ },
+ {
+ "key": "c87f65ff3f271bf5dc8643484f66b200109caffe4bf98c4cb393dc35740b28c0",
+ "nonce": 0,
+ "gasprice": 1000000000000,
+ "startgas": 10000,
+ "to": "",
+ "value": 0,
+ "data": "6025515b525b600a37f260003556601b596020356000355760015b525b54602052f260255860005b525b54602052f2",
+ "unsigned": "f83f8085e8d4a510008227108080af6025515b525b600a37f260003556601b596020356000355760015b525b54602052f260255860005b525b54602052f2808080",
+ "signed": "f87f8085e8d4a510008227108080af6025515b525b600a37f260003556601b596020356000355760015b525b54602052f260255860005b525b54602052f21ba05afed0244d0da90b67cf8979b0f246432a5112c0d31e8d5eedd2bc17b171c694a0bb1035c834677c2e1185b8dc90ca6d1fa585ab3d7ef23707e1a497a98e752d1b"
+ }
+]
diff --git a/tests/files/README.md b/tests/files/README.md
new file mode 100644
index 000000000..0f7dbe5a6
--- /dev/null
+++ b/tests/files/README.md
@@ -0,0 +1,26 @@
+tests
+=====
+
+Common tests for all clients to test against.
+
+All files should be of the form:
+
+```
+{
+ "test1name":
+ {
+ "test1property1": ...,
+ "test1property2": ...,
+ ...
+ },
+ "test2name":
+ {
+ "test2property1": ...,
+ "test2property2": ...,
+ ...
+ }
+}
+```
+
+Arrays are allowed, but don't use them for sets of properties - only use them for data that is clearly a continuous contiguous sequence of values.
+
diff --git a/tests/files/StateTests/stExample.json b/tests/files/StateTests/stExample.json
new file mode 100644
index 000000000..34bb4dd8e
--- /dev/null
+++ b/tests/files/StateTests/stExample.json
@@ -0,0 +1,64 @@
+{
+ "add11" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000100000",
+ "code" : "0x6001600101600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x02"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "804",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899196",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6001600101600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ }
+} \ No newline at end of file
diff --git a/tests/files/StateTests/stInitCodeTest.json b/tests/files/StateTests/stInitCodeTest.json
new file mode 100644
index 000000000..67aa42853
--- /dev/null
+++ b/tests/files/StateTests/stInitCodeTest.json
@@ -0,0 +1,870 @@
+{
+ "CallRecursiveContract" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "45678256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "04110d816c380812a427968ece99b1c963dfbce6" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0x04110d816c380812a427968ece99b1c963dfbce6"
+ }
+ },
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1",
+ "code" : "0x3060025560206000600039602060006000f0",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0x095e7baea6a6c7c4c2dfeb977efac326af552d87"
+ }
+ },
+ "0a517d755cebbf66312b30fff713666a9cb917e0" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0x0a517d755cebbf66312b30fff713666a9cb917e0"
+ }
+ },
+ "24dd378f51adc67a50e339e8031fe9bd4aafab36" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0x24dd378f51adc67a50e339e8031fe9bd4aafab36"
+ }
+ },
+ "293f982d000532a7861ab122bdc4bbfd26bf9030" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0x293f982d000532a7861ab122bdc4bbfd26bf9030"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "10000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2cf5732f017b0cf1b1f13a1478e10239716bf6b5" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0x2cf5732f017b0cf1b1f13a1478e10239716bf6b5"
+ }
+ },
+ "31c640b92c21a1f1465c91070b4b3b4d6854195f" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "37f998764813b136ddf5a754f34063fd03065e36" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0x37f998764813b136ddf5a754f34063fd03065e36"
+ }
+ },
+ "37fa399a749c121f8a15ce77e3d9f9bec8020d7a" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0x37fa399a749c121f8a15ce77e3d9f9bec8020d7a"
+ }
+ },
+ "4f36659fa632310b6ec438dea4085b522a2dd077" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0x4f36659fa632310b6ec438dea4085b522a2dd077"
+ }
+ },
+ "62c01474f089b07dae603491675dc5b5748f7049" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0x62c01474f089b07dae603491675dc5b5748f7049"
+ }
+ },
+ "729af7294be595a0efd7d891c9e51f89c07950c7" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0x729af7294be595a0efd7d891c9e51f89c07950c7"
+ }
+ },
+ "83e3e5a16d3b696a0314b30b2534804dd5e11197" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0x83e3e5a16d3b696a0314b30b2534804dd5e11197"
+ }
+ },
+ "8703df2417e0d7c59d063caa9583cb10a4d20532" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0x8703df2417e0d7c59d063caa9583cb10a4d20532"
+ }
+ },
+ "8dffcd74e5b5923512916c6a64b502689cfa65e1" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0x8dffcd74e5b5923512916c6a64b502689cfa65e1"
+ }
+ },
+ "95a4d7cccb5204733874fa87285a176fe1e9e240" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0x95a4d7cccb5204733874fa87285a176fe1e9e240"
+ }
+ },
+ "99b2fcba8120bedd048fe79f5262a6690ed38c39" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0x99b2fcba8120bedd048fe79f5262a6690ed38c39"
+ }
+ },
+ "a4202b8b8afd5354e3e40a219bdc17f6001bf2cf" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0xa4202b8b8afd5354e3e40a219bdc17f6001bf2cf"
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "89999",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a9647f4a0a14042d91dc33c0328030a7157c93ae" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0xa9647f4a0a14042d91dc33c0328030a7157c93ae"
+ }
+ },
+ "aa6cffe5185732689c18f37a7f86170cb7304c2a" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0xaa6cffe5185732689c18f37a7f86170cb7304c2a"
+ }
+ },
+ "aae4a2e3c51c04606dcb3723456e58f3ed214f45" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0xaae4a2e3c51c04606dcb3723456e58f3ed214f45"
+ }
+ },
+ "c37a43e940dfb5baf581a0b82b351d48305fc885" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0xc37a43e940dfb5baf581a0b82b351d48305fc885"
+ }
+ },
+ "d2571607e241ecf590ed94b12d87c94babe36db6" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0xd2571607e241ecf590ed94b12d87c94babe36db6"
+ }
+ },
+ "f735071cbee190d76b704ce68384fc21e389fbe7" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0xf735071cbee190d76b704ce68384fc21e389fbe7"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "0",
+ "code" : "0x3060025560206000600039602060006000f0",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "100000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "0x00",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "1"
+ }
+ },
+ "CallTheContractToCreateContractWithInitCode" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "45678256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "04110d816c380812a427968ece99b1c963dfbce6" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0x04110d816c380812a427968ece99b1c963dfbce6"
+ }
+ },
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "10001",
+ "code" : "0x3060025560206000600039602060006000f0",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0x095e7baea6a6c7c4c2dfeb977efac326af552d87"
+ }
+ },
+ "0a517d755cebbf66312b30fff713666a9cb917e0" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0x0a517d755cebbf66312b30fff713666a9cb917e0"
+ }
+ },
+ "24dd378f51adc67a50e339e8031fe9bd4aafab36" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0x24dd378f51adc67a50e339e8031fe9bd4aafab36"
+ }
+ },
+ "293f982d000532a7861ab122bdc4bbfd26bf9030" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0x293f982d000532a7861ab122bdc4bbfd26bf9030"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "10000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2cf5732f017b0cf1b1f13a1478e10239716bf6b5" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0x2cf5732f017b0cf1b1f13a1478e10239716bf6b5"
+ }
+ },
+ "31c640b92c21a1f1465c91070b4b3b4d6854195f" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "37f998764813b136ddf5a754f34063fd03065e36" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0x37f998764813b136ddf5a754f34063fd03065e36"
+ }
+ },
+ "37fa399a749c121f8a15ce77e3d9f9bec8020d7a" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0x37fa399a749c121f8a15ce77e3d9f9bec8020d7a"
+ }
+ },
+ "4f36659fa632310b6ec438dea4085b522a2dd077" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0x4f36659fa632310b6ec438dea4085b522a2dd077"
+ }
+ },
+ "62c01474f089b07dae603491675dc5b5748f7049" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0x62c01474f089b07dae603491675dc5b5748f7049"
+ }
+ },
+ "729af7294be595a0efd7d891c9e51f89c07950c7" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0x729af7294be595a0efd7d891c9e51f89c07950c7"
+ }
+ },
+ "83e3e5a16d3b696a0314b30b2534804dd5e11197" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0x83e3e5a16d3b696a0314b30b2534804dd5e11197"
+ }
+ },
+ "8703df2417e0d7c59d063caa9583cb10a4d20532" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0x8703df2417e0d7c59d063caa9583cb10a4d20532"
+ }
+ },
+ "8dffcd74e5b5923512916c6a64b502689cfa65e1" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0x8dffcd74e5b5923512916c6a64b502689cfa65e1"
+ }
+ },
+ "95a4d7cccb5204733874fa87285a176fe1e9e240" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0x95a4d7cccb5204733874fa87285a176fe1e9e240"
+ }
+ },
+ "99b2fcba8120bedd048fe79f5262a6690ed38c39" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0x99b2fcba8120bedd048fe79f5262a6690ed38c39"
+ }
+ },
+ "a4202b8b8afd5354e3e40a219bdc17f6001bf2cf" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0xa4202b8b8afd5354e3e40a219bdc17f6001bf2cf"
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "89999",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a9647f4a0a14042d91dc33c0328030a7157c93ae" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0xa9647f4a0a14042d91dc33c0328030a7157c93ae"
+ }
+ },
+ "aa6cffe5185732689c18f37a7f86170cb7304c2a" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0xaa6cffe5185732689c18f37a7f86170cb7304c2a"
+ }
+ },
+ "aae4a2e3c51c04606dcb3723456e58f3ed214f45" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0xaae4a2e3c51c04606dcb3723456e58f3ed214f45"
+ }
+ },
+ "c37a43e940dfb5baf581a0b82b351d48305fc885" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0xc37a43e940dfb5baf581a0b82b351d48305fc885"
+ }
+ },
+ "d2571607e241ecf590ed94b12d87c94babe36db6" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0xd2571607e241ecf590ed94b12d87c94babe36db6"
+ }
+ },
+ "f735071cbee190d76b704ce68384fc21e389fbe7" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ "0x02" : "0xf735071cbee190d76b704ce68384fc21e389fbe7"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "10000",
+ "code" : "0x3060025560206000600039602060006000f0",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "100000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "0x00",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "1"
+ }
+ },
+ "CallTheContractToCreateEmptyContract" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "45678256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1",
+ "code" : "0x602060006000f0",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "605",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "99394",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "d2571607e241ecf590ed94b12d87c94babe36db6" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "0",
+ "code" : "0x602060006000f0",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "100000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "0x00",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "1"
+ }
+ },
+ "NotEnoughCashContractCreation" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "45678256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "2",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "2",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "0x600a80600c6000396000f200600160008035811a8100",
+ "gasLimit" : "599",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "",
+ "value" : "1"
+ }
+ },
+ "OutOfGasContractCreation" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "45678256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1770",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "6295ee1b4f6dd65047762f924ecd367c17eabf8f" : {
+ "balance" : "1",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "8229",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "10000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "0x600a80600c6000396000f200600160008035811a8100",
+ "gasLimit" : "590",
+ "gasPrice" : "3",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "",
+ "value" : "1"
+ }
+ },
+ "TransactionContractCreation" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "45678256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "599",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "6295ee1b4f6dd65047762f924ecd367c17eabf8f" : {
+ "balance" : "1",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "99400",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "100000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "0x600a80600c6000396000f200600160008035811a8100",
+ "gasLimit" : "599",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "",
+ "value" : "1"
+ }
+ },
+ "TransactionCreateSuicideContract" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "45678256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "6295ee1b4f6dd65047762f924ecd367c17eabf8f" : {
+ "balance" : "1",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "8999",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "10000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "0x600a80600c6000396000f200ff600160008035811a81",
+ "gasLimit" : "1000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "",
+ "value" : "1"
+ }
+ },
+ "TransactionStopInitCode" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "45678256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "599",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "6295ee1b4f6dd65047762f924ecd367c17eabf8f" : {
+ "balance" : "1",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "9400",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "10000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "0x600a80600c600039600000f20000600160008035811a81",
+ "gasLimit" : "1000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "",
+ "value" : "1"
+ }
+ },
+ "TransactionSuicideInitCode" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "45678256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000000" : {
+ "balance" : "1",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "611",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "9388",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "10000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "0x600a80600c6000396000fff2ffff600160008035811a81",
+ "gasLimit" : "1000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "",
+ "value" : "1"
+ }
+ }
+} \ No newline at end of file
diff --git a/tests/files/StateTests/stLogTests.json b/tests/files/StateTests/stLogTests.json
new file mode 100644
index 000000000..888f6c5bb
--- /dev/null
+++ b/tests/files/StateTests/stLogTests.json
@@ -0,0 +1,3712 @@
+{
+ "log0_emptyMem" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x",
+ "topics" : [
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x60006000a0",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "862",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899138",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000a0",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log0_logMemStartTooHigh" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1628",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999898372",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log0_logMemsizeTooHigh" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001a0",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1628",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999898372",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001a0",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log0_logMemsizeZero" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x",
+ "topics" : [
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006001a0",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "866",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899134",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006001a0",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log0_nonEmptyMem" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005260206000a0",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "898",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899102",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005260206000a0",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log0_nonEmptyMem_logMemSize1" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xaa",
+ "topics" : [
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260016000a0",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "867",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899133",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260016000a0",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log0_nonEmptyMem_logMemSize1_logMemStart31" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xdd",
+ "topics" : [
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526001601fa0",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "867",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899133",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526001601fa0",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log1_Caller" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000002880000000000000000000010000004000000000000000000000000000000000000000000000",
+ "data" : "0xff00000000000000000000000000000000000000000000000000000000000000",
+ "topics" : [
+ "000000000000000000000000095e7baea6a6c7c4c2dfeb977efac326af552d87"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x60ff6000533360206000a1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "931",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899069",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60ff6000533360206000a1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log1_MaxTopic" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000200000800000000000000000000000000000000880000000000000000000000000000000000000000000000010000000000000000000000020",
+ "data" : "0xaabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd",
+ "topics" : [
+ "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60206000a1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "931",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899069",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60206000a1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log1_emptyMem" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0x",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x600060006000a1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "895",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899105",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600060006000a1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log1_logMemStartTooHigh" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1628",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999898372",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log1_logMemsizeTooHigh" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001a1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1628",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999898372",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001a1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log1_logMemsizeZero" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0x",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006001a1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "899",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899101",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006001a1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log1_nonEmptyMem" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600052600060206000a1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "931",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899069",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600052600060206000a1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log1_nonEmptyMem_logMemSize1" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0xaa",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060016000a1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "900",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899100",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060016000a1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log1_nonEmptyMem_logMemSize1_logMemStart31" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0xdd",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006001601fa1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "900",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899100",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006001601fa1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log2_Caller" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000002880000020000000000002010000004000000000080000000000000000000000000000000000",
+ "data" : "0xff00000000000000000000000000000000000000000000000000000000000000",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "000000000000000000000000095e7baea6a6c7c4c2dfeb977efac326af552d87"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x60ff60005333600060206000a2",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "964",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899036",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60ff60005333600060206000a2",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log2_MaxTopic" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000200000800000000000000000000000000000000880000000000000000000000000000000000000000000000010000000000000000000000020",
+ "data" : "0xaabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd",
+ "topics" : [
+ "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60206000a2",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "964",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899036",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60206000a2",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log2_emptyMem" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0x",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x6000600060006000a2",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "928",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899072",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6000600060006000a2",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log2_logMemStartTooHigh" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa2",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1628",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999898372",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa2",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log2_logMemsizeTooHigh" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001a2",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1628",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999898372",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001a2",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log2_logMemsizeZero" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0x",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060006001a2",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "932",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899068",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060006001a2",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log2_nonEmptyMem" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000526000600060206000a2",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "964",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899036",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000526000600060206000a2",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log2_nonEmptyMem_logMemSize1" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0xaa",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060016000a2",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "933",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899067",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060016000a2",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log2_nonEmptyMem_logMemSize1_logMemStart31" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0xdd",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006001601fa2",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "933",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899067",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006001601fa2",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log3_Caller" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000002880000020000000000002010000004000000000080000000000000000000000000000000000",
+ "data" : "0xff00000000000000000000000000000000000000000000000000000000000000",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "000000000000000000000000095e7baea6a6c7c4c2dfeb977efac326af552d87"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x60ff600053336000600060206000a3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "997",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899003",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60ff600053336000600060206000a3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log3_MaxTopic" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000200000800000000000000000000000000000000880000000000000000000000000000000000000000000000010000000000000000000000020",
+ "data" : "0xaabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd",
+ "topics" : [
+ "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60206000a3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "997",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899003",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60206000a3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log3_PC" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00003004000000000000800000000010000008000000000000000980000000000000000000000000000000000000000000001000000400000000000800000000",
+ "data" : "0xff00000000000000000000000000000000000000000000000000000000000000",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000007",
+ "0000000000000000000000000000000000000000000000000000000000000006",
+ "0000000000000000000000000000000000000000000000000000000000000005"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x60ff60005358585860206000a3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "997",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899003",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60ff60005358585860206000a3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log3_emptyMem" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0x",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x60006000600060006000a3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "961",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899039",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006000a3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log3_logMemStartTooHigh" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1628",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999898372",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log3_logMemsizeTooHigh" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001a3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1628",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999898372",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001a3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log3_logMemsizeZero" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0x",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060006001a3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "965",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899035",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060006001a3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log3_nonEmptyMem" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005260006000600060206000a3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "997",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899003",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005260006000600060206000a3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log3_nonEmptyMem_logMemSize1" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0xaa",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060016000a3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "966",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899034",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060016000a3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log3_nonEmptyMem_logMemSize1_logMemStart31" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0xdd",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060006001601fa3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "966",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899034",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060006001601fa3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log4_Caller" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "828",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899172",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log4_MaxTopic" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000200000800000000000000000000000000000000880000000000000000000000000000000000000000000000010000000000000000000000020",
+ "data" : "0xaabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd",
+ "topics" : [
+ "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60206000a4",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1030",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999898970",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60206000a4",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log4_PC" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "828",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899172",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log4_emptyMem" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0x",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x600060006000600060006000a4",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "994",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899006",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600060006000600060006000a4",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log4_logMemStartTooHigh" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006000600060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa4",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1628",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999898372",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006000600060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa4",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log4_logMemsizeTooHigh" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001a4",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1628",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999898372",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001a4",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log4_logMemsizeZero" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0x",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006000600060006001a4",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "998",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899002",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006000600060006001a4",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log4_nonEmptyMem" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600052600060006000600060206000a4",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1030",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999898970",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600052600060006000600060206000a4",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log4_nonEmptyMem_logMemSize1" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0xaa",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006000600060016000a4",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "999",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899001",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006000600060016000a4",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "log4_nonEmptyMem_logMemSize1_logMemStart31" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0xdd",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060006001601fa4",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "999",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899001",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060006001601fa4",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ }
+} \ No newline at end of file
diff --git a/tests/files/StateTests/stPreCompiledContracts.json b/tests/files/StateTests/stPreCompiledContracts.json
new file mode 100644
index 000000000..0f1db1275
--- /dev/null
+++ b/tests/files/StateTests/stPreCompiledContracts.json
@@ -0,0 +1,1674 @@
+{
+ "CallEcrecover0" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000001" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20100000",
+ "code" : "0x7f18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c600052601c6020527f73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f6040527feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c45496060526020608060806000600060016103e8f160025560a060020a608051066000556000543214600155",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b",
+ "0x01" : "0x01",
+ "0x02" : "0x01"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1977",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999898023",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "code" : "0x7f18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c600052601c6020527f73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f6040527feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c45496060526020608060806000600060016103e8f160025560a060020a608051066000556000543214600155",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "365224",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "CallEcrecover0_0input" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000001" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20100000",
+ "code" : "0x6020608060806000600060016103e8f160025560a060020a60805106600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x02" : "0x01"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1441",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999898559",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "code" : "0x6020608060806000600060016103e8f160025560a060020a60805106600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "365224",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "CallEcrecover0_Gas499" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000001" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20100000",
+ "code" : "0x7f18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c600052601c6020527f73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f6040527feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c45496060526020608060806000600060016101f3f160025560a060020a608051066000556000543214600155",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1376",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999898624",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "code" : "0x7f18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c600052601c6020527f73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f6040527feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c45496060526020608060806000600060016101f3f160025560a060020a608051066000556000543214600155",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "365224",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "CallEcrecover0_completeReturnValue" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000001" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20100000",
+ "code" : "0x7f18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c600052601c6020527f73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f6040527feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c45496060526020608060806000600060016103e8f1600255608051600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b",
+ "0x02" : "0x01"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1648",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999898352",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "code" : "0x7f18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c600052601c6020527f73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f6040527feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c45496060526020608060806000600060016103e8f1600255608051600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "365224",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "CallEcrecover0_gas500" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000001" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20100000",
+ "code" : "0x7f18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c600052601c6020527f73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f6040527feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c45496060526020608060806000600060016101f4f160025560a060020a608051066000556000543214600155",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b",
+ "0x01" : "0x01",
+ "0x02" : "0x01"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1977",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999898023",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "code" : "0x7f18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c600052601c6020527f73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f6040527feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c45496060526020608060806000600060016101f4f160025560a060020a608051066000556000543214600155",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "365224",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "CallEcrecover0_overlappingInputOutput" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000001" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20100000",
+ "code" : "0x7f18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c600052601c6020527f73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f6040527feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c45496060526020604060806000600060016103e8f160025560a060020a604051066000556000543214600155",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b",
+ "0x01" : "0x01",
+ "0x02" : "0x01"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1976",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999898024",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "code" : "0x7f18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c600052601c6020527f73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f6040527feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c45496060526020604060806000600060016103e8f160025560a060020a604051066000556000543214600155",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "365224",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "CallEcrecover1" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000001" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20100000",
+ "code" : "0x7f18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c60005260016020527f73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f6040527feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c45496060526020608060806000600060016103e8f160025560a060020a608051066000556000543214600155",
+ "nonce" : "0",
+ "storage" : {
+ "0x02" : "0x01"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1577",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999898423",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "code" : "0x7f18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c60005260016020527f73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f6040527feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c45496060526020608060806000600060016103e8f160025560a060020a608051066000556000543214600155",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "365224",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "CallEcrecover2" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000001" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20100000",
+ "code" : "0x7f18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c600052601c6020527f73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f6021527feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c45496041526020606160616000600060016103e8f160025560a060020a606151066000556000543214600155",
+ "nonce" : "0",
+ "storage" : {
+ "0x02" : "0x01"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1577",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999898423",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "code" : "0x7f18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c600052601c6020527f73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f6021527feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c45496041526020606160616000600060016103e8f160025560a060020a606151066000556000543214600155",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "365224",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "CallEcrecover3" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000001" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20100000",
+ "code" : "0x7f2f380a2dea7e778d81affc2443403b8fe4644db442ae4862ff5bb3732829cdb9600052601b6020527f6b65ccb0558806e9b097f27a396d08f964e37b8b7af6ceeb516ff86739fbea0a6040527f37cbc8d883e129a4b1ef9d5f1df53c4f21a3ef147cf2a50a4ede0eb06ce092d46060526020608060806000600060016103e8f160025560a060020a608051066000556000543214600155",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xe4319f4b631c6d0fcfc84045dbcb676865fe5e13",
+ "0x02" : "0x01"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1777",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999898223",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "code" : "0x7f2f380a2dea7e778d81affc2443403b8fe4644db442ae4862ff5bb3732829cdb9600052601b6020527f6b65ccb0558806e9b097f27a396d08f964e37b8b7af6ceeb516ff86739fbea0a6040527f37cbc8d883e129a4b1ef9d5f1df53c4f21a3ef147cf2a50a4ede0eb06ce092d46060526020608060806000600060016103e8f160025560a060020a608051066000556000543214600155",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "365224",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "CallRipemd160_0" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000003" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20100000",
+ "code" : "0x600160005260206000602060006000600360fff1600051600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xae387fcfeb723c3f5964509af111cf5a67f30661"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "934",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899066",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "code" : "0x600160005260206000602060006000600360fff1600051600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "365224",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "CallRipemd160_1" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000003" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20100000",
+ "code" : "0x6020600060006000600060036101f4f1600255600051600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x9c1185a5c5e9fc54612808977ee8f548b2258d31",
+ "0x02" : "0x01"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1182",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999898818",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "code" : "0x6020600060006000600060036101f4f1600255600051600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "365224",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "CallRipemd160_2" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000003" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20100000",
+ "code" : "0x64f34578907f6005526020600060256000600060036101f4f1600255600051600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xdbc100f916bfbc53535573d98cf0cbb3a5b36124",
+ "0x02" : "0x01"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1286",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999898714",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "code" : "0x64f34578907f6005526020600060256000600060036101f4f1600255600051600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "365224",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "CallRipemd160_3" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000003" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20100000",
+ "code" : "0x64f34578907f6000526020600060256000600060036101f4f1600255600051600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x316750573f9be26bc17727b47cacedbd0ab3e6ca",
+ "0x02" : "0x01"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1286",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999898714",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "code" : "0x64f34578907f6000526020600060256000600060036101f4f1600255600051600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "365224",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "CallRipemd160_4" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000003" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20100000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000526020600060206000600060036064f1600255600051600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x1cf4e77f5966e13e109703cd8a0df7ceda7f3dc3",
+ "0x02" : "0x01"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1235",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999898765",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000526020600060206000600060036064f1600255600051600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "365224",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "CallRipemd160_4_gas99" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000003" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20100000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000526020600060206000600060036063f1600255600051600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1034",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999898966",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000526020600060206000600060036063f1600255600051600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "365224",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "CallRipemd160_5" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000003" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20100000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005260206000620f42406000600060036101f4f1600255600051600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "32684",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999867316",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005260206000620f42406000600060036101f4f1600255600051600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "CallSha256_0" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000002" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20100000",
+ "code" : "0x600160005260206000602060006000600260fff1600051600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xec4916dd28fc4c10d78e287ca5d9cc51ee1ae73cbfde08c6b37324cbfaac8bc5"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "934",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899066",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "code" : "0x600160005260206000602060006000600260fff1600051600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "365224",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "CallSha256_1" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000002" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20100000",
+ "code" : "0x6020600060006000600060026101f4f1600255600051600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "0x02" : "0x01"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1182",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999898818",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "code" : "0x6020600060006000600060026101f4f1600255600051600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "365224",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "CallSha256_1_nonzeroValue" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000002" : {
+ "balance" : "19",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20099981",
+ "code" : "0x6020600060006000601360026101f4f1600255600051600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "0x02" : "0x01"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1182",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999898818",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "code" : "0x6020600060006000601360026101f4f1600255600051600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "365224",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "CallSha256_2" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000002" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20100000",
+ "code" : "0x64f34578907f6005526020600060256000600060026101f4f1600255600051600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xcb39b3bde22925b2f931111130c774761d8895e0e08437c9b396c1e97d10f34d",
+ "0x02" : "0x01"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1286",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999898714",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "code" : "0x64f34578907f6005526020600060256000600060026101f4f1600255600051600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "365224",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "CallSha256_3" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000002" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20100000",
+ "code" : "0x64f34578907f6000526020600060256000600060026101f4f1600255600051600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x7392925565d67be8e9620aacbcfaecd8cb6ec58d709d25da9eccf1d08a41ce35",
+ "0x02" : "0x01"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1286",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999898714",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "code" : "0x64f34578907f6000526020600060256000600060026101f4f1600255600051600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "365224",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "CallSha256_4" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000002" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20100000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000526020600060206000600060026064f1600255600051600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xaf9613760f72635fbdb44a5a0a63c39f12af30f950a6ee5c971be188e89c4051",
+ "0x02" : "0x01"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1235",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999898765",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000526020600060206000600060026064f1600255600051600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "365224",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "CallSha256_4_gas99" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000002" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20100000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000526020600060206000600060026063f1600255600051600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1034",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999898966",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000526020600060206000600060026063f1600255600051600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "365224",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "CallSha256_5" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000002" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20100000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005260206000620f42406000600060026101f4f1600255600051600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "32684",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999867316",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005260206000620f42406000600060026101f4f1600255600051600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ }
+} \ No newline at end of file
diff --git a/tests/files/StateTests/stRecursiveCreate.json b/tests/files/StateTests/stRecursiveCreate.json
new file mode 100644
index 000000000..983431484
--- /dev/null
+++ b/tests/files/StateTests/stRecursiveCreate.json
@@ -0,0 +1,7231 @@
+{
+ "recursiveCreate" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0007318879928543f66b36e58900a870dfa83312" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "001864a1fbee8126e530b9242353d9cb76b043f9" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "002b88d7e31f20b1cec3ae31ef8ae3f017820cf7" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "00ae33b99c24c45ce086aa9a1844fe8ed55ec312" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "00c3d96a0eaddf7975da5c8718c26d65de0de59b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "00eb1775a16c0965c299f06a0873e11825f915e3" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "00eb67f5e410e28c16861fea7a2ecc1e0011a75f" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "0116be8937cb591d6db17246c91dc3deb1fd0e1e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "012255fe8647bfe207603a62536ac6ae7a230ca9" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "014337758eb4abf60a8e458a97acbd8b47fa0c31" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "01619145d576c5b3130eeed16f29501f2773c958" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "016cfb16ce1ab4c15eab782e1ac3b0d7f5bb264b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "0177fee01c15eede3b794e761753c1f6d108b7f3" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "018b456893203c6e3a5661e7328b5a858904cdc1" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "0199dd91369b5ce0467b68d57beaf1d96fdc769a" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "01b26e834122a942828698305a84789ec47c0454" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "02391d38c9b4f03e9225ae5b28230284fa397a09" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "029f9045d1904fe6076c4dbe77bd33290f390714" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "02c577c9c1b247c0ea60b1dd50fa895c086e2f2a" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "02c7efe87a470a521338ba476a0eaf7a535c9c56" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "02fa5c7476f2d423f27ac8afa1e357db95f920fd" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "02fee10ca6c1ed23e651f29c97a310b1b4dad13f" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "033b61ab81ffc5adce16d365458629d9f3482129" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "03b685fb90981f103fde64c3bbb5fd701c84dd0d" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "03f3095f9e46a8ac62005c42aaccbc0fcdc3aa32" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "04110d816c380812a427968ece99b1c963dfbce6" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "04308fa2e7af944dd7008a7edbe5221a52e2bc87" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "0441738f9f0a045afd77a72ef8398475c1111471" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "0462dd089e0519c581654520d17763635011fdff" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "0473710fb4277459429e0c4a862ad3e4b45692e4" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "04929feafa156581a24d8a0bfe8154ffab39fb37" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "04a104904b31f401966da211ef40874d6e97ae46" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "0581dee4d5420c2f6b1614ca62a4d66bcf383d0e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "059ec3d5a255df8a5b592659ea5fdd963e9bd0c2" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "05e29ccc32df8edacbc5bd6fe19fb4ca02928969" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "0602479ffb0636a1ce0fb57bf7949cc978250d2a" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "060e7bcadd084fcf19db5cc1ea769550bd8f7508" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "065c627bc67fca3636da49c34994b6efb2adaad0" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "06c4341ea63b3431260716e2162ba90abd9628c3" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "0723789d0c7093f6e97c3fdeb1324a75427ca6e8" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "076ad7e168093f590a74f6fdce56b492a23baa2b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "0801871b468dfdcc2d3bc0c0d01cb6ee02afe581" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "0802fc1dc1a5dec7fcbf1d50f3d8a944099ad72e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "080e2ae63ad3891bfba9ec5200f4ba383209ecde" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "0891a47ead61f684dc876e12d5261ab614d0fa09" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "08d19f247ca974ee89d4f988cac4becf7a177723" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "08f86cd9e45cd0f821b6088ce2f1b3c0f70dba07" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20100000",
+ "code" : "0x60206000600039602060006000f0",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "098de34931d0d159e2631aee55524c217624d095" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "09957f64c3396f36daa03c68fa6c997eb7903df1" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "09986b78d02ae7c8eaa8b62053a3ee78deba79ab" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "0a1960fde1fc2010660dc9cdc299facac4502363" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "0a517d755cebbf66312b30fff713666a9cb917e0" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "0a9015286f76ca4fbcc33e74e9c414be9774a67c" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "0b4b7f08623d9b3d6514baf529399e4f1c0ad944" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "0b98f3276e76e9982d7f6996878ea5196fda62f1" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "0ba7f30a90b699e3f906bff7599b230890bbd56b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "0bec2514a2a40586ec75e27442352d1dd2bce537" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "0c0cd995ac9e488544723e3e8e90a5fed98a6958" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "0c1e13b0604290abd900eba3fb6b7560b3401f58" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "0d11b1966fa90191f6927943c476d36fa3a31556" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "0d1e5ab3b0c2d1ad5a562c123b7f01f4145074ce" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "0e0905211a442bb5838d2d6860f4f21e6b9c6593" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "0e639c40606e9329259d2f945f59dbcc6c5c5cfe" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "0e700a2aba22bd639abf05addbb24c53c3f0f3cb" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "0e8dab5716375707d97656230beb5f1445e56309" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "0eca69ecf3068082cff932c044fe39142ab6268b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "0f065de4c5c4a842f52a30fdf7b0162594df70a3" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "0f0f333b14cae00e0f74e1de336437d5644ae336" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "0f2fc64833681664e54ca74ea756c7233a05dd85" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "0f8f271215cf51a0646c8a60ed626515b3ddb739" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "1039c22c55420b0d7e65e6e6e65798f3f4c1e725" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "104f577c92f14f3684c13eb179b9969c05115604" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "1057c6ef671b124fc14b5641c167c6e6756d8cb8" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "1121c3fb4f490140339dabac59a62dd59a9912de" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "11895349d40ea4683803f8eb7ad1d2355ff906d8" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "11fde66f162bbb0e19d68f0c774c997d0165fa56" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "1209046d7bf46e81d8202422e630719c906653da" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "120e38f3899a4e2f9f848a82c7afee288d14e7a4" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "1236efbead5ada892f61e7e4e59faa143e3bc01a" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "128aabc28c928691ad3415e3c57010c40694cd6e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "12eed250610e4d59e841381dc46deaea3d9305b1" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "130d08c2381d23796ff403d8f1fbaf204d90e3b8" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "134c36c64db09ad23fde5b43a3a7a92d84dd5300" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "13911c90a6ddef5182a772116c1d9e98f27fb1af" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "141182812579a73e13dd878d8a94bb628143b097" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "1456fa2cf6376b40069504e491e64aa40484fe3f" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "1480213270423eae9d6b0a603541e989998453d1" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "149d393bffe9be2336e7ffd6a109f05318dc798c" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "14a76e43bc292a0e69bace56681c4eb50d8e52d7" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "15146e7f5a3d2db1c655ba9d8eaea6c62ca34496" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "1555dfd05f003c056dc219415443be1a502fdee1" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "157f8c66dd3cae32485b2d68a51c1dd7923bf91e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "1588c83de3fa7b22bf6aa67a4e91f303b490cbb8" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "1591af76c716952018e52e54c716e8b2226d494b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "15c4f7ebfc781a41226d61bdc0fcdc98fdd8bf45" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "15e75e648b604b0b8028f7955647eac6bc850088" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "161f83bac94d326e2a8debba84379ab72a14c6d6" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "1622e5aa3015448c3a7560b15a289d9aacc5370e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "1660ada72b0a07040df8d063f2f3f3fee891f1d0" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "16c5f61453cff59c6b7e2a690cd902b72208427f" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "16cab73035afa73268745a3c2937b551813c4960" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "16f5ee37c60dfd70f8281ac16cda47d665ef8789" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "1756aed6799c904988cc7a1dfabe77fcca058655" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "17c7a85a071c3dee708baeaf56c208752c362e56" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "18500d6a8e3e20ace9aeb507c213b6261b23f5d3" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "1872142d84f7023b181766b790a4487f4012527c" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "18731575d0a6339f6317c2a1b628d8a4c145328e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "187749fd89567f9519f0d50b4a19ad2600440e3a" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "187dea0407359c9579adbdf1ba9fad4a92fb358b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "188921ab89b5b8bcbe443676626e6012a1ed7dfb" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "1889f5317912e414fda653c710d2c17b7d5651e2" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "18934934c2f7d8b6b645fcc90460a966df3a716f" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "18e0cdfc5a23465cfb3566091849c044d2210b55" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "1963ac8fc10167891e91b4d3f53e09e0b7c9b55d" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "1a6bbe5380998bea238848b7a5927fa87e7b9fe1" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "1ab2ec9fb4e5d9d8cd15a1ad495ff314b97869c6" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "1ac3dd6a958d88e45c2c55d938dba74fa892084e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "1b6ec3b2772285abeba8f53839fd96de995c4bd1" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "1b8a6f09f8fc9743b59ddbb2f105034e32262552" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "1bce33a58c2741f74daab60067f759e9fc5f8c40" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "1c2749b3a6c574b21622761bef7274261597ef2e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "1c32901c93008d3e09928bdf3385f32ecff9500e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "1c6c53405b0eb8800a527cc5990fe3b259b50a4a" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "1c827d36ec915dae96fdc0b164fb7bc1be9467b6" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "1cd063768378c77cbcb93dab0ba4c345d76bb0fe" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "1cd52bab323ca2180a747d3c8b8405397003feb9" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "1d3289a828d2bb4a86cda52b7772e2d0d508bac9" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "1e1505a86f6b0fb5f7a4500cca953462cde929e4" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "1ea264b74c8f6e50586097e2e7c9a39419fd88de" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "1ec05c9f7c0ececff5088a06157f47f3e9dac9c0" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "1ec26f14651cc567ce691ce83ef09eced6b12a6e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "1f01dbf8bd02bed14cc0a21831e044faa3f66fca" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "1f1960aa296fd1f00ff131357138001afcd858a9" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "1f323b00b7be1e9c0713b080cadc05f45e5e7ec3" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "1f5cdfaf598bd8002997b576e9ba849636c8431f" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "1f95c6da6a9e0abe74900ec00388094d32d98a42" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "1fce5879444d729719c03b5af6e074b87a49d933" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "1fdfe5402a88f71bfbaf9c65f6df05b8eb6232c1" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "202474905af37a5074cfbc2d2dd0f2f205a099ab" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "2040d98a367ea817f76fcf8574d4df51234eb492" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "208d07e7177b2e975c6b6d0eb3c5566900b87dfc" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "2099c5bdda1d98ce3b99988d768fa9f812a21f24" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "21115fe08f7ec434d4ec27e8dcfdf31a6e50aa09" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "21190aebff29feb773919d8572f8cc825bbf7144" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "21368af8397276e6e4b284fe36f525dd323bd3da" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "22230d8d10e81e01450aa68bdfbee3c20d969de9" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "22affea985c1a1ab7007a55e77e80c54111708be" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "22df73cba33d8fd14fc985fccded670de4041f25" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "22f2f312befc07db595b5d9fcbc4caa7ee8df51c" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "23138c70217200a44c58dceaa4f5ab06470213a4" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "241b46962af48709f1a19739ffdc7bd3f0d2c7ad" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "24248d1242acc87dc331e87f3142951a977a3d2c" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "24ce22b6a7f4227e1e3a6c03c14d07acdb2ec553" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "24cea63a6f0ede9a0fa91907e841ba4174e1cd0c" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "24dd378f51adc67a50e339e8031fe9bd4aafab36" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "253a31b068a402910eb30758704b78c375ea349a" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "2559cea11e9d8fd293253a8ffada7558c9c4db86" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "25c0d5ce71eec198760c001497350ad83df55ea8" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "25f81565c6ac2e22d7e320168222450c2cdf4f6d" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "2600b9122847ee06e201ff6a734fdcfa74b2be73" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "2652f49b5ad98503231b3befe7587c231be8a5e8" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "269f24e1ae86f63876b0504b7b26e20483fa95f8" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "26be5205dce0ce433dca3602886578160e6d52c1" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "277c19a0f1e4f5e4339de4d0223fa254a6c8a5df" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "27b3a0698a207d5ed960cf71b1ee9fc54c229eb4" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "28313061667479bb25119ca3090cd25c4a99a20f" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "284452c049bb65ec77ed7502b19abf699127c21d" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "28cd47ab2e86fe040740206eb31fe193df7cbab4" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "28ce21f7f28c8a546bca1697ada45cd73473465d" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "291cfb4b02976ffde7f1f269a3e7d30940367e55" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "293f982d000532a7861ab122bdc4bbfd26bf9030" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "295882ddd91b2f92c43bad0a51fd0ef7af61e729" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "29799a64a736832cda536d687dd443ef3bc31e57" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "298b8bde7997684bfe4434cf6d24d50ddabb69b2" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "299528bfdcf20ff8e19a7a3fbbdfe98eddc2604c" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "299f80e93d68725830c27cb084265d0e634e4f77" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "29f147c366199719adcb2ed1d528c4f34c10dc03" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "2abef5958c8b283eaeec4557844ff1fe194e6cd3" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "465224",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2b5fbc2f7e76f6281861cb4282effb94d609844d" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "2bab1d9132d47e56f937ef50987cc52c9adddf0b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "2bb175c167599417f2192d9f926a5c648d17de8f" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "2c4a413bc345da77b2d07a17313b6d89aef2c2c1" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "2c748f96ae0e6e9b01395e8a73dfc351c46658be" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "2ccccc0744051db25927d850055234117778c1fd" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "2cd26944d7baa6d92eee478960d5778375862e85" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "2cf5732f017b0cf1b1f13a1478e10239716bf6b5" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "2d142ccaa1337198d592bc36ce7c5447da73f906" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "2d960addf6048f155cfaac4ad513f46429bb58f1" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "2db5e35091789102bd0019b4ee49bcae42524428" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "2dbc14a87a2b5a8b780e460dbe0083d8260326f4" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "2e070631694c093a9a329ec0b4a1cfa57e20ab77" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "2e574f7a4c8f0e80964604262ef68b3168fd31ef" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "2e83c90e7fa359705ed2138854a83a9145c27a8e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "2ea29d9016f2b1141475e4c3c62e031c0a908a07" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "2eabf4237f49d4cd44ec256436b99ba41828d36c" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "2ed524088290909f92ade6d5f9d9c24071c26662" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "2f171d1f2cf19f4a458b7dc4db89fa7cd818dda0" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "2f8ac479ce5baade6a63ecadf9599bfb0ecdecde" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "305773e25e157761c9d55cb7d9e24fc1b953a8b9" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "30b37f280d6735ee04239de0963b071f83c13a27" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "30c5bc3861dfc5a70325aca029ab5dcb2d72928f" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "30f51302b4630ea1b8bdcac380bd97d78c8f60d3" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "310782e2f6d97ef0abd4a4ccb75b401a7d348be6" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "311f9efa9544b1c8a8277c52e0f1ca47daec8c00" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "312f80de0869a8fed49c8ba843484411c47dd13e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "3174a074366bc04bfb7f2a728a725cb01cd575d3" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "317f31be5e04361b11b97ff2d6fc682030d8cd8d" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "317fda8ec45232a8259546a4ca8ebef16338d47b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "31a87a9e67b2728c14767de26753f205b793c5ac" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "31c640b92c21a1f1465c91070b4b3b4d6854195f" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "31e7dce7c8469a6dc612dd8c0a1242846d31c069" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "3229e332af8eaf358f44aad3a902a6c47f96983e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "32a48ace80773ad092de1d9bcaa00787353b5fad" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "32de9810bbf442f9209f994556bc9a7f7e6da500" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "32f9418411245a8bc6982ff71436ed2de87e3d96" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "331a1cbbb58594c3636c0e54de517c4a6cedc27b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "33207da78e5ef3dde6fceab85bee1b5bf717e139" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "333872ba7e8ce9c43e158b12a3d038d06672db7e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "33b82c3871bc89d9137c62af099a0c4e5911a047" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "33c85ce982d0996ff7313c1387ab93348a6777d7" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "3432c3f9f90cb61e79f39d310bdc6cb8dcb3a49a" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "34c972120d50fbdbb38ba536e4d61bc8f995d19d" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "352e4ddc3153285117254b1cc378d297b7a057b5" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "3539fe0192009fe1a9d35901b0ba951a59348a97" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "36630619f71ccd89ea6fba8b13099d1483187b17" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "3671a99d2a485b30fafa2a65f405b6b03ed32ea9" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "36a9d95fe0c701c65370560445c6a80b4e13c8d9" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "37609ce3799a1b75ea6090da3d014d59e5e7851c" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "379ef6dde2bc54ced45146d4907639ee7cf1c8eb" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "37f998764813b136ddf5a754f34063fd03065e36" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "37fa399a749c121f8a15ce77e3d9f9bec8020d7a" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "3820c20f3f8ee1b164dab460b05a979640a41369" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "38450559e7ed9b72c80aa00855b942f9bac1b281" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "38479ce52243f1a8b358515a084fb41533a723fd" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "3867a470ae1d99ccc7af287ed95ea4da4fd49e52" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "387b1112283308ce33f63062a7531e6fe0f3af16" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "38813e8d77b07f357888ea1a7805ebf52c59189b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "38ae3c2e0c1fa2eaec3648a2829fa362b5e01351" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "38c622aecb7e84ad4fcfc327ae9a1a17e2dbc36e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "38fe3b47fed5fa6d060bde66598bf5a773b831eb" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "3917f5ac4614ab7d126adf2f5b1d578f2b91c370" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "39457953215cb93e68bc5b351d63a8b7fd16031e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "39d9b351db53d59af4907116d594ebba910474f2" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "39ea196ad4678ac786f9ff4ba12edbb364cd1baf" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "39ed2d94ee4aae100b111c773d4f3b78bd4e9291" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "3a9d3ead70f9c3cdf9a64b25b5c1bf765fe09fec" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "3b7465c98051ca273d8909857047d5dc5b022af7" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "3b7d7653d3a7c2712d08bd29668163cb775c74a9" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "3bfd62743dab66288fe0b993d893a41d2dc3fbba" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "3c4a4ef39f21e45a8f56e5c8bf8bacfaba78a777" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "3c7c94fe8e900964a9885a19e09a4ab80213c5c3" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "3d082c9477c05d23447d1682257a9d0ac1f948be" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "3d64e9c7cee7c3d41cfbeed851fff8642bd0200b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "3d7b61ce014d1cb84465f1f908a6a940fd991b39" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "3da1b91d461c3220510e60c0c5b87be635068740" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "3dd6e0baadd05402f490e3030ef1970d884a1caf" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "3debce965330c2da68edb1cdd3ac380d5ce67b10" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "3dff39a90e67e86536dcc8b4dbfac04da831e0b5" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "3e0506e272fb9d9369627282cd76a40e4046ee84" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "3e1b0d3f5819f63c9621ba4d4af623a7b89b99ae" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "3e3069deb6f503bb8bf155eb2f89801140831f5b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "3e85699a24243e147ec809e30761d92c0d21392a" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "3edca986feba79717853d9b91595ae61d953736e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "3ef5e42a0012b430169dae579f8dac0f6ef5dc38" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "3f5bf6c71c4fae1a91c1cca72b539dd83762a716" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "3f8bd9d9410af417dcc6969b64096380e1a6d0b3" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "3fabe5e3c3a59fd322cb638dc5295d1e94cbcea3" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "3fde19fb418799c0e1744b322314c17a863a0c9c" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "401f65fb53496c7746dc6477f6f9d67246965d51" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "40652c9cf91678111a21c62d7206ffbca3d47c9b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "40e0cce7d94ab21453c5576f30a598cf9fa80e1a" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "411456908355aa037314aa920e8afef3632503fa" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "41493b8488a0ae34cade12733e8df93a87f3ec7f" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "41eeae22551bd18167a31036b363bdcec89a7d9c" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "42bbb8e2c7347e29f3a679e4cc9d1ca75319fbd3" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "42ea619ae1a90979837ad2137458d991ea0613be" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "42f56890357c304762f1c57171cef30f044ea09b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "42f8c6079f5658fc8dc5629b63684f278acb7648" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "43b0edac3c2c58f16fa2380089d841c420a14236" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "43ec9b975f37266d0ff7f044581db559fb9376c4" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "444e8af4b323407d02a7f96c209b712a65c6aba9" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "44b329f4eb8ebaa00d731472964de821f8e53a26" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "44d13c51fb706efb7394346b00debea9ea46e9f3" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "44ed3a04032bf3585faf1dfedb9806eeb8345809" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "44f344790e299b22484749266ea59bbcd58e4b0e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "4582048e819b7d55b3c6f47e46ef8dd8fdd12038" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "45eb1861d0701efb338468964c2495db8e7e3411" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "462cf0e5071404ef569338a6f0a5b113d64a11a2" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "46aa4a5c336dbecbabd4cdfef3b9fa65a8a12a15" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "479544e8b67a7e82120d3c5d7869b4c55f4a0de3" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "483940025f2d36cb32e93ed80caa41f15487ee7f" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "48e958f074c27f1d190e69ef8c01f86931b278f9" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "49a01a2696857efac9ba53c2705ea4ffdeb30419" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "49fc4b5136601d856188898008375b9c1bf5897e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "4a0ec2620d55cefe3e80960f83ebc81219ebabcb" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "4a1edf2110e4ff29c69b835bdd375ac88525dde6" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "4a466c64765157e1a9dee46e1a26d95ac2664c4f" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "4a635e63aadc395c1801c73640f256250d209b25" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "4aebaa9fbdb040e8037e78fc37785f33dc3cafec" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "4af174d239e86ee19d40026eae04486804602061" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "4b2c0c38418eb142d686d124ac5fcb363b061fd7" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "4b414d48f3871bc957751d5895c96f090b509bbb" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "4b6dcb9105adc3ccc34c6c180e9e2212c1789975" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "4b8558347f669cd9b50f70cb501cdbf05f93b575" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "4bb5fc5d686cfb132c177aee8ef426e5de98cc6b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "4bdd7615ee906a0c88233acc5816b4fdb4656dfa" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "4c0cfb86a402c70e6b110a1237d10c7fc7fe9cd5" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "4cada4d5773385e68f4ff1efd1a23d75dbf1e61c" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "4cd33b31663c159fbd73cbb32f616eb46f7b18a2" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "4d47d935a3a4a4618c67f337a0075d26d9c1f852" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "4d4ad735b52df9e88fbebebac2de1ede991f9994" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "4d7a1e5009218cf5176a313f6922c3ab01d4970d" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "4d92228ffbe5ea89389a34a7086e4420d61eb70b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "4dbe6269722a6063d594dfb65eba1f2a10488963" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "4e36ffe7590f8dd7fa9c4c03cba3120674814abc" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "4e4ad0ada6b3beffa2436bef1f6a8054f4476be8" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "4e5cd86dc5f716ebbdf6ef572a369c227986bde4" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "4e76fc5e619a4200846eecdd5545b39499debb10" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "4e86f346747b828937501ebfda05b2b8fa16f87a" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "4ebc77b7203cce293550d92b2b5587621cf53219" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "4ec27065c52d294799b93700dcee6e32778f1b18" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "4ec674e8eb6b890cbb7df926def8fbbb2a6bba70" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "4f14a61b9f2f99e50b719f1345e76339f7618202" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "4f36659fa632310b6ec438dea4085b522a2dd077" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "4f5af8eccb582ad30e2702d07577479599461c54" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "4f5c55986b93d742d196235aa7329df2c8ae5562" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "4f86da4fecade6017d7f15e30d8320446306870a" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "4fc34bdd654289653ffc904f86ab2f17bad8431d" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "4fe8f4ad85487cfe365ca212848f7c970c21e135" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "5038bd4d6b5b31100c52c85ae3294d525596836c" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "504ba70fca5091ea426c964ac631082e4ad51672" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "50aada85d21c462d9c2803fd3c22beacc61f496b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "50dc3dab5836e25872ec87bb2bb30ab57a35fb0c" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "511b33319d0f7df487e07c4f5d149b27cecace46" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "5154569b5138f7c1b77d4434860a92ff5707e047" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "51a578dc2949f3881535733a5b1a7b5bd308215f" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "51cc4a0bffdbdd8313ed94ebfd5524e8200f4876" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "51fd18c9ab9bbb67c27373e8ad754e253e09dbdd" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "5216a59dcffc6105f9b58a0b397baad604c0dfb6" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "52b774b5fab1f557024bd4a7cbec4cd014b81557" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "52b90967c04ab8adba7c6908b04eabf2c00bcf82" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "52f1ef4cc038ef92d0c1f9e7afd3dd3cd0c25b38" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "52ff6062b4e65231065d5579f870b7f1472a5853" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "533069310b9741214f30aeec58be9d19f40161fe" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "533a4a1adbae2d561beb729c53e46251ab3a407c" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "534d2d9ab80a99d598de600ac2843f751e8bef3a" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "54819bf1efa86437d2f38b4211bdd5229247d9b5" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "54a1706bea8f61e354b5296afa5a9f488f88ba0d" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "54d1de66a65ecf30d79037a8c8af99c633113516" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "55010017736ad7e8e14327cf0230ba4c6bab0450" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "5503d35e96e76e02db22c51fd7fd3d5c0667c885" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "552e158ca0fbd97f7b3c6208ad3f956a67c8df78" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "5555d9bb89b76deec0c8c0cf37dcbf4b9e3449d1" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "558fb0163d7794abf1b241aa4728390028291ce7" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "559bf1337f14e89aee38a9859ec9bf8035e8f6c1" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "560d5f4c8933c5ca0c2c1b4f3e8b22958c9d7cda" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "569e42b9cd8d79ee5c5ea9c68ba948b7b4d8d84e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "56cb9d29e9be519d3fc1cd21fcae7750aaa8b845" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "570dce0f67e367a085e51a47d6c93891a82d452b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "57cb48688d626a12fd4caee130b11e1b06ebaacb" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "58cbb2379b1fdac0a036bf75bb598e7d4fa232bb" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "59ad59b53c0d9bbdf0ee0912732baa43eacaae99" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "5a18f1d5e443321d54d1dafb3e3b5b6f2899378d" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "5a5e4ae2fd570b079f26dd7f8b9c90456d4b11c8" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "5affb7ff218092cf60bc1ba4b32ea65a32cd6844" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "5b1718e3af89692315a673b5c134361408069b00" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "5b2ed45c5376c8359479e1b48f8c07437ec78336" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "5b4615bc4b0f10948e46f967ca6e64cf91a7753f" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "5b71d8cc27346cf6d64e101aab9c88dfd58d26fc" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "5bcf5f7ba278df5a31f48a5706e69816727a6e9b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "5bd96b317d4163401c9b1a2271c03b9439e73e6e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "5bf1ac936d2312daf08e481d85e99151cdfdb9e1" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "5c0ddde0773ca1b8f9b07ecdad9f47f2705640e1" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "5c45b1eefac6061c7713919b34f5dcae9d5cfc7b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "5c70cf636b26ffc099fba8ddd5093e95ca8e7782" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "5cf45d08c0b55dd9c34cc4cb718c917333f2e9f9" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "5d07bd78606705bb5c62fd390123b4e45f7d74d8" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "5d11f35386d10cfa7121b02056d97dd932659943" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "5d3292b79851f68d3907a550dc1a0b569d603f66" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "5d57e28e16bcf33b37672eeb891b29c481e89120" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "5de8956c0c99e2dc6715201b3a9e1d5fd53b2dd4" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "5e0ea0c533298d20ebcd19482a8b1e1854dda425" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "5e5a0b9c4c36067c8730abecdb29ba97aed877a7" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "5e74c3c0f3bc39154407e9a3c55cde944d1ca04a" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "5e76969932c5d314142b23c555af4625fa6b9343" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "5e89d5dd43fa9fa54381f234d1f7251387a0692c" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "5f1703b93938752face6e4657a90825b77f455da" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "5f3f9c388dc0c9c01a5fd540bf9eb714a47fc5c1" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "5ff4d4daf0a832422c4675a77720abbfb5afbba8" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "5ff4ef866c3ad4102444d020c1d21c3d35a119eb" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "60a2db26238d52510209c569dca17c1f41c9a544" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "61144e43a08b3852bcd531d13f0485743bd835a3" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "6123d3be4335107712685be2d575958b17501067" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "61306db8b4ac256266cb379b5f686e25cc117590" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "614037f9a7be1ab2131d485845f297f2d62d569a" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "615a957b818ce70fec123daafe552c482c59c5a8" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "6168c5e3b7d7c870e3e7eb53b152fcb920c8e1eb" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "62123ac69c46a06f7e3644b0dfcfcded535b8727" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "621ada91fe8f65407ac963de8e75d88d4c388cd3" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "624a9bd6345be1a95c7fb509ca4bb77d05138adb" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "629fdbc407b70b57eaa1523ab12c5178e81a5d52" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "62c01474f089b07dae603491675dc5b5748f7049" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "62cde2103198f54d31cdb9e9495fd7e1243c2c27" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "62e75c838a732abab87e1846f361721f03e7d973" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "636b02091904e5b452d19455f484306b8fe62dd6" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "64134c8f0ed52a13bd0a00ff9fc6db6e0832e39e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "6454029b19b69bcda3ba156684d58283636dea40" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "65e3776618742b90f1d9844c907b276854869abc" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "66e68e1d0f65b4379c2864f5228d98de265c5e30" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "674840a9e918ae6b7560a4ddfb60b96a32636ba4" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "6792d18ead88bff9193e50fa12c02779f2a0f4bd" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "67a66435543da4130940ccc47e3d9d164db65fd1" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "67df3bc5f86456f2bc57f75c99a0389bca7e5850" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "689a40b4f540d145f6dc4ba4079e17f84b650f9c" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "68ec6ebf20b30a31b09c7a35d847da342e24a3c4" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "692a1a4da0b418dd701f5133e2b3c5686015a3df" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "697f8deffc4b33738f1dc02e792b5cb4a37ead06" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "69afd0683057a214d3bb3cc7d438961cf8c8b200" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "69fd2b9233b83e54861436496ad6b9fb28afaf40" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "6a22049b6339e13438521842386a7118d6a1a15b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "6a31cc57646f3d9ae3b63e1f604dde04d1ba52b7" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "6ac56f1ceee102b85819d789e6b29308eabc373c" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "6ad37e86c8d4b961b0302ebf0a540ae83f3679ec" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "6af2602221d2477af828ddb2c1dec8f70a24abe0" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "6afeffe32a56293f23d655a1d1b2bf31d616c2ea" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "6b0105812868d533882ea4f08bb628e5e9d811db" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "6b5ced188780878d8a72b3e6f02618db2bb97584" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "6b5fe85d1513c1a29fa825a343db7a80558e6de5" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "6b6945d5fd5172355825871803b93e57c5040653" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "6bd29846f9fdbf3efcd3c5f3beff837ecbe9f4cd" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "6bda06aef03a04b8eb3e4c7d1ef001fc806f5f6f" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "6bed38b822d8823a2cb71883522f932cdde95b0a" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "6c14bbac448312636b86fe713185cf7d8ea6f1be" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "6c3bed6efc677ccb136c0d886a6f3fdb375798c1" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "6cc6da179301a7ec4290cc0a5860a42ad188399f" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "6cdf4bc6759fe45be60aae1cb72d3fc2bb7f2d23" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "6d1f3f15f36d76d52d65b1b78a4ac85e91f33d25" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "6d27b8cb6b9af8a56fca98f13033d15f10f66da4" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "6d33e2eaa419844043bc41073bf3a2bc0a6c1b1e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "6d9834013a85a25df2e3dead1986d753457d7b67" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "6e0a20c94065e338c7715046a320ff4495b4fa84" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "6e24d18a80aeccbace499b6d26b655633c0bee99" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "6e2da6b24262f419933bd63b03d470ba019350e3" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "6e53f8efbbec77187f733cb053a53a28e14ade81" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "6f257471f06ece199232aaaa082d2b1ae7ddb483" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "6f3dda610ec5a3722ff4ab49d1f215dd26bd8ad6" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "6f562b4994dff65756e316febb8d5a5b99e11420" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "6fc7016fa33af287b3b9cacd092c26bd9a054569" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "6ff9622ab3c22e4357e90274d00291c527991d21" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "702433f6bfbd76274ec1bb641c4a0428298487f1" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "711b5163728968ec016a924238f743fa04f2d11f" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "714213a080e1d2988acadbfc5e441df5173f81ba" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "7161527e54370ad8fe44bc83d692b10b9f9b877e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "71a2fa577619a37c2e2336bb6c20fc1af193860f" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "7213c423e1db8af095bd3cefb15e43c6067635ee" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "723bce7438e7c70d113e954e9aad5dfb4551dbff" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "72969d083705c924922b857922930f2087426ca0" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "729af7294be595a0efd7d891c9e51f89c07950c7" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "7343c0aaebc045465ffebca00e201c1f554c2eea" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "73c85788bca3bc1fb2e9b3056c595a4a7b3d2e46" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "73f9912db6e86599f256f090dffd915a845a9631" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "751c9d6e9b6d91897ab1754b15b72712953de9be" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "7528088649b574b14d14f4b5ba45285eb8a78ffc" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "752e929cfb45fd739923f562b146db315b8cc4ca" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "754144c0c9b9fe7f9a8e40df23f3c315a7e244bc" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "7642513288c9da66960a6f3df0c156a8e1dcb119" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "769277251b9d3f0906a338f156238b159bc126dd" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "76ca5805dcccf57966da8489d1720fb8c5dc4b81" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "76ea1b9309253b5c03bbd6e9fca6591b51fb3785" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "7702eec59b0ee531bef08c14d0e6c89e7e43ebac" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "7797a5c4bb655b5ea51bc966875abb3b19c0d105" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "77d724d278fa787544189c4774f03849be2868ef" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "77f14e248490de6b7afb327c0f013c54ae31d2a6" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "77f263b8c785ec73f9f77dd11ab64fb0089cb164" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "7845e6c6f5d014cabfeffe6d4d9d18c547d00fa7" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "784c21d8eb231135ac99a64dd2ee334b045043ad" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "786102f7205ad86bb77b14a1b80d8b26cbf3562b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "791812110230af4583a4a6dff7eb425b0b0dfab4" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "79225179187b35144fe9e8505cce2bcff3986ff9" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "795d6e09eedae3febc172169c017fb67aa62efbc" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "799b6226b099fc75d1fc2cf6f833bdfc1fe63e48" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "799dcaea1d20bf1428807757a84d6792798b74cf" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "79cf9a7b86c0a7adb03ecb8967d70413f21b925e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "79f2d463ce2404b3e77db5dea5cc19d76ac223dc" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "7a315595e01d6e16134063232a01395187c9650e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "7ab73fe69000d4087d0b9ceedfda0af8c4fe2d2a" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "7ba53872256e6762bbfdbefb1bb80b26f94df9f1" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "7be1a5856ef5951cf1991b57c00f73939c7030f8" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "7bfac062ec8fd11810639cc02f02aa8c61c6cfb8" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "7c26d9c9b73a75f1a468d06bd69e08f4d316845b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "7c41aaac568600537f36df0e35cb625dfbed75a7" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "7c7d893aa4fba1deebfc9a5a14b27e2ae7f66403" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "7cadcf3f4031ebc2bc85040ea16d1ad26ce1704a" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "7d3b079a8306f7cc89f1b9b23319ec904e3ad853" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "7d4e21638e756b9953576f460037cd702d10211f" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "7d699e5ea61a26a7f677478cc79887e2f27ab345" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "7d8dde5a13af888557ddd5b931dda20ae59e9e23" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "7d8e57afa6550a1be621fb6c083aca311a1e229c" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "7e15566ad3e90f3c4c12c4d7fdb17e12c24da66b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "7e2a31e29b84cb193202609dbd86ebaf9a83c119" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "7e2bd10d506af5eaada030590c8073495230f37c" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "7e44d26c7ef8dc51a45248573f6a8e5a9f91a0ae" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "7e9f915d9417cd7bc8220546680fa5eeb73a2192" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "7ebf86bf849b6097c8af6dae10c52438538a0711" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "7ee27699bf52e4db7f72b3f2591f48e8ad7972a4" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "7f0506a35713c6a2c68152d15a4bfb1ccaec98a8" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "7f16eb03b09934c61a424e6a1c4649f193d157fb" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "7f3d23738538a34184e3cf16506685cf0884bac5" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "7f57dd2b577f0d5cb1fad7bbb2cf8f07ec0f0199" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "7fe4672c6fd2a05c7a91676e5ae2e75ea197567c" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "8069a4fb09d35f100d18c98d02ec1bfd997bb893" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "80a784f83657ad12a742b94e01c3bbaf3fb2c6bd" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "8135c9c23bfa97243ea79214772816339552f835" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "8142cb33b22222bb9e39a66b53af12c6ca0b5375" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "814a465f554f949e6e2a6878539c705f319c627d" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "81b26e12027f5df776edd5539791e683dc2e57f0" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "81d6578dc3e3c0fb07a8d62f66c1eaf3b97dc2ae" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "8228837a1a7d0ae41b857d852a8dd6b7c6cb3e38" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "82afbc3f6dba388dba71ee35f56ea772a53033a8" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "82d03794122107972c0d075f16754791224b507c" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "833bafb51e8a34c93f3100430fffc5ba61ef95c9" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "83602911153c9c176419a17276ada844bb932527" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "83802f999d793e8985b916465ccf6050195c0167" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "83abf69971313b011ee30466e8f703a460400557" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "83e3e5a16d3b696a0314b30b2534804dd5e11197" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "83ed885c9759d5524052681a5602616a4d565e87" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "8405a655c77ae3ebef4410c924cba9ef22a57f42" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "844301835752f15f39550cdf531e07ccef5d133d" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "8507d90ee605e59469a35fdc78e844c59894e003" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "857109cf04811d5273ec3af3f3d3bb56e93d1dfb" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "8692f270fea1b23b492dea1755f48cdd1dd78534" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "8703df2417e0d7c59d063caa9583cb10a4d20532" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "871986919b8ac4032193739eeae09c66765f0f15" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "8719f47f3dd875955760868a4fb23f761cf7d4ad" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "87946e396d4fd04d02f117adf25ac427895878b3" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "87b02d6f0e02d90fb05adf14ae74570ea8ca6aeb" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "87b27e4b436adde9bf724b4889980331dd038d49" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "87dbe63fcbb0c90d20021f9c01a03e7d94916b3b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "88a16f4f893665cf06d9ad7a7ede8d9cdf833b7a" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "891c7f214e32206e8f497fdaa7ee419e2e8f3ddd" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "897003bcc0313258e7a3517771982e05e4cfce1f" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "89e81283794cb458b9590002ce69ddba3c976a42" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "89f02008028773d99248943a6bcb14200f4509a0" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "8a05aa8ab787526a0591016c2aee95037b8a478b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "8a2cab44ea3d5c52c704f060f4088e505791a57e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "8b0c28ef1527a918fc7dc134ee6c00f069c7073a" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "8b0dfaaf9135721f01f3712572ea9963d70f49c0" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "8bbe1ac3ee5866589a669dd95744af5ee83e1b72" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "8c25b51ae5745b82c7b489b8fd4a9994b9679a0b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "8c2e2a704d809931e711b89162391f2dba837406" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "8ce9124341c4ca3c690b29f3575f3cb9833c8c3c" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "8cfda5300d7544327e32aca175840f90860305e7" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "8d7912a42951e7201c8854b98a36e4203508c3a2" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "8de072b1fc7f48cb2a42e7ee579a462e50e4cd8c" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "8dffcd74e5b5923512916c6a64b502689cfa65e1" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "8e1320b630d8a411819c16dc0edc2cb77ed8049d" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "8e15b61b6735457672c8d4809e30ca7877e9fabd" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "8e1f5c577cd5a404507687ef379cd1e41c4a9a9e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "8e4354916a56d367dd99d3eb120e27a1d8ec6e66" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "8efc24fec9b67ce053a55abaaedcbbcc64e97eaf" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "8f55e75b453fbb3071e4454119a33477c6028788" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "8f75ec2d8d77fd6a26f4c01f7b0384bd60418874" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "8faf239455a012d6ef377a83448c8185466f8511" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "8fb5af158980be77e5d137ab6f95000407041099" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "8fb5f5dc4d66ea0233a652230d44299718cb9f9e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "8ff9fb732fc13f492704a9f47c47db4e877f6dc3" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "90344e80aead27d6b007ee73dd8fd8169f870f51" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "90f8d2eba99d7e50525edae64a61a28526eef894" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "9137343457792227d68316f6ac0bc3518a7702e3" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "91aaa30b2bf342c6bb6a315251ffe5b7e123bfa3" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "91acc7d4c4cc7affac116157a53f5614959485f9" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "91c87b19dcd811fc5efc567a022bca52d5e2e252" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "925cdeaf40df0ac82648432e65481350417fd848" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "92bbf48cf4a124ffff047cad76c82db1a1889803" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "931543d59701f1a123f3850e4c6e4b0ea097ae5a" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "93840036a3c19b1e91ba0ea10f95a5041ef61a3f" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "939023fa69f246b709a97f16c37367e36267828c" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "93a5ddc7d7b2a2bbb7a61086aa6fd0cc9e202b0d" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "93beac08e1b6f1ac32c5ee628bc4356feb5e54ea" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "94602cccae39d50fdc504869eff546d1678f0ae2" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "94bcc8632137dd2d666003e33d1e7c2fdd6e95e4" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "94cceeb51248e76f0fa711e92986ad36208f6e93" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "954933598dcf8e04d6f4ae5b311673409e85c809" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "9580d4c2c6795fcb1ec84bf6a58b873fb2737788" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "95a4d7cccb5204733874fa87285a176fe1e9e240" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "95f36953203283bc9358f396b627dc79480a8ec8" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "9606aeadd83c5da2a613b0e132f0a6c13cee43bf" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "965025b3b611003c82c8c9b69b35b4c5444cde69" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "9663275f953d54a345f3dd00e2eeb0f156710129" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "96f4278992ff6da5e8e60456279d9bc5d1f7a845" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "970e2fc1f55b1e2b214f84e155ae6a9403f891b3" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "97316b1fd92c5e6611acffe79899064fd9274c8a" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "9747756fd264dfe7fbb2f46aebb3e9b084ccf45e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "974beeae03d1860c485c0dbb68e5413317770b16" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "97a3956189161fe3d52554c2a599bb619983be5d" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "97b61770815f0589776243ec8ffa365b86548b28" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "97c99c7f158206d19196df8d21573126569d918e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "97f0981b0a6cb647dd7b11b52c92bc1a3206d2f5" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "980410833d9ce53a0f944ccc629032fb0e6ae6aa" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "9848ce910f5874ffb5cad5fdc3507e8d54fd668a" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "985e84916da5ee358e1c119c9b12ff133da52d29" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "9862b64181c8bf5bd53e51c5f596528ff82bf652" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "986e30c8512ac023f09da460202322a88e98aa66" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "987600e63a25755048e018d1976d8ec4657f359d" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "98ae7604effcc8bf6accb109ebf78fb6f5dad01d" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "98ae76bbf3fe4b779df55df06eb0081ac95d660f" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "98b163f2929e5c92709759e3215879acf32a3a98" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "98cf6cec29c58634b6022fd1e8f54f912921eef3" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "9917620c3df2e3cae0f0e690b4da82221bc26efe" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "9985ca2474151f5ab79a388ec3b0d6fbf42da1fa" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "99b2fcba8120bedd048fe79f5262a6690ed38c39" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "99d6d7fe1a4f0f7d92837486a1f9d7dd500edc11" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "9a0ca249b7e4f00f62ba5230a602c3233895cee2" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "9a0fa2b2dd4993b5ac3370b4047f5e4472121674" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "9a2f4d9e7fd12bd7dd8141098bd3363bb644f068" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "9a45843cf7ed63ab79f7df4d2bf80512d259b0c2" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "9b0a69ce744a08c595426d7cfa5fe5f4dc844a25" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "9beadb15fd4fe1f0755ce82dd160e1a798544a1b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "9c5fc050311de43f7b7d9a66e8319ad3c051a252" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "9c89251856283a8e3aed6d801ca965fdc1da4aa7" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "9cb15938a825ff7c17ae775b6454730983522906" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "9cbb5a7f2afe219ffb9b787065cbd94ad44ebd24" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "9ce1b776e1a050af28b1034980a628b7728b0831" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "9cefc7e38d2a714318e5c36c3c21b226b10218e7" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "9cfe89d89bfe28ba95777b6a90ac7ed86b0e202f" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "9d0e24467eaf9b797b9e3f6a6084958889592ba8" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "9d9fcb724db6738e2ed07f6815a0e5d45b3042bb" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "9deb7e973e3567140c51750e92d7c5091174f506" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "9e30a8e67c1dc0ddcbcb8c0d957101801fd250cc" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "9e8fe9f31e954787e0f9d01b4a7a0c8d3d320614" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "9f28528f2db498c3a0e79b15b97d3b3e9357e942" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "9f42a00ab7bea15357b54e16867383fdc02e7060" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "9fbf90147bf6ca022818372bf38637738d553552" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "9fdd9d67e3e2c78c419e3ac9bccc7322041c3b1d" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a015c57718562f3839cdabd7d4e9c86f1a321a1b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a02b80b54ccc306e042c286172ba903dd53fa4c3" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a06ebfd07c3daff1115b82d67be5bf4079ef6ea1" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a086d90b189bda22a2ebf3e9b7092f1782e4fe84" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a0ebd1b4fc0821dde34f102f6030fc9c40b29ab0" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a1230890b4634e4461d6295fef3b4ca6d8899bd4" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a1ef404093a02445fe14243e853a641c23ecaff7" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a20b30a1e7723ce15f80e9706fe9c1ea05170a2f" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a24089bde6e39fea0d157ab9aa4173882e62f39f" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a2442dd71a4e937fd73ff383067f97ad4c83b4a1" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a301df371257a12c7bc93194ec045d211a2d4359" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a30dcb9cfbd0e8c874e4f919dbe71be3545464a1" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a318ee3c41da839fa1002dba1f9a140274ce59e8" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a31b0038c42665206876c410caf02e67405dcfff" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a31be87c0ce167d8e9380a34c7d5004e42f37840" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a3396b3bca8473c21f9ab1fca8a40ecd580bc625" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a381c1eb58a73d7e7c8b857fcf3a1b50c6116e1b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a3a80c15cc0e13dd1aea5949c48ad5b120a8d831" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a3ad081c8f3b79ad20285e881e0e4d011efc012f" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a40a11c1f943538e64466de3b3bf8c022b883094" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a4202b8b8afd5354e3e40a219bdc17f6001bf2cf" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a479aac07f3b83ee401944a36812d665f54ca6f7" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a4a5e07598b0d6a40fe62ca88813b63a1c02710e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a4cd6039bfcc6295533a985631a151bf2e0e8b21" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a5303b50e97dc17384209bdc3723ddc6eda7aea0" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a5552ed8dae24eaed9346af3186f634d38ee9aaf" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a5ddf08c7de55ca258e346fd1acb1b71cc2f8829" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a5ec829bcc187b6d19e825b5b6f12f86f81cc063" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a60724458ce6cca04016e99826fff8c99c32e3b3" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a6495f085bc30ac47e89a9a700e406e26286c3f8" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a65929129c13f2405697b704fb1c840987ad36f1" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a65ece83e15c7320aa0ef7ff2d69c2ff61fde661" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a686b20553a38e866228ce003657a71200957c3b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a6eab9c538a79d9ffeebc5d4495fed68dccacbd5" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a71525ab6694ead3c1be0aad07bac06e69192524" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a724835568fb5e3986c1e87331a18b6628b73e25" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a7547a96b2c999509ae062509a0d426fa46ade62" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a770dccb354eae253f170825000386233ebed231" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a777e559211613e73d9d0cbcdad62c88957d6f25" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a7aaf603309127956371841badc44b69252d142e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a7f111e1b259c9bbd4beba8ebab4dd6d35bb9ee3" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a89361425f7403ec9e757b5d1a31993a79189a34" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999434776",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a9647f4a0a14042d91dc33c0328030a7157c93ae" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a9ed1d8a969237243d26f8728287cb3eb8730662" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "a9f73dca799231e385ce5038c826b03eff0d1145" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "aa6cffe5185732689c18f37a7f86170cb7304c2a" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "aa839cff1f78242d01a33305e1d9973cd7c66d4d" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "aac939ac7c11bbbfb7f4520d14442a2460a51e87" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "aae4a2e3c51c04606dcb3723456e58f3ed214f45" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "aae4f6978a8eb4a7be406a2a787d31dd49cd551e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "ab118214a2227c79eab2680df0a96d0ad67dafd3" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "ab1b93b6a83c275972ec2a6b513c3106dda84f47" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "abf67dec2d1ec31dd111c2f1135818b6af86c662" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "ac0dbbd8aa555e012e1b5fde0b4e1f20e30a057e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "acbb287ca3f98d4775dce56e40ffce57ce4ba179" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "ad02a5cab29480ea5b67e354b0da540082500327" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "adecbe660a4943fb6feada38775e51259ea15af1" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "ae17512fd9edf51989081b42962b2fc85de4a2d8" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "ae5837876e23fcefa0f204d7b6433966ebb854b3" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "aecb52facdff422fd67875967e9278a7b872af32" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "aeef5b5a721ea3c03ca909bf1f71c122ebcd32af" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "af3cf705624b239ce07280597a55dc8ca69dd086" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "afbd8818fe046adfa468ea58a217b83f7d5e75a0" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b008af759b5359810c78d181f0743ed85c286116" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b021f73dfd1500257934aacddd707e6f67173edf" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b03a2acc80fce6d54bd1db95d7ff24123ed6e106" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b0a10fa71a1c4c621345666be094909ac112ec82" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b0a9ac49b7fc9a45c9e7b358cc2e9e09dfe361d1" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b0ea2ec7623a1faebead30c8007b260a4c62f99f" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b0f8d2e75cd431ef9d818a2552aab19a6a99c1d3" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b14b3e0660d147b2603ed92fec4ff337e3c259df" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b15c7770a476be2c77c3bd50d60ea6b2cde3186d" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b1691d2608aea9d7a56083dc7dcbfacc93a4287a" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b1ec052c576186de285bbd31164de3b19a844dc1" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b2c10a1979ac6236e586ed704cf9dcecb034b8b7" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b2da69bc3361eaf80dce81a17d610217ebbc7a17" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b2f828407f1a5fcbb1e4ec079c22d791c7fa5478" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b31b1fe90a535ed66dfaf1bf9e1062190fbe88a6" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b376b876f7137844ef5e2db1e307713885ee5d33" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b39c43369a4ec5e4b2dfa8b3dbb3a12bad630b30" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b39c8c3ee619a2946cf540cbf16720a881110f83" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b3b4dcc6ba6c6d8c352684bc69a135cccb2d88fe" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b3edb875f0dc5faa556edf77a97e53c9d828d146" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b4429d6274f10ef0b7ba30837c5de603ed4c16ef" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b4481bed4acdd11d8f22f535016a762cc87845c2" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b4c315d98fa6cbed10c6331e2a5e4688ed0b7f7d" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b4c898e7d827a75d991aec0a837c23aa8d9041e2" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b572b99fc06b16a232d74898e587398d25d7d33f" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b5f4de69833ef9f1392c74a5ab905c5cd1ab2874" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b6367a493bbaed7334456b3646e4541c9e96012e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b651decbba52842e8fc86afda1168ac549dea7d6" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b678cef4a4ba3f3642fa128daef4ed6d50ba1a0f" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b6bcc464b7b7f0359e87e9a9517d10823a2e0c93" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b705cdd0dbc620e11fa470f9b4938c5f9f42d84e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b7650fa902a0ad81e8d48deb557323bfcf32efdd" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b78428568fc511f4a6ed34c2d57c4e104138ca98" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b7b7c5f65fc11a6bee686b9363884811be247c43" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b7c425948402f9382208346ff48ef6ac4667baab" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b7fbcbcd3389df89233f8bf6bfa8acf892958a33" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b88173b953f6c1b613b6e878cfdb34899e3339ac" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b8fc89fa4eae09e1b4bbb51f4c1791e589368801" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b9261902783bf36bab49f18323a9c8e4ad86519f" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b94d3b46afb9954a375e50a6fede26705800a057" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b96672ac912cc5ad6f75157401ccd9003512ffc3" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b96982fae6a70aff19c2d99c3b2adc57b151d784" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "b9f7e8e7ea5b1a7f184a152373526ac7acf4477c" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "ba158ff71047c0322b1474461f94c0246d0dfb2e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "ba3adb3b7ccccb748a65932e0254e52ce092c5b5" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "ba56f0f804625c0ff8b7b119bd03af0a10b5886e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "ba70f98f64f041290dd6794e5cbc9e8144c8c914" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "baf332c908b38d0c5e825b41a500525fa990b0cc" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "bb26680f6bb423720c6437fab35913d0a86e2a78" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "bb7a0556525b43c750e380a0ac1ca3bb719e601c" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "bbdb82e2b1ebae617370e1c27542ea087a4fa937" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "bc2929a7819bb70f10676f4bc004fff40ce5a52b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "bc843b0159d8f7cf6fa1bda55e3ddcf78e1617b2" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "bc845b8623c7af6b07eda7a5363298989cc007db" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "bccf73dc6498406a51b4183e22c4be57de5c4975" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "bd4f71cc4a8facf8612158e418fa394cabef27b7" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "bdb0e729f9136a166efc4ddea366fc3b6bf6bf5c" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "bdd290243af494ef27e986a3cc432ba3f873758d" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "bddd1619fd3c4703733b1648b7db0ffa6dd09a19" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "bea830535682332041ad318232044f5e914af083" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "becf51bad165c4b8544ecc57c7859ee946e610df" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "bed1a42fdb56c7d562a773650bb2785737caca3b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "bf36bc1d23eebe66f84a0f119552dc7b46fe2402" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "bf574eebdcc7ff3617200fe07c8c7154a8d129f4" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "c052f8b19df2c41d807bde1c041a8ba2e87f15d5" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "c06bd5d93ac2ecab95942d1639b700e3a2cc48b8" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "c071690916c15657eba376c7c6b4b06d38e815be" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "c07b721215b231d9820dc8d186e3dcabc6c75e66" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "c0cbd80b185007c05f50e6f2fbb03e8d6b2ed652" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "c0f36c8efba9e6e4e677faab240ccf0cf3e7d03d" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "c101a7eb0ac863e824eea705432530c65aa0c518" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "c19f48a0a131e8b9f44989bbac80a30ffe2a2e4d" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "c1ab531ecade623c0c908c1fbf104fb8c647a37e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "c1ff6275aeeeacd2c79dc02f8cd5cdb44a81e6be" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "c20cf04f10caa057314759a2908524925294efb3" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "c291bf92ff9bdc0e60f049e6a5b143b940658857" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "c2a603dfbb0734c098e5b6b7c8a9b64bab11054e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "c2afed79b83fc6b8d98802f52b1fea6648571ee7" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "c30727a70f64c82d0d8837f1b45b931ebf80b106" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "c33582140ad3da6d7fde2c3c73d0530cbde93555" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "c37a43e940dfb5baf581a0b82b351d48305fc885" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "c37d1d79868b6a4c25db68301b8575ae4a8336fb" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "c3d826f0bcf2d353afaea99ec55eb9162438e315" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "c4170be517e6c67a9e65dddb09220df58e547102" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "c44e39eed84adf0c399a9d5af8d0053715d0f5f9" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "c489e22b54124b98b17b68e7c38676efb81c1862" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "c4be49d4dcee6efd96c35ddf346b969db9981091" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "c57abf0b9724f82736bee2a05a9238a45de5512a" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "c5a28cdc8c4b089c87ed4938ed4718253c48dd7a" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "c5c5d6ad672b24a2ddedbd2418c4c131c212cb0f" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "c608a6fa0f9f3a6af68270740ed6c998e145eede" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "c694bd4edd4e806b9c7d4ad742a3be423391470b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "c71253e1b049c2b5acba1893c74007a26797e111" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "c71abd039da56d4c1d783ed06a48adf0808e9cef" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "c775193c9d81ed6ee806f6005a874b927e96ff19" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "c7e31a320a9a7969a6f4c3cf98bd6d92a6119055" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "c82d5a989ed7c8ffdf79ea0724b3c9ba3fb84e57" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "c8732f022b6c57d291b26c830c651b3617c75b2a" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "c8b331eb5ad444567964f34dc24757bdd3425943" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "c8c3cf855531e1d06c07245e76c5298b4fc90d8a" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "c8c90ba51e74ac5d9e462ffcafbb6df11795ebe5" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "c8ca05f5e8391cd5004c3c4020e570ed4a520c20" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "c9113ae38fc632738ad4722046d8e07ba9363ca7" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "c95ee3b530d4b057840c2d9cb542a51e4e3a00cd" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "c98b82b246d3eca7562ae19d8ca605e77cd53a3a" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "caf720d275e228b58bcd8b2686714ed8819cdc2b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "cb0ef5a0d3f9427d66aa2b00d4b25c2445d96cf1" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "cb5e208c02a68f2d97601da482c419af989e097f" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "cc0302264a5d0f269e26ca3ac24d7695b562b4f4" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "cc40f2616fb396bfc25e9b22ba3218b2b217ea3d" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "cc7c2f8a3070489cfca48f5fa0db9fa2d65e40e4" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "ccc8cd23dc6755bbb516af6ef2a04cc82a5ce5c7" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "ccce4f34ac3a550c95747823a00fecce349734f7" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "cce1e6f23dccba1aa1830b1b7714fe985f9f2032" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "cd1171381ba62ff31b56a001b8144e64e365eba1" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "cd2910fb9ae3395ed149b28a1ce7c3cc58bc5481" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "cd5fca46bbc468b84b493f7b52ff50386b174d40" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "cdc1f2aa2853b37723f415aeb181583e11ae7b8f" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "cdcc86f0d7e95ea5b2f9f5e802015c8ff855b257" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "ce20ac750c9549b466d48c90352a255f6b7c8294" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "ce7600131bfe22040ad75febed54cd4ad181276d" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "cebebe455b6a15d2e4705ebe51fe5007afda76eb" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "cedbc4eaa94298536ad368e8ac9819c5e7448738" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "ceee86e99b04198c09fc8ebf3e2f45253bddeed5" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "cf3f58bfe41401084fd1e997e8e36dfb35e363cc" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "cfb0d9c00c0b7ad292f221584394a3ae7d30e0ab" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "cfb86844738d5373ad23eb3185e1e9fc5d517ae6" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "d032f83c65a584f6e47f9fff9bc864d51a164a94" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "d09a49b1cdb208e2504486267ca2418c87152962" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "d0a97217cb0a4211e28a58222c1b038c44a3f211" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "d10afb219e80a211c9072b18de0ff2317f67e573" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "d111da05d7193bc295a4956543810071fcbe4238" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "d19b2ebcfea3994bf30a7e4283b73d4bdd319cbb" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "d2468d6da54259507d07f74ef0a246f97e52f035" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "d2571607e241ecf590ed94b12d87c94babe36db6" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "d25b7ae72c049f91091a4abedc4d618e5a05e1e0" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "d269786262f853ed769ef3ea9a7e5b98db3bfb32" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "d2a0b130c0834eb0ad2717ad13233242280a6fd0" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "d2be9413f150b2eaf2666b42ee719fc66e5066f1" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "d2c8bda3e1481b96b4a3ee0a2e1f3f1aa6299feb" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "d2e450aa145ce97dc054b1bcf391407fbf202bd5" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "d3a4f3cc7113eb16572eced68ab395a40ceeda1c" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "d3ba8bc2aa219ba0aacc8960b92832c3b0693bac" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "d3c1c3359ed1906851379272964b7d96e2977654" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "d49825eca3314ad0c5918472615055010cf4a4fa" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "d49daab5099319cdda477f5ba715ae685c031db7" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "d5144e55ee02feec18f2ff293f08b8379d1509d3" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "d577d44f2748e151afdb1ded254c942ca9933b0b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "d65386ce109ffa3570dd27e54f32e2528fe01fc3" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "d7409d185224a0284e7451923e3d094ec309ef92" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "d743161f0f7beed30155e171b4d577d5ce2a70d3" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "d758e9a701769fe9e5a80b3a09180e7631866f55" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "d79995f1fbdf19beff429a94fa9dd184827c68c4" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "d7a36da4e6e26a99b038e34a6eb74d10d422ba9f" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "d7ae2e59d0776d0ba96fb4b23d1eccb3d57a14eb" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "d80ba0ac6edb71367c1634ae5bf72970e596a99c" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "d87693ae6d35928467daf90aac749654e9c57644" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "d9860a22b84f982363ab9684d767a347a5c4fb74" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "d99befc655ecd5df508569aaadd729af7371687e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "d9d8272a3b205f71494f9009705f4f30dd31c607" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "d9dd1aa8519580888c402dd4fae66ca68b4a7b47" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "da1849a4f9df2e58d30c94732ff5f3aea19ccd8d" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "da3580da73b2986fe0da9b6caebe17818b7b3645" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "da5828cee8e61bd0d8af71ef5da9a7a9019ade13" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "da7555a43e7a3790290cd20a19ec19032e28a6dd" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "dae44ad9bfab81783c1dd591ebe3409fa8967883" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "db06ebb361ef006c17f89ad92165185a38f6e630" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "db4ed990c69c3b67a04a96ccf079649facb9c433" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "db58d0b35d26edeb0efcb49f7eb627cf49bb3a47" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "dba37eb3483100bc89a7bf11b7f110ad71ecf41c" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "dc19c28fa6124ee9d0688d0e2879f1269b4b7fc5" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "dc1baaa8621b513d62e8aeb02543ce5c7b8020c0" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "dc280f2887ea315f70692eb247e399b18a07bda8" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "dce512ecde5a4c27da464f846e71c8272da4ad80" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "dceb9854f220556f595bd655bf6c023457341e4a" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "dd0eda6e9a3dccc3d430e5dd333c83b759cc7883" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "dd8317eb76e8949315e601fa8a6959e2ffd277c1" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "ddb6aeb5e1bb4cdb44ca3a9b979996c529d9fa3c" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "dddb23bf0a55d0197810e062a5a24a1503705ae5" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "dddda651d375f5352d2ff488eace1de63b6ffca9" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "dde0b1e9b9ecc980c5614012f9afae25cb1a1c16" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "ddfb1c855ea2b2f198d2b6c7dc8ea0ee16d7319a" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "de63eef4b269d8572b6b00574ad8e34c471a07d6" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "def94fccb1b7dfbe1cf0b3dcaa03a77cf58ae768" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "df50b2ca876e4174d276dac0c64e644cb1b5a118" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "df5767dc4d8111e8641198f637e4423c62e57e27" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "dfc26965c20fea217850a28c08021f1468146101" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "dfeb403cff0aabe20cb07d8451caacfe31260132" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e026a4835edf27c2705c97f237e5b59b7b5da1f7" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e059d3aac9a568120467ddbba3e4d25bbc82dc64" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e089f14df5e00aff3b03cac5e1236f5cf5832d5f" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e0a1885b4057f65dc75636f4fb0e4b57da82429c" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e0b3647d7252d53d397fa6af6d9da4749f4caadf" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e0e5744863b26418baf12f94f0bdad2ef2546a92" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e0e8eb511c8a93cbc42dec4e3c0b8492ca1d81f4" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e0f04368af17d56c8cdb50f0fd5f1847d9a49cb1" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e0fbdd03e0e490770d671965ccce5f5ed42bbb9d" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e134cc9b2be1a15b9e270a9f7baacbda3c8b3659" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e14b8b08ed9b569d2945b078fe94225924c5987e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e1954d1413f4f50c7bb3aa0ee368b94dfeae7c1b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e19f216f6b8b78ff1e705cb56d0cb07db60a05ec" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e1e31732ce0075070c8d7e2ef7a44b93949493d0" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e1f79aa1d6477ffd08d4e5ce185637434147e4f8" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e21b2668bb1e9cf057606c44d49648f1c140aa76" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e24778b9ec00cc9bef91643e31885deee719207e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e28a959abf1b36ad7778737d992690cb73a51a91" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e292ba16ee32e94ba88b4b72821bf90fe7b1b845" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e2982af9c977c39cb4633346b916a3897ffeb6f9" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e326d4acceedb3e572b98d4a45a6f1e37ee42501" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e32bec776748185042cb02d58fad1d5027bbaeff" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e3443d812bb8204255a1d249b82aa19508dff5c9" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e355b484879e20943aca2c6655953ec8121b64e8" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e365d9256480b1e9d3cc6eafdcad5912b75ad149" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e3d08fe78f595bede290f820ec0e878572803a6a" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e4028c8f2888697e9939562de475f70a841ee713" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e475b2b441a9b1cdf24e0ea992dfaecedd58d6d0" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e49d92946422e69977a94d1b4b769f97efcfb8eb" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e50c29688b2c3dbe6633797d2a200ed7c2cb1cba" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e59b406835db0d4c63ae28072c64c664da637557" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e5baf7303b008f333c57491345e604d52fce0d63" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e5fa8de537f7665e2aed751b8ca7c6b5bf0cdca0" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e635349c1e038d62f774f4201cbda082b8af403c" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e64dff0ba3f0eb9e054a638d4d5f6f0cb47e1e98" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e6df36db61ae2c46d2cda2f6c8d1856ac181e6cc" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e6f12dc0baf6536aa75f226bfb0262d8266433d1" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e703236fc6d1dcc955b9abf34f490e2bf5057fdd" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e71d6b1facc3de5c246f7d14e35a2b4a2d983c11" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e74299a026e8a481c1db07e6065ca30af9858cbc" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e75900e645ce8d1abbb97d408989b159b2a50a1c" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e7b8aae66ff70d59fcc5a8b4de5a246081547146" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e81f08cfb60f7c156cf7dcbee1b8790901a1eadc" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e8373e7e464120da8a84da82c8137872cda65780" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e857a6c6f502dd2bd0ec341b2d4ed55f2e87e8e7" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e908278cc1515f214049c48c3a8908524f2cc407" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e913f5b697154f99bfc159a132c6c253b457ef18" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e93e7128f80bef53e3217782f21f4bd6a6d19c7c" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "e9d157e81c306452f8494f681813037b146660eb" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "ea186a9a4815581b71403480abae5cc7c57c00be" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "ea216bc75a65a838ea3d63f7c05588c2840ec1ab" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "ea2f1211c66cdabf2b618a4dd965ce133592763b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "eadf36b1baf942879b0b5c45469fa05add1d61b3" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "eb203eec55c1da2fd38977032c79ada414cc914c" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "eb4e97f22f12995949c371f2df690f68f71070eb" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "eb5ad2481a57a6b7ede3a16ad8bfe2991eef3ad7" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "eb9414a32f85461cf4ac7c9c73761f3f1e5ab14e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "ebff1a1539630b2f7b5260a93ea602372e539366" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "ec184f693f222b3e48622f5253c134339e7e2e7d" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "ec318906ab052a41ef13ea33deee554704a307c1" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "ec45f260d4d758d6d23ae0297a9516190d935a5b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "ec5f2ac1947c51c5982eb0ab63d1e6439f45c2e3" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "eca2fc261f07a269c2487e6d1b0539d0950ff792" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "ecb643ddbca1cfa6dd22964c20ef57ab47c0fda9" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "ecd38089d14a75b93afa634276bbe8965f5642dc" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "ece9d0b9393f64338ec6ca5b0efbcec2175f19ec" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "ed1a5e97e3415b484e6bc8b84bd170dbdd879cb3" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "ee21d08004e0b6f2c1cd4bcb2a04ab74f7b7b708" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "ee439948c6dead863ab2ba9105b70916d45f9e79" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "ee6f3914a1e5d955fd62a29562ee0ab776235ff5" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "ef36b064bb706bc0540e4ed2b341ae8a0b7756b7" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "efe2a6d8859b14ecc69baf66dcd47f4067df18e5" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "f00d30ecf763691115d2314d14ea1e11f61ad874" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "f026ce3f255ef9fc7b93719a3f6926ce4953bfe1" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "f07ee5b0729c565f7b57995a108f94e4fcb81558" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "f0dc197380bc632e5078f75f5ef0b814b7eb2ec6" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "f12be871bc1a1f3ca254eb027786085dd79494c5" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "f134cf7fd6ed2e962db26c4b3d99ee5884102c85" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "f191a9c00fe780f63cf4f68a06e895bd53981254" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "f1970ea5af8456fee42cc087e79bd5c6a6efaa87" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "f1ba5e0a4a27d8dafcf87f049b178fe83574ac06" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "f25da1517af0e2fce2b9d75fd964e8827cc0cb72" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "f2866fb67103c69f10edaed228d2dd64b7e6df83" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "f2d3cbe7357ee858c2b7f6ea28fc95c1af508ca8" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "f2d923a66a9684f2268530094ce8e3f8b8cae52e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "f3b37fd9258f2c883c44e8ddaa90f91bfe9f5d51" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "f3c5a341248911dda9d694ee74bf997365941dbf" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "f4489af2af8424c6edf0d0adc525680dea208a31" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "f475a28a9649aa00ab8a40af393f1961587c2275" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "f48270bfa988db4518f9b1db9e78bb398c954550" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "f49ecf0e4378b1957686d8d0b227f83e48e5523c" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "f4a32ec7fde64e7d3ceb53fcc00511ffe13ff5d4" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "f4d2d03bf70c2500fe431fdc8fbed2c13437bdc9" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "f4e76b020a22e8c1929ba2163e413385fc0cf884" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "f53e504312e2ff787bbb9ba4ea921e9edb7b18ff" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "f5472ede25cb83dc2fe392b01111133b777709b9" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "f619381383c69659fe81a10d695b2663426624d4" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "f62f676443b29c513964f01cbb356165ace54b78" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "f6ee7d8bf313f837bbfed7f10b16fb2f182fd416" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "f735071cbee190d76b704ce68384fc21e389fbe7" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "f74f956ea3d122e47f4aa0066b5e3605c80d0282" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "f783f583fc06d2c88e9e0d263a6ab66f8b8a0514" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "f78b2d97c8af245b705c0a19601b95f983e9aaf6" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "f78ff2d350615b858077a50ff85b3a9e2edcc995" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "f85aaa082ae886506141245ea3b43ee74babca65" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "f86c50909ddce25f4d4e71e16d78b2f6a244e8cb" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "f8e4de2f36fa5e9861fe3af86d05db4cae1bb1a4" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "f8fc32491119dea2b7fda5080ef9cf0027590265" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "f904cb6a599db50cc635bb70f3c23f056e39914e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "f94e8e9f1511f8cede3bfd8e1be0db35085e8e6d" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "f9c7db4a48b918ad6e44d2b55e2339fdcde01d26" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "f9d417c0b18ff731a88a17f3b31d9d6ed1e288f1" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "fa849bc1ece08222f4bf249ca06a6468b3de5b1a" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "fa9c2ac45638e511b06ebe051411ebdc2c4c228a" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "fabaccc45975d14c53b830fd4fa0576da541d22e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "fac000880bdfdbd780ffa7c4a1d5d8b4a1d87b03" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "fafa31e9b477adf7a26b651aa9913f8664e536a4" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "fb04fd4e715c760c91ddc0f30b000b52203f66a4" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "fb5d7c75f272b07450867579978314661c3e1206" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "fbdc8132551b0ed5c50b6c0f279097592b5c87ef" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "fc55e6958f11444ae56c09af726f2ec57525db58" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "fc70ade160bd76694149f3f439f5d4f78bdc483e" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "fc86915f4e8884b49adeb6f23a8f69e643d9db7b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "fcdb751de1dc7c5246ce698b4b104016d034cfdb" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "fcf47e5c1414303d55afc40c75c41cf42079d560" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "fd096ec4540dacfebbabf2dd6ffd3493a09cc38f" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "fd09bf9b58980d6a5776bb391d8c6881bcca2ae9" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "fd0dea1a583400fc29051c8192b70022d8d92c48" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "fd437bf9d51bac3a2757bf4b8bf38045e78d5ada" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "fd5b134edd8931ca2102693d88070dd49fc13350" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "fd91b246a065cde3fc10edd6457b9e6c10fb386f" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "fdc6c80a86ea555b5de26c3db49a779eea6beb0c" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "fe4f48d16a7ec27241b987f3545423291c7cce77" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "fe686acb3b7cc09ec6379af828b4b3b638898130" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "fe8d768de7a723c23583162dbef207b6dcb4fb58" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "fed73d1755549bd523a775e81cf80a1a507eec50" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "ffb9bfb24fb671413a3aae05e0f21b870eeb2ab9" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "ffc4569dfb86db2e584a1138a75747dffb794466" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "fff1cd2c481ce0fba0c97ef77c79227d3b67832a" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "code" : "0x60206000600039602060006000f0",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "465224",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ }
+} \ No newline at end of file
diff --git a/tests/files/StateTests/stRefundTest.json b/tests/files/StateTests/stRefundTest.json
new file mode 100644
index 000000000..08ae1fac8
--- /dev/null
+++ b/tests/files/StateTests/stRefundTest.json
@@ -0,0 +1,523 @@
+{
+ "refund500" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600154506002545060ff60020a600a553031600b55600060015560006002556000600355600060045560006005556000600655",
+ "nonce" : "0",
+ "storage" : {
+ "0x0a" : "0x8000000000000000000000000000000000000000000000000000000000000000",
+ "0x0b" : "0x0de0b6b3a7640000"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "592",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "9408",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600154506002545060ff60020a600a553031600b55600060015560006002556000600355600060045560006005556000600655",
+ "nonce" : "0",
+ "storage" : {
+ "0x01" : "0x01",
+ "0x02" : "0x01",
+ "0x03" : "0x01",
+ "0x04" : "0x01",
+ "0x05" : "0x01",
+ "0x06" : "0x01"
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "10000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "0"
+ }
+ },
+ "refund50_1" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006001556000600255600060035560006004556000600555",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "255",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "9745",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006001556000600255600060035560006004556000600555",
+ "nonce" : "0",
+ "storage" : {
+ "0x01" : "0x01",
+ "0x02" : "0x01",
+ "0x03" : "0x01",
+ "0x04" : "0x01",
+ "0x05" : "0x01"
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "10000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "0"
+ }
+ },
+ "refund50_2" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6001600a556001600b5560006001556000600255600060035560006004556000600555",
+ "nonce" : "0",
+ "storage" : {
+ "0x0a" : "0x01",
+ "0x0b" : "0x01"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "614",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "9386",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6001600a556001600b5560006001556000600255600060035560006004556000600555",
+ "nonce" : "0",
+ "storage" : {
+ "0x01" : "0x01",
+ "0x02" : "0x01",
+ "0x03" : "0x01",
+ "0x04" : "0x01",
+ "0x05" : "0x01"
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "10000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "0"
+ }
+ },
+ "refund600" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600154506002545061ffff60020a600a553031600b55600060015560006002556000600355600060045560006005556000600655",
+ "nonce" : "0",
+ "storage" : {
+ "0x0b" : "0x0de0b6b3a7640000"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "492",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "9508",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600154506002545061ffff60020a600a553031600b55600060015560006002556000600355600060045560006005556000600655",
+ "nonce" : "0",
+ "storage" : {
+ "0x01" : "0x01",
+ "0x02" : "0x01",
+ "0x03" : "0x01",
+ "0x04" : "0x01",
+ "0x05" : "0x01",
+ "0x06" : "0x01"
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "10000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "0"
+ }
+ },
+ "refund_NoOOG_1" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6000600155",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "402",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "100",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6000600155",
+ "nonce" : "0",
+ "storage" : {
+ "0x01" : "0x01"
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "502",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "502",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "0"
+ }
+ },
+ "refund_OOG" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6000600155",
+ "nonce" : "0",
+ "storage" : {
+ "0x01" : "0x01"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "500",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6000600155",
+ "nonce" : "0",
+ "storage" : {
+ "0x01" : "0x01"
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "500",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "500",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "0"
+ }
+ },
+ "refund_changeNonZeroStorage" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000010",
+ "code" : "0x6017600155",
+ "nonce" : "0",
+ "storage" : {
+ "0x01" : "0x17"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "602",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "388",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6017600155",
+ "nonce" : "0",
+ "storage" : {
+ "0x01" : "0x01"
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "850",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "10"
+ }
+ },
+ "refund_getEtherBack" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000010",
+ "code" : "0x6000600155",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "402",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "588",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6000600155",
+ "nonce" : "0",
+ "storage" : {
+ "0x01" : "0x01"
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "850",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "10"
+ }
+ }
+} \ No newline at end of file
diff --git a/tests/files/StateTests/stSpecialTest.json b/tests/files/StateTests/stSpecialTest.json
new file mode 100644
index 000000000..91b51fdb0
--- /dev/null
+++ b/tests/files/StateTests/stSpecialTest.json
@@ -0,0 +1,77 @@
+{
+ "makeMoney" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000010",
+ "code" : "0x7b601080600c6000396000f200600035541560095700602035600035556000526000600060006000601773aaaaaaaaace5edbc8e2a8697c15331677e6ebf0b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffecf1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "850",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "140",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "aaaaaaaaace5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600160015532600255",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7b601080600c6000396000f200600035541560095700602035600035556000526000600060006000601773aaaaaaaaace5edbc8e2a8697c15331677e6ebf0b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffecf1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "aaaaaaaaace5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600160015532600255",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "850",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "10"
+ }
+ }
+} \ No newline at end of file
diff --git a/tests/files/StateTests/stSystemOperationsTest.json b/tests/files/StateTests/stSystemOperationsTest.json
new file mode 100644
index 000000000..612331ae3
--- /dev/null
+++ b/tests/files/StateTests/stSystemOperationsTest.json
@@ -0,0 +1,5830 @@
+{
+ "ABAcalls0" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099999",
+ "code" : "0x6000600060006000601873945304eb96065b2a98b57a48a06ae28d285a71b56103e8f15855",
+ "nonce" : "0",
+ "storage" : {
+ "0x23" : "0x01"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1658",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "24",
+ "code" : "0x6000600060006000601773095e7baea6a6c7c4c2dfeb977efac326af552d876101f4f16001015855",
+ "nonce" : "0",
+ "storage" : {
+ "0x26" : "0x01"
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999898342",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6000600060006000601873945304eb96065b2a98b57a48a06ae28d285a71b56103e8f15855",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "23",
+ "code" : "0x6000600060006000601773095e7baea6a6c7c4c2dfeb977efac326af552d876101f4f16001015855",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "1000000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "ABAcalls1" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099481",
+ "code" : "0x6000600060006000601873945304eb96065b2a98b57a48a06ae28d285a71b56103e85a03f15855",
+ "nonce" : "0",
+ "storage" : {
+ "0x25" : "0x01"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "131292",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "542",
+ "code" : "0x6000600060006000601773095e7baea6a6c7c4c2dfeb977efac326af552d876103e85a03f16001015855",
+ "nonce" : "0",
+ "storage" : {
+ "0x28" : "0x02"
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999768708",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6000600060006000601873945304eb96065b2a98b57a48a06ae28d285a71b56103e85a03f15855",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "23",
+ "code" : "0x6000600060006000601773095e7baea6a6c7c4c2dfeb977efac326af552d876103e85a03f16001015855",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "1000000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "ABAcalls2" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099488",
+ "code" : "0x6001600054016000556000600060006000600173945304eb96065b2a98b57a48a06ae28d285a71b56103e85a03f1",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x0200"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "8997504",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "512",
+ "code" : "0x6001600054016000556000600060006000600073095e7baea6a6c7c4c2dfeb977efac326af552d876103e85a03f1",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x0200"
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999990902496",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6001600054016000556000600060006000600173945304eb96065b2a98b57a48a06ae28d285a71b56103e85a03f1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "0",
+ "code" : "0x6001600054016000556000600060006000600073095e7baea6a6c7c4c2dfeb977efac326af552d876103e85a03f1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "ABAcalls3" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1124488",
+ "code" : "0x6001600054016000556000600060006000600173945304eb96065b2a98b57a48a06ae28d285a71b56103e85a03f1",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x0200"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "8997504",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "512",
+ "code" : "0x6001600054016000556000600060006000600073095e7baea6a6c7c4c2dfeb977efac326af552d876103e85a03f1",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x0200"
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999990902496",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1025000",
+ "code" : "0x6001600054016000556000600060006000600173945304eb96065b2a98b57a48a06ae28d285a71b56103e85a03f1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "0",
+ "code" : "0x6001600054016000556000600060006000600073095e7baea6a6c7c4c2dfeb977efac326af552d876103e85a03f1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "ABAcallsSuicide0" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1659",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "1000000000000100023",
+ "code" : "0x6000600060006000601773095e7baea6a6c7c4c2dfeb977efac326af552d876101f4f16001015855",
+ "nonce" : "0",
+ "storage" : {
+ "0x26" : "0x01"
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999898341",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6000600060006000601873945304eb96065b2a98b57a48a06ae28d285a71b56103e8f1585573945304eb96065b2a98b57a48a06ae28d285a71b5ff",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "23",
+ "code" : "0x6000600060006000601773095e7baea6a6c7c4c2dfeb977efac326af552d876101f4f16001015855",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "ABAcallsSuicide1" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099999",
+ "code" : "0x6000600060006000601873945304eb96065b2a98b57a48a06ae28d285a71b56103e8f15855",
+ "nonce" : "0",
+ "storage" : {
+ "0x23" : "0x01"
+ }
+ },
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "24",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1659",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999898341",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6000600060006000601873945304eb96065b2a98b57a48a06ae28d285a71b56103e8f15855",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "23",
+ "code" : "0x6000600060006000601773095e7baea6a6c7c4c2dfeb977efac326af552d876101f4f16001015855730f572e5295c57f15886f9b263e2f6d2d6c7b5ec6ff",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "CallRecursiveBomb0" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20099977",
+ "code" : "0x6000600060006000601773945304eb96065b2a98b57a48a06ae28d285a71b5620186a0f1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "72167",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x600160005401600055600060006000600060003060e05a03f1600155",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x0118",
+ "0x01" : "0x01"
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999827833",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "code" : "0x6000600060006000601773945304eb96065b2a98b57a48a06ae28d285a71b5620186a0f1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600160005401600055600060006000600060003060e05a03f1600155",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "1000000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "CallRecursiveBomb1" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20100000",
+ "code" : "0x600160005401600055600060006000600060003060e05a03f1600155",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x03ff",
+ "0x01" : "0x01"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "261077",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999638923",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "code" : "0x600160005401600055600060006000600060003060e05a03f1600155",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "365223",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "CallRecursiveBomb2" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20100000",
+ "code" : "0x600160005401600055600060006000600060003060e05a03f1600155",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x03ff",
+ "0x01" : "0x01"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "261078",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999638922",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "code" : "0x600160005401600055600060006000600060003060e05a03f1600155",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "365224",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "CallRecursiveBomb3" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20100000",
+ "code" : "0x600160005401600055600060006000600060003060e05a03f1600155",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x0400",
+ "0x01" : "0x01"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "895752",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999004248",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "code" : "0x600160005401600055600060006000600060003060e05a03f1600155",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "1000000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "CallRecursiveBombLog" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20099977",
+ "code" : "0x6000600060006000601773945304eb96065b2a98b57a48a06ae28d285a71b5620186a0f1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "76859",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005260206000a0600160005401600055600060006000600060003060e05a03f1600155",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xea",
+ "0x01" : "0x01"
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999823141",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "code" : "0x6000600060006000601773945304eb96065b2a98b57a48a06ae28d285a71b5620186a0f1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005260206000a0600160005401600055600060006000600060003060e05a03f1600155",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "1000000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "CallRecursiveBombLog2" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000001869f",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000001842d",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000018283",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000180d9",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000017f2f",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000017d85",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000017bdb",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000017a31",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000017887",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000176dd",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000017533",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000017389",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000171df",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000017035",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000016e8b",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000016ce1",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000016b37",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000001698d",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000167e3",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000016639",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000001648f",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000162e5",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000001613b",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000015f91",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000015de7",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000015c3d",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000015a93",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000158e9",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000001573f",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000015595",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000153eb",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000015241",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000015097",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000014eed",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000014d43",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000014b99",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000149ef",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000014845",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000001469b",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000144f1",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000014347",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000001419d",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000013ff3",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000013e49",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000013c9f",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000013af5",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000001394b",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000137a1",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000135f7",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000001344d",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000132a3",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000130f9",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000012f4f",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000012da5",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000012bfb",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000012a51",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000128a7",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000126fd",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000012553",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000123a9",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000121ff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000012055",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000011eab",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000011d01",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000011b57",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000119ad",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000011803",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000011659",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000114af",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000011305",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000001115b",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000010fb1",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000010e07",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000010c5d",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000010ab3",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000010909",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000001075f",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000105b5",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000001040b",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000010261",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000100b7",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000ff0d",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000fd63",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000fbb9",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000fa0f",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000f865",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000f6bb",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000f511",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000f367",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000f1bd",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000f013",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000ee69",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000ecbf",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000eb15",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000e96b",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000e7c1",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000e617",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000e46d",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000e2c3",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000e119",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000df6f",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000ddc5",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000dc1b",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000da71",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000d8c7",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000d71d",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000d573",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000d3c9",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000d21f",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000d075",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000cecb",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000cd21",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000cb77",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000c9cd",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000c823",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000c679",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000c4cf",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000c325",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000c17b",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000bfd1",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000be27",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000bc7d",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000bad3",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000b929",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000b77f",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000b5d5",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000b42b",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000b281",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000b0d7",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000af2d",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000ad83",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000abd9",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000aa2f",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000a885",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000a6db",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000a531",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000a387",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000a1dd",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000a033",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000009e89",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000009cdf",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000009b35",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000998b",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000097e1",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000009637",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000948d",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000092e3",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000009139",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000008f8f",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000008de5",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000008c3b",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000008a91",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000088e7",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000873d",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000008593",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000083e9",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000823f",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000008095",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000007eeb",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000007d41",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000007b97",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000079ed",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000007843",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000007699",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000074ef",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000007345",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000719b",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000006ff1",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000006e47",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000006c9d",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000006af3",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000006949",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000679f",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000065f5",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000644b",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000062a1",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000060f7",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000005f4d",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000005da3",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000005bf9",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000005a4f",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000058a5",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000056fb",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000005551",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000053a7",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000051fd",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000005053",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000004ea9",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000004cff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000004b55",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000049ab",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000004801",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000004657",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000044ad",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000004303",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000004159",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000003faf",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000003e05",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000003c5b",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000003ab1",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000003907",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000375d",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000035b3",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000003409",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000325f",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000030b5",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000002f0b",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000002d61",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000002bb7",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000002a0d",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000002863",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000026b9",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000250f",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000002365",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000021bb",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000002011",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000001e67",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000001cbd",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000001b13",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000001969",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000017bf",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000001615",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000146b",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000012c1",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000001117",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000000f6d",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000000dc3",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000000c19",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000000a6f",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000008c5",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000071b",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x0000000000000000000000000000000000000000000000000000000000000571",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x00000000000000000000000000000000000000000000000000000000000003c7",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x000000000000000000000000000000000000000000000000000000000000021d",
+ "topics" : [
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20099977",
+ "code" : "0x6000600060006000601773945304eb96065b2a98b57a48a06ae28d285a71b5620186a0f1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "76859",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "1000000000000000023",
+ "code" : "0x5a60005260206000a0600160005401600055600060006000600060003060e05a03f1600155",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xea",
+ "0x01" : "0x01"
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999823141",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "code" : "0x6000600060006000601773945304eb96065b2a98b57a48a06ae28d285a71b5620186a0f1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x5a60005260206000a0600160005401600055600060006000600060003060e05a03f1600155",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "1000000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "CallToNameRegistrator0" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa6020526000604060406000601773945304eb96065b2a98b57a48a06ae28d285a71b56103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1165",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "46",
+ "code" : "0x60003554156009570060203560003555",
+ "nonce" : "0",
+ "storage" : {
+ "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" : "0xaaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa"
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999898835",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa6020526000604060406000601773945304eb96065b2a98b57a48a06ae28d285a71b56103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "23",
+ "code" : "0x60003554156009570060203560003555",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "CallToNameRegistratorNotMuchMemory0" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x7feeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa6020526000620f120660406000601773945304eb96065b2a98b57a48a06ae28d285a71b56101f4f1600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1165",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "46",
+ "code" : "0x60003554156009570060203560003555",
+ "nonce" : "0",
+ "storage" : {
+ "0xeeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00" : "0xaaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa"
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999898835",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7feeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa6020526000620f120660406000601773945304eb96065b2a98b57a48a06ae28d285a71b56101f4f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "23",
+ "code" : "0x60003554156009570060203560003555",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "CallToNameRegistratorNotMuchMemory1" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x7feeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa602052600060406000620f1206601773945304eb96065b2a98b57a48a06ae28d285a71b56101f4f1600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "965",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "46",
+ "code" : "0x60003554156009570060203560003555",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899035",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7feeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa602052600060406000620f1206601773945304eb96065b2a98b57a48a06ae28d285a71b56101f4f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "23",
+ "code" : "0x60003554156009570060203560003555",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "CallToNameRegistratorOutOfGas" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x7feeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa6020526000604060406000601773945304eb96065b2a98b57a48a06ae28d285a71b56064f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "736",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "46",
+ "code" : "0x60003554156009570060203560003555",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899264",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7feeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa6020526000604060406000601773945304eb96065b2a98b57a48a06ae28d285a71b56064f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "23",
+ "code" : "0x60003554156009570060203560003555",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "CallToNameRegistratorTooMuchMemory0" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000100000",
+ "code" : "0x7feeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa602052600060406040633ade68b1601773945304eb96065b2a98b57a48a06ae28d285a71b56101f4f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "10000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "23",
+ "code" : "0x60003554156009570060203560003555",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999890000",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7feeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa602052600060406040633ade68b1601773945304eb96065b2a98b57a48a06ae28d285a71b56101f4f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "23",
+ "code" : "0x60003554156009570060203560003555",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "CallToNameRegistratorTooMuchMemory1" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000100000",
+ "code" : "0x7feeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa60205260006040629688d86000601773945304eb96065b2a98b57a48a06ae28d285a71b56101f4f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "10000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "23",
+ "code" : "0x60003554156009570060203560003555",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999890000",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7feeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa60205260006040629688d86000601773945304eb96065b2a98b57a48a06ae28d285a71b56101f4f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "23",
+ "code" : "0x60003554156009570060203560003555",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "CallToNameRegistratorTooMuchMemory2" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000100000",
+ "code" : "0x7feeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa6020526001620f120660406000601773945304eb96065b2a98b57a48a06ae28d285a71b56101f4f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "10000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "23",
+ "code" : "0x60003554156009570060203560003555",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999890000",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7feeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa6020526001620f120660406000601773945304eb96065b2a98b57a48a06ae28d285a71b56101f4f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "23",
+ "code" : "0x60003554156009570060203560003555",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "CallToReturn1" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa6020526002600060406000601773945304eb96065b2a98b57a48a06ae28d285a71b56103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1145",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "46",
+ "code" : "0x6001600155603760005360026000f3",
+ "nonce" : "0",
+ "storage" : {
+ "0x01" : "0x01"
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999898855",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa6020526002600060406000601773945304eb96065b2a98b57a48a06ae28d285a71b56103e8f1600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "23",
+ "code" : "0x6001600155603760005360026000f3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "PostToReturn1" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000100000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa6020526080",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "509",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "23",
+ "code" : "0x603760005360026000f2",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899491",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa6020526080",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "23",
+ "code" : "0x603760005360026000f2",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "TestNameRegistrator" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000100000",
+ "code" : "0x60003554156009570060203560003555",
+ "nonce" : "0",
+ "storage" : {
+ "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa" : "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1149",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999898851",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60003554156009570060203560003555",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa",
+ "gasLimit" : "1000000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "callcodeToNameRegistrator0" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000100000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa6020526000604060406000601773945304eb96065b2a98b57a48a06ae28d285a71b56103e8f2600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01",
+ "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" : "0xaaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1165",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "23",
+ "code" : "0x60003554156009570060203560003555",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999898835",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa6020526000604060406000601773945304eb96065b2a98b57a48a06ae28d285a71b56103e8f2600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "23",
+ "code" : "0x60003554156009570060203560003555",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "1000000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "callcodeToReturn1" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000100000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa6020526002600060406000601773945304eb96065b2a98b57a48a06ae28d285a71b56101f4f2600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01",
+ "0x01" : "0x01"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "1145",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "23",
+ "code" : "0x6001600155603760005360026000f3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999898855",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa6020526002600060406000601773945304eb96065b2a98b57a48a06ae28d285a71b56101f4f2600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "23",
+ "code" : "0x6001600155603760005360026000f3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "callstatelessToReturn1" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000100000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa6020526080600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x80"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "810",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "23",
+ "code" : "0x6001600155603760005360026000f2",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899190",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa6020526080600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "23",
+ "code" : "0x6001600155603760005360026000f2",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "createNameRegistrator" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000099977",
+ "code" : "0x7b601080600c6000396000f30060003554156009570060203560003555600052601c60046017f0600055",
+ "nonce" : "1",
+ "storage" : {
+ "0x" : "0xd2571607e241ecf590ed94b12d87c94babe36db6"
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "997",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899003",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "d2571607e241ecf590ed94b12d87c94babe36db6" : {
+ "balance" : "23",
+ "code" : "0x60003554156009570060203560003555",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7b601080600c6000396000f30060003554156009570060203560003555600052601c60046017f0600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "createNameRegistratorOutOfMemoryBonds0" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000100000",
+ "code" : "0x7b601080600c6000396000f30060003554156009570060203560003555600052601c650fffffffffff6017f0600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "10000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999890000",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7b601080600c6000396000f30060003554156009570060203560003555600052601c650fffffffffff6017f0600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "createNameRegistratorOutOfMemoryBonds1" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000100000",
+ "code" : "0x7b601080600c6000396000f30060003554156009570060203560003555600052650fffffffffff60046017f0600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "10000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999890000",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7b601080600c6000396000f30060003554156009570060203560003555600052650fffffffffff60046017f0600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "createNameRegistratorValueTooHigh" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7b601080600c6000396000f30060003554156009570060203560003555600052601c60046103e8f0600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7b601080600c6000396000f30060003554156009570060203560003555600052601c60046103e8f0600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "10000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "return0" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x37",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "100023",
+ "code" : "0x603760005360016000f3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "507",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899493",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "23",
+ "code" : "0x603760005360016000f3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "1000000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "return1" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x3700",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "100023",
+ "code" : "0x603760005360026000f3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "507",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899493",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "23",
+ "code" : "0x603760005360026000f3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "1000000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "return2" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x370000000000000000000000000000000000000000000000000000000000000000",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "100023",
+ "code" : "0x603760005360216000f3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "508",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899492",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "23",
+ "code" : "0x603760005360216000f3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "1000000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "suicideAddress" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "803",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899197",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x3060005530ff",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "1000000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "suicideCaller" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "803",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1999999999999999197",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x3360005533ff",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "1000000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "suicideNotExistingAccount" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "501",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899499",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ },
+ "aa1722f3947def4cf144679da39c4c32bdc35681" : {
+ "balance" : "1000000000000100000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x73aa1722f3947def4cf144679da39c4c32bdc35681ff",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "1000000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "suicideOrigin" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "803",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1999999999999999197",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x3260005532ff",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "1000000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+ "suicideSendEtherToMe" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "10000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "501",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "999999999999899499",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x30ff",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "1000000",
+ "gasPrice" : "1",
+ "nonce" : "0",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ }
+} \ No newline at end of file
diff --git a/tests/files/StateTests/stTransactionTest.json b/tests/files/StateTests/stTransactionTest.json
new file mode 100644
index 000000000..0de850797
--- /dev/null
+++ b/tests/files/StateTests/stTransactionTest.json
@@ -0,0 +1,277 @@
+{
+ "EmptyTransaction" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "45678256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "100000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "100000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "",
+ "gasPrice" : "",
+ "nonce" : "",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "",
+ "value" : ""
+ }
+ },
+ "TransactionFromCoinbaseNotEnoughFounds" : {
+ "env" : {
+ "currentCoinbase" : "a94f5374fce5edbc8e2a8697c15331677e6ebf0b",
+ "currentDifficulty" : "45678256",
+ "currentGasLimit" : "1100",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "b94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "b94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "600",
+ "gasPrice" : "1",
+ "nonce" : "",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "b94f5374fce5edbc8e2a8697c15331677e6ebf0b",
+ "value" : "502"
+ }
+ },
+ "TransactionSendingToEmpty" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "45678256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "500",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "6295ee1b4f6dd65047762f924ecd367c17eabf8f" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "99500",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "100000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "500",
+ "gasPrice" : "1",
+ "nonce" : "",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "",
+ "value" : ""
+ }
+ },
+ "TransactionSendingToZero" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "45678256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000000" : {
+ "balance" : "1",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "500",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "99499",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "100000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "5000",
+ "gasPrice" : "1",
+ "nonce" : "",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "0000000000000000000000000000000000000000",
+ "value" : "1"
+ }
+ },
+ "TransactionToItself" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "45678256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "500",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "99500",
+ "code" : "0x",
+ "nonce" : "1",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "100000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "5000",
+ "gasPrice" : "1",
+ "nonce" : "",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "a94f5374fce5edbc8e2a8697c15331677e6ebf0b",
+ "value" : "1"
+ }
+ },
+ "TransactionToItselfNotEnoughFounds" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "45678256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : 1,
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1101",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1101",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "600",
+ "gasPrice" : "1",
+ "nonce" : "",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "a94f5374fce5edbc8e2a8697c15331677e6ebf0b",
+ "value" : "502"
+ }
+ }
+} \ No newline at end of file
diff --git a/tests/files/TODO b/tests/files/TODO
new file mode 100644
index 000000000..91d0f358b
--- /dev/null
+++ b/tests/files/TODO
@@ -0,0 +1,21 @@
+- Move over to standard and clear JSON format:
+
+All files should be of the form:
+
+{
+ "test1name":
+ {
+ "test1property1": ...,
+ "test1property2": ...,
+ ...
+ },
+ "test2name":
+ {
+ "test2property1": ...,
+ "test2property2": ...,
+ ...
+ }
+}
+
+Arrays are allowed, but don't use them for sets of properties - only use them for data that is clearly a continuous contiguous sequence of values.
+
diff --git a/tests/files/TrieTests/trieanyorder.json b/tests/files/TrieTests/trieanyorder.json
new file mode 100644
index 000000000..ebf5fbff0
--- /dev/null
+++ b/tests/files/TrieTests/trieanyorder.json
@@ -0,0 +1,55 @@
+{
+ "singleItem": {
+ "in": {
+ "A": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ },
+ "root": "0xd23786fb4a010da3ce639d66d5e904a11dbc02746d1ce25029e53290cabf28ab"
+ },
+ "dogs": {
+ "in": {
+ "doe": "reindeer",
+ "dog": "puppy",
+ "dogglesworth": "cat"
+ },
+ "root": "0x8aad789dff2f538bca5d8ea56e8abe10f4c7ba3a5dea95fea4cd6e7c3a1168d3"
+ },
+ "puppy": {
+ "in": {
+ "do": "verb",
+ "horse": "stallion",
+ "doge": "coin",
+ "dog": "puppy"
+ },
+ "root": "0x5991bb8c6514148a29db676a14ac506cd2cd5775ace63c30a4fe457715e9ac84"
+ },
+ "foo": {
+ "in": {
+ "foo": "bar",
+ "food": "bat",
+ "food": "bass"
+ },
+ "root": "0x17beaa1648bafa633cda809c90c04af50fc8aed3cb40d16efbddee6fdf63c4c3"
+ },
+ "smallValues": {
+ "in": {
+ "be": "e",
+ "dog": "puppy",
+ "bed": "d"
+ },
+ "root": "0x3f67c7a47520f79faa29255d2d3c084a7a6df0453116ed7232ff10277a8be68b"
+ },
+ "testy": {
+ "in": {
+ "test": "test",
+ "te": "testy"
+ },
+ "root": "0x8452568af70d8d140f58d941338542f645fcca50094b20f3c3d8c3df49337928"
+ },
+ "hex": {
+ "in": {
+ "0x0045": "0x0123456789",
+ "0x4500": "0x9876543210"
+ },
+ "root": "0x285505fcabe84badc8aa310e2aae17eddc7d120aabec8a476902c8184b3a3503"
+ }
+}
diff --git a/tests/files/TrieTests/trietest.json b/tests/files/TrieTests/trietest.json
new file mode 100644
index 000000000..ce5c2d191
--- /dev/null
+++ b/tests/files/TrieTests/trietest.json
@@ -0,0 +1,31 @@
+{
+ "emptyValues": {
+ "in": [
+ ["do", "verb"],
+ ["ether", "wookiedoo"],
+ ["horse", "stallion"],
+ ["shaman", "horse"],
+ ["doge", "coin"],
+ ["ether", null],
+ ["dog", "puppy"],
+ ["shaman", null]
+ ],
+ "root": "0x5991bb8c6514148a29db676a14ac506cd2cd5775ace63c30a4fe457715e9ac84"
+ },
+ "jeff": {
+ "in": [
+ ["0x0000000000000000000000000000000000000000000000000000000000000045", "0x22b224a1420a802ab51d326e29fa98e34c4f24ea"],
+ ["0x0000000000000000000000000000000000000000000000000000000000000046", "0x67706c2076330000000000000000000000000000000000000000000000000000"],
+ ["0x0000000000000000000000000000000000000000000000000000001234567890", "0x697c7b8c961b56f675d570498424ac8de1a918f6"],
+ ["0x000000000000000000000000697c7b8c961b56f675d570498424ac8de1a918f6", "0x1234567890"],
+ ["0x0000000000000000000000007ef9e639e2733cb34e4dfc576d4b23f72db776b2", "0x4655474156000000000000000000000000000000000000000000000000000000"],
+ ["0x000000000000000000000000ec4f34c97e43fbb2816cfd95e388353c7181dab1", "0x4e616d6552656700000000000000000000000000000000000000000000000000"],
+ ["0x4655474156000000000000000000000000000000000000000000000000000000", "0x7ef9e639e2733cb34e4dfc576d4b23f72db776b2"],
+ ["0x4e616d6552656700000000000000000000000000000000000000000000000000", "0xec4f34c97e43fbb2816cfd95e388353c7181dab1"],
+ ["0x0000000000000000000000000000000000000000000000000000001234567890", null],
+ ["0x000000000000000000000000697c7b8c961b56f675d570498424ac8de1a918f6", "0x6f6f6f6820736f2067726561742c207265616c6c6c793f000000000000000000"],
+ ["0x6f6f6f6820736f2067726561742c207265616c6c6c793f000000000000000000", "0x697c7b8c961b56f675d570498424ac8de1a918f6"]
+ ],
+ "root": "0x9f6221ebb8efe7cff60a716ecb886e67dd042014be444669f0159d8e68b42100"
+ }
+}
diff --git a/tests/files/TrieTests/trietestnextprev.json b/tests/files/TrieTests/trietestnextprev.json
new file mode 100644
index 000000000..f2ad924e3
--- /dev/null
+++ b/tests/files/TrieTests/trietestnextprev.json
@@ -0,0 +1,19 @@
+{
+ "basic": {
+ "in": [ "cat", "doge", "wallace" ],
+ "tests": [
+ [ "", "", "cat" ],
+ [ "bobo", "", "cat" ],
+ [ "c", "", "cat" ],
+ [ "car", "", "cat" ],
+ [ "cat", "", "doge" ],
+ [ "catering", "cat", "doge" ],
+ [ "d", "cat", "doge" ],
+ [ "doge", "cat", "wallace" ],
+ [ "dogerton", "doge", "wallace" ],
+ [ "w", "doge", "wallace" ],
+ [ "wallace", "doge", "" ],
+ [ "wallace123", "wallace", ""]
+ ]
+ }
+}
diff --git a/tests/files/VMTests/RandomTests/randomTest.json b/tests/files/VMTests/RandomTests/randomTest.json
new file mode 100644
index 000000000..dad2ee4a2
--- /dev/null
+++ b/tests/files/VMTests/RandomTests/randomTest.json
@@ -0,0 +1,46 @@
+{
+ "randomVMtest" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x675545",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9999",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x675545",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x675545",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/tests/files/VMTests/vmArithmeticTest.json b/tests/files/VMTests/vmArithmeticTest.json
new file mode 100644
index 000000000..88d209dfa
--- /dev/null
+++ b/tests/files/VMTests/vmArithmeticTest.json
@@ -0,0 +1,3261 @@
+{
+ "add0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "add1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60047fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60047fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x03"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60047fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "add2" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "10000",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "add3" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6000600001600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9896",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6000600001600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6000600001600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "add4" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600101600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9896",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600101600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600101600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "addmod0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60026002600108600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9695",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60026002600108600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60026002600108600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "addmod1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60026002600003600160000308600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9691",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60026002600003600160000308600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60026002600003600160000308600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "addmod2" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60036001600660000308600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9693",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60036001600660000308600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x02"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60036001600660000308600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "addmod2_0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60036001600660000308600360056000030714600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9887",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60036001600660000308600360056000030714600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60036001600660000308600360056000030714600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "addmod2_1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60036001600660000308600360056000030614600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9687",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60036001600660000308600360056000030614600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60036001600660000308600360056000030614600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "addmod3" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60036000036001600408600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9693",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60036000036001600408600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x05"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60036000036001600408600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "addmod3_0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60026003600003600160040814600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9891",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60026003600003600160040814600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60026003600003600160040814600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "divByNonZero0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6002600504600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6002600504600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x02"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6002600504600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "divByNonZero1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6018601704600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9896",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6018601704600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6018601704600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "divByNonZero2" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6018600004600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9896",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6018600004600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6018600004600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "divByNonZero3" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6001600104600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6001600104600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6001600104600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "divByZero" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6000600204600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9896",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6000600204600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6000600204600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "exp0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x600260020a600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9695",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600260020a600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x04"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600260020a600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "exp1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9664",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "exp2" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x637fffffff637fffffff0a600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9692",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x637fffffff637fffffff0a600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xbc8cccccccc888888880000000aaaaaab00000000fffffffffffffff7fffffff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x637fffffff637fffffff0a600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "exp3" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x637fffffff60000a600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9892",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x637fffffff60000a600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x637fffffff60000a600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "exp4" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6000637fffffff0a600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6000637fffffff0a600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6000637fffffff0a600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "exp5" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60016101010a600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9695",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60016101010a600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x0101"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60016101010a600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "exp6" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x61010160010a600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9694",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x61010160010a600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x61010160010a600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "exp7" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x61010160020a600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9894",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x61010160020a600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x61010160020a600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "mod0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6003600206600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6003600206600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x02"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6003600206600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "mod1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff06600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff06600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff06600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "mod2" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600006600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9896",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600006600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600006600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "mod3" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6000600306600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9896",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6000600306600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6000600306600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "mod4" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6003600260000306600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9694",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6003600260000306600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x02"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6003600260000306600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "mul0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6003600202600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6003600202600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x06"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6003600202600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "mul1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "mul2" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6017600002600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9896",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6017600002600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6017600002600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "mul3" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6001601702600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6001601702600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x17"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6001601702600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "mul4" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f800000000000000000000000000000000000000000000000000000000000000002600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f800000000000000000000000000000000000000000000000000000000000000002600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x8000000000000000000000000000000000000000000000000000000000000000"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f800000000000000000000000000000000000000000000000000000000000000002600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "mul5" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7f80000000000000000000000000000000000000000000000000000000000000007f800000000000000000000000000000000000000000000000000000000000000002600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9896",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7f80000000000000000000000000000000000000000000000000000000000000007f800000000000000000000000000000000000000000000000000000000000000002600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7f80000000000000000000000000000000000000000000000000000000000000007f800000000000000000000000000000000000000000000000000000000000000002600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "mul6" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "mulmod0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60026002600109600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9895",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60026002600109600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60026002600109600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "mulmod1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60036002600003600160000309600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9891",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60036002600003600160000309600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60036002600003600160000309600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "mulmod2" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60036001600560000309600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9693",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60036001600560000309600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x02"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60036001600560000309600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "mulmod2_0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60036001600560000309600360056000030714600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9887",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60036001600560000309600360056000030714600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60036001600560000309600360056000030714600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "mulmod2_1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60036001600560000309600360056000030614600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9687",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60036001600560000309600360056000030614600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60036001600560000309600360056000030614600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "mulmod3" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60036000036001600509600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9693",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60036000036001600509600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x05"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60036000036001600509600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "mulmod3_0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60026003600003600160050914600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9891",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60026003600003600160050914600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60026003600003600160050914600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "sdiv0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60000305600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9694",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60000305600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60000305600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "sdiv1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff05600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9694",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff05600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff05600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "sdiv2" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6004600003600260000305600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9892",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6004600003600260000305600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6004600003600260000305600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "sdiv3" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6002600003600405600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9694",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6002600003600405600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6002600003600405600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "sdivByZero0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6000600003600360000305600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9892",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6000600003600360000305600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6000600003600360000305600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "sdivByZero1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60000305600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9894",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60000305600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60000305600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "signextendInvalidByteNumber" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x62126af460500b600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x62126af460500b600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x126af4"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x62126af460500b600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "signextend_00" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x600060000b600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9896",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600060000b600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600060000b600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "signextend_0_BigByte" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60000b600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60000b600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60000b600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "signextend_AlmostBiggestByte" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0b600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0b600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0b600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "signextend_BigByteBigByte" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0b600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0b600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0b600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "signextend_BigBytePlus1_2" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60ff68f000000000000000010b600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60ff68f000000000000000010b600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60ff68f000000000000000010b600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "signextend_BigByte_0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0b600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9896",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0b600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0b600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "signextend_BitIsNotSet" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x62122f6a60000b600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x62122f6a60000b600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x6a"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x62122f6a60000b600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "signextend_BitIsNotSetInHigherByte" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x62126af460010b600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x62126af460010b600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x6af4"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x62126af460010b600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "signextend_BitIsSetInHigherByte" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6212faf460010b600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6212faf460010b600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaf4"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6212faf460010b600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "signextend_bigBytePlus1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x66f000000000000161ffff0b600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x66f000000000000161ffff0b600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xf0000000000001"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x66f000000000000161ffff0b600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "signextend_bitIsSet" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x62122ff460000b600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x62122ff460000b600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x62122ff460000b600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "smod0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6003600003600560000307600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9692",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6003600003600560000307600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6003600003600560000307600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "smod1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6003600003600507600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9694",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6003600003600507600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x02"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6003600003600507600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "smod2" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6003600560000307600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9694",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6003600560000307600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6003600560000307600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "smod3" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600260000307600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9894",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600260000307600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600260000307600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "smod4" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6000600260000307600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9894",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6000600260000307600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6000600260000307600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "stop" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x00",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "10000",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x00",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x00",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "sub0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6001601703600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6001601703600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x16"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6001601703600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "sub1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6003600203600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6003600203600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6003600203600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "sub2" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6017600003600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6017600003600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe9"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6017600003600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "sub3" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600003600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600003600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600003600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "sub4" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ }
+}
diff --git a/tests/files/VMTests/vmBitwiseLogicOperationTest.json b/tests/files/VMTests/vmBitwiseLogicOperationTest.json
new file mode 100644
index 000000000..f72711995
--- /dev/null
+++ b/tests/files/VMTests/vmBitwiseLogicOperationTest.json
@@ -0,0 +1,2682 @@
+{
+ "and0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6002600216600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6002600216600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x02"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6002600216600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "and1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6001600216600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9896",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6001600216600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6001600216600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "and2" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6001600316600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6001600316600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6001600316600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "and3" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7f0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7f0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7f0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "and4" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7feeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee16600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7feeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee16600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7feeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee16600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "and5" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7feeeeeeeeeeeeeeeeeeeeeeeeeeeeefeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee16600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7feeeeeeeeeeeeeeeeeeeeeeeeeeeeefeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee16600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeefeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7feeeeeeeeeeeeeeeeeeeeeeeeeeeeefeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee16600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "byte0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6780402010080402016000601f031a600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9694",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6780402010080402016000601f031a600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6780402010080402016000601f031a600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "byte1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6780402010080402016001601f031a600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9694",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6780402010080402016001601f031a600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x02"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6780402010080402016001601f031a600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "byte10" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6780402010080402017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1a600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9896",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6780402010080402017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1a600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6780402010080402017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1a600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "byte11" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x67804020100804020160001a600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9896",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x67804020100804020160001a600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x67804020100804020160001a600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "byte2" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6780402010080402016002601f031a600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9694",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6780402010080402016002601f031a600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x04"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6780402010080402016002601f031a600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "byte3" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6780402010080402016003601f031a600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9694",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6780402010080402016003601f031a600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x08"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6780402010080402016003601f031a600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "byte4" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6780402010080402016004601f031a600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9694",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6780402010080402016004601f031a600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x10"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6780402010080402016004601f031a600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "byte5" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6780402010080402016005601f031a600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9694",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6780402010080402016005601f031a600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x20"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6780402010080402016005601f031a600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "byte6" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6780402010080402016006601f031a600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9694",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6780402010080402016006601f031a600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x40"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6780402010080402016006601f031a600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "byte7" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6780402010080402016007601f031a600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9694",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6780402010080402016007601f031a600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x80"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6780402010080402016007601f031a600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "byte8" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x678040201008040201601f601f031a600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9894",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x678040201008040201601f601f031a600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x678040201008040201601f601f031a600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "byte9" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6780402010080402016020601f051a600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9894",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6780402010080402016020601f051a600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6780402010080402016020601f051a600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "eq0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6003600003600560000314600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9892",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6003600003600560000314600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6003600003600560000314600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "eq1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6000600014600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6000600014600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6000600014600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "eq2" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "gt0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6000600260000311600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9694",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6000600260000311600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6000600260000311600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "gt1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6002600003600011600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9894",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6002600003600011600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6002600003600011600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "gt2" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff11600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff11600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff11600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "gt3" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600011600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9896",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600011600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600011600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "iszeo2" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6080600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6080600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x80"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6080600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "iszero0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6080600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6080600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x80"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6080600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "iszero1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6080600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6080600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x80"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6080600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "lt0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6000600260000310600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9894",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6000600260000310600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6000600260000310600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "lt1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6002600003600010600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9694",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6002600003600010600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6002600003600010600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "lt2" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff10600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9896",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff10600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff10600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "lt3" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600010600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600010600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600010600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "not0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x600015600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9697",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600015600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600015600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "not1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x600215600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9897",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600215600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600215600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "not2" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff15600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9897",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff15600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff15600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "not3" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x600260000315600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9895",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600260000315600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600260000315600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "not4" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60000315600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9895",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60000315600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60000315600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "not5" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x600060000315600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9695",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600060000315600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600060000315600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "or0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6002600217600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6002600217600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x02"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6002600217600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "or1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6001600217600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6001600217600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x03"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6001600217600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "or2" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6001600317600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6001600317600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x03"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6001600317600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "or3" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7f0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff17600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7f0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff17600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7f0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff17600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "or4" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7feeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee17600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7feeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee17600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7feeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee17600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "or5" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7feeeeeeeeeeeeeeeeeeeeeeeeeeeeefeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee17600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7feeeeeeeeeeeeeeeeeeeeeeeeeeeeefeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee17600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7feeeeeeeeeeeeeeeeeeeeeeeeeeeeefeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee17600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "sgt0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6000600260000313600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9894",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6000600260000313600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6000600260000313600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "sgt1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6002600003600013600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9694",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6002600003600013600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6002600003600013600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "sgt2" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff13600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9896",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff13600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff13600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "sgt3" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600013600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600013600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600013600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "sgt4" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6003600003600560000313600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9892",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6003600003600560000313600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6003600003600560000313600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "slt0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6000600260000312600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9694",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6000600260000312600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6000600260000312600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "slt1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6002600003600012600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9894",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6002600003600012600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6002600003600012600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "slt2" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff12600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff12600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff12600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "slt3" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600012600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9896",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600012600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600012600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "slt4" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6003600003600560000312600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9692",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6003600003600560000312600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6003600003600560000312600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "xor0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6002600218600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9896",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6002600218600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6002600218600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "xor1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6001600218600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6001600218600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x03"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6001600218600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "xor2" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6001600318600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6001600318600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x02"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6001600318600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "xor3" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7f0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff18600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7f0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff18600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xfedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7f0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff18600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "xor4" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7feeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee18600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7feeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee18600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x1111111111111111111111111111111111111111111111111111111111111111"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7feeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee18600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "xor5" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7feeeeeeeeeeeeeeeeeeeeeeeeeeeeefeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee18600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7feeeeeeeeeeeeeeeeeeeeeeeeeeeeefeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee18600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x1111111111111111111111111111101111111111111111111111111111111111"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7feeeeeeeeeeeeeeeeeeeeeeeeeeeeefeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee18600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/tests/files/VMTests/vmBlockInfoTest.json b/tests/files/VMTests/vmBlockInfoTest.json
new file mode 100644
index 000000000..90fa77a3d
--- /dev/null
+++ b/tests/files/VMTests/vmBlockInfoTest.json
@@ -0,0 +1,271 @@
+{
+ "coinbase" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x41600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x41600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x41600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "difficulty" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x44600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x44600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x0100"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x44600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "gaslimit" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x45600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x45600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x0f4240"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x45600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "number" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x43600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9898",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x43600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x43600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "prevhash" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x40600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x40600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x40600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "timestamp" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x42600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x42600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x42600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/tests/files/VMTests/vmEnvironmentalInfoTest.json b/tests/files/VMTests/vmEnvironmentalInfoTest.json
new file mode 100644
index 000000000..37563707b
--- /dev/null
+++ b/tests/files/VMTests/vmEnvironmentalInfoTest.json
@@ -0,0 +1,1401 @@
+{
+ "address0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x30600055",
+ "data" : "0x",
+ "gas" : "100000000000",
+ "gasPrice" : "1000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "99999999698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x30600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x30600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "address1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "caller" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "code" : "0x30600055",
+ "data" : "0x",
+ "gas" : "100000000000",
+ "gasPrice" : "1000000000",
+ "origin" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "99999999698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "cd1722f3947def4cf144679da39c4c32bdc35681" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x30600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xcd1722f3947def4cf144679da39c4c32bdc35681"
+ }
+ }
+ },
+ "pre" : {
+ "cd1722f3947def4cf144679da39c4c32bdc35681" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x30600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "balance0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x73cd1722f3947def4cf144679da39c4c32bdc3568131600055",
+ "data" : "0x",
+ "gas" : "100000000000",
+ "gasPrice" : "1000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "99999999878",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x73cd1722f3947def4cf144679da39c4c32bdc3568131600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "cd1722f3947def4cf144679da39c4c32bdc35681" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x73cd1722f3947def4cf144679da39c4c32bdc3568131600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "balance1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x730f572e5295c57f15886f9b263e2f6d2d6c7b5ec631600055",
+ "data" : "0x",
+ "gas" : "100000000000",
+ "gasPrice" : "1000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "99999999678",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x730f572e5295c57f15886f9b263e2f6d2d6c7b5ec631600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x0de0b6b3a7640000"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x730f572e5295c57f15886f9b263e2f6d2d6c7b5ec631600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "balanceAddress2" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x3031730f572e5295c57f15886f9b263e2f6d2d6c7b5ec63114600055",
+ "data" : "0x",
+ "gas" : "100000000000",
+ "gasPrice" : "1000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "99999999656",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x3031730f572e5295c57f15886f9b263e2f6d2d6c7b5ec63114600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x3031730f572e5295c57f15886f9b263e2f6d2d6c7b5ec63114600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "balanceCaller3" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x333173cd1722f3947def4cf144679da39c4c32bdc356813114600055",
+ "data" : "0x",
+ "gas" : "100000000000",
+ "gasPrice" : "1000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "99999999656",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x333173cd1722f3947def4cf144679da39c4c32bdc356813114600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ },
+ "cd1722f3947def4cf144679da39c4c32bdc35681" : {
+ "balance" : "0",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x333173cd1722f3947def4cf144679da39c4c32bdc356813114600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "calldatacopy0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60026001600037600051600055",
+ "data" : "0x01234567890abcdef01234567890abcdef",
+ "gas" : "100000000000",
+ "gasPrice" : "1000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "99999999691",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60026001600037600051600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x2345000000000000000000000000000000000000000000000000000000000000"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60026001600037600051600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "calldatacopy1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60016001600037600051600055",
+ "data" : "0x01234567890abcdef01234567890abcdef",
+ "gas" : "100000000000",
+ "gasPrice" : "1000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "99999999691",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60016001600037600051600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x2300000000000000000000000000000000000000000000000000000000000000"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60016001600037600051600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "calldatacopy2" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60006001600037600051600055",
+ "data" : "0x01234567890abcdef01234567890abcdef",
+ "gas" : "100000000000",
+ "gasPrice" : "1000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "99999999892",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006001600037600051600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006001600037600051600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "calldatacopy_DataIndexTooHigh" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60ff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa600037600051600055",
+ "data" : "0x01234567890abcdef01234567890abcdef",
+ "gas" : "100000000000",
+ "gasPrice" : "1000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "99999999877",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60ff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa600037600051600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60ff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa600037600051600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "calldatacopy_DataIndexTooHigh2" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60097ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa600037600051600055",
+ "data" : "0x01234567890abcdef01234567890abcdef",
+ "gas" : "100000000000",
+ "gasPrice" : "1000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "99999999891",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60097ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa600037600051600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60097ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa600037600051600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "calldataload0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x600035600055",
+ "data" : "0x0256",
+ "gas" : "100000000000",
+ "gasPrice" : "1000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "99999999697",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600035600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x0256000000000000000000000000000000000000000000000000000000000000"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600035600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "calldataload1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x600135600055",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff23",
+ "gas" : "100000000000",
+ "gasPrice" : "1000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "99999999697",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600135600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff23"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600135600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "calldataload2" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x600535600055",
+ "data" : "0x0123456789abcdef0000000000000000000000000000000000000000000000000024",
+ "gas" : "100000000000",
+ "gasPrice" : "1000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "99999999697",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600535600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xabcdef0000000000000000000000000000000000000000000000000024000000"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600535600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "calldataloadSizeTooHigh" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa35600055",
+ "data" : "0x0123456789abcdef0000000000000000000000000000000000000000000000000024",
+ "gas" : "100000000000",
+ "gasPrice" : "1000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "99999999897",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa35600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa35600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "calldatasize0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x36600055",
+ "data" : "0x0256",
+ "gas" : "100000000000",
+ "gasPrice" : "1000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "99999999698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x36600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x02"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x36600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "calldatasize1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x36600055",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff23",
+ "gas" : "100000000000",
+ "gasPrice" : "1000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "99999999698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x36600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x21"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x36600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "calldatasize2" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x36600055",
+ "data" : "0x230000000000000000000000000000000000000000000000000000000000000023",
+ "gas" : "100000000000",
+ "gasPrice" : "1000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "99999999698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x36600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x21"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x36600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "caller" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x33600055",
+ "data" : "0x",
+ "gas" : "100000000000",
+ "gasPrice" : "1000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "99999999698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x33600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xcd1722f3947def4cf144679da39c4c32bdc35681"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x33600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "callvalue" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x34600055",
+ "data" : "0x",
+ "gas" : "100000000000",
+ "gasPrice" : "1000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "99999999698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x34600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x0de0b6b3a7640000"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x34600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "codecopy0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60056000600039600051600055",
+ "data" : "0x01234567890abcdef01234567890abcdef",
+ "gas" : "100000000000",
+ "gasPrice" : "1000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "99999999691",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60056000600039600051600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x6005600060000000000000000000000000000000000000000000000000000000"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60056000600039600051600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "codecopy1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x386000600039600051600055",
+ "data" : "0x01234567890abcdef01234567890abcdef",
+ "gas" : "100000000000",
+ "gasPrice" : "1000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "99999999691",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x386000600039600051600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x3860006000396000516000550000000000000000000000000000000000000000"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x386000600039600051600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "codecopy_DataIndexTooHigh" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60087ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa600039600051600055",
+ "data" : "0x01234567890abcdef01234567890abcdef",
+ "gas" : "100000000000",
+ "gasPrice" : "1000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "99999999891",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60087ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa600039600051600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60087ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa600039600051600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "codesize" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x38600055",
+ "data" : "0x01234567890abcdef01234567890abcdef",
+ "gas" : "100000000000",
+ "gasPrice" : "1000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "99999999698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x38600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x04"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x38600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "extcodecopy0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x333b60006000333c600051600055",
+ "data" : "0x01234567890abcdef01234567890abcdef",
+ "gas" : "100000000000",
+ "gasPrice" : "123456789",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "99999999689",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x333b60006000333c600051600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x6005600055000000000000000000000000000000000000000000000000000000"
+ }
+ },
+ "cd1722f3947def4cf144679da39c4c32bdc35681" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6005600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x333b60006000333c600051600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "cd1722f3947def4cf144679da39c4c32bdc35681" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6005600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "extcodecopy_DataIndexTooHigh" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60087ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa6000303c600051600055",
+ "data" : "0x01234567890abcdef01234567890abcdef",
+ "gas" : "100000000000",
+ "gasPrice" : "1000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "99999999890",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60087ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa6000303c600051600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60087ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa6000303c600051600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "extcodesize0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x38333b14600055",
+ "data" : "0x01234567890abcdef01234567890abcdef",
+ "gas" : "100000000000",
+ "gasPrice" : "123456789",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "99999999695",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x38333b14600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x01"
+ }
+ },
+ "cd1722f3947def4cf144679da39c4c32bdc35681" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x38333b14600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x38333b14600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "cd1722f3947def4cf144679da39c4c32bdc35681" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x38333b14600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "extcodesize1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "caller" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "code" : "0x333b600055",
+ "data" : "0x01234567890abcdef01234567890abcdef",
+ "gas" : "100000000000",
+ "gasPrice" : "123456789",
+ "origin" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "99999999697",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x38600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "cd1722f3947def4cf144679da39c4c32bdc35681" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x333b600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x04"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x38600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ },
+ "cd1722f3947def4cf144679da39c4c32bdc35681" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x333b600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "gasprice" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x3a600055",
+ "data" : "0x01234567890abcdef01234567890abcdef",
+ "gas" : "100000000000",
+ "gasPrice" : "123456789",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "99999999698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x3a600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x075bcd15"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x3a600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "origin" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x32600055",
+ "data" : "0x",
+ "gas" : "100000000000",
+ "gasPrice" : "1000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "99999999698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x32600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xcd1722f3947def4cf144679da39c4c32bdc35681"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x32600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/tests/files/VMTests/vmIOandFlowOperationsTest.json b/tests/files/VMTests/vmIOandFlowOperationsTest.json
new file mode 100644
index 000000000..120977086
--- /dev/null
+++ b/tests/files/VMTests/vmIOandFlowOperationsTest.json
@@ -0,0 +1,1527 @@
+{
+ "dupAt51becameMload" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x600260035155",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9695",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600260035155",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x02"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600260035155",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "gas0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x64ffffffffff60005261eeee605a525a600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9688",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x64ffffffffff60005261eeee605a525a600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x2705"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x64ffffffffff60005261eeee605a525a600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "gas1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x5a600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x5a600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x270f"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x5a600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "jump0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60236007566001600255",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60236007566001600255",
+ "nonce" : "0",
+ "storage" : {
+ "0x02" : "0x23"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60236007566001600255",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "jump0_foreverOutOfGas" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x600056",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600056",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "jump0_jumpdest0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x602360075660015b600255",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9695",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x602360075660015b600255",
+ "nonce" : "0",
+ "storage" : {
+ "0x02" : "0x23"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x602360075660015b600255",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "jump0_jumpdest1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x602360085660015b600255",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x602360085660015b600255",
+ "nonce" : "0",
+ "storage" : {
+ "0x02" : "0x23"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x602360085660015b600255",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "jump0_jumpdest2" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6023600a6008505660015b600255",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9693",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6023600a6008505660015b600255",
+ "nonce" : "0",
+ "storage" : {
+ "0x02" : "0x23"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6023600a6008505660015b600255",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "jump0_jumpdest3" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6023600b6008505660015b600255",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6023600b6008505660015b600255",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "jump1" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x620fffff620fffff0156",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x620fffff620fffff0156",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "jumpi0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x602360016009576001600255",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9695",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x602360016009576001600255",
+ "nonce" : "0",
+ "storage" : {
+ "0x02" : "0x23"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x602360016009576001600255",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "jumpi1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x602360006009576001600255",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9694",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x602360006009576001600255",
+ "nonce" : "0",
+ "storage" : {
+ "0x02" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x602360006009576001600255",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "jumpi1_jumpdest" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60236001600a5760015b600255",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9695",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60236001600a5760015b600255",
+ "nonce" : "0",
+ "storage" : {
+ "0x02" : "0x23"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60236001600a5760015b600255",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "jumpi2" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff576002600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9997",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff576002600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff576002600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "mloadError0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x600051600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9896",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600051600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600051600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "mloadError1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6017600152600051600155",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9892",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6017600152600051600155",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6017600152600051600155",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "mloadOutOfGasError2" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6272482551600155",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6272482551600155",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "msize0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60ff60005259600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9694",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60ff60005259600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x20"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60ff60005259600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "msize1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x64ffffffffff60005259600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9694",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x64ffffffffff60005259600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x20"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x64ffffffffff60005259600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "msize2" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x64ffffffffff60005261eeee60205259600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9690",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x64ffffffffff60005261eeee60205259600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x40"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x64ffffffffff60005261eeee60205259600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "msize3" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x64ffffffffff60005261eeee605a5259600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9688",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x64ffffffffff60005261eeee605a5259600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x80"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x64ffffffffff60005261eeee605a5259600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "mstore0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600152600151600155",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9692",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600152600151600155",
+ "nonce" : "0",
+ "storage" : {
+ "0x01" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600152600151600155",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "mstore1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600201600152600151600155",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9690",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600201600152600151600155",
+ "nonce" : "0",
+ "storage" : {
+ "0x01" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600201600152600151600155",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "mstore8WordToBigError" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "10000",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "mstore8_0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600153600151600155",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9692",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600153600151600155",
+ "nonce" : "0",
+ "storage" : {
+ "0x01" : "0xff00000000000000000000000000000000000000000000000000000000000000"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600153600151600155",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "mstore8_1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60ff60015360ee600253600051600155",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9690",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60ff60015360ee600253600051600155",
+ "nonce" : "0",
+ "storage" : {
+ "0x01" : "0xffee0000000000000000000000000000000000000000000000000000000000"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60ff60015360ee600253600051600155",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "mstoreWordToBigError" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "10000",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "mstore_mload0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6017600052600051600155",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9693",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6017600052600051600155",
+ "nonce" : "0",
+ "storage" : {
+ "0x01" : "0x17"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6017600052600051600155",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "pc0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x58600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9898",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x58600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x58600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "pc1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60ff60005558600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9596",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60ff60005558600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x05"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60ff60005558600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "pop0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6002600360045055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6002600360045055",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0x02"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6002600360045055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "pop1" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x5060026003600455",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x5060026003600455",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "sstore_load_0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60ff60005560ee600a55600054601455",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9074",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60ff60005560ee600a55600054601455",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xff",
+ "0x0a" : "0xee",
+ "0x14" : "0xff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60ff60005560ee600a55600054601455",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "sstore_load_1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60ff60005560ee600a55606454601455",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9274",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60ff60005560ee600a55606454601455",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xff",
+ "0x0a" : "0xee"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60ff60005560ee600a55606454601455",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "sstore_load_2" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60ff60005560ee60015560dd600255600154600a55600254601455",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "8450",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60ff60005560ee60015560dd600255600154600a55600254601455",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xff",
+ "0x01" : "0xee",
+ "0x02" : "0xdd",
+ "0x0a" : "0xee",
+ "0x14" : "0xdd"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60ff60005560ee60015560dd600255600154600a55600254601455",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "swapAt52becameMstore" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x600260035255",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600260035255",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/tests/files/VMTests/vmLogTest.json b/tests/files/VMTests/vmLogTest.json
new file mode 100644
index 000000000..48e20ac63
--- /dev/null
+++ b/tests/files/VMTests/vmLogTest.json
@@ -0,0 +1,2190 @@
+{
+ "log0_emptyMem" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60006000a0",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9966",
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x",
+ "topics" : [
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000a0",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000a0",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log0_logMemStartTooHigh" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log0_logMemsizeTooHigh" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001a0",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001a0",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log0_logMemsizeZero" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006001a0",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9962",
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0x",
+ "topics" : [
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006001a0",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006001a0",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log0_nonEmptyMem" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005260206000a0",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9930",
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005260206000a0",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005260206000a0",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log0_nonEmptyMem_logMemSize1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260016000a0",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9961",
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xaa",
+ "topics" : [
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260016000a0",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260016000a0",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log0_nonEmptyMem_logMemSize1_logMemStart31" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526001601fa0",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9961",
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xdd",
+ "topics" : [
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526001601fa0",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526001601fa0",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log1_Caller" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60ff6000533360206000a1",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9897",
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000008000000808100000000000000000000000000000880000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xff00000000000000000000000000000000000000000000000000000000000000",
+ "topics" : [
+ "000000000000000000000000cd1722f3947def4cf144679da39c4c32bdc35681"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60ff6000533360206000a1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60ff6000533360206000a1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log1_MaxTopic" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60206000a1",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9897",
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000200000800000000000000000000000000000000880000000000000000000000000000000000000000000000010000000000000000000000020",
+ "data" : "0xaabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd",
+ "topics" : [
+ "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60206000a1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60206000a1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log1_emptyMem" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x600060006000a1",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9933",
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0x",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600060006000a1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600060006000a1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log1_logMemStartTooHigh" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log1_logMemsizeTooHigh" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001a1",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001a1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log1_logMemsizeZero" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006001a1",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9929",
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0x",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006001a1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006001a1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log1_nonEmptyMem" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600052600060206000a1",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9897",
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600052600060206000a1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600052600060206000a1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log1_nonEmptyMem_logMemSize1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060016000a1",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9928",
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0xaa",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060016000a1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060016000a1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log1_nonEmptyMem_logMemSize1_logMemStart31" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006001601fa1",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9928",
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0xdd",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006001601fa1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006001601fa1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log2_Caller" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60ff60005333600060206000a2",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9864",
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000008000000808100000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0xff00000000000000000000000000000000000000000000000000000000000000",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "000000000000000000000000cd1722f3947def4cf144679da39c4c32bdc35681"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60ff60005333600060206000a2",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60ff60005333600060206000a2",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log2_MaxTopic" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60206000a2",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9864",
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000200000800000000000000000000000000000000880000000000000000000000000000000000000000000000010000000000000000000000020",
+ "data" : "0xaabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd",
+ "topics" : [
+ "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60206000a2",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60206000a2",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log2_emptyMem" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6000600060006000a2",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9900",
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0x",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6000600060006000a2",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6000600060006000a2",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log2_logMemStartTooHigh" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa2",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa2",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log2_logMemsizeTooHigh" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001a2",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001a2",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log2_logMemsizeZero" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060006001a2",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9896",
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0x",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060006001a2",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060006001a2",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log2_nonEmptyMem" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000526000600060206000a2",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9864",
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000526000600060206000a2",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000526000600060206000a2",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log2_nonEmptyMem_logMemSize1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060016000a2",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9895",
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0xaa",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060016000a2",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060016000a2",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log2_nonEmptyMem_logMemSize1_logMemStart31" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006001601fa2",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9895",
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0xdd",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006001601fa2",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006001601fa2",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log3_Caller" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60ff600053336000600060206000a3",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9831",
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000008000000808100000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0xff00000000000000000000000000000000000000000000000000000000000000",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "000000000000000000000000cd1722f3947def4cf144679da39c4c32bdc35681"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60ff600053336000600060206000a3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60ff600053336000600060206000a3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log3_MaxTopic" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60206000a3",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9831",
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000200000800000000000000000000000000000000880000000000000000000000000000000000000000000000010000000000000000000000020",
+ "data" : "0xaabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd",
+ "topics" : [
+ "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60206000a3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60206000a3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log3_PC" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60ff60005358585860206000a3",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9831",
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00003004000000000000800000000010000008000000000000000980000000000000000000000000000000000000000000001000000400000000000800000000",
+ "data" : "0xff00000000000000000000000000000000000000000000000000000000000000",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000007",
+ "0000000000000000000000000000000000000000000000000000000000000006",
+ "0000000000000000000000000000000000000000000000000000000000000005"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60ff60005358585860206000a3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60ff60005358585860206000a3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log3_emptyMem" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60006000600060006000a3",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9867",
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0x",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006000a3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006000a3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log3_logMemStartTooHigh" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa3",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log3_logMemsizeTooHigh" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001a3",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001a3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log3_logMemsizeZero" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060006001a3",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9863",
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0x",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060006001a3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060006001a3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log3_nonEmptyMem" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005260006000600060206000a3",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9831",
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005260006000600060206000a3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005260006000600060206000a3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log3_nonEmptyMem_logMemSize1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060016000a3",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9862",
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0xaa",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060016000a3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060016000a3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log3_nonEmptyMem_logMemSize1_logMemStart31" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060006001601fa3",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9862",
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0xdd",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060006001601fa3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060006001601fa3",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log4_Caller" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "10000",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log4_MaxTopic" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60206000a4",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9798",
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000200000800000000000000000000000000000000880000000000000000000000000000000000000000000000010000000000000000000000020",
+ "data" : "0xaabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd",
+ "topics" : [
+ "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60206000a4",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60206000a4",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log4_PC" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "10000",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log4_emptyMem" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x600060006000600060006000a4",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9834",
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0x",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600060006000600060006000a4",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600060006000600060006000a4",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log4_logMemStartTooHigh" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006000600060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa4",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006000600060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa4",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log4_logMemsizeTooHigh" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001a4",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001a4",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log4_logMemsizeZero" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006000600060006001a4",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9830",
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0x",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006000600060006001a4",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006000600060006001a4",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log4_nonEmptyMem" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600052600060006000600060206000a4",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9798",
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600052600060006000600060206000a4",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600052600060006000600060206000a4",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log4_nonEmptyMem_logMemSize1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006000600060016000a4",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9829",
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0xaa",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006000600060016000a4",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006000600060016000a4",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log4_nonEmptyMem_logMemSize1_logMemStart31" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060006001601fa4",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9829",
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000",
+ "data" : "0xdd",
+ "topics" : [
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000"
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060006001601fa4",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060006001601fa4",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "log_2logs" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005260206000a060106002a0",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9880",
+ "logs" : [
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ },
+ {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "bloom" : "00000000000000000000800000000000000000000000000000000880000000000000000000000000000000000000000000000000000000000000000000000000",
+ "data" : "0xffffffffffffffffffffffffffffffff",
+ "topics" : [
+ ]
+ }
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005260206000a060106002a0",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005260206000a060106002a0",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/tests/files/VMTests/vmPushDupSwapTest.json b/tests/files/VMTests/vmPushDupSwapTest.json
new file mode 100644
index 000000000..9c69aed80
--- /dev/null
+++ b/tests/files/VMTests/vmPushDupSwapTest.json
@@ -0,0 +1,3072 @@
+{
+ "dup1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7f10112233445566778899aabbccddeeff00112233445566778899aabbccddeeff80600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9697",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7f10112233445566778899aabbccddeeff00112233445566778899aabbccddeeff80600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0x10112233445566778899aabbccddeeff00112233445566778899aabbccddeeff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7f10112233445566778899aabbccddeeff00112233445566778899aabbccddeeff80600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "dup10" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x600a60096008600760066005600460036002600189600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9688",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600a60096008600760066005600460036002600189600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0x0a"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600a60096008600760066005600460036002600189600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "dup11" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x600b600a6009600860076006600560046003600260018a600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9687",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600b600a6009600860076006600560046003600260018a600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0x0b"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600b600a6009600860076006600560046003600260018a600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "dup12" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x600c600b600a6009600860076006600560046003600260018b600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9686",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600c600b600a6009600860076006600560046003600260018b600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0x0c"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600c600b600a6009600860076006600560046003600260018b600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "dup13" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x600d600c600b600a6009600860076006600560046003600260018c600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9685",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600d600c600b600a6009600860076006600560046003600260018c600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0x0d"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600d600c600b600a6009600860076006600560046003600260018c600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "dup14" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x600e600d600c600b600a6009600860076006600560046003600260018d600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9684",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600e600d600c600b600a6009600860076006600560046003600260018d600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0x0e"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600e600d600c600b600a6009600860076006600560046003600260018d600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "dup15" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x600f600e600d600c600b600a6009600860076006600560046003600260018e600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9683",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600f600e600d600c600b600a6009600860076006600560046003600260018e600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0x0f"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600f600e600d600c600b600a6009600860076006600560046003600260018e600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "dup16" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6010600f600e600d600c600b600a6009600860076006600560046003600260018f600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9682",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6010600f600e600d600c600b600a6009600860076006600560046003600260018f600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0x10"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6010600f600e600d600c600b600a6009600860076006600560046003600260018f600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "dup2" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6002600181600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6002600181600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0x02"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6002600181600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "dup2error" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7f10112233445566778899aabbccddeeff00112233445566778899aabbccddeeff81600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7f10112233445566778899aabbccddeeff00112233445566778899aabbccddeeff81600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "dup3" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60036002600182600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9695",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60036002600182600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0x03"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60036002600182600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "dup4" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x600460036002600183600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9694",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600460036002600183600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0x04"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600460036002600183600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "dup5" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6005600460036002600184600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9693",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6005600460036002600184600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0x05"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6005600460036002600184600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "dup6" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60066005600460036002600185600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9692",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60066005600460036002600185600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0x06"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60066005600460036002600185600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "dup7" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x600760066005600460036002600186600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9691",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600760066005600460036002600186600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0x07"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600760066005600460036002600186600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "dup8" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6008600760066005600460036002600187600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9690",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6008600760066005600460036002600187600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0x08"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6008600760066005600460036002600187600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "dup9" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60096008600760066005600460036002600188600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9689",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60096008600760066005600460036002600188600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0x09"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60096008600760066005600460036002600188600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "push1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60ff600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60ff600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0xff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60ff600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "push10" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6966778899aabbccddeeff600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6966778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0x66778899aabbccddeeff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6966778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "push11" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6a5566778899aabbccddeeff600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6a5566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0x5566778899aabbccddeeff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6a5566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "push12" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6b445566778899aabbccddeeff600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6b445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0x445566778899aabbccddeeff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6b445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "push13" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6c33445566778899aabbccddeeff600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6c33445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0x33445566778899aabbccddeeff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6c33445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "push14" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6d2233445566778899aabbccddeeff600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6d2233445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0x2233445566778899aabbccddeeff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6d2233445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "push15" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6e112233445566778899aabbccddeeff600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6e112233445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0x112233445566778899aabbccddeeff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6e112233445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "push16" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6f10112233445566778899aabbccddeeff600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6f10112233445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0x10112233445566778899aabbccddeeff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6f10112233445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "push17" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x70ff00112233445566778899aabbccddeeff600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x70ff00112233445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0xff00112233445566778899aabbccddeeff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x70ff00112233445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "push18" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x71eeff00112233445566778899aabbccddeeff600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x71eeff00112233445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0xeeff00112233445566778899aabbccddeeff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x71eeff00112233445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "push19" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x72ddeeff00112233445566778899aabbccddeeff600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x72ddeeff00112233445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0xddeeff00112233445566778899aabbccddeeff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x72ddeeff00112233445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "push1_missingStack" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9999",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "push2" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x61eeff600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x61eeff600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0xeeff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x61eeff600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "push20" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x73ccddeeff00112233445566778899aabbccddeeff600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x73ccddeeff00112233445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0xccddeeff00112233445566778899aabbccddeeff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x73ccddeeff00112233445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "push21" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x74bbccddeeff00112233445566778899aabbccddeeff600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x74bbccddeeff00112233445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0xbbccddeeff00112233445566778899aabbccddeeff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x74bbccddeeff00112233445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "push22" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x75aabbccddeeff00112233445566778899aabbccddeeff600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x75aabbccddeeff00112233445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0xaabbccddeeff00112233445566778899aabbccddeeff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x75aabbccddeeff00112233445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "push23" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7699aabbccddeeff00112233445566778899aabbccddeeff600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7699aabbccddeeff00112233445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0x99aabbccddeeff00112233445566778899aabbccddeeff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7699aabbccddeeff00112233445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "push24" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x778899aabbccddeeff00112233445566778899aabbccddeeff600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x778899aabbccddeeff00112233445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0x8899aabbccddeeff00112233445566778899aabbccddeeff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x778899aabbccddeeff00112233445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "push25" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x78778899aabbccddeeff00112233445566778899aabbccddeeff600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x78778899aabbccddeeff00112233445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0x778899aabbccddeeff00112233445566778899aabbccddeeff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x78778899aabbccddeeff00112233445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "push26" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7966778899aabbccddeeff00112233445566778899aabbccddeeff600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7966778899aabbccddeeff00112233445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0x66778899aabbccddeeff00112233445566778899aabbccddeeff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7966778899aabbccddeeff00112233445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "push27" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7a5566778899aabbccddeeff00112233445566778899aabbccddeeff600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7a5566778899aabbccddeeff00112233445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0x5566778899aabbccddeeff00112233445566778899aabbccddeeff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7a5566778899aabbccddeeff00112233445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "push28" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7b445566778899aabbccddeeff00112233445566778899aabbccddeeff600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7b445566778899aabbccddeeff00112233445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0x445566778899aabbccddeeff00112233445566778899aabbccddeeff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7b445566778899aabbccddeeff00112233445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "push29" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7c33445566778899aabbccddeeff00112233445566778899aabbccddeeff600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7c33445566778899aabbccddeeff00112233445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0x33445566778899aabbccddeeff00112233445566778899aabbccddeeff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7c33445566778899aabbccddeeff00112233445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "push3" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x62ddeeff600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x62ddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0xddeeff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x62ddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "push30" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7d2233445566778899aabbccddeeff00112233445566778899aabbccddeeff600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7d2233445566778899aabbccddeeff00112233445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0x2233445566778899aabbccddeeff00112233445566778899aabbccddeeff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7d2233445566778899aabbccddeeff00112233445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "push31" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7e112233445566778899aabbccddeeff00112233445566778899aabbccddeeff600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7e112233445566778899aabbccddeeff00112233445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0x112233445566778899aabbccddeeff00112233445566778899aabbccddeeff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7e112233445566778899aabbccddeeff00112233445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "push32" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7f10112233445566778899aabbccddeeff00112233445566778899aabbccddeeff600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7f10112233445566778899aabbccddeeff00112233445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0x10112233445566778899aabbccddeeff00112233445566778899aabbccddeeff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7f10112233445566778899aabbccddeeff00112233445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "push32AndSuicide" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7fff10112233445566778899aabbccddeeff00112233445566778899aabbccddeeff600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9999",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "bbccddeeff00112233445566778899aabbccddee" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fff10112233445566778899aabbccddeeff00112233445566778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "push32FillUpInputWithZerosAtTheEnd" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7fff10112233445566778899aabbccddeeff00112233445566778899aabbccdd",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9999",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fff10112233445566778899aabbccddeeff00112233445566778899aabbccdd",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fff10112233445566778899aabbccddeeff00112233445566778899aabbccdd",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "push4" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x63ccddeeff600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x63ccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0xccddeeff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x63ccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "push5" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x64bbccddeeff600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x64bbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0xbbccddeeff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x64bbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "push6" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x65aabbccddeeff600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x65aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0xaabbccddeeff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x65aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "push7" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6699aabbccddeeff600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6699aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0x99aabbccddeeff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6699aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "push8" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x678899aabbccddeeff600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x678899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0x8899aabbccddeeff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x678899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "push9" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x68778899aabbccddeeff600355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9698",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x68778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0x778899aabbccddeeff"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x68778899aabbccddeeff600355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "swap1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7f10112233445566778899aabbccddeeff00112233445566778899aabbccddeeff60039055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9697",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7f10112233445566778899aabbccddeeff00112233445566778899aabbccddeeff60039055",
+ "nonce" : "0",
+ "storage" : {
+ "0x10112233445566778899aabbccddeeff00112233445566778899aabbccddeeff" : "0x03"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7f10112233445566778899aabbccddeeff00112233445566778899aabbccddeeff60039055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "swap10" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x600a60096008600760066005600460036002600160039955",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9688",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600a60096008600760066005600460036002600160039955",
+ "nonce" : "0",
+ "storage" : {
+ "0x0a" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600a60096008600760066005600460036002600160039955",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "swap11" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x600b600a60096008600760066005600460036002600160039a55",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9687",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600b600a60096008600760066005600460036002600160039a55",
+ "nonce" : "0",
+ "storage" : {
+ "0x0b" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600b600a60096008600760066005600460036002600160039a55",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "swap12" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x600c600b600a60096008600760066005600460036002600160039b55",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9686",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600c600b600a60096008600760066005600460036002600160039b55",
+ "nonce" : "0",
+ "storage" : {
+ "0x0c" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600c600b600a60096008600760066005600460036002600160039b55",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "swap13" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x600d600c600b600a60096008600760066005600460036002600160039c55",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9685",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600d600c600b600a60096008600760066005600460036002600160039c55",
+ "nonce" : "0",
+ "storage" : {
+ "0x0d" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600d600c600b600a60096008600760066005600460036002600160039c55",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "swap14" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x600e600d600c600b600a60096008600760066005600460036002600160039d55",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9684",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600e600d600c600b600a60096008600760066005600460036002600160039d55",
+ "nonce" : "0",
+ "storage" : {
+ "0x0e" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600e600d600c600b600a60096008600760066005600460036002600160039d55",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "swap15" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x600f600e600d600c600b600a60096008600760066005600460036002600160039e55",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9683",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600f600e600d600c600b600a60096008600760066005600460036002600160039e55",
+ "nonce" : "0",
+ "storage" : {
+ "0x0f" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600f600e600d600c600b600a60096008600760066005600460036002600160039e55",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "swap16" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6010600f600e600d600c600b600a60096008600760066005600460036002600160039f55",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9682",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6010600f600e600d600c600b600a60096008600760066005600460036002600160039f55",
+ "nonce" : "0",
+ "storage" : {
+ "0x10" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6010600f600e600d600c600b600a60096008600760066005600460036002600160039f55",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "swap2" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6002600160039155",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9696",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6002600160039155",
+ "nonce" : "0",
+ "storage" : {
+ "0x02" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6002600160039155",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "swap2error" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7f10112233445566778899aabbccddeeff00112233445566778899aabbccddeeff60039155",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7f10112233445566778899aabbccddeeff00112233445566778899aabbccddeeff60039155",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "swap3" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60036002600160039255",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9695",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60036002600160039255",
+ "nonce" : "0",
+ "storage" : {
+ "0x03" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60036002600160039255",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "swap4" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x600460036002600160039355",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9694",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600460036002600160039355",
+ "nonce" : "0",
+ "storage" : {
+ "0x04" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600460036002600160039355",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "swap5" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6005600460036002600160039455",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9693",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6005600460036002600160039455",
+ "nonce" : "0",
+ "storage" : {
+ "0x05" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6005600460036002600160039455",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "swap6" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60066005600460036002600160039555",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9692",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60066005600460036002600160039555",
+ "nonce" : "0",
+ "storage" : {
+ "0x06" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60066005600460036002600160039555",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "swap7" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x600760066005600460036002600160039655",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9691",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600760066005600460036002600160039655",
+ "nonce" : "0",
+ "storage" : {
+ "0x07" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600760066005600460036002600160039655",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "swap8" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6008600760066005600460036002600160039755",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9690",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6008600760066005600460036002600160039755",
+ "nonce" : "0",
+ "storage" : {
+ "0x08" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6008600760066005600460036002600160039755",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "swap9" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60096008600760066005600460036002600160039855",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9689",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60096008600760066005600460036002600160039855",
+ "nonce" : "0",
+ "storage" : {
+ "0x09" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60096008600760066005600460036002600160039855",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/tests/files/VMTests/vmSha3Test.json b/tests/files/VMTests/vmSha3Test.json
new file mode 100644
index 000000000..b9e6b46a1
--- /dev/null
+++ b/tests/files/VMTests/vmSha3Test.json
@@ -0,0 +1,253 @@
+{
+ "sha3_0" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6000600020600055",
+ "data" : "0x",
+ "gas" : "100000000000",
+ "gasPrice" : "1000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "99999999687",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6000600020600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6000600020600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "sha3_1" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6005600420600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9676",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6005600420600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0xc41589e7559804ea4a2080dad19d876a024ccb05117835447d72ce08c1d020ec"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6005600420600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "sha3_2" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x600a600a20600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9676",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600a600a20600055",
+ "nonce" : "0",
+ "storage" : {
+ "0x" : "0x6bd2dd6bd408cbee33429358bf24fdc64612fbf8b1b4db604518f40ffd34b607"
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600a600a20600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "sha3_3" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x620fffff6103e820600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x620fffff6103e820600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "sha3_4" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x6064640fffffffff20600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x6064640fffffffff20600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "sha3_5" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x640fffffffff61271020600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x640fffffffff61271020600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "sha3_6" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff20600055",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff20600055",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/tests/files/VMTests/vmtests.json b/tests/files/VMTests/vmtests.json
new file mode 100644
index 000000000..e1d73ee5d
--- /dev/null
+++ b/tests/files/VMTests/vmtests.json
@@ -0,0 +1,214 @@
+{
+ "arith" : {
+ "callcreates" : [
+ {
+ "data" : "0x",
+ "destination" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "gasLimit" : "9770",
+ "value" : "74"
+ }
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x600060006000600060026002600803036002600306600260020460046004600402026002600201010101013360c85a03f1",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9949",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "999999999999999926",
+ "code" : "0x600060006000600060026002600803036002600306600260020460046004600402026002600201010101013360c85a03f1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600060006000600060026002600803036002600306600260020460046004600402026002600201010101013360c85a03f1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "boolean" : {
+ "callcreates" : [
+ {
+ "data" : "0x",
+ "destination" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "gasLimit" : "9786",
+ "value" : "2"
+ },
+ {
+ "data" : "0x",
+ "destination" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "gasLimit" : "9728",
+ "value" : "12"
+ },
+ {
+ "data" : "0x",
+ "destination" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "gasLimit" : "9691",
+ "value" : "13"
+ },
+ {
+ "data" : "0x",
+ "destination" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "gasLimit" : "9654",
+ "value" : "14"
+ }
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x600160011615601a57600060006000600060023360c85a03f1505b600060011615603557600060006000600060033360c85a03f1505b600160001615605057600060006000600060043360c85a03f1505b600060001615606b57600060006000600060053360c85a03f1505b6001600117156086576000600060006000600c3360c85a03f1505b60006001171560a1576000600060006000600d3360c85a03f1505b60016000171560bc576000600060006000600e3360c85a03f1505b60006000171560d7576000600060006000600f3360c85a03f1505b",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9824",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "999999999999999959",
+ "code" : "0x600160011615601a57600060006000600060023360c85a03f1505b600060011615603557600060006000600060033360c85a03f1505b600160001615605057600060006000600060043360c85a03f1505b600060001615606b57600060006000600060053360c85a03f1505b6001600117156086576000600060006000600c3360c85a03f1505b60006001171560a1576000600060006000600d3360c85a03f1505b60016000171560bc576000600060006000600e3360c85a03f1505b60006000171560d7576000600060006000600f3360c85a03f1505b",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x600160011615601a57600060006000600060023360c85a03f1505b600060011615603557600060006000600060033360c85a03f1505b600160001615605057600060006000600060043360c85a03f1505b600060001615606b57600060006000600060053360c85a03f1505b6001600117156086576000600060006000600c3360c85a03f1505b60006001171560a1576000600060006000600d3360c85a03f1505b60016000171560bc576000600060006000600e3360c85a03f1505b60006000171560d7576000600060006000600f3360c85a03f1505b",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "mktx" : {
+ "callcreates" : [
+ {
+ "data" : "0x",
+ "destination" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "gasLimit" : "9792",
+ "value" : "500000000000000000"
+ }
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x60006000600060006706f05b59d3b200003360c85a03f1",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9971",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "500000000000000000",
+ "code" : "0x60006000600060006706f05b59d3b200003360c85a03f1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x60006000600060006706f05b59d3b200003360c85a03f1",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "suicide" : {
+ "callcreates" : [
+ ],
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "256",
+ "currentGasLimit" : "1000000",
+ "currentNumber" : "0",
+ "currentTimestamp" : "1",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "exec" : {
+ "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
+ "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "code" : "0x33ff",
+ "data" : "0x",
+ "gas" : "10000",
+ "gasPrice" : "100000000000000",
+ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
+ "value" : "1000000000000000000"
+ },
+ "gas" : "9999",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "cd1722f3947def4cf144679da39c4c32bdc35681" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
+ "balance" : "1000000000000000000",
+ "code" : "0x33ff",
+ "nonce" : "0",
+ "storage" : {
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/tests/files/index.js b/tests/files/index.js
new file mode 100644
index 000000000..34a03d8b2
--- /dev/null
+++ b/tests/files/index.js
@@ -0,0 +1,32 @@
+module.exports = {
+ blockgenesis: require('./BasicTests/blockgenesistest'),
+ genesishashes: require('./BasicTests/genesishashestest'),
+ hexencode: require('./BasicTests/hexencodetest'),
+ keyaddrtests: require('./BasicTests/keyaddrtest'),
+ rlptest: require('./BasicTests/rlptest'),
+ trietest: require('./TrieTests/trietest'),
+ trietestnextprev: require('./TrieTests/trietestnextprev'),
+ txtest: require('./BasicTests/txtest'),
+ StateTests: {
+ stExample: require('./StateTests/stExample.json'),
+ stInitCodeTest: require('./StateTests/stInitCodeTest.json'),
+ stLogTests: require('./StateTests/stLogTests.json'),
+ stPreCompiledContracts: require('./StateTests/stPreCompiledContracts'),
+ stRecursiveCreate: require('./StateTests/stRecursiveCreate'),
+ stSpecial: require('./StateTests/stSpecialTest'),
+ stSystemOperationsTest: require('./StateTests/stSystemOperationsTest'),
+ stTransactionTest: require('./StateTests/stTransactionTest')
+ },
+ VMTests: {
+ vmRandom: require('./VMTests/RandomTests/randomTest'),
+ vmArithmeticTest: require('./VMTests/vmArithmeticTest'),
+ vmBitwiseLogicOperationTest: require('./VMTests/vmBitwiseLogicOperationTest'),
+ vmBlockInfoTest: require('./VMTests/vmBlockInfoTest'),
+ vmEnvironmentalInfoTest: require('./VMTests/vmEnvironmentalInfoTest'),
+ vmIOandFlowOperationsTest: require('./VMTests/vmIOandFlowOperationsTest'),
+ vmLogTest: require('./VMTests/vmLogTest'),
+ vmPushDupSwapTest: require('./VMTests/vmPushDupSwapTest'),
+ vmSha3Test: require('./VMTests/vmSha3Test'),
+ vmtests: require('./VMTests/vmtests')
+ }
+};
diff --git a/tests/files/package.json b/tests/files/package.json
new file mode 100644
index 000000000..eb0841450
--- /dev/null
+++ b/tests/files/package.json
@@ -0,0 +1,23 @@
+{
+ "name": "ethereum-tests",
+ "version": "0.0.0",
+ "description": "tests for ethereum",
+ "main": "index.js",
+ "scripts": {
+ "test": "echo \"There are no tests for there tests\" && exit 1"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/ethereum/tests"
+ },
+ "keywords": [
+ "tests",
+ "ethereum"
+ ],
+ "author": "",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/ethereum/tests/issues"
+ },
+ "homepage": "https://github.com/ethereum/tests"
+}
diff --git a/tests/helper/common.go b/tests/helper/common.go
new file mode 100644
index 000000000..6a071968d
--- /dev/null
+++ b/tests/helper/common.go
@@ -0,0 +1,11 @@
+package helper
+
+import "github.com/ethereum/go-ethereum/ethutil"
+
+func FromHex(h string) []byte {
+ if ethutil.IsHex(h) {
+ h = h[2:]
+ }
+
+ return ethutil.Hex2Bytes(h)
+}
diff --git a/tests/helper/init.go b/tests/helper/init.go
new file mode 100644
index 000000000..578314e20
--- /dev/null
+++ b/tests/helper/init.go
@@ -0,0 +1,20 @@
+package helper
+
+import (
+ "log"
+ "os"
+
+ "github.com/ethereum/go-ethereum/ethutil"
+ logpkg "github.com/ethereum/go-ethereum/logger"
+)
+
+var Logger logpkg.LogSystem
+var Log = logpkg.NewLogger("TEST")
+
+func init() {
+ Logger = logpkg.NewStdLogSystem(os.Stdout, log.LstdFlags, logpkg.InfoLevel)
+ logpkg.AddLogSystem(Logger)
+
+ ethutil.ReadConfig(".ethtest", "/tmp/ethtest", "")
+ ethutil.Config.Db, _ = NewMemDatabase()
+}
diff --git a/tests/helper/readers.go b/tests/helper/readers.go
new file mode 100644
index 000000000..03313aeda
--- /dev/null
+++ b/tests/helper/readers.go
@@ -0,0 +1,42 @@
+package helper
+
+import (
+ "encoding/json"
+ "io"
+ "io/ioutil"
+ "net/http"
+ "os"
+ "testing"
+)
+
+func readJSON(t *testing.T, reader io.Reader, value interface{}) {
+ data, err := ioutil.ReadAll(reader)
+ err = json.Unmarshal(data, &value)
+ if err != nil {
+ t.Error(err)
+ }
+}
+
+func CreateHttpTests(t *testing.T, uri string, value interface{}) {
+ resp, err := http.Get(uri)
+ if err != nil {
+ t.Error(err)
+
+ return
+ }
+ defer resp.Body.Close()
+
+ readJSON(t, resp.Body, value)
+}
+
+func CreateFileTests(t *testing.T, fn string, value interface{}) {
+ file, err := os.Open(fn)
+ if err != nil {
+ t.Error(err)
+
+ return
+ }
+ defer file.Close()
+
+ readJSON(t, file, value)
+}
diff --git a/tests/helper/trie.go b/tests/helper/trie.go
new file mode 100644
index 000000000..32432cc7a
--- /dev/null
+++ b/tests/helper/trie.go
@@ -0,0 +1,31 @@
+package helper
+
+import "github.com/ethereum/go-ethereum/trie"
+
+type MemDatabase struct {
+ db map[string][]byte
+}
+
+func NewMemDatabase() (*MemDatabase, error) {
+ db := &MemDatabase{db: make(map[string][]byte)}
+ return db, nil
+}
+func (db *MemDatabase) Put(key []byte, value []byte) {
+ db.db[string(key)] = value
+}
+func (db *MemDatabase) Get(key []byte) ([]byte, error) {
+ return db.db[string(key)], nil
+}
+func (db *MemDatabase) Delete(key []byte) error {
+ delete(db.db, string(key))
+ return nil
+}
+func (db *MemDatabase) Print() {}
+func (db *MemDatabase) Close() {}
+func (db *MemDatabase) LastKnownTD() []byte { return nil }
+
+func NewTrie() *trie.Trie {
+ db, _ := NewMemDatabase()
+
+ return trie.New(db, "")
+}
diff --git a/tests/helper/vm.go b/tests/helper/vm.go
new file mode 100644
index 000000000..e174e0892
--- /dev/null
+++ b/tests/helper/vm.go
@@ -0,0 +1,156 @@
+package helper
+
+import (
+ "math/big"
+
+ "github.com/ethereum/go-ethereum/core"
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/state"
+ "github.com/ethereum/go-ethereum/vm"
+)
+
+type Env struct {
+ depth int
+ state *state.StateDB
+ skipTransfer bool
+ Gas *big.Int
+
+ origin []byte
+ parent []byte
+ coinbase []byte
+
+ number *big.Int
+ time int64
+ difficulty *big.Int
+ gasLimit *big.Int
+
+ logs state.Logs
+}
+
+func NewEnv(state *state.StateDB) *Env {
+ return &Env{
+ state: state,
+ }
+}
+
+func NewEnvFromMap(state *state.StateDB, envValues map[string]string, exeValues map[string]string) *Env {
+ env := NewEnv(state)
+
+ env.origin = ethutil.Hex2Bytes(exeValues["caller"])
+ env.parent = ethutil.Hex2Bytes(envValues["previousHash"])
+ env.coinbase = ethutil.Hex2Bytes(envValues["currentCoinbase"])
+ env.number = ethutil.Big(envValues["currentNumber"])
+ env.time = ethutil.Big(envValues["currentTimestamp"]).Int64()
+ env.difficulty = ethutil.Big(envValues["currentDifficulty"])
+ env.gasLimit = ethutil.Big(envValues["currentGasLimit"])
+ env.Gas = new(big.Int)
+
+ return env
+}
+
+func (self *Env) Origin() []byte { return self.origin }
+func (self *Env) BlockNumber() *big.Int { return self.number }
+func (self *Env) PrevHash() []byte { return self.parent }
+func (self *Env) Coinbase() []byte { return self.coinbase }
+func (self *Env) Time() int64 { return self.time }
+func (self *Env) Difficulty() *big.Int { return self.difficulty }
+func (self *Env) BlockHash() []byte { return nil }
+func (self *Env) State() *state.StateDB { return self.state }
+func (self *Env) GasLimit() *big.Int { return self.gasLimit }
+func (self *Env) AddLog(log state.Log) {
+ self.logs = append(self.logs, log)
+}
+func (self *Env) Depth() int { return self.depth }
+func (self *Env) SetDepth(i int) { self.depth = i }
+func (self *Env) Transfer(from, to vm.Account, amount *big.Int) error {
+ return vm.Transfer(from, to, amount)
+}
+
+func (self *Env) vm(addr, data []byte, gas, price, value *big.Int) *core.Execution {
+ exec := core.NewExecution(self, addr, data, gas, price, value)
+ exec.SkipTransfer = self.skipTransfer
+
+ return exec
+}
+
+func (self *Env) Call(caller vm.ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error) {
+ exe := self.vm(addr, data, gas, price, value)
+ ret, err := exe.Call(addr, caller)
+ self.Gas = exe.Gas
+
+ return ret, err
+}
+func (self *Env) CallCode(caller vm.ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error) {
+ exe := self.vm(caller.Address(), data, gas, price, value)
+ return exe.Call(addr, caller)
+}
+
+func (self *Env) Create(caller vm.ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error, vm.ClosureRef) {
+ exe := self.vm(addr, data, gas, price, value)
+ return exe.Create(caller)
+}
+
+func RunVm(state *state.StateDB, env, exec map[string]string) ([]byte, state.Logs, *big.Int, error) {
+ var (
+ to = FromHex(exec["address"])
+ from = FromHex(exec["caller"])
+ data = FromHex(exec["data"])
+ gas = ethutil.Big(exec["gas"])
+ price = ethutil.Big(exec["gasPrice"])
+ value = ethutil.Big(exec["value"])
+ )
+
+ caller := state.GetOrNewStateObject(from)
+
+ vmenv := NewEnvFromMap(state, env, exec)
+ vmenv.skipTransfer = true
+ ret, err := vmenv.Call(caller, to, data, gas, price, value)
+
+ return ret, vmenv.logs, vmenv.Gas, err
+}
+
+func RunState(statedb *state.StateDB, env, tx map[string]string) ([]byte, state.Logs, *big.Int, error) {
+ var (
+ keyPair, _ = crypto.NewKeyPairFromSec([]byte(ethutil.Hex2Bytes(tx["secretKey"])))
+ to = FromHex(tx["to"])
+ data = FromHex(tx["data"])
+ gas = ethutil.Big(tx["gasLimit"])
+ price = ethutil.Big(tx["gasPrice"])
+ value = ethutil.Big(tx["value"])
+ caddr = FromHex(env["currentCoinbase"])
+ )
+
+ coinbase := statedb.GetOrNewStateObject(caddr)
+ coinbase.SetGasPool(ethutil.Big(env["currentGasLimit"]))
+
+ message := NewMessage(keyPair.Address(), to, data, value, gas, price)
+ Log.DebugDetailf("message{ to: %x, from %x, value: %v, gas: %v, price: %v }\n", message.to[:4], message.from[:4], message.value, message.gas, message.price)
+ st := core.NewStateTransition(coinbase, message, statedb, nil)
+ vmenv := NewEnvFromMap(statedb, env, tx)
+ vmenv.origin = keyPair.Address()
+ st.Env = vmenv
+ ret, err := st.TransitionState()
+ statedb.Update(vmenv.Gas)
+
+ return ret, vmenv.logs, vmenv.Gas, err
+}
+
+type Message struct {
+ from, to []byte
+ value, gas, price *big.Int
+ data []byte
+}
+
+func NewMessage(from, to, data []byte, value, gas, price *big.Int) Message {
+ return Message{from, to, value, gas, price, data}
+}
+
+func (self Message) Hash() []byte { return nil }
+func (self Message) From() []byte { return self.from }
+func (self Message) To() []byte { return self.to }
+func (self Message) GasPrice() *big.Int { return self.price }
+func (self Message) Gas() *big.Int { return self.gas }
+func (self Message) Value() *big.Int { return self.value }
+func (self Message) Nonce() uint64 { return 0 }
+func (self Message) Data() []byte { return self.data }
diff --git a/tests/vm/.ethtest b/tests/vm/.ethtest
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/vm/.ethtest
diff --git a/tests/vm/gh_test.go b/tests/vm/gh_test.go
new file mode 100644
index 000000000..1efda7fe0
--- /dev/null
+++ b/tests/vm/gh_test.go
@@ -0,0 +1,238 @@
+package vm
+
+import (
+ "bytes"
+ "math/big"
+ "strconv"
+ "testing"
+
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/logger"
+ "github.com/ethereum/go-ethereum/state"
+ "github.com/ethereum/go-ethereum/tests/helper"
+)
+
+type Account struct {
+ Balance string
+ Code string
+ Nonce string
+ Storage map[string]string
+}
+
+type Log struct {
+ AddressF string `json:"address"`
+ DataF string `json:"data"`
+ TopicsF []string `json:"topics"`
+ BloomF string `json:"bloom"`
+}
+
+func (self Log) Address() []byte { return ethutil.Hex2Bytes(self.AddressF) }
+func (self Log) Data() []byte { return ethutil.Hex2Bytes(self.DataF) }
+func (self Log) RlpData() interface{} { return nil }
+func (self Log) Topics() [][]byte {
+ t := make([][]byte, len(self.TopicsF))
+ for i, topic := range self.TopicsF {
+ t[i] = ethutil.Hex2Bytes(topic)
+ }
+ return t
+}
+
+func StateObjectFromAccount(addr string, account Account) *state.StateObject {
+ obj := state.NewStateObject(ethutil.Hex2Bytes(addr))
+ obj.SetBalance(ethutil.Big(account.Balance))
+
+ if ethutil.IsHex(account.Code) {
+ account.Code = account.Code[2:]
+ }
+ obj.Code = ethutil.Hex2Bytes(account.Code)
+ obj.Nonce = ethutil.Big(account.Nonce).Uint64()
+
+ return obj
+}
+
+type Env struct {
+ CurrentCoinbase string
+ CurrentDifficulty string
+ CurrentGasLimit string
+ CurrentNumber string
+ CurrentTimestamp interface{}
+ PreviousHash string
+}
+
+type VmTest struct {
+ Callcreates interface{}
+ //Env map[string]string
+ Env Env
+ Exec map[string]string
+ Transaction map[string]string
+ Logs []Log
+ Gas string
+ Out string
+ Post map[string]Account
+ Pre map[string]Account
+}
+
+func RunVmTest(p string, t *testing.T) {
+ tests := make(map[string]VmTest)
+ helper.CreateFileTests(t, p, &tests)
+
+ for name, test := range tests {
+ statedb := state.New(helper.NewTrie())
+ for addr, account := range test.Pre {
+ obj := StateObjectFromAccount(addr, account)
+ statedb.SetStateObject(obj)
+ for a, v := range account.Storage {
+ obj.SetState(helper.FromHex(a), ethutil.NewValue(helper.FromHex(v)))
+ }
+ }
+
+ // XXX Yeah, yeah...
+ env := make(map[string]string)
+ env["currentCoinbase"] = test.Env.CurrentCoinbase
+ env["currentDifficulty"] = test.Env.CurrentDifficulty
+ env["currentGasLimit"] = test.Env.CurrentGasLimit
+ env["currentNumber"] = test.Env.CurrentNumber
+ env["previousHash"] = test.Env.PreviousHash
+ if n, ok := test.Env.CurrentTimestamp.(float64); ok {
+ env["currentTimestamp"] = strconv.Itoa(int(n))
+ } else {
+ env["currentTimestamp"] = test.Env.CurrentTimestamp.(string)
+ }
+
+ var (
+ ret []byte
+ gas *big.Int
+ err error
+ logs state.Logs
+ )
+
+ if len(test.Exec) > 0 {
+ ret, logs, gas, err = helper.RunVm(statedb, env, test.Exec)
+ } else {
+ ret, logs, gas, err = helper.RunState(statedb, env, test.Transaction)
+ }
+
+ // When an error is returned it doesn't always mean the tests fails.
+ // Have to come up with some conditional failing mechanism.
+ if err != nil {
+ helper.Log.Infoln(err)
+ }
+
+ rexp := helper.FromHex(test.Out)
+ if bytes.Compare(rexp, ret) != 0 {
+ t.Errorf("%s's return failed. Expected %x, got %x\n", name, rexp, ret)
+ }
+
+ if len(test.Gas) > 0 {
+ gexp := ethutil.Big(test.Gas)
+ if gexp.Cmp(gas) != 0 {
+ t.Errorf("%s's gas failed. Expected %v, got %v\n", name, gexp, gas)
+ }
+ }
+
+ for addr, account := range test.Post {
+ obj := statedb.GetStateObject(helper.FromHex(addr))
+ if obj == nil {
+ continue
+ }
+
+ if len(test.Exec) == 0 {
+ if obj.Balance().Cmp(ethutil.Big(account.Balance)) != 0 {
+ t.Errorf("%s's : (%x) balance failed. Expected %v, got %v => %v\n", name, obj.Address()[:4], account.Balance, obj.Balance(), new(big.Int).Sub(ethutil.Big(account.Balance), obj.Balance()))
+ }
+ }
+
+ for addr, value := range account.Storage {
+ v := obj.GetState(helper.FromHex(addr)).Bytes()
+ vexp := helper.FromHex(value)
+
+ if bytes.Compare(v, vexp) != 0 {
+ t.Errorf("%s's : (%x: %s) storage failed. Expected %x, got %x (%v %v)\n", name, obj.Address()[0:4], addr, vexp, v, ethutil.BigD(vexp), ethutil.BigD(v))
+ }
+ }
+ }
+
+ if len(test.Logs) > 0 {
+ // Logs within the test itself aren't correct, missing empty fields (32 0s)
+ for i, log := range test.Logs {
+ genBloom := ethutil.LeftPadBytes(types.LogsBloom(state.Logs{logs[i]}).Bytes(), 64)
+ if !bytes.Equal(genBloom, ethutil.Hex2Bytes(log.BloomF)) {
+ t.Errorf("bloom mismatch")
+ }
+ }
+ }
+ }
+ logger.Flush()
+}
+
+// I've created a new function for each tests so it's easier to identify where the problem lies if any of them fail.
+func TestVMArithmetic(t *testing.T) {
+ const fn = "../files/vmtests/vmArithmeticTest.json"
+ RunVmTest(fn, t)
+}
+
+func TestBitwiseLogicOperation(t *testing.T) {
+ const fn = "../files/vmtests/vmBitwiseLogicOperationTest.json"
+ RunVmTest(fn, t)
+}
+
+func TestBlockInfo(t *testing.T) {
+ const fn = "../files/vmtests/vmBlockInfoTest.json"
+ RunVmTest(fn, t)
+}
+
+func TestEnvironmentalInfo(t *testing.T) {
+ const fn = "../files/vmtests/vmEnvironmentalInfoTest.json"
+ RunVmTest(fn, t)
+}
+
+func TestFlowOperation(t *testing.T) {
+ const fn = "../files/vmtests/vmIOandFlowOperationsTest.json"
+ RunVmTest(fn, t)
+}
+
+func TestPushDupSwap(t *testing.T) {
+ const fn = "../files/vmtests/vmPushDupSwapTest.json"
+ RunVmTest(fn, t)
+}
+
+func TestVMSha3(t *testing.T) {
+ const fn = "../files/vmtests/vmSha3Test.json"
+ RunVmTest(fn, t)
+}
+
+func TestVm(t *testing.T) {
+ const fn = "../files/vmtests/vmtests.json"
+ RunVmTest(fn, t)
+}
+
+func TestVmLog(t *testing.T) {
+ const fn = "../files/vmtests/vmLogTest.json"
+ RunVmTest(fn, t)
+}
+
+func TestStateSystemOperations(t *testing.T) {
+ const fn = "../files/StateTests/stSystemOperationsTest.json"
+ RunVmTest(fn, t)
+}
+
+func TestStatePreCompiledContracts(t *testing.T) {
+ const fn = "../files/StateTests/stPreCompiledContracts.json"
+ RunVmTest(fn, t)
+}
+
+func TestStateRecursiveCreate(t *testing.T) {
+ const fn = "../files/StateTests/stRecursiveCreate.json"
+ RunVmTest(fn, t)
+}
+
+func TestStateSpecial(t *testing.T) {
+ const fn = "../files/StateTests/stSpecialTest.json"
+ RunVmTest(fn, t)
+}
+
+func TestStateRefund(t *testing.T) {
+ const fn = "../files/StateTests/stRefundTest.json"
+ RunVmTest(fn, t)
+}
diff --git a/trie/encoding.go b/trie/encoding.go
new file mode 100644
index 000000000..4906bc90b
--- /dev/null
+++ b/trie/encoding.go
@@ -0,0 +1,76 @@
+package trie
+
+import (
+ "bytes"
+ "encoding/hex"
+ "strings"
+)
+
+func CompactEncode(hexSlice []byte) string {
+ terminator := 0
+ if hexSlice[len(hexSlice)-1] == 16 {
+ terminator = 1
+ }
+
+ if terminator == 1 {
+ hexSlice = hexSlice[:len(hexSlice)-1]
+ }
+
+ oddlen := len(hexSlice) % 2
+ flags := byte(2*terminator + oddlen)
+ if oddlen != 0 {
+ hexSlice = append([]byte{flags}, hexSlice...)
+ } else {
+ hexSlice = append([]byte{flags, 0}, hexSlice...)
+ }
+
+ var buff bytes.Buffer
+ for i := 0; i < len(hexSlice); i += 2 {
+ buff.WriteByte(byte(16*hexSlice[i] + hexSlice[i+1]))
+ }
+
+ return buff.String()
+}
+
+func CompactDecode(str string) []byte {
+ base := CompactHexDecode(str)
+ base = base[:len(base)-1]
+ if base[0] >= 2 {
+ base = append(base, 16)
+ }
+ if base[0]%2 == 1 {
+ base = base[1:]
+ } else {
+ base = base[2:]
+ }
+
+ return base
+}
+
+func CompactHexDecode(str string) []byte {
+ base := "0123456789abcdef"
+ hexSlice := make([]byte, 0)
+
+ enc := hex.EncodeToString([]byte(str))
+ for _, v := range enc {
+ hexSlice = append(hexSlice, byte(strings.IndexByte(base, byte(v))))
+ }
+ hexSlice = append(hexSlice, 16)
+
+ return hexSlice
+}
+
+func DecodeCompact(key []byte) string {
+ base := "0123456789abcdef"
+ var str string
+
+ for _, v := range key {
+ if v < 16 {
+ str += string(base[v])
+ }
+ }
+
+ res, _ := hex.DecodeString(str)
+
+ return string(res)
+}
diff --git a/trie/encoding_test.go b/trie/encoding_test.go
new file mode 100644
index 000000000..193c898f3
--- /dev/null
+++ b/trie/encoding_test.go
@@ -0,0 +1,59 @@
+package trie
+
+import (
+ checker "gopkg.in/check.v1"
+)
+
+type TrieEncodingSuite struct{}
+
+var _ = checker.Suite(&TrieEncodingSuite{})
+
+func (s *TrieEncodingSuite) TestCompactEncode(c *checker.C) {
+ // even compact encode
+ test1 := []byte{1, 2, 3, 4, 5}
+ res1 := CompactEncode(test1)
+ c.Assert(res1, checker.Equals, "\x11\x23\x45")
+
+ // odd compact encode
+ test2 := []byte{0, 1, 2, 3, 4, 5}
+ res2 := CompactEncode(test2)
+ c.Assert(res2, checker.Equals, "\x00\x01\x23\x45")
+
+ //odd terminated compact encode
+ test3 := []byte{0, 15, 1, 12, 11, 8 /*term*/, 16}
+ res3 := CompactEncode(test3)
+ c.Assert(res3, checker.Equals, "\x20\x0f\x1c\xb8")
+
+ // even terminated compact encode
+ test4 := []byte{15, 1, 12, 11, 8 /*term*/, 16}
+ res4 := CompactEncode(test4)
+ c.Assert(res4, checker.Equals, "\x3f\x1c\xb8")
+}
+
+func (s *TrieEncodingSuite) TestCompactHexDecode(c *checker.C) {
+ exp := []byte{7, 6, 6, 5, 7, 2, 6, 2, 16}
+ res := CompactHexDecode("verb")
+ c.Assert(res, checker.DeepEquals, exp)
+}
+
+func (s *TrieEncodingSuite) TestCompactDecode(c *checker.C) {
+ // odd compact decode
+ exp := []byte{1, 2, 3, 4, 5}
+ res := CompactDecode("\x11\x23\x45")
+ c.Assert(res, checker.DeepEquals, exp)
+
+ // even compact decode
+ exp = []byte{0, 1, 2, 3, 4, 5}
+ res = CompactDecode("\x00\x01\x23\x45")
+ c.Assert(res, checker.DeepEquals, exp)
+
+ // even terminated compact decode
+ exp = []byte{0, 15, 1, 12, 11, 8 /*term*/, 16}
+ res = CompactDecode("\x20\x0f\x1c\xb8")
+ c.Assert(res, checker.DeepEquals, exp)
+
+ // even terminated compact decode
+ exp = []byte{15, 1, 12, 11, 8 /*term*/, 16}
+ res = CompactDecode("\x3f\x1c\xb8")
+ c.Assert(res, checker.DeepEquals, exp)
+}
diff --git a/trie/iterator.go b/trie/iterator.go
new file mode 100644
index 000000000..53d099a0c
--- /dev/null
+++ b/trie/iterator.go
@@ -0,0 +1,143 @@
+package trie
+
+import (
+ "bytes"
+
+ "github.com/ethereum/go-ethereum/ethutil"
+)
+
+type NodeType byte
+
+const (
+ EmptyNode NodeType = iota
+ BranchNode
+ LeafNode
+ ExtNode
+)
+
+func getType(node *ethutil.Value) NodeType {
+ if node.Len() == 0 {
+ return EmptyNode
+ }
+
+ if node.Len() == 2 {
+ k := CompactDecode(node.Get(0).Str())
+ if HasTerm(k) {
+ return LeafNode
+ }
+
+ return ExtNode
+ }
+
+ return BranchNode
+}
+
+type Iterator struct {
+ Path [][]byte
+ trie *Trie
+
+ Key []byte
+ Value *ethutil.Value
+}
+
+func NewIterator(trie *Trie) *Iterator {
+ return &Iterator{trie: trie}
+}
+
+func (self *Iterator) key(node *ethutil.Value, path [][]byte) []byte {
+ switch getType(node) {
+ case LeafNode:
+ k := RemTerm(CompactDecode(node.Get(0).Str()))
+
+ self.Path = append(path, k)
+ self.Value = node.Get(1)
+
+ return k
+ case BranchNode:
+ if node.Get(16).Len() > 0 {
+ return []byte{16}
+ }
+
+ for i := byte(0); i < 16; i++ {
+ o := self.key(self.trie.getNode(node.Get(int(i)).Raw()), append(path, []byte{i}))
+ if o != nil {
+ return append([]byte{i}, o...)
+ }
+ }
+ case ExtNode:
+ currKey := node.Get(0).Bytes()
+
+ return self.key(self.trie.getNode(node.Get(1).Raw()), append(path, currKey))
+ }
+
+ return nil
+}
+
+func (self *Iterator) next(node *ethutil.Value, key []byte, path [][]byte) []byte {
+ switch typ := getType(node); typ {
+ case EmptyNode:
+ return nil
+ case BranchNode:
+ if len(key) > 0 {
+ subNode := self.trie.getNode(node.Get(int(key[0])).Raw())
+
+ o := self.next(subNode, key[1:], append(path, key[:1]))
+ if o != nil {
+ return append([]byte{key[0]}, o...)
+ }
+ }
+
+ var r byte = 0
+ if len(key) > 0 {
+ r = key[0] + 1
+ }
+
+ for i := r; i < 16; i++ {
+ subNode := self.trie.getNode(node.Get(int(i)).Raw())
+ o := self.key(subNode, append(path, []byte{i}))
+ if o != nil {
+ return append([]byte{i}, o...)
+ }
+ }
+ case LeafNode, ExtNode:
+ k := RemTerm(CompactDecode(node.Get(0).Str()))
+ if typ == LeafNode {
+ if bytes.Compare([]byte(k), []byte(key)) > 0 {
+ self.Value = node.Get(1)
+ self.Path = append(path, k)
+
+ return k
+ }
+ } else {
+ subNode := self.trie.getNode(node.Get(1).Raw())
+ subKey := key[len(k):]
+ var ret []byte
+ if BeginsWith(key, k) {
+ ret = self.next(subNode, subKey, append(path, k))
+ } else if bytes.Compare(k, key[:len(k)]) > 0 {
+ ret = self.key(node, append(path, k))
+ } else {
+ ret = nil
+ }
+
+ if ret != nil {
+ return append(k, ret...)
+ }
+ }
+ }
+
+ return nil
+}
+
+// Get the next in keys
+func (self *Iterator) Next(key string) []byte {
+ self.trie.mut.Lock()
+ defer self.trie.mut.Unlock()
+
+ k := RemTerm(CompactHexDecode(key))
+ n := self.next(self.trie.getNode(self.trie.Root), k, nil)
+
+ self.Key = []byte(DecodeCompact(n))
+
+ return self.Key
+}
diff --git a/trie/main_test.go b/trie/main_test.go
new file mode 100644
index 000000000..f6f64c06f
--- /dev/null
+++ b/trie/main_test.go
@@ -0,0 +1,9 @@
+package trie
+
+import (
+ "testing"
+
+ checker "gopkg.in/check.v1"
+)
+
+func Test(t *testing.T) { checker.TestingT(t) }
diff --git a/trie/slice.go b/trie/slice.go
new file mode 100644
index 000000000..f53b6c749
--- /dev/null
+++ b/trie/slice.go
@@ -0,0 +1,53 @@
+package trie
+
+import (
+ "bytes"
+ "math"
+)
+
+// Helper function for comparing slices
+func CompareIntSlice(a, b []int) bool {
+ if len(a) != len(b) {
+ return false
+ }
+ for i, v := range a {
+ if v != b[i] {
+ return false
+ }
+ }
+ return true
+}
+
+// Returns the amount of nibbles that match each other from 0 ...
+func MatchingNibbleLength(a, b []byte) int {
+ var i, length = 0, int(math.Min(float64(len(a)), float64(len(b))))
+
+ for i < length {
+ if a[i] != b[i] {
+ break
+ }
+ i++
+ }
+
+ return i
+}
+
+func HasTerm(s []byte) bool {
+ return s[len(s)-1] == 16
+}
+
+func RemTerm(s []byte) []byte {
+ if HasTerm(s) {
+ return s[:len(s)-1]
+ }
+
+ return s
+}
+
+func BeginsWith(a, b []byte) bool {
+ if len(b) > len(a) {
+ return false
+ }
+
+ return bytes.Equal(a[:len(b)], b)
+}
diff --git a/trie/trie.go b/trie/trie.go
new file mode 100644
index 000000000..d89c39775
--- /dev/null
+++ b/trie/trie.go
@@ -0,0 +1,631 @@
+package trie
+
+import (
+ "bytes"
+ "fmt"
+ "sync"
+
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/ethutil"
+)
+
+func ParanoiaCheck(t1 *Trie) (bool, *Trie) {
+ t2 := New(ethutil.Config.Db, "")
+
+ t1.NewIterator().Each(func(key string, v *ethutil.Value) {
+ t2.Update(key, v.Str())
+ })
+
+ return bytes.Compare(t2.GetRoot(), t1.GetRoot()) == 0, t2
+}
+
+func (s *Cache) Len() int {
+ return len(s.nodes)
+}
+
+// TODO
+// A StateObject is an object that has a state root
+// This is goig to be the object for the second level caching (the caching of object which have a state such as contracts)
+type StateObject interface {
+ State() *Trie
+ Sync()
+ Undo()
+}
+
+type Node struct {
+ Key []byte
+ Value *ethutil.Value
+ Dirty bool
+}
+
+func NewNode(key []byte, val *ethutil.Value, dirty bool) *Node {
+ return &Node{Key: key, Value: val, Dirty: dirty}
+}
+
+func (n *Node) Copy() *Node {
+ return NewNode(n.Key, n.Value, n.Dirty)
+}
+
+type Cache struct {
+ nodes map[string]*Node
+ db ethutil.Database
+ IsDirty bool
+}
+
+func NewCache(db ethutil.Database) *Cache {
+ return &Cache{db: db, nodes: make(map[string]*Node)}
+}
+
+func (cache *Cache) PutValue(v interface{}, force bool) interface{} {
+ value := ethutil.NewValue(v)
+
+ enc := value.Encode()
+ if len(enc) >= 32 || force {
+ sha := crypto.Sha3(enc)
+
+ cache.nodes[string(sha)] = NewNode(sha, value, true)
+ cache.IsDirty = true
+
+ return sha
+ }
+
+ return v
+}
+
+func (cache *Cache) Put(v interface{}) interface{} {
+ return cache.PutValue(v, false)
+}
+
+func (cache *Cache) Get(key []byte) *ethutil.Value {
+ // First check if the key is the cache
+ if cache.nodes[string(key)] != nil {
+ return cache.nodes[string(key)].Value
+ }
+
+ // Get the key of the database instead and cache it
+ data, _ := cache.db.Get(key)
+ // Create the cached value
+ value := ethutil.NewValueFromBytes(data)
+
+ defer func() {
+ if r := recover(); r != nil {
+ fmt.Println("RECOVER GET", cache, cache.nodes)
+ panic("bye")
+ }
+ }()
+ // Create caching node
+ cache.nodes[string(key)] = NewNode(key, value, true)
+
+ return value
+}
+
+func (cache *Cache) Delete(key []byte) {
+ delete(cache.nodes, string(key))
+
+ cache.db.Delete(key)
+}
+
+func (cache *Cache) Commit() {
+ // Don't try to commit if it isn't dirty
+ if !cache.IsDirty {
+ return
+ }
+
+ for key, node := range cache.nodes {
+ if node.Dirty {
+ cache.db.Put([]byte(key), node.Value.Encode())
+ node.Dirty = false
+ }
+ }
+ cache.IsDirty = false
+
+ // If the nodes grows beyond the 200 entries we simple empty it
+ // FIXME come up with something better
+ if len(cache.nodes) > 200 {
+ cache.nodes = make(map[string]*Node)
+ }
+}
+
+func (cache *Cache) Undo() {
+ for key, node := range cache.nodes {
+ if node.Dirty {
+ delete(cache.nodes, key)
+ }
+ }
+ cache.IsDirty = false
+}
+
+// A (modified) Radix Trie implementation. The Trie implements
+// a caching mechanism and will used cached values if they are
+// present. If a node is not present in the cache it will try to
+// fetch it from the database and store the cached value.
+// Please note that the data isn't persisted unless `Sync` is
+// explicitly called.
+type Trie struct {
+ mut sync.RWMutex
+ prevRoot interface{}
+ Root interface{}
+ //db Database
+ cache *Cache
+}
+
+func copyRoot(root interface{}) interface{} {
+ var prevRootCopy interface{}
+ if b, ok := root.([]byte); ok {
+ prevRootCopy = ethutil.CopyBytes(b)
+ } else {
+ prevRootCopy = root
+ }
+
+ return prevRootCopy
+}
+
+func New(db ethutil.Database, Root interface{}) *Trie {
+ // Make absolute sure the root is copied
+ r := copyRoot(Root)
+ p := copyRoot(Root)
+
+ trie := &Trie{cache: NewCache(db), Root: r, prevRoot: p}
+ trie.setRoot(Root)
+
+ return trie
+}
+
+func (self *Trie) setRoot(root interface{}) {
+ switch t := root.(type) {
+ case string:
+ /*
+ if t == "" {
+ root = crypto.Sha3(ethutil.Encode(""))
+ }
+ */
+ self.Root = []byte(t)
+ case []byte:
+ self.Root = root
+ default:
+ self.Root = self.cache.PutValue(root, true)
+ }
+}
+
+/*
+ * Public (query) interface functions
+ */
+
+func (t *Trie) Update(key, value string) {
+ t.mut.Lock()
+ defer t.mut.Unlock()
+
+ k := CompactHexDecode(key)
+
+ var root interface{}
+ if value != "" {
+ root = t.UpdateState(t.Root, k, value)
+ } else {
+ root = t.deleteState(t.Root, k)
+ }
+ t.setRoot(root)
+}
+
+func (t *Trie) Get(key string) string {
+ t.mut.Lock()
+ defer t.mut.Unlock()
+
+ k := CompactHexDecode(key)
+ c := ethutil.NewValue(t.getState(t.Root, k))
+
+ return c.Str()
+}
+
+func (t *Trie) Delete(key string) {
+ t.mut.Lock()
+ defer t.mut.Unlock()
+
+ k := CompactHexDecode(key)
+
+ root := t.deleteState(t.Root, k)
+ t.setRoot(root)
+}
+
+func (self *Trie) GetRoot() []byte {
+ switch t := self.Root.(type) {
+ case string:
+ if t == "" {
+ return crypto.Sha3(ethutil.Encode(""))
+ }
+ return []byte(t)
+ case []byte:
+ if len(t) == 0 {
+ return crypto.Sha3(ethutil.Encode(""))
+ }
+
+ return t
+ default:
+ panic(fmt.Sprintf("invalid root type %T (%v)", self.Root, self.Root))
+ }
+}
+
+// Simple compare function which creates a rlp value out of the evaluated objects
+func (t *Trie) Cmp(trie *Trie) bool {
+ return ethutil.NewValue(t.Root).Cmp(ethutil.NewValue(trie.Root))
+}
+
+// Returns a copy of this trie
+func (t *Trie) Copy() *Trie {
+ trie := New(t.cache.db, t.Root)
+ for key, node := range t.cache.nodes {
+ trie.cache.nodes[key] = node.Copy()
+ }
+
+ return trie
+}
+
+// Save the cached value to the database.
+func (t *Trie) Sync() {
+ t.cache.Commit()
+ t.prevRoot = copyRoot(t.Root)
+}
+
+func (t *Trie) Undo() {
+ t.cache.Undo()
+ t.Root = t.prevRoot
+}
+
+func (t *Trie) Cache() *Cache {
+ return t.cache
+}
+
+func (t *Trie) getState(node interface{}, key []byte) interface{} {
+ n := ethutil.NewValue(node)
+ // Return the node if key is empty (= found)
+ if len(key) == 0 || n.IsNil() || n.Len() == 0 {
+ return node
+ }
+
+ currentNode := t.getNode(node)
+ length := currentNode.Len()
+
+ if length == 0 {
+ return ""
+ } else if length == 2 {
+ // Decode the key
+ k := CompactDecode(currentNode.Get(0).Str())
+ v := currentNode.Get(1).Raw()
+
+ if len(key) >= len(k) && bytes.Equal(k, key[:len(k)]) { //CompareIntSlice(k, key[:len(k)]) {
+ return t.getState(v, key[len(k):])
+ } else {
+ return ""
+ }
+ } else if length == 17 {
+ return t.getState(currentNode.Get(int(key[0])).Raw(), key[1:])
+ }
+
+ // It shouldn't come this far
+ panic("unexpected return")
+}
+
+func (t *Trie) getNode(node interface{}) *ethutil.Value {
+ n := ethutil.NewValue(node)
+
+ if !n.Get(0).IsNil() {
+ return n
+ }
+
+ str := n.Str()
+ if len(str) == 0 {
+ return n
+ } else if len(str) < 32 {
+ return ethutil.NewValueFromBytes([]byte(str))
+ }
+
+ data := t.cache.Get(n.Bytes())
+
+ return data
+}
+
+func (t *Trie) UpdateState(node interface{}, key []byte, value string) interface{} {
+ return t.InsertState(node, key, value)
+}
+
+func (t *Trie) Put(node interface{}) interface{} {
+ return t.cache.Put(node)
+
+}
+
+func EmptyStringSlice(l int) []interface{} {
+ slice := make([]interface{}, l)
+ for i := 0; i < l; i++ {
+ slice[i] = ""
+ }
+ return slice
+}
+
+func (t *Trie) InsertState(node interface{}, key []byte, value interface{}) interface{} {
+ if len(key) == 0 {
+ return value
+ }
+
+ // New node
+ n := ethutil.NewValue(node)
+ if node == nil || n.Len() == 0 {
+ newNode := []interface{}{CompactEncode(key), value}
+
+ return t.Put(newNode)
+ }
+
+ currentNode := t.getNode(node)
+ // Check for "special" 2 slice type node
+ if currentNode.Len() == 2 {
+ // Decode the key
+
+ k := CompactDecode(currentNode.Get(0).Str())
+ v := currentNode.Get(1).Raw()
+
+ // Matching key pair (ie. there's already an object with this key)
+ if bytes.Equal(k, key) { //CompareIntSlice(k, key) {
+ newNode := []interface{}{CompactEncode(key), value}
+ return t.Put(newNode)
+ }
+
+ var newHash interface{}
+ matchingLength := MatchingNibbleLength(key, k)
+ if matchingLength == len(k) {
+ // Insert the hash, creating a new node
+ newHash = t.InsertState(v, key[matchingLength:], value)
+ } else {
+ // Expand the 2 length slice to a 17 length slice
+ oldNode := t.InsertState("", k[matchingLength+1:], v)
+ newNode := t.InsertState("", key[matchingLength+1:], value)
+ // Create an expanded slice
+ scaledSlice := EmptyStringSlice(17)
+ // Set the copied and new node
+ scaledSlice[k[matchingLength]] = oldNode
+ scaledSlice[key[matchingLength]] = newNode
+
+ newHash = t.Put(scaledSlice)
+ }
+
+ if matchingLength == 0 {
+ // End of the chain, return
+ return newHash
+ } else {
+ newNode := []interface{}{CompactEncode(key[:matchingLength]), newHash}
+ return t.Put(newNode)
+ }
+ } else {
+
+ // Copy the current node over to the new node and replace the first nibble in the key
+ newNode := EmptyStringSlice(17)
+
+ for i := 0; i < 17; i++ {
+ cpy := currentNode.Get(i).Raw()
+ if cpy != nil {
+ newNode[i] = cpy
+ }
+ }
+
+ newNode[key[0]] = t.InsertState(currentNode.Get(int(key[0])).Raw(), key[1:], value)
+
+ return t.Put(newNode)
+ }
+
+ panic("unexpected end")
+}
+
+func (t *Trie) deleteState(node interface{}, key []byte) interface{} {
+ if len(key) == 0 {
+ return ""
+ }
+
+ // New node
+ n := ethutil.NewValue(node)
+ //if node == nil || (n.Type() == reflect.String && (n.Str() == "" || n.Get(0).IsNil())) || n.Len() == 0 {
+ if node == nil || n.Len() == 0 {
+ //return nil
+ //fmt.Printf("<empty ret> %x %d\n", n, len(n.Bytes()))
+
+ return ""
+ }
+
+ currentNode := t.getNode(node)
+ // Check for "special" 2 slice type node
+ if currentNode.Len() == 2 {
+ // Decode the key
+ k := CompactDecode(currentNode.Get(0).Str())
+ v := currentNode.Get(1).Raw()
+
+ // Matching key pair (ie. there's already an object with this key)
+ if bytes.Equal(k, key) { //CompareIntSlice(k, key) {
+ //fmt.Printf("<delete ret> %x\n", v)
+
+ return ""
+ } else if bytes.Equal(key[:len(k)], k) { //CompareIntSlice(key[:len(k)], k) {
+ hash := t.deleteState(v, key[len(k):])
+ child := t.getNode(hash)
+
+ var newNode []interface{}
+ if child.Len() == 2 {
+ newKey := append(k, CompactDecode(child.Get(0).Str())...)
+ newNode = []interface{}{CompactEncode(newKey), child.Get(1).Raw()}
+ } else {
+ newNode = []interface{}{currentNode.Get(0).Str(), hash}
+ }
+
+ //fmt.Printf("%x\n", newNode)
+
+ return t.Put(newNode)
+ } else {
+ return node
+ }
+ } else {
+ // Copy the current node over to the new node and replace the first nibble in the key
+ n := EmptyStringSlice(17)
+ var newNode []interface{}
+
+ for i := 0; i < 17; i++ {
+ cpy := currentNode.Get(i).Raw()
+ if cpy != nil {
+ n[i] = cpy
+ }
+ }
+
+ n[key[0]] = t.deleteState(n[key[0]], key[1:])
+ amount := -1
+ for i := 0; i < 17; i++ {
+ if n[i] != "" {
+ if amount == -1 {
+ amount = i
+ } else {
+ amount = -2
+ }
+ }
+ }
+ if amount == 16 {
+ newNode = []interface{}{CompactEncode([]byte{16}), n[amount]}
+ } else if amount >= 0 {
+ child := t.getNode(n[amount])
+ if child.Len() == 17 {
+ newNode = []interface{}{CompactEncode([]byte{byte(amount)}), n[amount]}
+ } else if child.Len() == 2 {
+ key := append([]byte{byte(amount)}, CompactDecode(child.Get(0).Str())...)
+ newNode = []interface{}{CompactEncode(key), child.Get(1).Str()}
+ }
+
+ } else {
+ newNode = n
+ }
+
+ //fmt.Printf("%x\n", newNode)
+ return t.Put(newNode)
+ }
+
+ panic("unexpected return")
+}
+
+type TrieIterator struct {
+ trie *Trie
+ key string
+ value string
+
+ shas [][]byte
+ values []string
+
+ lastNode []byte
+}
+
+func (t *Trie) NewIterator() *TrieIterator {
+ return &TrieIterator{trie: t}
+}
+
+func (self *Trie) Iterator() *Iterator {
+ return NewIterator(self)
+}
+
+// Some time in the near future this will need refactoring :-)
+// XXX Note to self, IsSlice == inline node. Str == sha3 to node
+func (it *TrieIterator) workNode(currentNode *ethutil.Value) {
+ if currentNode.Len() == 2 {
+ k := CompactDecode(currentNode.Get(0).Str())
+
+ if currentNode.Get(1).Str() == "" {
+ it.workNode(currentNode.Get(1))
+ } else {
+ if k[len(k)-1] == 16 {
+ it.values = append(it.values, currentNode.Get(1).Str())
+ } else {
+ it.shas = append(it.shas, currentNode.Get(1).Bytes())
+ it.getNode(currentNode.Get(1).Bytes())
+ }
+ }
+ } else {
+ for i := 0; i < currentNode.Len(); i++ {
+ if i == 16 && currentNode.Get(i).Len() != 0 {
+ it.values = append(it.values, currentNode.Get(i).Str())
+ } else {
+ if currentNode.Get(i).Str() == "" {
+ it.workNode(currentNode.Get(i))
+ } else {
+ val := currentNode.Get(i).Str()
+ if val != "" {
+ it.shas = append(it.shas, currentNode.Get(1).Bytes())
+ it.getNode([]byte(val))
+ }
+ }
+ }
+ }
+ }
+}
+
+func (it *TrieIterator) getNode(node []byte) {
+ currentNode := it.trie.cache.Get(node)
+ it.workNode(currentNode)
+}
+
+func (it *TrieIterator) Collect() [][]byte {
+ if it.trie.Root == "" {
+ return nil
+ }
+
+ it.getNode(ethutil.NewValue(it.trie.Root).Bytes())
+
+ return it.shas
+}
+
+func (it *TrieIterator) Purge() int {
+ shas := it.Collect()
+ for _, sha := range shas {
+ it.trie.cache.Delete(sha)
+ }
+ return len(it.values)
+}
+
+func (it *TrieIterator) Key() string {
+ return ""
+}
+
+func (it *TrieIterator) Value() string {
+ return ""
+}
+
+type EachCallback func(key string, node *ethutil.Value)
+
+func (it *TrieIterator) Each(cb EachCallback) {
+ it.fetchNode(nil, ethutil.NewValue(it.trie.Root).Bytes(), cb)
+}
+
+func (it *TrieIterator) fetchNode(key []byte, node []byte, cb EachCallback) {
+ it.iterateNode(key, it.trie.cache.Get(node), cb)
+}
+
+func (it *TrieIterator) iterateNode(key []byte, currentNode *ethutil.Value, cb EachCallback) {
+ if currentNode.Len() == 2 {
+ k := CompactDecode(currentNode.Get(0).Str())
+
+ pk := append(key, k...)
+ if currentNode.Get(1).Len() != 0 && currentNode.Get(1).Str() == "" {
+ it.iterateNode(pk, currentNode.Get(1), cb)
+ } else {
+ if k[len(k)-1] == 16 {
+ cb(DecodeCompact(pk), currentNode.Get(1))
+ } else {
+ it.fetchNode(pk, currentNode.Get(1).Bytes(), cb)
+ }
+ }
+ } else {
+ for i := 0; i < currentNode.Len(); i++ {
+ pk := append(key, byte(i))
+ if i == 16 && currentNode.Get(i).Len() != 0 {
+ cb(DecodeCompact(pk), currentNode.Get(i))
+ } else {
+ if currentNode.Get(i).Len() != 0 && currentNode.Get(i).Str() == "" {
+ it.iterateNode(pk, currentNode.Get(i), cb)
+ } else {
+ val := currentNode.Get(i).Str()
+ if val != "" {
+ it.fetchNode(pk, []byte(val), cb)
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/trie/trie_test.go b/trie/trie_test.go
new file mode 100644
index 000000000..207d41f30
--- /dev/null
+++ b/trie/trie_test.go
@@ -0,0 +1,447 @@
+package trie
+
+import (
+ "bytes"
+ "encoding/hex"
+ "encoding/json"
+ "fmt"
+ "io/ioutil"
+ "math/rand"
+ "net/http"
+ "testing"
+ "time"
+
+ checker "gopkg.in/check.v1"
+
+ "github.com/ethereum/go-ethereum/ethutil"
+)
+
+const LONG_WORD = "1234567890abcdefghijklmnopqrstuvwxxzABCEFGHIJKLMNOPQRSTUVWXYZ"
+
+type TrieSuite struct {
+ db *MemDatabase
+ trie *Trie
+}
+
+type MemDatabase struct {
+ db map[string][]byte
+}
+
+func NewMemDatabase() (*MemDatabase, error) {
+ db := &MemDatabase{db: make(map[string][]byte)}
+ return db, nil
+}
+func (db *MemDatabase) Put(key []byte, value []byte) {
+ db.db[string(key)] = value
+}
+func (db *MemDatabase) Get(key []byte) ([]byte, error) {
+ return db.db[string(key)], nil
+}
+func (db *MemDatabase) Delete(key []byte) error {
+ delete(db.db, string(key))
+ return nil
+}
+func (db *MemDatabase) Print() {}
+func (db *MemDatabase) Close() {}
+func (db *MemDatabase) LastKnownTD() []byte { return nil }
+
+func NewTrie() (*MemDatabase, *Trie) {
+ db, _ := NewMemDatabase()
+ return db, New(db, "")
+}
+
+func (s *TrieSuite) SetUpTest(c *checker.C) {
+ s.db, s.trie = NewTrie()
+}
+
+func (s *TrieSuite) TestTrieSync(c *checker.C) {
+ s.trie.Update("dog", LONG_WORD)
+ c.Assert(s.db.db, checker.HasLen, 0, checker.Commentf("Expected no data in database"))
+ s.trie.Sync()
+ c.Assert(s.db.db, checker.HasLen, 3)
+}
+
+func (s *TrieSuite) TestTrieDirtyTracking(c *checker.C) {
+ s.trie.Update("dog", LONG_WORD)
+ c.Assert(s.trie.cache.IsDirty, checker.Equals, true, checker.Commentf("Expected no data in database"))
+
+ s.trie.Sync()
+ c.Assert(s.trie.cache.IsDirty, checker.Equals, false, checker.Commentf("Expected trie to be dirty"))
+
+ s.trie.Update("test", LONG_WORD)
+ s.trie.cache.Undo()
+ c.Assert(s.trie.cache.IsDirty, checker.Equals, false)
+}
+
+func (s *TrieSuite) TestTrieReset(c *checker.C) {
+ s.trie.Update("cat", LONG_WORD)
+ c.Assert(s.trie.cache.nodes, checker.HasLen, 1, checker.Commentf("Expected cached nodes"))
+
+ s.trie.cache.Undo()
+ c.Assert(s.trie.cache.nodes, checker.HasLen, 0, checker.Commentf("Expected no nodes after undo"))
+}
+
+func (s *TrieSuite) TestTrieGet(c *checker.C) {
+ s.trie.Update("cat", LONG_WORD)
+ x := s.trie.Get("cat")
+ c.Assert(x, checker.DeepEquals, LONG_WORD)
+}
+
+func (s *TrieSuite) TestTrieUpdating(c *checker.C) {
+ s.trie.Update("cat", LONG_WORD)
+ s.trie.Update("cat", LONG_WORD+"1")
+ x := s.trie.Get("cat")
+ c.Assert(x, checker.DeepEquals, LONG_WORD+"1")
+}
+
+func (s *TrieSuite) TestTrieCmp(c *checker.C) {
+ _, trie1 := NewTrie()
+ _, trie2 := NewTrie()
+
+ trie1.Update("doge", LONG_WORD)
+ trie2.Update("doge", LONG_WORD)
+ c.Assert(trie1, checker.DeepEquals, trie2)
+
+ trie1.Update("dog", LONG_WORD)
+ trie2.Update("cat", LONG_WORD)
+ c.Assert(trie1, checker.Not(checker.DeepEquals), trie2)
+}
+
+func (s *TrieSuite) TestTrieDelete(c *checker.C) {
+ s.trie.Update("cat", LONG_WORD)
+ exp := s.trie.Root
+ s.trie.Update("dog", LONG_WORD)
+ s.trie.Delete("dog")
+ c.Assert(s.trie.Root, checker.DeepEquals, exp)
+
+ s.trie.Update("dog", LONG_WORD)
+ exp = s.trie.Root
+ s.trie.Update("dude", LONG_WORD)
+ s.trie.Delete("dude")
+ c.Assert(s.trie.Root, checker.DeepEquals, exp)
+}
+
+func (s *TrieSuite) TestTrieDeleteWithValue(c *checker.C) {
+ s.trie.Update("c", LONG_WORD)
+ exp := s.trie.Root
+ s.trie.Update("ca", LONG_WORD)
+ s.trie.Update("cat", LONG_WORD)
+ s.trie.Delete("ca")
+ s.trie.Delete("cat")
+ c.Assert(s.trie.Root, checker.DeepEquals, exp)
+}
+
+func (s *TrieSuite) TestTriePurge(c *checker.C) {
+ s.trie.Update("c", LONG_WORD)
+ s.trie.Update("ca", LONG_WORD)
+ s.trie.Update("cat", LONG_WORD)
+
+ lenBefore := len(s.trie.cache.nodes)
+ it := s.trie.NewIterator()
+ num := it.Purge()
+ c.Assert(num, checker.Equals, 3)
+ c.Assert(len(s.trie.cache.nodes), checker.Equals, lenBefore)
+}
+
+func h(str string) string {
+ d, err := hex.DecodeString(str)
+ if err != nil {
+ panic(err)
+ }
+
+ return string(d)
+}
+
+func get(in string) (out string) {
+ if len(in) > 2 && in[:2] == "0x" {
+ out = h(in[2:])
+ } else {
+ out = in
+ }
+
+ return
+}
+
+type TrieTest struct {
+ Name string
+ In map[string]string
+ Root string
+}
+
+func CreateTest(name string, data []byte) (TrieTest, error) {
+ t := TrieTest{Name: name}
+ err := json.Unmarshal(data, &t)
+ if err != nil {
+ return TrieTest{}, fmt.Errorf("%v", err)
+ }
+
+ return t, nil
+}
+
+func CreateTests(uri string, cb func(TrieTest)) map[string]TrieTest {
+ resp, err := http.Get(uri)
+ if err != nil {
+ panic(err)
+ }
+ defer resp.Body.Close()
+
+ data, err := ioutil.ReadAll(resp.Body)
+
+ var objmap map[string]*json.RawMessage
+ err = json.Unmarshal(data, &objmap)
+ if err != nil {
+ panic(err)
+ }
+
+ tests := make(map[string]TrieTest)
+ for name, testData := range objmap {
+ test, err := CreateTest(name, *testData)
+ if err != nil {
+ panic(err)
+ }
+
+ if cb != nil {
+ cb(test)
+ }
+ tests[name] = test
+ }
+
+ return tests
+}
+
+func RandomData() [][]string {
+ data := [][]string{
+ {"0x000000000000000000000000ec4f34c97e43fbb2816cfd95e388353c7181dab1", "0x4e616d6552656700000000000000000000000000000000000000000000000000"},
+ {"0x0000000000000000000000000000000000000000000000000000000000000045", "0x22b224a1420a802ab51d326e29fa98e34c4f24ea"},
+ {"0x0000000000000000000000000000000000000000000000000000000000000046", "0x67706c2076330000000000000000000000000000000000000000000000000000"},
+ {"0x000000000000000000000000697c7b8c961b56f675d570498424ac8de1a918f6", "0x6f6f6f6820736f2067726561742c207265616c6c6c793f000000000000000000"},
+ {"0x0000000000000000000000007ef9e639e2733cb34e4dfc576d4b23f72db776b2", "0x4655474156000000000000000000000000000000000000000000000000000000"},
+ {"0x6f6f6f6820736f2067726561742c207265616c6c6c793f000000000000000000", "0x697c7b8c961b56f675d570498424ac8de1a918f6"},
+ {"0x4655474156000000000000000000000000000000000000000000000000000000", "0x7ef9e639e2733cb34e4dfc576d4b23f72db776b2"},
+ {"0x4e616d6552656700000000000000000000000000000000000000000000000000", "0xec4f34c97e43fbb2816cfd95e388353c7181dab1"},
+ }
+
+ var c [][]string
+ for len(data) != 0 {
+ e := rand.Intn(len(data))
+ c = append(c, data[e])
+
+ copy(data[e:], data[e+1:])
+ data[len(data)-1] = nil
+ data = data[:len(data)-1]
+ }
+
+ return c
+}
+
+const MaxTest = 1000
+
+// This test insert data in random order and seeks to find indifferences between the different tries
+func (s *TrieSuite) TestRegression(c *checker.C) {
+ rand.Seed(time.Now().Unix())
+
+ roots := make(map[string]int)
+ for i := 0; i < MaxTest; i++ {
+ _, trie := NewTrie()
+ data := RandomData()
+
+ for _, test := range data {
+ trie.Update(test[0], test[1])
+ }
+ trie.Delete("0x4e616d6552656700000000000000000000000000000000000000000000000000")
+
+ roots[string(trie.Root.([]byte))] += 1
+ }
+
+ c.Assert(len(roots) <= 1, checker.Equals, true)
+ // if len(roots) > 1 {
+ // for root, num := range roots {
+ // t.Errorf("%x => %d\n", root, num)
+ // }
+ // }
+}
+
+func (s *TrieSuite) TestDelete(c *checker.C) {
+ s.trie.Update("a", "jeffreytestlongstring")
+ s.trie.Update("aa", "otherstring")
+ s.trie.Update("aaa", "othermorestring")
+ s.trie.Update("aabbbbccc", "hithere")
+ s.trie.Update("abbcccdd", "hstanoehutnaheoustnh")
+ s.trie.Update("rnthaoeuabbcccdd", "hstanoehutnaheoustnh")
+ s.trie.Update("rneuabbcccdd", "hstanoehutnaheoustnh")
+ s.trie.Update("rneuabboeusntahoeucccdd", "hstanoehutnaheoustnh")
+ s.trie.Update("rnxabboeusntahoeucccdd", "hstanoehutnaheoustnh")
+ s.trie.Delete("aaboaestnuhbccc")
+ s.trie.Delete("a")
+ s.trie.Update("a", "nthaonethaosentuh")
+ s.trie.Update("c", "shtaosntehua")
+ s.trie.Delete("a")
+ s.trie.Update("aaaa", "testmegood")
+
+ _, t2 := NewTrie()
+ s.trie.NewIterator().Each(func(key string, v *ethutil.Value) {
+ if key == "aaaa" {
+ t2.Update(key, v.Str())
+ } else {
+ t2.Update(key, v.Str())
+ }
+ })
+
+ a := ethutil.NewValue(s.trie.Root).Bytes()
+ b := ethutil.NewValue(t2.Root).Bytes()
+
+ c.Assert(a, checker.DeepEquals, b)
+}
+
+func (s *TrieSuite) TestTerminator(c *checker.C) {
+ key := CompactDecode("hello")
+ c.Assert(HasTerm(key), checker.Equals, true, checker.Commentf("Expected %v to have a terminator", key))
+}
+
+func (s *TrieSuite) TestIt(c *checker.C) {
+ s.trie.Update("cat", "cat")
+ s.trie.Update("doge", "doge")
+ s.trie.Update("wallace", "wallace")
+ it := s.trie.Iterator()
+
+ inputs := []struct {
+ In, Out string
+ }{
+ {"", "cat"},
+ {"bobo", "cat"},
+ {"c", "cat"},
+ {"car", "cat"},
+ {"catering", "doge"},
+ {"w", "wallace"},
+ {"wallace123", ""},
+ }
+
+ for _, test := range inputs {
+ res := string(it.Next(test.In))
+ c.Assert(res, checker.Equals, test.Out)
+ }
+}
+
+func (s *TrieSuite) TestBeginsWith(c *checker.C) {
+ a := CompactDecode("hello")
+ b := CompactDecode("hel")
+
+ c.Assert(BeginsWith(a, b), checker.Equals, false)
+ c.Assert(BeginsWith(b, a), checker.Equals, true)
+}
+
+func (s *TrieSuite) TestItems(c *checker.C) {
+ s.trie.Update("A", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")
+ exp := "d23786fb4a010da3ce639d66d5e904a11dbc02746d1ce25029e53290cabf28ab"
+
+ c.Assert(s.trie.GetRoot(), checker.DeepEquals, ethutil.Hex2Bytes(exp))
+}
+
+/*
+func TestRndCase(t *testing.T) {
+ _, trie := NewTrie()
+
+ data := []struct{ k, v string }{
+ {"0000000000000000000000000000000000000000000000000000000000000001", "a07573657264617461000000000000000000000000000000000000000000000000"},
+ {"0000000000000000000000000000000000000000000000000000000000000003", "8453bb5b31"},
+ {"0000000000000000000000000000000000000000000000000000000000000004", "850218711a00"},
+ {"0000000000000000000000000000000000000000000000000000000000000005", "9462d7705bd0b3ecbc51a8026a25597cb28a650c79"},
+ {"0000000000000000000000000000000000000000000000000000000000000010", "947e70f9460402290a3e487dae01f610a1a8218fda"},
+ {"0000000000000000000000000000000000000000000000000000000000000111", "01"},
+ {"0000000000000000000000000000000000000000000000000000000000000112", "a053656e6174650000000000000000000000000000000000000000000000000000"},
+ {"0000000000000000000000000000000000000000000000000000000000000113", "a053656e6174650000000000000000000000000000000000000000000000000000"},
+ {"53656e6174650000000000000000000000000000000000000000000000000000", "94977e3f62f5e1ed7953697430303a3cfa2b5b736e"},
+ }
+ for _, e := range data {
+ trie.Update(string(ethutil.Hex2Bytes(e.k)), string(ethutil.Hex2Bytes(e.v)))
+ }
+
+ fmt.Printf("root after update %x\n", trie.Root)
+ trie.NewIterator().Each(func(k string, v *ethutil.Value) {
+ fmt.Printf("%x %x\n", k, v.Bytes())
+ })
+
+ data = []struct{ k, v string }{
+ {"0000000000000000000000000000000000000000000000000000000000000112", ""},
+ {"436974697a656e73000000000000000000000000000000000000000000000001", ""},
+ {"436f757274000000000000000000000000000000000000000000000000000002", ""},
+ {"53656e6174650000000000000000000000000000000000000000000000000000", ""},
+ {"436f757274000000000000000000000000000000000000000000000000000000", ""},
+ {"53656e6174650000000000000000000000000000000000000000000000000001", ""},
+ {"0000000000000000000000000000000000000000000000000000000000000113", ""},
+ {"436974697a656e73000000000000000000000000000000000000000000000000", ""},
+ {"436974697a656e73000000000000000000000000000000000000000000000002", ""},
+ {"436f757274000000000000000000000000000000000000000000000000000001", ""},
+ {"0000000000000000000000000000000000000000000000000000000000000111", ""},
+ {"53656e6174650000000000000000000000000000000000000000000000000002", ""},
+ }
+
+ for _, e := range data {
+ trie.Delete(string(ethutil.Hex2Bytes(e.k)))
+ }
+
+ fmt.Printf("root after delete %x\n", trie.Root)
+
+ trie.NewIterator().Each(func(k string, v *ethutil.Value) {
+ fmt.Printf("%x %x\n", k, v.Bytes())
+ })
+
+ fmt.Printf("%x\n", trie.Get(string(ethutil.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001"))))
+}
+*/
+
+func TestOtherSomething(t *testing.T) {
+ _, trie := NewTrie()
+
+ vals := []struct{ k, v string }{
+ {"do", "verb"},
+ {"ether", "wookiedoo"},
+ {"horse", "stallion"},
+ {"shaman", "horse"},
+ {"doge", "coin"},
+ {"ether", ""},
+ {"dog", "puppy"},
+ {"shaman", ""},
+ }
+ for _, val := range vals {
+ trie.Update(val.k, val.v)
+ }
+
+ exp := ethutil.Hex2Bytes("5991bb8c6514148a29db676a14ac506cd2cd5775ace63c30a4fe457715e9ac84")
+ hash := trie.Root.([]byte)
+ if !bytes.Equal(hash, exp) {
+ t.Errorf("expected %x got %x", exp, hash)
+ }
+}
+
+func BenchmarkGets(b *testing.B) {
+ _, trie := NewTrie()
+ vals := []struct{ k, v string }{
+ {"do", "verb"},
+ {"ether", "wookiedoo"},
+ {"horse", "stallion"},
+ {"shaman", "horse"},
+ {"doge", "coin"},
+ {"ether", ""},
+ {"dog", "puppy"},
+ {"shaman", ""},
+ {"somethingveryoddindeedthis is", "myothernodedata"},
+ }
+ for _, val := range vals {
+ trie.Update(val.k, val.v)
+ }
+
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ trie.Get("horse")
+ }
+}
+
+func BenchmarkUpdate(b *testing.B) {
+ _, trie := NewTrie()
+
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ trie.Update(fmt.Sprintf("aaaaaaaaaaaaaaa%d", i), "value")
+ }
+}
diff --git a/types/ethereum.go b/types/ethereum.go
new file mode 100644
index 000000000..ab1254f4c
--- /dev/null
+++ b/types/ethereum.go
@@ -0,0 +1 @@
+package types
diff --git a/ui/filter.go b/ui/filter.go
new file mode 100644
index 000000000..88faad5ca
--- /dev/null
+++ b/ui/filter.go
@@ -0,0 +1,75 @@
+package ui
+
+import (
+ "github.com/ethereum/go-ethereum/core"
+ "github.com/ethereum/go-ethereum/ethutil"
+)
+
+func NewFilterFromMap(object map[string]interface{}, eth core.EthManager) *core.Filter {
+ filter := core.NewFilter(eth)
+
+ if object["earliest"] != nil {
+ val := ethutil.NewValue(object["earliest"])
+ filter.SetEarliestBlock(val.Int())
+ }
+
+ if object["latest"] != nil {
+ val := ethutil.NewValue(object["latest"])
+ filter.SetLatestBlock(val.Int())
+ }
+
+ if object["to"] != nil {
+ val := ethutil.NewValue(object["to"])
+ filter.AddTo(ethutil.Hex2Bytes(val.Str()))
+ }
+
+ if object["from"] != nil {
+ val := ethutil.NewValue(object["from"])
+ filter.AddFrom(ethutil.Hex2Bytes(val.Str()))
+ }
+
+ if object["max"] != nil {
+ val := ethutil.NewValue(object["max"])
+ filter.SetMax(int(val.Uint()))
+ }
+
+ if object["skip"] != nil {
+ val := ethutil.NewValue(object["skip"])
+ filter.SetSkip(int(val.Uint()))
+ }
+
+ if object["altered"] != nil {
+ filter.Altered = makeAltered(object["altered"])
+ }
+
+ return filter
+}
+
+// Conversion methodn
+func mapToAccountChange(m map[string]interface{}) (d core.AccountChange) {
+ if str, ok := m["id"].(string); ok {
+ d.Address = ethutil.Hex2Bytes(str)
+ }
+
+ if str, ok := m["at"].(string); ok {
+ d.StateAddress = ethutil.Hex2Bytes(str)
+ }
+
+ return
+}
+
+// data can come in in the following formats:
+// ["aabbccdd", {id: "ccddee", at: "11223344"}], "aabbcc", {id: "ccddee", at: "1122"}
+func makeAltered(v interface{}) (d []core.AccountChange) {
+ if str, ok := v.(string); ok {
+ d = append(d, core.AccountChange{ethutil.Hex2Bytes(str), nil})
+ } else if obj, ok := v.(map[string]interface{}); ok {
+ d = append(d, mapToAccountChange(obj))
+ } else if slice, ok := v.([]interface{}); ok {
+ for _, item := range slice {
+ d = append(d, makeAltered(item)...)
+ }
+ }
+
+ return
+}
diff --git a/ui/qt/filter.go b/ui/qt/filter.go
new file mode 100644
index 000000000..c68936401
--- /dev/null
+++ b/ui/qt/filter.go
@@ -0,0 +1,38 @@
+package qt
+
+import (
+ "fmt"
+
+ "github.com/ethereum/go-ethereum/core"
+ "github.com/ethereum/go-ethereum/ui"
+ "gopkg.in/qml.v1"
+)
+
+func NewFilterFromMap(object map[string]interface{}, eth core.EthManager) *core.Filter {
+ filter := ui.NewFilterFromMap(object, eth)
+
+ if object["altered"] != nil {
+ filter.Altered = makeAltered(object["altered"])
+ }
+
+ return filter
+}
+
+func makeAltered(v interface{}) (d []core.AccountChange) {
+ if qList, ok := v.(*qml.List); ok {
+ var s []interface{}
+ qList.Convert(&s)
+
+ fmt.Println(s)
+
+ d = makeAltered(s)
+ } else if qMap, ok := v.(*qml.Map); ok {
+ var m map[string]interface{}
+ qMap.Convert(&m)
+ fmt.Println(m)
+
+ d = makeAltered(m)
+ }
+
+ return
+}
diff --git a/ui/qt/qwhisper/whisper.go b/ui/qt/qwhisper/whisper.go
new file mode 100644
index 000000000..bed23c8a7
--- /dev/null
+++ b/ui/qt/qwhisper/whisper.go
@@ -0,0 +1,70 @@
+package qwhisper
+
+import (
+ "time"
+
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/whisper"
+)
+
+func fromHex(s string) []byte {
+ if len(s) > 1 {
+ return ethutil.Hex2Bytes(s[2:])
+ }
+ return nil
+}
+func toHex(b []byte) string { return "0x" + ethutil.Bytes2Hex(b) }
+
+type Whisper struct {
+ *whisper.Whisper
+}
+
+func New(w *whisper.Whisper) *Whisper {
+ return &Whisper{w}
+}
+
+func (self *Whisper) Post(data string, pow, ttl uint32, to, from string) {
+ msg := whisper.NewMessage(fromHex(data))
+ envelope, err := msg.Seal(time.Duration(pow), whisper.Opts{
+ Ttl: time.Duration(ttl),
+ To: crypto.ToECDSAPub(fromHex(to)),
+ From: crypto.ToECDSA(fromHex(from)),
+ })
+ if err != nil {
+ // handle error
+ return
+ }
+
+ if err := self.Whisper.Send(envelope); err != nil {
+ // handle error
+ return
+ }
+}
+
+func (self *Whisper) NewIdentity() string {
+ return toHex(self.Whisper.NewIdentity().D.Bytes())
+}
+
+func (self *Whisper) HasIdentify(key string) bool {
+ return self.Whisper.HasIdentity(crypto.ToECDSA(fromHex(key)))
+}
+
+func (self *Whisper) Watch(opts map[string]interface{}) {
+ filter := filterFromMap(opts)
+ filter.Fn = func(msg *whisper.Message) {
+ // TODO POST TO QT WINDOW
+ }
+ self.Whisper.Watch(filter)
+}
+
+func filterFromMap(opts map[string]interface{}) (f whisper.Filter) {
+ if to, ok := opts["to"].(string); ok {
+ f.To = crypto.ToECDSA(fromHex(to))
+ }
+ if from, ok := opts["from"].(string); ok {
+ f.From = crypto.ToECDSAPub(fromHex(from))
+ }
+
+ return
+}
diff --git a/utils/vm_env.go b/utils/vm_env.go
deleted file mode 100644
index 30568c421..000000000
--- a/utils/vm_env.go
+++ /dev/null
@@ -1,35 +0,0 @@
-package utils
-
-import (
- "math/big"
-
- "github.com/ethereum/eth-go/ethchain"
- "github.com/ethereum/eth-go/ethstate"
-)
-
-type VMEnv struct {
- state *ethstate.State
- block *ethchain.Block
-
- transactor []byte
- value *big.Int
-}
-
-func NewEnv(state *ethstate.State, block *ethchain.Block, transactor []byte, value *big.Int) *VMEnv {
- return &VMEnv{
- state: state,
- block: block,
- transactor: transactor,
- value: value,
- }
-}
-
-func (self *VMEnv) Origin() []byte { return self.transactor }
-func (self *VMEnv) BlockNumber() *big.Int { return self.block.Number }
-func (self *VMEnv) PrevHash() []byte { return self.block.PrevHash }
-func (self *VMEnv) Coinbase() []byte { return self.block.Coinbase }
-func (self *VMEnv) Time() int64 { return self.block.Time }
-func (self *VMEnv) Difficulty() *big.Int { return self.block.Difficulty }
-func (self *VMEnv) BlockHash() []byte { return self.block.Hash() }
-func (self *VMEnv) Value() *big.Int { return self.value }
-func (self *VMEnv) State() *ethstate.State { return self.state }
diff --git a/vm/.ethtest b/vm/.ethtest
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/vm/.ethtest
diff --git a/vm/address.go b/vm/address.go
new file mode 100644
index 000000000..611979c94
--- /dev/null
+++ b/vm/address.go
@@ -0,0 +1,56 @@
+package vm
+
+import (
+ "math/big"
+
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/ethutil"
+)
+
+type Address interface {
+ Call(in []byte) []byte
+}
+
+type PrecompiledAccount struct {
+ Gas func(l int) *big.Int
+ fn func(in []byte) []byte
+}
+
+func (self PrecompiledAccount) Call(in []byte) []byte {
+ return self.fn(in)
+}
+
+var Precompiled = map[string]*PrecompiledAccount{
+ string(ethutil.LeftPadBytes([]byte{1}, 20)): &PrecompiledAccount{func(l int) *big.Int {
+ return GasEcrecover
+ }, ecrecoverFunc},
+ string(ethutil.LeftPadBytes([]byte{2}, 20)): &PrecompiledAccount{func(l int) *big.Int {
+ n := big.NewInt(int64(l+31)/32 + 1)
+ n.Mul(n, GasSha256)
+ return n
+ }, sha256Func},
+ string(ethutil.LeftPadBytes([]byte{3}, 20)): &PrecompiledAccount{func(l int) *big.Int {
+ n := big.NewInt(int64(l+31)/32 + 1)
+ n.Mul(n, GasRipemd)
+ return n
+ }, ripemd160Func},
+}
+
+func sha256Func(in []byte) []byte {
+ return crypto.Sha256(in)
+}
+
+func ripemd160Func(in []byte) []byte {
+ return ethutil.LeftPadBytes(crypto.Ripemd160(in), 32)
+}
+
+func ecrecoverFunc(in []byte) []byte {
+ // In case of an invalid sig. Defaults to return nil
+ defer func() { recover() }()
+
+ hash := in[:32]
+ v := ethutil.BigD(in[32:64]).Bytes()[0] - 27
+ sig := append(in[64:], v)
+
+ return ethutil.LeftPadBytes(crypto.Sha3(crypto.Ecrecover(append(hash, sig...))[1:])[12:], 32)
+}
diff --git a/vm/analysis.go b/vm/analysis.go
new file mode 100644
index 000000000..fef448b7b
--- /dev/null
+++ b/vm/analysis.go
@@ -0,0 +1,35 @@
+package vm
+
+import (
+ "math/big"
+
+ "github.com/ethereum/go-ethereum/ethutil"
+)
+
+func analyseJumpDests(code []byte) (dests map[uint64]*big.Int) {
+ dests = make(map[uint64]*big.Int)
+
+ lp := false
+ var lpv *big.Int
+ for pc := uint64(0); pc < uint64(len(code)); pc++ {
+ var op OpCode = OpCode(code[pc])
+ switch op {
+ case PUSH1, PUSH2, PUSH3, PUSH4, PUSH5, PUSH6, PUSH7, PUSH8, PUSH9, PUSH10, PUSH11, PUSH12, PUSH13, PUSH14, PUSH15, PUSH16, PUSH17, PUSH18, PUSH19, PUSH20, PUSH21, PUSH22, PUSH23, PUSH24, PUSH25, PUSH26, PUSH27, PUSH28, PUSH29, PUSH30, PUSH31, PUSH32:
+ a := uint64(op) - uint64(PUSH1) + 1
+ if uint64(len(code)) > pc+1+a {
+ lpv = ethutil.BigD(code[pc+1 : pc+1+a])
+ }
+
+ pc += a
+ lp = true
+ case JUMP, JUMPI:
+ if lp {
+ dests[pc] = lpv
+ }
+
+ default:
+ lp = false
+ }
+ }
+ return
+}
diff --git a/vm/asm.go b/vm/asm.go
new file mode 100644
index 000000000..a94f01d3d
--- /dev/null
+++ b/vm/asm.go
@@ -0,0 +1,45 @@
+package vm
+
+import (
+ "fmt"
+ "math/big"
+
+ "github.com/ethereum/go-ethereum/ethutil"
+)
+
+func Disassemble(script []byte) (asm []string) {
+ pc := new(big.Int)
+ for {
+ if pc.Cmp(big.NewInt(int64(len(script)))) >= 0 {
+ return
+ }
+
+ // Get the memory location of pc
+ val := script[pc.Int64()]
+ // Get the opcode (it must be an opcode!)
+ op := OpCode(val)
+
+ asm = append(asm, fmt.Sprintf("%v", op))
+
+ switch op {
+ case PUSH1, PUSH2, PUSH3, PUSH4, PUSH5, PUSH6, PUSH7, PUSH8, PUSH9, PUSH10, PUSH11, PUSH12, PUSH13, PUSH14, PUSH15, PUSH16, PUSH17, PUSH18, PUSH19, PUSH20, PUSH21, PUSH22, PUSH23, PUSH24, PUSH25, PUSH26, PUSH27, PUSH28, PUSH29, PUSH30, PUSH31, PUSH32:
+ pc.Add(pc, ethutil.Big1)
+ a := int64(op) - int64(PUSH1) + 1
+ if int(pc.Int64()+a) > len(script) {
+ return nil
+ }
+
+ data := script[pc.Int64() : pc.Int64()+a]
+ if len(data) == 0 {
+ data = []byte{0}
+ }
+ asm = append(asm, fmt.Sprintf("0x%x", data))
+
+ pc.Add(pc, big.NewInt(a-1))
+ }
+
+ pc.Add(pc, ethutil.Big1)
+ }
+
+ return
+}
diff --git a/vm/closure.go b/vm/closure.go
new file mode 100644
index 000000000..97b31ada0
--- /dev/null
+++ b/vm/closure.go
@@ -0,0 +1,107 @@
+package vm
+
+import (
+ "math/big"
+
+ "github.com/ethereum/go-ethereum/state"
+)
+
+type ClosureRef interface {
+ ReturnGas(*big.Int, *big.Int)
+ Address() []byte
+ SetCode([]byte)
+}
+
+type Closure struct {
+ caller ClosureRef
+ object ClosureRef
+ Code []byte
+ message *state.Message
+
+ Gas, UsedGas, Price *big.Int
+
+ Args []byte
+}
+
+// Create a new closure for the given data items
+func NewClosure(msg *state.Message, caller ClosureRef, object ClosureRef, code []byte, gas, price *big.Int) *Closure {
+ c := &Closure{message: msg, caller: caller, object: object, Code: code, Args: nil}
+
+ // Gas should be a pointer so it can safely be reduced through the run
+ // This pointer will be off the state transition
+ c.Gas = gas //new(big.Int).Set(gas)
+ // In most cases price and value are pointers to transaction objects
+ // and we don't want the transaction's values to change.
+ c.Price = new(big.Int).Set(price)
+ c.UsedGas = new(big.Int)
+
+ return c
+}
+
+func (c *Closure) GetOp(x uint64) OpCode {
+ return OpCode(c.GetByte(x))
+}
+
+func (c *Closure) GetByte(x uint64) byte {
+ if x < uint64(len(c.Code)) {
+ return c.Code[x]
+ }
+
+ return 0
+}
+
+func (c *Closure) GetBytes(x, y int) []byte {
+ if x >= len(c.Code) || y >= len(c.Code) {
+ return nil
+ }
+
+ return c.Code[x : x+y]
+}
+
+func (c *Closure) GetRangeValue(x, y uint64) []byte {
+ if x >= uint64(len(c.Code)) || y >= uint64(len(c.Code)) {
+ return nil
+ }
+
+ return c.Code[x : x+y]
+}
+
+func (c *Closure) Return(ret []byte) []byte {
+ // Return the remaining gas to the caller
+ c.caller.ReturnGas(c.Gas, c.Price)
+
+ return ret
+}
+
+/*
+ * Gas functions
+ */
+func (c *Closure) UseGas(gas *big.Int) bool {
+ if c.Gas.Cmp(gas) < 0 {
+ return false
+ }
+
+ // Sub the amount of gas from the remaining
+ c.Gas.Sub(c.Gas, gas)
+ c.UsedGas.Add(c.UsedGas, gas)
+
+ return true
+}
+
+// Implement the caller interface
+func (c *Closure) ReturnGas(gas, price *big.Int) {
+ // Return the gas to the closure
+ c.Gas.Add(c.Gas, gas)
+ c.UsedGas.Sub(c.UsedGas, gas)
+}
+
+/*
+ * Set / Get
+ */
+func (c *Closure) Address() []byte {
+ return c.object.Address()
+}
+
+func (self *Closure) SetCode(code []byte) {
+ self.Code = code
+}
diff --git a/vm/common.go b/vm/common.go
new file mode 100644
index 000000000..529bbdeb1
--- /dev/null
+++ b/vm/common.go
@@ -0,0 +1,75 @@
+package vm
+
+import (
+ "math/big"
+
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/logger"
+)
+
+var vmlogger = logger.NewLogger("VM")
+
+type Type int
+
+const (
+ StandardVmTy Type = iota
+ DebugVmTy
+
+ MaxVmTy
+)
+
+var (
+ GasStep = big.NewInt(1)
+ GasSha = big.NewInt(10)
+ GasSLoad = big.NewInt(20)
+ GasSStore = big.NewInt(100)
+ GasSStoreRefund = big.NewInt(100)
+ GasBalance = big.NewInt(20)
+ GasCreate = big.NewInt(100)
+ GasCall = big.NewInt(20)
+ GasCreateByte = big.NewInt(5)
+ GasSha3Byte = big.NewInt(10)
+ GasSha256Byte = big.NewInt(50)
+ GasRipemdByte = big.NewInt(50)
+ GasMemory = big.NewInt(1)
+ GasData = big.NewInt(5)
+ GasTx = big.NewInt(500)
+ GasLog = big.NewInt(32)
+ GasSha256 = big.NewInt(50)
+ GasRipemd = big.NewInt(50)
+ GasEcrecover = big.NewInt(500)
+
+ Pow256 = ethutil.BigPow(2, 256)
+
+ LogTyPretty byte = 0x1
+ LogTyDiff byte = 0x2
+
+ U256 = ethutil.U256
+ S256 = ethutil.S256
+)
+
+const MaxCallDepth = 1024
+
+func calcMemSize(off, l *big.Int) *big.Int {
+ if l.Cmp(ethutil.Big0) == 0 {
+ return ethutil.Big0
+ }
+
+ return new(big.Int).Add(off, l)
+}
+
+// Simple helper
+func u256(n int64) *big.Int {
+ return big.NewInt(n)
+}
+
+// Mainly used for print variables and passing to Print*
+func toValue(val *big.Int) interface{} {
+ // Let's assume a string on right padded zero's
+ b := val.Bytes()
+ if b[0] != 0 && b[len(b)-1] == 0x0 && b[len(b)-2] == 0x0 {
+ return string(b)
+ }
+
+ return val
+}
diff --git a/vm/debugger.go b/vm/debugger.go
new file mode 100644
index 000000000..9b08634c6
--- /dev/null
+++ b/vm/debugger.go
@@ -0,0 +1,10 @@
+package vm
+
+import "github.com/ethereum/go-ethereum/state"
+
+type Debugger interface {
+ BreakHook(step int, op OpCode, mem *Memory, stack *Stack, object *state.StateObject) bool
+ StepHook(step int, op OpCode, mem *Memory, stack *Stack, object *state.StateObject) bool
+ BreakPoints() []int64
+ SetCode(byteCode []byte)
+}
diff --git a/vm/environment.go b/vm/environment.go
new file mode 100644
index 000000000..969bc5e43
--- /dev/null
+++ b/vm/environment.go
@@ -0,0 +1,81 @@
+package vm
+
+import (
+ "errors"
+ "fmt"
+ "math/big"
+
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/state"
+)
+
+type Environment interface {
+ State() *state.StateDB
+
+ Origin() []byte
+ BlockNumber() *big.Int
+ PrevHash() []byte
+ Coinbase() []byte
+ Time() int64
+ Difficulty() *big.Int
+ BlockHash() []byte
+ GasLimit() *big.Int
+ Transfer(from, to Account, amount *big.Int) error
+ AddLog(state.Log)
+
+ Depth() int
+ SetDepth(i int)
+
+ Call(me ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error)
+ CallCode(me ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error)
+ Create(me ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error, ClosureRef)
+}
+
+type Object interface {
+ GetStorage(key *big.Int) *ethutil.Value
+ SetStorage(key *big.Int, value *ethutil.Value)
+}
+
+type Account interface {
+ SubBalance(amount *big.Int)
+ AddBalance(amount *big.Int)
+ Balance() *big.Int
+}
+
+// generic transfer method
+func Transfer(from, to Account, amount *big.Int) error {
+ if from.Balance().Cmp(amount) < 0 {
+ return errors.New("Insufficient balance in account")
+ }
+
+ from.SubBalance(amount)
+ to.AddBalance(amount)
+
+ return nil
+}
+
+type Log struct {
+ address []byte
+ topics [][]byte
+ data []byte
+}
+
+func (self *Log) Address() []byte {
+ return self.address
+}
+
+func (self *Log) Topics() [][]byte {
+ return self.topics
+}
+
+func (self *Log) Data() []byte {
+ return self.data
+}
+
+func (self *Log) RlpData() interface{} {
+ return []interface{}{self.address, ethutil.ByteSliceToInterface(self.topics), self.data}
+}
+
+func (self *Log) String() string {
+ return fmt.Sprintf("[A=%x T=%x D=%x]", self.address, self.topics, self.data)
+}
diff --git a/vm/errors.go b/vm/errors.go
new file mode 100644
index 000000000..ab011bd62
--- /dev/null
+++ b/vm/errors.go
@@ -0,0 +1,51 @@
+package vm
+
+import (
+ "fmt"
+ "math/big"
+)
+
+type OutOfGasError struct {
+ req, has *big.Int
+}
+
+func OOG(req, has *big.Int) OutOfGasError {
+ return OutOfGasError{req, has}
+}
+
+func (self OutOfGasError) Error() string {
+ return fmt.Sprintf("out of gas! require %v, have %v", self.req, self.has)
+}
+
+func IsOOGErr(err error) bool {
+ _, ok := err.(OutOfGasError)
+ return ok
+}
+
+type StackError struct {
+ req, has int
+}
+
+func StackErr(req, has int) StackError {
+ return StackError{req, has}
+}
+
+func (self StackError) Error() string {
+ return fmt.Sprintf("stack error! require %v, have %v", self.req, self.has)
+}
+
+func IsStack(err error) bool {
+ _, ok := err.(StackError)
+ return ok
+}
+
+type DepthError struct{}
+
+func (self DepthError) Error() string {
+ return fmt.Sprintf("Max call depth exceeded (%d)", MaxCallDepth)
+}
+
+func IsDepthErr(err error) bool {
+ _, ok := err.(DepthError)
+ return ok
+}
diff --git a/vm/main_test.go b/vm/main_test.go
new file mode 100644
index 000000000..0ae03bf6a
--- /dev/null
+++ b/vm/main_test.go
@@ -0,0 +1,9 @@
+package vm
+
+import (
+ "testing"
+
+ checker "gopkg.in/check.v1"
+)
+
+func Test(t *testing.T) { checker.TestingT(t) }
diff --git a/vm/stack.go b/vm/stack.go
new file mode 100644
index 000000000..6091479cb
--- /dev/null
+++ b/vm/stack.go
@@ -0,0 +1,179 @@
+package vm
+
+import (
+ "fmt"
+ "math"
+ "math/big"
+)
+
+type OpType int
+
+const (
+ tNorm = iota
+ tData
+ tExtro
+ tCrypto
+)
+
+type TxCallback func(opType OpType) bool
+
+// Simple push/pop stack mechanism
+type Stack struct {
+ data []*big.Int
+}
+
+func NewStack() *Stack {
+ return &Stack{}
+}
+
+func (st *Stack) Data() []*big.Int {
+ return st.data
+}
+
+func (st *Stack) Len() int {
+ return len(st.data)
+}
+
+func (st *Stack) Pop() *big.Int {
+ str := st.data[len(st.data)-1]
+
+ copy(st.data[:len(st.data)-1], st.data[:len(st.data)-1])
+ st.data = st.data[:len(st.data)-1]
+
+ return str
+}
+
+func (st *Stack) Popn() (*big.Int, *big.Int) {
+ ints := st.data[len(st.data)-2:]
+
+ copy(st.data[:len(st.data)-2], st.data[:len(st.data)-2])
+ st.data = st.data[:len(st.data)-2]
+
+ return ints[0], ints[1]
+}
+
+func (st *Stack) Peek() *big.Int {
+ str := st.data[len(st.data)-1]
+
+ return str
+}
+
+func (st *Stack) Peekn() (*big.Int, *big.Int) {
+ ints := st.data[len(st.data)-2:]
+
+ return ints[0], ints[1]
+}
+
+func (st *Stack) Swapn(n int) (*big.Int, *big.Int) {
+ st.data[len(st.data)-n], st.data[len(st.data)-1] = st.data[len(st.data)-1], st.data[len(st.data)-n]
+
+ return st.data[len(st.data)-n], st.data[len(st.data)-1]
+}
+
+func (st *Stack) Dupn(n int) *big.Int {
+ st.Push(st.data[len(st.data)-n])
+
+ return st.Peek()
+}
+
+func (st *Stack) Push(d *big.Int) {
+ st.data = append(st.data, new(big.Int).Set(d))
+}
+
+func (st *Stack) Get(amount *big.Int) []*big.Int {
+ // offset + size <= len(data)
+ length := big.NewInt(int64(len(st.data)))
+ if amount.Cmp(length) <= 0 {
+ start := new(big.Int).Sub(length, amount)
+ return st.data[start.Int64():length.Int64()]
+ }
+
+ return nil
+}
+
+func (st *Stack) Print() {
+ fmt.Println("### stack ###")
+ if len(st.data) > 0 {
+ for i, val := range st.data {
+ fmt.Printf("%-3d %v\n", i, val)
+ }
+ } else {
+ fmt.Println("-- empty --")
+ }
+ fmt.Println("#############")
+}
+
+type Memory struct {
+ store []byte
+}
+
+func NewMemory() *Memory {
+ return &Memory{nil}
+}
+
+func (m *Memory) Set(offset, size uint64, value []byte) {
+ if len(value) > 0 {
+ totSize := offset + size
+ lenSize := uint64(len(m.store) - 1)
+ if totSize > lenSize {
+ // Calculate the diff between the sizes
+ diff := totSize - lenSize
+ if diff > 0 {
+ // Create a new empty slice and append it
+ newSlice := make([]byte, diff-1)
+ // Resize slice
+ m.store = append(m.store, newSlice...)
+ }
+ }
+ copy(m.store[offset:offset+size], value)
+ }
+}
+
+func (m *Memory) Resize(size uint64) {
+ if uint64(m.Len()) < size {
+ m.store = append(m.store, make([]byte, size-uint64(m.Len()))...)
+ }
+}
+
+func (m *Memory) Get(offset, size int64) []byte {
+ if len(m.store) > int(offset) {
+ end := int(math.Min(float64(len(m.store)), float64(offset+size)))
+
+ return m.store[offset:end]
+ }
+
+ return nil
+}
+
+func (self *Memory) Geti(offset, size int64) (cpy []byte) {
+ if len(self.store) > int(offset) {
+ cpy = make([]byte, size)
+ copy(cpy, self.store[offset:offset+size])
+
+ return
+ }
+
+ return
+}
+
+func (m *Memory) Len() int {
+ return len(m.store)
+}
+
+func (m *Memory) Data() []byte {
+ return m.store
+}
+
+func (m *Memory) Print() {
+ fmt.Printf("### mem %d bytes ###\n", len(m.store))
+ if len(m.store) > 0 {
+ addr := 0
+ for i := 0; i+32 <= len(m.store); i += 32 {
+ fmt.Printf("%03d: % x\n", addr, m.store[i:i+32])
+ addr++
+ }
+ } else {
+ fmt.Println("-- empty --")
+ }
+ fmt.Println("####################")
+}
diff --git a/vm/types.go b/vm/types.go
new file mode 100644
index 000000000..ec9c7e74e
--- /dev/null
+++ b/vm/types.go
@@ -0,0 +1,334 @@
+package vm
+
+import (
+ "fmt"
+)
+
+type OpCode byte
+
+// Op codes
+const (
+ // 0x0 range - arithmetic ops
+ STOP OpCode = iota
+ ADD
+ MUL
+ SUB
+ DIV
+ SDIV
+ MOD
+ SMOD
+ ADDMOD
+ MULMOD
+ EXP
+ SIGNEXTEND
+)
+
+const (
+ LT OpCode = iota + 0x10
+ GT
+ SLT
+ SGT
+ EQ
+ ISZERO
+ AND
+ OR
+ XOR
+ NOT
+ BYTE
+
+ SHA3 = 0x20
+)
+
+const (
+ // 0x30 range - closure state
+ ADDRESS OpCode = 0x30 + iota
+ BALANCE
+ ORIGIN
+ CALLER
+ CALLVALUE
+ CALLDATALOAD
+ CALLDATASIZE
+ CALLDATACOPY
+ CODESIZE
+ CODECOPY
+ GASPRICE
+ EXTCODESIZE
+ EXTCODECOPY
+)
+
+const (
+
+ // 0x40 range - block operations
+ PREVHASH OpCode = 0x40 + iota
+ COINBASE
+ TIMESTAMP
+ NUMBER
+ DIFFICULTY
+ GASLIMIT
+)
+
+const (
+ // 0x50 range - 'storage' and execution
+ POP OpCode = 0x50 + iota
+ MLOAD
+ MSTORE
+ MSTORE8
+ SLOAD
+ SSTORE
+ JUMP
+ JUMPI
+ PC
+ MSIZE
+ GAS
+ JUMPDEST
+)
+
+const (
+ // 0x60 range
+ PUSH1 OpCode = 0x60 + iota
+ PUSH2
+ PUSH3
+ PUSH4
+ PUSH5
+ PUSH6
+ PUSH7
+ PUSH8
+ PUSH9
+ PUSH10
+ PUSH11
+ PUSH12
+ PUSH13
+ PUSH14
+ PUSH15
+ PUSH16
+ PUSH17
+ PUSH18
+ PUSH19
+ PUSH20
+ PUSH21
+ PUSH22
+ PUSH23
+ PUSH24
+ PUSH25
+ PUSH26
+ PUSH27
+ PUSH28
+ PUSH29
+ PUSH30
+ PUSH31
+ PUSH32
+ DUP1
+ DUP2
+ DUP3
+ DUP4
+ DUP5
+ DUP6
+ DUP7
+ DUP8
+ DUP9
+ DUP10
+ DUP11
+ DUP12
+ DUP13
+ DUP14
+ DUP15
+ DUP16
+ SWAP1
+ SWAP2
+ SWAP3
+ SWAP4
+ SWAP5
+ SWAP6
+ SWAP7
+ SWAP8
+ SWAP9
+ SWAP10
+ SWAP11
+ SWAP12
+ SWAP13
+ SWAP14
+ SWAP15
+ SWAP16
+)
+
+const (
+ LOG0 OpCode = 0xa0 + iota
+ LOG1
+ LOG2
+ LOG3
+ LOG4
+)
+
+const (
+ // 0xf0 range - closures
+ CREATE OpCode = 0xf0 + iota
+ CALL
+ CALLCODE
+ RETURN
+
+ // 0x70 range - other
+ SUICIDE = 0xff
+)
+
+// Since the opcodes aren't all in order we can't use a regular slice
+var opCodeToString = map[OpCode]string{
+ // 0x0 range - arithmetic ops
+ STOP: "STOP",
+ ADD: "ADD",
+ MUL: "MUL",
+ SUB: "SUB",
+ DIV: "DIV",
+ SDIV: "SDIV",
+ MOD: "MOD",
+ SMOD: "SMOD",
+ EXP: "EXP",
+ NOT: "NOT",
+ LT: "LT",
+ GT: "GT",
+ SLT: "SLT",
+ SGT: "SGT",
+ EQ: "EQ",
+ ISZERO: "ISZERO",
+ SIGNEXTEND: "SIGNEXTEND",
+
+ // 0x10 range - bit ops
+ AND: "AND",
+ OR: "OR",
+ XOR: "XOR",
+ BYTE: "BYTE",
+ ADDMOD: "ADDMOD",
+ MULMOD: "MULMOD",
+
+ // 0x20 range - crypto
+ SHA3: "SHA3",
+
+ // 0x30 range - closure state
+ ADDRESS: "ADDRESS",
+ BALANCE: "BALANCE",
+ ORIGIN: "ORIGIN",
+ CALLER: "CALLER",
+ CALLVALUE: "CALLVALUE",
+ CALLDATALOAD: "CALLDATALOAD",
+ CALLDATASIZE: "CALLDATASIZE",
+ CALLDATACOPY: "CALLDATACOPY",
+ CODESIZE: "CODESIZE",
+ CODECOPY: "CODECOPY",
+ GASPRICE: "TXGASPRICE",
+
+ // 0x40 range - block operations
+ PREVHASH: "PREVHASH",
+ COINBASE: "COINBASE",
+ TIMESTAMP: "TIMESTAMP",
+ NUMBER: "NUMBER",
+ DIFFICULTY: "DIFFICULTY",
+ GASLIMIT: "GASLIMIT",
+ EXTCODESIZE: "EXTCODESIZE",
+ EXTCODECOPY: "EXTCODECOPY",
+
+ // 0x50 range - 'storage' and execution
+ POP: "POP",
+ //DUP: "DUP",
+ //SWAP: "SWAP",
+ MLOAD: "MLOAD",
+ MSTORE: "MSTORE",
+ MSTORE8: "MSTORE8",
+ SLOAD: "SLOAD",
+ SSTORE: "SSTORE",
+ JUMP: "JUMP",
+ JUMPI: "JUMPI",
+ PC: "PC",
+ MSIZE: "MSIZE",
+ GAS: "GAS",
+ JUMPDEST: "JUMPDEST",
+
+ // 0x60 range - push
+ PUSH1: "PUSH1",
+ PUSH2: "PUSH2",
+ PUSH3: "PUSH3",
+ PUSH4: "PUSH4",
+ PUSH5: "PUSH5",
+ PUSH6: "PUSH6",
+ PUSH7: "PUSH7",
+ PUSH8: "PUSH8",
+ PUSH9: "PUSH9",
+ PUSH10: "PUSH10",
+ PUSH11: "PUSH11",
+ PUSH12: "PUSH12",
+ PUSH13: "PUSH13",
+ PUSH14: "PUSH14",
+ PUSH15: "PUSH15",
+ PUSH16: "PUSH16",
+ PUSH17: "PUSH17",
+ PUSH18: "PUSH18",
+ PUSH19: "PUSH19",
+ PUSH20: "PUSH20",
+ PUSH21: "PUSH21",
+ PUSH22: "PUSH22",
+ PUSH23: "PUSH23",
+ PUSH24: "PUSH24",
+ PUSH25: "PUSH25",
+ PUSH26: "PUSH26",
+ PUSH27: "PUSH27",
+ PUSH28: "PUSH28",
+ PUSH29: "PUSH29",
+ PUSH30: "PUSH30",
+ PUSH31: "PUSH31",
+ PUSH32: "PUSH32",
+
+ DUP1: "DUP1",
+ DUP2: "DUP2",
+ DUP3: "DUP3",
+ DUP4: "DUP4",
+ DUP5: "DUP5",
+ DUP6: "DUP6",
+ DUP7: "DUP7",
+ DUP8: "DUP8",
+ DUP9: "DUP9",
+ DUP10: "DUP10",
+ DUP11: "DUP11",
+ DUP12: "DUP12",
+ DUP13: "DUP13",
+ DUP14: "DUP14",
+ DUP15: "DUP15",
+ DUP16: "DUP16",
+
+ SWAP1: "SWAP1",
+ SWAP2: "SWAP2",
+ SWAP3: "SWAP3",
+ SWAP4: "SWAP4",
+ SWAP5: "SWAP5",
+ SWAP6: "SWAP6",
+ SWAP7: "SWAP7",
+ SWAP8: "SWAP8",
+ SWAP9: "SWAP9",
+ SWAP10: "SWAP10",
+ SWAP11: "SWAP11",
+ SWAP12: "SWAP12",
+ SWAP13: "SWAP13",
+ SWAP14: "SWAP14",
+ SWAP15: "SWAP15",
+ SWAP16: "SWAP16",
+ LOG0: "LOG0",
+ LOG1: "LOG1",
+ LOG2: "LOG2",
+ LOG3: "LOG3",
+ LOG4: "LOG4",
+
+ // 0xf0 range
+ CREATE: "CREATE",
+ CALL: "CALL",
+ RETURN: "RETURN",
+ CALLCODE: "CALLCODE",
+
+ // 0x70 range - other
+ SUICIDE: "SUICIDE",
+}
+
+func (o OpCode) String() string {
+ str := opCodeToString[o]
+ if len(str) == 0 {
+ return fmt.Sprintf("Missing opcode 0x%x", int(o))
+ }
+
+ return str
+}
diff --git a/vm/virtual_machine.go b/vm/virtual_machine.go
new file mode 100644
index 000000000..3b6f98ab2
--- /dev/null
+++ b/vm/virtual_machine.go
@@ -0,0 +1,10 @@
+package vm
+
+import "math/big"
+
+type VirtualMachine interface {
+ Env() Environment
+ Run(me, caller ClosureRef, code []byte, value, gas, price *big.Int, data []byte) ([]byte, error)
+ Printf(string, ...interface{}) VirtualMachine
+ Endl() VirtualMachine
+}
diff --git a/vm/vm.go b/vm/vm.go
new file mode 100644
index 000000000..22172cb3a
--- /dev/null
+++ b/vm/vm.go
@@ -0,0 +1,36 @@
+package vm
+
+import "math/big"
+
+// BIG FAT WARNING. THIS VM IS NOT YET IS USE!
+// I want to get all VM tests pass first before updating this VM
+
+type Vm struct {
+ env Environment
+ err error
+ depth int
+}
+
+func New(env Environment, typ Type) VirtualMachine {
+ switch typ {
+ case DebugVmTy:
+ return NewDebugVm(env)
+ default:
+ return &Vm{env: env}
+ }
+}
+
+func (self *Vm) Run(me, caller ClosureRef, code []byte, value, gas, price *big.Int, data []byte) (ret []byte, err error) {
+ panic("not implemented")
+}
+
+func (self *Vm) Env() Environment {
+ return self.env
+}
+
+func (self *Vm) Depth() int {
+ return self.depth
+}
+
+func (self *Vm) Printf(format string, v ...interface{}) VirtualMachine { return self }
+func (self *Vm) Endl() VirtualMachine { return self }
diff --git a/vm/vm_debug.go b/vm/vm_debug.go
new file mode 100644
index 000000000..aa3291e66
--- /dev/null
+++ b/vm/vm_debug.go
@@ -0,0 +1,983 @@
+package vm
+
+import (
+ "fmt"
+ "math"
+ "math/big"
+
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/state"
+)
+
+type DebugVm struct {
+ env Environment
+
+ logTy byte
+ logStr string
+
+ err error
+
+ // Debugging
+ Dbg Debugger
+
+ BreakPoints []int64
+ Stepping bool
+ Fn string
+
+ Recoverable bool
+}
+
+func NewDebugVm(env Environment) *DebugVm {
+ lt := LogTyPretty
+ if ethutil.Config.Diff {
+ lt = LogTyDiff
+ }
+
+ return &DebugVm{env: env, logTy: lt, Recoverable: true}
+}
+
+func (self *DebugVm) Run(me, caller ClosureRef, code []byte, value, gas, price *big.Int, callData []byte) (ret []byte, err error) {
+ self.env.SetDepth(self.env.Depth() + 1)
+
+ msg := self.env.State().Manifest().AddMessage(&state.Message{
+ To: me.Address(), From: caller.Address(),
+ Input: callData,
+ Origin: self.env.Origin(),
+ Block: self.env.BlockHash(), Timestamp: self.env.Time(), Coinbase: self.env.Coinbase(), Number: self.env.BlockNumber(),
+ Value: value,
+ })
+ closure := NewClosure(msg, caller, me, code, gas, price)
+
+ if p := Precompiled[string(me.Address())]; p != nil {
+ return self.RunPrecompiled(p, callData, closure)
+ }
+
+ if self.Recoverable {
+ // Recover from any require exception
+ defer func() {
+ if r := recover(); r != nil {
+ self.Endl()
+
+ closure.UseGas(closure.Gas)
+
+ ret = closure.Return(nil)
+
+ err = fmt.Errorf("%v", r)
+
+ }
+ }()
+ }
+
+ var (
+ op OpCode
+
+ destinations = analyseJumpDests(closure.Code)
+ mem = NewMemory()
+ stack = NewStack()
+ pc uint64 = 0
+ step = 0
+ prevStep = 0
+ statedb = self.env.State()
+ require = func(m int) {
+ if stack.Len() < m {
+ panic(fmt.Sprintf("%04v (%v) stack err size = %d, required = %d", pc, op, stack.Len(), m))
+ }
+ }
+
+ jump = func(from uint64, to *big.Int) {
+ p := to.Uint64()
+
+ self.Printf(" ~> %v", to)
+ // Return to start
+ if p == 0 {
+ pc = 0
+ } else {
+ nop := OpCode(closure.GetOp(p))
+ if !(nop == JUMPDEST || destinations[from] != nil) {
+ panic(fmt.Sprintf("invalid jump destination (%v) %v", nop, p))
+ } else if nop == JUMP || nop == JUMPI {
+ panic(fmt.Sprintf("not allowed to JUMP(I) in to JUMP"))
+ }
+
+ pc = to.Uint64()
+
+ }
+
+ self.Endl()
+ }
+ )
+
+ vmlogger.Debugf("(%d) (%x) %x (code=%d) gas: %v (d) %x\n", self.env.Depth(), caller.Address()[:4], closure.Address(), len(code), closure.Gas, callData)
+
+ // Don't bother with the execution if there's no code.
+ if len(code) == 0 {
+ return closure.Return(nil), nil
+ }
+
+ for {
+ prevStep = step
+ // The base for all big integer arithmetic
+ base := new(big.Int)
+
+ step++
+ // Get the memory location of pc
+ op = closure.GetOp(pc)
+
+ gas := new(big.Int)
+ addStepGasUsage := func(amount *big.Int) {
+ if amount.Cmp(ethutil.Big0) >= 0 {
+ gas.Add(gas, amount)
+ }
+ }
+
+ addStepGasUsage(GasStep)
+
+ var newMemSize *big.Int = ethutil.Big0
+ var additionalGas *big.Int = new(big.Int)
+ // Stack Check, memory resize & gas phase
+ switch op {
+ // Stack checks only
+ case ISZERO, CALLDATALOAD, POP, JUMP, NOT: // 1
+ require(1)
+ case ADD, SUB, DIV, SDIV, MOD, SMOD, LT, GT, SLT, SGT, EQ, AND, OR, XOR, BYTE: // 2
+ require(2)
+ case ADDMOD, MULMOD: // 3
+ require(3)
+ case SWAP1, SWAP2, SWAP3, SWAP4, SWAP5, SWAP6, SWAP7, SWAP8, SWAP9, SWAP10, SWAP11, SWAP12, SWAP13, SWAP14, SWAP15, SWAP16:
+ n := int(op - SWAP1 + 2)
+ require(n)
+ case DUP1, DUP2, DUP3, DUP4, DUP5, DUP6, DUP7, DUP8, DUP9, DUP10, DUP11, DUP12, DUP13, DUP14, DUP15, DUP16:
+ n := int(op - DUP1 + 1)
+ require(n)
+ case LOG0, LOG1, LOG2, LOG3, LOG4:
+ n := int(op - LOG0)
+ require(n + 2)
+
+ gas.Set(GasLog)
+ addStepGasUsage(new(big.Int).Mul(big.NewInt(int64(n)), GasLog))
+
+ mSize, mStart := stack.Peekn()
+ addStepGasUsage(mSize)
+
+ newMemSize = calcMemSize(mStart, mSize)
+ case EXP:
+ require(2)
+
+ gas.Set(big.NewInt(int64(len(stack.data[stack.Len()-2].Bytes()) + 1)))
+ // Gas only
+ case STOP:
+ gas.Set(ethutil.Big0)
+ case SUICIDE:
+ require(1)
+
+ gas.Set(ethutil.Big0)
+ case SLOAD:
+ require(1)
+
+ gas.Set(GasSLoad)
+ // Memory resize & Gas
+ case SSTORE:
+ require(2)
+
+ var mult *big.Int
+ y, x := stack.Peekn()
+ val := statedb.GetState(closure.Address(), x.Bytes())
+ if len(val) == 0 && len(y.Bytes()) > 0 {
+ // 0 => non 0
+ mult = ethutil.Big3
+ } else if len(val) > 0 && len(y.Bytes()) == 0 {
+ statedb.Refund(caller.Address(), GasSStoreRefund)
+
+ mult = ethutil.Big0
+ } else {
+ // non 0 => non 0 (or 0 => 0)
+ mult = ethutil.Big1
+ }
+ gas.Set(new(big.Int).Mul(mult, GasSStore))
+ case BALANCE:
+ require(1)
+ gas.Set(GasBalance)
+ case MSTORE:
+ require(2)
+ newMemSize = calcMemSize(stack.Peek(), u256(32))
+ case MLOAD:
+ require(1)
+
+ newMemSize = calcMemSize(stack.Peek(), u256(32))
+ case MSTORE8:
+ require(2)
+ newMemSize = calcMemSize(stack.Peek(), u256(1))
+ case RETURN:
+ require(2)
+
+ newMemSize = calcMemSize(stack.Peek(), stack.data[stack.Len()-2])
+ case SHA3:
+ require(2)
+ gas.Set(GasSha)
+ newMemSize = calcMemSize(stack.Peek(), stack.data[stack.Len()-2])
+ additionalGas.Set(stack.data[stack.Len()-2])
+ case CALLDATACOPY:
+ require(2)
+
+ newMemSize = calcMemSize(stack.Peek(), stack.data[stack.Len()-3])
+ additionalGas.Set(stack.data[stack.Len()-3])
+ case CODECOPY:
+ require(3)
+
+ newMemSize = calcMemSize(stack.Peek(), stack.data[stack.Len()-3])
+ additionalGas.Set(stack.data[stack.Len()-3])
+ case EXTCODECOPY:
+ require(4)
+
+ newMemSize = calcMemSize(stack.data[stack.Len()-2], stack.data[stack.Len()-4])
+ additionalGas.Set(stack.data[stack.Len()-4])
+ case CALL, CALLCODE:
+ require(7)
+ gas.Set(GasCall)
+ addStepGasUsage(stack.data[stack.Len()-1])
+
+ x := calcMemSize(stack.data[stack.Len()-6], stack.data[stack.Len()-7])
+ y := calcMemSize(stack.data[stack.Len()-4], stack.data[stack.Len()-5])
+
+ newMemSize = ethutil.BigMax(x, y)
+ case CREATE:
+ require(3)
+ gas.Set(GasCreate)
+
+ newMemSize = calcMemSize(stack.data[stack.Len()-2], stack.data[stack.Len()-3])
+ }
+
+ switch op {
+ case CALLDATACOPY, CODECOPY, EXTCODECOPY:
+ additionalGas.Add(additionalGas, u256(31))
+ additionalGas.Div(additionalGas, u256(32))
+ addStepGasUsage(additionalGas)
+ case SHA3:
+ additionalGas.Add(additionalGas, u256(31))
+ additionalGas.Div(additionalGas, u256(32))
+ additionalGas.Mul(additionalGas, GasSha3Byte)
+ addStepGasUsage(additionalGas)
+ }
+
+ if newMemSize.Cmp(ethutil.Big0) > 0 {
+ newMemSize.Add(newMemSize, u256(31))
+ newMemSize.Div(newMemSize, u256(32))
+ newMemSize.Mul(newMemSize, u256(32))
+
+ if newMemSize.Cmp(u256(int64(mem.Len()))) > 0 {
+ memGasUsage := new(big.Int).Sub(newMemSize, u256(int64(mem.Len())))
+ memGasUsage.Mul(GasMemory, memGasUsage)
+ memGasUsage.Div(memGasUsage, u256(32))
+
+ addStepGasUsage(memGasUsage)
+
+ }
+
+ }
+
+ self.Printf("(pc) %-3d -o- %-14s", pc, op.String())
+ self.Printf(" (m) %-4d (s) %-4d (g) %-3v (%v)", mem.Len(), stack.Len(), gas, closure.Gas)
+
+ if !closure.UseGas(gas) {
+ self.Endl()
+
+ tmp := new(big.Int).Set(closure.Gas)
+
+ closure.UseGas(closure.Gas)
+
+ return closure.Return(nil), OOG(gas, tmp)
+ }
+
+ mem.Resize(newMemSize.Uint64())
+
+ switch op {
+ // 0x20 range
+ case ADD:
+ x, y := stack.Popn()
+ self.Printf(" %v + %v", y, x)
+
+ base.Add(y, x)
+
+ U256(base)
+
+ self.Printf(" = %v", base)
+ // Pop result back on the stack
+ stack.Push(base)
+ case SUB:
+ x, y := stack.Popn()
+ self.Printf(" %v - %v", y, x)
+
+ base.Sub(y, x)
+
+ U256(base)
+
+ self.Printf(" = %v", base)
+ // Pop result back on the stack
+ stack.Push(base)
+ case MUL:
+ x, y := stack.Popn()
+ self.Printf(" %v * %v", y, x)
+
+ base.Mul(y, x)
+
+ U256(base)
+
+ self.Printf(" = %v", base)
+ // Pop result back on the stack
+ stack.Push(base)
+ case DIV:
+ x, y := stack.Pop(), stack.Pop()
+ self.Printf(" %v / %v", x, y)
+
+ if y.Cmp(ethutil.Big0) != 0 {
+ base.Div(x, y)
+ }
+
+ U256(base)
+
+ self.Printf(" = %v", base)
+ // Pop result back on the stack
+ stack.Push(base)
+ case SDIV:
+ x, y := S256(stack.Pop()), S256(stack.Pop())
+
+ self.Printf(" %v / %v", x, y)
+
+ if y.Cmp(ethutil.Big0) == 0 {
+ base.Set(ethutil.Big0)
+ } else {
+ n := new(big.Int)
+ if new(big.Int).Mul(x, y).Cmp(ethutil.Big0) < 0 {
+ n.SetInt64(-1)
+ } else {
+ n.SetInt64(1)
+ }
+
+ base.Div(x.Abs(x), y.Abs(y)).Mul(base, n)
+
+ U256(base)
+ }
+
+ self.Printf(" = %v", base)
+ stack.Push(base)
+ case MOD:
+ x, y := stack.Pop(), stack.Pop()
+
+ self.Printf(" %v %% %v", x, y)
+
+ if y.Cmp(ethutil.Big0) == 0 {
+ base.Set(ethutil.Big0)
+ } else {
+ base.Mod(x, y)
+ }
+
+ U256(base)
+
+ self.Printf(" = %v", base)
+ stack.Push(base)
+ case SMOD:
+ x, y := S256(stack.Pop()), S256(stack.Pop())
+
+ self.Printf(" %v %% %v", x, y)
+
+ if y.Cmp(ethutil.Big0) == 0 {
+ base.Set(ethutil.Big0)
+ } else {
+ n := new(big.Int)
+ if x.Cmp(ethutil.Big0) < 0 {
+ n.SetInt64(-1)
+ } else {
+ n.SetInt64(1)
+ }
+
+ base.Mod(x.Abs(x), y.Abs(y)).Mul(base, n)
+
+ U256(base)
+ }
+
+ self.Printf(" = %v", base)
+ stack.Push(base)
+
+ case EXP:
+ x, y := stack.Popn()
+
+ self.Printf(" %v ** %v", y, x)
+
+ base.Exp(y, x, Pow256)
+
+ U256(base)
+
+ self.Printf(" = %v", base)
+
+ stack.Push(base)
+ case SIGNEXTEND:
+ back := stack.Pop().Uint64()
+ if back < 31 {
+ bit := uint(back*8 + 7)
+ num := stack.Pop()
+ mask := new(big.Int).Lsh(ethutil.Big1, bit)
+ mask.Sub(mask, ethutil.Big1)
+ if ethutil.BitTest(num, int(bit)) {
+ num.Or(num, mask.Not(mask))
+ } else {
+ num.And(num, mask)
+ }
+
+ num = U256(num)
+
+ self.Printf(" = %v", num)
+
+ stack.Push(num)
+ }
+ case NOT:
+ base.Sub(Pow256, stack.Pop()).Sub(base, ethutil.Big1)
+
+ // Not needed
+ //base = U256(base)
+
+ stack.Push(base)
+ case LT:
+ x, y := stack.Popn()
+ self.Printf(" %v < %v", y, x)
+ // x < y
+ if y.Cmp(x) < 0 {
+ stack.Push(ethutil.BigTrue)
+ } else {
+ stack.Push(ethutil.BigFalse)
+ }
+ case GT:
+ x, y := stack.Popn()
+ self.Printf(" %v > %v", y, x)
+
+ // x > y
+ if y.Cmp(x) > 0 {
+ stack.Push(ethutil.BigTrue)
+ } else {
+ stack.Push(ethutil.BigFalse)
+ }
+
+ case SLT:
+ y, x := S256(stack.Pop()), S256(stack.Pop())
+ self.Printf(" %v < %v", y, x)
+ // x < y
+ if y.Cmp(S256(x)) < 0 {
+ stack.Push(ethutil.BigTrue)
+ } else {
+ stack.Push(ethutil.BigFalse)
+ }
+ case SGT:
+ y, x := S256(stack.Pop()), S256(stack.Pop())
+ self.Printf(" %v > %v", y, x)
+
+ // x > y
+ if y.Cmp(x) > 0 {
+ stack.Push(ethutil.BigTrue)
+ } else {
+ stack.Push(ethutil.BigFalse)
+ }
+
+ case EQ:
+ x, y := stack.Popn()
+ self.Printf(" %v == %v", y, x)
+
+ // x == y
+ if x.Cmp(y) == 0 {
+ stack.Push(ethutil.BigTrue)
+ } else {
+ stack.Push(ethutil.BigFalse)
+ }
+ case ISZERO:
+ x := stack.Pop()
+ if x.Cmp(ethutil.BigFalse) > 0 {
+ stack.Push(ethutil.BigFalse)
+ } else {
+ stack.Push(ethutil.BigTrue)
+ }
+
+ // 0x10 range
+ case AND:
+ x, y := stack.Popn()
+ self.Printf(" %v & %v", y, x)
+
+ stack.Push(base.And(y, x))
+ case OR:
+ x, y := stack.Popn()
+ self.Printf(" %v | %v", y, x)
+
+ stack.Push(base.Or(y, x))
+ case XOR:
+ x, y := stack.Popn()
+ self.Printf(" %v ^ %v", y, x)
+
+ stack.Push(base.Xor(y, x))
+ case BYTE:
+ val, th := stack.Popn()
+
+ if th.Cmp(big.NewInt(32)) < 0 {
+ byt := big.NewInt(int64(ethutil.LeftPadBytes(val.Bytes(), 32)[th.Int64()]))
+
+ base.Set(byt)
+ } else {
+ base.Set(ethutil.BigFalse)
+ }
+
+ self.Printf(" => 0x%x", base.Bytes())
+
+ stack.Push(base)
+ case ADDMOD:
+
+ x := stack.Pop()
+ y := stack.Pop()
+ z := stack.Pop()
+
+ base.Add(x, y)
+ base.Mod(base, z)
+
+ U256(base)
+
+ self.Printf(" = %v", base)
+
+ stack.Push(base)
+ case MULMOD:
+
+ x := stack.Pop()
+ y := stack.Pop()
+ z := stack.Pop()
+
+ base.Mul(x, y)
+ base.Mod(base, z)
+
+ U256(base)
+
+ self.Printf(" = %v", base)
+
+ stack.Push(base)
+
+ // 0x20 range
+ case SHA3:
+ size, offset := stack.Popn()
+ data := crypto.Sha3(mem.Get(offset.Int64(), size.Int64()))
+
+ stack.Push(ethutil.BigD(data))
+
+ self.Printf(" => %x", data)
+ // 0x30 range
+ case ADDRESS:
+ stack.Push(ethutil.BigD(closure.Address()))
+
+ self.Printf(" => %x", closure.Address())
+ case BALANCE:
+
+ addr := stack.Pop().Bytes()
+ balance := statedb.GetBalance(addr)
+
+ stack.Push(balance)
+
+ self.Printf(" => %v (%x)", balance, addr)
+ case ORIGIN:
+ origin := self.env.Origin()
+
+ stack.Push(ethutil.BigD(origin))
+
+ self.Printf(" => %x", origin)
+ case CALLER:
+ caller := closure.caller.Address()
+ stack.Push(ethutil.BigD(caller))
+
+ self.Printf(" => %x", caller)
+ case CALLVALUE:
+ stack.Push(value)
+
+ self.Printf(" => %v", value)
+ case CALLDATALOAD:
+ var (
+ offset = stack.Pop()
+ data = make([]byte, 32)
+ lenData = big.NewInt(int64(len(callData)))
+ )
+
+ if lenData.Cmp(offset) >= 0 {
+ length := new(big.Int).Add(offset, ethutil.Big32)
+ length = ethutil.BigMin(length, lenData)
+
+ copy(data, callData[offset.Int64():length.Int64()])
+ }
+
+ self.Printf(" => 0x%x", data)
+
+ stack.Push(ethutil.BigD(data))
+ case CALLDATASIZE:
+ l := int64(len(callData))
+ stack.Push(big.NewInt(l))
+
+ self.Printf(" => %d", l)
+ case CALLDATACOPY:
+ var (
+ size = uint64(len(callData))
+ mOff = stack.Pop().Uint64()
+ cOff = stack.Pop().Uint64()
+ l = stack.Pop().Uint64()
+ )
+
+ if cOff > size {
+ cOff = 0
+ l = 0
+ } else if cOff+l > size {
+ l = 0
+ }
+
+ code := callData[cOff : cOff+l]
+
+ mem.Set(mOff, l, code)
+
+ self.Printf(" => [%v, %v, %v] %x", mOff, cOff, l, callData[cOff:cOff+l])
+ case CODESIZE, EXTCODESIZE:
+ var code []byte
+ if op == EXTCODESIZE {
+ addr := stack.Pop().Bytes()
+
+ code = statedb.GetCode(addr)
+ } else {
+ code = closure.Code
+ }
+
+ l := big.NewInt(int64(len(code)))
+ stack.Push(l)
+
+ self.Printf(" => %d", l)
+ case CODECOPY, EXTCODECOPY:
+ var code []byte
+ if op == EXTCODECOPY {
+ code = statedb.GetCode(stack.Pop().Bytes())
+ } else {
+ code = closure.Code
+ }
+
+ var (
+ size = uint64(len(code))
+ mOff = stack.Pop().Uint64()
+ cOff = stack.Pop().Uint64()
+ l = stack.Pop().Uint64()
+ )
+
+ if cOff > size {
+ cOff = 0
+ l = 0
+ } else if cOff+l > size {
+ l = uint64(math.Min(float64(cOff+l), float64(size)))
+ }
+ codeCopy := code[cOff : cOff+l]
+
+ mem.Set(mOff, l, codeCopy)
+
+ self.Printf(" => [%v, %v, %v] %x", mOff, cOff, l, codeCopy)
+ case GASPRICE:
+ stack.Push(closure.Price)
+
+ self.Printf(" => %v", closure.Price)
+
+ // 0x40 range
+ case PREVHASH:
+ prevHash := self.env.PrevHash()
+
+ stack.Push(ethutil.BigD(prevHash))
+
+ self.Printf(" => 0x%x", prevHash)
+ case COINBASE:
+ coinbase := self.env.Coinbase()
+
+ stack.Push(ethutil.BigD(coinbase))
+
+ self.Printf(" => 0x%x", coinbase)
+ case TIMESTAMP:
+ time := self.env.Time()
+
+ stack.Push(big.NewInt(time))
+
+ self.Printf(" => 0x%x", time)
+ case NUMBER:
+ number := self.env.BlockNumber()
+
+ stack.Push(number)
+
+ self.Printf(" => 0x%x", number.Bytes())
+ case DIFFICULTY:
+ difficulty := self.env.Difficulty()
+
+ stack.Push(difficulty)
+
+ self.Printf(" => 0x%x", difficulty.Bytes())
+ case GASLIMIT:
+ stack.Push(self.env.GasLimit())
+
+ // 0x50 range
+ case PUSH1, PUSH2, PUSH3, PUSH4, PUSH5, PUSH6, PUSH7, PUSH8, PUSH9, PUSH10, PUSH11, PUSH12, PUSH13, PUSH14, PUSH15, PUSH16, PUSH17, PUSH18, PUSH19, PUSH20, PUSH21, PUSH22, PUSH23, PUSH24, PUSH25, PUSH26, PUSH27, PUSH28, PUSH29, PUSH30, PUSH31, PUSH32:
+ //a := big.NewInt(int64(op) - int64(PUSH1) + 1)
+ a := uint64(op - PUSH1 + 1)
+ //pc.Add(pc, ethutil.Big1)
+ val := ethutil.BigD(closure.GetRangeValue(pc+1, a))
+ // Push value to stack
+ stack.Push(val)
+ pc += a
+ //pc.Add(pc, a.Sub(a, big.NewInt(1)))
+
+ step += int(op) - int(PUSH1) + 1
+
+ self.Printf(" => 0x%x", val.Bytes())
+ case POP:
+ stack.Pop()
+ case DUP1, DUP2, DUP3, DUP4, DUP5, DUP6, DUP7, DUP8, DUP9, DUP10, DUP11, DUP12, DUP13, DUP14, DUP15, DUP16:
+ n := int(op - DUP1 + 1)
+ stack.Dupn(n)
+
+ self.Printf(" => [%d] 0x%x", n, stack.Peek().Bytes())
+ case SWAP1, SWAP2, SWAP3, SWAP4, SWAP5, SWAP6, SWAP7, SWAP8, SWAP9, SWAP10, SWAP11, SWAP12, SWAP13, SWAP14, SWAP15, SWAP16:
+ n := int(op - SWAP1 + 2)
+ x, y := stack.Swapn(n)
+
+ self.Printf(" => [%d] %x [0] %x", n, x.Bytes(), y.Bytes())
+ case LOG0, LOG1, LOG2, LOG3, LOG4:
+ n := int(op - LOG0)
+ topics := make([][]byte, n)
+ mSize, mStart := stack.Popn()
+ for i := 0; i < n; i++ {
+ topics[i] = ethutil.LeftPadBytes(stack.Pop().Bytes(), 32)
+ }
+
+ data := mem.Geti(mStart.Int64(), mSize.Int64())
+ log := &Log{closure.Address(), topics, data}
+ self.env.AddLog(log)
+
+ self.Printf(" => %v", log)
+ case MLOAD:
+ offset := stack.Pop()
+ val := ethutil.BigD(mem.Get(offset.Int64(), 32))
+ stack.Push(val)
+
+ self.Printf(" => 0x%x", val.Bytes())
+ case MSTORE: // Store the value at stack top-1 in to memory at location stack top
+ // Pop value of the stack
+ val, mStart := stack.Popn()
+ mem.Set(mStart.Uint64(), 32, ethutil.BigToBytes(val, 256))
+
+ self.Printf(" => 0x%x", val)
+ case MSTORE8:
+ off := stack.Pop()
+ val := stack.Pop()
+
+ mem.store[off.Int64()] = byte(val.Int64() & 0xff)
+
+ self.Printf(" => [%v] 0x%x", off, val)
+ case SLOAD:
+ loc := stack.Pop()
+ val := ethutil.BigD(statedb.GetState(closure.Address(), loc.Bytes()))
+ stack.Push(val)
+
+ self.Printf(" {0x%x : 0x%x}", loc.Bytes(), val.Bytes())
+ case SSTORE:
+ val, loc := stack.Popn()
+ statedb.SetState(closure.Address(), loc.Bytes(), val)
+
+ closure.message.AddStorageChange(loc.Bytes())
+
+ self.Printf(" {0x%x : 0x%x}", loc.Bytes(), val.Bytes())
+ case JUMP:
+ jump(pc, stack.Pop())
+
+ continue
+ case JUMPI:
+ cond, pos := stack.Popn()
+
+ if cond.Cmp(ethutil.BigTrue) >= 0 {
+ jump(pc, pos)
+
+ continue
+ }
+
+ case JUMPDEST:
+ case PC:
+ stack.Push(big.NewInt(int64(pc)))
+ case MSIZE:
+ stack.Push(big.NewInt(int64(mem.Len())))
+ case GAS:
+ stack.Push(closure.Gas)
+ // 0x60 range
+ case CREATE:
+
+ var (
+ err error
+ value = stack.Pop()
+ size, offset = stack.Popn()
+ input = mem.Get(offset.Int64(), size.Int64())
+ gas = new(big.Int).Set(closure.Gas)
+
+ // Snapshot the current stack so we are able to
+ // revert back to it later.
+ //snapshot = self.env.State().Copy()
+ )
+
+ // Generate a new address
+ n := statedb.GetNonce(closure.Address())
+ addr := crypto.CreateAddress(closure.Address(), n)
+ statedb.SetNonce(closure.Address(), n+1)
+
+ self.Printf(" (*) %x", addr).Endl()
+
+ closure.UseGas(closure.Gas)
+
+ ret, err, ref := self.env.Create(closure, addr, input, gas, price, value)
+ if err != nil {
+ stack.Push(ethutil.BigFalse)
+
+ self.Printf("CREATE err %v", err)
+ } else {
+ // gas < len(ret) * CreateDataGas == NO_CODE
+ dataGas := big.NewInt(int64(len(ret)))
+ dataGas.Mul(dataGas, GasCreateByte)
+ if closure.UseGas(dataGas) {
+ ref.SetCode(ret)
+ msg.Output = ret
+ }
+
+ stack.Push(ethutil.BigD(addr))
+ }
+
+ self.Endl()
+
+ // Debug hook
+ if self.Dbg != nil {
+ self.Dbg.SetCode(closure.Code)
+ }
+ case CALL, CALLCODE:
+ self.Endl()
+
+ gas := stack.Pop()
+ // Pop gas and value of the stack.
+ value, addr := stack.Popn()
+ // Pop input size and offset
+ inSize, inOffset := stack.Popn()
+ // Pop return size and offset
+ retSize, retOffset := stack.Popn()
+
+ // Get the arguments from the memory
+ args := mem.Get(inOffset.Int64(), inSize.Int64())
+
+ var (
+ ret []byte
+ err error
+ )
+ if op == CALLCODE {
+ ret, err = self.env.CallCode(closure, addr.Bytes(), args, gas, price, value)
+ } else {
+ ret, err = self.env.Call(closure, addr.Bytes(), args, gas, price, value)
+ }
+
+ if err != nil {
+ stack.Push(ethutil.BigFalse)
+
+ vmlogger.Debugln(err)
+ } else {
+ stack.Push(ethutil.BigTrue)
+ msg.Output = ret
+
+ mem.Set(retOffset.Uint64(), retSize.Uint64(), ret)
+ }
+ self.Printf("resume %x (%v)", closure.Address(), closure.Gas)
+
+ // Debug hook
+ if self.Dbg != nil {
+ self.Dbg.SetCode(closure.Code)
+ }
+
+ case RETURN:
+ size, offset := stack.Popn()
+ ret := mem.Get(offset.Int64(), size.Int64())
+
+ self.Printf(" => [%v, %v] (%d) 0x%x", offset, size, len(ret), ret).Endl()
+
+ return closure.Return(ret), nil
+ case SUICIDE:
+ receiver := statedb.GetOrNewStateObject(stack.Pop().Bytes())
+ balance := statedb.GetBalance(closure.Address())
+
+ self.Printf(" => (%x) %v", receiver.Address()[:4], balance)
+
+ receiver.AddAmount(balance)
+ statedb.Delete(closure.Address())
+
+ fallthrough
+ case STOP: // Stop the closure
+ self.Endl()
+
+ return closure.Return(nil), nil
+ default:
+ vmlogger.Debugf("(pc) %-3v Invalid opcode %x\n", pc, op)
+
+ closure.ReturnGas(big.NewInt(1), nil)
+
+ return closure.Return(nil), fmt.Errorf("Invalid opcode %x", op)
+ }
+
+ pc++
+
+ self.Endl()
+
+ if self.Dbg != nil {
+ for _, instrNo := range self.Dbg.BreakPoints() {
+ if pc == uint64(instrNo) {
+ self.Stepping = true
+
+ if !self.Dbg.BreakHook(prevStep, op, mem, stack, statedb.GetStateObject(closure.Address())) {
+ return nil, nil
+ }
+ } else if self.Stepping {
+ if !self.Dbg.StepHook(prevStep, op, mem, stack, statedb.GetStateObject(closure.Address())) {
+ return nil, nil
+ }
+ }
+ }
+ }
+
+ }
+}
+
+func (self *DebugVm) RunPrecompiled(p *PrecompiledAccount, callData []byte, closure *Closure) (ret []byte, err error) {
+ gas := p.Gas(len(callData))
+ if closure.UseGas(gas) {
+ ret = p.Call(callData)
+ self.Printf("NATIVE_FUNC => %x", ret)
+ self.Endl()
+
+ return closure.Return(ret), nil
+ } else {
+ self.Endl()
+
+ tmp := new(big.Int).Set(closure.Gas)
+
+ closure.UseGas(closure.Gas)
+
+ return closure.Return(nil), OOG(gas, tmp)
+ }
+}
+
+func (self *DebugVm) Printf(format string, v ...interface{}) VirtualMachine {
+ if self.logTy == LogTyPretty {
+ self.logStr += fmt.Sprintf(format, v...)
+ }
+
+ return self
+}
+
+func (self *DebugVm) Endl() VirtualMachine {
+ if self.logTy == LogTyPretty {
+ vmlogger.Debugln(self.logStr)
+ self.logStr = ""
+ }
+
+ return self
+}
+
+func (self *DebugVm) Env() Environment {
+ return self.env
+}
diff --git a/vm/vm_test.go b/vm/vm_test.go
new file mode 100644
index 000000000..9bd147a72
--- /dev/null
+++ b/vm/vm_test.go
@@ -0,0 +1,3 @@
+package vm
+
+// Tests have been removed in favour of general tests. If anything implementation specific needs testing, put it here
diff --git a/websocket/client.go b/websocket/client.go
new file mode 100644
index 000000000..d961816e8
--- /dev/null
+++ b/websocket/client.go
@@ -0,0 +1,122 @@
+package websocket
+
+import (
+ "fmt"
+ "io"
+
+ ws "code.google.com/p/go.net/websocket"
+)
+
+const channelBufSize = 100
+
+var maxId int = 0
+
+type MsgFunc func(c *Client, msg *Message)
+
+// Chat client.
+type Client struct {
+ id int
+ ws *ws.Conn
+ server *Server
+ ch chan *Message
+ doneCh chan bool
+
+ onMessage MsgFunc
+}
+
+// Create new chat client.
+func NewClient(ws *ws.Conn, server *Server) *Client {
+
+ if ws == nil {
+ panic("ws cannot be nil")
+ }
+
+ if server == nil {
+ panic("server cannot be nil")
+ }
+
+ maxId++
+ ch := make(chan *Message, channelBufSize)
+ doneCh := make(chan bool)
+
+ return &Client{maxId, ws, server, ch, doneCh, nil}
+}
+
+func (c *Client) Id() int {
+ return c.id
+}
+
+func (c *Client) Conn() *ws.Conn {
+ return c.ws
+}
+
+func (c *Client) Write(data interface{}, seed int) {
+ msg := &Message{Seed: seed, Data: data}
+ select {
+ case c.ch <- msg:
+ default:
+ c.server.Del(c)
+ err := fmt.Errorf("client %d is disconnected.", c.id)
+ c.server.Err(err)
+ }
+}
+
+func (c *Client) Done() {
+ c.doneCh <- true
+}
+
+// Listen Write and Read request via chanel
+func (c *Client) Listen() {
+ go c.listenWrite()
+ c.listenRead()
+}
+
+// Listen write request via chanel
+func (c *Client) listenWrite() {
+ wslogger.Debugln("Listening write to client")
+ for {
+ select {
+
+ // send message to the client
+ case msg := <-c.ch:
+ wslogger.Debugln("Send:", msg)
+ ws.JSON.Send(c.ws, msg)
+
+ // receive done request
+ case <-c.doneCh:
+ c.server.Del(c)
+ c.doneCh <- true // for listenRead method
+ return
+ }
+ }
+}
+
+// Listen read request via chanel
+func (c *Client) listenRead() {
+ wslogger.Debugln("Listening read from client")
+ for {
+ select {
+
+ // receive done request
+ case <-c.doneCh:
+ c.server.Del(c)
+ c.doneCh <- true // for listenWrite method
+ return
+
+ // read data from ws connection
+ default:
+ var msg Message
+ err := ws.JSON.Receive(c.ws, &msg)
+ if err == io.EOF {
+ c.doneCh <- true
+ } else if err != nil {
+ c.server.Err(err)
+ } else {
+ wslogger.Debugln(&msg)
+ if c.onMessage != nil {
+ c.onMessage(c, &msg)
+ }
+ }
+ }
+ }
+}
diff --git a/websocket/message.go b/websocket/message.go
new file mode 100644
index 000000000..67289c4c4
--- /dev/null
+++ b/websocket/message.go
@@ -0,0 +1,14 @@
+package websocket
+
+import "github.com/ethereum/go-ethereum/ethutil"
+
+type Message struct {
+ Call string `json:"call"`
+ Args []interface{} `json:"args"`
+ Seed int `json:"seed"`
+ Data interface{} `json:"data"`
+}
+
+func (self *Message) Arguments() *ethutil.Value {
+ return ethutil.NewValue(self.Args)
+}
diff --git a/websocket/server.go b/websocket/server.go
new file mode 100644
index 000000000..5fd923a0c
--- /dev/null
+++ b/websocket/server.go
@@ -0,0 +1,127 @@
+package websocket
+
+import (
+ "net/http"
+
+ "github.com/ethereum/go-ethereum/logger"
+
+ ws "code.google.com/p/go.net/websocket"
+)
+
+var wslogger = logger.NewLogger("WS")
+
+// Chat server.
+type Server struct {
+ httpServ string
+ pattern string
+ messages []*Message
+ clients map[int]*Client
+ addCh chan *Client
+ delCh chan *Client
+ sendAllCh chan string
+ doneCh chan bool
+ errCh chan error
+ msgFunc MsgFunc
+}
+
+// Create new chat server.
+func NewServer(pattern, httpServ string) *Server {
+ clients := make(map[int]*Client)
+ addCh := make(chan *Client)
+ delCh := make(chan *Client)
+ sendAllCh := make(chan string)
+ doneCh := make(chan bool)
+ errCh := make(chan error)
+
+ return &Server{
+ httpServ,
+ pattern,
+ nil,
+ clients,
+ addCh,
+ delCh,
+ sendAllCh,
+ doneCh,
+ errCh,
+ nil,
+ }
+}
+
+func (s *Server) Add(c *Client) {
+ s.addCh <- c
+}
+
+func (s *Server) Del(c *Client) {
+ s.delCh <- c
+}
+
+func (s *Server) SendAll(msg string) {
+ s.sendAllCh <- msg
+}
+
+func (s *Server) Done() {
+ s.doneCh <- true
+}
+
+func (s *Server) Err(err error) {
+ s.errCh <- err
+}
+
+func (s *Server) servHTTP() {
+ wslogger.Debugln("Serving http", s.httpServ)
+ err := http.ListenAndServe(s.httpServ, nil)
+
+ wslogger.Warnln(err)
+}
+
+func (s *Server) MessageFunc(f MsgFunc) {
+ s.msgFunc = f
+}
+
+// Listen and serve.
+// It serves client connection and broadcast request.
+func (s *Server) Listen() {
+ wslogger.Debugln("Listening server...")
+
+ // ws handler
+ onConnected := func(ws *ws.Conn) {
+ defer func() {
+ err := ws.Close()
+ if err != nil {
+ s.errCh <- err
+ }
+ }()
+
+ client := NewClient(ws, s)
+ client.onMessage = s.msgFunc
+ s.Add(client)
+ client.Listen()
+ }
+ // Disable Origin check. Request don't need to come necessarily from origin.
+ http.HandleFunc(s.pattern, func(w http.ResponseWriter, req *http.Request) {
+ s := ws.Server{Handler: ws.Handler(onConnected)}
+ s.ServeHTTP(w, req)
+ })
+ wslogger.Debugln("Created handler")
+
+ go s.servHTTP()
+
+ for {
+ select {
+
+ // Add new a client
+ case c := <-s.addCh:
+ s.clients[c.id] = c
+
+ // del a client
+ case c := <-s.delCh:
+ delete(s.clients, c.id)
+
+ case err := <-s.errCh:
+ wslogger.Debugln("Error:", err.Error())
+
+ case <-s.doneCh:
+ return
+ }
+ }
+}
diff --git a/whisper/envelope.go b/whisper/envelope.go
new file mode 100644
index 000000000..683e88128
--- /dev/null
+++ b/whisper/envelope.go
@@ -0,0 +1,121 @@
+package whisper
+
+import (
+ "bytes"
+ "crypto/ecdsa"
+ "encoding/binary"
+ "fmt"
+ "io"
+ "time"
+
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/rlp"
+)
+
+const (
+ DefaultPow = 50 * time.Millisecond
+)
+
+type Envelope struct {
+ Expiry uint32 // Whisper protocol specifies int32, really should be int64
+ Ttl uint32 // ^^^^^^
+ Topics [][]byte
+ Data []byte
+ Nonce uint32
+
+ hash Hash
+}
+
+func NewEnvelopeFromReader(reader io.Reader) (*Envelope, error) {
+ var envelope Envelope
+
+ buf := new(bytes.Buffer)
+ buf.ReadFrom(reader)
+
+ h := H(crypto.Sha3(buf.Bytes()))
+ if err := rlp.Decode(buf, &envelope); err != nil {
+ return nil, err
+ }
+
+ envelope.hash = h
+
+ return &envelope, nil
+}
+
+func (self *Envelope) Hash() Hash {
+ if self.hash == EmptyHash {
+ self.hash = H(crypto.Sha3(ethutil.Encode(self)))
+ }
+
+ return self.hash
+}
+
+func NewEnvelope(ttl time.Duration, topics [][]byte, data *Message) *Envelope {
+ exp := time.Now().Add(ttl)
+
+ return &Envelope{uint32(exp.Unix()), uint32(ttl.Seconds()), topics, data.Bytes(), 0, Hash{}}
+}
+
+func (self *Envelope) Seal(pow time.Duration) {
+ self.proveWork(pow)
+}
+
+func (self *Envelope) Open(prv *ecdsa.PrivateKey) (msg *Message, err error) {
+ data := self.Data
+ var message Message
+ dataStart := 1
+ if data[0] > 0 {
+ if len(data) < 66 {
+ return nil, fmt.Errorf("unable to open envelope. First bit set but len(data) < 66")
+ }
+ dataStart = 66
+ message.Flags = data[0]
+ message.Signature = data[1:66]
+ }
+ message.Payload = data[dataStart:]
+ if prv != nil {
+ message.Payload, err = crypto.Decrypt(prv, message.Payload)
+ if err != nil {
+ return nil, fmt.Errorf("unable to open envelope. Decrypt failed: %v", err)
+ }
+ }
+
+ return &message, nil
+}
+
+func (self *Envelope) proveWork(dura time.Duration) {
+ var bestBit int
+ d := make([]byte, 64)
+ copy(d[:32], ethutil.Encode(self.withoutNonce()))
+
+ then := time.Now().Add(dura).UnixNano()
+ for n := uint32(0); time.Now().UnixNano() < then; {
+ for i := 0; i < 1024; i++ {
+ binary.BigEndian.PutUint32(d[60:], n)
+
+ fbs := ethutil.FirstBitSet(ethutil.BigD(crypto.Sha3(d)))
+ if fbs > bestBit {
+ bestBit = fbs
+ self.Nonce = n
+ }
+
+ n++
+ }
+ }
+}
+
+func (self *Envelope) valid() bool {
+ d := make([]byte, 64)
+ copy(d[:32], ethutil.Encode(self.withoutNonce()))
+ binary.BigEndian.PutUint32(d[60:], self.Nonce)
+ return ethutil.FirstBitSet(ethutil.BigD(crypto.Sha3(d))) > 0
+}
+
+func (self *Envelope) withoutNonce() interface{} {
+ return []interface{}{self.Expiry, self.Ttl, ethutil.ByteSliceToInterface(self.Topics), self.Data}
+}
+
+func (self *Envelope) RlpData() interface{} {
+ return []interface{}{self.Expiry, self.Ttl, ethutil.ByteSliceToInterface(self.Topics), self.Data, self.Nonce}
+}
diff --git a/whisper/filter.go b/whisper/filter.go
new file mode 100644
index 000000000..4315aa556
--- /dev/null
+++ b/whisper/filter.go
@@ -0,0 +1,10 @@
+package whisper
+
+import "crypto/ecdsa"
+
+type Filter struct {
+ To *ecdsa.PrivateKey
+ From *ecdsa.PublicKey
+ Topics [][]byte
+ Fn func(*Message)
+}
diff --git a/whisper/main.go b/whisper/main.go
new file mode 100644
index 000000000..2ee2f3ff1
--- /dev/null
+++ b/whisper/main.go
@@ -0,0 +1,47 @@
+// +build none
+
+package main
+
+import (
+ "fmt"
+ "log"
+ "net"
+ "os"
+
+ "github.com/ethereum/go-ethereum/event"
+ "github.com/ethereum/go-ethereum/logger"
+ "github.com/ethereum/go-ethereum/p2p"
+ "github.com/ethereum/go-ethereum/whisper"
+ "github.com/obscuren/secp256k1-go"
+)
+
+func main() {
+ logger.AddLogSystem(logger.NewStdLogSystem(os.Stdout, log.LstdFlags, logger.InfoLevel))
+
+ pub, _ := secp256k1.GenerateKeyPair()
+
+ whisper := whisper.New(&event.TypeMux{})
+
+ srv := p2p.Server{
+ MaxPeers: 10,
+ Identity: p2p.NewSimpleClientIdentity("whisper-go", "1.0", "", string(pub)),
+ ListenAddr: ":30303",
+ NAT: p2p.UPNP(),
+
+ Protocols: []p2p.Protocol{whisper.Protocol()},
+ }
+ if err := srv.Start(); err != nil {
+ fmt.Println("could not start server:", err)
+ os.Exit(1)
+ }
+
+ // add seed peers
+ seed, err := net.ResolveTCPAddr("tcp", "poc-7.ethdev.com:30300")
+ if err != nil {
+ fmt.Println("couldn't resolve:", err)
+ os.Exit(1)
+ }
+ srv.SuggestPeer(seed.IP, seed.Port, nil)
+
+ select {}
+}
diff --git a/whisper/message.go b/whisper/message.go
new file mode 100644
index 000000000..db0110b4a
--- /dev/null
+++ b/whisper/message.go
@@ -0,0 +1,74 @@
+package whisper
+
+import (
+ "crypto/ecdsa"
+ "time"
+
+ "github.com/ethereum/go-ethereum/crypto"
+)
+
+type Message struct {
+ Flags byte
+ Signature []byte
+ Payload []byte
+}
+
+func NewMessage(payload []byte) *Message {
+ return &Message{Flags: 0, Payload: payload}
+}
+
+func (self *Message) hash() []byte {
+ return crypto.Sha3(append([]byte{self.Flags}, self.Payload...))
+}
+
+func (self *Message) sign(key *ecdsa.PrivateKey) (err error) {
+ self.Flags = 1
+ self.Signature, err = crypto.Sign(self.hash(), key)
+ return
+}
+
+func (self *Message) Recover() *ecdsa.PublicKey {
+ defer func() { recover() }() // in case of invalid sig
+ return crypto.SigToPub(self.hash(), self.Signature)
+}
+
+func (self *Message) Encrypt(to *ecdsa.PublicKey) (err error) {
+ self.Payload, err = crypto.Encrypt(to, self.Payload)
+ if err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func (self *Message) Bytes() []byte {
+ return append([]byte{self.Flags}, append(self.Signature, self.Payload...)...)
+}
+
+type Opts struct {
+ From *ecdsa.PrivateKey
+ To *ecdsa.PublicKey
+ Ttl time.Duration
+ Topics [][]byte
+}
+
+func (self *Message) Seal(pow time.Duration, opts Opts) (*Envelope, error) {
+ if opts.From != nil {
+ err := self.sign(opts.From)
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ if opts.To != nil {
+ err := self.Encrypt(opts.To)
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ envelope := NewEnvelope(DefaultTtl, opts.Topics, self)
+ envelope.Seal(pow)
+
+ return envelope, nil
+}
diff --git a/whisper/messages_test.go b/whisper/messages_test.go
new file mode 100644
index 000000000..cba103011
--- /dev/null
+++ b/whisper/messages_test.go
@@ -0,0 +1,51 @@
+package whisper
+
+import (
+ "bytes"
+ "crypto/elliptic"
+ "fmt"
+ "testing"
+
+ "github.com/ethereum/go-ethereum/crypto"
+)
+
+func TestSign(t *testing.T) {
+ prv, _ := crypto.GenerateKey()
+ msg := NewMessage([]byte("hello world"))
+ msg.sign(prv)
+
+ pubKey := msg.Recover()
+ p1 := elliptic.Marshal(crypto.S256(), prv.PublicKey.X, prv.PublicKey.Y)
+ p2 := elliptic.Marshal(crypto.S256(), pubKey.X, pubKey.Y)
+
+ if !bytes.Equal(p1, p2) {
+ t.Error("recovered pub key did not match")
+ }
+}
+
+func TestMessageEncryptDecrypt(t *testing.T) {
+ prv1, _ := crypto.GenerateKey()
+ prv2, _ := crypto.GenerateKey()
+
+ data := []byte("hello world")
+ msg := NewMessage(data)
+ envelope, err := msg.Seal(DefaultPow, Opts{
+ From: prv1,
+ To: &prv2.PublicKey,
+ })
+ if err != nil {
+ fmt.Println(err)
+ t.FailNow()
+ }
+
+ msg1, err := envelope.Open(prv2)
+ if err != nil {
+ fmt.Println(err)
+ t.FailNow()
+ }
+
+ if !bytes.Equal(msg1.Payload, data) {
+ fmt.Println("encryption error. data did not match")
+ t.FailNow()
+ }
+}
diff --git a/whisper/peer.go b/whisper/peer.go
new file mode 100644
index 000000000..d42b374b5
--- /dev/null
+++ b/whisper/peer.go
@@ -0,0 +1,128 @@
+package whisper
+
+import (
+ "fmt"
+ "io/ioutil"
+ "time"
+
+ "github.com/ethereum/go-ethereum/p2p"
+ "gopkg.in/fatih/set.v0"
+)
+
+const (
+ protocolVersion = 0x02
+)
+
+type peer struct {
+ host *Whisper
+ peer *p2p.Peer
+ ws p2p.MsgReadWriter
+
+ // XXX Eventually this is going to reach exceptional large space. We need an expiry here
+ known *set.Set
+
+ quit chan struct{}
+}
+
+func NewPeer(host *Whisper, p *p2p.Peer, ws p2p.MsgReadWriter) *peer {
+ return &peer{host, p, ws, set.New(), make(chan struct{})}
+}
+
+func (self *peer) init() error {
+ if err := self.handleStatus(); err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func (self *peer) start() {
+ go self.update()
+ self.peer.Infoln("whisper started")
+}
+
+func (self *peer) stop() {
+ self.peer.Infoln("whisper stopped")
+
+ close(self.quit)
+}
+
+func (self *peer) update() {
+ relay := time.NewTicker(300 * time.Millisecond)
+out:
+ for {
+ select {
+ case <-relay.C:
+ err := self.broadcast(self.host.envelopes())
+ if err != nil {
+ self.peer.Infoln(err)
+ break out
+ }
+
+ case <-self.quit:
+ break out
+ }
+ }
+}
+
+func (self *peer) broadcast(envelopes []*Envelope) error {
+ envs := make([]interface{}, len(envelopes))
+ i := 0
+ for _, envelope := range envelopes {
+ if !self.known.Has(envelope.Hash()) {
+ envs[i] = envelope
+ self.known.Add(envelope.Hash())
+ i++
+ }
+ }
+
+ if i > 0 {
+ msg := p2p.NewMsg(envelopesMsg, envs[:i]...)
+ if err := self.ws.WriteMsg(msg); err != nil {
+ return err
+ }
+ self.peer.Infoln("broadcasted", i, "message(s)")
+ }
+
+ return nil
+}
+
+func (self *peer) addKnown(envelope *Envelope) {
+ self.known.Add(envelope.Hash())
+}
+
+func (self *peer) handleStatus() error {
+ ws := self.ws
+
+ if err := ws.WriteMsg(self.statusMsg()); err != nil {
+ return err
+ }
+
+ msg, err := ws.ReadMsg()
+ if err != nil {
+ return err
+ }
+
+ if msg.Code != statusMsg {
+ return fmt.Errorf("peer send %x before status msg", msg.Code)
+ }
+
+ data, err := ioutil.ReadAll(msg.Payload)
+ if err != nil {
+ return err
+ }
+
+ if len(data) == 0 {
+ return fmt.Errorf("malformed status. data len = 0")
+ }
+
+ if pv := data[0]; pv != protocolVersion {
+ return fmt.Errorf("protocol version mismatch %d != %d", pv, protocolVersion)
+ }
+
+ return nil
+}
+
+func (self *peer) statusMsg() p2p.Msg {
+ return p2p.NewMsg(statusMsg, protocolVersion)
+}
diff --git a/whisper/sort.go b/whisper/sort.go
new file mode 100644
index 000000000..8c5b46e9e
--- /dev/null
+++ b/whisper/sort.go
@@ -0,0 +1,25 @@
+package whisper
+
+import "sort"
+
+type sortedKeys struct {
+ k []int32
+}
+
+func (self *sortedKeys) Len() int { return len(self.k) }
+func (self *sortedKeys) Less(i, j int) bool { return self.k[i] < self.k[j] }
+func (self *sortedKeys) Swap(i, j int) { self.k[i], self.k[j] = self.k[j], self.k[i] }
+
+func sortKeys(m map[int32]Hash) []int32 {
+ sorted := new(sortedKeys)
+ sorted.k = make([]int32, len(m))
+ i := 0
+ for key, _ := range m {
+ sorted.k[i] = key
+ i++
+ }
+
+ sort.Sort(sorted)
+
+ return sorted.k
+}
diff --git a/whisper/sort_test.go b/whisper/sort_test.go
new file mode 100644
index 000000000..5d8177d41
--- /dev/null
+++ b/whisper/sort_test.go
@@ -0,0 +1,19 @@
+package whisper
+
+import "testing"
+
+func TestSorting(t *testing.T) {
+ m := map[int32]Hash{
+ 1: HS("1"),
+ 3: HS("3"),
+ 2: HS("2"),
+ 5: HS("5"),
+ }
+ exp := []int32{1, 2, 3, 5}
+ res := sortKeys(m)
+ for i, k := range res {
+ if k != exp[i] {
+ t.Error(k, "failed. Expected", exp[i])
+ }
+ }
+}
diff --git a/whisper/util.go b/whisper/util.go
new file mode 100644
index 000000000..abef1d667
--- /dev/null
+++ b/whisper/util.go
@@ -0,0 +1,27 @@
+package whisper
+
+import "github.com/ethereum/go-ethereum/crypto"
+
+func hashTopic(topic []byte) []byte {
+ return crypto.Sha3(topic)[:4]
+}
+
+// NOTE this isn't DRY, but I don't want to iterate twice.
+
+// Returns a formatted topics byte slice.
+// data: unformatted data (e.g., no hashes needed)
+func Topics(data [][]byte) [][]byte {
+ d := make([][]byte, len(data))
+ for i, byts := range data {
+ d[i] = hashTopic(byts)
+ }
+ return d
+}
+
+func TopicsFromString(data []string) [][]byte {
+ d := make([][]byte, len(data))
+ for i, str := range data {
+ d[i] = hashTopic([]byte(str))
+ }
+ return d
+}
diff --git a/whisper/whisper.go b/whisper/whisper.go
new file mode 100644
index 000000000..356debd1c
--- /dev/null
+++ b/whisper/whisper.go
@@ -0,0 +1,246 @@
+package whisper
+
+import (
+ "bytes"
+ "crypto/ecdsa"
+ "errors"
+ "fmt"
+ "sync"
+ "time"
+
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/event/filter"
+ "github.com/ethereum/go-ethereum/p2p"
+ "gopkg.in/fatih/set.v0"
+)
+
+// MOVE ME
+type Hash struct {
+ hash string
+}
+
+var EmptyHash Hash
+
+func H(hash []byte) Hash {
+ return Hash{string(hash)}
+}
+func HS(hash string) Hash {
+ return Hash{hash}
+}
+
+func (self Hash) Compare(other Hash) int {
+ return bytes.Compare([]byte(self.hash), []byte(other.hash))
+}
+
+// MOVE ME END
+
+const (
+ statusMsg = 0x0
+ envelopesMsg = 0x01
+)
+
+type MessageEvent struct {
+ To *ecdsa.PrivateKey
+ From *ecdsa.PublicKey
+ Message *Message
+}
+
+const DefaultTtl = 50 * time.Second
+
+type Whisper struct {
+ protocol p2p.Protocol
+ filters *filter.Filters
+
+ mmu sync.RWMutex
+ messages map[Hash]*Envelope
+ expiry map[uint32]*set.SetNonTS
+
+ quit chan struct{}
+
+ keys []*ecdsa.PrivateKey
+}
+
+func New() *Whisper {
+ whisper := &Whisper{
+ messages: make(map[Hash]*Envelope),
+ filters: filter.New(),
+ expiry: make(map[uint32]*set.SetNonTS),
+ quit: make(chan struct{}),
+ }
+ whisper.filters.Start()
+ go whisper.update()
+
+ // XXX TODO REMOVE TESTING CODE
+ msg := NewMessage([]byte(fmt.Sprintf("Hello world. This is whisper-go. Incase you're wondering; the time is %v", time.Now())))
+ envelope, _ := msg.Seal(DefaultPow, Opts{
+ Ttl: DefaultTtl,
+ })
+ if err := whisper.Send(envelope); err != nil {
+ fmt.Println(err)
+ }
+ // XXX TODO REMOVE TESTING CODE
+
+ // p2p whisper sub protocol handler
+ whisper.protocol = p2p.Protocol{
+ Name: "shh",
+ Version: 2,
+ Length: 2,
+ Run: whisper.msgHandler,
+ }
+
+ return whisper
+}
+
+func (self *Whisper) Stop() {
+ close(self.quit)
+}
+
+func (self *Whisper) Send(envelope *Envelope) error {
+ return self.add(envelope)
+}
+
+func (self *Whisper) NewIdentity() *ecdsa.PrivateKey {
+ key, err := crypto.GenerateKey()
+ if err != nil {
+ panic(err)
+ }
+ self.keys = append(self.keys, key)
+
+ return key
+}
+
+func (self *Whisper) HasIdentity(key *ecdsa.PrivateKey) bool {
+ for _, key := range self.keys {
+ if key.D.Cmp(key.D) == 0 {
+ return true
+ }
+ }
+ return false
+}
+
+func (self *Whisper) Watch(opts Filter) int {
+ return self.filters.Install(filter.Generic{
+ Str1: string(crypto.FromECDSA(opts.To)),
+ Str2: string(crypto.FromECDSAPub(opts.From)),
+ Fn: func(data interface{}) {
+ opts.Fn(data.(*Message))
+ },
+ })
+}
+
+// Main handler for passing whisper messages to whisper peer objects
+func (self *Whisper) msgHandler(peer *p2p.Peer, ws p2p.MsgReadWriter) error {
+ wpeer := NewPeer(self, peer, ws)
+ // initialise whisper peer (handshake/status)
+ if err := wpeer.init(); err != nil {
+ return err
+ }
+ // kick of the main handler for broadcasting/managing envelopes
+ go wpeer.start()
+ defer wpeer.stop()
+
+ // Main *read* loop. Writing is done by the peer it self.
+ for {
+ msg, err := ws.ReadMsg()
+ if err != nil {
+ return err
+ }
+
+ envelope, err := NewEnvelopeFromReader(msg.Payload)
+ if err != nil {
+ peer.Infoln(err)
+ continue
+ }
+
+ if err := self.add(envelope); err != nil {
+ // TODO Punish peer here. Invalid envelope.
+ peer.Infoln(err)
+ }
+ wpeer.addKnown(envelope)
+ }
+}
+
+// takes care of adding envelopes to the messages pool. At this moment no sanity checks are being performed.
+func (self *Whisper) add(envelope *Envelope) error {
+ if !envelope.valid() {
+ return errors.New("invalid pow provided for envelope")
+ }
+
+ self.mmu.Lock()
+ defer self.mmu.Unlock()
+
+ hash := envelope.Hash()
+ self.messages[hash] = envelope
+ if self.expiry[envelope.Expiry] == nil {
+ self.expiry[envelope.Expiry] = set.NewNonTS()
+ }
+
+ if !self.expiry[envelope.Expiry].Has(hash) {
+ self.expiry[envelope.Expiry].Add(hash)
+ self.postEvent(envelope)
+ }
+
+ return nil
+}
+
+func (self *Whisper) update() {
+ expire := time.NewTicker(800 * time.Millisecond)
+out:
+ for {
+ select {
+ case <-expire.C:
+ self.expire()
+ case <-self.quit:
+ break out
+ }
+ }
+}
+
+func (self *Whisper) expire() {
+ self.mmu.Lock()
+ defer self.mmu.Unlock()
+
+ now := uint32(time.Now().Unix())
+ for then, hashSet := range self.expiry {
+ if then > now {
+ continue
+ }
+
+ hashSet.Each(func(v interface{}) bool {
+ delete(self.messages, v.(Hash))
+ return true
+ })
+ self.expiry[then].Clear()
+ }
+}
+
+func (self *Whisper) envelopes() (envelopes []*Envelope) {
+ self.mmu.RLock()
+ defer self.mmu.RUnlock()
+
+ envelopes = make([]*Envelope, len(self.messages))
+ i := 0
+ for _, envelope := range self.messages {
+ envelopes[i] = envelope
+ i++
+ }
+
+ return
+}
+
+func (self *Whisper) postEvent(envelope *Envelope) {
+ for _, key := range self.keys {
+ if message, err := envelope.Open(key); err == nil {
+ // Create a custom filter?
+ self.filters.Notify(filter.Generic{
+ Str1: string(crypto.FromECDSA(key)), Str2: string(crypto.FromECDSAPub(message.Recover())),
+ }, message)
+ } else {
+ fmt.Println(err)
+ }
+ }
+}
+
+func (self *Whisper) Protocol() p2p.Protocol {
+ return self.protocol
+}
diff --git a/whisper/whisper_test.go b/whisper/whisper_test.go
new file mode 100644
index 000000000..107cb8c97
--- /dev/null
+++ b/whisper/whisper_test.go
@@ -0,0 +1,47 @@
+package whisper
+
+import (
+ "fmt"
+ "testing"
+ "time"
+)
+
+func TestKeyManagement(t *testing.T) {
+ whisper := New()
+
+ key := whisper.NewIdentity()
+ if !whisper.HasIdentity(key) {
+ t.Error("expected whisper to have identify")
+ }
+}
+
+func TestEvent(t *testing.T) {
+ res := make(chan *Message, 1)
+ whisper := New()
+ id := whisper.NewIdentity()
+ whisper.Watch(Filter{
+ To: id,
+ Fn: func(msg *Message) {
+ res <- msg
+ },
+ })
+
+ msg := NewMessage([]byte(fmt.Sprintf("Hello world. This is whisper-go. Incase you're wondering; the time is %v", time.Now())))
+ envelope, err := msg.Seal(DefaultPow, Opts{
+ Ttl: DefaultTtl,
+ From: id,
+ To: &id.PublicKey,
+ })
+ if err != nil {
+ fmt.Println(err)
+ t.FailNow()
+ }
+
+ tick := time.NewTicker(time.Second)
+ whisper.postEvent(envelope)
+ select {
+ case <-res:
+ case <-tick.C:
+ t.Error("did not receive message")
+ }
+}
diff --git a/wire/.gitignore b/wire/.gitignore
new file mode 100644
index 000000000..f725d58d1
--- /dev/null
+++ b/wire/.gitignore
@@ -0,0 +1,12 @@
+# See http://help.github.com/ignore-files/ for more about ignoring files.
+#
+# If you find yourself ignoring temporary files generated by your text editor
+# or operating system, you probably want to add a global ignore instead:
+# git config --global core.excludesfile ~/.gitignore_global
+
+/tmp
+*/**/*un~
+*un~
+.DS_Store
+*/**/.DS_Store
+
diff --git a/wire/README.md b/wire/README.md
new file mode 100644
index 000000000..7f63688b3
--- /dev/null
+++ b/wire/README.md
@@ -0,0 +1,36 @@
+# ethwire
+
+The ethwire package contains the ethereum wire protocol. The ethwire
+package is required to write and read from the ethereum network.
+
+# Installation
+
+`go get github.com/ethereum/ethwire-go`
+
+# Messaging overview
+
+The Ethereum Wire protocol defines the communication between the nodes
+running Ethereum. Further reader reading can be done on the
+[Wiki](http://wiki.ethereum.org/index.php/Wire_Protocol).
+
+# Reading Messages
+
+```go
+// Read and validate the next eth message from the provided connection.
+// returns a error message with the details.
+msg, err := ethwire.ReadMessage(conn)
+if err != nil {
+ // Handle error
+}
+```
+
+# Writing Messages
+
+```go
+// Constructs a message which can be interpreted by the eth network.
+// Write the inventory to network
+err := ethwire.WriteMessage(conn, &Msg{
+ Type: ethwire.MsgInvTy,
+ Data : []interface{}{...},
+})
+```
diff --git a/wire/client_identity.go b/wire/client_identity.go
new file mode 100644
index 000000000..0a268024a
--- /dev/null
+++ b/wire/client_identity.go
@@ -0,0 +1,56 @@
+package wire
+
+import (
+ "fmt"
+ "runtime"
+)
+
+// should be used in Peer handleHandshake, incorporate Caps, ProtocolVersion, Pubkey etc.
+type ClientIdentity interface {
+ String() string
+}
+
+type SimpleClientIdentity struct {
+ clientIdentifier string
+ version string
+ customIdentifier string
+ os string
+ implementation string
+}
+
+func NewSimpleClientIdentity(clientIdentifier string, version string, customIdentifier string) *SimpleClientIdentity {
+ clientIdentity := &SimpleClientIdentity{
+ clientIdentifier: clientIdentifier,
+ version: version,
+ customIdentifier: customIdentifier,
+ os: runtime.GOOS,
+ implementation: runtime.Version(),
+ }
+
+ return clientIdentity
+}
+
+func (c *SimpleClientIdentity) init() {
+}
+
+func (c *SimpleClientIdentity) String() string {
+ var id string
+ if len(c.customIdentifier) > 0 {
+ id = "/" + c.customIdentifier
+ }
+
+ return fmt.Sprintf("%s/v%s%s/%s/%s",
+ c.clientIdentifier,
+ c.version,
+ id,
+ c.os,
+ c.implementation)
+}
+
+func (c *SimpleClientIdentity) SetCustomIdentifier(customIdentifier string) {
+ c.customIdentifier = customIdentifier
+}
+
+func (c *SimpleClientIdentity) GetCustomIdentifier() string {
+ return c.customIdentifier
+}
diff --git a/wire/client_identity_test.go b/wire/client_identity_test.go
new file mode 100644
index 000000000..c0e7a0159
--- /dev/null
+++ b/wire/client_identity_test.go
@@ -0,0 +1,30 @@
+package wire
+
+import (
+ "fmt"
+ "runtime"
+ "testing"
+)
+
+func TestClientIdentity(t *testing.T) {
+ clientIdentity := NewSimpleClientIdentity("Ethereum(G)", "0.5.16", "test")
+ clientString := clientIdentity.String()
+ expected := fmt.Sprintf("Ethereum(G)/v0.5.16/test/%s/%s", runtime.GOOS, runtime.Version())
+ if clientString != expected {
+ t.Errorf("Expected clientIdentity to be %q, got %q", expected, clientString)
+ }
+ customIdentifier := clientIdentity.GetCustomIdentifier()
+ if customIdentifier != "test" {
+ t.Errorf("Expected clientIdentity.GetCustomIdentifier() to be 'test', got %q", customIdentifier)
+ }
+ clientIdentity.SetCustomIdentifier("test2")
+ customIdentifier = clientIdentity.GetCustomIdentifier()
+ if customIdentifier != "test2" {
+ t.Errorf("Expected clientIdentity.GetCustomIdentifier() to be 'test2', got %q", customIdentifier)
+ }
+ clientString = clientIdentity.String()
+ expected = fmt.Sprintf("Ethereum(G)/v0.5.16/test2/%s/%s", runtime.GOOS, runtime.Version())
+ if clientString != expected {
+ t.Errorf("Expected clientIdentity to be %q, got %q", expected, clientString)
+ }
+}
diff --git a/wire/messages2.go b/wire/messages2.go
new file mode 100644
index 000000000..acbd9e0d5
--- /dev/null
+++ b/wire/messages2.go
@@ -0,0 +1,199 @@
+package wire
+
+import (
+ "bytes"
+ "errors"
+ "fmt"
+ "net"
+ "time"
+
+ "github.com/ethereum/go-ethereum/ethutil"
+)
+
+// The connection object allows you to set up a connection to the Ethereum network.
+// The Connection object takes care of all encoding and sending objects properly over
+// the network.
+type Connection struct {
+ conn net.Conn
+ nTimeout time.Duration
+ pendingMessages Messages
+}
+
+// Create a new connection to the Ethereum network
+func New(conn net.Conn) *Connection {
+ return &Connection{conn: conn, nTimeout: 500}
+}
+
+// Read, reads from the network. It will block until the next message is received.
+func (self *Connection) Read() *Msg {
+ if len(self.pendingMessages) == 0 {
+ self.readMessages()
+ }
+
+ ret := self.pendingMessages[0]
+ self.pendingMessages = self.pendingMessages[1:]
+
+ return ret
+
+}
+
+// Write to the Ethereum network specifying the type of the message and
+// the data. Data can be of type RlpEncodable or []interface{}. Returns
+// nil or if something went wrong an error.
+func (self *Connection) Write(typ MsgType, v ...interface{}) error {
+ var pack []byte
+
+ slice := [][]interface{}{[]interface{}{byte(typ)}}
+ for _, value := range v {
+ if encodable, ok := value.(ethutil.RlpEncodeDecode); ok {
+ slice = append(slice, encodable.RlpValue())
+ } else if raw, ok := value.([]interface{}); ok {
+ slice = append(slice, raw)
+ } else {
+ panic(fmt.Sprintf("Unable to 'write' object of type %T", value))
+ }
+ }
+
+ // Encode the type and the (RLP encoded) data for sending over the wire
+ encoded := ethutil.NewValue(slice).Encode()
+ payloadLength := ethutil.NumberToBytes(uint32(len(encoded)), 32)
+
+ // Write magic token and payload length (first 8 bytes)
+ pack = append(MagicToken, payloadLength...)
+ pack = append(pack, encoded...)
+
+ // Write to the connection
+ _, err := self.conn.Write(pack)
+ if err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func (self *Connection) readMessage(data []byte) (msg *Msg, remaining []byte, done bool, err error) {
+ if len(data) == 0 {
+ return nil, nil, true, nil
+ }
+
+ if len(data) <= 8 {
+ return nil, remaining, false, errors.New("Invalid message")
+ }
+
+ // Check if the received 4 first bytes are the magic token
+ if bytes.Compare(MagicToken, data[:4]) != 0 {
+ return nil, nil, false, fmt.Errorf("MagicToken mismatch. Received %v", data[:4])
+ }
+
+ messageLength := ethutil.BytesToNumber(data[4:8])
+ remaining = data[8+messageLength:]
+ if int(messageLength) > len(data[8:]) {
+ return nil, nil, false, fmt.Errorf("message length %d, expected %d", len(data[8:]), messageLength)
+ }
+
+ message := data[8 : 8+messageLength]
+ decoder := ethutil.NewValueFromBytes(message)
+ // Type of message
+ t := decoder.Get(0).Uint()
+ // Actual data
+ d := decoder.SliceFrom(1)
+
+ msg = &Msg{
+ Type: MsgType(t),
+ Data: d,
+ }
+
+ return
+}
+
+// The basic message reader waits for data on the given connection, decoding
+// and doing a few sanity checks such as if there's a data type and
+// unmarhals the given data
+func (self *Connection) readMessages() (err error) {
+ // The recovering function in case anything goes horribly wrong
+ defer func() {
+ if r := recover(); r != nil {
+ err = fmt.Errorf("wire.ReadMessage error: %v", r)
+ }
+ }()
+
+ // Buff for writing network message to
+ //buff := make([]byte, 1440)
+ var buff []byte
+ var totalBytes int
+ for {
+ // Give buffering some time
+ self.conn.SetReadDeadline(time.Now().Add(self.nTimeout * time.Millisecond))
+ // Create a new temporarily buffer
+ b := make([]byte, 1440)
+ // Wait for a message from this peer
+ n, _ := self.conn.Read(b)
+ if err != nil && n == 0 {
+ if err.Error() != "EOF" {
+ fmt.Println("err now", err)
+ return err
+ } else {
+ break
+ }
+
+ // Messages can't be empty
+ } else if n == 0 {
+ break
+ }
+
+ buff = append(buff, b[:n]...)
+ totalBytes += n
+ }
+
+ // Reslice buffer
+ buff = buff[:totalBytes]
+ msg, remaining, done, err := self.readMessage(buff)
+ for ; done != true; msg, remaining, done, err = self.readMessage(remaining) {
+ //log.Println("rx", msg)
+
+ if msg != nil {
+ self.pendingMessages = append(self.pendingMessages, msg)
+ }
+ }
+
+ return
+}
+
+func ReadMessage(data []byte) (msg *Msg, remaining []byte, done bool, err error) {
+ if len(data) == 0 {
+ return nil, nil, true, nil
+ }
+
+ if len(data) <= 8 {
+ return nil, remaining, false, errors.New("Invalid message")
+ }
+
+ // Check if the received 4 first bytes are the magic token
+ if bytes.Compare(MagicToken, data[:4]) != 0 {
+ return nil, nil, false, fmt.Errorf("MagicToken mismatch. Received %v", data[:4])
+ }
+
+ messageLength := ethutil.BytesToNumber(data[4:8])
+ remaining = data[8+messageLength:]
+ if int(messageLength) > len(data[8:]) {
+ return nil, nil, false, fmt.Errorf("message length %d, expected %d", len(data[8:]), messageLength)
+ }
+
+ message := data[8 : 8+messageLength]
+ decoder := ethutil.NewValueFromBytes(message)
+ // Type of message
+ t := decoder.Get(0).Uint()
+ // Actual data
+ d := decoder.SliceFrom(1)
+
+ msg = &Msg{
+ Type: MsgType(t),
+ Data: d,
+ }
+
+ return
+}
+
+func bufferedRead(conn net.Conn) ([]byte, error) {
+ return nil, nil
+}
diff --git a/wire/messaging.go b/wire/messaging.go
new file mode 100644
index 000000000..9c6cb5944
--- /dev/null
+++ b/wire/messaging.go
@@ -0,0 +1,178 @@
+// Package wire provides low level access to the Ethereum network and allows
+// you to broadcast data over the network.
+package wire
+
+import (
+ "bytes"
+ "fmt"
+ "net"
+ "time"
+
+ "github.com/ethereum/go-ethereum/ethutil"
+)
+
+// Connection interface describing the methods required to implement the wire protocol.
+type Conn interface {
+ Write(typ MsgType, v ...interface{}) error
+ Read() *Msg
+}
+
+// The magic token which should be the first 4 bytes of every message and can be used as separator between messages.
+var MagicToken = []byte{34, 64, 8, 145}
+
+type MsgType byte
+
+const (
+ // Values are given explicitly instead of by iota because these values are
+ // defined by the wire protocol spec; it is easier for humans to ensure
+ // correctness when values are explicit.
+ MsgHandshakeTy = 0x00
+ MsgDiscTy = 0x01
+ MsgPingTy = 0x02
+ MsgPongTy = 0x03
+ MsgGetPeersTy = 0x04
+ MsgPeersTy = 0x05
+
+ MsgStatusTy = 0x10
+ MsgTxTy = 0x12
+ MsgGetBlockHashesTy = 0x13
+ MsgBlockHashesTy = 0x14
+ MsgGetBlocksTy = 0x15
+ MsgBlockTy = 0x16
+ MsgNewBlockTy = 0x17
+)
+
+var msgTypeToString = map[MsgType]string{
+ MsgHandshakeTy: "Handshake",
+ MsgDiscTy: "Disconnect",
+ MsgPingTy: "Ping",
+ MsgPongTy: "Pong",
+ MsgGetPeersTy: "Get peers",
+ MsgStatusTy: "Status",
+ MsgPeersTy: "Peers",
+ MsgTxTy: "Transactions",
+ MsgBlockTy: "Blocks",
+ //MsgGetTxsTy: "Get Txs",
+ MsgGetBlockHashesTy: "Get block hashes",
+ MsgBlockHashesTy: "Block hashes",
+ MsgGetBlocksTy: "Get blocks",
+}
+
+func (mt MsgType) String() string {
+ return msgTypeToString[mt]
+}
+
+type Msg struct {
+ Type MsgType // Specifies how the encoded data should be interpreted
+ //Data []byte
+ Data *ethutil.Value
+}
+
+func NewMessage(msgType MsgType, data interface{}) *Msg {
+ return &Msg{
+ Type: msgType,
+ Data: ethutil.NewValue(data),
+ }
+}
+
+type Messages []*Msg
+
+// The basic message reader waits for data on the given connection, decoding
+// and doing a few sanity checks such as if there's a data type and
+// unmarhals the given data
+func ReadMessages(conn net.Conn) (msgs []*Msg, err error) {
+ // The recovering function in case anything goes horribly wrong
+ defer func() {
+ if r := recover(); r != nil {
+ err = fmt.Errorf("wire.ReadMessage error: %v", r)
+ }
+ }()
+
+ var (
+ buff []byte
+ messages [][]byte
+ msgLength int
+ )
+
+ for {
+ // Give buffering some time
+ conn.SetReadDeadline(time.Now().Add(5 * time.Millisecond))
+ // Create a new temporarily buffer
+ b := make([]byte, 1440)
+ n, _ := conn.Read(b)
+ if err != nil && n == 0 {
+ if err.Error() != "EOF" {
+ fmt.Println("err now", err)
+ return nil, err
+ } else {
+ break
+ }
+ }
+
+ if n == 0 && len(buff) == 0 {
+ // If there's nothing on the wire wait for a bit
+ time.Sleep(200 * time.Millisecond)
+
+ continue
+ }
+
+ buff = append(buff, b[:n]...)
+ if msgLength == 0 {
+ // Check if the received 4 first bytes are the magic token
+ if bytes.Compare(MagicToken, buff[:4]) != 0 {
+ return nil, fmt.Errorf("MagicToken mismatch. Received %v", buff[:4])
+ }
+
+ // Read the length of the message
+ msgLength = int(ethutil.BytesToNumber(buff[4:8]))
+
+ // Remove the token and length
+ buff = buff[8:]
+ }
+
+ if len(buff) >= msgLength {
+ messages = append(messages, buff[:msgLength])
+ buff = buff[msgLength:]
+ msgLength = 0
+
+ if len(buff) == 0 {
+ break
+ }
+ }
+ }
+
+ for _, m := range messages {
+ decoder := ethutil.NewValueFromBytes(m)
+ // Type of message
+ t := decoder.Get(0).Uint()
+ // Actual data
+ d := decoder.SliceFrom(1)
+
+ msgs = append(msgs, &Msg{Type: MsgType(t), Data: d})
+ }
+
+ return
+}
+
+// The basic message writer takes care of writing data over the given
+// connection and does some basic error checking
+func WriteMessage(conn net.Conn, msg *Msg) error {
+ var pack []byte
+
+ // Encode the type and the (RLP encoded) data for sending over the wire
+ encoded := ethutil.NewValue(append([]interface{}{byte(msg.Type)}, msg.Data.Slice()...)).Encode()
+ payloadLength := ethutil.NumberToBytes(uint32(len(encoded)), 32)
+
+ // Write magic token and payload length (first 8 bytes)
+ pack = append(MagicToken, payloadLength...)
+ pack = append(pack, encoded...)
+ //fmt.Printf("payload %v (%v) %q\n", msg.Type, conn.RemoteAddr(), encoded)
+
+ // Write to the connection
+ _, err := conn.Write(pack)
+ if err != nil {
+ return err
+ }
+
+ return nil
+}
diff --git a/xeth/config.go b/xeth/config.go
new file mode 100644
index 000000000..ad0660d75
--- /dev/null
+++ b/xeth/config.go
@@ -0,0 +1,35 @@
+package xeth
+
+import "github.com/ethereum/go-ethereum/ethutil"
+
+var cnfCtr = ethutil.Hex2Bytes("661005d2720d855f1d9976f88bb10c1a3398c77f")
+
+type Config struct {
+ pipe *XEth
+}
+
+func (self *Config) Get(name string) *Object {
+ configCtrl := self.pipe.World().safeGet(cnfCtr)
+ var addr []byte
+
+ switch name {
+ case "NameReg":
+ addr = []byte{0}
+ case "DnsReg":
+ objectAddr := configCtrl.GetStorage(ethutil.BigD([]byte{0}))
+ domainAddr := (&Object{self.pipe.World().safeGet(objectAddr.Bytes())}).StorageString("DnsReg").Bytes()
+ return &Object{self.pipe.World().safeGet(domainAddr)}
+ case "MergeMining":
+ addr = []byte{4}
+ default:
+ addr = ethutil.RightPadBytes([]byte(name), 32)
+ }
+
+ objectAddr := configCtrl.GetStorage(ethutil.BigD(addr))
+
+ return &Object{self.pipe.World().safeGet(objectAddr.Bytes())}
+}
+
+func (self *Config) Exist() bool {
+ return self.pipe.World().Get(cnfCtr) != nil
+}
diff --git a/xeth/hexface.go b/xeth/hexface.go
new file mode 100644
index 000000000..bfd2dddd9
--- /dev/null
+++ b/xeth/hexface.go
@@ -0,0 +1,255 @@
+package xeth
+
+import (
+ "bytes"
+ "encoding/json"
+ "sync/atomic"
+
+ "github.com/ethereum/go-ethereum/core"
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/state"
+)
+
+type JSXEth struct {
+ *XEth
+}
+
+func NewJSXEth(eth core.EthManager) *JSXEth {
+ return &JSXEth{New(eth)}
+}
+
+func (self *JSXEth) BlockByHash(strHash string) *JSBlock {
+ hash := ethutil.Hex2Bytes(strHash)
+ block := self.obj.ChainManager().GetBlock(hash)
+
+ return NewJSBlock(block)
+}
+
+func (self *JSXEth) BlockByNumber(num int32) *JSBlock {
+ if num == -1 {
+ return NewJSBlock(self.obj.ChainManager().CurrentBlock())
+ }
+
+ return NewJSBlock(self.obj.ChainManager().GetBlockByNumber(uint64(num)))
+}
+
+func (self *JSXEth) Block(v interface{}) *JSBlock {
+ if n, ok := v.(int32); ok {
+ return self.BlockByNumber(n)
+ } else if str, ok := v.(string); ok {
+ return self.BlockByHash(str)
+ } else if f, ok := v.(float64); ok { // Don't ask ...
+ return self.BlockByNumber(int32(f))
+ }
+
+ return nil
+}
+
+func (self *JSXEth) Key() *JSKey {
+ return NewJSKey(self.obj.KeyManager().KeyPair())
+}
+
+func (self *JSXEth) StateObject(addr string) *JSObject {
+ object := &Object{self.World().safeGet(ethutil.Hex2Bytes(addr))}
+
+ return NewJSObject(object)
+}
+
+func (self *JSXEth) PeerCount() int {
+ return self.obj.PeerCount()
+}
+
+func (self *JSXEth) Peers() []JSPeer {
+ var peers []JSPeer
+ for peer := self.obj.Peers().Front(); peer != nil; peer = peer.Next() {
+ p := peer.Value.(core.Peer)
+ // we only want connected peers
+ if atomic.LoadInt32(p.Connected()) != 0 {
+ peers = append(peers, *NewJSPeer(p))
+ }
+ }
+
+ return peers
+}
+
+func (self *JSXEth) IsMining() bool {
+ return self.obj.IsMining()
+}
+
+func (self *JSXEth) IsListening() bool {
+ return self.obj.IsListening()
+}
+
+func (self *JSXEth) CoinBase() string {
+ return ethutil.Bytes2Hex(self.obj.KeyManager().Address())
+}
+
+func (self *JSXEth) NumberToHuman(balance string) string {
+ b := ethutil.Big(balance)
+
+ return ethutil.CurrencyToString(b)
+}
+
+func (self *JSXEth) StorageAt(addr, storageAddr string) string {
+ storage := self.World().SafeGet(ethutil.Hex2Bytes(addr)).Storage(ethutil.Hex2Bytes(storageAddr))
+
+ return ethutil.Bytes2Hex(storage.Bytes())
+}
+
+func (self *JSXEth) BalanceAt(addr string) string {
+ return self.World().SafeGet(ethutil.Hex2Bytes(addr)).Balance().String()
+}
+
+func (self *JSXEth) TxCountAt(address string) int {
+ return int(self.World().SafeGet(ethutil.Hex2Bytes(address)).Nonce)
+}
+
+func (self *JSXEth) CodeAt(address string) string {
+ return ethutil.Bytes2Hex(self.World().SafeGet(ethutil.Hex2Bytes(address)).Code)
+}
+
+func (self *JSXEth) IsContract(address string) bool {
+ return len(self.World().SafeGet(ethutil.Hex2Bytes(address)).Code) > 0
+}
+
+func (self *JSXEth) SecretToAddress(key string) string {
+ pair, err := crypto.NewKeyPairFromSec(ethutil.Hex2Bytes(key))
+ if err != nil {
+ return ""
+ }
+
+ return ethutil.Bytes2Hex(pair.Address())
+}
+
+func (self *JSXEth) Execute(addr, value, gas, price, data string) (string, error) {
+ ret, err := self.ExecuteObject(&Object{
+ self.World().safeGet(ethutil.Hex2Bytes(addr))},
+ ethutil.Hex2Bytes(data),
+ ethutil.NewValue(value),
+ ethutil.NewValue(gas),
+ ethutil.NewValue(price),
+ )
+
+ return ethutil.Bytes2Hex(ret), err
+}
+
+type KeyVal struct {
+ Key string `json:"key"`
+ Value string `json:"value"`
+}
+
+func (self *JSXEth) EachStorage(addr string) string {
+ var values []KeyVal
+ object := self.World().SafeGet(ethutil.Hex2Bytes(addr))
+ object.EachStorage(func(name string, value *ethutil.Value) {
+ value.Decode()
+ values = append(values, KeyVal{ethutil.Bytes2Hex([]byte(name)), ethutil.Bytes2Hex(value.Bytes())})
+ })
+
+ valuesJson, err := json.Marshal(values)
+ if err != nil {
+ return ""
+ }
+
+ return string(valuesJson)
+}
+
+func (self *JSXEth) ToAscii(str string) string {
+ padded := ethutil.RightPadBytes([]byte(str), 32)
+
+ return "0x" + ethutil.Bytes2Hex(padded)
+}
+
+func (self *JSXEth) FromAscii(str string) string {
+ if ethutil.IsHex(str) {
+ str = str[2:]
+ }
+
+ return string(bytes.Trim(ethutil.Hex2Bytes(str), "\x00"))
+}
+
+func (self *JSXEth) FromNumber(str string) string {
+ if ethutil.IsHex(str) {
+ str = str[2:]
+ }
+
+ return ethutil.BigD(ethutil.Hex2Bytes(str)).String()
+}
+
+func (self *JSXEth) Transact(key, toStr, valueStr, gasStr, gasPriceStr, codeStr string) (string, error) {
+ var (
+ to []byte
+ value = ethutil.NewValue(valueStr)
+ gas = ethutil.NewValue(gasStr)
+ gasPrice = ethutil.NewValue(gasPriceStr)
+ data []byte
+ )
+
+ if ethutil.IsHex(codeStr) {
+ data = ethutil.Hex2Bytes(codeStr[2:])
+ } else {
+ data = ethutil.Hex2Bytes(codeStr)
+ }
+
+ if ethutil.IsHex(toStr) {
+ to = ethutil.Hex2Bytes(toStr[2:])
+ } else {
+ to = ethutil.Hex2Bytes(toStr)
+ }
+
+ var keyPair *crypto.KeyPair
+ var err error
+ if ethutil.IsHex(key) {
+ keyPair, err = crypto.NewKeyPairFromSec([]byte(ethutil.Hex2Bytes(key[2:])))
+ } else {
+ keyPair, err = crypto.NewKeyPairFromSec([]byte(ethutil.Hex2Bytes(key)))
+ }
+
+ if err != nil {
+ return "", err
+ }
+
+ tx, err := self.XEth.Transact(keyPair, to, value, gas, gasPrice, data)
+ if err != nil {
+ return "", err
+ }
+ if types.IsContractAddr(to) {
+ return ethutil.Bytes2Hex(core.AddressFromMessage(tx)), nil
+ }
+
+ return ethutil.Bytes2Hex(tx.Hash()), nil
+}
+
+func (self *JSXEth) PushTx(txStr string) (*JSReceipt, error) {
+ tx := types.NewTransactionFromBytes(ethutil.Hex2Bytes(txStr))
+ err := self.obj.TxPool().Add(tx)
+ if err != nil {
+ return nil, err
+ }
+
+ return NewJSReciept(core.MessageCreatesContract(tx), core.AddressFromMessage(tx), tx.Hash(), tx.From()), nil
+}
+
+func (self *JSXEth) CompileMutan(code string) string {
+ data, err := self.XEth.CompileMutan(code)
+ if err != nil {
+ return err.Error()
+ }
+
+ return ethutil.Bytes2Hex(data)
+}
+
+func (self *JSXEth) FindInConfig(str string) string {
+ return ethutil.Bytes2Hex(self.World().Config().Get(str).Address())
+}
+
+func ToJSMessages(messages state.Messages) *ethutil.List {
+ var msgs []JSMessage
+ for _, m := range messages {
+ msgs = append(msgs, NewJSMessage(m))
+ }
+
+ return ethutil.NewList(msgs)
+}
diff --git a/xeth/js_types.go b/xeth/js_types.go
new file mode 100644
index 000000000..62867d6a9
--- /dev/null
+++ b/xeth/js_types.go
@@ -0,0 +1,236 @@
+package xeth
+
+import (
+ "fmt"
+ "strconv"
+ "strings"
+
+ "github.com/ethereum/go-ethereum/core"
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/state"
+)
+
+// Block interface exposed to QML
+type JSBlock struct {
+ //Transactions string `json:"transactions"`
+ ref *types.Block
+ Size string `json:"size"`
+ Number int `json:"number"`
+ Hash string `json:"hash"`
+ Transactions *ethutil.List `json:"transactions"`
+ Uncles *ethutil.List `json:"uncles"`
+ Time int64 `json:"time"`
+ Coinbase string `json:"coinbase"`
+ Name string `json:"name"`
+ GasLimit string `json:"gasLimit"`
+ GasUsed string `json:"gasUsed"`
+ PrevHash string `json:"prevHash"`
+ Bloom string `json:"bloom"`
+ Raw string `json:"raw"`
+}
+
+// Creates a new QML Block from a chain block
+func NewJSBlock(block *types.Block) *JSBlock {
+ if block == nil {
+ return &JSBlock{}
+ }
+
+ ptxs := make([]*JSTransaction, len(block.Transactions()))
+ for i, tx := range block.Transactions() {
+ ptxs[i] = NewJSTx(tx, block.State())
+ }
+ txlist := ethutil.NewList(ptxs)
+
+ puncles := make([]*JSBlock, len(block.Uncles))
+ for i, uncle := range block.Uncles {
+ puncles[i] = NewJSBlock(uncle)
+ }
+ ulist := ethutil.NewList(puncles)
+
+ return &JSBlock{
+ ref: block, Size: block.Size().String(),
+ Number: int(block.Number.Uint64()), GasUsed: block.GasUsed.String(),
+ GasLimit: block.GasLimit.String(), Hash: ethutil.Bytes2Hex(block.Hash()),
+ Transactions: txlist, Uncles: ulist,
+ Time: block.Time,
+ Coinbase: ethutil.Bytes2Hex(block.Coinbase),
+ PrevHash: ethutil.Bytes2Hex(block.PrevHash),
+ Bloom: ethutil.Bytes2Hex(block.LogsBloom),
+ Raw: block.String(),
+ }
+}
+
+func (self *JSBlock) ToString() string {
+ if self.ref != nil {
+ return self.ref.String()
+ }
+
+ return ""
+}
+
+func (self *JSBlock) GetTransaction(hash string) *JSTransaction {
+ tx := self.ref.GetTransaction(ethutil.Hex2Bytes(hash))
+ if tx == nil {
+ return nil
+ }
+
+ return NewJSTx(tx, self.ref.State())
+}
+
+type JSTransaction struct {
+ ref *types.Transaction
+
+ Value string `json:"value"`
+ Gas string `json:"gas"`
+ GasPrice string `json:"gasPrice"`
+ Hash string `json:"hash"`
+ Address string `json:"address"`
+ Sender string `json:"sender"`
+ RawData string `json:"rawData"`
+ Data string `json:"data"`
+ Contract bool `json:"isContract"`
+ CreatesContract bool `json:"createsContract"`
+ Confirmations int `json:"confirmations"`
+}
+
+func NewJSTx(tx *types.Transaction, state *state.StateDB) *JSTransaction {
+ hash := ethutil.Bytes2Hex(tx.Hash())
+ receiver := ethutil.Bytes2Hex(tx.To())
+ if receiver == "0000000000000000000000000000000000000000" {
+ receiver = ethutil.Bytes2Hex(core.AddressFromMessage(tx))
+ }
+ sender := ethutil.Bytes2Hex(tx.Sender())
+ createsContract := core.MessageCreatesContract(tx)
+
+ var data string
+ if createsContract {
+ data = strings.Join(core.Disassemble(tx.Data()), "\n")
+ } else {
+ data = ethutil.Bytes2Hex(tx.Data())
+ }
+
+ return &JSTransaction{ref: tx, Hash: hash, Value: ethutil.CurrencyToString(tx.Value()), Address: receiver, Contract: createsContract, Gas: tx.Gas().String(), GasPrice: tx.GasPrice().String(), Data: data, Sender: sender, CreatesContract: createsContract, RawData: ethutil.Bytes2Hex(tx.Data())}
+}
+
+func (self *JSTransaction) ToString() string {
+ return self.ref.String()
+}
+
+type JSKey struct {
+ Address string `json:"address"`
+ PrivateKey string `json:"privateKey"`
+ PublicKey string `json:"publicKey"`
+}
+
+func NewJSKey(key *crypto.KeyPair) *JSKey {
+ return &JSKey{ethutil.Bytes2Hex(key.Address()), ethutil.Bytes2Hex(key.PrivateKey), ethutil.Bytes2Hex(key.PublicKey)}
+}
+
+type JSObject struct {
+ *Object
+}
+
+func NewJSObject(object *Object) *JSObject {
+ return &JSObject{object}
+}
+
+type PReceipt struct {
+ CreatedContract bool `json:"createdContract"`
+ Address string `json:"address"`
+ Hash string `json:"hash"`
+ Sender string `json:"sender"`
+}
+
+func NewPReciept(contractCreation bool, creationAddress, hash, address []byte) *PReceipt {
+ return &PReceipt{
+ contractCreation,
+ ethutil.Bytes2Hex(creationAddress),
+ ethutil.Bytes2Hex(hash),
+ ethutil.Bytes2Hex(address),
+ }
+}
+
+// Peer interface exposed to QML
+
+type JSPeer struct {
+ ref *core.Peer
+ Inbound bool `json:"isInbound"`
+ LastSend int64 `json:"lastSend"`
+ LastPong int64 `json:"lastPong"`
+ Ip string `json:"ip"`
+ Port int `json:"port"`
+ Version string `json:"version"`
+ LastResponse string `json:"lastResponse"`
+ Latency string `json:"latency"`
+ Caps string `json:"caps"`
+}
+
+func NewJSPeer(peer core.Peer) *JSPeer {
+ if peer == nil {
+ return nil
+ }
+
+ var ip []string
+ for _, i := range peer.Host() {
+ ip = append(ip, strconv.Itoa(int(i)))
+ }
+ ipAddress := strings.Join(ip, ".")
+
+ var caps []string
+ capsIt := peer.Caps().NewIterator()
+ for capsIt.Next() {
+ cap := capsIt.Value().Get(0).Str()
+ ver := capsIt.Value().Get(1).Uint()
+ caps = append(caps, fmt.Sprintf("%s/%d", cap, ver))
+ }
+
+ return &JSPeer{ref: &peer, Inbound: peer.Inbound(), LastSend: peer.LastSend().Unix(), LastPong: peer.LastPong(), Version: peer.Version(), Ip: ipAddress, Port: int(peer.Port()), Latency: peer.PingTime(), Caps: "[" + strings.Join(caps, ", ") + "]"}
+}
+
+type JSReceipt struct {
+ CreatedContract bool `json:"createdContract"`
+ Address string `json:"address"`
+ Hash string `json:"hash"`
+ Sender string `json:"sender"`
+}
+
+func NewJSReciept(contractCreation bool, creationAddress, hash, address []byte) *JSReceipt {
+ return &JSReceipt{
+ contractCreation,
+ ethutil.Bytes2Hex(creationAddress),
+ ethutil.Bytes2Hex(hash),
+ ethutil.Bytes2Hex(address),
+ }
+}
+
+type JSMessage struct {
+ To string `json:"to"`
+ From string `json:"from"`
+ Input string `json:"input"`
+ Output string `json:"output"`
+ Path int32 `json:"path"`
+ Origin string `json:"origin"`
+ Timestamp int32 `json:"timestamp"`
+ Coinbase string `json:"coinbase"`
+ Block string `json:"block"`
+ Number int32 `json:"number"`
+ Value string `json:"value"`
+}
+
+func NewJSMessage(message *state.Message) JSMessage {
+ return JSMessage{
+ To: ethutil.Bytes2Hex(message.To),
+ From: ethutil.Bytes2Hex(message.From),
+ Input: ethutil.Bytes2Hex(message.Input),
+ Output: ethutil.Bytes2Hex(message.Output),
+ Path: int32(message.Path),
+ Origin: ethutil.Bytes2Hex(message.Origin),
+ Timestamp: int32(message.Timestamp),
+ Coinbase: ethutil.Bytes2Hex(message.Origin),
+ Block: ethutil.Bytes2Hex(message.Block),
+ Number: int32(message.Number.Int64()),
+ Value: message.Value.String(),
+ }
+}
diff --git a/xeth/object.go b/xeth/object.go
new file mode 100644
index 000000000..a4ac41e89
--- /dev/null
+++ b/xeth/object.go
@@ -0,0 +1,26 @@
+package xeth
+
+import (
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/state"
+)
+
+type Object struct {
+ *state.StateObject
+}
+
+func (self *Object) StorageString(str string) *ethutil.Value {
+ if ethutil.IsHex(str) {
+ return self.Storage(ethutil.Hex2Bytes(str[2:]))
+ } else {
+ return self.Storage(ethutil.RightPadBytes([]byte(str), 32))
+ }
+}
+
+func (self *Object) StorageValue(addr *ethutil.Value) *ethutil.Value {
+ return self.Storage(addr.Bytes())
+}
+
+func (self *Object) Storage(addr []byte) *ethutil.Value {
+ return self.StateObject.GetStorage(ethutil.BigD(addr))
+}
diff --git a/xeth/pipe.go b/xeth/pipe.go
new file mode 100644
index 000000000..06820cc86
--- /dev/null
+++ b/xeth/pipe.go
@@ -0,0 +1,181 @@
+package xeth
+
+/*
+ * eXtended ETHereum
+ */
+
+import (
+ "github.com/ethereum/go-ethereum/core"
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/logger"
+ "github.com/ethereum/go-ethereum/state"
+)
+
+var pipelogger = logger.NewLogger("XETH")
+
+type VmVars struct {
+ State *state.StateDB
+}
+
+type XEth struct {
+ obj core.EthManager
+ blockManager *core.BlockManager
+ chainManager *core.ChainManager
+ world *World
+
+ Vm VmVars
+}
+
+func New(obj core.EthManager) *XEth {
+ pipe := &XEth{
+ obj: obj,
+ blockManager: obj.BlockManager(),
+ chainManager: obj.ChainManager(),
+ }
+ pipe.world = NewWorld(pipe)
+
+ return pipe
+}
+
+/*
+ * State / Account accessors
+ */
+func (self *XEth) Balance(addr []byte) *ethutil.Value {
+ return ethutil.NewValue(self.World().safeGet(addr).Balance)
+}
+
+func (self *XEth) Nonce(addr []byte) uint64 {
+ return self.World().safeGet(addr).Nonce
+}
+
+func (self *XEth) Block(hash []byte) *types.Block {
+ return self.chainManager.GetBlock(hash)
+}
+
+func (self *XEth) Storage(addr, storageAddr []byte) *ethutil.Value {
+ return self.World().safeGet(addr).GetStorage(ethutil.BigD(storageAddr))
+}
+
+func (self *XEth) Exists(addr []byte) bool {
+ return self.World().Get(addr) != nil
+}
+
+// Converts the given private key to an address
+func (self *XEth) ToAddress(priv []byte) []byte {
+ pair, err := crypto.NewKeyPairFromSec(priv)
+ if err != nil {
+ return nil
+ }
+
+ return pair.Address()
+}
+
+/*
+ * Execution helpers
+ */
+func (self *XEth) Execute(addr []byte, data []byte, value, gas, price *ethutil.Value) ([]byte, error) {
+ return self.ExecuteObject(&Object{self.World().safeGet(addr)}, data, value, gas, price)
+}
+
+func (self *XEth) ExecuteObject(object *Object, data []byte, value, gas, price *ethutil.Value) ([]byte, error) {
+ var (
+ initiator = state.NewStateObject(self.obj.KeyManager().KeyPair().Address())
+ block = self.chainManager.CurrentBlock()
+ )
+
+ self.Vm.State = self.World().State().Copy()
+
+ vmenv := NewEnv(self.Vm.State, block, value.BigInt(), initiator.Address())
+ return vmenv.Call(initiator, object.Address(), data, gas.BigInt(), price.BigInt(), value.BigInt())
+}
+
+/*
+ * Transactional methods
+ */
+func (self *XEth) TransactString(key *crypto.KeyPair, rec string, value, gas, price *ethutil.Value, data []byte) (*types.Transaction, error) {
+ // Check if an address is stored by this address
+ var hash []byte
+ addr := self.World().Config().Get("NameReg").StorageString(rec).Bytes()
+ if len(addr) > 0 {
+ hash = addr
+ } else if ethutil.IsHex(rec) {
+ hash = ethutil.Hex2Bytes(rec[2:])
+ } else {
+ hash = ethutil.Hex2Bytes(rec)
+ }
+
+ return self.Transact(key, hash, value, gas, price, data)
+}
+
+func (self *XEth) Transact(key *crypto.KeyPair, to []byte, value, gas, price *ethutil.Value, data []byte) (*types.Transaction, error) {
+ var hash []byte
+ var contractCreation bool
+ if types.IsContractAddr(to) {
+ contractCreation = true
+ } else {
+ // Check if an address is stored by this address
+ addr := self.World().Config().Get("NameReg").Storage(to).Bytes()
+ if len(addr) > 0 {
+ hash = addr
+ } else {
+ hash = to
+ }
+ }
+
+ var tx *types.Transaction
+ if contractCreation {
+ tx = types.NewContractCreationTx(value.BigInt(), gas.BigInt(), price.BigInt(), data)
+ } else {
+ tx = types.NewTransactionMessage(hash, value.BigInt(), gas.BigInt(), price.BigInt(), data)
+ }
+
+ state := self.chainManager.TransState()
+ nonce := state.GetNonce(key.Address())
+
+ tx.SetNonce(nonce)
+ tx.Sign(key.PrivateKey)
+
+ // Do some pre processing for our "pre" events and hooks
+ block := self.chainManager.NewBlock(key.Address())
+ coinbase := state.GetStateObject(key.Address())
+ coinbase.SetGasPool(block.GasLimit)
+ self.blockManager.ApplyTransactions(coinbase, state, block, types.Transactions{tx}, true)
+
+ err := self.obj.TxPool().Add(tx)
+ if err != nil {
+ return nil, err
+ }
+ state.SetNonce(key.Address(), nonce+1)
+
+ if contractCreation {
+ addr := core.AddressFromMessage(tx)
+ pipelogger.Infof("Contract addr %x\n", addr)
+ }
+
+ return tx, nil
+}
+
+func (self *XEth) PushTx(tx *types.Transaction) ([]byte, error) {
+ err := self.obj.TxPool().Add(tx)
+ if err != nil {
+ return nil, err
+ }
+
+ if tx.To() == nil {
+ addr := core.AddressFromMessage(tx)
+ pipelogger.Infof("Contract addr %x\n", addr)
+ return addr, nil
+ }
+ return tx.Hash(), nil
+}
+
+func (self *XEth) CompileMutan(code string) ([]byte, error) {
+ data, err := ethutil.Compile(code, false)
+ if err != nil {
+ return nil, err
+ }
+
+ return data, nil
+}
diff --git a/xeth/vm_env.go b/xeth/vm_env.go
new file mode 100644
index 000000000..7fb674a94
--- /dev/null
+++ b/xeth/vm_env.go
@@ -0,0 +1,65 @@
+package xeth
+
+import (
+ "math/big"
+
+ "github.com/ethereum/go-ethereum/core"
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/state"
+ "github.com/ethereum/go-ethereum/vm"
+)
+
+type VMEnv struct {
+ state *state.StateDB
+ block *types.Block
+ value *big.Int
+ sender []byte
+
+ depth int
+}
+
+func NewEnv(state *state.StateDB, block *types.Block, value *big.Int, sender []byte) *VMEnv {
+ return &VMEnv{
+ state: state,
+ block: block,
+ value: value,
+ sender: sender,
+ }
+}
+
+func (self *VMEnv) Origin() []byte { return self.sender }
+func (self *VMEnv) BlockNumber() *big.Int { return self.block.Number }
+func (self *VMEnv) PrevHash() []byte { return self.block.PrevHash }
+func (self *VMEnv) Coinbase() []byte { return self.block.Coinbase }
+func (self *VMEnv) Time() int64 { return self.block.Time }
+func (self *VMEnv) Difficulty() *big.Int { return self.block.Difficulty }
+func (self *VMEnv) BlockHash() []byte { return self.block.Hash() }
+func (self *VMEnv) Value() *big.Int { return self.value }
+func (self *VMEnv) State() *state.StateDB { return self.state }
+func (self *VMEnv) GasLimit() *big.Int { return self.block.GasLimit }
+func (self *VMEnv) Depth() int { return self.depth }
+func (self *VMEnv) SetDepth(i int) { self.depth = i }
+func (self *VMEnv) AddLog(log state.Log) {
+ self.state.AddLog(log)
+}
+func (self *VMEnv) Transfer(from, to vm.Account, amount *big.Int) error {
+ return vm.Transfer(from, to, amount)
+}
+
+func (self *VMEnv) vm(addr, data []byte, gas, price, value *big.Int) *core.Execution {
+ return core.NewExecution(self, addr, data, gas, price, value)
+}
+
+func (self *VMEnv) Call(me vm.ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error) {
+ exe := self.vm(addr, data, gas, price, value)
+ return exe.Call(addr, me)
+}
+func (self *VMEnv) CallCode(me vm.ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error) {
+ exe := self.vm(me.Address(), data, gas, price, value)
+ return exe.Call(addr, me)
+}
+
+func (self *VMEnv) Create(me vm.ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error, vm.ClosureRef) {
+ exe := self.vm(addr, data, gas, price, value)
+ return exe.Create(me)
+}
diff --git a/xeth/world.go b/xeth/world.go
new file mode 100644
index 000000000..956ef1e15
--- /dev/null
+++ b/xeth/world.go
@@ -0,0 +1,64 @@
+package xeth
+
+import (
+ "container/list"
+
+ "github.com/ethereum/go-ethereum/state"
+)
+
+type World struct {
+ pipe *XEth
+ cfg *Config
+}
+
+func NewWorld(pipe *XEth) *World {
+ world := &World{pipe, nil}
+ world.cfg = &Config{pipe}
+
+ return world
+}
+
+func (self *XEth) World() *World {
+ return self.world
+}
+
+func (self *World) State() *state.StateDB {
+ return self.pipe.chainManager.State()
+}
+
+func (self *World) Get(addr []byte) *Object {
+ return &Object{self.State().GetStateObject(addr)}
+}
+
+func (self *World) SafeGet(addr []byte) *Object {
+ return &Object{self.safeGet(addr)}
+}
+
+func (self *World) safeGet(addr []byte) *state.StateObject {
+ object := self.State().GetStateObject(addr)
+ if object == nil {
+ object = state.NewStateObject(addr)
+ }
+
+ return object
+}
+
+func (self *World) Coinbase() *state.StateObject {
+ return nil
+}
+
+func (self *World) IsMining() bool {
+ return self.pipe.obj.IsMining()
+}
+
+func (self *World) IsListening() bool {
+ return self.pipe.obj.IsListening()
+}
+
+func (self *World) Peers() *list.List {
+ return self.pipe.obj.Peers()
+}
+
+func (self *World) Config() *Config {
+ return self.cfg
+}