diff --git a/bzz/hive.go b/bzz/hive.go index 98033351e5..dbe47544d0 100644 --- a/bzz/hive.go +++ b/bzz/hive.go @@ -48,18 +48,23 @@ func (self *hive) start(address kademlia.Address, connectPeer func(string) error err = nil } go func() { + // whenever pinged ask kademlia about most preferred peer for _ = range self.ping { node, full := self.kad.GetNodeRecord() if node != nil { + // if Url known, connect to peer if len(node.Url) > 0 { + dpaLogger.Debugf("hive: attempt to connect kaddb node %v", node) connectPeer(node.Url) } else if !full { - // a random peer is taken + // a random peer is taken from the table peers := self.kad.GetNodes(kademlia.RandomAddress(), 1) if len(peers) > 0 { + // a random address at prox bin 0 is sent for lookup req := &retrieveRequestMsgData{ Key: Key(common.Hash(kademlia.RandomAddressAt(self.addr, 0)).Bytes()), } + dpaLogger.Debugf("hive: look up random address with prox order 0 from peer %v", peers[0]) peers[0].(peer).retrieve(req) } } @@ -70,6 +75,7 @@ func (self *hive) start(address kademlia.Address, connectPeer func(string) error } func (self *hive) stop() error { + // closing ping channel quits the updateloop close(self.ping) return self.kad.Stop(self.path) } diff --git a/cmd/geth/admin.go b/cmd/geth/admin.go index ebdf3512a9..abb214fc2d 100644 --- a/cmd/geth/admin.go +++ b/cmd/geth/admin.go @@ -8,6 +8,7 @@ import ( "strconv" "time" + "github.com/ethereum/ethash" "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/cmd/utils" "github.com/ethereum/go-ethereum/common" @@ -35,6 +36,7 @@ func (js *jsre) adminBindings() { eth := ethO.Object() eth.Set("pendingTransactions", js.pendingTransactions) eth.Set("resend", js.resend) + eth.Set("sign", js.sign) js.re.Set("admin", struct{}{}) t, _ := js.re.Get("admin") @@ -72,6 +74,9 @@ func (js *jsre) adminBindings() { miner.Set("hashrate", js.hashrate) miner.Set("setExtra", js.setExtra) miner.Set("setGasPrice", js.setGasPrice) + miner.Set("startAutoDAG", js.startAutoDAG) + miner.Set("stopAutoDAG", js.stopAutoDAG) + miner.Set("makeDAG", js.makeDAG) admin.Set("debug", struct{}{}) t, _ = admin.Get("debug") @@ -177,6 +182,30 @@ func (js *jsre) resend(call otto.FunctionCall) otto.Value { return otto.FalseValue() } +func (js *jsre) sign(call otto.FunctionCall) otto.Value { + if len(call.ArgumentList) != 2 { + fmt.Println("requires 2 arguments: eth.sign(signer, data)") + return otto.UndefinedValue() + } + signer, err := call.Argument(0).ToString() + if err != nil { + fmt.Println(err) + return otto.UndefinedValue() + } + + data, err := call.Argument(1).ToString() + if err != nil { + fmt.Println(err) + return otto.UndefinedValue() + } + v, err := js.xeth.Sign(signer, data, false) + if err != nil { + fmt.Println(err) + return otto.UndefinedValue() + } + return js.re.ToVal(v) +} + func (js *jsre) debugBlock(call otto.FunctionCall) otto.Value { block, err := js.getBlock(call) if err != nil { @@ -253,6 +282,30 @@ func (js *jsre) hashrate(otto.FunctionCall) otto.Value { return js.re.ToVal(js.ethereum.Miner().HashRate()) } +func (js *jsre) makeDAG(call otto.FunctionCall) otto.Value { + blockNumber, err := call.Argument(1).ToInteger() + if err != nil { + fmt.Println(err) + return otto.FalseValue() + } + + err = ethash.MakeDAG(uint64(blockNumber), "") + if err != nil { + return otto.FalseValue() + } + return otto.TrueValue() +} + +func (js *jsre) startAutoDAG(otto.FunctionCall) otto.Value { + js.ethereum.StartAutoDAG() + return otto.TrueValue() +} + +func (js *jsre) stopAutoDAG(otto.FunctionCall) otto.Value { + js.ethereum.StopAutoDAG() + return otto.TrueValue() +} + func (js *jsre) backtrace(call otto.FunctionCall) otto.Value { tracestr, err := call.Argument(0).ToString() if err != nil { @@ -291,6 +344,9 @@ func (js *jsre) startMining(call otto.FunctionCall) otto.Value { threads = int64(js.ethereum.MinerThreads) } + // switch on DAG autogeneration when miner starts + js.ethereum.StartAutoDAG() + err = js.ethereum.StartMining(int(threads)) if err != nil { fmt.Println(err) @@ -302,6 +358,7 @@ func (js *jsre) startMining(call otto.FunctionCall) otto.Value { func (js *jsre) stopMining(call otto.FunctionCall) otto.Value { js.ethereum.StopMining() + js.ethereum.StopAutoDAG() return otto.TrueValue() } @@ -383,7 +440,7 @@ func (js *jsre) unlock(call otto.FunctionCall) otto.Value { var passphrase string if arg.IsUndefined() { fmt.Println("Please enter a passphrase now.") - passphrase, err = readPassword("Passphrase: ", true) + passphrase, err = utils.PromptPassword("Passphrase: ", true) if err != nil { fmt.Println(err) return otto.FalseValue() @@ -410,12 +467,12 @@ func (js *jsre) newAccount(call otto.FunctionCall) otto.Value { if arg.IsUndefined() { fmt.Println("The new account will be encrypted with a passphrase.") fmt.Println("Please enter a passphrase now.") - auth, err := readPassword("Passphrase: ", true) + auth, err := utils.PromptPassword("Passphrase: ", true) if err != nil { fmt.Println(err) return otto.FalseValue() } - confirm, err := readPassword("Repeat Passphrase: ", false) + confirm, err := utils.PromptPassword("Repeat Passphrase: ", false) if err != nil { fmt.Println(err) return otto.FalseValue() @@ -724,22 +781,22 @@ func (js *jsre) newRegistry(call otto.FunctionCall) otto.Value { if len(call.ArgumentList) != 1 { fmt.Println("requires 1 argument: admin.contractInfo.newRegistry(adminaddress)") - return otto.FalseValue() + return otto.UndefinedValue() } addr, err := call.Argument(0).ToString() if err != nil { fmt.Println(err) - return otto.FalseValue() + return otto.UndefinedValue() } - + var hashReg, urlHint string registry := resolver.New(js.xeth) - err = registry.CreateContracts(common.HexToAddress(addr)) + hashReg, urlHint, err = registry.CreateContracts(common.HexToAddress(addr)) if err != nil { fmt.Println(err) - return otto.FalseValue() + return otto.UndefinedValue() } - return otto.TrueValue() + return js.re.ToVal([]string{hashReg, urlHint}) } // internal transaction type which will allow us to resend transactions using `eth.resend` diff --git a/cmd/geth/contracts.go b/cmd/geth/contracts.go deleted file mode 100644 index 1f27838d15..0000000000 --- a/cmd/geth/contracts.go +++ /dev/null @@ -1,6 +0,0 @@ -package main - -var ( - globalRegistrar = `var GlobalRegistrar = web3.eth.contract([{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"name","outputs":[{"name":"o_name","type":"bytes32"}],"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"}],"name":"owner","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"}],"name":"content","outputs":[{"name":"","type":"bytes32"}],"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"}],"name":"addr","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"}],"name":"reserve","outputs":[],"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"}],"name":"subRegistrar","outputs":[{"name":"o_subRegistrar","type":"address"}],"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_newOwner","type":"address"}],"name":"transfer","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_registrar","type":"address"}],"name":"setSubRegistrar","outputs":[],"type":"function"},{"constant":false,"inputs":[],"name":"Registrar","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_a","type":"address"},{"name":"_primary","type":"bool"}],"name":"setAddress","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_content","type":"bytes32"}],"name":"setContent","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"}],"name":"disown","outputs":[],"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"}],"name":"register","outputs":[{"name":"","type":"address"}],"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"name","type":"bytes32"}],"name":"Changed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"name","type":"bytes32"},{"indexed":true,"name":"addr","type":"address"}],"name":"PrimaryChanged","type":"event"}]);` - globalRegistrarAddr = "0xc6d9d2cd449a754c494264e1809c50e34d64562b" -) diff --git a/cmd/geth/info_test.json b/cmd/geth/info_test.json index 1e0c271ac9..63f2163a9c 100644 --- a/cmd/geth/info_test.json +++ b/cmd/geth/info_test.json @@ -1 +1 @@ -{"code":"605280600c6000396000f3006000357c010000000000000000000000000000000000000000000000000000000090048063c6888fa114602e57005b60376004356041565b8060005260206000f35b6000600782029050604d565b91905056","info":{"abiDefinition":[{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name":"multiply","outputs":[{"name":"d","type":"uint256"}],"type":"function"}],"compilerVersion":"0.9.17","developerDoc":{"methods":{}},"language":"Solidity","languageVersion":"0","source":"contract test {\n /// @notice Will multiply `a` by 7.\n function multiply(uint a) returns(uint d) {\n return a * 7;\n }\n}\n","userDoc":{"methods":{"multiply(uint256)":{"notice":"Will multiply `a` by 7."}}}}} \ No newline at end of file +{"code":"0x605880600c6000396000f3006000357c010000000000000000000000000000000000000000000000000000000090048063c6888fa114602e57005b603d6004803590602001506047565b8060005260206000f35b60006007820290506053565b91905056","info":{"abiDefinition":[{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name":"multiply","outputs":[{"name":"d","type":"uint256"}],"type":"function"}],"compilerVersion":"0.9.23","developerDoc":{"methods":{}},"language":"Solidity","languageVersion":"0","source":"contract test {\n /// @notice Will multiply `a` by 7.\n function multiply(uint a) returns(uint d) {\n return a * 7;\n }\n}\n","userDoc":{"methods":{"multiply(uint256)":{"notice":"Will multiply `a` by 7."}}}}} \ No newline at end of file diff --git a/cmd/geth/js.go b/cmd/geth/js.go index 4ddb3bd9ca..ad37d55645 100644 --- a/cmd/geth/js.go +++ b/cmd/geth/js.go @@ -29,6 +29,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/docserver" "github.com/ethereum/go-ethereum/common/natspec" + "github.com/ethereum/go-ethereum/common/resolver" "github.com/ethereum/go-ethereum/eth" re "github.com/ethereum/go-ethereum/jsre" "github.com/ethereum/go-ethereum/rpc" @@ -71,7 +72,7 @@ type jsre struct { prompter } -func newJSRE(ethereum *eth.Ethereum, libPath, solcPath, corsDomain string, interactive bool, f xeth.Frontend) *jsre { +func newJSRE(ethereum *eth.Ethereum, libPath, corsDomain string, interactive bool, f xeth.Frontend) *jsre { js := &jsre{ethereum: ethereum, ps1: "> "} // set default cors domain used by startRpc from CLI flag js.corsDomain = corsDomain @@ -81,7 +82,6 @@ func newJSRE(ethereum *eth.Ethereum, libPath, solcPath, corsDomain string, inter js.xeth = xeth.New(ethereum, f) js.wait = js.xeth.UpdateState() // update state in separare forever blocks - js.xeth.SetSolc(solcPath) js.re = re.New(libPath) js.apiBindings(f) js.adminBindings() @@ -142,7 +142,7 @@ var net = web3.net; utils.Fatalf("Error setting namespaces: %v", err) } - js.re.Eval(globalRegistrar + "registrar = new GlobalRegistrar(\"" + globalRegistrarAddr + "\");") + js.re.Eval(resolver.GlobalRegistrar + "registrar = GlobalRegistrar.at(\"" + resolver.GlobalRegistrarAddr + "\");") } var ds, _ = docserver.New("/") diff --git a/cmd/geth/js_test.go b/cmd/geth/js_test.go index e02e8f7047..7a1f899193 100644 --- a/cmd/geth/js_test.go +++ b/cmd/geth/js_test.go @@ -24,7 +24,7 @@ import ( const ( testSolcPath = "" - solcVersion = "0.9.17" + solcVersion = "0.9.23" testKey = "e6fab74a43941f82d89cb7faa408e227cdad3153c4720e540e855c19b15e6674" testAddress = "0x8605cdbbdb6d264aa742e77020dcbc58fcdce182" @@ -34,6 +34,7 @@ const ( ) var ( + versionRE = regexp.MustCompile(strconv.Quote(`"compilerVersion":"` + solcVersion + `"`)) testGenesis = `{"` + testAddress[2:] + `": {"balance": "` + testBalance + `"}}` ) @@ -75,6 +76,7 @@ func testJEthRE(t *testing.T) (string, *testjethre, *eth.Ethereum) { AccountManager: am, MaxPeers: 0, Name: "test", + SolcPath: testSolcPath, }) if err != nil { t.Fatal("%v", err) @@ -101,7 +103,7 @@ func testJEthRE(t *testing.T) (string, *testjethre, *eth.Ethereum) { t.Errorf("Error creating DocServer: %v", err) } tf := &testjethre{ds: ds, stateDb: ethereum.ChainManager().State().Copy()} - repl := newJSRE(ethereum, assetPath, testSolcPath, "", false, tf) + repl := newJSRE(ethereum, assetPath, "", false, tf) tf.jsre = repl return tmp, tf, ethereum } @@ -172,6 +174,8 @@ func TestBlockChain(t *testing.T) { tmpfile := filepath.Join(extmp, "export.chain") tmpfileq := strconv.Quote(tmpfile) + ethereum.ChainManager().Reset() + checkEvalJSON(t, repl, `admin.export(`+tmpfileq+`)`, `true`) if _, err := os.Stat(tmpfile); err != nil { t.Fatal(err) @@ -226,11 +230,11 @@ func TestSignature(t *testing.T) { defer ethereum.Stop() defer os.RemoveAll(tmp) - val, err := repl.re.Run(`eth.sign({from: "` + testAddress + `", data: "` + testHash + `"})`) + val, err := repl.re.Run(`eth.sign("` + testAddress + `", "` + testHash + `")`) // This is a very preliminary test, lacking actual signature verification if err != nil { - t.Errorf("Error runnig js: %v", err) + t.Errorf("Error running js: %v", err) return } output := val.String() @@ -244,7 +248,6 @@ func TestSignature(t *testing.T) { } func TestContract(t *testing.T) { - t.Skip() tmp, repl, ethereum := testJEthRE(t) if err := ethereum.Start(); err != nil { @@ -257,7 +260,9 @@ func TestContract(t *testing.T) { var txc uint64 coinbase := common.HexToAddress(testAddress) resolver.New(repl.xeth).CreateContracts(coinbase) + // time.Sleep(1000 * time.Millisecond) + // checkEvalJSON(t, repl, `eth.getBlock("pending", true).transactions.length`, `2`) source := `contract test {\n` + " /// @notice Will multiply `a` by 7." + `\n` + ` function multiply(uint a) returns(uint d) {\n` + @@ -277,10 +282,9 @@ func TestContract(t *testing.T) { // if solc is found with right version, test it, otherwise read from file sol, err := compiler.New("") if err != nil { - t.Logf("solc not found: skipping compiler test") + t.Logf("solc not found: mocking contract compilation step") } else if sol.Version() != solcVersion { - err = fmt.Errorf("solc wrong version found (%v, expect %v): skipping compiler test", sol.Version(), solcVersion) - t.Log(err) + t.Logf("WARNING: solc different version found (%v, test written for %v, may need to update)", sol.Version(), solcVersion) } if err != nil { @@ -293,28 +297,29 @@ func TestContract(t *testing.T) { t.Errorf("%v", err) } } else { - checkEvalJSON(t, repl, `contract = eth.compile.solidity(source)`, string(contractInfo)) + checkEvalJSON(t, repl, `contract = eth.compile.solidity(source).test`, string(contractInfo)) } - checkEvalJSON(t, repl, `contract.code`, `"605280600c6000396000f3006000357c010000000000000000000000000000000000000000000000000000000090048063c6888fa114602e57005b60376004356041565b8060005260206000f35b6000600782029050604d565b91905056"`) + checkEvalJSON(t, repl, `contract.code`, `"0x605880600c6000396000f3006000357c010000000000000000000000000000000000000000000000000000000090048063c6888fa114602e57005b603d6004803590602001506047565b8060005260206000f35b60006007820290506053565b91905056"`) checkEvalJSON( t, repl, `contractaddress = eth.sendTransaction({from: primary, data: contract.code })`, - `"0x5dcaace5982778b409c524873b319667eba5d074"`, + `"0x291293d57e0a0ab47effe97c02577f90d9211567"`, ) callSetup := `abiDef = JSON.parse('[{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name":"multiply","outputs":[{"name":"d","type":"uint256"}],"type":"function"}]'); Multiply7 = eth.contract(abiDef); -multiply7 = new Multiply7(contractaddress); +multiply7 = Multiply7.at(contractaddress); ` - + // time.Sleep(1500 * time.Millisecond) _, err = repl.re.Run(callSetup) if err != nil { - t.Errorf("unexpected error registering, got %v", err) + t.Errorf("unexpected error setting up contract, got %v", err) } - // updatespec + // checkEvalJSON(t, repl, `eth.getBlock("pending", true).transactions.length`, `3`) + // why is this sometimes failing? // checkEvalJSON(t, repl, `multiply7.multiply.call(6)`, `42`) expNotice := "" @@ -322,20 +327,23 @@ multiply7 = new Multiply7(contractaddress); t.Errorf("incorrect confirmation message: expected %v, got %v", expNotice, repl.lastConfirm) } - // why 0? - checkEvalJSON(t, repl, `eth.getBlock("pending", true).transactions.length`, `0`) - txc, repl.xeth = repl.xeth.ApplyTestTxs(repl.stateDb, coinbase, txc) checkEvalJSON(t, repl, `admin.contractInfo.start()`, `true`) checkEvalJSON(t, repl, `multiply7.multiply.sendTransaction(6, { from: primary, gas: "1000000", gasPrice: "100000" })`, `undefined`) - expNotice = `About to submit transaction (no NatSpec info found for contract: content hash not found for '0x4a6c99e127191d2ee302e42182c338344b39a37a47cdbb17ab0f26b6802eb4d1'): {"params":[{"to":"0x5dcaace5982778b409c524873b319667eba5d074","data": "0xc6888fa10000000000000000000000000000000000000000000000000000000000000006"}]}` + expNotice = `About to submit transaction (no NatSpec info found for contract: content hash not found for '0x87e2802265838c7f14bb69eecd2112911af6767907a702eeaa445239fb20711b'): {"params":[{"to":"0x291293d57e0a0ab47effe97c02577f90d9211567","data": "0xc6888fa10000000000000000000000000000000000000000000000000000000000000006"}]}` if repl.lastConfirm != expNotice { t.Errorf("incorrect confirmation message: expected %v, got %v", expNotice, repl.lastConfirm) } + var contenthash = `"0x86d2b7cf1e72e9a7a3f8d96601f0151742a2f780f1526414304fbe413dc7f9bd"` + if sol != nil { + modContractInfo := versionRE.ReplaceAll(contractInfo, []byte(`"compilerVersion":"`+sol.Version()+`"`)) + _ = modContractInfo + // contenthash = crypto.Sha3(modContractInfo) + } checkEvalJSON(t, repl, `filename = "/tmp/info.json"`, `"/tmp/info.json"`) - checkEvalJSON(t, repl, `contenthash = admin.contractInfo.register(primary, contractaddress, contract, filename)`, `"0x0d067e2dd99a4d8f0c0279738b17130dd415a89f24a23f0e7cf68c546ae3089d"`) + checkEvalJSON(t, repl, `contenthash = admin.contractInfo.register(primary, contractaddress, contract, filename)`, contenthash) checkEvalJSON(t, repl, `admin.contractInfo.registerUrl(primary, contenthash, "file://"+filename)`, `true`) if err != nil { t.Errorf("unexpected error registering, got %v", err) diff --git a/cmd/geth/main.go b/cmd/geth/main.go index 0d649b8c59..936db793be 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -21,7 +21,6 @@ package main import ( - "bufio" "fmt" "io" "io/ioutil" @@ -44,13 +43,12 @@ import ( "github.com/ethereum/go-ethereum/logger" "github.com/mattn/go-colorable" "github.com/mattn/go-isatty" - "github.com/peterh/liner" ) import _ "net/http/pprof" const ( ClientIdentifier = "Geth" - Version = "0.9.21.1" + Version = "0.9.23" ) var ( @@ -101,7 +99,15 @@ The output of this command is supposed to be machine-readable. Usage: "import ethereum presale wallet", }, }, - }, + Description: ` + + get wallet import /path/to/my/presale.wallet + +will prompt for your password and imports your ether presale account. +It can be used non-interactively with the --password option taking a +passwordfile as argument containing the wallet password in plaintext. + +`}, { Action: accountList, Name: "account", @@ -111,7 +117,7 @@ The output of this command is supposed to be machine-readable. Manage accounts lets you create new accounts, list all existing accounts, import a private key into a new account. -'account help' shows a list of subcommands or help for one subcommand. +' help' shows a list of subcommands or help for one subcommand. It supports interactive mode, when you are prompted for password as well as non-interactive mode where passwords are supplied via a given password file. @@ -230,6 +236,11 @@ JavaScript API. See https://github.com/ethereum/go-ethereum/wiki/Javascipt-Conso Name: "upgradedb", Usage: "upgrade chainblock database", }, + { + Action: removeDb, + Name: "removedb", + Usage: "Remove blockchain and state databases", + }, } app.Flags = []cli.Flag{ utils.IdentityFlag, @@ -246,6 +257,7 @@ JavaScript API. See https://github.com/ethereum/go-ethereum/wiki/Javascipt-Conso utils.GasPriceFlag, utils.MinerThreadsFlag, utils.MiningEnabledFlag, + utils.AutoDAGFlag, utils.NATFlag, utils.NatspecEnabledFlag, utils.NodeKeyFileFlag, @@ -324,7 +336,6 @@ func console(ctx *cli.Context) { repl := newJSRE( ethereum, ctx.String(utils.JSpathFlag.Name), - ctx.String(utils.SolcPathFlag.Name), ctx.GlobalString(utils.RPCCORSDomainFlag.Name), true, nil, @@ -346,7 +357,6 @@ func execJSFiles(ctx *cli.Context) { repl := newJSRE( ethereum, ctx.String(utils.JSpathFlag.Name), - ctx.String(utils.SolcPathFlag.Name), ctx.GlobalString(utils.RPCCORSDomainFlag.Name), false, nil, @@ -362,12 +372,20 @@ func execJSFiles(ctx *cli.Context) { func unlockAccount(ctx *cli.Context, am *accounts.Manager, account string) (passphrase string) { var err error // Load startup keys. XXX we are going to need a different format - // Attempt to unlock the account - passphrase = getPassPhrase(ctx, "", false) + if len(account) == 0 { utils.Fatalf("Invalid account address '%s'", account) } - err = am.Unlock(common.HexToAddress(account), passphrase) + // Attempt to unlock the account 3 times + attempts := 3 + for tries := 0; tries < attempts; tries++ { + msg := fmt.Sprintf("Unlocking account %s...%s | Attempt %d/%d", account[:8], account[len(account)-6:], tries+1, attempts) + passphrase = getPassPhrase(ctx, msg, false) + err = am.Unlock(common.HexToAddress(account), passphrase) + if err == nil { + break + } + } if err != nil { utils.Fatalf("Unlock account failed '%v'", err) } @@ -382,15 +400,18 @@ func startEth(ctx *cli.Context, eth *eth.Ethereum) { am := eth.AccountManager() account := ctx.GlobalString(utils.UnlockedAccountFlag.Name) - if len(account) > 0 { - if account == "primary" { - primaryAcc, err := am.Primary() - if err != nil { - utils.Fatalf("no primary account: %v", err) + accounts := strings.Split(account, " ") + for _, account := range accounts { + if len(account) > 0 { + if account == "primary" { + primaryAcc, err := am.Primary() + if err != nil { + utils.Fatalf("no primary account: %v", err) + } + account = primaryAcc.Hex() } - account = primaryAcc.Hex() + unlockAccount(ctx, am, account) } - unlockAccount(ctx, am, account) } // Start auxiliary services if enabled. if ctx.GlobalBool(utils.RPCEnabledFlag.Name) { @@ -422,12 +443,12 @@ func getPassPhrase(ctx *cli.Context, desc string, confirmation bool) (passphrase passfile := ctx.GlobalString(utils.PasswordFileFlag.Name) if len(passfile) == 0 { fmt.Println(desc) - auth, err := readPassword("Passphrase: ", true) + auth, err := utils.PromptPassword("Passphrase: ", true) if err != nil { utils.Fatalf("%v", err) } if confirmation { - confirm, err := readPassword("Repeat Passphrase: ", false) + confirm, err := utils.PromptPassword("Repeat Passphrase: ", false) if err != nil { utils.Fatalf("%v", err) } @@ -544,6 +565,25 @@ func exportchain(ctx *cli.Context) { return } +func removeDb(ctx *cli.Context) { + confirm, err := utils.PromptConfirm("Remove local databases?") + if err != nil { + utils.Fatalf("%v", err) + } + + if confirm { + fmt.Println("Removing chain and state databases...") + start := time.Now() + + os.RemoveAll(filepath.Join(ctx.GlobalString(utils.DataDirFlag.Name), "blockchain")) + os.RemoveAll(filepath.Join(ctx.GlobalString(utils.DataDirFlag.Name), "state")) + + fmt.Printf("Removed in %v\n", time.Since(start)) + } else { + fmt.Println("Operation aborted") + } +} + func upgradeDb(ctx *cli.Context) { fmt.Println("Upgrade blockchain DB") @@ -575,6 +615,7 @@ func upgradeDb(ctx *cli.Context) { ethereum.ExtraDb().Close() os.RemoveAll(filepath.Join(ctx.GlobalString(utils.DataDirFlag.Name), "blockchain")) + os.RemoveAll(filepath.Join(ctx.GlobalString(utils.DataDirFlag.Name), "state")) ethereum, err = eth.New(cfg) if err != nil { @@ -666,18 +707,3 @@ func hashish(x string) bool { _, err := strconv.Atoi(x) return err != nil } - -func readPassword(prompt string, warnTerm bool) (string, error) { - if liner.TerminalSupported() { - lr := liner.NewLiner() - defer lr.Close() - return lr.PasswordPrompt(prompt) - } - if warnTerm { - fmt.Println("!! Unsupported terminal, password will be echoed.") - } - fmt.Print(prompt) - input, err := bufio.NewReader(os.Stdin).ReadString('\n') - fmt.Println() - return input, err -} diff --git a/cmd/utils/cmd.go b/cmd/utils/cmd.go index fb55a64af6..39b4e46da2 100644 --- a/cmd/utils/cmd.go +++ b/cmd/utils/cmd.go @@ -22,11 +22,13 @@ package utils import ( + "bufio" "fmt" "io" "os" "os/signal" "regexp" + "strings" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" @@ -35,6 +37,7 @@ import ( "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/logger/glog" "github.com/ethereum/go-ethereum/rlp" + "github.com/peterh/liner" ) var interruptCallbacks = []func(os.Signal){} @@ -71,18 +74,45 @@ func openLogFile(Datadir string, filename string) *os.File { return file } -func confirm(message string) bool { - fmt.Println(message, "Are you sure? (y/n)") - var r string - fmt.Scanln(&r) - for ; ; fmt.Scanln(&r) { - if r == "n" || r == "y" { - break - } else { - fmt.Printf("Yes or no? (%s)", r) - } +func PromptConfirm(prompt string) (bool, error) { + var ( + input string + err error + ) + prompt = prompt + " [y/N] " + + if liner.TerminalSupported() { + lr := liner.NewLiner() + defer lr.Close() + input, err = lr.Prompt(prompt) + } else { + fmt.Print(prompt) + input, err = bufio.NewReader(os.Stdin).ReadString('\n') + fmt.Println() } - return r == "y" + + if len(input) > 0 && strings.ToUpper(input[:1]) == "Y" { + return true, nil + } else { + return false, nil + } + + return false, err +} + +func PromptPassword(prompt string, warnTerm bool) (string, error) { + if liner.TerminalSupported() { + lr := liner.NewLiner() + defer lr.Close() + return lr.PasswordPrompt(prompt) + } + if warnTerm { + fmt.Println("!! Unsupported terminal, password will be echoed.") + } + fmt.Print(prompt) + input, err := bufio.NewReader(os.Stdin).ReadString('\n') + fmt.Println() + return input, err } func initDataDir(Datadir string) { diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index 873fba5f33..8d77e3a0b2 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -112,6 +112,10 @@ var ( Name: "mine", Usage: "Enable mining", } + AutoDAGFlag = cli.BoolFlag{ + Name: "autodag", + Usage: "Enable automatic DAG pregeneration", + } EtherbaseFlag = cli.StringFlag{ Name: "etherbase", Usage: "Public address for block mining rewards. By default the address of your primary account is used", @@ -318,6 +322,8 @@ func MakeEthConfig(clientID, version string, ctx *cli.Context) *eth.Config { Dial: true, BootNodes: ctx.GlobalString(BootnodesFlag.Name), GasPrice: common.String2Big(ctx.GlobalString(GasPriceFlag.Name)), + SolcPath: ctx.GlobalString(SolcPathFlag.Name), + AutoDAG: ctx.GlobalBool(AutoDAGFlag.Name) || ctx.GlobalBool(MiningEnabledFlag.Name), } } @@ -341,8 +347,8 @@ func GetChain(ctx *cli.Context) (*core.ChainManager, common.Database, common.Dat } eventMux := new(event.TypeMux) - chainManager := core.NewChainManager(blockDb, stateDb, eventMux) pow := ethash.New() + chainManager := core.NewChainManager(blockDb, stateDb, pow, eventMux) txPool := core.NewTxPool(eventMux, chainManager.State, chainManager.GasLimit) blockProcessor := core.NewBlockProcessor(stateDb, extraDb, pow, txPool, chainManager, eventMux) chainManager.SetProcessor(blockProcessor) diff --git a/common/compiler/solidity.go b/common/compiler/solidity.go index 6790f9a1d3..0cfd41c95c 100644 --- a/common/compiler/solidity.go +++ b/common/compiler/solidity.go @@ -18,7 +18,8 @@ import ( ) const ( - flair = "Christian and Lefteris (c) 2014-2015" + // flair = "Christian and Lefteris (c) 2014-2015" + flair = "" languageVersion = "0" ) @@ -91,7 +92,7 @@ func (sol *Solidity) Version() string { return sol.version } -func (sol *Solidity) Compile(source string) (contract *Contract, err error) { +func (sol *Solidity) Compile(source string) (contracts map[string]*Contract, err error) { if len(source) == 0 { err = fmt.Errorf("empty source") @@ -122,58 +123,61 @@ func (sol *Solidity) Compile(source string) (contract *Contract, err error) { err = fmt.Errorf("solc error: missing code output") return } - if len(matches) > 1 { - err = fmt.Errorf("multi-contract sources are not supported") - return - } - _, file := filepath.Split(matches[0]) - base := strings.Split(file, ".")[0] - codeFile := filepath.Join(wd, base+".binary") - abiDefinitionFile := filepath.Join(wd, base+".abi") - userDocFile := filepath.Join(wd, base+".docuser") - developerDocFile := filepath.Join(wd, base+".docdev") + contracts = make(map[string]*Contract) + for _, path := range matches { + _, file := filepath.Split(path) + base := strings.Split(file, ".")[0] - code, err := ioutil.ReadFile(codeFile) - if err != nil { - err = fmt.Errorf("error reading compiler output for code: %v", err) - return - } - abiDefinitionJson, err := ioutil.ReadFile(abiDefinitionFile) - if err != nil { - err = fmt.Errorf("error reading compiler output for abiDefinition: %v", err) - return - } - var abiDefinition interface{} - err = json.Unmarshal(abiDefinitionJson, &abiDefinition) + codeFile := filepath.Join(wd, base+".binary") + abiDefinitionFile := filepath.Join(wd, base+".abi") + userDocFile := filepath.Join(wd, base+".docuser") + developerDocFile := filepath.Join(wd, base+".docdev") - userDocJson, err := ioutil.ReadFile(userDocFile) - if err != nil { - err = fmt.Errorf("error reading compiler output for userDoc: %v", err) - return - } - var userDoc interface{} - err = json.Unmarshal(userDocJson, &userDoc) + var code, abiDefinitionJson, userDocJson, developerDocJson []byte + code, err = ioutil.ReadFile(codeFile) + if err != nil { + err = fmt.Errorf("error reading compiler output for code: %v", err) + return + } + abiDefinitionJson, err = ioutil.ReadFile(abiDefinitionFile) + if err != nil { + err = fmt.Errorf("error reading compiler output for abiDefinition: %v", err) + return + } + var abiDefinition interface{} + err = json.Unmarshal(abiDefinitionJson, &abiDefinition) - developerDocJson, err := ioutil.ReadFile(developerDocFile) - if err != nil { - err = fmt.Errorf("error reading compiler output for developerDoc: %v", err) - return - } - var developerDoc interface{} - err = json.Unmarshal(developerDocJson, &developerDoc) + userDocJson, err = ioutil.ReadFile(userDocFile) + if err != nil { + err = fmt.Errorf("error reading compiler output for userDoc: %v", err) + return + } + var userDoc interface{} + err = json.Unmarshal(userDocJson, &userDoc) - contract = &Contract{ - Code: string(code), - Info: ContractInfo{ - Source: source, - Language: "Solidity", - LanguageVersion: languageVersion, - CompilerVersion: sol.version, - AbiDefinition: abiDefinition, - UserDoc: userDoc, - DeveloperDoc: developerDoc, - }, + developerDocJson, err = ioutil.ReadFile(developerDocFile) + if err != nil { + err = fmt.Errorf("error reading compiler output for developerDoc: %v", err) + return + } + var developerDoc interface{} + err = json.Unmarshal(developerDocJson, &developerDoc) + + contract := &Contract{ + Code: "0x" + string(code), + Info: ContractInfo{ + Source: source, + Language: "Solidity", + LanguageVersion: languageVersion, + CompilerVersion: sol.version, + AbiDefinition: abiDefinition, + UserDoc: userDoc, + DeveloperDoc: developerDoc, + }, + } + + contracts[base] = contract } return diff --git a/common/compiler/solidity_test.go b/common/compiler/solidity_test.go index 68e54a7ecf..46f733e59d 100644 --- a/common/compiler/solidity_test.go +++ b/common/compiler/solidity_test.go @@ -9,7 +9,7 @@ import ( "github.com/ethereum/go-ethereum/common" ) -const solcVersion = "0.9.17" +const solcVersion = "0.9.23" var ( source = ` @@ -20,37 +20,45 @@ contract test { } } ` - code = "605280600c6000396000f3006000357c010000000000000000000000000000000000000000000000000000000090048063c6888fa114602e57005b60376004356041565b8060005260206000f35b6000600782029050604d565b91905056" - info = `{"source":"\ncontract test {\n /// @notice Will multiply ` + "`a`" + ` by 7.\n function multiply(uint a) returns(uint d) {\n return a * 7;\n }\n}\n","language":"Solidity","languageVersion":"0","compilerVersion":"0.9.17","abiDefinition":[{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name":"multiply","outputs":[{"name":"d","type":"uint256"}],"type":"function"}],"userDoc":{"methods":{"multiply(uint256)":{"notice":"Will multiply ` + "`a`" + ` by 7."}}},"developerDoc":{"methods":{}}}` + code = "0x605880600c6000396000f3006000357c010000000000000000000000000000000000000000000000000000000090048063c6888fa114602e57005b603d6004803590602001506047565b8060005260206000f35b60006007820290506053565b91905056" + info = `{"source":"\ncontract test {\n /// @notice Will multiply ` + "`a`" + ` by 7.\n function multiply(uint a) returns(uint d) {\n return a * 7;\n }\n}\n","language":"Solidity","languageVersion":"0","compilerVersion":"0.9.23","abiDefinition":[{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name":"multiply","outputs":[{"name":"d","type":"uint256"}],"type":"function"}],"userDoc":{"methods":{"multiply(uint256)":{"notice":"Will multiply ` + "`a`" + ` by 7."}}},"developerDoc":{"methods":{}}}` - infohash = common.HexToHash("0x834075768a68e500e459b9c3213750c84de3df47156500cb01bb664d3f88c60a") + infohash = common.HexToHash("0xea782f674eb898e477c20e8a7cf11c2c28b09fa68b5278732104f7a101aed255") ) func TestCompiler(t *testing.T) { sol, err := New("") if err != nil { - t.Skip("no solc installed") + t.Skip("solc not found: skip") + } else if sol.Version() != solcVersion { + t.Logf("WARNING: a newer version of solc found (%v, expect %v)", sol.Version(), solcVersion) } - contract, err := sol.Compile(source) + contracts, err := sol.Compile(source) if err != nil { - t.Errorf("error compiling source. result %v: %v", contract, err) + t.Errorf("error compiling source. result %v: %v", contracts, err) return } - /* - if contract.Code != code { - t.Errorf("wrong code, expected\n%s, got\n%s", code, contract.Code) - } - */ + + if len(contracts) != 1 { + t.Errorf("one contract expected, got\n%s", len(contracts)) + } + + if contracts["test"].Code != code { + t.Errorf("wrong code, expected\n%s, got\n%s", code, contracts["test"].Code) + } + } func TestCompileError(t *testing.T) { sol, err := New("") if err != nil || sol.version != solcVersion { - t.Skip("no solc installed") + t.Skip("solc not found: skip") + } else if sol.Version() != solcVersion { + t.Logf("WARNING: a newer version of solc found (%v, expect %v)", sol.Version(), solcVersion) } - contract, err := sol.Compile(source[2:]) + contracts, err := sol.Compile(source[2:]) if err == nil { - t.Errorf("error expected compiling source. got none. result %v", contract) + t.Errorf("error expected compiling source. got none. result %v", contracts) return } } @@ -78,11 +86,11 @@ func TestExtractInfo(t *testing.T) { os.Remove(filename) cinfohash, err := ExtractInfo(contract, filename) if err != nil { - t.Errorf("%v", err) + t.Errorf("error extracting info: %v", err) } got, err := ioutil.ReadFile(filename) if err != nil { - t.Errorf("%v", err) + t.Errorf("error reading '%v': %v", filename, err) } if string(got) != info { t.Errorf("incorrect info.json extracted, expected:\n%s\ngot\n%s", info, string(got)) diff --git a/common/natspec/natspec_e2e_test.go b/common/natspec/natspec_e2e_test.go index a8d318b57a..f6368c9c56 100644 --- a/common/natspec/natspec_e2e_test.go +++ b/common/natspec/natspec_e2e_test.go @@ -197,8 +197,11 @@ func TestNatspecE2E(t *testing.T) { codehash := common.BytesToHash(crypto.Sha3(codeb)) // use resolver to register codehash->dochash->url + // test if globalregistry works + // resolver.HashRefContractAddress = "0x0" + // resolver.UrlHintContractAddress = "0x0" registry := resolver.New(tf.xeth) - _, err := registry.Register(tf.coinbase, codehash, dochash, "file:///"+testFileName) + _, err := registry.RegisterAddrWithUrl(tf.coinbase, codehash, dochash, "file:///"+testFileName) if err != nil { t.Errorf("error registering: %v", err) } diff --git a/common/resolver/contracts.go b/common/resolver/contracts.go index 4aad95e436..eba5de1b58 100644 --- a/common/resolver/contracts.go +++ b/common/resolver/contracts.go @@ -33,4 +33,6 @@ const ( // built-in contracts address and code } */ + GlobalRegistrar = `var GlobalRegistrar = web3.eth.contract([{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"name","outputs":[{"name":"o_name","type":"bytes32"}],"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"}],"name":"owner","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"}],"name":"content","outputs":[{"name":"","type":"bytes32"}],"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"}],"name":"addr","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"}],"name":"reserve","outputs":[],"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"}],"name":"subRegistrar","outputs":[{"name":"o_subRegistrar","type":"address"}],"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_newOwner","type":"address"}],"name":"transfer","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_registrar","type":"address"}],"name":"setSubRegistrar","outputs":[],"type":"function"},{"constant":false,"inputs":[],"name":"Registrar","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_a","type":"address"},{"name":"_primary","type":"bool"}],"name":"setAddress","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_content","type":"bytes32"}],"name":"setContent","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"}],"name":"disown","outputs":[],"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"}],"name":"register","outputs":[{"name":"","type":"address"}],"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"name","type":"bytes32"}],"name":"Changed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"name","type":"bytes32"},{"indexed":true,"name":"addr","type":"address"}],"name":"PrimaryChanged","type":"event"}]);` + GlobalRegistrarAddr = "0xc6d9d2cd449a754c494264e1809c50e34d64562b" ) diff --git a/common/resolver/resolver.go b/common/resolver/resolver.go index 9016547e10..1f44f638c1 100644 --- a/common/resolver/resolver.go +++ b/common/resolver/resolver.go @@ -20,7 +20,10 @@ of a url scheme */ // // contract addresses will be hardcoded after they're created -var UrlHintContractAddress, HashRegContractAddress string +var ( + UrlHintContractAddress = "0x0" + HashRegContractAddress = "0x0" +) const ( txValue = "0" @@ -28,42 +31,167 @@ const ( txGasPrice = "1000000000000" ) -func abi(s string) string { +func abiSignature(s string) string { return common.ToHex(crypto.Sha3([]byte(s))[:4]) } var ( - registerContentHashAbi = abi("register(uint256,uint256)") - registerUrlAbi = abi("register(uint256,uint8,uint256)") - setOwnerAbi = abi("setowner()") + HashReg = "HashReg" + UrlHint = "UrlHint" + + registerContentHashAbi = abiSignature("register(uint256,uint256)") + registerUrlAbi = abiSignature("register(uint256,uint8,uint256)") + setOwnerAbi = abiSignature("setowner()") + reserveAbi = abiSignature("reserve(bytes32)") + resolveAbi = abiSignature("addr(bytes32)") + registerAbi = abiSignature("setAddress(bytes32,address,bool)") + addressAbiPrefix = string(make([]byte, 24)) ) type Backend interface { StorageAt(string, string) string Transact(fromStr, toStr, nonceStr, valueStr, gasStr, gasPriceStr, codeStr string) (string, error) + Call(fromStr, toStr, valueStr, gasStr, gasPriceStr, codeStr string) (string, string, error) } type Resolver struct { backend Backend } -func New(eth Backend) *Resolver { - return &Resolver{eth} +func New(eth Backend) (res *Resolver) { + res = &Resolver{eth} + res.setContracts() + return } -// for testing and play temporarily -// ideally the HashReg and UrlHint contracts should be in the genesis block -// if we got build-in support for natspec/contract info -// there should be only one of these officially endorsed -// addresses as constants -// TODO: could get around this with namereg, check -func (self *Resolver) CreateContracts(addr common.Address) (err error) { - HashRegContractAddress, err = self.backend.Transact(addr.Hex(), "", "", txValue, txGas, txGasPrice, ContractCodeHashReg) +func (self *Resolver) setContracts() { + var err error + if HashRegContractAddress != "0x0" { + return + } + // reset iff error anywhere + defer func() { + if err != nil { + HashRegContractAddress = "0x0" + } + }() + hashRegAbi := registerAbi + string(common.Hex2BytesFixed(HashRegContractAddress[2:], 32)) + HashRegContractAddress, _, err = self.backend.Call("", GlobalRegistrarAddr, "", "", "", hashRegAbi) + if err != nil { + err = fmt.Errorf("HashReg address not found: %v", err) + return + } + + if UrlHintContractAddress != "0x0" { + return + } + // reset iff error anywhere + defer func() { + if err != nil { + UrlHintContractAddress = "0x0" + } + }() + + urlHintAbi := registerAbi + string(common.Hex2BytesFixed(UrlHintContractAddress[2:], 32)) + UrlHintContractAddress, _, err = self.backend.Call("", GlobalRegistrarAddr, "", "", "", urlHintAbi) + if err != nil { + err = fmt.Errorf("UrlHint address not found: %v", err) + return + } + + glog.V(logger.Detail).Infof("HashReg @ %v\nUrlHint @ %v\n", HashRegContractAddress, UrlHintContractAddress) +} + +// This can be safely called from tests to or private chains to create +// new HashReg and UrlHint contracts (requires transaction) +// It does nothing if addresses are set +func (self *Resolver) CreateContracts(addr common.Address) (hashReg, urlHint string, err error) { + if HashRegContractAddress != "0x0" { + err = fmt.Errorf("HashReg already exists at %v", HashRegContractAddress) + return + } + hashReg, err = self.backend.Transact(addr.Hex(), "", "", txValue, txGas, txGasPrice, ContractCodeHashReg) if err != nil { return } - UrlHintContractAddress, err = self.backend.Transact(addr.Hex(), "", "", txValue, txGas, txGasPrice, ContractCodeURLhint) + _, err = self.Reserve(addr, HashReg) + if err != nil { + return + } + _, err = self.RegisterAddress(addr, HashReg, common.HexToAddress(hashReg)) + if err != nil { + return + } + + if UrlHintContractAddress != "0x0" { + err = fmt.Errorf("UrlHint already exists at %v", UrlHintContractAddress) + return + } + urlHint, err = self.backend.Transact(addr.Hex(), "", "", txValue, txGas, txGasPrice, ContractCodeURLhint) + if err != nil { + return + } + _, err = self.Reserve(addr, UrlHint) + if err != nil { + return + } + _, err = self.RegisterAddress(addr, UrlHint, common.HexToAddress(urlHint)) + if err != nil { + return + } + HashRegContractAddress = hashReg + UrlHintContractAddress = urlHint glog.V(logger.Detail).Infof("HashReg @ %v\nUrlHint @ %v\n", HashRegContractAddress, UrlHintContractAddress) + + return +} + +// Reserve(from, name) reserves name for the sender address in the globalRegistrar +// the tx needs to be mined to take effect +func (self *Resolver) Reserve(address common.Address, name string) (txh string, err error) { + nameHex, extra := encodeName(name, 6) + abi := reserveAbi + nameHex + extra + return self.backend.Transact( + address.Hex(), + GlobalRegistrarAddr, + "", txValue, txGas, txGasPrice, + abi, + ) +} + +// RegisterAddress(from, name, addr) will set the Address to address for name +// in the globalRegistrar using from as the sender of the transaction +// the tx needs to be mined to take effect +func (self *Resolver) RegisterAddress(from common.Address, name string, address common.Address) (txh string, err error) { + nameHex, extra := encodeName(name, 6) + addrHex := encodeAddress(address) + + trueHex := make([]byte, 64) + trueHex[63] = 1 + + abi := registerAbi + nameHex + addrHex + extra + return self.backend.Transact( + from.Hex(), + GlobalRegistrarAddr, + "", txValue, txGas, txGasPrice, + abi, + ) +} + +// NameToAddr(from, name) queries the registrar for the address on +func (self *Resolver) NameToAddr(from common.Address, name string) (address common.Address, err error) { + nameHex, extra := encodeName(name, 2) + abi := resolveAbi + nameHex + extra + res, _, err := self.backend.Call( + from.Hex(), + GlobalRegistrarAddr, + txValue, txGas, txGasPrice, + abi, + ) + if err != nil { + return + } + address = common.HexToAddress(res) return } @@ -138,7 +266,7 @@ func (self *Resolver) RegisterUrl(address common.Address, hash common.Hash, url return } -func (self *Resolver) Register(address common.Address, codehash, dochash common.Hash, url string) (txh string, err error) { +func (self *Resolver) RegisterAddrWithUrl(address common.Address, codehash, dochash common.Hash, url string) (txh string, err error) { _, err = self.RegisterContentHash(address, codehash, dochash) if err != nil { @@ -151,7 +279,7 @@ func (self *Resolver) Register(address common.Address, codehash, dochash common. // implemented as direct retrieval from db func (self *Resolver) KeyToContentHash(khash common.Hash) (chash common.Hash, err error) { // look up in hashReg - at := common.Bytes2Hex(common.FromHex(HashRegContractAddress)) + at := HashRegContractAddress[2:] key := storageAddress(storageMapping(storageIdx2Addr(1), khash[:])) hash := self.backend.StorageAt(at, key) @@ -172,7 +300,7 @@ func (self *Resolver) ContentHashToUrl(chash common.Hash) (uri string, err error for len(str) > 0 { mapaddr := storageMapping(storageIdx2Addr(1), chash[:]) key := storageAddress(storageFixedArray(mapaddr, storageIdx2Addr(idx))) - hex := self.backend.StorageAt(UrlHintContractAddress, key) + hex := self.backend.StorageAt(UrlHintContractAddress[2:], key) str = string(common.Hex2Bytes(hex[2:])) l := len(str) for (l > 0) && (str[l-1] == 0) { @@ -230,3 +358,18 @@ func storageFixedArray(addr, idx []byte) []byte { func storageAddress(addr []byte) string { return common.ToHex(addr) } + +func encodeAddress(address common.Address) string { + return addressAbiPrefix + address.Hex()[2:] +} + +func encodeName(name string, index uint8) (nameHex, extra string) { + nameHexBytes := make([]byte, 64) + if len(name) > 32 { + nameHexBytes[63] = byte(index) + extra = common.Bytes2Hex([]byte(name)) + } else { + copy(nameHexBytes, []byte(name)) + } + return string(nameHexBytes), extra +} diff --git a/common/resolver/resolver_test.go b/common/resolver/resolver_test.go index 02d12592e5..958d0f97fd 100644 --- a/common/resolver/resolver_test.go +++ b/common/resolver/resolver_test.go @@ -20,22 +20,22 @@ var ( ) func NewTestBackend() *testBackend { - HashRegContractAddress = common.BigToAddress(common.Big0).Hex()[2:] - UrlHintContractAddress = common.BigToAddress(common.Big1).Hex()[2:] + HashRegContractAddress = common.BigToAddress(common.Big0).Hex() //[2:] + UrlHintContractAddress = common.BigToAddress(common.Big1).Hex() //[2:] self := &testBackend{} self.contracts = make(map[string](map[string]string)) - self.contracts[HashRegContractAddress] = make(map[string]string) + self.contracts[HashRegContractAddress[2:]] = make(map[string]string) key := storageAddress(storageMapping(storageIdx2Addr(1), codehash[:])) - self.contracts[HashRegContractAddress][key] = hash.Hex() + self.contracts[HashRegContractAddress[2:]][key] = hash.Hex() - self.contracts[UrlHintContractAddress] = make(map[string]string) + self.contracts[UrlHintContractAddress[2:]] = make(map[string]string) mapaddr := storageMapping(storageIdx2Addr(1), hash[:]) key = storageAddress(storageFixedArray(mapaddr, storageIdx2Addr(0))) - self.contracts[UrlHintContractAddress][key] = common.ToHex([]byte(url)) + self.contracts[UrlHintContractAddress[2:]][key] = common.ToHex([]byte(url)) key = storageAddress(storageFixedArray(mapaddr, storageIdx2Addr(1))) - self.contracts[UrlHintContractAddress][key] = "0x00" + self.contracts[UrlHintContractAddress[2:]][key] = "0x0" return self } @@ -52,6 +52,20 @@ func (self *testBackend) Transact(fromStr, toStr, nonceStr, valueStr, gasStr, ga return "", nil } +func (self *testBackend) Call(fromStr, toStr, valueStr, gasStr, gasPriceStr, codeStr string) (string, string, error) { + return "", "", nil +} + +func TestCreateContractsExists(t *testing.T) { + b := NewTestBackend() + res := New(b) + _, _, err := res.CreateContracts(common.BigToAddress(common.Big0)) + exp := "HashReg already exists at 0x0000000000000000000000000000000000000000" + if err == nil || err.Error() != exp { + t.Errorf("expected error '%s', got '%v'", exp, err) + } +} + func TestKeyToContentHash(t *testing.T) { b := NewTestBackend() res := New(b) @@ -71,7 +85,7 @@ func TestContentHashToUrl(t *testing.T) { res := New(b) got, err := res.ContentHashToUrl(hash) if err != nil { - t.Errorf("expected no error, got %v", err) + t.Errorf("expected error, got %v", err) } else { if got != url { t.Errorf("incorrect result, expected '%v', got '%s'", url, got) diff --git a/core/block_cache.go b/core/block_cache.go index eeef5c41dc..0c747d37cb 100644 --- a/core/block_cache.go +++ b/core/block_cache.go @@ -85,6 +85,9 @@ func (bc *BlockCache) Get(hash common.Hash) *types.Block { } func (bc *BlockCache) Has(hash common.Hash) bool { + bc.mu.RLock() + defer bc.mu.RUnlock() + _, ok := bc.blocks[hash] return ok } diff --git a/core/block_processor.go b/core/block_processor.go index cae618b390..3f10e5efde 100644 --- a/core/block_processor.go +++ b/core/block_processor.go @@ -24,6 +24,8 @@ const ( BlockChainVersion = 2 ) +var receiptsPre = []byte("receipts-") + type BlockProcessor struct { db common.Database extraDb common.Database @@ -189,7 +191,7 @@ func (sm *BlockProcessor) processWithParent(block, parent *types.Block) (logs st state := state.New(parent.Root(), sm.db) // Block validation - if err = sm.ValidateHeader(block.Header(), parent.Header()); err != nil { + if err = sm.ValidateHeader(block.Header(), parent.Header(), false); err != nil { return } @@ -263,13 +265,27 @@ func (sm *BlockProcessor) processWithParent(block, parent *types.Block) (logs st putTx(sm.extraDb, tx, block, uint64(i)) } + receiptsRlp := block.Receipts().RlpEncode() + sm.extraDb.Put(append(receiptsPre, block.Hash().Bytes()...), receiptsRlp) + return state.Logs(), nil } +func (self *BlockProcessor) GetBlockReceipts(bhash common.Hash) (receipts types.Receipts, err error) { + var rdata []byte + rdata, err = self.extraDb.Get(append(receiptsPre, bhash[:]...)) + + if err == nil { + err = rlp.DecodeBytes(rdata, &receipts) + } + return + +} + // 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 *BlockProcessor) ValidateHeader(block, parent *types.Header) error { +func (sm *BlockProcessor) ValidateHeader(block, parent *types.Header, checkPow bool) error { if big.NewInt(int64(len(block.Extra))).Cmp(params.MaximumExtraDataSize) == 1 { return fmt.Errorf("Block extra data too long (%d)", len(block.Extra)) } @@ -300,9 +316,11 @@ func (sm *BlockProcessor) ValidateHeader(block, parent *types.Header) error { return BlockEqualTSErr //ValidationError("Block timestamp equal or less than previous block (%v - %v)", block.Time, parent.Time) } - // Verify the nonce of the block. Return an error if it's not valid - if !sm.Pow.Verify(types.NewBlockWithHeader(block)) { - return ValidationError("Block's nonce is invalid (= %x)", block.Nonce) + if checkPow { + // Verify the nonce of the block. Return an error if it's not valid + if !sm.Pow.Verify(types.NewBlockWithHeader(block)) { + return ValidationError("Block's nonce is invalid (= %x)", block.Nonce) + } } return nil @@ -351,6 +369,13 @@ func (sm *BlockProcessor) VerifyUncles(statedb *state.StateDB, block, parent *ty uncles.Add(hash) if ancestors.Has(hash) { + branch := fmt.Sprintf(" O - %x\n |\n", block.Hash()) + ancestors.Each(func(item interface{}) bool { + branch += fmt.Sprintf(" O - %x\n |\n", hash) + return true + }) + glog.Infoln(branch) + return UncleError("uncle[%d](%x) is ancestor", i, hash[:4]) } @@ -358,7 +383,7 @@ func (sm *BlockProcessor) VerifyUncles(statedb *state.StateDB, block, parent *ty return UncleError("uncle[%d](%x)'s parent unknown (%x)", i, hash[:4], uncle.ParentHash[0:4]) } - if err := sm.ValidateHeader(uncle, ancestorHeaders[uncle.ParentHash]); err != nil { + if err := sm.ValidateHeader(uncle, ancestorHeaders[uncle.ParentHash], true); err != nil { return ValidationError(fmt.Sprintf("uncle[%d](%x) header invalid: %v", i, hash[:4], err)) } } diff --git a/core/block_processor_test.go b/core/block_processor_test.go index 02524a4c15..e0aa5fb4c4 100644 --- a/core/block_processor_test.go +++ b/core/block_processor_test.go @@ -14,7 +14,7 @@ func proc() (*BlockProcessor, *ChainManager) { db, _ := ethdb.NewMemDatabase() var mux event.TypeMux - chainMan := NewChainManager(db, db, &mux) + chainMan := NewChainManager(db, db, thePow(), &mux) return NewBlockProcessor(db, db, ezp.New(), nil, chainMan, &mux), chainMan } @@ -24,13 +24,13 @@ func TestNumber(t *testing.T) { block1.Header().Number = big.NewInt(3) block1.Header().Time-- - err := bp.ValidateHeader(block1.Header(), chain.Genesis().Header()) + err := bp.ValidateHeader(block1.Header(), chain.Genesis().Header(), false) if err != BlockNumberErr { t.Errorf("expected block number error %v", err) } block1 = chain.NewBlock(common.Address{}) - err = bp.ValidateHeader(block1.Header(), chain.Genesis().Header()) + err = bp.ValidateHeader(block1.Header(), chain.Genesis().Header(), false) if err == BlockNumberErr { t.Errorf("didn't expect block number error") } diff --git a/core/chain_makers.go b/core/chain_makers.go index acf7b39cc5..44f17cc335 100644 --- a/core/chain_makers.go +++ b/core/chain_makers.go @@ -109,7 +109,7 @@ func makeChain(bman *BlockProcessor, parent *types.Block, max int, db common.Dat // Effectively a fork factory func newChainManager(block *types.Block, eventMux *event.TypeMux, db common.Database) *ChainManager { genesis := GenesisBlock(db) - bc := &ChainManager{blockDb: db, stateDb: db, genesisBlock: genesis, eventMux: eventMux} + bc := &ChainManager{blockDb: db, stateDb: db, genesisBlock: genesis, eventMux: eventMux, pow: FakePow{}} bc.txState = state.ManageState(state.New(genesis.Root(), db)) bc.futureBlocks = NewBlockCache(1000) if block == nil { diff --git a/core/chain_manager.go b/core/chain_manager.go index 2e8eb927d4..4fb7506e53 100644 --- a/core/chain_manager.go +++ b/core/chain_manager.go @@ -5,6 +5,7 @@ import ( "fmt" "io" "math/big" + "runtime" "sync" "time" @@ -15,6 +16,7 @@ import ( "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/logger/glog" "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/pow" "github.com/ethereum/go-ethereum/rlp" ) @@ -83,8 +85,9 @@ type ChainManager struct { eventMux *event.TypeMux genesisBlock *types.Block // Last known total difficulty - mu sync.RWMutex - tsmu sync.RWMutex + mu sync.RWMutex + chainmu sync.RWMutex + tsmu sync.RWMutex td *big.Int currentBlock *types.Block @@ -99,9 +102,11 @@ type ChainManager struct { quit chan struct{} wg sync.WaitGroup + + pow pow.PoW } -func NewChainManager(blockDb, stateDb common.Database, mux *event.TypeMux) *ChainManager { +func NewChainManager(blockDb, stateDb common.Database, pow pow.PoW, mux *event.TypeMux) *ChainManager { bc := &ChainManager{ blockDb: blockDb, stateDb: stateDb, @@ -109,6 +114,7 @@ func NewChainManager(blockDb, stateDb common.Database, mux *event.TypeMux) *Chai eventMux: mux, quit: make(chan struct{}), cache: NewBlockCache(blockCacheLimit), + pow: pow, } bc.setLastState() @@ -342,7 +348,7 @@ func (self *ChainManager) Export(w io.Writer) error { last := self.currentBlock.NumberU64() - for nr := uint64(0); nr <= last; nr++ { + for nr := uint64(1); nr <= last; nr++ { block := self.GetBlockByNumber(nr) if block == nil { return fmt.Errorf("export failed on #%d: not found", nr) @@ -406,9 +412,11 @@ func (self *ChainManager) GetBlockHashesFromHash(hash common.Hash, max uint64) ( } func (self *ChainManager) GetBlock(hash common.Hash) *types.Block { - if block := self.cache.Get(hash); block != nil { - return block - } + /* + if block := self.cache.Get(hash); block != nil { + return block + } + */ data, _ := self.blockDb.Get(append(blockHashPre, hash[:]...)) if len(data) == 0 { @@ -518,6 +526,9 @@ func (self *ChainManager) InsertChain(chain types.Blocks) (int, error) { self.wg.Add(1) defer self.wg.Done() + self.chainmu.Lock() + defer self.chainmu.Unlock() + // A queued approach to delivering events. This is generally faster than direct delivery and requires much less mutex acquiring. var ( queue = make([]interface{}, len(chain)) @@ -525,10 +536,19 @@ func (self *ChainManager) InsertChain(chain types.Blocks) (int, error) { stats struct{ queued, processed, ignored int } tstart = time.Now() ) + + // check the nonce in parallel to the block processing + // this speeds catching up significantly + nonceErrCh := make(chan error) + go func() { + nonceErrCh <- verifyNonces(self.pow, chain) + }() + for i, block := range chain { if block == nil { continue } + // Setting block.Td regardless of error (known for example) prevents errors down the line // in the protocol handler block.Td = new(big.Int).Set(CalcTD(block, self.GetBlock(block.ParentHash()))) @@ -542,7 +562,6 @@ func (self *ChainManager) InsertChain(chain types.Blocks) (int, error) { continue } - block.Td = new(big.Int) // Do not penelise on future block. We'll need a block queue eventually that will queue // future block for future use if err == BlockFutureErr { @@ -559,68 +578,67 @@ func (self *ChainManager) InsertChain(chain types.Blocks) (int, error) { continue } - h := block.Header() - - glog.V(logger.Error).Infof("INVALID block #%v (%x)\n", h.Number, h.Hash().Bytes()) - glog.V(logger.Error).Infoln(err) - glog.V(logger.Debug).Infoln(block) + blockErr(block, err) return i, err } - self.mu.Lock() - { - cblock := self.currentBlock - // Write block to database. Eventually we'll have to improve on this and throw away blocks that are - // not in the canonical chain. - self.write(block) - // Compare the TD of the last known block in the canonical chain to make sure it's greater. - // At this point it's possible that a different chain (fork) becomes the new canonical chain. - if block.Td.Cmp(self.td) > 0 { - // chain fork - if block.ParentHash() != cblock.Hash() { - // during split we merge two different chains and create the new canonical chain - self.merge(cblock, block) + cblock := self.currentBlock + // Write block to database. Eventually we'll have to improve on this and throw away blocks that are + // not in the canonical chain. + self.write(block) + // Compare the TD of the last known block in the canonical chain to make sure it's greater. + // At this point it's possible that a different chain (fork) becomes the new canonical chain. + if block.Td.Cmp(self.td) > 0 { + // chain fork + if block.ParentHash() != cblock.Hash() { + // during split we merge two different chains and create the new canonical chain + self.merge(cblock, block) - queue[i] = ChainSplitEvent{block, logs} - queueEvent.splitCount++ - } - - self.setTotalDifficulty(block.Td) - self.insert(block) - - jsonlogger.LogJson(&logger.EthChainNewHead{ - BlockHash: block.Hash().Hex(), - BlockNumber: block.Number(), - ChainHeadHash: cblock.Hash().Hex(), - BlockPrevHash: block.ParentHash().Hex(), - }) - - self.setTransState(state.New(block.Root(), self.stateDb)) - self.txState.SetState(state.New(block.Root(), self.stateDb)) - - queue[i] = ChainEvent{block, block.Hash(), logs} - queueEvent.canonicalCount++ - - if glog.V(logger.Debug) { - glog.Infof("[%v] inserted block #%d (%d TXs %d UNCs) (%x...)\n", time.Now().UnixNano(), block.Number(), len(block.Transactions()), len(block.Uncles()), block.Hash().Bytes()[0:4]) - } - } else { - if glog.V(logger.Detail) { - glog.Infof("inserted forked block #%d (TD=%v) (%d TXs %d UNCs) (%x...)\n", block.Number(), block.Difficulty(), len(block.Transactions()), len(block.Uncles()), block.Hash().Bytes()[0:4]) - } - - queue[i] = ChainSideEvent{block, logs} - queueEvent.sideCount++ + queue[i] = ChainSplitEvent{block, logs} + queueEvent.splitCount++ } - self.futureBlocks.Delete(block.Hash()) + + self.setTotalDifficulty(block.Td) + self.insert(block) + + jsonlogger.LogJson(&logger.EthChainNewHead{ + BlockHash: block.Hash().Hex(), + BlockNumber: block.Number(), + ChainHeadHash: cblock.Hash().Hex(), + BlockPrevHash: block.ParentHash().Hex(), + }) + + self.setTransState(state.New(block.Root(), self.stateDb)) + self.txState.SetState(state.New(block.Root(), self.stateDb)) + + queue[i] = ChainEvent{block, block.Hash(), logs} + queueEvent.canonicalCount++ + + if glog.V(logger.Debug) { + glog.Infof("[%v] inserted block #%d (%d TXs %d UNCs) (%x...)\n", time.Now().UnixNano(), block.Number(), len(block.Transactions()), len(block.Uncles()), block.Hash().Bytes()[0:4]) + } + } else { + if glog.V(logger.Detail) { + glog.Infof("inserted forked block #%d (TD=%v) (%d TXs %d UNCs) (%x...)\n", block.Number(), block.Difficulty(), len(block.Transactions()), len(block.Uncles()), block.Hash().Bytes()[0:4]) + } + + queue[i] = ChainSideEvent{block, logs} + queueEvent.sideCount++ } - self.mu.Unlock() + self.futureBlocks.Delete(block.Hash()) stats.processed++ } + // check and wait for the nonce error channel and + // make sure no nonce error was thrown in the process + err := <-nonceErrCh + if err != nil { + return 0, err + } + if (stats.queued > 0 || stats.processed > 0 || stats.ignored > 0) && bool(glog.V(logger.Info)) { tend := time.Since(tstart) start, end := chain[0], chain[len(chain)-1] @@ -719,3 +737,63 @@ out: } } } + +func blockErr(block *types.Block, err error) { + h := block.Header() + glog.V(logger.Error).Infof("INVALID block #%v (%x)\n", h.Number, h.Hash().Bytes()) + glog.V(logger.Error).Infoln(err) + glog.V(logger.Debug).Infoln(block) +} + +// verifyNonces verifies nonces of the given blocks in parallel and returns +// an error if one of the blocks nonce verifications failed. +func verifyNonces(pow pow.PoW, blocks []*types.Block) error { + // Spawn a few workers. They listen for blocks on the in channel + // and send results on done. The workers will exit in the + // background when in is closed. + var ( + in = make(chan *types.Block) + done = make(chan error, runtime.GOMAXPROCS(0)) + ) + defer close(in) + for i := 0; i < cap(done); i++ { + go verifyNonce(pow, in, done) + } + // Feed blocks to the workers, aborting at the first invalid nonce. + var ( + running, i int + block *types.Block + sendin = in + ) + for i < len(blocks) || running > 0 { + if i == len(blocks) { + // Disable sending to in. + sendin = nil + } else { + block = blocks[i] + i++ + } + select { + case sendin <- block: + running++ + case err := <-done: + running-- + if err != nil { + return err + } + } + } + return nil +} + +// verifyNonce is a worker for the verifyNonces method. It will run until +// in is closed. +func verifyNonce(pow pow.PoW, in <-chan *types.Block, done chan<- error) { + for block := range in { + if !pow.Verify(block) { + done <- ValidationError("Block(#%v) nonce is invalid (= %x)", block.Number(), block.Nonce) + } else { + done <- nil + } + } +} diff --git a/core/chain_manager_test.go b/core/chain_manager_test.go index b5155e223d..7dc7358c05 100644 --- a/core/chain_manager_test.go +++ b/core/chain_manager_test.go @@ -9,11 +9,13 @@ import ( "strconv" "testing" + "github.com/ethereum/ethash" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/pow" "github.com/ethereum/go-ethereum/rlp" ) @@ -21,6 +23,11 @@ func init() { runtime.GOMAXPROCS(runtime.NumCPU()) } +func thePow() pow.PoW { + pow, _ := ethash.NewForTesting() + return pow +} + // Test fork of length N starting from block i func testFork(t *testing.T, bman *BlockProcessor, i, N int, f func(td1, td2 *big.Int)) { // switch databases to process the new chain @@ -259,7 +266,7 @@ func TestChainInsertions(t *testing.T) { } var eventMux event.TypeMux - chainMan := NewChainManager(db, db, &eventMux) + chainMan := NewChainManager(db, db, thePow(), &eventMux) txPool := NewTxPool(&eventMux, chainMan.State, func() *big.Int { return big.NewInt(100000000) }) blockMan := NewBlockProcessor(db, db, nil, txPool, chainMan, &eventMux) chainMan.SetProcessor(blockMan) @@ -305,7 +312,7 @@ func TestChainMultipleInsertions(t *testing.T) { } } var eventMux event.TypeMux - chainMan := NewChainManager(db, db, &eventMux) + chainMan := NewChainManager(db, db, thePow(), &eventMux) txPool := NewTxPool(&eventMux, chainMan.State, func() *big.Int { return big.NewInt(100000000) }) blockMan := NewBlockProcessor(db, db, nil, txPool, chainMan, &eventMux) chainMan.SetProcessor(blockMan) @@ -334,7 +341,7 @@ func TestGetAncestors(t *testing.T) { db, _ := ethdb.NewMemDatabase() var eventMux event.TypeMux - chainMan := NewChainManager(db, db, &eventMux) + chainMan := NewChainManager(db, db, thePow(), &eventMux) chain, err := loadChain("valid1", t) if err != nil { fmt.Println(err) @@ -372,7 +379,7 @@ func makeChainWithDiff(genesis *types.Block, d []int, seed byte) []*types.Block func chm(genesis *types.Block, db common.Database) *ChainManager { var eventMux event.TypeMux - bc := &ChainManager{blockDb: db, stateDb: db, genesisBlock: genesis, eventMux: &eventMux} + bc := &ChainManager{blockDb: db, stateDb: db, genesisBlock: genesis, eventMux: &eventMux, pow: FakePow{}} bc.cache = NewBlockCache(100) bc.futureBlocks = NewBlockCache(100) bc.processor = bproc{} @@ -383,6 +390,7 @@ func chm(genesis *types.Block, db common.Database) *ChainManager { } func TestReorgLongest(t *testing.T) { + t.Skip("skipped while cache is removed") db, _ := ethdb.NewMemDatabase() genesis := GenesisBlock(db) bc := chm(genesis, db) @@ -402,6 +410,7 @@ func TestReorgLongest(t *testing.T) { } func TestReorgShortest(t *testing.T) { + t.Skip("skipped while cache is removed") db, _ := ethdb.NewMemDatabase() genesis := GenesisBlock(db) bc := chm(genesis, db) diff --git a/core/execution.go b/core/execution.go index 9adf98032e..522c904493 100644 --- a/core/execution.go +++ b/core/execution.go @@ -38,6 +38,12 @@ func (self *Execution) Create(caller vm.ContextRef) (ret []byte, err error, acco code := self.input self.input = nil ret, err = self.exec(nil, code, caller) + // Here we get an error if we run into maximum stack depth, + // See: https://github.com/ethereum/yellowpaper/pull/131 + // and YP definitions for CREATE instruction + if err != nil { + return nil, err, nil + } account = self.env.State().GetStateObject(*self.address) return } diff --git a/core/vm/disasm.go b/core/vm/disasm.go new file mode 100644 index 0000000000..858ee684aa --- /dev/null +++ b/core/vm/disasm.go @@ -0,0 +1,21 @@ +package vm + +import "fmt" + +func Disasm(code []byte) []string { + var out []string + for pc := uint64(0); pc < uint64(len(code)); pc++ { + op := OpCode(code[pc]) + out = append(out, op.String()) + + 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 + out = append(out, fmt.Sprintf("0x%x", code[pc+1:pc+1+a])) + + pc += a + } + } + + return out +} diff --git a/core/vm/memory.go b/core/vm/memory.go index b77d486ebb..d20aa95910 100644 --- a/core/vm/memory.go +++ b/core/vm/memory.go @@ -49,6 +49,18 @@ func (self *Memory) Get(offset, size int64) (cpy []byte) { return } +func (self *Memory) GetPtr(offset, size int64) []byte { + if size == 0 { + return nil + } + + if len(self.store) > int(offset) { + return self.store[offset : offset+size] + } + + return nil +} + func (m *Memory) Len() int { return len(m.store) } diff --git a/core/vm/vm.go b/core/vm/vm.go index 927b672936..35fa19d038 100644 --- a/core/vm/vm.go +++ b/core/vm/vm.go @@ -695,7 +695,7 @@ func (self *Vm) Run(context *Context, callData []byte) (ret []byte, err error) { self.Printf("resume %x (%v)", context.Address(), context.Gas) case RETURN: offset, size := stack.pop(), stack.pop() - ret := mem.Get(offset.Int64(), size.Int64()) + ret := mem.GetPtr(offset.Int64(), size.Int64()) self.Printf(" => [%v, %v] (%d) 0x%x", offset, size, len(ret), ret).Endl() diff --git a/eth/backend.go b/eth/backend.go index b81f23cfbd..9334ee7b61 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -15,6 +15,7 @@ import ( "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/bzz" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/compiler" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" @@ -31,6 +32,14 @@ import ( "github.com/ethereum/go-ethereum/whisper" ) +const ( + epochLength = 30000 + ethashRevision = 23 + + autoDAGcheckInterval = 10 * time.Hour + autoDAGepochHeight = epochLength / 2 +) + var ( jsonlogger = logger.NewJsonLogger() @@ -60,6 +69,7 @@ type Config struct { LogJSON string VmDebug bool NatSpec bool + AutoDAG bool MaxPeers int MaxPendingPeers int @@ -81,6 +91,7 @@ type Config struct { GasPrice *big.Int MinerThreads int AccountManager *accounts.Manager + SolcPath string // NewDB is used to create databases. // If nil, the default is to create leveldb databases on disk. @@ -185,6 +196,8 @@ type Ethereum struct { downloader *downloader.Downloader DPA *bzz.DPA netStore *bzz.NetStore + SolcPath string + solc *compiler.Solidity net *p2p.Server eventMux *event.TypeMux @@ -197,6 +210,8 @@ type Ethereum struct { MinerThreads int NatSpec bool DataDir string + AutoDAG bool + autodagquit chan bool etherbase common.Address clientVersion string ethVersionId int @@ -213,7 +228,7 @@ func New(config *Config) (*Ethereum, error) { // Let the database take 3/4 of the max open files (TODO figure out a way to get the actual limit of the open files) const dbCount = 3 - ethdb.OpenFileLimit = 256 / (dbCount + 1) + ethdb.OpenFileLimit = 128 / (dbCount + 1) newdb := config.NewDB if newdb == nil { @@ -268,11 +283,13 @@ func New(config *Config) (*Ethereum, error) { netVersionId: config.NetworkId, NatSpec: config.NatSpec, MinerThreads: config.MinerThreads, + SolcPath: config.SolcPath, + AutoDAG: config.AutoDAG, } - eth.chainManager = core.NewChainManager(blockDb, stateDb, eth.EventMux()) - eth.downloader = downloader.New(eth.EventMux(), eth.chainManager.HasBlock, eth.chainManager.GetBlock) eth.pow = ethash.New() + eth.chainManager = core.NewChainManager(blockDb, stateDb, eth.pow, eth.EventMux()) + eth.downloader = downloader.New(eth.EventMux(), eth.chainManager.HasBlock, eth.chainManager.GetBlock) eth.txPool = core.NewTxPool(eth.EventMux(), eth.chainManager.State, eth.chainManager.GasLimit) eth.blockProcessor = core.NewBlockProcessor(stateDb, extraDb, eth.pow, eth.txPool, eth.chainManager, eth.EventMux()) eth.chainManager.SetProcessor(eth.blockProcessor) @@ -469,6 +486,10 @@ func (s *Ethereum) Start() error { // periodically flush databases go s.syncDatabases() + if s.AutoDAG { + s.StartAutoDAG() + } + // Start services go s.txPool.Start() s.protocolManager.Start() @@ -553,6 +574,7 @@ func (s *Ethereum) Stop() { if s.whisper != nil { s.whisper.Stop() } + s.StopAutoDAG() if s.DPA != nil { s.DPA.Stop() @@ -593,6 +615,77 @@ func (self *Ethereum) syncAccounts(tx *types.Transaction) { } } +// StartAutoDAG() spawns a go routine that checks the DAG every autoDAGcheckInterval +// by default that is 10 times per epoch +// in epoch n, if we past autoDAGepochHeight within-epoch blocks, +// it calls ethash.MakeDAG to pregenerate the DAG for the next epoch n+1 +// if it does not exist yet as well as remove the DAG for epoch n-1 +// the loop quits if autodagquit channel is closed, it can safely restart and +// stop any number of times. +// For any more sophisticated pattern of DAG generation, use CLI subcommand +// makedag +func (self *Ethereum) StartAutoDAG() { + if self.autodagquit != nil { + return // already started + } + go func() { + glog.V(logger.Info).Infof("Automatic pregeneration of ethash DAG ON (ethash dir: %s)", ethash.DefaultDir) + var nextEpoch uint64 + timer := time.After(0) + self.autodagquit = make(chan bool) + for { + select { + case <-timer: + glog.V(logger.Info).Infof("checking DAG (ethash dir: %s)", ethash.DefaultDir) + currentBlock := self.ChainManager().CurrentBlock().NumberU64() + thisEpoch := currentBlock / epochLength + if nextEpoch <= thisEpoch { + if currentBlock%epochLength > autoDAGepochHeight { + if thisEpoch > 0 { + previousDag, previousDagFull := dagFiles(thisEpoch - 1) + os.Remove(filepath.Join(ethash.DefaultDir, previousDag)) + os.Remove(filepath.Join(ethash.DefaultDir, previousDagFull)) + glog.V(logger.Info).Infof("removed DAG for epoch %d (%s)", thisEpoch-1, previousDag) + } + nextEpoch = thisEpoch + 1 + dag, _ := dagFiles(nextEpoch) + if _, err := os.Stat(dag); os.IsNotExist(err) { + glog.V(logger.Info).Infof("Pregenerating DAG for epoch %d (%s)", nextEpoch, dag) + err := ethash.MakeDAG(nextEpoch*epochLength, "") // "" -> ethash.DefaultDir + if err != nil { + glog.V(logger.Error).Infof("Error generating DAG for epoch %d (%s)", nextEpoch, dag) + return + } + } else { + glog.V(logger.Error).Infof("DAG for epoch %d (%s)", nextEpoch, dag) + } + } + } + timer = time.After(autoDAGcheckInterval) + case <-self.autodagquit: + return + } + } + }() +} + +// dagFiles(epoch) returns the two alternative DAG filenames (not a path) +// 1) - 2) full-R- +func dagFiles(epoch uint64) (string, string) { + seedHash, _ := ethash.GetSeedHash(epoch * epochLength) + dag := fmt.Sprintf("full-R%d-%x", ethashRevision, seedHash[:8]) + return dag, "full-R" + dag +} + +// stopAutoDAG stops automatic DAG pregeneration by quitting the loop +func (self *Ethereum) StopAutoDAG() { + if self.autodagquit != nil { + close(self.autodagquit) + self.autodagquit = nil + } + glog.V(logger.Info).Infof("Automatic pregeneration of ethash DAG OFF (ethash dir: %s)", ethash.DefaultDir) +} + func saveProtocolVersion(db common.Database, protov int) { d, _ := db.Get([]byte("ProtocolVersion")) protocolVersion := common.NewValue(d).Uint() @@ -610,3 +703,18 @@ func saveBlockchainVersion(db common.Database, bcVersion int) { db.Put([]byte("BlockchainVersion"), common.NewValue(bcVersion).Bytes()) } } + +func (self *Ethereum) Solc() (*compiler.Solidity, error) { + var err error + if self.solc == nil { + self.solc, err = compiler.New(self.SolcPath) + } + return self.solc, err +} + +// set in js console via admin interface or wrapper from cli flags +func (self *Ethereum) SetSolc(solcPath string) (*compiler.Solidity, error) { + self.SolcPath = solcPath + self.solc = nil + return self.Solc() +} diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index d817b223cc..fd588d2f30 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -15,8 +15,10 @@ import ( ) const ( - maxHashFetch = 512 // Amount of hashes to be fetched per chunk - maxBlockFetch = 128 // Amount of blocks to be fetched per chunk + MinHashFetch = 512 // Minimum amount of hashes to not consider a peer stalling + MaxHashFetch = 2048 // Amount of hashes to be fetched per retrieval request + MaxBlockFetch = 128 // Amount of blocks to be fetched per retrieval request + peerCountTimeout = 12 * time.Second // Amount of time it takes for the peer handler to ignore minDesiredPeerCount hashTTL = 5 * time.Second // Time it takes for a hash request to time out ) @@ -28,10 +30,11 @@ var ( ) var ( - errLowTd = errors.New("peer's TD is too low") + errLowTd = errors.New("peers TD is too low") ErrBusy = errors.New("busy") - errUnknownPeer = errors.New("peer's unknown or unhealthy") + errUnknownPeer = errors.New("peer is unknown or unhealthy") ErrBadPeer = errors.New("action from bad peer ignored") + ErrStallingPeer = errors.New("peer is stalling") errNoPeers = errors.New("no peers to keep download active") ErrPendingQueue = errors.New("pending items in queue") ErrTimeout = errors.New("timeout") @@ -60,13 +63,18 @@ type hashPack struct { hashes []common.Hash } +type crossCheck struct { + expire time.Time + parent common.Hash +} + type Downloader struct { mux *event.TypeMux mu sync.RWMutex - queue *queue // Scheduler for selecting the hashes to download - peers *peerSet // Set of active peers from which download can proceed - checks map[common.Hash]time.Time // Pending cross checks to verify a hash chain + queue *queue // Scheduler for selecting the hashes to download + peers *peerSet // Set of active peers from which download can proceed + checks map[common.Hash]*crossCheck // Pending cross checks to verify a hash chain // Callbacks hasBlock hashCheckFn @@ -157,7 +165,7 @@ func (d *Downloader) Synchronise(id string, hash common.Hash) error { // Reset the queue and peer set to clean any internal leftover state d.queue.Reset() d.peers.Reset() - d.checks = make(map[common.Hash]time.Time) + d.checks = make(map[common.Hash]*crossCheck) // Retrieve the origin peer and initiate the downloading process p := d.peers.Peer(id) @@ -283,15 +291,22 @@ func (d *Downloader) fetchHashes(p *peer, h common.Hash) error { return ErrBadPeer } if !done { + // Check that the peer is not stalling the sync + if len(inserts) < MinHashFetch { + return ErrStallingPeer + } // Try and fetch a random block to verify the hash batch // Skip the last hash as the cross check races with the next hash fetch - if len(inserts) > 1 { - cross := inserts[rand.Intn(len(inserts)-1)] - glog.V(logger.Detail).Infof("Cross checking (%s) with %x", active.id, cross) + cross := rand.Intn(len(inserts) - 1) + origin, parent := inserts[cross], inserts[cross+1] + glog.V(logger.Detail).Infof("Cross checking (%s) with %x/%x", active.id, origin, parent) - d.checks[cross] = time.Now().Add(blockTTL) - active.getBlocks([]common.Hash{cross}) + d.checks[origin] = &crossCheck{ + expire: time.Now().Add(blockTTL), + parent: parent, } + active.getBlocks([]common.Hash{origin}) + // Also fetch a fresh active.getHashes(head) continue @@ -310,8 +325,8 @@ func (d *Downloader) fetchHashes(p *peer, h common.Hash) error { continue } block := blockPack.blocks[0] - if _, ok := d.checks[block.Hash()]; ok { - if !d.queue.Has(block.ParentHash()) { + if check, ok := d.checks[block.Hash()]; ok { + if block.ParentHash() != check.parent { return ErrCrossCheckFailed } delete(d.checks, block.Hash()) @@ -319,8 +334,8 @@ func (d *Downloader) fetchHashes(p *peer, h common.Hash) error { case <-crossTicker.C: // Iterate over all the cross checks and fail the hash chain if they're not verified - for hash, deadline := range d.checks { - if time.Now().After(deadline) { + for hash, check := range d.checks { + if time.Now().After(check.expire) { glog.V(logger.Debug).Infof("Cross check timeout for %x", hash) return ErrCrossCheckFailed } @@ -438,7 +453,7 @@ out: } // Get a possible chunk. If nil is returned no chunk // could be returned due to no hashes available. - request := d.queue.Reserve(peer, maxBlockFetch) + request := d.queue.Reserve(peer, MaxBlockFetch) if request == nil { continue } diff --git a/eth/downloader/downloader_test.go b/eth/downloader/downloader_test.go index 19d64ac67f..8b541d8b79 100644 --- a/eth/downloader/downloader_test.go +++ b/eth/downloader/downloader_test.go @@ -53,6 +53,8 @@ type downloadTester struct { blocks map[common.Hash]*types.Block // Blocks associated with the hashes chain []common.Hash // Block-chain being constructed + maxHashFetch int // Overrides the maximum number of retrieved hashes + t *testing.T pcount int done chan bool @@ -133,8 +135,12 @@ func (dl *downloadTester) getBlock(hash common.Hash) *types.Block { // getHashes retrieves a batch of hashes for reconstructing the chain. func (dl *downloadTester) getHashes(head common.Hash) error { + limit := MaxHashFetch + if dl.maxHashFetch > 0 { + limit = dl.maxHashFetch + } // Gather the next batch of hashes - hashes := make([]common.Hash, 0, maxHashFetch) + hashes := make([]common.Hash, 0, limit) for i, hash := range dl.hashes { if hash == head { i++ @@ -382,7 +388,7 @@ func TestRepeatingHashAttack(t *testing.T) { // Make sure that syncing returns and does so with a failure select { - case <-time.After(100 * time.Millisecond): + case <-time.After(time.Second): t.Fatalf("synchronisation blocked") case err := <-errc: if err == nil { @@ -469,6 +475,23 @@ func TestMadeupHashChainAttack(t *testing.T) { } } +// Tests that if a malicious peer makes up a random hash chain, and tries to push +// indefinitely, one hash at a time, it actually gets caught with it. The reason +// this is separate from the classical made up chain attack is that sending hashes +// one by one prevents reliable block/parent verification. +func TestMadeupHashChainDrippingAttack(t *testing.T) { + // Create a random chain of hashes to drip + hashes := createHashes(0, 16*blockCacheLimit) + tester := newTester(t, hashes, nil) + + // Try and sync with the attacker, one hash at a time + tester.maxHashFetch = 1 + tester.newPeer("attack", big.NewInt(10000), hashes[0]) + if _, err := tester.syncTake("attack", hashes[0]); err != ErrStallingPeer { + t.Fatalf("synchronisation error mismatch: have %v, want %v", err, ErrStallingPeer) + } +} + // Tests that if a malicious peer makes up a random block chain, and tried to // push indefinitely, it actually gets caught with it. func TestMadeupBlockChainAttack(t *testing.T) { @@ -479,7 +502,7 @@ func TestMadeupBlockChainAttack(t *testing.T) { crossCheckCycle = 25 * time.Millisecond // Create a long chain of blocks and simulate an invalid chain by dropping every second - hashes := createHashes(0, 32*blockCacheLimit) + hashes := createHashes(0, 16*blockCacheLimit) blocks := createBlocksFromHashes(hashes) gapped := make([]common.Hash, len(hashes)/2) @@ -502,3 +525,37 @@ func TestMadeupBlockChainAttack(t *testing.T) { t.Fatalf("failed to synchronise blocks: %v", err) } } + +// Advanced form of the above forged blockchain attack, where not only does the +// attacker make up a valid hashes for random blocks, but also forges the block +// parents to point to existing hashes. +func TestMadeupParentBlockChainAttack(t *testing.T) { + defaultBlockTTL := blockTTL + defaultCrossCheckCycle := crossCheckCycle + + blockTTL = 100 * time.Millisecond + crossCheckCycle = 25 * time.Millisecond + + // Create a long chain of blocks and simulate an invalid chain by dropping every second + hashes := createHashes(0, 16*blockCacheLimit) + blocks := createBlocksFromHashes(hashes) + forges := createBlocksFromHashes(hashes) + for hash, block := range forges { + block.ParentHeaderHash = hash // Simulate pointing to already known hash + } + // Try and sync with the malicious node and check that it fails + tester := newTester(t, hashes, forges) + tester.newPeer("attack", big.NewInt(10000), hashes[0]) + if _, err := tester.syncTake("attack", hashes[0]); err != ErrCrossCheckFailed { + t.Fatalf("synchronisation error mismatch: have %v, want %v", err, ErrCrossCheckFailed) + } + // Ensure that a valid chain can still pass sync + blockTTL = defaultBlockTTL + crossCheckCycle = defaultCrossCheckCycle + + tester.blocks = blocks + tester.newPeer("valid", big.NewInt(20000), hashes[0]) + if _, err := tester.syncTake("valid", hashes[0]); err != nil { + t.Fatalf("failed to synchronise blocks: %v", err) + } +} diff --git a/eth/downloader/queue.go b/eth/downloader/queue.go index 13ec9a5209..591a37773d 100644 --- a/eth/downloader/queue.go +++ b/eth/downloader/queue.go @@ -17,7 +17,7 @@ import ( ) const ( - blockCacheLimit = 1024 // Maximum number of blocks to cache before throttling the download + blockCacheLimit = 8 * MaxBlockFetch // Maximum number of blocks to cache before throttling the download ) // fetchRequest is a currently running block retrieval operation. diff --git a/eth/handler.go b/eth/handler.go index b2d7412953..9117a70de0 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -47,9 +47,7 @@ type ProtocolManager struct { txpool txPool chainman *core.ChainManager downloader *downloader.Downloader - - pmu sync.Mutex - peers map[string]*peer + peers *peerSet SubProtocol p2p.Protocol @@ -73,7 +71,7 @@ func NewProtocolManager(protocolVersion, networkId int, mux *event.TypeMux, txpo txpool: txpool, chainman: chainman, downloader: downloader, - peers: make(map[string]*peer), + peers: newPeerSet(), newPeerCh: make(chan *peer, 1), quitSync: make(chan struct{}), } @@ -95,10 +93,14 @@ func NewProtocolManager(protocolVersion, networkId int, mux *event.TypeMux, txpo } func (pm *ProtocolManager) removePeer(peer *peer) { - pm.pmu.Lock() - defer pm.pmu.Unlock() + // Unregister the peer from the downloader pm.downloader.UnregisterPeer(peer.id) - delete(pm.peers, peer.id) + + // Remove the peer from the Ethereum peer set too + glog.V(logger.Detail).Infoln("Removing peer", peer.id) + if err := pm.peers.Unregister(peer.id); err != nil { + glog.V(logger.Error).Infoln("Removal failed:", err) + } } func (pm *ProtocolManager) Start() { @@ -136,31 +138,32 @@ func (pm *ProtocolManager) newPeer(pv, nv int, p *p2p.Peer, rw p2p.MsgReadWriter } func (pm *ProtocolManager) handle(p *peer) error { + // Execute the Ethereum handshake, short circuit if fails if err := p.handleStatus(); err != nil { return err } - pm.pmu.Lock() - pm.peers[p.id] = p - pm.pmu.Unlock() - - pm.downloader.RegisterPeer(p.id, p.recentHash, p.requestHashes, p.requestBlocks) - defer func() { - pm.removePeer(p) - }() + // Register the peer locally and in the downloader too + glog.V(logger.Detail).Infoln("Adding peer", p.id) + if err := pm.peers.Register(p); err != nil { + glog.V(logger.Error).Infoln("Addition failed:", err) + return err + } + defer pm.removePeer(p) + if err := pm.downloader.RegisterPeer(p.id, p.recentHash, p.requestHashes, p.requestBlocks); err != nil { + return err + } // propagate existing transactions. new transactions appearing // after this will be sent via broadcasts. if err := p.sendTransactions(pm.txpool.GetTransactions()); err != nil { return err } - // main loop. handle incoming messages. for { if err := pm.handleMsg(p); err != nil { return err } } - return nil } @@ -203,8 +206,8 @@ func (self *ProtocolManager) handleMsg(p *peer) error { return errResp(ErrDecode, "->msg %v: %v", msg, err) } - if request.Amount > maxHashes { - request.Amount = maxHashes + if request.Amount > downloader.MaxHashFetch { + request.Amount = downloader.MaxHashFetch } hashes := self.chainman.GetBlockHashesFromHash(request.Hash, request.Amount) @@ -251,7 +254,7 @@ func (self *ProtocolManager) handleMsg(p *peer) error { if block != nil { blocks = append(blocks, block) } - if i == maxBlocks { + if i == downloader.MaxBlockFetch { break } } @@ -346,18 +349,8 @@ func (pm *ProtocolManager) verifyTd(peer *peer, request newBlockMsgData) error { // out which peers do not contain the block in their block set and will do a // sqrt(peers) to determine the amount of peers we broadcast to. func (pm *ProtocolManager) BroadcastBlock(hash common.Hash, block *types.Block) { - pm.pmu.Lock() - defer pm.pmu.Unlock() - - // Find peers who don't know anything about the given hash. Peers that - // don't know about the hash will be a candidate for the broadcast loop - var peers []*peer - for _, peer := range pm.peers { - if !peer.blockHashes.Has(hash) { - peers = append(peers, peer) - } - } - // Broadcast block to peer set + // Broadcast block to a batch of peers not knowing about it + peers := pm.peers.PeersWithoutBlock(hash) peers = peers[:int(math.Sqrt(float64(len(peers))))] for _, peer := range peers { peer.sendNewBlock(block) @@ -369,18 +362,8 @@ func (pm *ProtocolManager) BroadcastBlock(hash common.Hash, block *types.Block) // out which peers do not contain the block in their block set and will do a // sqrt(peers) to determine the amount of peers we broadcast to. func (pm *ProtocolManager) BroadcastTx(hash common.Hash, tx *types.Transaction) { - pm.pmu.Lock() - defer pm.pmu.Unlock() - - // Find peers who don't know anything about the given hash. Peers that - // don't know about the hash will be a candidate for the broadcast loop - var peers []*peer - for _, peer := range pm.peers { - if !peer.txHashes.Has(hash) { - peers = append(peers, peer) - } - } - // Broadcast block to peer set + // Broadcast transaction to a batch of peers not knowing about it + peers := pm.peers.PeersWithoutTx(hash) //FIXME include this again: peers = peers[:int(math.Sqrt(float64(len(peers))))] for _, peer := range peers { peer.sendTransaction(tx) diff --git a/eth/peer.go b/eth/peer.go index 861efaaec6..bb6a20349f 100644 --- a/eth/peer.go +++ b/eth/peer.go @@ -1,17 +1,25 @@ package eth import ( + "errors" "fmt" "math/big" + "sync" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/eth/downloader" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/logger/glog" "github.com/ethereum/go-ethereum/p2p" "gopkg.in/fatih/set.v0" ) +var ( + errAlreadyRegistered = errors.New("peer is already registered") + errNotRegistered = errors.New("peer is not registered") +) + type statusMsgData struct { ProtocolVersion uint32 NetworkId uint32 @@ -25,16 +33,6 @@ type getBlockHashesMsgData struct { Amount uint64 } -func getBestPeer(peers map[string]*peer) *peer { - var peer *peer - for _, cp := range peers { - if peer == nil || cp.td.Cmp(peer.td) > 0 { - peer = cp - } - } - return peer -} - type peer struct { *p2p.Peer @@ -103,8 +101,8 @@ func (p *peer) sendTransaction(tx *types.Transaction) error { } func (p *peer) requestHashes(from common.Hash) error { - glog.V(logger.Debug).Infof("[%s] fetching hashes (%d) %x...\n", p.id, maxHashes, from[:4]) - return p2p.Send(p.rw, GetBlockHashesMsg, getBlockHashesMsgData{from, maxHashes}) + glog.V(logger.Debug).Infof("[%s] fetching hashes (%d) %x...\n", p.id, downloader.MaxHashFetch, from[:4]) + return p2p.Send(p.rw, GetBlockHashesMsg, getBlockHashesMsgData{from, downloader.MaxHashFetch}) } func (p *peer) requestBlocks(hashes []common.Hash) error { @@ -159,3 +157,103 @@ func (p *peer) handleStatus() error { return <-errc } + +// peerSet represents the collection of active peers currently participating in +// the Ethereum sub-protocol. +type peerSet struct { + peers map[string]*peer + lock sync.RWMutex +} + +// newPeerSet creates a new peer set to track the active participants. +func newPeerSet() *peerSet { + return &peerSet{ + peers: make(map[string]*peer), + } +} + +// Register injects a new peer into the working set, or returns an error if the +// peer is already known. +func (ps *peerSet) Register(p *peer) error { + ps.lock.Lock() + defer ps.lock.Unlock() + + if _, ok := ps.peers[p.id]; ok { + return errAlreadyRegistered + } + ps.peers[p.id] = p + return nil +} + +// Unregister removes a remote peer from the active set, disabling any further +// actions to/from that particular entity. +func (ps *peerSet) Unregister(id string) error { + ps.lock.Lock() + defer ps.lock.Unlock() + + if _, ok := ps.peers[id]; !ok { + return errNotRegistered + } + delete(ps.peers, id) + return nil +} + +// Peer retrieves the registered peer with the given id. +func (ps *peerSet) Peer(id string) *peer { + ps.lock.RLock() + defer ps.lock.RUnlock() + + return ps.peers[id] +} + +// Len returns if the current number of peers in the set. +func (ps *peerSet) Len() int { + ps.lock.RLock() + defer ps.lock.RUnlock() + + return len(ps.peers) +} + +// PeersWithoutBlock retrieves a list of peers that do not have a given block in +// their set of known hashes. +func (ps *peerSet) PeersWithoutBlock(hash common.Hash) []*peer { + ps.lock.RLock() + defer ps.lock.RUnlock() + + list := make([]*peer, 0, len(ps.peers)) + for _, p := range ps.peers { + if !p.blockHashes.Has(hash) { + list = append(list, p) + } + } + return list +} + +// PeersWithoutTx retrieves a list of peers that do not have a given transaction +// in their set of known hashes. +func (ps *peerSet) PeersWithoutTx(hash common.Hash) []*peer { + ps.lock.RLock() + defer ps.lock.RUnlock() + + list := make([]*peer, 0, len(ps.peers)) + for _, p := range ps.peers { + if !p.txHashes.Has(hash) { + list = append(list, p) + } + } + return list +} + +// BestPeer retrieves the known peer with the currently highest total difficulty. +func (ps *peerSet) BestPeer() *peer { + ps.lock.RLock() + defer ps.lock.RUnlock() + + var best *peer + for _, p := range ps.peers { + if best == nil || p.td.Cmp(best.td) > 0 { + best = p + } + } + return best +} diff --git a/eth/protocol.go b/eth/protocol.go index 92646f5762..ff3c3cbfdc 100644 --- a/eth/protocol.go +++ b/eth/protocol.go @@ -12,8 +12,6 @@ const ( NetworkId = 100 ProtocolLength = uint64(8) ProtocolMaxMsgSize = 10 * 1024 * 1024 - maxHashes = 512 - maxBlocks = 128 ) // eth protocol message codes diff --git a/eth/sync.go b/eth/sync.go index aa7ebc77b8..62d08acb68 100644 --- a/eth/sync.go +++ b/eth/sync.go @@ -10,8 +10,8 @@ import ( "github.com/ethereum/go-ethereum/logger/glog" ) -// Sync contains all synchronisation code for the eth protocol - +// update periodically tries to synchronise with the network, both downloading +// hashes and blocks as well as retrieving cached ones. func (pm *ProtocolManager) update() { forceSync := time.Tick(forceSyncCycle) blockProc := time.Tick(blockProcCycle) @@ -20,22 +20,16 @@ func (pm *ProtocolManager) update() { for { select { case <-pm.newPeerCh: - // Meet the `minDesiredPeerCount` before we select our best peer - if len(pm.peers) < minDesiredPeerCount { + // Make sure we have peers to select from, then sync + if pm.peers.Len() < minDesiredPeerCount { break } - // Find the best peer and synchronise with it - peer := getBestPeer(pm.peers) - if peer == nil { - glog.V(logger.Debug).Infoln("Sync attempt canceled. No peers available") - } - go pm.synchronise(peer) + go pm.synchronise(pm.peers.BestPeer()) case <-forceSync: // Force a sync even if not enough peers are present - if peer := getBestPeer(pm.peers); peer != nil { - go pm.synchronise(peer) - } + go pm.synchronise(pm.peers.BestPeer()) + case <-blockProc: // Try to pull some blocks from the downloaded if atomic.CompareAndSwapInt32(&blockProcPend, 0, 1) { @@ -51,10 +45,9 @@ func (pm *ProtocolManager) update() { } } -// processBlocks will attempt to reconstruct a chain by checking the first item and check if it's -// a known parent. The first block in the chain may be unknown during downloading. When the -// downloader isn't downloading blocks will be dropped with an unknown parent until either it -// has depleted the list or found a known parent. +// processBlocks retrieves downloaded blocks from the download cache and tries +// to construct the local block chain with it. Note, since the block retrieval +// order matters, access to this function *must* be synchronized/serialized. func (pm *ProtocolManager) processBlocks() error { pm.wg.Add(1) defer pm.wg.Done() @@ -79,15 +72,24 @@ func (pm *ProtocolManager) processBlocks() error { return nil } +// synchronise tries to sync up our local block chain with a remote peer, both +// adding various sanity checks as well as wrapping it with various log entries. func (pm *ProtocolManager) synchronise(peer *peer) { + // Short circuit if no peers are available + if peer == nil { + glog.V(logger.Debug).Infoln("Synchronisation canceled: no peers available") + return + } // Make sure the peer's TD is higher than our own. If not drop. if peer.td.Cmp(pm.chainman.Td()) <= 0 { + glog.V(logger.Debug).Infoln("Synchronisation canceled: peer TD too small") return } // FIXME if we have the hash in our chain and the TD of the peer is // much higher than ours, something is wrong with us or the peer. // Check if the hash is on our own chain if pm.chainman.HasBlock(peer.recentHash) { + glog.V(logger.Debug).Infoln("Synchronisation canceled: head already known") return } // Get the hashes from the peer (synchronously) diff --git a/ethdb/database.go b/ethdb/database.go index 3937234829..04ea427053 100644 --- a/ethdb/database.go +++ b/ethdb/database.go @@ -7,6 +7,7 @@ import ( "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/logger/glog" "github.com/syndtr/goleveldb/leveldb" + "github.com/syndtr/goleveldb/leveldb/errors" "github.com/syndtr/goleveldb/leveldb/iterator" "github.com/syndtr/goleveldb/leveldb/opt" ) @@ -24,9 +25,17 @@ type LDBDatabase struct { quit chan struct{} } +// NewLDBDatabase returns a LevelDB wrapped object. LDBDatabase does not persist data by +// it self but requires a background poller which syncs every X. `Flush` should be called +// when data needs to be stored and written to disk. func NewLDBDatabase(file string) (*LDBDatabase, error) { // Open the db db, err := leveldb.OpenFile(file, &opt.Options{OpenFilesCacheCapacity: OpenFileLimit}) + // check for curruption and attempt to recover + if _, iscorrupted := err.(*errors.ErrCorrupted); iscorrupted { + db, err = leveldb.RecoverFile(file, nil) + } + // (re) check for errors and abort if opening of the db failed if err != nil { return nil, err } @@ -44,21 +53,15 @@ func (self *LDBDatabase) makeQueue() { self.queue = make(map[string][]byte) } +// Put puts the given key / value to the queue func (self *LDBDatabase) Put(key []byte, value []byte) { self.mu.Lock() defer self.mu.Unlock() self.queue[string(key)] = value - /* - value = rle.Compress(value) - - err := self.db.Put(key, value, nil) - if err != nil { - fmt.Println("Error put", err) - } - */ } +// Get returns the given key if it's present. func (self *LDBDatabase) Get(key []byte) ([]byte, error) { self.mu.Lock() defer self.mu.Unlock() @@ -76,6 +79,7 @@ func (self *LDBDatabase) Get(key []byte) ([]byte, error) { return rle.Decompress(dat) } +// Delete deletes the key from the queue and database func (self *LDBDatabase) Delete(key []byte) error { self.mu.Lock() defer self.mu.Unlock() @@ -100,6 +104,7 @@ func (self *LDBDatabase) NewIterator() iterator.Iterator { return self.db.NewIterator(nil, nil) } +// Flush flushes out the queue to leveldb func (self *LDBDatabase) Flush() error { self.mu.Lock() defer self.mu.Unlock() diff --git a/jsre/ethereum_js.go b/jsre/ethereum_js.go index a61ffcbbf4..6c0ae33d7b 100644 --- a/jsre/ethereum_js.go +++ b/jsre/ethereum_js.go @@ -1,7 +1,6 @@ package jsre -const Ethereum_JS = ` -require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o. */ -/** - * @file abi.js - * @author Marek Kotewicz - * @author Gav Wood - * @date 2014 - */ - -var utils = require('../utils/utils'); -var coder = require('./coder'); -var solUtils = require('./utils'); - /** - * Formats input params to bytes - * - * @method formatInput - * @param {Array} abi inputs of method - * @param {Array} params that will be formatted to bytes - * @returns bytes representation of input params - */ -var formatInput = function (inputs, params) { - var i = inputs.map(function (input) { - return input.type; - }); - return coder.encodeParams(i, params); -}; - -/** - * Formats output bytes back to param list - * - * @method formatOutput - * @param {Array} abi outputs of method - * @param {String} bytes represention of output - * @returns {Array} output params - */ -var formatOutput = function (outs, bytes) { - var o = outs.map(function (out) { - return out.type; - }); - - return coder.decodeParams(o, bytes); -}; - -/** - * Should be called to create input parser for contract with given abi - * - * @method inputParser - * @param {Array} contract abi - * @returns {Object} input parser object for given json abi - * TODO: refactor creating the parser, do not double logic from contract - */ -var inputParser = function (json) { - var parser = {}; - json.forEach(function (method) { - var displayName = utils.extractDisplayName(method.name); - var typeName = utils.extractTypeName(method.name); - - var impl = function () { - var params = Array.prototype.slice.call(arguments); - return formatInput(method.inputs, params); - }; - - if (parser[displayName] === undefined) { - parser[displayName] = impl; - } - - parser[displayName][typeName] = impl; - }); - - return parser; -}; - -/** - * Should be called to create output parser for contract with given abi - * - * @method outputParser - * @param {Array} contract abi - * @returns {Object} output parser for given json abi - */ -var outputParser = function (json) { - var parser = {}; - json.forEach(function (method) { - - var displayName = utils.extractDisplayName(method.name); - var typeName = utils.extractTypeName(method.name); - - var impl = function (output) { - return formatOutput(method.outputs, output); - }; - - if (parser[displayName] === undefined) { - parser[displayName] = impl; - } - - parser[displayName][typeName] = impl; - }); - - return parser; -}; - -var formatConstructorParams = function (abi, params) { - var constructor = solUtils.getConstructor(abi, params.length); - if (!constructor) { - if (params.length > 0) { - console.warn("didn't found matching constructor, using default one"); - } - return ''; - } - return formatInput(constructor.inputs, params); -}; - -module.exports = { - inputParser: inputParser, - outputParser: outputParser, - formatInput: formatInput, - formatOutput: formatOutput, - formatConstructorParams: formatConstructorParams -}; - -},{"../utils/utils":8,"./coder":2,"./utils":5}],2:[function(require,module,exports){ -/* - This file is part of ethereum.js. - - ethereum.js 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. - - ethereum.js is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with ethereum.js. If not, see . -*/ -/** * @file coder.js * @author Marek Kotewicz * @date 2015 @@ -208,7 +72,7 @@ SolidityType.prototype.isType = function (name) { * @method formatInput * @param {Object} param - plain object, or an array of objects * @param {Bool} arrayType - true if a param should be encoded as an array - * @return {SolidityParam} encoded param wrapped in SolidityParam object + * @return {SolidityParam} encoded param wrapped in SolidityParam object */ SolidityType.prototype.formatInput = function (param, arrayType) { if (utils.isArray(param) && arrayType) { // TODO: should fail if this two are not the same @@ -216,10 +80,9 @@ SolidityType.prototype.formatInput = function (param, arrayType) { return param.map(function (p) { return self._inputFormatter(p); }).reduce(function (acc, current) { - acc.appendArrayElement(current); - return acc; - }, new SolidityParam(f.formatInputInt(param.length).value)); - } + return acc.combine(current); + }, f.formatInputInt(param.length)).withOffset(32); + } return this._inputFormatter(param); }; @@ -233,11 +96,11 @@ SolidityType.prototype.formatInput = function (param, arrayType) { */ SolidityType.prototype.formatOutput = function (param, arrayType) { if (arrayType) { - // let's assume, that we solidity will never return long arrays :P + // let's assume, that we solidity will never return long arrays :P var result = []; - var length = new BigNumber(param.value, 16); + var length = new BigNumber(param.dynamicPart().slice(0, 64), 16); for (var i = 0; i < length * 64; i += 64) { - result.push(this._outputFormatter(new SolidityParam(param.suffix.slice(i, i + 64)))); + result.push(this._outputFormatter(new SolidityParam(param.dynamicPart().substr(i + 64, 64)))); } return result; } @@ -245,31 +108,21 @@ SolidityType.prototype.formatOutput = function (param, arrayType) { }; /** - * Should be used to check if a type is variadic + * Should be used to slice single param from bytes * - * @method isVariadicType + * @method sliceParam + * @param {String} bytes + * @param {Number} index of param to slice * @param {String} type - * @returns {Bool} true if the type is variadic + * @returns {SolidityParam} param */ -SolidityType.prototype.isVariadicType = function (type) { - return isArrayType(type) || this._mode === 'bytes'; -}; - -/** - * Should be used to shift param from params group - * - * @method shiftParam - * @param {String} type - * @returns {SolidityParam} shifted param - */ -SolidityType.prototype.shiftParam = function (type, param) { +SolidityType.prototype.sliceParam = function (bytes, index, type) { if (this._mode === 'bytes') { - return param.shiftBytes(); + return SolidityParam.decodeBytes(bytes, index); } else if (isArrayType(type)) { - var length = new BigNumber(param.value.slice(0, 64), 16); - return param.shiftArray(length); + return SolidityParam.decodeArray(bytes, index); } - return param.shiftValue(); + return SolidityParam.decodeParam(bytes, index); }; /** @@ -284,7 +137,7 @@ var SolidityCoder = function (types) { * * @method _requireType * @param {String} type - * @returns {SolidityType} + * @returns {SolidityType} * @throws {Error} throws if no matching type is found */ SolidityCoder.prototype._requireType = function (type) { @@ -299,20 +152,6 @@ SolidityCoder.prototype._requireType = function (type) { return solidityType; }; -/** - * Should be used to transform plain bytes to SolidityParam object - * - * @method _bytesToParam - * @param {Array} types of params - * @param {String} bytes to be transformed to SolidityParam - * @return {SolidityParam} SolidityParam for this group of params - */ -SolidityCoder.prototype._bytesToParam = function (types, bytes) { - var value = bytes.slice(0, types.length * 64); - var suffix = bytes.slice(types.length * 64); - return new SolidityParam(value, suffix); -}; - /** * Should be used to transform plain param of given type to SolidityParam * @@ -347,24 +186,11 @@ SolidityCoder.prototype.encodeParam = function (type, param) { */ SolidityCoder.prototype.encodeParams = function (types, params) { var self = this; - return types.map(function (type, index) { + var solidityParams = types.map(function (type, index) { return self._formatInput(type, params[index]); - }).reduce(function (acc, solidityParam) { - acc.append(solidityParam); - return acc; - }, new SolidityParam()).encode(); -}; + }); -/** - * Should be used to transform SolidityParam to plain param - * - * @method _formatOutput - * @param {String} type - * @param {SolidityParam} param - * @return {Object} plain param - */ -SolidityCoder.prototype._formatOutput = function (type, param) { - return this._requireType(type).formatOutput(param, isArrayType(type)); + return SolidityParam.encodeList(solidityParams); }; /** @@ -376,7 +202,7 @@ SolidityCoder.prototype._formatOutput = function (type, param) { * @return {Object} plain param */ SolidityCoder.prototype.decodeParam = function (type, bytes) { - return this._formatOutput(type, this._bytesToParam([type], bytes)); + return this.decodeParams([type], bytes)[0]; }; /** @@ -389,10 +215,9 @@ SolidityCoder.prototype.decodeParam = function (type, bytes) { */ SolidityCoder.prototype.decodeParams = function (types, bytes) { var self = this; - var param = this._bytesToParam(types, bytes); - return types.map(function (type) { + return types.map(function (type, index) { var solidityType = self._requireType(type); - var p = solidityType.shiftParam(type, param); + var p = solidityType.sliceParam(bytes, index, type); return solidityType.formatOutput(p, isArrayType(type)); }); }; @@ -459,7 +284,7 @@ var coder = new SolidityCoder([ module.exports = coder; -},{"../utils/utils":8,"./formatters":3,"./param":4,"bignumber.js":"bignumber.js"}],3:[function(require,module,exports){ +},{"../utils/utils":7,"./formatters":2,"./param":3,"bignumber.js":"bignumber.js"}],2:[function(require,module,exports){ /* This file is part of ethereum.js. @@ -476,7 +301,7 @@ module.exports = coder; You should have received a copy of the GNU Lesser General Public License along with ethereum.js. If not, see . */ -/** +/** * @file formatters.js * @author Marek Kotewicz * @date 2015 @@ -525,7 +350,7 @@ var formatInputBytes = function (value) { */ var formatInputDynamicBytes = function (value) { var result = utils.fromAscii(value, c.ETH_PADDING).substr(2); - return new SolidityParam(formatInputInt(value.length).value, result); + return new SolidityParam(formatInputInt(value.length).value + result, 32); }; /** @@ -571,7 +396,7 @@ var signedIsNegative = function (value) { * @returns {BigNumber} right-aligned output bytes formatted to big number */ var formatOutputInt = function (param) { - var value = param.value || "0"; + var value = param.staticPart() || "0"; // check if it's negative number // it it is, return two's complement @@ -589,7 +414,7 @@ var formatOutputInt = function (param) { * @returns {BigNumeber} right-aligned output bytes formatted to uint */ var formatOutputUInt = function (param) { - var value = param.value || "0"; + var value = param.staticPart() || "0"; return new BigNumber(value, 16); }; @@ -601,7 +426,7 @@ var formatOutputUInt = function (param) { * @returns {BigNumber} input bytes formatted to real */ var formatOutputReal = function (param) { - return formatOutputInt(param).dividedBy(new BigNumber(2).pow(128)); + return formatOutputInt(param).dividedBy(new BigNumber(2).pow(128)); }; /** @@ -612,7 +437,7 @@ var formatOutputReal = function (param) { * @returns {BigNumber} input bytes formatted to ureal */ var formatOutputUReal = function (param) { - return formatOutputUInt(param).dividedBy(new BigNumber(2).pow(128)); + return formatOutputUInt(param).dividedBy(new BigNumber(2).pow(128)); }; /** @@ -623,7 +448,7 @@ var formatOutputUReal = function (param) { * @returns {Boolean} right-aligned input bytes formatted to bool */ var formatOutputBool = function (param) { - return param.value === '0000000000000000000000000000000000000000000000000000000000000001' ? true : false; + return param.staticPart() === '0000000000000000000000000000000000000000000000000000000000000001' ? true : false; }; /** @@ -635,7 +460,7 @@ var formatOutputBool = function (param) { */ var formatOutputBytes = function (param) { // length might also be important! - return utils.toAscii(param.value); + return utils.toAscii(param.staticPart()); }; /** @@ -647,7 +472,7 @@ var formatOutputBytes = function (param) { */ var formatOutputDynamicBytes = function (param) { // length might also be important! - return utils.toAscii(param.suffix); + return utils.toAscii(param.dynamicPart().slice(64)); }; /** @@ -658,7 +483,7 @@ var formatOutputDynamicBytes = function (param) { * @returns {String} address */ var formatOutputAddress = function (param) { - var value = param.value; + var value = param.staticPart(); return "0x" + value.slice(value.length - 40, value.length); }; @@ -679,7 +504,7 @@ module.exports = { }; -},{"../utils/config":7,"../utils/utils":8,"./param":4,"bignumber.js":"bignumber.js"}],4:[function(require,module,exports){ +},{"../utils/config":5,"../utils/utils":7,"./param":3,"bignumber.js":"bignumber.js"}],3:[function(require,module,exports){ /* This file is part of ethereum.js. @@ -696,136 +521,202 @@ module.exports = { You should have received a copy of the GNU Lesser General Public License along with ethereum.js. If not, see . */ -/** +/** * @file param.js * @author Marek Kotewicz * @date 2015 */ +var utils = require('../utils/utils'); + /** * SolidityParam object prototype. * Should be used when encoding, decoding solidity bytes */ -var SolidityParam = function (value, suffix) { +var SolidityParam = function (value, offset) { this.value = value || ''; - this.suffix = suffix || ''; + this.offset = offset; // offset in bytes }; /** - * This method should be used to encode two params one after another + * This method should be used to get length of params's dynamic part * - * @method append - * @param {SolidityParam} param that it appended after this + * @method dynamicPartLength + * @returns {Number} length of dynamic part (in bytes) */ -SolidityParam.prototype.append = function (param) { - this.value += param.value; - this.suffix += param.suffix; +SolidityParam.prototype.dynamicPartLength = function () { + return this.dynamicPart().length / 2; }; /** - * This method should be used to encode next param in an array + * This method should be used to create copy of solidity param with different offset * - * @method appendArrayElement - * @param {SolidityParam} param that is appended to an array + * @method withOffset + * @param {Number} offset length in bytes + * @returns {SolidityParam} new solidity param with applied offset */ -SolidityParam.prototype.appendArrayElement = function (param) { - this.suffix += param.value; - //this.suffix += param.suffix; // we do not support nested dynamic types +SolidityParam.prototype.withOffset = function (offset) { + return new SolidityParam(this.value, offset); }; /** - * This method should be used to create bytearrays from param + * This method should be used to combine solidity params together + * eg. when appending an array + * + * @method combine + * @param {SolidityParam} param with which we should combine + * @param {SolidityParam} result of combination + */ +SolidityParam.prototype.combine = function (param) { + return new SolidityParam(this.value + param.value); +}; + +/** + * This method should be called to check if param has dynamic size. + * If it has, it returns true, otherwise false + * + * @method isDynamic + * @returns {Boolean} + */ +SolidityParam.prototype.isDynamic = function () { + return this.value.length > 64; +}; + +/** + * This method should be called to transform offset to bytes + * + * @method offsetAsBytes + * @returns {String} bytes representation of offset + */ +SolidityParam.prototype.offsetAsBytes = function () { + return !this.isDynamic() ? '' : utils.padLeft(utils.toTwosComplement(this.offset).toString(16), 64); +}; + +/** + * This method should be called to get static part of param + * + * @method staticPart + * @returns {String} offset if it is a dynamic param, otherwise value + */ +SolidityParam.prototype.staticPart = function () { + if (!this.isDynamic()) { + return this.value; + } + return this.offsetAsBytes(); +}; + +/** + * This method should be called to get dynamic part of param + * + * @method dynamicPart + * @returns {String} returns a value if it is a dynamic param, otherwise empty string + */ +SolidityParam.prototype.dynamicPart = function () { + return this.isDynamic() ? this.value : ''; +}; + +/** + * This method should be called to encode param * * @method encode - * @return {String} encoded param(s) + * @returns {String} */ SolidityParam.prototype.encode = function () { - return this.value + this.suffix; + return this.staticPart() + this.dynamicPart(); }; /** - * This method should be used to shift first param from group of params + * This method should be called to encode array of params * - * @method shiftValue - * @return {SolidityParam} first value param + * @method encodeList + * @param {Array[SolidityParam]} params + * @returns {String} */ -SolidityParam.prototype.shiftValue = function () { - var value = this.value.slice(0, 64); - this.value = this.value.slice(64); - return new SolidityParam(value); +SolidityParam.encodeList = function (params) { + + // updating offsets + var totalOffset = params.length * 32; + var offsetParams = params.map(function (param) { + if (!param.isDynamic()) { + return param; + } + var offset = totalOffset; + totalOffset += param.dynamicPartLength(); + return param.withOffset(offset); + }); + + // encode everything! + return offsetParams.reduce(function (result, param) { + return result + param.dynamicPart(); + }, offsetParams.reduce(function (result, param) { + return result + param.staticPart(); + }, '')); }; /** - * This method should be used to first bytes param from group of params + * This method should be used to decode plain (static) solidity param at given index * - * @method shiftBytes - * @return {SolidityParam} first bytes param + * @method decodeParam + * @param {String} bytes + * @param {Number} index + * @returns {SolidityParam} */ -SolidityParam.prototype.shiftBytes = function () { - return this.shiftArray(1); +SolidityParam.decodeParam = function (bytes, index) { + index = index || 0; + return new SolidityParam(bytes.substr(index * 64, 64)); }; /** - * This method should be used to shift an array from group of params - * - * @method shiftArray - * @param {Number} size of an array to shift - * @return {SolidityParam} first array param + * This method should be called to get offset value from bytes at given index + * + * @method getOffset + * @param {String} bytes + * @param {Number} index + * @returns {Number} offset as number */ -SolidityParam.prototype.shiftArray = function (length) { - var value = this.value.slice(0, 64); - this.value = this.value.slice(64); - var suffix = this.suffix.slice(0, 64 * length); - this.suffix = this.suffix.slice(64 * length); - return new SolidityParam(value, suffix); +var getOffset = function (bytes, index) { + // we can do this cause offset is rather small + return parseInt('0x' + bytes.substr(index * 64, 64)); +}; + +/** + * This method should be called to decode solidity bytes param at given index + * + * @method decodeBytes + * @param {String} bytes + * @param {Number} index + * @returns {SolidityParam} + */ +SolidityParam.decodeBytes = function (bytes, index) { + index = index || 0; + //TODO add support for strings longer than 32 bytes + //var length = parseInt('0x' + bytes.substr(offset * 64, 64)); + + var offset = getOffset(bytes, index); + + // 2 * , cause we also parse length + return new SolidityParam(bytes.substr(offset * 2, 2 * 64)); +}; + +/** + * This method should be used to decode solidity array at given index + * + * @method decodeArray + * @param {String} bytes + * @param {Number} index + * @returns {SolidityParam} + */ +SolidityParam.decodeArray = function (bytes, index) { + index = index || 0; + var offset = getOffset(bytes, index); + var length = parseInt('0x' + bytes.substr(offset * 2, 64)); + return new SolidityParam(bytes.substr(offset * 2, (length + 1) * 64)); }; module.exports = SolidityParam; -},{}],5:[function(require,module,exports){ -/* - This file is part of ethereum.js. - - ethereum.js 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. - - ethereum.js is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with ethereum.js. If not, see . -*/ -/** - * @file utils.js - * @author Marek Kotewicz - * @date 2015 - */ - -/** - * Returns the contstructor with matching number of arguments - * - * @method getConstructor - * @param {Array} abi - * @param {Number} numberOfArgs - * @returns {Object} constructor function abi - */ -var getConstructor = function (abi, numberOfArgs) { - return abi.filter(function (f) { - return f.type === 'constructor' && f.inputs.length === numberOfArgs; - })[0]; -}; - -module.exports = { - getConstructor: getConstructor -}; - - -},{}],6:[function(require,module,exports){ +},{"../utils/utils":7}],4:[function(require,module,exports){ 'use strict'; // go env doesn't have and need XMLHttpRequest @@ -836,7 +727,7 @@ if (typeof XMLHttpRequest === 'undefined') { } -},{}],7:[function(require,module,exports){ +},{}],5:[function(require,module,exports){ /* This file is part of ethereum.js. @@ -861,13 +752,13 @@ if (typeof XMLHttpRequest === 'undefined') { /** * Utils - * + * * @module utils */ /** * Utility functions - * + * * @class [utils] config * @constructor */ @@ -875,26 +766,26 @@ if (typeof XMLHttpRequest === 'undefined') { /// required to define ETH_BIGNUMBER_ROUNDING_MODE var BigNumber = require('bignumber.js'); -var ETH_UNITS = [ - 'wei', - 'Kwei', - 'Mwei', - 'Gwei', - 'szabo', - 'finney', - 'ether', - 'grand', - 'Mether', - 'Gether', - 'Tether', - 'Pether', - 'Eether', - 'Zether', - 'Yether', - 'Nether', - 'Dether', - 'Vether', - 'Uether' +var ETH_UNITS = [ + 'wei', + 'Kwei', + 'Mwei', + 'Gwei', + 'szabo', + 'finney', + 'ether', + 'grand', + 'Mether', + 'Gether', + 'Tether', + 'Pether', + 'Eether', + 'Zether', + 'Yether', + 'Nether', + 'Dether', + 'Vether', + 'Uether' ]; module.exports = { @@ -908,7 +799,7 @@ module.exports = { }; -},{"bignumber.js":"bignumber.js"}],8:[function(require,module,exports){ +},{"bignumber.js":"bignumber.js"}],6:[function(require,module,exports){ /* This file is part of ethereum.js. @@ -925,7 +816,39 @@ module.exports = { You should have received a copy of the GNU Lesser General Public License along with ethereum.js. If not, see . */ -/** +/** + * @file sha3.js + * @author Marek Kotewicz + * @date 2015 + */ + +var sha3 = require('crypto-js/sha3'); + +module.exports = function (str) { + return sha3(str, { + outputLength: 256 + }).toString(); +}; + + +},{"crypto-js/sha3":30}],7:[function(require,module,exports){ +/* + This file is part of ethereum.js. + + ethereum.js 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. + + ethereum.js is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with ethereum.js. If not, see . +*/ +/** * @file utils.js * @author Marek Kotewicz * @date 2015 @@ -933,13 +856,13 @@ module.exports = { /** * Utils - * + * * @module utils */ /** * Utility functions - * + * * @class [utils] utils * @constructor */ @@ -978,7 +901,7 @@ var padLeft = function (string, chars, sign) { return new Array(chars - string.length + 1).join(sign ? sign : "0") + string; }; -/** +/** * Should be called to get sting from it's hex representation * * @method toAscii @@ -1003,9 +926,9 @@ var toAscii = function(hex) { return str; }; - + /** - * Shold be called to get hex representation (prefixed by 0x) of ascii string + * Shold be called to get hex representation (prefixed by 0x) of ascii string * * @method toHexNative * @param {String} string @@ -1022,7 +945,7 @@ var toHexNative = function(str) { }; /** - * Shold be called to get hex representation (prefixed by 0x) of ascii string + * Shold be called to get hex representation (prefixed by 0x) of ascii string * * @method fromAscii * @param {String} string @@ -1055,13 +978,13 @@ var transformToFullName = function (json) { /** * Should be called to get display name of contract function - * + * * @method extractDisplayName * @param {String} name of function/event * @returns {String} display name for function/event eg. multiply(uint256) -> multiply */ var extractDisplayName = function (name) { - var length = name.indexOf('('); + var length = name.indexOf('('); return length !== -1 ? name.substr(0, length) : name; }; @@ -1169,7 +1092,7 @@ var getValueOfUnit = function (unit) { var fromWei = function(number, unit) { var returnValue = toBigNumber(number).dividedBy(getValueOfUnit(unit)); - return isBigNumber(number) ? returnValue : returnValue.toString(10); + return isBigNumber(number) ? returnValue : returnValue.toString(10); }; /** @@ -1195,7 +1118,7 @@ var fromWei = function(number, unit) { var toWei = function(number, unit) { var returnValue = toBigNumber(number).times(getValueOfUnit(unit)); - return isBigNumber(number) ? returnValue : returnValue.toString(10); + return isBigNumber(number) ? returnValue : returnValue.toString(10); }; /** @@ -1214,7 +1137,7 @@ var toBigNumber = function(number) { if (isString(number) && (number.indexOf('0x') === 0 || number.indexOf('-0x') === 0)) { return new BigNumber(number.replace('0x',''), 16); } - + return new BigNumber(number.toString(10), 10); }; @@ -1266,7 +1189,7 @@ var toAddress = function (address) { if (isStrictAddress(address)) { return address; } - + if (/^[0-9a-f]{40}$/.test(address)) { return '0x' + address; } @@ -1274,12 +1197,13 @@ var toAddress = function (address) { return '0x' + padLeft(toHex(address).substr(2), 40); }; + /** * Returns true if object is BigNumber, otherwise false * * @method isBigNumber * @param {Object} - * @return {Boolean} + * @return {Boolean} */ var isBigNumber = function (object) { return object instanceof BigNumber || @@ -1288,7 +1212,7 @@ var isBigNumber = function (object) { /** * Returns true if object is string, otherwise false - * + * * @method isString * @param {Object} * @return {Boolean} @@ -1339,12 +1263,12 @@ var isBoolean = function (object) { * @return {Boolean} */ var isArray = function (object) { - return object instanceof Array; + return object instanceof Array; }; /** * Returns true if given string is valid json object - * + * * @method isJson * @param {String} * @return {Boolean} @@ -1384,12 +1308,12 @@ module.exports = { }; -},{"bignumber.js":"bignumber.js"}],9:[function(require,module,exports){ +},{"bignumber.js":"bignumber.js"}],8:[function(require,module,exports){ module.exports={ - "version": "0.3.5" + "version": "0.4.2" } -},{}],10:[function(require,module,exports){ +},{}],9:[function(require,module,exports){ /* This file is part of ethereum.js. @@ -1427,16 +1351,9 @@ var utils = require('./utils/utils'); var formatters = require('./web3/formatters'); var RequestManager = require('./web3/requestmanager'); var c = require('./utils/config'); -var Method = require('./web3/method'); var Property = require('./web3/property'); - -var web3Methods = [ - new Method({ - name: 'sha3', - call: 'web3_sha3', - params: 1 - }) -]; +var Batch = require('./web3/batch'); +var sha3 = require('./utils/sha3'); var web3Properties = [ new Property({ @@ -1521,6 +1438,10 @@ web3.toBigNumber = utils.toBigNumber; web3.toWei = utils.toWei; web3.fromWei = utils.fromWei; web3.isAddress = utils.isAddress; +web3.sha3 = sha3; +web3.createBatch = function () { + return new Batch(); +}; // ADD defaultblock Object.defineProperty(web3.eth, 'defaultBlock', { @@ -1544,7 +1465,6 @@ Object.defineProperty(web3.eth, 'defaultAccount', { }); /// setups all api methods -setupMethods(web3, web3Methods); setupProperties(web3, web3Properties); setupMethods(web3.net, net.methods); setupProperties(web3.net, net.properties); @@ -1556,7 +1476,7 @@ setupMethods(web3.shh, shh.methods); module.exports = web3; -},{"./utils/config":7,"./utils/utils":8,"./version.json":9,"./web3/db":12,"./web3/eth":14,"./web3/filter":16,"./web3/formatters":17,"./web3/method":21,"./web3/net":22,"./web3/property":23,"./web3/requestmanager":25,"./web3/shh":26,"./web3/watches":27}],11:[function(require,module,exports){ +},{"./utils/config":5,"./utils/sha3":6,"./utils/utils":7,"./version.json":8,"./web3/batch":10,"./web3/db":12,"./web3/eth":14,"./web3/filter":16,"./web3/formatters":17,"./web3/net":22,"./web3/property":23,"./web3/requestmanager":25,"./web3/shh":26,"./web3/watches":27}],10:[function(require,module,exports){ /* This file is part of ethereum.js. @@ -1573,20 +1493,109 @@ module.exports = web3; You should have received a copy of the GNU Lesser General Public License along with ethereum.js. If not, see . */ -/** +/** + * @file batch.js + * @author Marek Kotewicz + * @date 2015 + */ + +var RequestManager = require('./requestmanager'); + +var Batch = function () { + this.requests = []; +}; + +/** + * Should be called to add create new request to batch request + * + * @method add + * @param {Object} jsonrpc requet object + */ +Batch.prototype.add = function (request) { + this.requests.push(request); +}; + +/** + * Should be called to execute batch request + * + * @method execute + */ +Batch.prototype.execute = function () { + var requests = this.requests; + RequestManager.getInstance().sendBatch(requests, function (err, results) { + results = results || []; + requests.map(function (request, index) { + return results[index] || {}; + }).map(function (result, index) { + return requests[index].format ? requests[index].format(result.result) : result.result; + }).forEach(function (result, index) { + if (requests[index].callback) { + requests[index].callback(err, result); + } + }); + }); +}; + +module.exports = Batch; + + +},{"./requestmanager":25}],11:[function(require,module,exports){ +/* + This file is part of ethereum.js. + + ethereum.js 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. + + ethereum.js is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with ethereum.js. If not, see . +*/ +/** * @file contract.js * @author Marek Kotewicz * @date 2014 */ -var web3 = require('../web3'); -var solAbi = require('../solidity/abi'); +var web3 = require('../web3'); var utils = require('../utils/utils'); +var coder = require('../solidity/coder'); var SolidityEvent = require('./event'); var SolidityFunction = require('./function'); -var addFunctionsToContract = function (contract, desc) { - desc.filter(function (json) { +/** + * Should be called to encode constructor params + * + * @method encodeConstructorParams + * @param {Array} abi + * @param {Array} constructor params + */ +var encodeConstructorParams = function (abi, params) { + return abi.filter(function (json) { + return json.type === 'constructor' && json.inputs.length === params.length; + }).map(function (json) { + return json.inputs.map(function (input) { + return input.type; + }); + }).map(function (types) { + return coder.encodeParams(types, params); + })[0] || ''; +}; + +/** + * Should be called to add functions to contract object + * + * @method addFunctionsToContract + * @param {Contract} contract + * @param {Array} abi + */ +var addFunctionsToContract = function (contract, abi) { + abi.filter(function (json) { return json.type === 'function'; }).map(function (json) { return new SolidityFunction(json, contract.address); @@ -1595,8 +1604,15 @@ var addFunctionsToContract = function (contract, desc) { }); }; -var addEventsToContract = function (contract, desc) { - desc.filter(function (json) { +/** + * Should be called to add events to contract object + * + * @method addEventsToContract + * @param {Contract} contract + * @param {Array} abi + */ +var addEventsToContract = function (contract, abi) { + abi.filter(function (json) { return json.type === 'event'; }).map(function (json) { return new SolidityEvent(json, contract.address); @@ -1606,65 +1622,106 @@ var addEventsToContract = function (contract, desc) { }; /** - * This method should be called when we want to call / transact some solidity method from javascript - * it returns an object which has same methods available as solidity contract description - * usage example: + * Should be called to create new ContractFactory * - * var abi = [{ - * name: 'myMethod', - * inputs: [{ name: 'a', type: 'string' }], - * outputs: [{name: 'd', type: 'string' }] - * }]; // contract abi - * - * var MyContract = web3.eth.contract(abi); // creation of contract prototype - * - * var contractInstance = new MyContract('0x0123123121'); - * - * contractInstance.myMethod('this is test string param for call'); // myMethod call (implicit, default) - * contractInstance.call().myMethod('this is test string param for call'); // myMethod call (explicit) - * contractInstance.sendTransaction().myMethod('this is test string param for transact'); // myMethod sendTransaction - * - * @param abi - abi json description of the contract, which is being created - * @returns contract object + * @method contract + * @param {Array} abi + * @returns {ContractFactory} new contract factory */ var contract = function (abi) { - - // return prototype - return Contract.bind(null, abi); + return new ContractFactory(abi); }; -var Contract = function (abi, options) { +/** + * Should be called to create new ContractFactory instance + * + * @method ContractFactory + * @param {Array} abi + */ +var ContractFactory = function (abi) { + this.abi = abi; +}; - this.address = ''; - if (utils.isAddress(options)) { - this.address = options; - } else { // is an object! - // TODO, parse the rest of the args - options = options || {}; - var args = Array.prototype.slice.call(arguments, 2); - var bytes = solAbi.formatConstructorParams(abi, args); - options.data += bytes; - this.address = web3.eth.sendTransaction(options); +/** + * Should be called to create new contract on a blockchain + * + * @method new + * @param {Any} contract constructor param1 (optional) + * @param {Any} contract constructor param2 (optional) + * @param {Object} contract transaction object (required) + * @param {Function} callback + * @returns {Contract} returns contract if no callback was passed, + * otherwise calls callback function (err, contract) + */ +ContractFactory.prototype.new = function () { + // parse arguments + var options = {}; // required! + var callback; + + var args = Array.prototype.slice.call(arguments); + if (utils.isFunction(args[args.length - 1])) { + callback = args.pop(); } + var last = args[args.length - 1]; + if (utils.isObject(last) && !utils.isArray(last)) { + options = args.pop(); + } + + // throw an error if there are no options + + var bytes = encodeConstructorParams(this.abi, args); + options.data += bytes; + + if (!callback) { + var address = web3.eth.sendTransaction(options); + return this.at(address); + } + + var self = this; + web3.eth.sendTransaction(options, function (err, address) { + if (err) { + callback(err); + } + self.at(address, callback); + }); +}; + +/** + * Should be called to get access to existing contract on a blockchain + * + * @method at + * @param {Address} contract address (required) + * @param {Function} callback {optional) + * @returns {Contract} returns contract if no callback was passed, + * otherwise calls callback function (err, contract) + */ +ContractFactory.prototype.at = function (address, callback) { + // TODO: address is required + + if (callback) { + callback(null, new Contract(this.abi, address)); + } + return new Contract(this.abi, address); +}; + +/** + * Should be called to create new contract instance + * + * @method Contract + * @param {Array} abi + * @param {Address} contract address + */ +var Contract = function (abi, address) { + this.address = address; addFunctionsToContract(this, abi); addEventsToContract(this, abi); }; -Contract.prototype.call = function () { - console.error('contract.call is deprecated'); - return this; -}; - -Contract.prototype.sendTransaction = function () { - console.error('contract.sendTransact is deprecated'); - return this; -}; - module.exports = contract; -},{"../solidity/abi":1,"../utils/utils":8,"../web3":10,"./event":15,"./function":18}],12:[function(require,module,exports){ +},{"../solidity/coder":1,"../utils/utils":7,"../web3":9,"./event":15,"./function":18}],12:[function(require,module,exports){ /* This file is part of ethereum.js. @@ -1739,7 +1796,7 @@ module.exports = { You should have received a copy of the GNU Lesser General Public License along with ethereum.js. If not, see . */ -/** +/** * @file errors.js * @author Marek Kotewicz * @date 2015 @@ -1925,12 +1982,6 @@ var getTransactionCount = new Method({ outputFormatter: utils.toDecimal }); -var sign = new Method({ - name: 'sign', - call: 'eth_sign', - params: 1 -}); - var sendTransaction = new Method({ name: 'sendTransaction', call: 'eth_sendTransaction', @@ -1945,6 +1996,14 @@ var call = new Method({ inputFormatter: [formatters.inputTransactionFormatter, formatters.inputDefaultBlockNumberFormatter] }); +var estimateGas = new Method({ + name: 'estimateGas', + call: 'eth_estimateGas', + params: 1, + inputFormatter: [formatters.inputTransactionFormatter], + outputFormatter: utils.toDecimal +}); + var compileSolidity = new Method({ name: 'compile.solidity', call: 'eth_compileSolidity', @@ -1963,6 +2022,18 @@ var compileSerpent = new Method({ params: 1 }); +var submitWork = new Method({ + name: 'submitWork', + call: 'eth_submitWork', + params: 3 +}); + +var getWork = new Method({ + name: 'getWork', + call: 'eth_getWork', + params: 0 +}); + var methods = [ getBalance, getStorageAt, @@ -1976,11 +2047,13 @@ var methods = [ getTransactionFromBlock, getTransactionCount, call, - sign, + estimateGas, sendTransaction, compileSolidity, compileLLL, compileSerpent, + submitWork, + getWork ]; /// @returns an array of objects describing web3.eth api properties @@ -2023,7 +2096,7 @@ module.exports = { }; -},{"../utils/utils":8,"./formatters":17,"./method":21,"./property":23}],15:[function(require,module,exports){ +},{"../utils/utils":7,"./formatters":17,"./method":21,"./property":23}],15:[function(require,module,exports){ /* This file is part of ethereum.js. @@ -2040,7 +2113,7 @@ module.exports = { You should have received a copy of the GNU Lesser General Public License along with ethereum.js. If not, see . */ -/** +/** * @file event.js * @author Marek Kotewicz * @date 2014 @@ -2050,6 +2123,7 @@ var utils = require('../utils/utils'); var coder = require('../solidity/coder'); var web3 = require('../web3'); var formatters = require('./formatters'); +var sha3 = require('../utils/sha3'); /** * This prototype should be used to create event filters @@ -2103,12 +2177,12 @@ SolidityEvent.prototype.typeName = function () { * @return {String} event signature */ SolidityEvent.prototype.signature = function () { - return web3.sha3(web3.fromAscii(this._name)).slice(2); + return sha3(this._name); }; /** * Should be used to encode indexed params and options to one final object - * + * * @method encode * @param {Object} indexed * @param {Object} options @@ -2139,7 +2213,7 @@ SolidityEvent.prototype.encode = function (indexed, options) { if (value === undefined || value === null) { return null; } - + if (utils.isArray(value)) { return value.map(function (v) { return '0x' + coder.encodeParam(i.type, v); @@ -2161,17 +2235,17 @@ SolidityEvent.prototype.encode = function (indexed, options) { * @return {Object} result object with decoded indexed && not indexed params */ SolidityEvent.prototype.decode = function (data) { - + data.data = data.data || ''; data.topics = data.topics || []; var argTopics = this._anonymous ? data.topics : data.topics.slice(1); var indexedData = argTopics.map(function (topics) { return topics.slice(2); }).join(""); - var indexedParams = coder.decodeParams(this.types(true), indexedData); + var indexedParams = coder.decodeParams(this.types(true), indexedData); var notIndexedData = data.data.slice(2); var notIndexedParams = coder.decodeParams(this.types(false), notIndexedData); - + var result = formatters.outputLogFormatter(data); result.event = this.displayName(); result.address = data.address; @@ -2219,7 +2293,7 @@ SolidityEvent.prototype.attachToContract = function (contract) { module.exports = SolidityEvent; -},{"../solidity/coder":2,"../utils/utils":8,"../web3":10,"./formatters":17}],16:[function(require,module,exports){ +},{"../solidity/coder":1,"../utils/sha3":6,"../utils/utils":7,"../web3":9,"./formatters":17}],16:[function(require,module,exports){ /* This file is part of ethereum.js. @@ -2276,7 +2350,7 @@ var getOptions = function (options) { if (utils.isString(options)) { return options; - } + } options = options || {}; @@ -2292,8 +2366,8 @@ var getOptions = function (options) { to: options.to, address: options.address, fromBlock: formatters.inputBlockNumberFormatter(options.fromBlock), - toBlock: formatters.inputBlockNumberFormatter(options.toBlock) - }; + toBlock: formatters.inputBlockNumberFormatter(options.toBlock) + }; }; var Filter = function (options, methods, formatter) { @@ -2376,7 +2450,7 @@ Filter.prototype.get = function (callback) { module.exports = Filter; -},{"../utils/utils":8,"./formatters":17,"./requestmanager":25}],17:[function(require,module,exports){ +},{"../utils/utils":7,"./formatters":17,"./requestmanager":25}],17:[function(require,module,exports){ /* This file is part of ethereum.js. @@ -2393,7 +2467,7 @@ module.exports = Filter; You should have received a copy of the GNU Lesser General Public License along with ethereum.js. If not, see . */ -/** +/** * @file formatters.js * @author Marek Kotewicz * @author Fabian Vogelsteller @@ -2451,18 +2525,18 @@ var inputTransactionFormatter = function (options){ delete options.code; } - ['gasPrice', 'gas', 'value'].filter(function (key) { + ['gasPrice', 'gas', 'value', 'nonce'].filter(function (key) { return options[key] !== undefined; }).forEach(function(key){ options[key] = utils.fromDecimal(options[key]); }); - return options; + return options; }; /** * Formats the output of a transaction to its proper values - * + * * @method outputTransactionFormatter * @param {Object} transaction * @returns {Object} transaction @@ -2481,7 +2555,7 @@ var outputTransactionFormatter = function (tx){ * Formats the output of a block to its proper values * * @method outputBlockFormatter - * @param {Object} block object + * @param {Object} block object * @returns {Object} block object */ var outputBlockFormatter = function(block) { @@ -2508,7 +2582,7 @@ var outputBlockFormatter = function(block) { /** * Formats the output of a log - * + * * @method outputLogFormatter * @param {Object} log object * @returns {Object} log @@ -2549,7 +2623,7 @@ var inputPostFormatter = function(post) { return utils.fromAscii(topic); }); - return post; + return post; }; /** @@ -2596,7 +2670,7 @@ module.exports = { }; -},{"../utils/config":7,"../utils/utils":8}],18:[function(require,module,exports){ +},{"../utils/config":5,"../utils/utils":7}],18:[function(require,module,exports){ /* This file is part of ethereum.js. @@ -2613,7 +2687,7 @@ module.exports = { You should have received a copy of the GNU Lesser General Public License along with ethereum.js. If not, see . */ -/** +/** * @file function.js * @author Marek Kotewicz * @date 2015 @@ -2622,6 +2696,7 @@ module.exports = { var web3 = require('../web3'); var coder = require('../solidity/coder'); var utils = require('../utils/utils'); +var sha3 = require('../utils/sha3'); /** * This prototype should be used to call/sendTransaction to solidity functions @@ -2638,18 +2713,23 @@ var SolidityFunction = function (json, address) { this._address = address; }; +SolidityFunction.prototype.extractCallback = function (args) { + if (utils.isFunction(args[args.length - 1])) { + return args.pop(); // modify the args array! + } +}; + /** * Should be used to create payload from arguments * * @method toPayload - * @param {...} solidity function params + * @param {Array} solidity function params * @param {Object} optional payload options */ -SolidityFunction.prototype.toPayload = function () { - var args = Array.prototype.slice.call(arguments); +SolidityFunction.prototype.toPayload = function (args) { var options = {}; if (args.length > this._inputTypes.length && utils.isObject(args[args.length -1])) { - options = args.pop(); + options = args[args.length - 1]; } options.to = this._address; options.data = '0x' + this.signature() + coder.encodeParams(this._inputTypes, args); @@ -2663,24 +2743,46 @@ SolidityFunction.prototype.toPayload = function () { * @return {String} function signature */ SolidityFunction.prototype.signature = function () { - return web3.sha3(web3.fromAscii(this._name)).slice(2, 10); + return sha3(this._name).slice(0, 8); }; -/** - * Should be used to call function - * - * @method call - * @param {Object} options - * @return {String} output bytes - */ -SolidityFunction.prototype.call = function () { - var payload = this.toPayload.apply(this, Array.prototype.slice.call(arguments)); - var output = web3.eth.call(payload); + +SolidityFunction.prototype.unpackOutput = function (output) { + if (output === null) { + return; + } + output = output.length >= 2 ? output.slice(2) : output; var result = coder.decodeParams(this._outputTypes, output); return result.length === 1 ? result[0] : result; }; +/** + * Calls a contract function. + * + * @method call + * @param {...Object} Contract function arguments + * @param {function} If the last argument is a function, the contract function + * call will be asynchronous, and the callback will be passed the + * error and result. + * @return {String} output bytes + */ +SolidityFunction.prototype.call = function () { + var args = Array.prototype.slice.call(arguments); + var callback = this.extractCallback(args); + var payload = this.toPayload(args); + + if (!callback) { + var output = web3.eth.call(payload); + return this.unpackOutput(output); + } + + var self = this; + web3.eth.call(payload, function (error, output) { + callback(error, self.unpackOutput(output)); + }); +}; + /** * Should be used to sendTransaction to solidity function * @@ -2688,8 +2790,16 @@ SolidityFunction.prototype.call = function () { * @param {Object} options */ SolidityFunction.prototype.sendTransaction = function () { - var payload = this.toPayload.apply(this, Array.prototype.slice.call(arguments)); - web3.eth.sendTransaction(payload); + var args = Array.prototype.slice.call(arguments); + var callback = this.extractCallback(args); + var payload = this.toPayload(args); + + if (!callback) { + web3.eth.sendTransaction(payload); + return; + } + + web3.eth.sendTransaction(payload, callback); }; /** @@ -2704,7 +2814,7 @@ SolidityFunction.prototype.displayName = function () { /** * Should be used to get function type name - * + * * @method typeName * @return {String} type name of the function */ @@ -2712,6 +2822,25 @@ SolidityFunction.prototype.typeName = function () { return utils.extractTypeName(this._name); }; +/** + * Should be called to get rpc requests from solidity function + * + * @method request + * @returns {Object} + */ +SolidityFunction.prototype.request = function () { + var args = Array.prototype.slice.call(arguments); + var callback = this.extractCallback(args); + var payload = this.toPayload(args); + var format = this.unpackOutput.bind(this); + + return { + callback: callback, + payload: payload, + format: format + }; +}; + /** * Should be called to execute function * @@ -2719,7 +2848,7 @@ SolidityFunction.prototype.typeName = function () { */ SolidityFunction.prototype.execute = function () { var transaction = !this._constant; - + // send transaction if (transaction) { return this.sendTransaction.apply(this, Array.prototype.slice.call(arguments)); @@ -2737,6 +2866,7 @@ SolidityFunction.prototype.execute = function () { */ SolidityFunction.prototype.attachToContract = function (contract) { var execute = this.execute.bind(this); + execute.request = this.request.bind(this); execute.call = this.call.bind(this); execute.sendTransaction = this.sendTransaction.bind(this); var displayName = this.displayName(); @@ -2749,7 +2879,7 @@ SolidityFunction.prototype.attachToContract = function (contract) { module.exports = SolidityFunction; -},{"../solidity/coder":2,"../utils/utils":8,"../web3":10}],19:[function(require,module,exports){ +},{"../solidity/coder":1,"../utils/sha3":6,"../utils/utils":7,"../web3":9}],19:[function(require,module,exports){ /* This file is part of ethereum.js. @@ -2787,7 +2917,7 @@ HttpProvider.prototype.send = function (payload) { var request = new XMLHttpRequest(); request.open('POST', this.host, false); - + try { request.send(JSON.stringify(payload)); } catch(error) { @@ -2800,15 +2930,32 @@ HttpProvider.prototype.send = function (payload) { //if (request.status !== 200) { //return; //} - return JSON.parse(request.responseText); + + var result = request.responseText; + + try { + result = JSON.parse(result); + } catch(e) { + throw errors.InvalidResponse(result); + } + + return result; }; HttpProvider.prototype.sendAsync = function (payload, callback) { var request = new XMLHttpRequest(); request.onreadystatechange = function() { if (request.readyState === 4) { - // TODO: handle the error properly here!!! - callback(null, JSON.parse(request.responseText)); + var result = request.responseText; + var error = null; + + try { + result = JSON.parse(result); + } catch(e) { + error = errors.InvalidResponse(result); + } + + callback(error, result); } }; @@ -2824,7 +2971,7 @@ HttpProvider.prototype.sendAsync = function (payload, callback) { module.exports = HttpProvider; -},{"./errors":13,"xmlhttprequest":6}],20:[function(require,module,exports){ +},{"./errors":13,"xmlhttprequest":4}],20:[function(require,module,exports){ /* This file is part of ethereum.js. @@ -2974,12 +3121,11 @@ Method.prototype.extractCallback = function (args) { if (utils.isFunction(args[args.length - 1])) { return args.pop(); // modify the args array! } - return null; }; /** * Should be called to check if the number of arguments is correct - * + * * @method validateArgs * @param {Array} arguments * @throws {Error} if it is not @@ -2992,7 +3138,7 @@ Method.prototype.validateArgs = function (args) { /** * Should be called to format input args of method - * + * * @method formatInput * @param {Array} * @return {Array} @@ -3020,20 +3166,21 @@ Method.prototype.formatOutput = function (result) { /** * Should attach function to method - * + * * @method attachToObject * @param {Object} * @param {Function} */ Method.prototype.attachToObject = function (obj) { var func = this.send.bind(this); + func.request = this.request.bind(this); func.call = this.call; // that's ugly. filter.js uses it var name = this.name.split('.'); if (name.length > 1) { obj[name[0]] = obj[name[0]] || {}; obj[name[0]][name[1]] = func; } else { - obj[name[0]] = func; + obj[name[0]] = func; } }; @@ -3057,6 +3204,19 @@ Method.prototype.toPayload = function (args) { }; }; +/** + * Should be called to create pure JSONRPC request which can be used in batch request + * + * @method request + * @param {...} params + * @return {Object} jsonrpc request + */ +Method.prototype.request = function () { + var payload = this.toPayload(Array.prototype.slice.call(arguments)); + payload.format = this.formatOutput.bind(this); + return payload; +}; + /** * Should send request to the API * @@ -3069,7 +3229,7 @@ Method.prototype.send = function () { if (payload.callback) { var self = this; return RequestManager.getInstance().sendAsync(payload, function (err, result) { - payload.callback(null, self.formatOutput(result)); + payload.callback(err, self.formatOutput(result)); }); } return this.formatOutput(RequestManager.getInstance().send(payload)); @@ -3078,7 +3238,7 @@ Method.prototype.send = function () { module.exports = Method; -},{"../utils/utils":8,"./errors":13,"./requestmanager":25}],22:[function(require,module,exports){ +},{"../utils/utils":7,"./errors":13,"./requestmanager":25}],22:[function(require,module,exports){ /* This file is part of ethereum.js. @@ -3128,7 +3288,7 @@ module.exports = { }; -},{"../utils/utils":8,"./property":23}],23:[function(require,module,exports){ +},{"../utils/utils":7,"./property":23}],23:[function(require,module,exports){ /* This file is part of ethereum.js. @@ -3164,7 +3324,7 @@ var Property = function (options) { /** * Should be called to format input args of method - * + * * @method formatInput * @param {Array} * @return {Array} @@ -3186,7 +3346,7 @@ Property.prototype.formatOutput = function (result) { /** * Should attach function to method - * + * * @method attachToObject * @param {Object} * @param {Function} @@ -3194,16 +3354,23 @@ Property.prototype.formatOutput = function (result) { Property.prototype.attachToObject = function (obj) { var proto = { get: this.get.bind(this), - set: this.set.bind(this) }; - var name = this.name.split('.'); - if (name.length > 1) { - obj[name[0]] = obj[name[0]] || {}; - Object.defineProperty(obj[name[0]], name[1], proto); - } else { - Object.defineProperty(obj, name[0], proto); + var names = this.name.split('.'); + var name = names[0]; + if (names.length > 1) { + obj[names[0]] = obj[names[0]] || {}; + obj = obj[names[0]]; + name = names[1]; } + + Object.defineProperty(obj, name, proto); + + var toAsyncName = function (prefix, name) { + return prefix + name.charAt(0).toUpperCase() + name.slice(1); + }; + + obj[toAsyncName('get', name)] = this.getAsync.bind(this); }; /** @@ -3219,15 +3386,20 @@ Property.prototype.get = function () { }; /** - * Should be used to set value of the property + * Should be used to asynchrounously get value of property * - * @method set - * @param {Object} new value of the property + * @method getAsync + * @param {Function} */ -Property.prototype.set = function (value) { - return RequestManager.getInstance().send({ - method: this.setter, - params: [this.formatInput(value)] +Property.prototype.getAsync = function (callback) { + var self = this; + RequestManager.getInstance().sendAsync({ + method: this.getter + }, function (err, result) { + if (err) { + return callback(err); + } + callback(err, self.formatOutput(result)); }); }; @@ -3286,7 +3458,7 @@ module.exports = QtSyncProvider; You should have received a copy of the GNU Lesser General Public License along with ethereum.js. If not, see . */ -/** +/** * @file requestmanager.js * @author Jeffrey Wilcke * @author Marek Kotewicz @@ -3368,7 +3540,7 @@ RequestManager.prototype.sendAsync = function (data, callback) { if (err) { return callback(err); } - + if (!Jsonrpc.getInstance().isValidResponse(result)) { return callback(errors.InvalidResponse(result)); } @@ -3377,6 +3549,33 @@ RequestManager.prototype.sendAsync = function (data, callback) { }); }; +/** + * Should be called to asynchronously send batch request + * + * @method sendBatch + * @param {Array} batch data + * @param {Function} callback + */ +RequestManager.prototype.sendBatch = function (data, callback) { + if (!this.provider) { + return callback(errors.InvalidProvider()); + } + + var payload = Jsonrpc.getInstance().toBatchPayload(data); + + this.provider.sendAsync(payload, function (err, results) { + if (err) { + return callback(err); + } + + if (!utils.isArray(results)) { + return callback(errors.InvalidResponse(results)); + } + + callback(err, results); + }); +}; + /** * Should be used to set provider of request manager * @@ -3427,7 +3626,7 @@ RequestManager.prototype.stopPolling = function (pollId) { */ RequestManager.prototype.reset = function () { this.polls.forEach(function (poll) { - poll.uninstall(poll.id); + poll.uninstall(poll.id); }); this.polls = []; @@ -3465,7 +3664,7 @@ RequestManager.prototype.poll = function () { if (error) { return; } - + if (!utils.isArray(results)) { throw errors.InvalidResponse(results); } @@ -3490,7 +3689,7 @@ RequestManager.prototype.poll = function () { module.exports = RequestManager; -},{"../utils/config":7,"../utils/utils":8,"./errors":13,"./jsonrpc":20}],26:[function(require,module,exports){ +},{"../utils/config":5,"../utils/utils":7,"./errors":13,"./jsonrpc":20}],26:[function(require,module,exports){ /* This file is part of ethereum.js. @@ -3517,8 +3716,8 @@ var Method = require('./method'); var formatters = require('./formatters'); var post = new Method({ - name: 'post', - call: 'shh_post', + name: 'post', + call: 'shh_post', params: 1, inputFormatter: [formatters.inputPostFormatter] }); @@ -3588,7 +3787,20 @@ var Method = require('./method'); /// @returns an array of objects describing web3.eth.filter api methods var eth = function () { var newFilterCall = function (args) { - return typeof args[0] === 'string' ? 'eth_newBlockFilter' : 'eth_newFilter'; + var type = args[0]; + + switch(type) { + case 'latest': + args.pop(); + this.params = 0; + return 'eth_newBlockFilter'; + case 'pending': + args.pop(); + this.params = 0; + return 'eth_newPendingTransactionFilter'; + default: + return 'eth_newFilter'; + } }; var newFilter = new Method({ @@ -3665,7 +3877,1382 @@ module.exports = { },{"./method":21}],28:[function(require,module,exports){ -},{}],"bignumber.js":[function(require,module,exports){ +},{}],29:[function(require,module,exports){ +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(); + } + else if (typeof define === "function" && define.amd) { + // AMD + define([], factory); + } + else { + // Global (browser) + root.CryptoJS = factory(); + } +}(this, function () { + + /** + * CryptoJS core components. + */ + var CryptoJS = CryptoJS || (function (Math, undefined) { + /** + * CryptoJS namespace. + */ + var C = {}; + + /** + * Library namespace. + */ + var C_lib = C.lib = {}; + + /** + * Base object for prototypal inheritance. + */ + var Base = C_lib.Base = (function () { + function F() {} + + return { + /** + * Creates a new object that inherits from this object. + * + * @param {Object} overrides Properties to copy into the new object. + * + * @return {Object} The new object. + * + * @static + * + * @example + * + * var MyType = CryptoJS.lib.Base.extend({ + * field: 'value', + * + * method: function () { + * } + * }); + */ + extend: function (overrides) { + // Spawn + F.prototype = this; + var subtype = new F(); + + // Augment + if (overrides) { + subtype.mixIn(overrides); + } + + // Create default initializer + if (!subtype.hasOwnProperty('init')) { + subtype.init = function () { + subtype.$super.init.apply(this, arguments); + }; + } + + // Initializer's prototype is the subtype object + subtype.init.prototype = subtype; + + // Reference supertype + subtype.$super = this; + + return subtype; + }, + + /** + * Extends this object and runs the init method. + * Arguments to create() will be passed to init(). + * + * @return {Object} The new object. + * + * @static + * + * @example + * + * var instance = MyType.create(); + */ + create: function () { + var instance = this.extend(); + instance.init.apply(instance, arguments); + + return instance; + }, + + /** + * Initializes a newly created object. + * Override this method to add some logic when your objects are created. + * + * @example + * + * var MyType = CryptoJS.lib.Base.extend({ + * init: function () { + * // ... + * } + * }); + */ + init: function () { + }, + + /** + * Copies properties into this object. + * + * @param {Object} properties The properties to mix in. + * + * @example + * + * MyType.mixIn({ + * field: 'value' + * }); + */ + mixIn: function (properties) { + for (var propertyName in properties) { + if (properties.hasOwnProperty(propertyName)) { + this[propertyName] = properties[propertyName]; + } + } + + // IE won't copy toString using the loop above + if (properties.hasOwnProperty('toString')) { + this.toString = properties.toString; + } + }, + + /** + * Creates a copy of this object. + * + * @return {Object} The clone. + * + * @example + * + * var clone = instance.clone(); + */ + clone: function () { + return this.init.prototype.extend(this); + } + }; + }()); + + /** + * An array of 32-bit words. + * + * @property {Array} words The array of 32-bit words. + * @property {number} sigBytes The number of significant bytes in this word array. + */ + var WordArray = C_lib.WordArray = Base.extend({ + /** + * Initializes a newly created word array. + * + * @param {Array} words (Optional) An array of 32-bit words. + * @param {number} sigBytes (Optional) The number of significant bytes in the words. + * + * @example + * + * var wordArray = CryptoJS.lib.WordArray.create(); + * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]); + * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6); + */ + init: function (words, sigBytes) { + words = this.words = words || []; + + if (sigBytes != undefined) { + this.sigBytes = sigBytes; + } else { + this.sigBytes = words.length * 4; + } + }, + + /** + * Converts this word array to a string. + * + * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex + * + * @return {string} The stringified word array. + * + * @example + * + * var string = wordArray + ''; + * var string = wordArray.toString(); + * var string = wordArray.toString(CryptoJS.enc.Utf8); + */ + toString: function (encoder) { + return (encoder || Hex).stringify(this); + }, + + /** + * Concatenates a word array to this word array. + * + * @param {WordArray} wordArray The word array to append. + * + * @return {WordArray} This word array. + * + * @example + * + * wordArray1.concat(wordArray2); + */ + concat: function (wordArray) { + // Shortcuts + var thisWords = this.words; + var thatWords = wordArray.words; + var thisSigBytes = this.sigBytes; + var thatSigBytes = wordArray.sigBytes; + + // Clamp excess bits + this.clamp(); + + // Concat + if (thisSigBytes % 4) { + // Copy one byte at a time + for (var i = 0; i < thatSigBytes; i++) { + var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8); + } + } else if (thatWords.length > 0xffff) { + // Copy one word at a time + for (var i = 0; i < thatSigBytes; i += 4) { + thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2]; + } + } else { + // Copy all words at once + thisWords.push.apply(thisWords, thatWords); + } + this.sigBytes += thatSigBytes; + + // Chainable + return this; + }, + + /** + * Removes insignificant bits. + * + * @example + * + * wordArray.clamp(); + */ + clamp: function () { + // Shortcuts + var words = this.words; + var sigBytes = this.sigBytes; + + // Clamp + words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8); + words.length = Math.ceil(sigBytes / 4); + }, + + /** + * Creates a copy of this word array. + * + * @return {WordArray} The clone. + * + * @example + * + * var clone = wordArray.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + clone.words = this.words.slice(0); + + return clone; + }, + + /** + * Creates a word array filled with random bytes. + * + * @param {number} nBytes The number of random bytes to generate. + * + * @return {WordArray} The random word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.lib.WordArray.random(16); + */ + random: function (nBytes) { + var words = []; + + var r = (function (m_w) { + var m_w = m_w; + var m_z = 0x3ade68b1; + var mask = 0xffffffff; + + return function () { + m_z = (0x9069 * (m_z & 0xFFFF) + (m_z >> 0x10)) & mask; + m_w = (0x4650 * (m_w & 0xFFFF) + (m_w >> 0x10)) & mask; + var result = ((m_z << 0x10) + m_w) & mask; + result /= 0x100000000; + result += 0.5; + return result * (Math.random() > .5 ? 1 : -1); + } + }); + + for (var i = 0, rcache; i < nBytes; i += 4) { + var _r = r((rcache || Math.random()) * 0x100000000); + + rcache = _r() * 0x3ade67b7; + words.push((_r() * 0x100000000) | 0); + } + + return new WordArray.init(words, nBytes); + } + }); + + /** + * Encoder namespace. + */ + var C_enc = C.enc = {}; + + /** + * Hex encoding strategy. + */ + var Hex = C_enc.Hex = { + /** + * Converts a word array to a hex string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The hex string. + * + * @static + * + * @example + * + * var hexString = CryptoJS.enc.Hex.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var hexChars = []; + for (var i = 0; i < sigBytes; i++) { + var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + hexChars.push((bite >>> 4).toString(16)); + hexChars.push((bite & 0x0f).toString(16)); + } + + return hexChars.join(''); + }, + + /** + * Converts a hex string to a word array. + * + * @param {string} hexStr The hex string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Hex.parse(hexString); + */ + parse: function (hexStr) { + // Shortcut + var hexStrLength = hexStr.length; + + // Convert + var words = []; + for (var i = 0; i < hexStrLength; i += 2) { + words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4); + } + + return new WordArray.init(words, hexStrLength / 2); + } + }; + + /** + * Latin1 encoding strategy. + */ + var Latin1 = C_enc.Latin1 = { + /** + * Converts a word array to a Latin1 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The Latin1 string. + * + * @static + * + * @example + * + * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var latin1Chars = []; + for (var i = 0; i < sigBytes; i++) { + var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + latin1Chars.push(String.fromCharCode(bite)); + } + + return latin1Chars.join(''); + }, + + /** + * Converts a Latin1 string to a word array. + * + * @param {string} latin1Str The Latin1 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Latin1.parse(latin1String); + */ + parse: function (latin1Str) { + // Shortcut + var latin1StrLength = latin1Str.length; + + // Convert + var words = []; + for (var i = 0; i < latin1StrLength; i++) { + words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8); + } + + return new WordArray.init(words, latin1StrLength); + } + }; + + /** + * UTF-8 encoding strategy. + */ + var Utf8 = C_enc.Utf8 = { + /** + * Converts a word array to a UTF-8 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The UTF-8 string. + * + * @static + * + * @example + * + * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray); + */ + stringify: function (wordArray) { + try { + return decodeURIComponent(escape(Latin1.stringify(wordArray))); + } catch (e) { + throw new Error('Malformed UTF-8 data'); + } + }, + + /** + * Converts a UTF-8 string to a word array. + * + * @param {string} utf8Str The UTF-8 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Utf8.parse(utf8String); + */ + parse: function (utf8Str) { + return Latin1.parse(unescape(encodeURIComponent(utf8Str))); + } + }; + + /** + * Abstract buffered block algorithm template. + * + * The property blockSize must be implemented in a concrete subtype. + * + * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0 + */ + var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({ + /** + * Resets this block algorithm's data buffer to its initial state. + * + * @example + * + * bufferedBlockAlgorithm.reset(); + */ + reset: function () { + // Initial values + this._data = new WordArray.init(); + this._nDataBytes = 0; + }, + + /** + * Adds new data to this block algorithm's buffer. + * + * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8. + * + * @example + * + * bufferedBlockAlgorithm._append('data'); + * bufferedBlockAlgorithm._append(wordArray); + */ + _append: function (data) { + // Convert string to WordArray, else assume WordArray already + if (typeof data == 'string') { + data = Utf8.parse(data); + } + + // Append + this._data.concat(data); + this._nDataBytes += data.sigBytes; + }, + + /** + * Processes available data blocks. + * + * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype. + * + * @param {boolean} doFlush Whether all blocks and partial blocks should be processed. + * + * @return {WordArray} The processed data. + * + * @example + * + * var processedData = bufferedBlockAlgorithm._process(); + * var processedData = bufferedBlockAlgorithm._process(!!'flush'); + */ + _process: function (doFlush) { + // Shortcuts + var data = this._data; + var dataWords = data.words; + var dataSigBytes = data.sigBytes; + var blockSize = this.blockSize; + var blockSizeBytes = blockSize * 4; + + // Count blocks ready + var nBlocksReady = dataSigBytes / blockSizeBytes; + if (doFlush) { + // Round up to include partial blocks + nBlocksReady = Math.ceil(nBlocksReady); + } else { + // Round down to include only full blocks, + // less the number of blocks that must remain in the buffer + nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0); + } + + // Count words ready + var nWordsReady = nBlocksReady * blockSize; + + // Count bytes ready + var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes); + + // Process blocks + if (nWordsReady) { + for (var offset = 0; offset < nWordsReady; offset += blockSize) { + // Perform concrete-algorithm logic + this._doProcessBlock(dataWords, offset); + } + + // Remove processed words + var processedWords = dataWords.splice(0, nWordsReady); + data.sigBytes -= nBytesReady; + } + + // Return processed words + return new WordArray.init(processedWords, nBytesReady); + }, + + /** + * Creates a copy of this object. + * + * @return {Object} The clone. + * + * @example + * + * var clone = bufferedBlockAlgorithm.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + clone._data = this._data.clone(); + + return clone; + }, + + _minBufferSize: 0 + }); + + /** + * Abstract hasher template. + * + * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits) + */ + var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({ + /** + * Configuration options. + */ + cfg: Base.extend(), + + /** + * Initializes a newly created hasher. + * + * @param {Object} cfg (Optional) The configuration options to use for this hash computation. + * + * @example + * + * var hasher = CryptoJS.algo.SHA256.create(); + */ + init: function (cfg) { + // Apply config defaults + this.cfg = this.cfg.extend(cfg); + + // Set initial values + this.reset(); + }, + + /** + * Resets this hasher to its initial state. + * + * @example + * + * hasher.reset(); + */ + reset: function () { + // Reset data buffer + BufferedBlockAlgorithm.reset.call(this); + + // Perform concrete-hasher logic + this._doReset(); + }, + + /** + * Updates this hasher with a message. + * + * @param {WordArray|string} messageUpdate The message to append. + * + * @return {Hasher} This hasher. + * + * @example + * + * hasher.update('message'); + * hasher.update(wordArray); + */ + update: function (messageUpdate) { + // Append + this._append(messageUpdate); + + // Update the hash + this._process(); + + // Chainable + return this; + }, + + /** + * Finalizes the hash computation. + * Note that the finalize operation is effectively a destructive, read-once operation. + * + * @param {WordArray|string} messageUpdate (Optional) A final message update. + * + * @return {WordArray} The hash. + * + * @example + * + * var hash = hasher.finalize(); + * var hash = hasher.finalize('message'); + * var hash = hasher.finalize(wordArray); + */ + finalize: function (messageUpdate) { + // Final message update + if (messageUpdate) { + this._append(messageUpdate); + } + + // Perform concrete-hasher logic + var hash = this._doFinalize(); + + return hash; + }, + + blockSize: 512/32, + + /** + * Creates a shortcut function to a hasher's object interface. + * + * @param {Hasher} hasher The hasher to create a helper for. + * + * @return {Function} The shortcut function. + * + * @static + * + * @example + * + * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256); + */ + _createHelper: function (hasher) { + return function (message, cfg) { + return new hasher.init(cfg).finalize(message); + }; + }, + + /** + * Creates a shortcut function to the HMAC's object interface. + * + * @param {Hasher} hasher The hasher to use in this HMAC helper. + * + * @return {Function} The shortcut function. + * + * @static + * + * @example + * + * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256); + */ + _createHmacHelper: function (hasher) { + return function (message, key) { + return new C_algo.HMAC.init(hasher, key).finalize(message); + }; + } + }); + + /** + * Algorithm namespace. + */ + var C_algo = C.algo = {}; + + return C; + }(Math)); + + + return CryptoJS; + +})); +},{}],30:[function(require,module,exports){ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./x64-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./x64-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_x64 = C.x64; + var X64Word = C_x64.Word; + var C_algo = C.algo; + + // Constants tables + var RHO_OFFSETS = []; + var PI_INDEXES = []; + var ROUND_CONSTANTS = []; + + // Compute Constants + (function () { + // Compute rho offset constants + var x = 1, y = 0; + for (var t = 0; t < 24; t++) { + RHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64; + + var newX = y % 5; + var newY = (2 * x + 3 * y) % 5; + x = newX; + y = newY; + } + + // Compute pi index constants + for (var x = 0; x < 5; x++) { + for (var y = 0; y < 5; y++) { + PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5; + } + } + + // Compute round constants + var LFSR = 0x01; + for (var i = 0; i < 24; i++) { + var roundConstantMsw = 0; + var roundConstantLsw = 0; + + for (var j = 0; j < 7; j++) { + if (LFSR & 0x01) { + var bitPosition = (1 << j) - 1; + if (bitPosition < 32) { + roundConstantLsw ^= 1 << bitPosition; + } else /* if (bitPosition >= 32) */ { + roundConstantMsw ^= 1 << (bitPosition - 32); + } + } + + // Compute next LFSR + if (LFSR & 0x80) { + // Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1 + LFSR = (LFSR << 1) ^ 0x71; + } else { + LFSR <<= 1; + } + } + + ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw); + } + }()); + + // Reusable objects for temporary values + var T = []; + (function () { + for (var i = 0; i < 25; i++) { + T[i] = X64Word.create(); + } + }()); + + /** + * SHA-3 hash algorithm. + */ + var SHA3 = C_algo.SHA3 = Hasher.extend({ + /** + * Configuration options. + * + * @property {number} outputLength + * The desired number of bits in the output hash. + * Only values permitted are: 224, 256, 384, 512. + * Default: 512 + */ + cfg: Hasher.cfg.extend({ + outputLength: 512 + }), + + _doReset: function () { + var state = this._state = [] + for (var i = 0; i < 25; i++) { + state[i] = new X64Word.init(); + } + + this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32; + }, + + _doProcessBlock: function (M, offset) { + // Shortcuts + var state = this._state; + var nBlockSizeLanes = this.blockSize / 2; + + // Absorb + for (var i = 0; i < nBlockSizeLanes; i++) { + // Shortcuts + var M2i = M[offset + 2 * i]; + var M2i1 = M[offset + 2 * i + 1]; + + // Swap endian + M2i = ( + (((M2i << 8) | (M2i >>> 24)) & 0x00ff00ff) | + (((M2i << 24) | (M2i >>> 8)) & 0xff00ff00) + ); + M2i1 = ( + (((M2i1 << 8) | (M2i1 >>> 24)) & 0x00ff00ff) | + (((M2i1 << 24) | (M2i1 >>> 8)) & 0xff00ff00) + ); + + // Absorb message into state + var lane = state[i]; + lane.high ^= M2i1; + lane.low ^= M2i; + } + + // Rounds + for (var round = 0; round < 24; round++) { + // Theta + for (var x = 0; x < 5; x++) { + // Mix column lanes + var tMsw = 0, tLsw = 0; + for (var y = 0; y < 5; y++) { + var lane = state[x + 5 * y]; + tMsw ^= lane.high; + tLsw ^= lane.low; + } + + // Temporary values + var Tx = T[x]; + Tx.high = tMsw; + Tx.low = tLsw; + } + for (var x = 0; x < 5; x++) { + // Shortcuts + var Tx4 = T[(x + 4) % 5]; + var Tx1 = T[(x + 1) % 5]; + var Tx1Msw = Tx1.high; + var Tx1Lsw = Tx1.low; + + // Mix surrounding columns + var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31)); + var tLsw = Tx4.low ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31)); + for (var y = 0; y < 5; y++) { + var lane = state[x + 5 * y]; + lane.high ^= tMsw; + lane.low ^= tLsw; + } + } + + // Rho Pi + for (var laneIndex = 1; laneIndex < 25; laneIndex++) { + // Shortcuts + var lane = state[laneIndex]; + var laneMsw = lane.high; + var laneLsw = lane.low; + var rhoOffset = RHO_OFFSETS[laneIndex]; + + // Rotate lanes + if (rhoOffset < 32) { + var tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset)); + var tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset)); + } else /* if (rhoOffset >= 32) */ { + var tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset)); + var tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset)); + } + + // Transpose lanes + var TPiLane = T[PI_INDEXES[laneIndex]]; + TPiLane.high = tMsw; + TPiLane.low = tLsw; + } + + // Rho pi at x = y = 0 + var T0 = T[0]; + var state0 = state[0]; + T0.high = state0.high; + T0.low = state0.low; + + // Chi + for (var x = 0; x < 5; x++) { + for (var y = 0; y < 5; y++) { + // Shortcuts + var laneIndex = x + 5 * y; + var lane = state[laneIndex]; + var TLane = T[laneIndex]; + var Tx1Lane = T[((x + 1) % 5) + 5 * y]; + var Tx2Lane = T[((x + 2) % 5) + 5 * y]; + + // Mix rows + lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high); + lane.low = TLane.low ^ (~Tx1Lane.low & Tx2Lane.low); + } + } + + // Iota + var lane = state[0]; + var roundConstant = ROUND_CONSTANTS[round]; + lane.high ^= roundConstant.high; + lane.low ^= roundConstant.low;; + } + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + var blockSizeBits = this.blockSize * 32; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32); + dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Shortcuts + var state = this._state; + var outputLengthBytes = this.cfg.outputLength / 8; + var outputLengthLanes = outputLengthBytes / 8; + + // Squeeze + var hashWords = []; + for (var i = 0; i < outputLengthLanes; i++) { + // Shortcuts + var lane = state[i]; + var laneMsw = lane.high; + var laneLsw = lane.low; + + // Swap endian + laneMsw = ( + (((laneMsw << 8) | (laneMsw >>> 24)) & 0x00ff00ff) | + (((laneMsw << 24) | (laneMsw >>> 8)) & 0xff00ff00) + ); + laneLsw = ( + (((laneLsw << 8) | (laneLsw >>> 24)) & 0x00ff00ff) | + (((laneLsw << 24) | (laneLsw >>> 8)) & 0xff00ff00) + ); + + // Squeeze state to retrieve hash + hashWords.push(laneLsw); + hashWords.push(laneMsw); + } + + // Return final computed hash + return new WordArray.init(hashWords, outputLengthBytes); + }, + + clone: function () { + var clone = Hasher.clone.call(this); + + var state = clone._state = this._state.slice(0); + for (var i = 0; i < 25; i++) { + state[i] = state[i].clone(); + } + + return clone; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA3('message'); + * var hash = CryptoJS.SHA3(wordArray); + */ + C.SHA3 = Hasher._createHelper(SHA3); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA3(message, key); + */ + C.HmacSHA3 = Hasher._createHmacHelper(SHA3); + }(Math)); + + + return CryptoJS.SHA3; + +})); +},{"./core":29,"./x64-core":31}],31:[function(require,module,exports){ +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function (undefined) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var X32WordArray = C_lib.WordArray; + + /** + * x64 namespace. + */ + var C_x64 = C.x64 = {}; + + /** + * A 64-bit word. + */ + var X64Word = C_x64.Word = Base.extend({ + /** + * Initializes a newly created 64-bit word. + * + * @param {number} high The high 32 bits. + * @param {number} low The low 32 bits. + * + * @example + * + * var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607); + */ + init: function (high, low) { + this.high = high; + this.low = low; + } + + /** + * Bitwise NOTs this word. + * + * @return {X64Word} A new x64-Word object after negating. + * + * @example + * + * var negated = x64Word.not(); + */ + // not: function () { + // var high = ~this.high; + // var low = ~this.low; + + // return X64Word.create(high, low); + // }, + + /** + * Bitwise ANDs this word with the passed word. + * + * @param {X64Word} word The x64-Word to AND with this word. + * + * @return {X64Word} A new x64-Word object after ANDing. + * + * @example + * + * var anded = x64Word.and(anotherX64Word); + */ + // and: function (word) { + // var high = this.high & word.high; + // var low = this.low & word.low; + + // return X64Word.create(high, low); + // }, + + /** + * Bitwise ORs this word with the passed word. + * + * @param {X64Word} word The x64-Word to OR with this word. + * + * @return {X64Word} A new x64-Word object after ORing. + * + * @example + * + * var ored = x64Word.or(anotherX64Word); + */ + // or: function (word) { + // var high = this.high | word.high; + // var low = this.low | word.low; + + // return X64Word.create(high, low); + // }, + + /** + * Bitwise XORs this word with the passed word. + * + * @param {X64Word} word The x64-Word to XOR with this word. + * + * @return {X64Word} A new x64-Word object after XORing. + * + * @example + * + * var xored = x64Word.xor(anotherX64Word); + */ + // xor: function (word) { + // var high = this.high ^ word.high; + // var low = this.low ^ word.low; + + // return X64Word.create(high, low); + // }, + + /** + * Shifts this word n bits to the left. + * + * @param {number} n The number of bits to shift. + * + * @return {X64Word} A new x64-Word object after shifting. + * + * @example + * + * var shifted = x64Word.shiftL(25); + */ + // shiftL: function (n) { + // if (n < 32) { + // var high = (this.high << n) | (this.low >>> (32 - n)); + // var low = this.low << n; + // } else { + // var high = this.low << (n - 32); + // var low = 0; + // } + + // return X64Word.create(high, low); + // }, + + /** + * Shifts this word n bits to the right. + * + * @param {number} n The number of bits to shift. + * + * @return {X64Word} A new x64-Word object after shifting. + * + * @example + * + * var shifted = x64Word.shiftR(7); + */ + // shiftR: function (n) { + // if (n < 32) { + // var low = (this.low >>> n) | (this.high << (32 - n)); + // var high = this.high >>> n; + // } else { + // var low = this.high >>> (n - 32); + // var high = 0; + // } + + // return X64Word.create(high, low); + // }, + + /** + * Rotates this word n bits to the left. + * + * @param {number} n The number of bits to rotate. + * + * @return {X64Word} A new x64-Word object after rotating. + * + * @example + * + * var rotated = x64Word.rotL(25); + */ + // rotL: function (n) { + // return this.shiftL(n).or(this.shiftR(64 - n)); + // }, + + /** + * Rotates this word n bits to the right. + * + * @param {number} n The number of bits to rotate. + * + * @return {X64Word} A new x64-Word object after rotating. + * + * @example + * + * var rotated = x64Word.rotR(7); + */ + // rotR: function (n) { + // return this.shiftR(n).or(this.shiftL(64 - n)); + // }, + + /** + * Adds this word with the passed word. + * + * @param {X64Word} word The x64-Word to add with this word. + * + * @return {X64Word} A new x64-Word object after adding. + * + * @example + * + * var added = x64Word.add(anotherX64Word); + */ + // add: function (word) { + // var low = (this.low + word.low) | 0; + // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0; + // var high = (this.high + word.high + carry) | 0; + + // return X64Word.create(high, low); + // } + }); + + /** + * An array of 64-bit words. + * + * @property {Array} words The array of CryptoJS.x64.Word objects. + * @property {number} sigBytes The number of significant bytes in this word array. + */ + var X64WordArray = C_x64.WordArray = Base.extend({ + /** + * Initializes a newly created word array. + * + * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects. + * @param {number} sigBytes (Optional) The number of significant bytes in the words. + * + * @example + * + * var wordArray = CryptoJS.x64.WordArray.create(); + * + * var wordArray = CryptoJS.x64.WordArray.create([ + * CryptoJS.x64.Word.create(0x00010203, 0x04050607), + * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f) + * ]); + * + * var wordArray = CryptoJS.x64.WordArray.create([ + * CryptoJS.x64.Word.create(0x00010203, 0x04050607), + * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f) + * ], 10); + */ + init: function (words, sigBytes) { + words = this.words = words || []; + + if (sigBytes != undefined) { + this.sigBytes = sigBytes; + } else { + this.sigBytes = words.length * 8; + } + }, + + /** + * Converts this 64-bit word array to a 32-bit word array. + * + * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array. + * + * @example + * + * var x32WordArray = x64WordArray.toX32(); + */ + toX32: function () { + // Shortcuts + var x64Words = this.words; + var x64WordsLength = x64Words.length; + + // Convert + var x32Words = []; + for (var i = 0; i < x64WordsLength; i++) { + var x64Word = x64Words[i]; + x32Words.push(x64Word.high); + x32Words.push(x64Word.low); + } + + return X32WordArray.create(x32Words, this.sigBytes); + }, + + /** + * Creates a copy of this word array. + * + * @return {X64WordArray} The clone. + * + * @example + * + * var clone = x64WordArray.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + + // Clone "words" array + var words = clone.words = this.words.slice(0); + + // Clone each X64Word object + var wordsLength = words.length; + for (var i = 0; i < wordsLength; i++) { + words[i] = words[i].clone(); + } + + return clone; + } + }); + }()); + + + return CryptoJS; + +})); +},{"./core":29}],"bignumber.js":[function(require,module,exports){ 'use strict'; module.exports = BigNumber; // jshint ignore:line @@ -3676,7 +5263,6 @@ var web3 = require('./lib/web3'); web3.providers.HttpProvider = require('./lib/web3/httpprovider'); web3.providers.QtSyncProvider = require('./lib/web3/qtsync'); web3.eth.contract = require('./lib/web3/contract'); -web3.abi = require('./lib/solidity/abi'); // dont override global variable if (typeof window !== 'undefined' && typeof window.web3 === 'undefined') { @@ -3686,7 +5272,7 @@ if (typeof window !== 'undefined' && typeof window.web3 === 'undefined') { module.exports = web3; -},{"./lib/solidity/abi":1,"./lib/web3":10,"./lib/web3/contract":11,"./lib/web3/httpprovider":19,"./lib/web3/qtsync":24}]},{},["web3"]) +},{"./lib/web3":9,"./lib/web3/contract":11,"./lib/web3/httpprovider":19,"./lib/web3/qtsync":24}]},{},["web3"]) //# sourceMappingURL=web3-light.js.map diff --git a/miner/agent.go b/miner/agent.go index da2a2008df..3ed3ba839e 100644 --- a/miner/agent.go +++ b/miner/agent.go @@ -40,7 +40,6 @@ func (self *CpuAgent) Stop() { defer self.mu.Unlock() close(self.quit) - close(self.quitCurrentOp) } func (self *CpuAgent) Start() { @@ -50,7 +49,6 @@ func (self *CpuAgent) Start() { self.quit = make(chan struct{}) // creating current op ch makes sure we're not closing a nil ch // later on - self.quitCurrentOp = make(chan struct{}) self.workCh = make(chan *types.Block, 1) go self.update() @@ -62,11 +60,19 @@ out: select { case block := <-self.workCh: self.mu.Lock() - close(self.quitCurrentOp) + if self.quitCurrentOp != nil { + close(self.quitCurrentOp) + } + self.quitCurrentOp = make(chan struct{}) + go self.mine(block, self.quitCurrentOp) self.mu.Unlock() - - go self.mine(block) case <-self.quit: + self.mu.Lock() + if self.quitCurrentOp != nil { + close(self.quitCurrentOp) + self.quitCurrentOp = nil + } + self.mu.Unlock() break out } } @@ -84,16 +90,11 @@ done: } } -func (self *CpuAgent) mine(block *types.Block) { +func (self *CpuAgent) mine(block *types.Block, stop <- chan struct{}) { glog.V(logger.Debug).Infof("(re)started agent[%d]. mining...\n", self.index) - // Reset the channel - self.mu.Lock() - self.quitCurrentOp = make(chan struct{}) - self.mu.Unlock() - // Mine - nonce, mixDigest := self.pow.Search(block, self.quitCurrentOp) + nonce, mixDigest := self.pow.Search(block, stop) if nonce != 0 { block.SetNonce(nonce) block.Header().MixDigest = common.BytesToHash(mixDigest) diff --git a/miner/miner.go b/miner/miner.go index 3f87e81515..20ca81648a 100644 --- a/miner/miner.go +++ b/miner/miner.go @@ -39,8 +39,13 @@ func New(eth core.Backend, mux *event.TypeMux, pow pow.PoW) *Miner { return miner } +// update keeps track of the downloader events. Please be aware that this is a one shot type of update loop. +// It's entered once and as soon as `Done` or `Failed` has been broadcasted the events are unregistered and +// the loop is exited. This to prevent a major security vuln where external parties can DOS you with blocks +// and halt your mining operation for as long as the DOS continues. func (self *Miner) update() { events := self.mux.Subscribe(downloader.StartEvent{}, downloader.DoneEvent{}, downloader.FailedEvent{}) +out: for ev := range events.Chan() { switch ev.(type) { case downloader.StartEvent: @@ -58,6 +63,10 @@ func (self *Miner) update() { if shouldStart { self.Start(self.coinbase, self.threads) } + // unsubscribe. we're only interested in this event once + events.Unsubscribe() + // stop immediately and ignore all further pending events + break out } } } diff --git a/miner/worker.go b/miner/worker.go index d5f9dd8c55..5e4ff7510f 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -224,7 +224,13 @@ func (self *worker) wait() { } self.mux.Post(core.NewMinedBlockEvent{block}) - glog.V(logger.Info).Infof("🔨 Mined block #%v", block.Number()) + var stale string + canonBlock := self.chain.GetBlockByNumber(block.NumberU64()) + if canonBlock != nil && canonBlock.Hash() != block.Hash() { + stale = "stale-" + } + + glog.V(logger.Info).Infof("🔨 Mined %sblock #%v (%x)", stale, block.Number(), block.Hash().Bytes()[:4]) jsonlogger.LogJson(&logger.EthMinerNewBlock{ BlockHash: block.Hash().Hex(), @@ -264,6 +270,7 @@ func (self *worker) makeCurrent() { } block.Header().Extra = self.extra + // when 08 is processed ancestors contain 07 (quick block) current := env(block, self.eth) for _, ancestor := range self.chain.GetAncestors(block, 7) { for _, uncle := range ancestor.Uncles() { diff --git a/rpc/api.go b/rpc/api.go index b59253ef73..6b37acb034 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -1,11 +1,12 @@ package rpc import ( + "bytes" "encoding/json" "math/big" - // "sync" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/logger/glog" @@ -230,7 +231,14 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err block := api.xeth().EthBlockByNumber(args.BlockNumber) br := NewBlockRes(block, args.IncludeTxs) - + // If request was for "pending", nil nonsensical fields + if args.BlockNumber == -2 { + br.BlockHash = nil + br.BlockNumber = nil + br.Miner = nil + br.Nonce = nil + br.LogsBloom = nil + } *reply = br case "eth_getTransactionByHash": args := new(HashArgs) @@ -240,9 +248,12 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err tx, bhash, bnum, txi := api.xeth().EthTransactionByHash(args.Hash) if tx != nil { v := NewTransactionRes(tx) - v.BlockHash = newHexData(bhash) - v.BlockNumber = newHexNum(bnum) - v.TxIndex = newHexNum(txi) + // if the blockhash is 0, assume this is a pending transaction + if bytes.Compare(bhash.Bytes(), bytes.Repeat([]byte{0}, 32)) != 0 { + v.BlockHash = newHexData(bhash) + v.BlockNumber = newHexNum(bnum) + v.TxIndex = newHexNum(txi) + } *reply = v } case "eth_getTransactionByBlockHashAndIndex": @@ -334,10 +345,9 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err return NewNotImplementedError(req.Method) case "eth_compileSolidity": - solc, _ := api.xeth().Solc() if solc == nil { - return NewNotImplementedError(req.Method) + return NewNotAvailableError(req.Method, "solc (solidity compiler) not found") } args := new(SourceArgs) @@ -345,12 +355,11 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err return err } - contract, err := solc.Compile(args.Source) + contracts, err := solc.Compile(args.Source) if err != nil { return err } - contract.Code = newHexData(contract.Code).String() - *reply = contract + *reply = contracts case "eth_newFilter": args := new(BlockFilterArgs) @@ -553,6 +562,13 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err case "eth_hashrate": *reply = newHexNum(api.xeth().HashRate()) + case "ext_disasm": + args := new(SourceArgs) + if err := json.Unmarshal(req.Params, &args); err != nil { + return err + } + + *reply = vm.Disasm(common.FromHex(args.Source)) // case "eth_register": // // Placeholder for actual type @@ -577,7 +593,7 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err return NewNotImplementedError(req.Method) } - glog.V(logger.Detail).Infof("Reply: %T %s\n", reply, reply) + // glog.V(logger.Detail).Infof("Reply: %v\n", reply) return nil } diff --git a/rpc/api_test.go b/rpc/api_test.go index b49e27bd1a..d1dcad2667 100644 --- a/rpc/api_test.go +++ b/rpc/api_test.go @@ -2,14 +2,11 @@ package rpc import ( "encoding/json" - // "sync" - "testing" - // "time" - // "fmt" - "io/ioutil" "strconv" + "testing" "github.com/ethereum/go-ethereum/common/compiler" + "github.com/ethereum/go-ethereum/eth" "github.com/ethereum/go-ethereum/xeth" ) @@ -30,12 +27,15 @@ func TestWeb3Sha3(t *testing.T) { } } +const solcVersion = "0.9.23" + func TestCompileSolidity(t *testing.T) { - t.Skip() solc, err := compiler.New("") if solc == nil { - t.Skip("no solidity compiler") + t.Skip("no solc found: skip") + } else if solc.Version() != solcVersion { + t.Logf("WARNING: solc different version found (%v, test written for %v, may need to update)", solc.Version(), solcVersion) } source := `contract test {\n` + " /// @notice Will multiply `a` by 7." + `\n` + @@ -46,16 +46,16 @@ func TestCompileSolidity(t *testing.T) { jsonstr := `{"jsonrpc":"2.0","method":"eth_compileSolidity","params":["` + source + `"],"id":64}` - //expCode := "605280600c6000396000f3006000357c010000000000000000000000000000000000000000000000000000000090048063c6888fa114602e57005b60376004356041565b8060005260206000f35b6000600782029050604d565b91905056" + expCode := "0x605880600c6000396000f3006000357c010000000000000000000000000000000000000000000000000000000090048063c6888fa114602e57005b603d6004803590602001506047565b8060005260206000f35b60006007820290506053565b91905056" expAbiDefinition := `[{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name":"multiply","outputs":[{"name":"d","type":"uint256"}],"type":"function"}]` expUserDoc := `{"methods":{"multiply(uint256)":{"notice":"Will multiply ` + "`a`" + ` by 7."}}}` expDeveloperDoc := `{"methods":{}}` - expCompilerVersion := `0.9.13` + expCompilerVersion := solc.Version() expLanguage := "Solidity" expLanguageVersion := "0" expSource := source - api := NewEthereumApi(&xeth.XEth{}) + api := NewEthereumApi(xeth.NewTest(ð.Ethereum{}, nil)) var req RpcRequest json.Unmarshal([]byte(jsonstr), &req) @@ -70,26 +70,34 @@ func TestCompileSolidity(t *testing.T) { t.Errorf("expected no error, got %v", err) } - var contract = compiler.Contract{} - err = json.Unmarshal(respjson, &contract) + var contracts = make(map[string]*compiler.Contract) + err = json.Unmarshal(respjson, &contracts) if err != nil { t.Errorf("expected no error, got %v", err) } - /* - if contract.Code != expCode { - t.Errorf("Expected %s got %s", expCode, contract.Code) - } - */ + if len(contracts) != 1 { + t.Errorf("expected one contract, got %v", len(contracts)) + } + + contract := contracts["test"] + + if contract.Code != expCode { + t.Errorf("Expected \n%s got \n%s", expCode, contract.Code) + } + if strconv.Quote(contract.Info.Source) != `"`+expSource+`"` { t.Errorf("Expected \n'%s' got \n'%s'", expSource, strconv.Quote(contract.Info.Source)) } + if contract.Info.Language != expLanguage { t.Errorf("Expected %s got %s", expLanguage, contract.Info.Language) } + if contract.Info.LanguageVersion != expLanguageVersion { t.Errorf("Expected %s got %s", expLanguageVersion, contract.Info.LanguageVersion) } + if contract.Info.CompilerVersion != expCompilerVersion { t.Errorf("Expected %s got %s", expCompilerVersion, contract.Info.CompilerVersion) } @@ -112,8 +120,6 @@ func TestCompileSolidity(t *testing.T) { if string(abidef) != expAbiDefinition { t.Errorf("Expected \n'%s' got \n'%s'", expAbiDefinition, string(abidef)) } - ioutil.WriteFile("/tmp/abidef", []byte(string(abidef)), 0700) - ioutil.WriteFile("/tmp/expabidef", []byte(expAbiDefinition), 0700) if string(userdoc) != expUserDoc { t.Errorf("Expected \n'%s' got \n'%s'", expUserDoc, string(userdoc)) diff --git a/rpc/http.go b/rpc/http.go index 9b3fa51426..f37e102f5d 100644 --- a/rpc/http.go +++ b/rpc/http.go @@ -6,6 +6,7 @@ import ( "io" "io/ioutil" "net/http" + "strings" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/logger/glog" @@ -39,7 +40,7 @@ func Start(pipe *xeth.XEth, config RpcConfig) error { if len(config.CorsDomain) > 0 { var opts cors.Options opts.AllowedMethods = []string{"POST"} - opts.AllowedOrigins = []string{config.CorsDomain} + opts.AllowedOrigins = strings.Split(config.CorsDomain, " ") c := cors.New(opts) handler = newStoppableHandler(c.Handler(JSONRPC(pipe)), l.stop) diff --git a/tests/block_test.go b/tests/block_test.go index 0ba0aefa21..d17cab4779 100644 --- a/tests/block_test.go +++ b/tests/block_test.go @@ -48,6 +48,10 @@ func TestBcTotalDifficulty(t *testing.T) { runBlockTestsInFile("files/BlockTests/bcTotalDifficultyTest.json", []string{}, t) } +func TestBcWallet(t *testing.T) { + runBlockTestsInFile("files/BlockTests/bcWalletTest.json", []string{}, t) +} + func runBlockTestsInFile(filepath string, snafus []string, t *testing.T) { bt, err := LoadBlockTests(filepath) if err != nil { diff --git a/tests/files/StateTests/stCallCreateCallCodeTest.json b/tests/files/StateTests/stCallCreateCallCodeTest.json index f295779a4b..a86192ede9 100644 --- a/tests/files/StateTests/stCallCreateCallCodeTest.json +++ b/tests/files/StateTests/stCallCreateCallCodeTest.json @@ -924,6 +924,440 @@ "value" : "0x0186a0" } }, + "createFailBalanceTooLow" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x05f5e100", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640017", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x715d", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7638e8c", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "5833e19631ddedaf4e3c9a766f696c2e59e7524e388eb871be19dc8e0ce37b6e", + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x605a60005360016000670de0b6b3a7640018f0ff", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0xcf1d", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "0x17" + } + }, + "createInitFailBadJumpDestination" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x05f5e100", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a76586a0", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x05f58340", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a16cf620", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "ccf7765eff3effe22a5f853099f7da88291b8346b689ffbf54b729ba04170e59", + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x6056600053600160006001f0ff", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x05f5e100", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "0x0186a0" + } + }, + "createInitFailStackSizeLargerThan1024" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x05f5e100", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a76586a0", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x05f58340", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a16cf620", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "ccf7765eff3effe22a5f853099f7da88291b8346b689ffbf54b729ba04170e59", + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x7f6103ff6000525b7f0102030405060708090a0102030405060708090a010203046000527f05060708090a0102600160005103600052600051600657000000000000000000602052604060006001f0ff", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x05f5e100", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "0x0186a0" + } + }, + "createInitFailStackUnderflow" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x05f5e100", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a76586a0", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x05f58340", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a16cf620", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "ccf7765eff3effe22a5f853099f7da88291b8346b689ffbf54b729ba04170e59", + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x6001600053600160006001f0ff", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x05f5e100", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "0x0186a0" + } + }, + "createInitFailUndefinedInstruction" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x05f5e100", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a76586a0", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x05f58340", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a16cf620", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "ccf7765eff3effe22a5f853099f7da88291b8346b689ffbf54b729ba04170e59", + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60f4600053600160006001f0ff", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x05f5e100", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "0x0186a0" + } + }, + "createInitFail_OOGduringInit" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x05f5e100", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a76586a0", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x715d", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7620803", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "297303455494578a5176177ff1b9db0b0a516255a3d062fb960bbc99e60d8eb5", + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x605a600053600160006001f0ff", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0xcf1d", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "0x0186a0" + } + }, + "createInitOOGforCREATE" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x05f5e100", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x605a600053600160006001f0ff", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0xcf1c", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a76330e4", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "b61e4a95fae40806b0ddef0883479c3db70e79e019ab4260535560827525c00c", + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x605a600053600160006001f0ff", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0xcf1c", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "0x0186a0" + } + }, "createJS_ExampleContract" : { "env" : { "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", diff --git a/tests/files/StateTests/stMemoryStressTest.json b/tests/files/StateTests/stMemoryStressTest.json index 821d7b31fa..a279502b9a 100644 --- a/tests/files/StateTests/stMemoryStressTest.json +++ b/tests/files/StateTests/stMemoryStressTest.json @@ -266,35 +266,35 @@ }, "logs" : [ ], - "out" : "0x00", + "out" : "#4294967295", "post" : { "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { "balance" : "0x0de0b6b3a7640000", - "code" : "0x6401000000016000f3", + "code" : "0x63ffffffff6000f3", "nonce" : "0x00", "storage" : { } }, "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { - "balance" : "0x200018085211", + "balance" : "0x20001800520e", "code" : "0x", "nonce" : "0x00", "storage" : { } }, "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { - "balance" : "0x1869ec3b06114f6f", + "balance" : "0x1869ec3b06194f72", "code" : "0x", "nonce" : "0x01", "storage" : { } } }, - "postStateRoot" : "8745f6bdec4290420747b8c024382c6ed14e09f4a11718bdc1f0f99e4d04607b", + "postStateRoot" : "1716bcf6c106040a46ab1d37c569b7e0841f921b4d252dc5202fb05388308a39", "pre" : { "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { "balance" : "0x0de0b6b3a7640000", - "code" : "0x6401000000016000f3", + "code" : "0x63ffffffff6000f3", "nonce" : "0x00", "storage" : { } @@ -328,11 +328,11 @@ }, "logs" : [ ], - "out" : "0x", + "out" : "#4294967295", "post" : { "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { "balance" : "0x0de0b6b3a7640000", - "code" : "0x60016000526401000000006000f3", + "code" : "0x600160005263ffffffff6000f3", "nonce" : "0x00", "storage" : { } @@ -352,11 +352,11 @@ } } }, - "postStateRoot" : "e6c6c5b997cf7ecbc653c920a5b42d1ddd9f9ca2df2c68fd47059df2a3309b14", + "postStateRoot" : "b95676d3103fc4a6bdcfb1c201a6ed49e0fa7a239520a4b8ac034ce3b6c697eb", "pre" : { "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { "balance" : "0x0de0b6b3a7640000", - "code" : "0x60016000526401000000006000f3", + "code" : "0x600160005263ffffffff6000f3", "nonce" : "0x00", "storage" : { } diff --git a/tests/files/StateTests/stRecursiveCreate.json b/tests/files/StateTests/stRecursiveCreate.json index 7f07c2c6d7..4788f79dba 100644 --- a/tests/files/StateTests/stRecursiveCreate.json +++ b/tests/files/StateTests/stRecursiveCreate.json @@ -144,5 +144,8260 @@ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", "value" : "0x0186a0" } + }, + "recursiveCreateReturnValue" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x02540be400", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0007318879928543f66b36e58900a870dfa83312" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x141182812579a73e13dd878d8a94bb628143b098" + } + }, + "001864a1fbee8126e530b9242353d9cb76b043f9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb651decbba52842e8fc86afda1168ac549dea7d7" + } + }, + "002b88d7e31f20b1cec3ae31ef8ae3f017820cf7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0a1960fde1fc2010660dc9cdc299facac4502364" + } + }, + "00ae33b99c24c45ce086aa9a1844fe8ed55ec312" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf4489af2af8424c6edf0d0adc525680dea208a32" + } + }, + "00c3d96a0eaddf7975da5c8718c26d65de0de59b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe089f14df5e00aff3b03cac5e1236f5cf5832d60" + } + }, + "00eb1775a16c0965c299f06a0873e11825f915e3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xec5f2ac1947c51c5982eb0ab63d1e6439f45c2e4" + } + }, + "00eb67f5e410e28c16861fea7a2ecc1e0011a75f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x61144e43a08b3852bcd531d13f0485743bd835a4" + } + }, + "0116be8937cb591d6db17246c91dc3deb1fd0e1e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x42bbb8e2c7347e29f3a679e4cc9d1ca75319fbd4" + } + }, + "012255fe8647bfe207603a62536ac6ae7a230ca9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe24778b9ec00cc9bef91643e31885deee719207f" + } + }, + "014337758eb4abf60a8e458a97acbd8b47fa0c31" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb88173b953f6c1b613b6e878cfdb34899e3339ad" + } + }, + "01619145d576c5b3130eeed16f29501f2773c958" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x03b685fb90981f103fde64c3bbb5fd701c84dd0e" + } + }, + "016cfb16ce1ab4c15eab782e1ac3b0d7f5bb264b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x52ff6062b4e65231065d5579f870b7f1472a5854" + } + }, + "0177fee01c15eede3b794e761753c1f6d108b7f3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfd437bf9d51bac3a2757bf4b8bf38045e78d5adb" + } + }, + "018b456893203c6e3a5661e7328b5a858904cdc1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4d92228ffbe5ea89389a34a7086e4420d61eb70c" + } + }, + "0199dd91369b5ce0467b68d57beaf1d96fdc769a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x974beeae03d1860c485c0dbb68e5413317770b17" + } + }, + "01b26e834122a942828698305a84789ec47c0454" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9580d4c2c6795fcb1ec84bf6a58b873fb2737789" + } + }, + "02391d38c9b4f03e9225ae5b28230284fa397a09" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe908278cc1515f214049c48c3a8908524f2cc408" + } + }, + "029f9045d1904fe6076c4dbe77bd33290f390714" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xdef94fccb1b7dfbe1cf0b3dcaa03a77cf58ae769" + } + }, + "02c577c9c1b247c0ea60b1dd50fa895c086e2f2a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x06c4341ea63b3431260716e2162ba90abd9628c4" + } + }, + "02c7efe87a470a521338ba476a0eaf7a535c9c56" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x33c85ce982d0996ff7313c1387ab93348a6777d8" + } + }, + "02fa5c7476f2d423f27ac8afa1e357db95f920fd" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x11fde66f162bbb0e19d68f0c774c997d0165fa57" + } + }, + "02fee10ca6c1ed23e651f29c97a310b1b4dad13f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x91c87b19dcd811fc5efc567a022bca52d5e2e253" + } + }, + "033b61ab81ffc5adce16d365458629d9f3482129" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc5a28cdc8c4b089c87ed4938ed4718253c48dd7b" + } + }, + "03b685fb90981f103fde64c3bbb5fd701c84dd0d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe5baf7303b008f333c57491345e604d52fce0d64" + } + }, + "03f3095f9e46a8ac62005c42aaccbc0fcdc3aa32" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa71525ab6694ead3c1be0aad07bac06e69192525" + } + }, + "04110d816c380812a427968ece99b1c963dfbce6" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa9647f4a0a14042d91dc33c0328030a7157c93af" + } + }, + "04308fa2e7af944dd7008a7edbe5221a52e2bc87" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xea186a9a4815581b71403480abae5cc7c57c00bf" + } + }, + "0441738f9f0a045afd77a72ef8398475c1111471" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc82d5a989ed7c8ffdf79ea0724b3c9ba3fb84e58" + } + }, + "0462dd089e0519c581654520d17763635011fdff" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe32bec776748185042cb02d58fad1d5027bbaf00" + } + }, + "0473710fb4277459429e0c4a862ad3e4b45692e4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6168c5e3b7d7c870e3e7eb53b152fcb920c8e1ec" + } + }, + "04929feafa156581a24d8a0bfe8154ffab39fb37" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x51cc4a0bffdbdd8313ed94ebfd5524e8200f4877" + } + }, + "04a104904b31f401966da211ef40874d6e97ae46" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x25f81565c6ac2e22d7e320168222450c2cdf4f6e" + } + }, + "0581dee4d5420c2f6b1614ca62a4d66bcf383d0e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x871986919b8ac4032193739eeae09c66765f0f16" + } + }, + "059ec3d5a255df8a5b592659ea5fdd963e9bd0c2" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x76ea1b9309253b5c03bbd6e9fca6591b51fb3786" + } + }, + "05e29ccc32df8edacbc5bd6fe19fb4ca02928969" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5b71d8cc27346cf6d64e101aab9c88dfd58d26fd" + } + }, + "0602479ffb0636a1ce0fb57bf7949cc978250d2a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x24ce22b6a7f4227e1e3a6c03c14d07acdb2ec554" + } + }, + "060e7bcadd084fcf19db5cc1ea769550bd8f7508" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xbbdb82e2b1ebae617370e1c27542ea087a4fa938" + } + }, + "065c627bc67fca3636da49c34994b6efb2adaad0" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x26be5205dce0ce433dca3602886578160e6d52c2" + } + }, + "06c4341ea63b3431260716e2162ba90abd9628c3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3a9d3ead70f9c3cdf9a64b25b5c1bf765fe09fed" + } + }, + "0723789d0c7093f6e97c3fdeb1324a75427ca6e8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4f14a61b9f2f99e50b719f1345e76339f7618203" + } + }, + "076ad7e168093f590a74f6fdce56b492a23baa2b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf5472ede25cb83dc2fe392b01111133b777709ba" + } + }, + "0801871b468dfdcc2d3bc0c0d01cb6ee02afe581" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x751c9d6e9b6d91897ab1754b15b72712953de9bf" + } + }, + "0802fc1dc1a5dec7fcbf1d50f3d8a944099ad72e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7d8e57afa6550a1be621fb6c083aca311a1e229d" + } + }, + "080e2ae63ad3891bfba9ec5200f4ba383209ecde" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x93a5ddc7d7b2a2bbb7a61086aa6fd0cc9e202b0e" + } + }, + "0891a47ead61f684dc876e12d5261ab614d0fa09" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd09a49b1cdb208e2504486267ca2418c87152963" + } + }, + "08d19f247ca974ee89d4f988cac4becf7a177723" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4b2c0c38418eb142d686d124ac5fcb363b061fd8" + } + }, + "08f86cd9e45cd0f821b6088ce2f1b3c0f70dba07" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb1691d2608aea9d7a56083dc7dcbfacc93a4287b" + } + }, + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "0x0132b3a0", + "code" : "0x602060006000396001602060006000f001600055", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd2571607e241ecf590ed94b12d87c94babe36db7" + } + }, + "098de34931d0d159e2631aee55524c217624d095" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa3ad081c8f3b79ad20285e881e0e4d011efc0130" + } + }, + "09957f64c3396f36daa03c68fa6c997eb7903df1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x64134c8f0ed52a13bd0a00ff9fc6db6e0832e39f" + } + }, + "09986b78d02ae7c8eaa8b62053a3ee78deba79ab" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc775193c9d81ed6ee806f6005a874b927e96ff1a" + } + }, + "0a1960fde1fc2010660dc9cdc299facac4502363" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x51fd18c9ab9bbb67c27373e8ad754e253e09dbde" + } + }, + "0a517d755cebbf66312b30fff713666a9cb917e0" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x95a4d7cccb5204733874fa87285a176fe1e9e241" + } + }, + "0a9015286f76ca4fbcc33e74e9c414be9774a67c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5e5a0b9c4c36067c8730abecdb29ba97aed877a8" + } + }, + "0b4b7f08623d9b3d6514baf529399e4f1c0ad944" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x569e42b9cd8d79ee5c5ea9c68ba948b7b4d8d84f" + } + }, + "0b98f3276e76e9982d7f6996878ea5196fda62f1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3867a470ae1d99ccc7af287ed95ea4da4fd49e53" + } + }, + "0ba7f30a90b699e3f906bff7599b230890bbd56b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xaeef5b5a721ea3c03ca909bf1f71c122ebcd32b0" + } + }, + "0bec2514a2a40586ec75e27442352d1dd2bce537" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0f065de4c5c4a842f52a30fdf7b0162594df70a4" + } + }, + "0c0cd995ac9e488544723e3e8e90a5fed98a6958" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x42f56890357c304762f1c57171cef30f044ea09c" + } + }, + "0c1e13b0604290abd900eba3fb6b7560b3401f58" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x295882ddd91b2f92c43bad0a51fd0ef7af61e72a" + } + }, + "0d11b1966fa90191f6927943c476d36fa3a31556" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf2d923a66a9684f2268530094ce8e3f8b8cae52f" + } + }, + "0d1e5ab3b0c2d1ad5a562c123b7f01f4145074ce" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2ed524088290909f92ade6d5f9d9c24071c26663" + } + }, + "0e0905211a442bb5838d2d6860f4f21e6b9c6593" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe134cc9b2be1a15b9e270a9f7baacbda3c8b365a" + } + }, + "0e639c40606e9329259d2f945f59dbcc6c5c5cfe" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x83abf69971313b011ee30466e8f703a460400558" + } + }, + "0e700a2aba22bd639abf05addbb24c53c3f0f3cb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1039c22c55420b0d7e65e6e6e65798f3f4c1e726" + } + }, + "0e8dab5716375707d97656230beb5f1445e56309" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6fc7016fa33af287b3b9cacd092c26bd9a05456a" + } + }, + "0eca69ecf3068082cff932c044fe39142ab6268b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4fc34bdd654289653ffc904f86ab2f17bad8431e" + } + }, + "0f065de4c5c4a842f52a30fdf7b0162594df70a3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7ba53872256e6762bbfdbefb1bb80b26f94df9f2" + } + }, + "0f0f333b14cae00e0f74e1de336437d5644ae336" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3dd6e0baadd05402f490e3030ef1970d884a1cb0" + } + }, + "0f2fc64833681664e54ca74ea756c7233a05dd85" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x02391d38c9b4f03e9225ae5b28230284fa397a0a" + } + }, + "0f8f271215cf51a0646c8a60ed626515b3ddb739" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8e1f5c577cd5a404507687ef379cd1e41c4a9a9f" + } + }, + "1039c22c55420b0d7e65e6e6e65798f3f4c1e725" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3fde19fb418799c0e1744b322314c17a863a0c9d" + } + }, + "104f577c92f14f3684c13eb179b9969c05115604" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3c7c94fe8e900964a9885a19e09a4ab80213c5c4" + } + }, + "1057c6ef671b124fc14b5641c167c6e6756d8cb8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc06bd5d93ac2ecab95942d1639b700e3a2cc48b9" + } + }, + "1121c3fb4f490140339dabac59a62dd59a9912de" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x61306db8b4ac256266cb379b5f686e25cc117591" + } + }, + "11895349d40ea4683803f8eb7ad1d2355ff906d8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x31e7dce7c8469a6dc612dd8c0a1242846d31c06a" + } + }, + "11fde66f162bbb0e19d68f0c774c997d0165fa56" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x36630619f71ccd89ea6fba8b13099d1483187b18" + } + }, + "1209046d7bf46e81d8202422e630719c906653da" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc44e39eed84adf0c399a9d5af8d0053715d0f5fa" + } + }, + "120e38f3899a4e2f9f848a82c7afee288d14e7a4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf6ee7d8bf313f837bbfed7f10b16fb2f182fd417" + } + }, + "1236efbead5ada892f61e7e4e59faa143e3bc01a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa20b30a1e7723ce15f80e9706fe9c1ea05170a30" + } + }, + "128aabc28c928691ad3415e3c57010c40694cd6e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xdf5767dc4d8111e8641198f637e4423c62e57e28" + } + }, + "12eed250610e4d59e841381dc46deaea3d9305b1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe9d157e81c306452f8494f681813037b146660ec" + } + }, + "130d08c2381d23796ff403d8f1fbaf204d90e3b8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7ee27699bf52e4db7f72b3f2591f48e8ad7972a5" + } + }, + "134c36c64db09ad23fde5b43a3a7a92d84dd5300" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc8732f022b6c57d291b26c830c651b3617c75b2b" + } + }, + "13911c90a6ddef5182a772116c1d9e98f27fb1af" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb31b1fe90a535ed66dfaf1bf9e1062190fbe88a7" + } + }, + "141182812579a73e13dd878d8a94bb628143b097" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb0f8d2e75cd431ef9d818a2552aab19a6a99c1d4" + } + }, + "1456fa2cf6376b40069504e491e64aa40484fe3f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0602479ffb0636a1ce0fb57bf7949cc978250d2b" + } + }, + "1480213270423eae9d6b0a603541e989998453d1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x689a40b4f540d145f6dc4ba4079e17f84b650f9d" + } + }, + "149d393bffe9be2336e7ffd6a109f05318dc798c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x13911c90a6ddef5182a772116c1d9e98f27fb1b0" + } + }, + "14a76e43bc292a0e69bace56681c4eb50d8e52d7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x54a1706bea8f61e354b5296afa5a9f488f88ba0e" + } + }, + "15146e7f5a3d2db1c655ba9d8eaea6c62ca34496" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xaae4f6978a8eb4a7be406a2a787d31dd49cd551f" + } + }, + "1555dfd05f003c056dc219415443be1a502fdee1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb572b99fc06b16a232d74898e587398d25d7d340" + } + }, + "157f8c66dd3cae32485b2d68a51c1dd7923bf91e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x534d2d9ab80a99d598de600ac2843f751e8bef3b" + } + }, + "1588c83de3fa7b22bf6aa67a4e91f303b490cbb8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc7e31a320a9a7969a6f4c3cf98bd6d92a6119056" + } + }, + "1591af76c716952018e52e54c716e8b2226d494b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe365d9256480b1e9d3cc6eafdcad5912b75ad14a" + } + }, + "15c4f7ebfc781a41226d61bdc0fcdc98fdd8bf45" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xecd38089d14a75b93afa634276bbe8965f5642dd" + } + }, + "15e75e648b604b0b8028f7955647eac6bc850088" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xbb26680f6bb423720c6437fab35913d0a86e2a79" + } + }, + "161f83bac94d326e2a8debba84379ab72a14c6d6" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd65386ce109ffa3570dd27e54f32e2528fe01fc4" + } + }, + "1622e5aa3015448c3a7560b15a289d9aacc5370e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x291cfb4b02976ffde7f1f269a3e7d30940367e56" + } + }, + "1660ada72b0a07040df8d063f2f3f3fee891f1d0" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb8fc89fa4eae09e1b4bbb51f4c1791e589368802" + } + }, + "16c5f61453cff59c6b7e2a690cd902b72208427f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4cada4d5773385e68f4ff1efd1a23d75dbf1e61d" + } + }, + "16cab73035afa73268745a3c2937b551813c4960" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf8fc32491119dea2b7fda5080ef9cf0027590266" + } + }, + "16f5ee37c60dfd70f8281ac16cda47d665ef8789" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xdfc26965c20fea217850a28c08021f1468146102" + } + }, + "1756aed6799c904988cc7a1dfabe77fcca058655" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9606aeadd83c5da2a613b0e132f0a6c13cee43c0" + } + }, + "17c7a85a071c3dee708baeaf56c208752c362e56" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5b4615bc4b0f10948e46f967ca6e64cf91a77540" + } + }, + "18500d6a8e3e20ace9aeb507c213b6261b23f5d3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb03a2acc80fce6d54bd1db95d7ff24123ed6e107" + } + }, + "1872142d84f7023b181766b790a4487f4012527c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe28a959abf1b36ad7778737d992690cb73a51a92" + } + }, + "18731575d0a6339f6317c2a1b628d8a4c145328e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xbed1a42fdb56c7d562a773650bb2785737caca3c" + } + }, + "187749fd89567f9519f0d50b4a19ad2600440e3a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4bdd7615ee906a0c88233acc5816b4fdb4656dfb" + } + }, + "187dea0407359c9579adbdf1ba9fad4a92fb358b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x77d724d278fa787544189c4774f03849be2868f0" + } + }, + "188921ab89b5b8bcbe443676626e6012a1ed7dfb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0a9015286f76ca4fbcc33e74e9c414be9774a67d" + } + }, + "1889f5317912e414fda653c710d2c17b7d5651e2" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa5ec829bcc187b6d19e825b5b6f12f86f81cc064" + } + }, + "18934934c2f7d8b6b645fcc90460a966df3a716f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x92bbf48cf4a124ffff047cad76c82db1a1889804" + } + }, + "18e0cdfc5a23465cfb3566091849c044d2210b55" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x533069310b9741214f30aeec58be9d19f40161ff" + } + }, + "1963ac8fc10167891e91b4d3f53e09e0b7c9b55d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x29f147c366199719adcb2ed1d528c4f34c10dc04" + } + }, + "1a6bbe5380998bea238848b7a5927fa87e7b9fe1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6b5fe85d1513c1a29fa825a343db7a80558e6de6" + } + }, + "1ab2ec9fb4e5d9d8cd15a1ad495ff314b97869c6" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xbccf73dc6498406a51b4183e22c4be57de5c4976" + } + }, + "1ac3dd6a958d88e45c2c55d938dba74fa892084e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4a635e63aadc395c1801c73640f256250d209b26" + } + }, + "1b6ec3b2772285abeba8f53839fd96de995c4bd1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x15146e7f5a3d2db1c655ba9d8eaea6c62ca34497" + } + }, + "1b8a6f09f8fc9743b59ddbb2f105034e32262552" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xcfb86844738d5373ad23eb3185e1e9fc5d517ae7" + } + }, + "1bce33a58c2741f74daab60067f759e9fc5f8c40" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x352e4ddc3153285117254b1cc378d297b7a057b6" + } + }, + "1c2749b3a6c574b21622761bef7274261597ef2e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xcaf720d275e228b58bcd8b2686714ed8819cdc2c" + } + }, + "1c32901c93008d3e09928bdf3385f32ecff9500e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x161f83bac94d326e2a8debba84379ab72a14c6d7" + } + }, + "1c6c53405b0eb8800a527cc5990fe3b259b50a4a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa015c57718562f3839cdabd7d4e9c86f1a321a1c" + } + }, + "1c827d36ec915dae96fdc0b164fb7bc1be9467b6" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8228837a1a7d0ae41b857d852a8dd6b7c6cb3e39" + } + }, + "1cd063768378c77cbcb93dab0ba4c345d76bb0fe" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe857a6c6f502dd2bd0ec341b2d4ed55f2e87e8e8" + } + }, + "1cd52bab323ca2180a747d3c8b8405397003feb9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9137343457792227d68316f6ac0bc3518a7702e4" + } + }, + "1d3289a828d2bb4a86cda52b7772e2d0d508bac9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1c6c53405b0eb8800a527cc5990fe3b259b50a4b" + } + }, + "1e1505a86f6b0fb5f7a4500cca953462cde929e4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x77f263b8c785ec73f9f77dd11ab64fb0089cb165" + } + }, + "1ea264b74c8f6e50586097e2e7c9a39419fd88de" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x208d07e7177b2e975c6b6d0eb3c5566900b87dfd" + } + }, + "1ec05c9f7c0ececff5088a06157f47f3e9dac9c0" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2ccccc0744051db25927d850055234117778c1fe" + } + }, + "1ec26f14651cc567ce691ce83ef09eced6b12a6e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x284452c049bb65ec77ed7502b19abf699127c21e" + } + }, + "1f01dbf8bd02bed14cc0a21831e044faa3f66fca" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc489e22b54124b98b17b68e7c38676efb81c1863" + } + }, + "1f1960aa296fd1f00ff131357138001afcd858a9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8c2e2a704d809931e711b89162391f2dba837407" + } + }, + "1f323b00b7be1e9c0713b080cadc05f45e5e7ec3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x52b90967c04ab8adba7c6908b04eabf2c00bcf83" + } + }, + "1f5cdfaf598bd8002997b576e9ba849636c8431f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x965025b3b611003c82c8c9b69b35b4c5444cde6a" + } + }, + "1f95c6da6a9e0abe74900ec00388094d32d98a42" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfcf47e5c1414303d55afc40c75c41cf42079d561" + } + }, + "1fce5879444d729719c03b5af6e074b87a49d933" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x08f86cd9e45cd0f821b6088ce2f1b3c0f70dba08" + } + }, + "1fdfe5402a88f71bfbaf9c65f6df05b8eb6232c1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x40e0cce7d94ab21453c5576f30a598cf9fa80e1b" + } + }, + "202474905af37a5074cfbc2d2dd0f2f205a099ab" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x333872ba7e8ce9c43e158b12a3d038d06672db7f" + } + }, + "2040d98a367ea817f76fcf8574d4df51234eb492" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x188921ab89b5b8bcbe443676626e6012a1ed7dfc" + } + }, + "208d07e7177b2e975c6b6d0eb3c5566900b87dfc" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1ec05c9f7c0ececff5088a06157f47f3e9dac9c1" + } + }, + "2099c5bdda1d98ce3b99988d768fa9f812a21f24" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb021f73dfd1500257934aacddd707e6f67173ee0" + } + }, + "21115fe08f7ec434d4ec27e8dcfdf31a6e50aa09" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x38ae3c2e0c1fa2eaec3648a2829fa362b5e01352" + } + }, + "21190aebff29feb773919d8572f8cc825bbf7144" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe026a4835edf27c2705c97f237e5b59b7b5da1f8" + } + }, + "21368af8397276e6e4b284fe36f525dd323bd3da" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4ec674e8eb6b890cbb7df926def8fbbb2a6bba71" + } + }, + "22230d8d10e81e01450aa68bdfbee3c20d969de9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9cefc7e38d2a714318e5c36c3c21b226b10218e8" + } + }, + "22affea985c1a1ab7007a55e77e80c54111708be" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x559bf1337f14e89aee38a9859ec9bf8035e8f6c2" + } + }, + "22df73cba33d8fd14fc985fccded670de4041f25" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xcdcc86f0d7e95ea5b2f9f5e802015c8ff855b258" + } + }, + "22f2f312befc07db595b5d9fcbc4caa7ee8df51c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb2f828407f1a5fcbb1e4ec079c22d791c7fa5479" + } + }, + "23138c70217200a44c58dceaa4f5ab06470213a4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x71a2fa577619a37c2e2336bb6c20fc1af1938610" + } + }, + "241b46962af48709f1a19739ffdc7bd3f0d2c7ad" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x310782e2f6d97ef0abd4a4ccb75b401a7d348be7" + } + }, + "24248d1242acc87dc331e87f3142951a977a3d2c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2e574f7a4c8f0e80964604262ef68b3168fd31f0" + } + }, + "24ce22b6a7f4227e1e3a6c03c14d07acdb2ec553" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x080e2ae63ad3891bfba9ec5200f4ba383209ecdf" + } + }, + "24cea63a6f0ede9a0fa91907e841ba4174e1cd0c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8a2cab44ea3d5c52c704f060f4088e505791a57f" + } + }, + "24dd378f51adc67a50e339e8031fe9bd4aafab36" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa4202b8b8afd5354e3e40a219bdc17f6001bf2d0" + } + }, + "253a31b068a402910eb30758704b78c375ea349a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5c70cf636b26ffc099fba8ddd5093e95ca8e7783" + } + }, + "2559cea11e9d8fd293253a8ffada7558c9c4db86" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb94d3b46afb9954a375e50a6fede26705800a058" + } + }, + "25c0d5ce71eec198760c001497350ad83df55ea8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1864a1fbee8126e530b9242353d9cb76b043fa" + } + }, + "25f81565c6ac2e22d7e320168222450c2cdf4f6d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4e36ffe7590f8dd7fa9c4c03cba3120674814abd" + } + }, + "2600b9122847ee06e201ff6a734fdcfa74b2be73" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3e85699a24243e147ec809e30761d92c0d21392b" + } + }, + "2652f49b5ad98503231b3befe7587c231be8a5e8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8fb5f5dc4d66ea0233a652230d44299718cb9f9f" + } + }, + "269f24e1ae86f63876b0504b7b26e20483fa95f8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0e0905211a442bb5838d2d6860f4f21e6b9c6594" + } + }, + "26be5205dce0ce433dca3602886578160e6d52c1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x38813e8d77b07f357888ea1a7805ebf52c59189c" + } + }, + "277c19a0f1e4f5e4339de4d0223fa254a6c8a5df" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x98b163f2929e5c92709759e3215879acf32a3a99" + } + }, + "27b3a0698a207d5ed960cf71b1ee9fc54c229eb4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6e24d18a80aeccbace499b6d26b655633c0bee9a" + } + }, + "28313061667479bb25119ca3090cd25c4a99a20f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x241b46962af48709f1a19739ffdc7bd3f0d2c7ae" + } + }, + "284452c049bb65ec77ed7502b19abf699127c21d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xee21d08004e0b6f2c1cd4bcb2a04ab74f7b7b709" + } + }, + "28cd47ab2e86fe040740206eb31fe193df7cbab4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xefe2a6d8859b14ecc69baf66dcd47f4067df18e6" + } + }, + "28ce21f7f28c8a546bca1697ada45cd73473465d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7e2a31e29b84cb193202609dbd86ebaf9a83c11a" + } + }, + "291cfb4b02976ffde7f1f269a3e7d30940367e55" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x98ae7604effcc8bf6accb109ebf78fb6f5dad01e" + } + }, + "293f982d000532a7861ab122bdc4bbfd26bf9030" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x729af7294be595a0efd7d891c9e51f89c07950c8" + } + }, + "295882ddd91b2f92c43bad0a51fd0ef7af61e729" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4fe8f4ad85487cfe365ca212848f7c970c21e136" + } + }, + "29799a64a736832cda536d687dd443ef3bc31e57" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x54d1de66a65ecf30d79037a8c8af99c633113517" + } + }, + "298b8bde7997684bfe4434cf6d24d50ddabb69b2" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x25c0d5ce71eec198760c001497350ad83df55ea9" + } + }, + "299528bfdcf20ff8e19a7a3fbbdfe98eddc2604c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe0f04368af17d56c8cdb50f0fd5f1847d9a49cb2" + } + }, + "299f80e93d68725830c27cb084265d0e634e4f77" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x939023fa69f246b709a97f16c37367e36267828d" + } + }, + "29f147c366199719adcb2ed1d528c4f34c10dc03" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7c7d893aa4fba1deebfc9a5a14b27e2ae7f66404" + } + }, + "2abef5958c8b283eaeec4557844ff1fe194e6cd3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xffb9bfb24fb671413a3aae05e0f21b870eeb2aba" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x032e2d4c", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "2b5fbc2f7e76f6281861cb4282effb94d609844d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc37d1d79868b6a4c25db68301b8575ae4a8336fc" + } + }, + "2bab1d9132d47e56f937ef50987cc52c9adddf0b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2d960addf6048f155cfaac4ad513f46429bb58f2" + } + }, + "2bb175c167599417f2192d9f926a5c648d17de8f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x799b6226b099fc75d1fc2cf6f833bdfc1fe63e49" + } + }, + "2c4a413bc345da77b2d07a17313b6d89aef2c2c1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4c0cfb86a402c70e6b110a1237d10c7fc7fe9cd6" + } + }, + "2c748f96ae0e6e9b01395e8a73dfc351c46658be" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xccc8cd23dc6755bbb516af6ef2a04cc82a5ce5c8" + } + }, + "2ccccc0744051db25927d850055234117778c1fd" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x624a9bd6345be1a95c7fb509ca4bb77d05138adc" + } + }, + "2cd26944d7baa6d92eee478960d5778375862e85" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8b0dfaaf9135721f01f3712572ea9963d70f49c1" + } + }, + "2cf5732f017b0cf1b1f13a1478e10239716bf6b5" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xaae4a2e3c51c04606dcb3723456e58f3ed214f46" + } + }, + "2d142ccaa1337198d592bc36ce7c5447da73f906" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x18934934c2f7d8b6b645fcc90460a966df3a7170" + } + }, + "2d960addf6048f155cfaac4ad513f46429bb58f1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5e76969932c5d314142b23c555af4625fa6b9344" + } + }, + "2db5e35091789102bd0019b4ee49bcae42524428" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4d47d935a3a4a4618c67f337a0075d26d9c1f853" + } + }, + "2dbc14a87a2b5a8b780e460dbe0083d8260326f4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x40652c9cf91678111a21c62d7206ffbca3d47c9c" + } + }, + "2e070631694c093a9a329ec0b4a1cfa57e20ab77" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x312f80de0869a8fed49c8ba843484411c47dd13f" + } + }, + "2e574f7a4c8f0e80964604262ef68b3168fd31ef" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfe4f48d16a7ec27241b987f3545423291c7cce78" + } + }, + "2e83c90e7fa359705ed2138854a83a9145c27a8e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc071690916c15657eba376c7c6b4b06d38e815bf" + } + }, + "2ea29d9016f2b1141475e4c3c62e031c0a908a07" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x128aabc28c928691ad3415e3c57010c40694cd6f" + } + }, + "2eabf4237f49d4cd44ec256436b99ba41828d36c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1ab2ec9fb4e5d9d8cd15a1ad495ff314b97869c7" + } + }, + "2ed524088290909f92ade6d5f9d9c24071c26662" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe8373e7e464120da8a84da82c8137872cda65781" + } + }, + "2f171d1f2cf19f4a458b7dc4db89fa7cd818dda0" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe81f08cfb60f7c156cf7dcbee1b8790901a1eadd" + } + }, + "2f8ac479ce5baade6a63ecadf9599bfb0ecdecde" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5d07bd78606705bb5c62fd390123b4e45f7d74d9" + } + }, + "305773e25e157761c9d55cb7d9e24fc1b953a8b9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x462cf0e5071404ef569338a6f0a5b113d64a11a3" + } + }, + "30b37f280d6735ee04239de0963b071f83c13a27" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xba3adb3b7ccccb748a65932e0254e52ce092c5b6" + } + }, + "30c5bc3861dfc5a70325aca029ab5dcb2d72928f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x02fee10ca6c1ed23e651f29c97a310b1b4dad140" + } + }, + "30f51302b4630ea1b8bdcac380bd97d78c8f60d3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x22f2f312befc07db595b5d9fcbc4caa7ee8df51d" + } + }, + "310782e2f6d97ef0abd4a4ccb75b401a7d348be6" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x39ed2d94ee4aae100b111c773d4f3b78bd4e9292" + } + }, + "311f9efa9544b1c8a8277c52e0f1ca47daec8c00" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6ad37e86c8d4b961b0302ebf0a540ae83f3679ed" + } + }, + "312f80de0869a8fed49c8ba843484411c47dd13e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe93e7128f80bef53e3217782f21f4bd6a6d19c7d" + } + }, + "3174a074366bc04bfb7f2a728a725cb01cd575d3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc4170be517e6c67a9e65dddb09220df58e547103" + } + }, + "317f31be5e04361b11b97ff2d6fc682030d8cd8d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1fdfe5402a88f71bfbaf9c65f6df05b8eb6232c2" + } + }, + "317fda8ec45232a8259546a4ca8ebef16338d47b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9cb15938a825ff7c17ae775b6454730983522907" + } + }, + "31a87a9e67b2728c14767de26753f205b793c5ac" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe3d08fe78f595bede290f820ec0e878572803a6b" + } + }, + "31c640b92c21a1f1465c91070b4b3b4d6854195f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x98ae76bbf3fe4b779df55df06eb0081ac95d6610" + } + }, + "31e7dce7c8469a6dc612dd8c0a1242846d31c069" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xdc1baaa8621b513d62e8aeb02543ce5c7b8020c1" + } + }, + "3229e332af8eaf358f44aad3a902a6c47f96983e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8b0c28ef1527a918fc7dc134ee6c00f069c7073b" + } + }, + "32a48ace80773ad092de1d9bcaa00787353b5fad" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd3a4f3cc7113eb16572eced68ab395a40ceeda1d" + } + }, + "32de9810bbf442f9209f994556bc9a7f7e6da500" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xac0dbbd8aa555e012e1b5fde0b4e1f20e30a057f" + } + }, + "32f9418411245a8bc6982ff71436ed2de87e3d96" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0801871b468dfdcc2d3bc0c0d01cb6ee02afe582" + } + }, + "331a1cbbb58594c3636c0e54de517c4a6cedc27b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3e0506e272fb9d9369627282cd76a40e4046ee85" + } + }, + "33207da78e5ef3dde6fceab85bee1b5bf717e139" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xeca2fc261f07a269c2487e6d1b0539d0950ff793" + } + }, + "333872ba7e8ce9c43e158b12a3d038d06672db7e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5de8956c0c99e2dc6715201b3a9e1d5fd53b2dd5" + } + }, + "33b82c3871bc89d9137c62af099a0c4e5911a047" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7213c423e1db8af095bd3cefb15e43c6067635ef" + } + }, + "33c85ce982d0996ff7313c1387ab93348a6777d7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1f5cdfaf598bd8002997b576e9ba849636c84320" + } + }, + "3432c3f9f90cb61e79f39d310bdc6cb8dcb3a49a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5216a59dcffc6105f9b58a0b397baad604c0dfb7" + } + }, + "34c972120d50fbdbb38ba536e4d61bc8f995d19d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4b8558347f669cd9b50f70cb501cdbf05f93b576" + } + }, + "352e4ddc3153285117254b1cc378d297b7a057b5" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2040d98a367ea817f76fcf8574d4df51234eb493" + } + }, + "3539fe0192009fe1a9d35901b0ba951a59348a97" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6f3dda610ec5a3722ff4ab49d1f215dd26bd8ad7" + } + }, + "36630619f71ccd89ea6fba8b13099d1483187b17" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x11895349d40ea4683803f8eb7ad1d2355ff906d9" + } + }, + "3671a99d2a485b30fafa2a65f405b6b03ed32ea9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x925cdeaf40df0ac82648432e65481350417fd849" + } + }, + "36a9d95fe0c701c65370560445c6a80b4e13c8d9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xcd1171381ba62ff31b56a001b8144e64e365eba2" + } + }, + "37609ce3799a1b75ea6090da3d014d59e5e7851c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3f8bd9d9410af417dcc6969b64096380e1a6d0b4" + } + }, + "379ef6dde2bc54ced45146d4907639ee7cf1c8eb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe19f216f6b8b78ff1e705cb56d0cb07db60a05ed" + } + }, + "37f998764813b136ddf5a754f34063fd03065e36" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x24dd378f51adc67a50e339e8031fe9bd4aafab37" + } + }, + "37fa399a749c121f8a15ce77e3d9f9bec8020d7a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x04110d816c380812a427968ece99b1c963dfbce7" + } + }, + "3820c20f3f8ee1b164dab460b05a979640a41369" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7642513288c9da66960a6f3df0c156a8e1dcb11a" + } + }, + "38450559e7ed9b72c80aa00855b942f9bac1b281" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc1ab531ecade623c0c908c1fbf104fb8c647a37f" + } + }, + "38479ce52243f1a8b358515a084fb41533a723fd" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x636b02091904e5b452d19455f484306b8fe62dd7" + } + }, + "3867a470ae1d99ccc7af287ed95ea4da4fd49e52" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xde63eef4b269d8572b6b00574ad8e34c471a07d7" + } + }, + "387b1112283308ce33f63062a7531e6fe0f3af16" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6d9834013a85a25df2e3dead1986d753457d7b68" + } + }, + "38813e8d77b07f357888ea1a7805ebf52c59189b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x891c7f214e32206e8f497fdaa7ee419e2e8f3dde" + } + }, + "38ae3c2e0c1fa2eaec3648a2829fa362b5e01351" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x79f2d463ce2404b3e77db5dea5cc19d76ac223dd" + } + }, + "38c622aecb7e84ad4fcfc327ae9a1a17e2dbc36e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x30c5bc3861dfc5a70325aca029ab5dcb2d729290" + } + }, + "38fe3b47fed5fa6d060bde66598bf5a773b831eb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1057c6ef671b124fc14b5641c167c6e6756d8cb9" + } + }, + "3917f5ac4614ab7d126adf2f5b1d578f2b91c370" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2bab1d9132d47e56f937ef50987cc52c9adddf0c" + } + }, + "39457953215cb93e68bc5b351d63a8b7fd16031e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0e8dab5716375707d97656230beb5f1445e5630a" + } + }, + "39d9b351db53d59af4907116d594ebba910474f2" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0177fee01c15eede3b794e761753c1f6d108b7f4" + } + }, + "39ea196ad4678ac786f9ff4ba12edbb364cd1baf" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x202474905af37a5074cfbc2d2dd0f2f205a099ac" + } + }, + "39ed2d94ee4aae100b111c773d4f3b78bd4e9291" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa6495f085bc30ac47e89a9a700e406e26286c3f9" + } + }, + "3a9d3ead70f9c3cdf9a64b25b5c1bf765fe09fec" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb5f4de69833ef9f1392c74a5ab905c5cd1ab2875" + } + }, + "3b7465c98051ca273d8909857047d5dc5b022af7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x05e29ccc32df8edacbc5bd6fe19fb4ca0292896a" + } + }, + "3b7d7653d3a7c2712d08bd29668163cb775c74a9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x50aada85d21c462d9c2803fd3c22beacc61f496c" + } + }, + "3bfd62743dab66288fe0b993d893a41d2dc3fbba" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3539fe0192009fe1a9d35901b0ba951a59348a98" + } + }, + "3c4a4ef39f21e45a8f56e5c8bf8bacfaba78a777" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8f55e75b453fbb3071e4454119a33477c6028789" + } + }, + "3c7c94fe8e900964a9885a19e09a4ab80213c5c3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5bf1ac936d2312daf08e481d85e99151cdfdb9e2" + } + }, + "3d082c9477c05d23447d1682257a9d0ac1f948be" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x07318879928543f66b36e58900a870dfa83313" + } + }, + "3d64e9c7cee7c3d41cfbeed851fff8642bd0200b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7c41aaac568600537f36df0e35cb625dfbed75a8" + } + }, + "3d7b61ce014d1cb84465f1f908a6a940fd991b39" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9e8fe9f31e954787e0f9d01b4a7a0c8d3d320615" + } + }, + "3da1b91d461c3220510e60c0c5b87be635068740" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf85aaa082ae886506141245ea3b43ee74babca66" + } + }, + "3dd6e0baadd05402f490e3030ef1970d884a1caf" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x317f31be5e04361b11b97ff2d6fc682030d8cd8e" + } + }, + "3debce965330c2da68edb1cdd3ac380d5ce67b10" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfbdc8132551b0ed5c50b6c0f279097592b5c87f0" + } + }, + "3dff39a90e67e86536dcc8b4dbfac04da831e0b5" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc291bf92ff9bdc0e60f049e6a5b143b940658858" + } + }, + "3e0506e272fb9d9369627282cd76a40e4046ee84" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xaf3cf705624b239ce07280597a55dc8ca69dd087" + } + }, + "3e1b0d3f5819f63c9621ba4d4af623a7b89b99ae" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x401f65fb53496c7746dc6477f6f9d67246965d52" + } + }, + "3e3069deb6f503bb8bf155eb2f89801140831f5b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x94bcc8632137dd2d666003e33d1e7c2fdd6e95e5" + } + }, + "3e85699a24243e147ec809e30761d92c0d21392a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe3443d812bb8204255a1d249b82aa19508dff5ca" + } + }, + "3edca986feba79717853d9b91595ae61d953736e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x30f51302b4630ea1b8bdcac380bd97d78c8f60d4" + } + }, + "3ef5e42a0012b430169dae579f8dac0f6ef5dc38" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7e44d26c7ef8dc51a45248573f6a8e5a9f91a0af" + } + }, + "3f5bf6c71c4fae1a91c1cca72b539dd83762a716" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb4481bed4acdd11d8f22f535016a762cc87845c3" + } + }, + "3f8bd9d9410af417dcc6969b64096380e1a6d0b3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc2afed79b83fc6b8d98802f52b1fea6648571ee8" + } + }, + "3fabe5e3c3a59fd322cb638dc5295d1e94cbcea3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb7b7c5f65fc11a6bee686b9363884811be247c44" + } + }, + "3fde19fb418799c0e1744b322314c17a863a0c9c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf4e76b020a22e8c1929ba2163e413385fc0cf885" + } + }, + "401f65fb53496c7746dc6477f6f9d67246965d51" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5e0ea0c533298d20ebcd19482a8b1e1854dda426" + } + }, + "40652c9cf91678111a21c62d7206ffbca3d47c9b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xecb643ddbca1cfa6dd22964c20ef57ab47c0fdaa" + } + }, + "40e0cce7d94ab21453c5576f30a598cf9fa80e1a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x93840036a3c19b1e91ba0ea10f95a5041ef61a40" + } + }, + "411456908355aa037314aa920e8afef3632503fa" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0473710fb4277459429e0c4a862ad3e4b45692e5" + } + }, + "41493b8488a0ae34cade12733e8df93a87f3ec7f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf904cb6a599db50cc635bb70f3c23f056e39914f" + } + }, + "41eeae22551bd18167a31036b363bdcec89a7d9c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7e15566ad3e90f3c4c12c4d7fdb17e12c24da66c" + } + }, + "42bbb8e2c7347e29f3a679e4cc9d1ca75319fbd3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xbf36bc1d23eebe66f84a0f119552dc7b46fe2403" + } + }, + "42ea619ae1a90979837ad2137458d991ea0613be" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x570dce0f67e367a085e51a47d6c93891a82d452c" + } + }, + "42f56890357c304762f1c57171cef30f044ea09b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x49fc4b5136601d856188898008375b9c1bf5897f" + } + }, + "42f8c6079f5658fc8dc5629b63684f278acb7648" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9c89251856283a8e3aed6d801ca965fdc1da4aa8" + } + }, + "43b0edac3c2c58f16fa2380089d841c420a14236" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x331a1cbbb58594c3636c0e54de517c4a6cedc27c" + } + }, + "43ec9b975f37266d0ff7f044581db559fb9376c4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x931543d59701f1a123f3850e4c6e4b0ea097ae5b" + } + }, + "444e8af4b323407d02a7f96c209b712a65c6aba9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfe686acb3b7cc09ec6379af828b4b3b638898131" + } + }, + "44b329f4eb8ebaa00d731472964de821f8e53a26" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2ea29d9016f2b1141475e4c3c62e031c0a908a08" + } + }, + "44d13c51fb706efb7394346b00debea9ea46e9f3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb008af759b5359810c78d181f0743ed85c286117" + } + }, + "44ed3a04032bf3585faf1dfedb9806eeb8345809" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa301df371257a12c7bc93194ec045d211a2d435a" + } + }, + "44f344790e299b22484749266ea59bbcd58e4b0e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfdc6c80a86ea555b5de26c3db49a779eea6beb0d" + } + }, + "4582048e819b7d55b3c6f47e46ef8dd8fdd12038" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x552e158ca0fbd97f7b3c6208ad3f956a67c8df79" + } + }, + "45eb1861d0701efb338468964c2495db8e7e3411" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb376b876f7137844ef5e2db1e307713885ee5d34" + } + }, + "462cf0e5071404ef569338a6f0a5b113d64a11a2" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4dbe6269722a6063d594dfb65eba1f2a10488964" + } + }, + "46aa4a5c336dbecbabd4cdfef3b9fa65a8a12a15" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf1ba5e0a4a27d8dafcf87f049b178fe83574ac07" + } + }, + "479544e8b67a7e82120d3c5d7869b4c55f4a0de3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1555dfd05f003c056dc219415443be1a502fdee2" + } + }, + "483940025f2d36cb32e93ed80caa41f15487ee7f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfafa31e9b477adf7a26b651aa9913f8664e536a5" + } + }, + "48e958f074c27f1d190e69ef8c01f86931b278f9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa381c1eb58a73d7e7c8b857fcf3a1b50c6116e1c" + } + }, + "49a01a2696857efac9ba53c2705ea4ffdeb30419" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x784c21d8eb231135ac99a64dd2ee334b045043ae" + } + }, + "49fc4b5136601d856188898008375b9c1bf5897e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2c748f96ae0e6e9b01395e8a73dfc351c46658bf" + } + }, + "4a0ec2620d55cefe3e80960f83ebc81219ebabcb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5b1718e3af89692315a673b5c134361408069b01" + } + }, + "4a1edf2110e4ff29c69b835bdd375ac88525dde6" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1b6ec3b2772285abeba8f53839fd96de995c4bd2" + } + }, + "4a466c64765157e1a9dee46e1a26d95ac2664c4f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf783f583fc06d2c88e9e0d263a6ab66f8b8a0515" + } + }, + "4a635e63aadc395c1801c73640f256250d209b25" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf07ee5b0729c565f7b57995a108f94e4fcb81559" + } + }, + "4aebaa9fbdb040e8037e78fc37785f33dc3cafec" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xef36b064bb706bc0540e4ed2b341ae8a0b7756b8" + } + }, + "4af174d239e86ee19d40026eae04486804602061" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x45eb1861d0701efb338468964c2495db8e7e3412" + } + }, + "4b2c0c38418eb142d686d124ac5fcb363b061fd7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa0ebd1b4fc0821dde34f102f6030fc9c40b29ab1" + } + }, + "4b414d48f3871bc957751d5895c96f090b509bbb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xece9d0b9393f64338ec6ca5b0efbcec2175f19ed" + } + }, + "4b6dcb9105adc3ccc34c6c180e9e2212c1789975" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb9261902783bf36bab49f18323a9c8e4ad8651a0" + } + }, + "4b8558347f669cd9b50f70cb501cdbf05f93b575" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x697f8deffc4b33738f1dc02e792b5cb4a37ead07" + } + }, + "4bb5fc5d686cfb132c177aee8ef426e5de98cc6b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4b6dcb9105adc3ccc34c6c180e9e2212c1789976" + } + }, + "4bdd7615ee906a0c88233acc5816b4fdb4656dfa" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb4429d6274f10ef0b7ba30837c5de603ed4c16f0" + } + }, + "4c0cfb86a402c70e6b110a1237d10c7fc7fe9cd5" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1588c83de3fa7b22bf6aa67a4e91f303b490cbb9" + } + }, + "4cada4d5773385e68f4ff1efd1a23d75dbf1e61c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x43ec9b975f37266d0ff7f044581db559fb9376c5" + } + }, + "4cd33b31663c159fbd73cbb32f616eb46f7b18a2" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xea216bc75a65a838ea3d63f7c05588c2840ec1ac" + } + }, + "4d47d935a3a4a4618c67f337a0075d26d9c1f852" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xadecbe660a4943fb6feada38775e51259ea15af2" + } + }, + "4d4ad735b52df9e88fbebebac2de1ede991f9994" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6e2da6b24262f419933bd63b03d470ba019350e4" + } + }, + "4d7a1e5009218cf5176a313f6922c3ab01d4970d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3917f5ac4614ab7d126adf2f5b1d578f2b91c371" + } + }, + "4d92228ffbe5ea89389a34a7086e4420d61eb70b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x985e84916da5ee358e1c119c9b12ff133da52d2a" + } + }, + "4dbe6269722a6063d594dfb65eba1f2a10488963" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x36a9d95fe0c701c65370560445c6a80b4e13c8da" + } + }, + "4e36ffe7590f8dd7fa9c4c03cba3120674814abc" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc2a603dfbb0734c098e5b6b7c8a9b64bab11054f" + } + }, + "4e4ad0ada6b3beffa2436bef1f6a8054f4476be8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xdd0eda6e9a3dccc3d430e5dd333c83b759cc7884" + } + }, + "4e5cd86dc5f716ebbdf6ef572a369c227986bde4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa31b0038c42665206876c410caf02e67405dd000" + } + }, + "4e76fc5e619a4200846eecdd5545b39499debb10" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x68ec6ebf20b30a31b09c7a35d847da342e24a3c5" + } + }, + "4e86f346747b828937501ebfda05b2b8fa16f87a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7d8dde5a13af888557ddd5b931dda20ae59e9e24" + } + }, + "4ebc77b7203cce293550d92b2b5587621cf53219" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x24248d1242acc87dc331e87f3142951a977a3d2d" + } + }, + "4ec27065c52d294799b93700dcee6e32778f1b18" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7bfac062ec8fd11810639cc02f02aa8c61c6cfb9" + } + }, + "4ec674e8eb6b890cbb7df926def8fbbb2a6bba70" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc8c3cf855531e1d06c07245e76c5298b4fc90d8b" + } + }, + "4f14a61b9f2f99e50b719f1345e76339f7618202" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa5552ed8dae24eaed9346af3186f634d38ee9ab0" + } + }, + "4f36659fa632310b6ec438dea4085b522a2dd077" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xaa6cffe5185732689c18f37a7f86170cb7304c2b" + } + }, + "4f5af8eccb582ad30e2702d07577479599461c54" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xaac939ac7c11bbbfb7f4520d14442a2460a51e88" + } + }, + "4f5c55986b93d742d196235aa7329df2c8ae5562" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x157f8c66dd3cae32485b2d68a51c1dd7923bf91f" + } + }, + "4f86da4fecade6017d7f15e30d8320446306870a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x49a01a2696857efac9ba53c2705ea4ffdeb3041a" + } + }, + "4fc34bdd654289653ffc904f86ab2f17bad8431d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x029f9045d1904fe6076c4dbe77bd33290f390715" + } + }, + "4fe8f4ad85487cfe365ca212848f7c970c21e135" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa02b80b54ccc306e042c286172ba903dd53fa4c4" + } + }, + "5038bd4d6b5b31100c52c85ae3294d525596836c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa724835568fb5e3986c1e87331a18b6628b73e26" + } + }, + "504ba70fca5091ea426c964ac631082e4ad51672" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6a22049b6339e13438521842386a7118d6a1a15c" + } + }, + "50aada85d21c462d9c2803fd3c22beacc61f496b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x17c7a85a071c3dee708baeaf56c208752c362e57" + } + }, + "50dc3dab5836e25872ec87bb2bb30ab57a35fb0c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6afeffe32a56293f23d655a1d1b2bf31d616c2eb" + } + }, + "511b33319d0f7df487e07c4f5d149b27cecace46" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0bec2514a2a40586ec75e27442352d1dd2bce538" + } + }, + "5154569b5138f7c1b77d4434860a92ff5707e047" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x32de9810bbf442f9209f994556bc9a7f7e6da501" + } + }, + "51a578dc2949f3881535733a5b1a7b5bd308215f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x311f9efa9544b1c8a8277c52e0f1ca47daec8c01" + } + }, + "51cc4a0bffdbdd8313ed94ebfd5524e8200f4876" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x16f5ee37c60dfd70f8281ac16cda47d665ef878a" + } + }, + "51fd18c9ab9bbb67c27373e8ad754e253e09dbdd" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd9860a22b84f982363ab9684d767a347a5c4fb75" + } + }, + "5216a59dcffc6105f9b58a0b397baad604c0dfb6" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0f8f271215cf51a0646c8a60ed626515b3ddb73a" + } + }, + "52b774b5fab1f557024bd4a7cbec4cd014b81557" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4a0ec2620d55cefe3e80960f83ebc81219ebabcc" + } + }, + "52b90967c04ab8adba7c6908b04eabf2c00bcf82" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x77f14e248490de6b7afb327c0f013c54ae31d2a7" + } + }, + "52f1ef4cc038ef92d0c1f9e7afd3dd3cd0c25b38" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9cbb5a7f2afe219ffb9b787065cbd94ad44ebd25" + } + }, + "52ff6062b4e65231065d5579f870b7f1472a5853" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1480213270423eae9d6b0a603541e989998453d2" + } + }, + "533069310b9741214f30aeec58be9d19f40161fe" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x187749fd89567f9519f0d50b4a19ad2600440e3b" + } + }, + "533a4a1adbae2d561beb729c53e46251ab3a407c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x504ba70fca5091ea426c964ac631082e4ad51673" + } + }, + "534d2d9ab80a99d598de600ac2843f751e8bef3a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe49d92946422e69977a94d1b4b769f97efcfb8ec" + } + }, + "54819bf1efa86437d2f38b4211bdd5229247d9b5" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9a0fa2b2dd4993b5ac3370b4047f5e4472121675" + } + }, + "54a1706bea8f61e354b5296afa5a9f488f88ba0d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xeb4e97f22f12995949c371f2df690f68f71070ec" + } + }, + "54d1de66a65ecf30d79037a8c8af99c633113516" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa686b20553a38e866228ce003657a71200957c3c" + } + }, + "55010017736ad7e8e14327cf0230ba4c6bab0450" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9e30a8e67c1dc0ddcbcb8c0d957101801fd250cd" + } + }, + "5503d35e96e76e02db22c51fd7fd3d5c0667c885" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x15e75e648b604b0b8028f7955647eac6bc850089" + } + }, + "552e158ca0fbd97f7b3c6208ad3f956a67c8df78" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7f3d23738538a34184e3cf16506685cf0884bac6" + } + }, + "5555d9bb89b76deec0c8c0cf37dcbf4b9e3449d1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x87b27e4b436adde9bf724b4889980331dd038d4a" + } + }, + "558fb0163d7794abf1b241aa4728390028291ce7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6e0a20c94065e338c7715046a320ff4495b4fa85" + } + }, + "559bf1337f14e89aee38a9859ec9bf8035e8f6c1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4aebaa9fbdb040e8037e78fc37785f33dc3cafed" + } + }, + "560d5f4c8933c5ca0c2c1b4f3e8b22958c9d7cda" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6bd29846f9fdbf3efcd3c5f3beff837ecbe9f4ce" + } + }, + "569e42b9cd8d79ee5c5ea9c68ba948b7b4d8d84e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc8b331eb5ad444567964f34dc24757bdd3425944" + } + }, + "56cb9d29e9be519d3fc1cd21fcae7750aaa8b845" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe913f5b697154f99bfc159a132c6c253b457ef19" + } + }, + "570dce0f67e367a085e51a47d6c93891a82d452b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3da1b91d461c3220510e60c0c5b87be635068741" + } + }, + "57cb48688d626a12fd4caee130b11e1b06ebaacb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xba158ff71047c0322b1474461f94c0246d0dfb2f" + } + }, + "58cbb2379b1fdac0a036bf75bb598e7d4fa232bb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1889f5317912e414fda653c710d2c17b7d5651e3" + } + }, + "59ad59b53c0d9bbdf0ee0912732baa43eacaae99" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd99befc655ecd5df508569aaadd729af7371687f" + } + }, + "5a18f1d5e443321d54d1dafb3e3b5b6f2899378d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5e89d5dd43fa9fa54381f234d1f7251387a0692d" + } + }, + "5a5e4ae2fd570b079f26dd7f8b9c90456d4b11c8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1236efbead5ada892f61e7e4e59faa143e3bc01b" + } + }, + "5affb7ff218092cf60bc1ba4b32ea65a32cd6844" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0891a47ead61f684dc876e12d5261ab614d0fa0a" + } + }, + "5b1718e3af89692315a673b5c134361408069b00" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x28313061667479bb25119ca3090cd25c4a99a210" + } + }, + "5b2ed45c5376c8359479e1b48f8c07437ec78336" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe5fa8de537f7665e2aed751b8ca7c6b5bf0cdca1" + } + }, + "5b4615bc4b0f10948e46f967ca6e64cf91a7753f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd10afb219e80a211c9072b18de0ff2317f67e574" + } + }, + "5b71d8cc27346cf6d64e101aab9c88dfd58d26fc" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd743161f0f7beed30155e171b4d577d5ce2a70d4" + } + }, + "5bcf5f7ba278df5a31f48a5706e69816727a6e9b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6f562b4994dff65756e316febb8d5a5b99e11421" + } + }, + "5bd96b317d4163401c9b1a2271c03b9439e73e6e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x22affea985c1a1ab7007a55e77e80c54111708bf" + } + }, + "5bf1ac936d2312daf08e481d85e99151cdfdb9e1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfed73d1755549bd523a775e81cf80a1a507eec51" + } + }, + "5c0ddde0773ca1b8f9b07ecdad9f47f2705640e1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x44f344790e299b22484749266ea59bbcd58e4b0f" + } + }, + "5c45b1eefac6061c7713919b34f5dcae9d5cfc7b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x42f8c6079f5658fc8dc5629b63684f278acb7649" + } + }, + "5c70cf636b26ffc099fba8ddd5093e95ca8e7782" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x52b774b5fab1f557024bd4a7cbec4cd014b81558" + } + }, + "5cf45d08c0b55dd9c34cc4cb718c917333f2e9f9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2600b9122847ee06e201ff6a734fdcfa74b2be74" + } + }, + "5d07bd78606705bb5c62fd390123b4e45f7d74d8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb6367a493bbaed7334456b3646e4541c9e96012f" + } + }, + "5d11f35386d10cfa7121b02056d97dd932659943" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6b0105812868d533882ea4f08bb628e5e9d811dc" + } + }, + "5d3292b79851f68d3907a550dc1a0b569d603f66" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe14b8b08ed9b569d2945b078fe94225924c5987f" + } + }, + "5d57e28e16bcf33b37672eeb891b29c481e89120" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x012255fe8647bfe207603a62536ac6ae7a230caa" + } + }, + "5de8956c0c99e2dc6715201b3a9e1d5fd53b2dd4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9917620c3df2e3cae0f0e690b4da82221bc26eff" + } + }, + "5e0ea0c533298d20ebcd19482a8b1e1854dda425" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x59ad59b53c0d9bbdf0ee0912732baa43eacaae9a" + } + }, + "5e5a0b9c4c36067c8730abecdb29ba97aed877a7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x483940025f2d36cb32e93ed80caa41f15487ee80" + } + }, + "5e74c3c0f3bc39154407e9a3c55cde944d1ca04a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x97b61770815f0589776243ec8ffa365b86548b29" + } + }, + "5e76969932c5d314142b23c555af4625fa6b9343" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1ac3dd6a958d88e45c2c55d938dba74fa892084f" + } + }, + "5e89d5dd43fa9fa54381f234d1f7251387a0692c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8135c9c23bfa97243ea79214772816339552f836" + } + }, + "5f1703b93938752face6e4657a90825b77f455da" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x03f3095f9e46a8ac62005c42aaccbc0fcdc3aa33" + } + }, + "5f3f9c388dc0c9c01a5fd540bf9eb714a47fc5c1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4a1edf2110e4ff29c69b835bdd375ac88525dde7" + } + }, + "5ff4d4daf0a832422c4675a77720abbfb5afbba8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1c2749b3a6c574b21622761bef7274261597ef2f" + } + }, + "5ff4ef866c3ad4102444d020c1d21c3d35a119eb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x98cf6cec29c58634b6022fd1e8f54f912921eef4" + } + }, + "60a2db26238d52510209c569dca17c1f41c9a544" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7d4e21638e756b9953576f460037cd702d102120" + } + }, + "61144e43a08b3852bcd531d13f0485743bd835a3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe0e5744863b26418baf12f94f0bdad2ef2546a93" + } + }, + "6123d3be4335107712685be2d575958b17501067" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9cfe89d89bfe28ba95777b6a90ac7ed86b0e2030" + } + }, + "61306db8b4ac256266cb379b5f686e25cc117590" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xbb7a0556525b43c750e380a0ac1ca3bb719e601d" + } + }, + "614037f9a7be1ab2131d485845f297f2d62d569a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x55010017736ad7e8e14327cf0230ba4c6bab0451" + } + }, + "615a957b818ce70fec123daafe552c482c59c5a8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe2982af9c977c39cb4633346b916a3897ffeb6fa" + } + }, + "6168c5e3b7d7c870e3e7eb53b152fcb920c8e1eb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x22230d8d10e81e01450aa68bdfbee3c20d969dea" + } + }, + "62123ac69c46a06f7e3644b0dfcfcded535b8727" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x76ca5805dcccf57966da8489d1720fb8c5dc4b82" + } + }, + "621ada91fe8f65407ac963de8e75d88d4c388cd3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9f42a00ab7bea15357b54e16867383fdc02e7061" + } + }, + "624a9bd6345be1a95c7fb509ca4bb77d05138adb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf1970ea5af8456fee42cc087e79bd5c6a6efaa88" + } + }, + "629fdbc407b70b57eaa1523ab12c5178e81a5d52" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x120e38f3899a4e2f9f848a82c7afee288d14e7a5" + } + }, + "62c01474f089b07dae603491675dc5b5748f7049" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2cf5732f017b0cf1b1f13a1478e10239716bf6b6" + } + }, + "62cde2103198f54d31cdb9e9495fd7e1243c2c27" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7f16eb03b09934c61a424e6a1c4649f193d157fc" + } + }, + "62e75c838a732abab87e1846f361721f03e7d973" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc57abf0b9724f82736bee2a05a9238a45de5512b" + } + }, + "636b02091904e5b452d19455f484306b8fe62dd6" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4f5c55986b93d742d196235aa7329df2c8ae5563" + } + }, + "64134c8f0ed52a13bd0a00ff9fc6db6e0832e39e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4e86f346747b828937501ebfda05b2b8fa16f87b" + } + }, + "6454029b19b69bcda3ba156684d58283636dea40" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x52f1ef4cc038ef92d0c1f9e7afd3dd3cd0c25b39" + } + }, + "65e3776618742b90f1d9844c907b276854869abc" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9d9fcb724db6738e2ed07f6815a0e5d45b3042bc" + } + }, + "66e68e1d0f65b4379c2864f5228d98de265c5e30" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1756aed6799c904988cc7a1dfabe77fcca058656" + } + }, + "674840a9e918ae6b7560a4ddfb60b96a32636ba4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x954933598dcf8e04d6f4ae5b311673409e85c80a" + } + }, + "6792d18ead88bff9193e50fa12c02779f2a0f4bd" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xaa839cff1f78242d01a33305e1d9973cd7c66d4e" + } + }, + "67a66435543da4130940ccc47e3d9d164db65fd1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x51a578dc2949f3881535733a5b1a7b5bd3082160" + } + }, + "67df3bc5f86456f2bc57f75c99a0389bca7e5850" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xbea830535682332041ad318232044f5e914af084" + } + }, + "689a40b4f540d145f6dc4ba4079e17f84b650f9c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xcce1e6f23dccba1aa1830b1b7714fe985f9f2033" + } + }, + "68ec6ebf20b30a31b09c7a35d847da342e24a3c4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x32f9418411245a8bc6982ff71436ed2de87e3d97" + } + }, + "692a1a4da0b418dd701f5133e2b3c5686015a3df" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3bfd62743dab66288fe0b993d893a41d2dc3fbbb" + } + }, + "697f8deffc4b33738f1dc02e792b5cb4a37ead06" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3229e332af8eaf358f44aad3a902a6c47f96983f" + } + }, + "69afd0683057a214d3bb3cc7d438961cf8c8b200" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x558fb0163d7794abf1b241aa4728390028291ce8" + } + }, + "69fd2b9233b83e54861436496ad6b9fb28afaf40" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2db5e35091789102bd0019b4ee49bcae42524429" + } + }, + "6a22049b6339e13438521842386a7118d6a1a15b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7e9f915d9417cd7bc8220546680fa5eeb73a2193" + } + }, + "6a31cc57646f3d9ae3b63e1f604dde04d1ba52b7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9985ca2474151f5ab79a388ec3b0d6fbf42da1fb" + } + }, + "6ac56f1ceee102b85819d789e6b29308eabc373c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x24cea63a6f0ede9a0fa91907e841ba4174e1cd0d" + } + }, + "6ad37e86c8d4b961b0302ebf0a540ae83f3679ec" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x018b456893203c6e3a5661e7328b5a858904cdc2" + } + }, + "6af2602221d2477af828ddb2c1dec8f70a24abe0" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xee6f3914a1e5d955fd62a29562ee0ab776235ff6" + } + }, + "6afeffe32a56293f23d655a1d1b2bf31d616c2ea" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb6bcc464b7b7f0359e87e9a9517d10823a2e0c94" + } + }, + "6b0105812868d533882ea4f08bb628e5e9d811db" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x21368af8397276e6e4b284fe36f525dd323bd3db" + } + }, + "6b5ced188780878d8a72b3e6f02618db2bb97584" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8de072b1fc7f48cb2a42e7ee579a462e50e4cd8d" + } + }, + "6b5fe85d1513c1a29fa825a343db7a80558e6de5" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa318ee3c41da839fa1002dba1f9a140274ce59e9" + } + }, + "6b6945d5fd5172355825871803b93e57c5040653" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x60a2db26238d52510209c569dca17c1f41c9a545" + } + }, + "6bd29846f9fdbf3efcd3c5f3beff837ecbe9f4cd" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x97f0981b0a6cb647dd7b11b52c92bc1a3206d2f6" + } + }, + "6bda06aef03a04b8eb3e4c7d1ef001fc806f5f6f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xdce512ecde5a4c27da464f846e71c8272da4ad81" + } + }, + "6bed38b822d8823a2cb71883522f932cdde95b0a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x39d9b351db53d59af4907116d594ebba910474f3" + } + }, + "6c14bbac448312636b86fe713185cf7d8ea6f1be" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x04a104904b31f401966da211ef40874d6e97ae47" + } + }, + "6c3bed6efc677ccb136c0d886a6f3fdb375798c1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x18500d6a8e3e20ace9aeb507c213b6261b23f5d4" + } + }, + "6cc6da179301a7ec4290cc0a5860a42ad188399f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5503d35e96e76e02db22c51fd7fd3d5c0667c886" + } + }, + "6cdf4bc6759fe45be60aae1cb72d3fc2bb7f2d23" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xba70f98f64f041290dd6794e5cbc9e8144c8c915" + } + }, + "6d1f3f15f36d76d52d65b1b78a4ac85e91f33d25" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8e4354916a56d367dd99d3eb120e27a1d8ec6e67" + } + }, + "6d27b8cb6b9af8a56fca98f13033d15f10f66da4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x18e0cdfc5a23465cfb3566091849c044d2210b56" + } + }, + "6d33e2eaa419844043bc41073bf3a2bc0a6c1b1e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x37609ce3799a1b75ea6090da3d014d59e5e7851d" + } + }, + "6d9834013a85a25df2e3dead1986d753457d7b67" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5a5e4ae2fd570b079f26dd7f8b9c90456d4b11c9" + } + }, + "6e0a20c94065e338c7715046a320ff4495b4fa84" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x098de34931d0d159e2631aee55524c217624d096" + } + }, + "6e24d18a80aeccbace499b6d26b655633c0bee99" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x674840a9e918ae6b7560a4ddfb60b96a32636ba5" + } + }, + "6e2da6b24262f419933bd63b03d470ba019350e3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb9f7e8e7ea5b1a7f184a152373526ac7acf4477d" + } + }, + "6e53f8efbbec77187f733cb053a53a28e14ade81" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xeadf36b1baf942879b0b5c45469fa05add1d61b4" + } + }, + "6f257471f06ece199232aaaa082d2b1ae7ddb483" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x18731575d0a6339f6317c2a1b628d8a4c145328f" + } + }, + "6f3dda610ec5a3722ff4ab49d1f215dd26bd8ad6" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5038bd4d6b5b31100c52c85ae3294d525596836d" + } + }, + "6f562b4994dff65756e316febb8d5a5b99e11420" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x41493b8488a0ae34cade12733e8df93a87f3ec80" + } + }, + "6fc7016fa33af287b3b9cacd092c26bd9a054569" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfa849bc1ece08222f4bf249ca06a6468b3de5b1b" + } + }, + "6ff9622ab3c22e4357e90274d00291c527991d21" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x02fa5c7476f2d423f27ac8afa1e357db95f920fe" + } + }, + "702433f6bfbd76274ec1bb641c4a0428298487f1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb2da69bc3361eaf80dce81a17d610217ebbc7a18" + } + }, + "711b5163728968ec016a924238f743fa04f2d11f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9d0e24467eaf9b797b9e3f6a6084958889592ba9" + } + }, + "714213a080e1d2988acadbfc5e441df5173f81ba" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe1f79aa1d6477ffd08d4e5ce185637434147e4f9" + } + }, + "7161527e54370ad8fe44bc83d692b10b9f9b877e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x41eeae22551bd18167a31036b363bdcec89a7d9d" + } + }, + "71a2fa577619a37c2e2336bb6c20fc1af193860f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x28ce21f7f28c8a546bca1697ada45cd73473465e" + } + }, + "7213c423e1db8af095bd3cefb15e43c6067635ee" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa89361425f7403ec9e757b5d1a31993a79189a35" + } + }, + "723bce7438e7c70d113e954e9aad5dfb4551dbff" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x15c4f7ebfc781a41226d61bdc0fcdc98fdd8bf46" + } + }, + "72969d083705c924922b857922930f2087426ca0" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2cd26944d7baa6d92eee478960d5778375862e86" + } + }, + "729af7294be595a0efd7d891c9e51f89c07950c7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0a517d755cebbf66312b30fff713666a9cb917e1" + } + }, + "7343c0aaebc045465ffebca00e201c1f554c2eea" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x379ef6dde2bc54ced45146d4907639ee7cf1c8ec" + } + }, + "73c85788bca3bc1fb2e9b3056c595a4a7b3d2e46" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe6df36db61ae2c46d2cda2f6c8d1856ac181e6cd" + } + }, + "73f9912db6e86599f256f090dffd915a845a9631" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x67a66435543da4130940ccc47e3d9d164db65fd2" + } + }, + "751c9d6e9b6d91897ab1754b15b72712953de9be" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf49ecf0e4378b1957686d8d0b227f83e48e5523d" + } + }, + "7528088649b574b14d14f4b5ba45285eb8a78ffc" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1ea264b74c8f6e50586097e2e7c9a39419fd88df" + } + }, + "752e929cfb45fd739923f562b146db315b8cc4ca" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5f3f9c388dc0c9c01a5fd540bf9eb714a47fc5c2" + } + }, + "754144c0c9b9fe7f9a8e40df23f3c315a7e244bc" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9ce1b776e1a050af28b1034980a628b7728b0832" + } + }, + "7642513288c9da66960a6f3df0c156a8e1dcb119" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x621ada91fe8f65407ac963de8e75d88d4c388cd4" + } + }, + "769277251b9d3f0906a338f156238b159bc126dd" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xed1a5e97e3415b484e6bc8b84bd170dbdd879cb4" + } + }, + "76ca5805dcccf57966da8489d1720fb8c5dc4b81" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0e639c40606e9329259d2f945f59dbcc6c5c5cff" + } + }, + "76ea1b9309253b5c03bbd6e9fca6591b51fb3785" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc052f8b19df2c41d807bde1c041a8ba2e87f15d6" + } + }, + "7702eec59b0ee531bef08c14d0e6c89e7e43ebac" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb14b3e0660d147b2603ed92fec4ff337e3c259e0" + } + }, + "7797a5c4bb655b5ea51bc966875abb3b19c0d105" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x614037f9a7be1ab2131d485845f297f2d62d569b" + } + }, + "77d724d278fa787544189c4774f03849be2868ef" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x29799a64a736832cda536d687dd443ef3bc31e58" + } + }, + "77f14e248490de6b7afb327c0f013c54ae31d2a6" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3820c20f3f8ee1b164dab460b05a979640a4136a" + } + }, + "77f263b8c785ec73f9f77dd11ab64fb0089cb164" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7be1a5856ef5951cf1991b57c00f73939c7030f9" + } + }, + "7845e6c6f5d014cabfeffe6d4d9d18c547d00fa7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x44b329f4eb8ebaa00d731472964de821f8e53a27" + } + }, + "784c21d8eb231135ac99a64dd2ee334b045043ad" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xbecf51bad165c4b8544ecc57c7859ee946e610e0" + } + }, + "786102f7205ad86bb77b14a1b80d8b26cbf3562b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x04308fa2e7af944dd7008a7edbe5221a52e2bc88" + } + }, + "791812110230af4583a4a6dff7eb425b0b0dfab4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xdb58d0b35d26edeb0efcb49f7eb627cf49bb3a48" + } + }, + "79225179187b35144fe9e8505cce2bcff3986ff9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3edca986feba79717853d9b91595ae61d953736f" + } + }, + "795d6e09eedae3febc172169c017fb67aa62efbc" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8faf239455a012d6ef377a83448c8185466f8512" + } + }, + "799b6226b099fc75d1fc2cf6f833bdfc1fe63e48" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6792d18ead88bff9193e50fa12c02779f2a0f4be" + } + }, + "799dcaea1d20bf1428807757a84d6792798b74cf" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1fce5879444d729719c03b5af6e074b87a49d934" + } + }, + "79cf9a7b86c0a7adb03ecb8967d70413f21b925e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5e74c3c0f3bc39154407e9a3c55cde944d1ca04b" + } + }, + "79f2d463ce2404b3e77db5dea5cc19d76ac223dc" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe75900e645ce8d1abbb97d408989b159b2a50a1d" + } + }, + "7a315595e01d6e16134063232a01395187c9650e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfac000880bdfdbd780ffa7c4a1d5d8b4a1d87b04" + } + }, + "7ab73fe69000d4087d0b9ceedfda0af8c4fe2d2a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2e83c90e7fa359705ed2138854a83a9145c27a8f" + } + }, + "7ba53872256e6762bbfdbefb1bb80b26f94df9f1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0c0cd995ac9e488544723e3e8e90a5fed98a6959" + } + }, + "7be1a5856ef5951cf1991b57c00f73939c7030f8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe71d6b1facc3de5c246f7d14e35a2b4a2d983c12" + } + }, + "7bfac062ec8fd11810639cc02f02aa8c61c6cfb8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xcb5e208c02a68f2d97601da482c419af989e0980" + } + }, + "7c26d9c9b73a75f1a468d06bd69e08f4d316845b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5d11f35386d10cfa7121b02056d97dd932659944" + } + }, + "7c41aaac568600537f36df0e35cb625dfbed75a7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x33b82c3871bc89d9137c62af099a0c4e5911a048" + } + }, + "7c7d893aa4fba1deebfc9a5a14b27e2ae7f66403" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xffc4569dfb86db2e584a1138a75747dffb794467" + } + }, + "7cadcf3f4031ebc2bc85040ea16d1ad26ce1704a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe292ba16ee32e94ba88b4b72821bf90fe7b1b846" + } + }, + "7d3b079a8306f7cc89f1b9b23319ec904e3ad853" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2b5fbc2f7e76f6281861cb4282effb94d609844e" + } + }, + "7d4e21638e756b9953576f460037cd702d10211f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x014337758eb4abf60a8e458a97acbd8b47fa0c32" + } + }, + "7d699e5ea61a26a7f677478cc79887e2f27ab345" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc4be49d4dcee6efd96c35ddf346b969db9981092" + } + }, + "7d8dde5a13af888557ddd5b931dda20ae59e9e23" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x533a4a1adbae2d561beb729c53e46251ab3a407d" + } + }, + "7d8e57afa6550a1be621fb6c083aca311a1e229c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1e1505a86f6b0fb5f7a4500cca953462cde929e5" + } + }, + "7e15566ad3e90f3c4c12c4d7fdb17e12c24da66b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xcedbc4eaa94298536ad368e8ac9819c5e7448739" + } + }, + "7e2a31e29b84cb193202609dbd86ebaf9a83c119" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x411456908355aa037314aa920e8afef3632503fb" + } + }, + "7e2bd10d506af5eaada030590c8073495230f37c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xda5828cee8e61bd0d8af71ef5da9a7a9019ade14" + } + }, + "7e44d26c7ef8dc51a45248573f6a8e5a9f91a0ae" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xcdc1f2aa2853b37723f415aeb181583e11ae7b90" + } + }, + "7e9f915d9417cd7bc8220546680fa5eeb73a2192" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8507d90ee605e59469a35fdc78e844c59894e004" + } + }, + "7ebf86bf849b6097c8af6dae10c52438538a0711" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9fdd9d67e3e2c78c419e3ac9bccc7322041c3b1e" + } + }, + "7ee27699bf52e4db7f72b3f2591f48e8ad7972a4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x38479ce52243f1a8b358515a084fb41533a723fe" + } + }, + "7f0506a35713c6a2c68152d15a4bfb1ccaec98a8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa3a80c15cc0e13dd1aea5949c48ad5b120a8d832" + } + }, + "7f16eb03b09934c61a424e6a1c4649f193d157fb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf62f676443b29c513964f01cbb356165ace54b79" + } + }, + "7f3d23738538a34184e3cf16506685cf0884bac5" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2dbc14a87a2b5a8b780e460dbe0083d8260326f5" + } + }, + "7f57dd2b577f0d5cb1fad7bbb2cf8f07ec0f0199" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb0ea2ec7623a1faebead30c8007b260a4c62f9a0" + } + }, + "7fe4672c6fd2a05c7a91676e5ae2e75ea197567c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0116be8937cb591d6db17246c91dc3deb1fd0e1f" + } + }, + "8069a4fb09d35f100d18c98d02ec1bfd997bb893" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8ff9fb732fc13f492704a9f47c47db4e877f6dc4" + } + }, + "80a784f83657ad12a742b94e01c3bbaf3fb2c6bd" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd3ba8bc2aa219ba0aacc8960b92832c3b0693bad" + } + }, + "8135c9c23bfa97243ea79214772816339552f835" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x04929feafa156581a24d8a0bfe8154ffab39fb38" + } + }, + "8142cb33b22222bb9e39a66b53af12c6ca0b5375" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xdc280f2887ea315f70692eb247e399b18a07bda9" + } + }, + "814a465f554f949e6e2a6878539c705f319c627d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf191a9c00fe780f63cf4f68a06e895bd53981255" + } + }, + "81b26e12027f5df776edd5539791e683dc2e57f0" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6e53f8efbbec77187f733cb053a53a28e14ade82" + } + }, + "81d6578dc3e3c0fb07a8d62f66c1eaf3b97dc2ae" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x857109cf04811d5273ec3af3f3d3bb56e93d1dfc" + } + }, + "8228837a1a7d0ae41b857d852a8dd6b7c6cb3e38" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5154569b5138f7c1b77d4434860a92ff5707e048" + } + }, + "82afbc3f6dba388dba71ee35f56ea772a53033a8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd2c8bda3e1481b96b4a3ee0a2e1f3f1aa6299fec" + } + }, + "82d03794122107972c0d075f16754791224b507c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1622e5aa3015448c3a7560b15a289d9aacc5370f" + } + }, + "833bafb51e8a34c93f3100430fffc5ba61ef95c9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x28cd47ab2e86fe040740206eb31fe193df7cbab5" + } + }, + "83602911153c9c176419a17276ada844bb932527" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xae33b99c24c45ce086aa9a1844fe8ed55ec313" + } + }, + "83802f999d793e8985b916465ccf6050195c0167" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x754144c0c9b9fe7f9a8e40df23f3c315a7e244bd" + } + }, + "83abf69971313b011ee30466e8f703a460400557" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa40a11c1f943538e64466de3b3bf8c022b883095" + } + }, + "83e3e5a16d3b696a0314b30b2534804dd5e11197" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x99b2fcba8120bedd048fe79f5262a6690ed38c3a" + } + }, + "83ed885c9759d5524052681a5602616a4d565e87" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9deb7e973e3567140c51750e92d7c5091174f507" + } + }, + "8405a655c77ae3ebef4410c924cba9ef22a57f42" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1121c3fb4f490140339dabac59a62dd59a9912df" + } + }, + "844301835752f15f39550cdf531e07ccef5d133d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x94cceeb51248e76f0fa711e92986ad36208f6e94" + } + }, + "8507d90ee605e59469a35fdc78e844c59894e003" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x39ea196ad4678ac786f9ff4ba12edbb364cd1bb0" + } + }, + "857109cf04811d5273ec3af3f3d3bb56e93d1dfb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0f2fc64833681664e54ca74ea756c7233a05dd86" + } + }, + "8692f270fea1b23b492dea1755f48cdd1dd78534" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xec184f693f222b3e48622f5253c134339e7e2e7e" + } + }, + "8703df2417e0d7c59d063caa9583cb10a4d20532" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x37f998764813b136ddf5a754f34063fd03065e37" + } + }, + "871986919b8ac4032193739eeae09c66765f0f15" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7528088649b574b14d14f4b5ba45285eb8a78ffd" + } + }, + "8719f47f3dd875955760868a4fb23f761cf7d4ad" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xba56f0f804625c0ff8b7b119bd03af0a10b5886f" + } + }, + "87946e396d4fd04d02f117adf25ac427895878b3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc07b721215b231d9820dc8d186e3dcabc6c75e67" + } + }, + "87b02d6f0e02d90fb05adf14ae74570ea8ca6aeb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x43b0edac3c2c58f16fa2380089d841c420a14237" + } + }, + "87b27e4b436adde9bf724b4889980331dd038d49" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd758e9a701769fe9e5a80b3a09180e7631866f56" + } + }, + "87dbe63fcbb0c90d20021f9c01a03e7d94916b3b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x299528bfdcf20ff8e19a7a3fbbdfe98eddc2604d" + } + }, + "88a16f4f893665cf06d9ad7a7ede8d9cdf833b7a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xbdb0e729f9136a166efc4ddea366fc3b6bf6bf5d" + } + }, + "891c7f214e32206e8f497fdaa7ee419e2e8f3ddd" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3dff39a90e67e86536dcc8b4dbfac04da831e0b6" + } + }, + "897003bcc0313258e7a3517771982e05e4cfce1f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe50c29688b2c3dbe6633797d2a200ed7c2cb1cbb" + } + }, + "89e81283794cb458b9590002ce69ddba3c976a42" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x799dcaea1d20bf1428807757a84d6792798b74d0" + } + }, + "89f02008028773d99248943a6bcb14200f4509a0" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xda3580da73b2986fe0da9b6caebe17818b7b3646" + } + }, + "8a05aa8ab787526a0591016c2aee95037b8a478b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5bcf5f7ba278df5a31f48a5706e69816727a6e9c" + } + }, + "8a2cab44ea3d5c52c704f060f4088e505791a57e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x016cfb16ce1ab4c15eab782e1ac3b0d7f5bb264c" + } + }, + "8b0c28ef1527a918fc7dc134ee6c00f069c7073a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfa9c2ac45638e511b06ebe051411ebdc2c4c228b" + } + }, + "8b0dfaaf9135721f01f3712572ea9963d70f49c0" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc101a7eb0ac863e824eea705432530c65aa0c519" + } + }, + "8bbe1ac3ee5866589a669dd95744af5ee83e1b72" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa7aaf603309127956371841badc44b69252d142f" + } + }, + "8c25b51ae5745b82c7b489b8fd4a9994b9679a0b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5555d9bb89b76deec0c8c0cf37dcbf4b9e3449d2" + } + }, + "8c2e2a704d809931e711b89162391f2dba837406" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfd91b246a065cde3fc10edd6457b9e6c10fb3870" + } + }, + "8ce9124341c4ca3c690b29f3575f3cb9833c8c3c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb78428568fc511f4a6ed34c2d57c4e104138ca99" + } + }, + "8cfda5300d7544327e32aca175840f90860305e7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x90f8d2eba99d7e50525edae64a61a28526eef895" + } + }, + "8d7912a42951e7201c8854b98a36e4203508c3a2" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa6eab9c538a79d9ffeebc5d4495fed68dccacbd6" + } + }, + "8de072b1fc7f48cb2a42e7ee579a462e50e4cd8c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7c26d9c9b73a75f1a468d06bd69e08f4d316845c" + } + }, + "8dffcd74e5b5923512916c6a64b502689cfa65e1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4f36659fa632310b6ec438dea4085b522a2dd078" + } + }, + "8e1320b630d8a411819c16dc0edc2cb77ed8049d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x02c7efe87a470a521338ba476a0eaf7a535c9c57" + } + }, + "8e15b61b6735457672c8d4809e30ca7877e9fabd" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1d3289a828d2bb4a86cda52b7772e2d0d508baca" + } + }, + "8e1f5c577cd5a404507687ef379cd1e41c4a9a9e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xcb0ef5a0d3f9427d66aa2b00d4b25c2445d96cf2" + } + }, + "8e4354916a56d367dd99d3eb120e27a1d8ec6e66" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x62cde2103198f54d31cdb9e9495fd7e1243c2c28" + } + }, + "8efc24fec9b67ce053a55abaaedcbbcc64e97eaf" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1963ac8fc10167891e91b4d3f53e09e0b7c9b55e" + } + }, + "8f55e75b453fbb3071e4454119a33477c6028788" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb4c898e7d827a75d991aec0a837c23aa8d9041e3" + } + }, + "8f75ec2d8d77fd6a26f4c01f7b0384bd60418874" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1660ada72b0a07040df8d063f2f3f3fee891f1d1" + } + }, + "8faf239455a012d6ef377a83448c8185466f8511" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa3396b3bca8473c21f9ab1fca8a40ecd580bc626" + } + }, + "8fb5af158980be77e5d137ab6f95000407041099" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8efc24fec9b67ce053a55abaaedcbbcc64e97eb0" + } + }, + "8fb5f5dc4d66ea0233a652230d44299718cb9f9e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x79cf9a7b86c0a7adb03ecb8967d70413f21b925f" + } + }, + "8ff9fb732fc13f492704a9f47c47db4e877f6dc3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfc70ade160bd76694149f3f439f5d4f78bdc483f" + } + }, + "90344e80aead27d6b007ee73dd8fd8169f870f51" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xce7600131bfe22040ad75febed54cd4ad181276e" + } + }, + "90f8d2eba99d7e50525edae64a61a28526eef894" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x444e8af4b323407d02a7f96c209b712a65c6abaa" + } + }, + "9137343457792227d68316f6ac0bc3518a7702e3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2b88d7e31f20b1cec3ae31ef8ae3f017820cf8" + } + }, + "91aaa30b2bf342c6bb6a315251ffe5b7e123bfa3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb0a10fa71a1c4c621345666be094909ac112ec83" + } + }, + "91acc7d4c4cc7affac116157a53f5614959485f9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe1954d1413f4f50c7bb3aa0ee368b94dfeae7c1c" + } + }, + "91c87b19dcd811fc5efc567a022bca52d5e2e252" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x88a16f4f893665cf06d9ad7a7ede8d9cdf833b7b" + } + }, + "925cdeaf40df0ac82648432e65481350417fd848" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xdfeb403cff0aabe20cb07d8451caacfe31260133" + } + }, + "92bbf48cf4a124ffff047cad76c82db1a1889803" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6cdf4bc6759fe45be60aae1cb72d3fc2bb7f2d24" + } + }, + "931543d59701f1a123f3850e4c6e4b0ea097ae5a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa7f111e1b259c9bbd4beba8ebab4dd6d35bb9ee4" + } + }, + "93840036a3c19b1e91ba0ea10f95a5041ef61a3f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd19b2ebcfea3994bf30a7e4283b73d4bdd319cbc" + } + }, + "939023fa69f246b709a97f16c37367e36267828c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xdba37eb3483100bc89a7bf11b7f110ad71ecf41d" + } + }, + "93a5ddc7d7b2a2bbb7a61086aa6fd0cc9e202b0d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xaecb52facdff422fd67875967e9278a7b872af33" + } + }, + "93beac08e1b6f1ac32c5ee628bc4356feb5e54ea" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf78ff2d350615b858077a50ff85b3a9e2edcc996" + } + }, + "94602cccae39d50fdc504869eff546d1678f0ae2" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb3b4dcc6ba6c6d8c352684bc69a135cccb2d88ff" + } + }, + "94bcc8632137dd2d666003e33d1e7c2fdd6e95e4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc8c90ba51e74ac5d9e462ffcafbb6df11795ebe6" + } + }, + "94cceeb51248e76f0fa711e92986ad36208f6e93" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf48270bfa988db4518f9b1db9e78bb398c954551" + } + }, + "954933598dcf8e04d6f4ae5b311673409e85c809" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xacbb287ca3f98d4775dce56e40ffce57ce4ba17a" + } + }, + "9580d4c2c6795fcb1ec84bf6a58b873fb2737788" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xae17512fd9edf51989081b42962b2fc85de4a2d9" + } + }, + "95a4d7cccb5204733874fa87285a176fe1e9e240" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc37a43e940dfb5baf581a0b82b351d48305fc886" + } + }, + "95f36953203283bc9358f396b627dc79480a8ec8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe059d3aac9a568120467ddbba3e4d25bbc82dc65" + } + }, + "9606aeadd83c5da2a613b0e132f0a6c13cee43bf" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xdddda651d375f5352d2ff488eace1de63b6ffcaa" + } + }, + "965025b3b611003c82c8c9b69b35b4c5444cde69" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x89e81283794cb458b9590002ce69ddba3c976a43" + } + }, + "9663275f953d54a345f3dd00e2eeb0f156710129" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x897003bcc0313258e7a3517771982e05e4cfce20" + } + }, + "96f4278992ff6da5e8e60456279d9bc5d1f7a845" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf86c50909ddce25f4d4e71e16d78b2f6a244e8cc" + } + }, + "970e2fc1f55b1e2b214f84e155ae6a9403f891b3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x83802f999d793e8985b916465ccf6050195c0168" + } + }, + "97316b1fd92c5e6611acffe79899064fd9274c8a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa30dcb9cfbd0e8c874e4f919dbe71be3545464a2" + } + }, + "9747756fd264dfe7fbb2f46aebb3e9b084ccf45e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8069a4fb09d35f100d18c98d02ec1bfd997bb894" + } + }, + "974beeae03d1860c485c0dbb68e5413317770b16" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x83602911153c9c176419a17276ada844bb932528" + } + }, + "97a3956189161fe3d52554c2a599bb619983be5d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + }, + "97b61770815f0589776243ec8ffa365b86548b28" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7f0506a35713c6a2c68152d15a4bfb1ccaec98a9" + } + }, + "97c99c7f158206d19196df8d21573126569d918e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc8ca05f5e8391cd5004c3c4020e570ed4a520c21" + } + }, + "97f0981b0a6cb647dd7b11b52c92bc1a3206d2f5" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x615a957b818ce70fec123daafe552c482c59c5a9" + } + }, + "980410833d9ce53a0f944ccc629032fb0e6ae6aa" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x149d393bffe9be2336e7ffd6a109f05318dc798d" + } + }, + "9848ce910f5874ffb5cad5fdc3507e8d54fd668a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x21115fe08f7ec434d4ec27e8dcfdf31a6e50aa0a" + } + }, + "985e84916da5ee358e1c119c9b12ff133da52d29" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd2468d6da54259507d07f74ef0a246f97e52f036" + } + }, + "9862b64181c8bf5bd53e51c5f596528ff82bf652" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc19f48a0a131e8b9f44989bbac80a30ffe2a2e4e" + } + }, + "986e30c8512ac023f09da460202322a88e98aa66" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe6f12dc0baf6536aa75f226bfb0262d8266433d2" + } + }, + "987600e63a25755048e018d1976d8ec4657f359d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1456fa2cf6376b40069504e491e64aa40484fe40" + } + }, + "98ae7604effcc8bf6accb109ebf78fb6f5dad01d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9747756fd264dfe7fbb2f46aebb3e9b084ccf45f" + } + }, + "98ae76bbf3fe4b779df55df06eb0081ac95d660f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4b414d48f3871bc957751d5895c96f090b509bbc" + } + }, + "98b163f2929e5c92709759e3215879acf32a3a98" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3e3069deb6f503bb8bf155eb2f89801140831f5c" + } + }, + "98cf6cec29c58634b6022fd1e8f54f912921eef3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf4d2d03bf70c2500fe431fdc8fbed2c13437bdca" + } + }, + "9917620c3df2e3cae0f0e690b4da82221bc26efe" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0f0f333b14cae00e0f74e1de336437d5644ae337" + } + }, + "9985ca2474151f5ab79a388ec3b0d6fbf42da1fa" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf619381383c69659fe81a10d695b2663426624d5" + } + }, + "99b2fcba8120bedd048fe79f5262a6690ed38c39" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x37fa399a749c121f8a15ce77e3d9f9bec8020d7b" + } + }, + "99d6d7fe1a4f0f7d92837486a1f9d7dd500edc11" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf2d3cbe7357ee858c2b7f6ea28fc95c1af508ca9" + } + }, + "9a0ca249b7e4f00f62ba5230a602c3233895cee2" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5b2ed45c5376c8359479e1b48f8c07437ec78337" + } + }, + "9a0fa2b2dd4993b5ac3370b4047f5e4472121674" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0ba7f30a90b699e3f906bff7599b230890bbd56c" + } + }, + "9a2f4d9e7fd12bd7dd8141098bd3363bb644f068" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa9f73dca799231e385ce5038c826b03eff0d1146" + } + }, + "9a45843cf7ed63ab79f7df4d2bf80512d259b0c2" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xcc40f2616fb396bfc25e9b22ba3218b2b217ea3e" + } + }, + "9b0a69ce744a08c595426d7cfa5fe5f4dc844a25" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xea2f1211c66cdabf2b618a4dd965ce133592763c" + } + }, + "9beadb15fd4fe1f0755ce82dd160e1a798544a1b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x48e958f074c27f1d190e69ef8c01f86931b278fa" + } + }, + "9c5fc050311de43f7b7d9a66e8319ad3c051a252" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1f323b00b7be1e9c0713b080cadc05f45e5e7ec4" + } + }, + "9c89251856283a8e3aed6d801ca965fdc1da4aa7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfb04fd4e715c760c91ddc0f30b000b52203f66a5" + } + }, + "9cb15938a825ff7c17ae775b6454730983522906" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x987600e63a25755048e018d1976d8ec4657f359e" + } + }, + "9cbb5a7f2afe219ffb9b787065cbd94ad44ebd24" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4f86da4fecade6017d7f15e30d8320446306870b" + } + }, + "9ce1b776e1a050af28b1034980a628b7728b0831" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x076ad7e168093f590a74f6fdce56b492a23baa2c" + } + }, + "9cefc7e38d2a714318e5c36c3c21b226b10218e7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa31be87c0ce167d8e9380a34c7d5004e42f37841" + } + }, + "9cfe89d89bfe28ba95777b6a90ac7ed86b0e202f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe7b8aae66ff70d59fcc5a8b4de5a246081547147" + } + }, + "9d0e24467eaf9b797b9e3f6a6084958889592ba8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x299f80e93d68725830c27cb084265d0e634e4f78" + } + }, + "9d9fcb724db6738e2ed07f6815a0e5d45b3042bb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xdae44ad9bfab81783c1dd591ebe3409fa8967884" + } + }, + "9deb7e973e3567140c51750e92d7c5091174f506" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xec318906ab052a41ef13ea33deee554704a307c2" + } + }, + "9e30a8e67c1dc0ddcbcb8c0d957101801fd250cc" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1f95c6da6a9e0abe74900ec00388094d32d98a43" + } + }, + "9e8fe9f31e954787e0f9d01b4a7a0c8d3d320614" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf78b2d97c8af245b705c0a19601b95f983e9aaf7" + } + }, + "9f28528f2db498c3a0e79b15b97d3b3e9357e942" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x104f577c92f14f3684c13eb179b9969c05115605" + } + }, + "9f42a00ab7bea15357b54e16867383fdc02e7060" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb3edb875f0dc5faa556edf77a97e53c9d828d147" + } + }, + "9fbf90147bf6ca022818372bf38637738d553552" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd032f83c65a584f6e47f9fff9bc864d51a164a95" + } + }, + "9fdd9d67e3e2c78c419e3ac9bccc7322041c3b1d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd111da05d7193bc295a4956543810071fcbe4239" + } + }, + "a015c57718562f3839cdabd7d4e9c86f1a321a1b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc71abd039da56d4c1d783ed06a48adf0808e9cf0" + } + }, + "a02b80b54ccc306e042c286172ba903dd53fa4c3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xeb1775a16c0965c299f06a0873e11825f915e4" + } + }, + "a06ebfd07c3daff1115b82d67be5bf4079ef6ea1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9848ce910f5874ffb5cad5fdc3507e8d54fd668b" + } + }, + "a086d90b189bda22a2ebf3e9b7092f1782e4fe84" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe0a1885b4057f65dc75636f4fb0e4b57da82429d" + } + }, + "a0ebd1b4fc0821dde34f102f6030fc9c40b29ab0" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4e4ad0ada6b3beffa2436bef1f6a8054f4476be9" + } + }, + "a1230890b4634e4461d6295fef3b4ca6d8899bd4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf026ce3f255ef9fc7b93719a3f6926ce4953bfe2" + } + }, + "a1ef404093a02445fe14243e853a641c23ecaff7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x033b61ab81ffc5adce16d365458629d9f348212a" + } + }, + "a20b30a1e7723ce15f80e9706fe9c1ea05170a2f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9663275f953d54a345f3dd00e2eeb0f15671012a" + } + }, + "a24089bde6e39fea0d157ab9aa4173882e62f39f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x752e929cfb45fd739923f562b146db315b8cc4cb" + } + }, + "a2442dd71a4e937fd73ff383067f97ad4c83b4a1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1f1960aa296fd1f00ff131357138001afcd858aa" + } + }, + "a301df371257a12c7bc93194ec045d211a2d4359" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3d7b61ce014d1cb84465f1f908a6a940fd991b3a" + } + }, + "a30dcb9cfbd0e8c874e4f919dbe71be3545464a1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe0fbdd03e0e490770d671965ccce5f5ed42bbb9e" + } + }, + "a318ee3c41da839fa1002dba1f9a140274ce59e8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd7a36da4e6e26a99b038e34a6eb74d10d422baa0" + } + }, + "a31b0038c42665206876c410caf02e67405dcfff" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x96f4278992ff6da5e8e60456279d9bc5d1f7a846" + } + }, + "a31be87c0ce167d8e9380a34c7d5004e42f37840" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc33582140ad3da6d7fde2c3c73d0530cbde93556" + } + }, + "a3396b3bca8473c21f9ab1fca8a40ecd580bc625" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb7650fa902a0ad81e8d48deb557323bfcf32efde" + } + }, + "a381c1eb58a73d7e7c8b857fcf3a1b50c6116e1b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5c0ddde0773ca1b8f9b07ecdad9f47f2705640e2" + } + }, + "a3a80c15cc0e13dd1aea5949c48ad5b120a8d831" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7a315595e01d6e16134063232a01395187c9650f" + } + }, + "a3ad081c8f3b79ad20285e881e0e4d011efc012f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa1ef404093a02445fe14243e853a641c23ecaff8" + } + }, + "a40a11c1f943538e64466de3b3bf8c022b883094" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd79995f1fbdf19beff429a94fa9dd184827c68c5" + } + }, + "a4202b8b8afd5354e3e40a219bdc17f6001bf2cf" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8dffcd74e5b5923512916c6a64b502689cfa65e2" + } + }, + "a479aac07f3b83ee401944a36812d665f54ca6f7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8c25b51ae5745b82c7b489b8fd4a9994b9679a0c" + } + }, + "a4a5e07598b0d6a40fe62ca88813b63a1c02710e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5a18f1d5e443321d54d1dafb3e3b5b6f2899378e" + } + }, + "a4cd6039bfcc6295533a985631a151bf2e0e8b21" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2d142ccaa1337198d592bc36ce7c5447da73f907" + } + }, + "a5303b50e97dc17384209bdc3723ddc6eda7aea0" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0eca69ecf3068082cff932c044fe39142ab6268c" + } + }, + "a5552ed8dae24eaed9346af3186f634d38ee9aaf" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb96672ac912cc5ad6f75157401ccd9003512ffc4" + } + }, + "a5ddf08c7de55ca258e346fd1acb1b71cc2f8829" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x16c5f61453cff59c6b7e2a690cd902b722084280" + } + }, + "a5ec829bcc187b6d19e825b5b6f12f86f81cc063" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xec45f260d4d758d6d23ae0297a9516190d935a5c" + } + }, + "a60724458ce6cca04016e99826fff8c99c32e3b3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe4028c8f2888697e9939562de475f70a841ee714" + } + }, + "a6495f085bc30ac47e89a9a700e406e26286c3f8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5c45b1eefac6061c7713919b34f5dcae9d5cfc7c" + } + }, + "a65929129c13f2405697b704fb1c840987ad36f1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf53e504312e2ff787bbb9ba4ea921e9edb7b1900" + } + }, + "a65ece83e15c7320aa0ef7ff2d69c2ff61fde661" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3b7465c98051ca273d8909857047d5dc5b022af8" + } + }, + "a686b20553a38e866228ce003657a71200957c3b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc0f36c8efba9e6e4e677faab240ccf0cf3e7d03e" + } + }, + "a6eab9c538a79d9ffeebc5d4495fed68dccacbd5" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc20cf04f10caa057314759a2908524925294efb4" + } + }, + "a71525ab6694ead3c1be0aad07bac06e69192524" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x34c972120d50fbdbb38ba536e4d61bc8f995d19e" + } + }, + "a724835568fb5e3986c1e87331a18b6628b73e25" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xcebebe455b6a15d2e4705ebe51fe5007afda76ec" + } + }, + "a7547a96b2c999509ae062509a0d426fa46ade62" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x39457953215cb93e68bc5b351d63a8b7fd16031f" + } + }, + "a770dccb354eae253f170825000386233ebed231" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x42ea619ae1a90979837ad2137458d991ea0613bf" + } + }, + "a777e559211613e73d9d0cbcdad62c88957d6f25" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1c827d36ec915dae96fdc0b164fb7bc1be9467b7" + } + }, + "a7aaf603309127956371841badc44b69252d142e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x97a3956189161fe3d52554c2a599bb619983be5e" + } + }, + "a7f111e1b259c9bbd4beba8ebab4dd6d35bb9ee3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3d082c9477c05d23447d1682257a9d0ac1f948bf" + } + }, + "a89361425f7403ec9e757b5d1a31993a79189a34" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x57cb48688d626a12fd4caee130b11e1b06ebaacc" + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a4344c14", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + }, + "a9647f4a0a14042d91dc33c0328030a7157c93ae" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8703df2417e0d7c59d063caa9583cb10a4d20533" + } + }, + "a9ed1d8a969237243d26f8728287cb3eb8730662" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x83ed885c9759d5524052681a5602616a4d565e88" + } + }, + "a9f73dca799231e385ce5038c826b03eff0d1145" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5d57e28e16bcf33b37672eeb891b29c481e89121" + } + }, + "aa6cffe5185732689c18f37a7f86170cb7304c2a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x293f982d000532a7861ab122bdc4bbfd26bf9031" + } + }, + "aa839cff1f78242d01a33305e1d9973cd7c66d4d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xeb9414a32f85461cf4ac7c9c73761f3f1e5ab14f" + } + }, + "aac939ac7c11bbbfb7f4520d14442a2460a51e87" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3e1b0d3f5819f63c9621ba4d4af623a7b89b99af" + } + }, + "aae4a2e3c51c04606dcb3723456e58f3ed214f45" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x83e3e5a16d3b696a0314b30b2534804dd5e11198" + } + }, + "aae4f6978a8eb4a7be406a2a787d31dd49cd551e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x44ed3a04032bf3585faf1dfedb9806eeb834580a" + } + }, + "ab118214a2227c79eab2680df0a96d0ad67dafd3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf9c7db4a48b918ad6e44d2b55e2339fdcde01d27" + } + }, + "ab1b93b6a83c275972ec2a6b513c3106dda84f47" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2abef5958c8b283eaeec4557844ff1fe194e6cd4" + } + }, + "abf67dec2d1ec31dd111c2f1135818b6af86c662" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x56cb9d29e9be519d3fc1cd21fcae7750aaa8b846" + } + }, + "ac0dbbd8aa555e012e1b5fde0b4e1f20e30a057e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb705cdd0dbc620e11fa470f9b4938c5f9f42d84f" + } + }, + "acbb287ca3f98d4775dce56e40ffce57ce4ba179" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd7409d185224a0284e7451923e3d094ec309ef93" + } + }, + "ad02a5cab29480ea5b67e354b0da540082500327" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6ff9622ab3c22e4357e90274d00291c527991d22" + } + }, + "adecbe660a4943fb6feada38775e51259ea15af1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x277c19a0f1e4f5e4339de4d0223fa254a6c8a5e0" + } + }, + "ae17512fd9edf51989081b42962b2fc85de4a2d8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0723789d0c7093f6e97c3fdeb1324a75427ca6e9" + } + }, + "ae5837876e23fcefa0f204d7b6433966ebb854b3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf8e4de2f36fa5e9861fe3af86d05db4cae1bb1a5" + } + }, + "aecb52facdff422fd67875967e9278a7b872af32" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7cadcf3f4031ebc2bc85040ea16d1ad26ce1704b" + } + }, + "aeef5b5a721ea3c03ca909bf1f71c122ebcd32af" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa5303b50e97dc17384209bdc3723ddc6eda7aea1" + } + }, + "af3cf705624b239ce07280597a55dc8ca69dd086" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xceee86e99b04198c09fc8ebf3e2f45253bddeed6" + } + }, + "afbd8818fe046adfa468ea58a217b83f7d5e75a0" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xdceb9854f220556f595bd655bf6c023457341e4b" + } + }, + "b008af759b5359810c78d181f0743ed85c286116" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xdddb23bf0a55d0197810e062a5a24a1503705ae6" + } + }, + "b021f73dfd1500257934aacddd707e6f67173edf" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x23138c70217200a44c58dceaa4f5ab06470213a5" + } + }, + "b03a2acc80fce6d54bd1db95d7ff24123ed6e106" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x060e7bcadd084fcf19db5cc1ea769550bd8f7509" + } + }, + "b0a10fa71a1c4c621345666be094909ac112ec82" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0581dee4d5420c2f6b1614ca62a4d66bcf383d0f" + } + }, + "b0a9ac49b7fc9a45c9e7b358cc2e9e09dfe361d1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x89f02008028773d99248943a6bcb14200f4509a1" + } + }, + "b0ea2ec7623a1faebead30c8007b260a4c62f99f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2bb175c167599417f2192d9f926a5c648d17de90" + } + }, + "b0f8d2e75cd431ef9d818a2552aab19a6a99c1d3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8e15b61b6735457672c8d4809e30ca7877e9fabe" + } + }, + "b14b3e0660d147b2603ed92fec4ff337e3c259df" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc5c5d6ad672b24a2ddedbd2418c4c131c212cb10" + } + }, + "b15c7770a476be2c77c3bd50d60ea6b2cde3186d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb7c425948402f9382208346ff48ef6ac4667baac" + } + }, + "b1691d2608aea9d7a56083dc7dcbfacc93a4287a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xdb06ebb361ef006c17f89ad92165185a38f6e631" + } + }, + "b1ec052c576186de285bbd31164de3b19a844dc1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc694bd4edd4e806b9c7d4ad742a3be423391470c" + } + }, + "b2c10a1979ac6236e586ed704cf9dcecb034b8b7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1b8a6f09f8fc9743b59ddbb2f105034e32262553" + } + }, + "b2da69bc3361eaf80dce81a17d610217ebbc7a17" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2e070631694c093a9a329ec0b4a1cfa57e20ab78" + } + }, + "b2f828407f1a5fcbb1e4ec079c22d791c7fa5478" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9c5fc050311de43f7b7d9a66e8319ad3c051a253" + } + }, + "b31b1fe90a535ed66dfaf1bf9e1062190fbe88a6" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7161527e54370ad8fe44bc83d692b10b9f9b877f" + } + }, + "b376b876f7137844ef5e2db1e307713885ee5d33" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x269f24e1ae86f63876b0504b7b26e20483fa95f9" + } + }, + "b39c43369a4ec5e4b2dfa8b3dbb3a12bad630b30" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6454029b19b69bcda3ba156684d58283636dea41" + } + }, + "b39c8c3ee619a2946cf540cbf16720a881110f83" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5bd96b317d4163401c9b1a2271c03b9439e73e6f" + } + }, + "b3b4dcc6ba6c6d8c352684bc69a135cccb2d88fe" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd49daab5099319cdda477f5ba715ae685c031db8" + } + }, + "b3edb875f0dc5faa556edf77a97e53c9d828d146" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7702eec59b0ee531bef08c14d0e6c89e7e43ebad" + } + }, + "b4429d6274f10ef0b7ba30837c5de603ed4c16ef" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x560d5f4c8933c5ca0c2c1b4f3e8b22958c9d7cdb" + } + }, + "b4481bed4acdd11d8f22f535016a762cc87845c2" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8e1320b630d8a411819c16dc0edc2cb77ed8049e" + } + }, + "b4c315d98fa6cbed10c6331e2a5e4688ed0b7f7d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xbdd290243af494ef27e986a3cc432ba3f873758e" + } + }, + "b4c898e7d827a75d991aec0a837c23aa8d9041e2" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xddfb1c855ea2b2f198d2b6c7dc8ea0ee16d7319b" + } + }, + "b572b99fc06b16a232d74898e587398d25d7d33f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9b0a69ce744a08c595426d7cfa5fe5f4dc844a26" + } + }, + "b5f4de69833ef9f1392c74a5ab905c5cd1ab2874" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe74299a026e8a481c1db07e6065ca30af9858cbd" + } + }, + "b6367a493bbaed7334456b3646e4541c9e96012e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3174a074366bc04bfb7f2a728a725cb01cd575d4" + } + }, + "b651decbba52842e8fc86afda1168ac549dea7d6" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd9dd1aa8519580888c402dd4fae66ca68b4a7b48" + } + }, + "b678cef4a4ba3f3642fa128daef4ed6d50ba1a0f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x33207da78e5ef3dde6fceab85bee1b5bf717e13a" + } + }, + "b6bcc464b7b7f0359e87e9a9517d10823a2e0c93" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb7fbcbcd3389df89233f8bf6bfa8acf892958a34" + } + }, + "b705cdd0dbc620e11fa470f9b4938c5f9f42d84e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x02c577c9c1b247c0ea60b1dd50fa895c086e2f2b" + } + }, + "b7650fa902a0ad81e8d48deb557323bfcf32efdd" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7343c0aaebc045465ffebca00e201c1f554c2eeb" + } + }, + "b78428568fc511f4a6ed34c2d57c4e104138ca98" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb678cef4a4ba3f3642fa128daef4ed6d50ba1a10" + } + }, + "b7b7c5f65fc11a6bee686b9363884811be247c43" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x72969d083705c924922b857922930f2087426ca1" + } + }, + "b7c425948402f9382208346ff48ef6ac4667baab" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x73c85788bca3bc1fb2e9b3056c595a4a7b3d2e47" + } + }, + "b7fbcbcd3389df89233f8bf6bfa8acf892958a33" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd80ba0ac6edb71367c1634ae5bf72970e596a99d" + } + }, + "b88173b953f6c1b613b6e878cfdb34899e3339ac" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb2c10a1979ac6236e586ed704cf9dcecb034b8b8" + } + }, + "b8fc89fa4eae09e1b4bbb51f4c1791e589368801" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa5ddf08c7de55ca258e346fd1acb1b71cc2f882a" + } + }, + "b9261902783bf36bab49f18323a9c8e4ad86519f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x130d08c2381d23796ff403d8f1fbaf204d90e3b9" + } + }, + "b94d3b46afb9954a375e50a6fede26705800a057" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x94602cccae39d50fdc504869eff546d1678f0ae3" + } + }, + "b96672ac912cc5ad6f75157401ccd9003512ffc3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x986e30c8512ac023f09da460202322a88e98aa67" + } + }, + "b96982fae6a70aff19c2d99c3b2adc57b151d784" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa770dccb354eae253f170825000386233ebed232" + } + }, + "b9f7e8e7ea5b1a7f184a152373526ac7acf4477c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7d3b079a8306f7cc89f1b9b23319ec904e3ad854" + } + }, + "ba158ff71047c0322b1474461f94c0246d0dfb2e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7f57dd2b577f0d5cb1fad7bbb2cf8f07ec0f019a" + } + }, + "ba3adb3b7ccccb748a65932e0254e52ce092c5b5" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd25b7ae72c049f91091a4abedc4d618e5a05e1e1" + } + }, + "ba56f0f804625c0ff8b7b119bd03af0a10b5886e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc0cbd80b185007c05f50e6f2fbb03e8d6b2ed653" + } + }, + "ba70f98f64f041290dd6794e5cbc9e8144c8c914" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x134c36c64db09ad23fde5b43a3a7a92d84dd5301" + } + }, + "baf332c908b38d0c5e825b41a500525fa990b0cc" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x69afd0683057a214d3bb3cc7d438961cf8c8b201" + } + }, + "bb26680f6bb423720c6437fab35913d0a86e2a78" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4ebc77b7203cce293550d92b2b5587621cf5321a" + } + }, + "bb7a0556525b43c750e380a0ac1ca3bb719e601c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5cf45d08c0b55dd9c34cc4cb718c917333f2e9fa" + } + }, + "bbdb82e2b1ebae617370e1c27542ea087a4fa937" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x711b5163728968ec016a924238f743fa04f2d120" + } + }, + "bc2929a7819bb70f10676f4bc004fff40ce5a52b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfabaccc45975d14c53b830fd4fa0576da541d22f" + } + }, + "bc843b0159d8f7cf6fa1bda55e3ddcf78e1617b2" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa7547a96b2c999509ae062509a0d426fa46ade63" + } + }, + "bc845b8623c7af6b07eda7a5363298989cc007db" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0199dd91369b5ce0467b68d57beaf1d96fdc769b" + } + }, + "bccf73dc6498406a51b4183e22c4be57de5c4975" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd7ae2e59d0776d0ba96fb4b23d1eccb3d57a14ec" + } + }, + "bd4f71cc4a8facf8612158e418fa394cabef27b7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfd09bf9b58980d6a5776bb391d8c6881bcca2aea" + } + }, + "bdb0e729f9136a166efc4ddea366fc3b6bf6bf5c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfcdb751de1dc7c5246ce698b4b104016d034cfdc" + } + }, + "bdd290243af494ef27e986a3cc432ba3f873758d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3c4a4ef39f21e45a8f56e5c8bf8bacfaba78a778" + } + }, + "bddd1619fd3c4703733b1648b7db0ffa6dd09a19" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd0a97217cb0a4211e28a58222c1b038c44a3f212" + } + }, + "bea830535682332041ad318232044f5e914af083" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x387b1112283308ce33f63062a7531e6fe0f3af17" + } + }, + "becf51bad165c4b8544ecc57c7859ee946e610df" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2c4a413bc345da77b2d07a17313b6d89aef2c2c2" + } + }, + "bed1a42fdb56c7d562a773650bb2785737caca3b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1c32901c93008d3e09928bdf3385f32ecff9500f" + } + }, + "bf36bc1d23eebe66f84a0f119552dc7b46fe2402" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1cd52bab323ca2180a747d3c8b8405397003feba" + } + }, + "bf574eebdcc7ff3617200fe07c8c7154a8d129f4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe355b484879e20943aca2c6655953ec8121b64e9" + } + }, + "c052f8b19df2c41d807bde1c041a8ba2e87f15d5" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc3d826f0bcf2d353afaea99ec55eb9162438e316" + } + }, + "c06bd5d93ac2ecab95942d1639b700e3a2cc48b8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6af2602221d2477af828ddb2c1dec8f70a24abe1" + } + }, + "c071690916c15657eba376c7c6b4b06d38e815be" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5d3292b79851f68d3907a550dc1a0b569d603f67" + } + }, + "c07b721215b231d9820dc8d186e3dcabc6c75e66" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3671a99d2a485b30fafa2a65f405b6b03ed32eaa" + } + }, + "c0cbd80b185007c05f50e6f2fbb03e8d6b2ed652" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd9d8272a3b205f71494f9009705f4f30dd31c608" + } + }, + "c0f36c8efba9e6e4e677faab240ccf0cf3e7d03d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd87693ae6d35928467daf90aac749654e9c57645" + } + }, + "c101a7eb0ac863e824eea705432530c65aa0c518" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4af174d239e86ee19d40026eae04486804602062" + } + }, + "c19f48a0a131e8b9f44989bbac80a30ffe2a2e4d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1a6bbe5380998bea238848b7a5927fa87e7b9fe2" + } + }, + "c1ab531ecade623c0c908c1fbf104fb8c647a37e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x38fe3b47fed5fa6d060bde66598bf5a773b831ec" + } + }, + "c1ff6275aeeeacd2c79dc02f8cd5cdb44a81e6be" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe0b3647d7252d53d397fa6af6d9da4749f4caae0" + } + }, + "c20cf04f10caa057314759a2908524925294efb3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0b98f3276e76e9982d7f6996878ea5196fda62f2" + } + }, + "c291bf92ff9bdc0e60f049e6a5b143b940658857" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8ce9124341c4ca3c690b29f3575f3cb9833c8c3d" + } + }, + "c2a603dfbb0734c098e5b6b7c8a9b64bab11054e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x44d13c51fb706efb7394346b00debea9ea46e9f4" + } + }, + "c2afed79b83fc6b8d98802f52b1fea6648571ee7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x723bce7438e7c70d113e954e9aad5dfb4551dc00" + } + }, + "c30727a70f64c82d0d8837f1b45b931ebf80b106" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xee439948c6dead863ab2ba9105b70916d45f9e7a" + } + }, + "c33582140ad3da6d7fde2c3c73d0530cbde93555" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0b4b7f08623d9b3d6514baf529399e4f1c0ad945" + } + }, + "c37a43e940dfb5baf581a0b82b351d48305fc885" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf735071cbee190d76b704ce68384fc21e389fbe8" + } + }, + "c37d1d79868b6a4c25db68301b8575ae4a8336fb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfd0dea1a583400fc29051c8192b70022d8d92c49" + } + }, + "c3d826f0bcf2d353afaea99ec55eb9162438e315" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa65929129c13f2405697b704fb1c840987ad36f2" + } + }, + "c4170be517e6c67a9e65dddb09220df58e547102" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xdb4ed990c69c3b67a04a96ccf079649facb9c434" + } + }, + "c44e39eed84adf0c399a9d5af8d0053715d0f5f9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf9d417c0b18ff731a88a17f3b31d9d6ed1e288f2" + } + }, + "c489e22b54124b98b17b68e7c38676efb81c1862" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9f28528f2db498c3a0e79b15b97d3b3e9357e943" + } + }, + "c4be49d4dcee6efd96c35ddf346b969db9981091" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x87b02d6f0e02d90fb05adf14ae74570ea8ca6aec" + } + }, + "c57abf0b9724f82736bee2a05a9238a45de5512a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb39c8c3ee619a2946cf540cbf16720a881110f84" + } + }, + "c5a28cdc8c4b089c87ed4938ed4718253c48dd7a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xeb203eec55c1da2fd38977032c79ada414cc914d" + } + }, + "c5c5d6ad672b24a2ddedbd2418c4c131c212cb0f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6b6945d5fd5172355825871803b93e57c5040654" + } + }, + "c608a6fa0f9f3a6af68270740ed6c998e145eede" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb1ec052c576186de285bbd31164de3b19a844dc2" + } + }, + "c694bd4edd4e806b9c7d4ad742a3be423391470b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xbddd1619fd3c4703733b1648b7db0ffa6dd09a1a" + } + }, + "c71253e1b049c2b5acba1893c74007a26797e111" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf3b37fd9258f2c883c44e8ddaa90f91bfe9f5d52" + } + }, + "c71abd039da56d4c1d783ed06a48adf0808e9cef" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x80a784f83657ad12a742b94e01c3bbaf3fb2c6be" + } + }, + "c775193c9d81ed6ee806f6005a874b927e96ff19" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0802fc1dc1a5dec7fcbf1d50f3d8a944099ad72f" + } + }, + "c7e31a320a9a7969a6f4c3cf98bd6d92a6119055" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6d33e2eaa419844043bc41073bf3a2bc0a6c1b1f" + } + }, + "c82d5a989ed7c8ffdf79ea0724b3c9ba3fb84e57" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x27b3a0698a207d5ed960cf71b1ee9fc54c229eb5" + } + }, + "c8732f022b6c57d291b26c830c651b3617c75b2a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x99d6d7fe1a4f0f7d92837486a1f9d7dd500edc12" + } + }, + "c8b331eb5ad444567964f34dc24757bdd3425943" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xad02a5cab29480ea5b67e354b0da540082500328" + } + }, + "c8c3cf855531e1d06c07245e76c5298b4fc90d8a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4ec27065c52d294799b93700dcee6e32778f1b19" + } + }, + "c8c90ba51e74ac5d9e462ffcafbb6df11795ebe5" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x65e3776618742b90f1d9844c907b276854869abd" + } + }, + "c8ca05f5e8391cd5004c3c4020e570ed4a520c20" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x66e68e1d0f65b4379c2864f5228d98de265c5e31" + } + }, + "c9113ae38fc632738ad4722046d8e07ba9363ca7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfff1cd2c481ce0fba0c97ef77c79227d3b67832b" + } + }, + "c95ee3b530d4b057840c2d9cb542a51e4e3a00cd" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7d699e5ea61a26a7f677478cc79887e2f27ab346" + } + }, + "c98b82b246d3eca7562ae19d8ca605e77cd53a3a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4bb5fc5d686cfb132c177aee8ef426e5de98cc6c" + } + }, + "caf720d275e228b58bcd8b2686714ed8819cdc2b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xbd4f71cc4a8facf8612158e418fa394cabef27b8" + } + }, + "cb0ef5a0d3f9427d66aa2b00d4b25c2445d96cf1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x46aa4a5c336dbecbabd4cdfef3b9fa65a8a12a16" + } + }, + "cb5e208c02a68f2d97601da482c419af989e097f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd5144e55ee02feec18f2ff293f08b8379d1509d4" + } + }, + "cc0302264a5d0f269e26ca3ac24d7695b562b4f4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1591af76c716952018e52e54c716e8b2226d494c" + } + }, + "cc40f2616fb396bfc25e9b22ba3218b2b217ea3d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x317fda8ec45232a8259546a4ca8ebef16338d47c" + } + }, + "cc7c2f8a3070489cfca48f5fa0db9fa2d65e40e4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa4a5e07598b0d6a40fe62ca88813b63a1c02710f" + } + }, + "ccc8cd23dc6755bbb516af6ef2a04cc82a5ce5c7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9fbf90147bf6ca022818372bf38637738d553553" + } + }, + "ccce4f34ac3a550c95747823a00fecce349734f7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe21b2668bb1e9cf057606c44d49648f1c140aa77" + } + }, + "cce1e6f23dccba1aa1830b1b7714fe985f9f2032" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2f171d1f2cf19f4a458b7dc4db89fa7cd818dda1" + } + }, + "cd1171381ba62ff31b56a001b8144e64e365eba1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x38450559e7ed9b72c80aa00855b942f9bac1b282" + } + }, + "cd2910fb9ae3395ed149b28a1ce7c3cc58bc5481" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x62e75c838a732abab87e1846f361721f03e7d974" + } + }, + "cd5fca46bbc468b84b493f7b52ff50386b174d40" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xdd8317eb76e8949315e601fa8a6959e2ffd277c2" + } + }, + "cdc1f2aa2853b37723f415aeb181583e11ae7b8f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd2be9413f150b2eaf2666b42ee719fc66e5066f2" + } + }, + "cdcc86f0d7e95ea5b2f9f5e802015c8ff855b257" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc71253e1b049c2b5acba1893c74007a26797e112" + } + }, + "ce20ac750c9549b466d48c90352a255f6b7c8294" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3ef5e42a0012b430169dae579f8dac0f6ef5dc39" + } + }, + "ce7600131bfe22040ad75febed54cd4ad181276d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x786102f7205ad86bb77b14a1b80d8b26cbf3562c" + } + }, + "cebebe455b6a15d2e4705ebe51fe5007afda76eb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4f5af8eccb582ad30e2702d07577479599461c55" + } + }, + "cedbc4eaa94298536ad368e8ac9819c5e7448738" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7ebf86bf849b6097c8af6dae10c52438538a0712" + } + }, + "ceee86e99b04198c09fc8ebf3e2f45253bddeed5" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf4a32ec7fde64e7d3ceb53fcc00511ffe13ff5d5" + } + }, + "cf3f58bfe41401084fd1e997e8e36dfb35e363cc" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe703236fc6d1dcc955b9abf34f490e2bf5057fde" + } + }, + "cfb0d9c00c0b7ad292f221584394a3ae7d30e0ab" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc9113ae38fc632738ad4722046d8e07ba9363ca8" + } + }, + "cfb86844738d5373ad23eb3185e1e9fc5d517ae6" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6c14bbac448312636b86fe713185cf7d8ea6f1bf" + } + }, + "d032f83c65a584f6e47f9fff9bc864d51a164a94" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf94e8e9f1511f8cede3bfd8e1be0db35085e8e6e" + } + }, + "d09a49b1cdb208e2504486267ca2418c87152962" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5f1703b93938752face6e4657a90825b77f455db" + } + }, + "d0a97217cb0a4211e28a58222c1b038c44a3f211" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfc86915f4e8884b49adeb6f23a8f69e643d9db7c" + } + }, + "d10afb219e80a211c9072b18de0ff2317f67e573" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9a45843cf7ed63ab79f7df4d2bf80512d259b0c3" + } + }, + "d111da05d7193bc295a4956543810071fcbe4238" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0d11b1966fa90191f6927943c476d36fa3a31557" + } + }, + "d19b2ebcfea3994bf30a7e4283b73d4bdd319cbb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xdf50b2ca876e4174d276dac0c64e644cb1b5a119" + } + }, + "d2468d6da54259507d07f74ef0a246f97e52f035" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6cc6da179301a7ec4290cc0a5860a42ad18839a0" + } + }, + "d2571607e241ecf590ed94b12d87c94babe36db6" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x62c01474f089b07dae603491675dc5b5748f704a" + } + }, + "d25b7ae72c049f91091a4abedc4d618e5a05e1e0" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xdc19c28fa6124ee9d0688d0e2879f1269b4b7fc6" + } + }, + "d269786262f853ed769ef3ea9a7e5b98db3bfb32" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1ec26f14651cc567ce691ce83ef09eced6b12a6f" + } + }, + "d2a0b130c0834eb0ad2717ad13233242280a6fd0" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x97c99c7f158206d19196df8d21573126569d918f" + } + }, + "d2be9413f150b2eaf2666b42ee719fc66e5066f1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9862b64181c8bf5bd53e51c5f596528ff82bf653" + } + }, + "d2c8bda3e1481b96b4a3ee0a2e1f3f1aa6299feb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2eabf4237f49d4cd44ec256436b99ba41828d36d" + } + }, + "d2e450aa145ce97dc054b1bcf391407fbf202bd5" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xda1849a4f9df2e58d30c94732ff5f3aea19ccd8e" + } + }, + "d3a4f3cc7113eb16572eced68ab395a40ceeda1c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x87dbe63fcbb0c90d20021f9c01a03e7d94916b3c" + } + }, + "d3ba8bc2aa219ba0aacc8960b92832c3b0693bac" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x30b37f280d6735ee04239de0963b071f83c13a28" + } + }, + "d3c1c3359ed1906851379272964b7d96e2977654" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6c3bed6efc677ccb136c0d886a6f3fdb375798c2" + } + }, + "d49825eca3314ad0c5918472615055010cf4a4fa" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfd5b134edd8931ca2102693d88070dd49fc13351" + } + }, + "d49daab5099319cdda477f5ba715ae685c031db7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa777e559211613e73d9d0cbcdad62c88957d6f26" + } + }, + "d5144e55ee02feec18f2ff293f08b8379d1509d3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7797a5c4bb655b5ea51bc966875abb3b19c0d106" + } + }, + "d577d44f2748e151afdb1ded254c942ca9933b0b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3f5bf6c71c4fae1a91c1cca72b539dd83762a717" + } + }, + "d65386ce109ffa3570dd27e54f32e2528fe01fc3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8405a655c77ae3ebef4410c924cba9ef22a57f43" + } + }, + "d7409d185224a0284e7451923e3d094ec309ef92" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x81b26e12027f5df776edd5539791e683dc2e57f1" + } + }, + "d743161f0f7beed30155e171b4d577d5ce2a70d3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4d4ad735b52df9e88fbebebac2de1ede991f9995" + } + }, + "d758e9a701769fe9e5a80b3a09180e7631866f55" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xbc843b0159d8f7cf6fa1bda55e3ddcf78e1617b3" + } + }, + "d79995f1fbdf19beff429a94fa9dd184827c68c4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xeb5ad2481a57a6b7ede3a16ad8bfe2991eef3ad8" + } + }, + "d7a36da4e6e26a99b038e34a6eb74d10d422ba9f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf74f956ea3d122e47f4aa0066b5e3605c80d0283" + } + }, + "d7ae2e59d0776d0ba96fb4b23d1eccb3d57a14eb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x01b26e834122a942828698305a84789ec47c0455" + } + }, + "d80ba0ac6edb71367c1634ae5bf72970e596a99c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xeb67f5e410e28c16861fea7a2ecc1e0011a760" + } + }, + "d87693ae6d35928467daf90aac749654e9c57644" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x833bafb51e8a34c93f3100430fffc5ba61ef95ca" + } + }, + "d9860a22b84f982363ab9684d767a347a5c4fb74" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xcfb0d9c00c0b7ad292f221584394a3ae7d30e0ac" + } + }, + "d99befc655ecd5df508569aaadd729af7371687e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x844301835752f15f39550cdf531e07ccef5d133e" + } + }, + "d9d8272a3b205f71494f9009705f4f30dd31c607" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc98b82b246d3eca7562ae19d8ca605e77cd53a3b" + } + }, + "d9dd1aa8519580888c402dd4fae66ca68b4a7b47" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8bbe1ac3ee5866589a669dd95744af5ee83e1b73" + } + }, + "da1849a4f9df2e58d30c94732ff5f3aea19ccd8d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfd096ec4540dacfebbabf2dd6ffd3493a09cc390" + } + }, + "da3580da73b2986fe0da9b6caebe17818b7b3645" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9a2f4d9e7fd12bd7dd8141098bd3363bb644f069" + } + }, + "da5828cee8e61bd0d8af71ef5da9a7a9019ade13" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe475b2b441a9b1cdf24e0ea992dfaecedd58d6d1" + } + }, + "da7555a43e7a3790290cd20a19ec19032e28a6dd" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0c1e13b0604290abd900eba3fb6b7560b3401f59" + } + }, + "dae44ad9bfab81783c1dd591ebe3409fa8967883" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xebff1a1539630b2f7b5260a93ea602372e539367" + } + }, + "db06ebb361ef006c17f89ad92165185a38f6e630" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x980410833d9ce53a0f944ccc629032fb0e6ae6ab" + } + }, + "db4ed990c69c3b67a04a96ccf079649facb9c433" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xcc0302264a5d0f269e26ca3ac24d7695b562b4f5" + } + }, + "db58d0b35d26edeb0efcb49f7eb627cf49bb3a47" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6a31cc57646f3d9ae3b63e1f604dde04d1ba52b8" + } + }, + "dba37eb3483100bc89a7bf11b7f110ad71ecf41c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9beadb15fd4fe1f0755ce82dd160e1a798544a1c" + } + }, + "dc19c28fa6124ee9d0688d0e2879f1269b4b7fc5" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa65ece83e15c7320aa0ef7ff2d69c2ff61fde662" + } + }, + "dc1baaa8621b513d62e8aeb02543ce5c7b8020c0" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe326d4acceedb3e572b98d4a45a6f1e37ee42502" + } + }, + "dc280f2887ea315f70692eb247e399b18a07bda8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe0e8eb511c8a93cbc42dec4e3c0b8492ca1d81f5" + } + }, + "dce512ecde5a4c27da464f846e71c8272da4ad80" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x91acc7d4c4cc7affac116157a53f5614959485fa" + } + }, + "dceb9854f220556f595bd655bf6c023457341e4a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xbf574eebdcc7ff3617200fe07c8c7154a8d129f5" + } + }, + "dd0eda6e9a3dccc3d430e5dd333c83b759cc7883" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x32a48ace80773ad092de1d9bcaa00787353b5fae" + } + }, + "dd8317eb76e8949315e601fa8a6959e2ffd277c1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf475a28a9649aa00ab8a40af393f1961587c2276" + } + }, + "ddb6aeb5e1bb4cdb44ca3a9b979996c529d9fa3c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1209046d7bf46e81d8202422e630719c906653db" + } + }, + "dddb23bf0a55d0197810e062a5a24a1503705ae5" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf134cf7fd6ed2e962db26c4b3d99ee5884102c86" + } + }, + "dddda651d375f5352d2ff488eace1de63b6ffca9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5ff4ef866c3ad4102444d020c1d21c3d35a119ec" + } + }, + "dde0b1e9b9ecc980c5614012f9afae25cb1a1c16" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3fabe5e3c3a59fd322cb638dc5295d1e94cbcea4" + } + }, + "ddfb1c855ea2b2f198d2b6c7dc8ea0ee16d7319a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x253a31b068a402910eb30758704b78c375ea349b" + } + }, + "de63eef4b269d8572b6b00574ad8e34c471a07d6" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xce20ac750c9549b466d48c90352a255f6b7c8295" + } + }, + "def94fccb1b7dfbe1cf0b3dcaa03a77cf58ae768" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa06ebfd07c3daff1115b82d67be5bf4079ef6ea2" + } + }, + "df50b2ca876e4174d276dac0c64e644cb1b5a118" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4e5cd86dc5f716ebbdf6ef572a369c227986bde5" + } + }, + "df5767dc4d8111e8641198f637e4423c62e57e27" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xbc845b8623c7af6b07eda7a5363298989cc007dc" + } + }, + "dfc26965c20fea217850a28c08021f1468146101" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1cd063768378c77cbcb93dab0ba4c345d76bb0ff" + } + }, + "dfeb403cff0aabe20cb07d8451caacfe31260132" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x82afbc3f6dba388dba71ee35f56ea772a53033a9" + } + }, + "e026a4835edf27c2705c97f237e5b59b7b5da1f7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x12eed250610e4d59e841381dc46deaea3d9305b2" + } + }, + "e059d3aac9a568120467ddbba3e4d25bbc82dc64" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x21190aebff29feb773919d8572f8cc825bbf7145" + } + }, + "e089f14df5e00aff3b03cac5e1236f5cf5832d5f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x970e2fc1f55b1e2b214f84e155ae6a9403f891b4" + } + }, + "e0a1885b4057f65dc75636f4fb0e4b57da82429c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa24089bde6e39fea0d157ab9aa4173882e62f3a0" + } + }, + "e0b3647d7252d53d397fa6af6d9da4749f4caadf" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xbc2929a7819bb70f10676f4bc004fff40ce5a52c" + } + }, + "e0e5744863b26418baf12f94f0bdad2ef2546a92" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x791812110230af4583a4a6dff7eb425b0b0dfab5" + } + }, + "e0e8eb511c8a93cbc42dec4e3c0b8492ca1d81f4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x795d6e09eedae3febc172169c017fb67aa62efbd" + } + }, + "e0f04368af17d56c8cdb50f0fd5f1847d9a49cb1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8142cb33b22222bb9e39a66b53af12c6ca0b5376" + } + }, + "e0fbdd03e0e490770d671965ccce5f5ed42bbb9d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8d7912a42951e7201c8854b98a36e4203508c3a3" + } + }, + "e134cc9b2be1a15b9e270a9f7baacbda3c8b3659" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4cd33b31663c159fbd73cbb32f616eb46f7b18a3" + } + }, + "e14b8b08ed9b569d2945b078fe94225924c5987e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2559cea11e9d8fd293253a8ffada7558c9c4db87" + } + }, + "e1954d1413f4f50c7bb3aa0ee368b94dfeae7c1b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x629fdbc407b70b57eaa1523ab12c5178e81a5d53" + } + }, + "e19f216f6b8b78ff1e705cb56d0cb07db60a05ec" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8cfda5300d7544327e32aca175840f90860305e8" + } + }, + "e1e31732ce0075070c8d7e2ef7a44b93949493d0" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0441738f9f0a045afd77a72ef8398475c1111472" + } + }, + "e1f79aa1d6477ffd08d4e5ce185637434147e4f8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa479aac07f3b83ee401944a36812d665f54ca6f8" + } + }, + "e21b2668bb1e9cf057606c44d49648f1c140aa76" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa4cd6039bfcc6295533a985631a151bf2e0e8b22" + } + }, + "e24778b9ec00cc9bef91643e31885deee719207e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1bce33a58c2741f74daab60067f759e9fc5f8c41" + } + }, + "e28a959abf1b36ad7778737d992690cb73a51a91" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6d1f3f15f36d76d52d65b1b78a4ac85e91f33d26" + } + }, + "e292ba16ee32e94ba88b4b72821bf90fe7b1b845" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe1e31732ce0075070c8d7e2ef7a44b93949493d1" + } + }, + "e2982af9c977c39cb4633346b916a3897ffeb6f9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x09957f64c3396f36daa03c68fa6c997eb7903df2" + } + }, + "e326d4acceedb3e572b98d4a45a6f1e37ee42501" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x62123ac69c46a06f7e3644b0dfcfcded535b8728" + } + }, + "e32bec776748185042cb02d58fad1d5027bbaeff" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3debce965330c2da68edb1cdd3ac380d5ce67b11" + } + }, + "e3443d812bb8204255a1d249b82aa19508dff5c9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6bda06aef03a04b8eb3e4c7d1ef001fc806f5f70" + } + }, + "e355b484879e20943aca2c6655953ec8121b64e8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x22df73cba33d8fd14fc985fccded670de4041f26" + } + }, + "e365d9256480b1e9d3cc6eafdcad5912b75ad149" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5affb7ff218092cf60bc1ba4b32ea65a32cd6845" + } + }, + "e3d08fe78f595bede290f820ec0e878572803a6a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf25da1517af0e2fce2b9d75fd964e8827cc0cb73" + } + }, + "e4028c8f2888697e9939562de475f70a841ee713" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6123d3be4335107712685be2d575958b17501068" + } + }, + "e475b2b441a9b1cdf24e0ea992dfaecedd58d6d0" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x01619145d576c5b3130eeed16f29501f2773c959" + } + }, + "e49d92946422e69977a94d1b4b769f97efcfb8eb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7845e6c6f5d014cabfeffe6d4d9d18c547d00fa8" + } + }, + "e50c29688b2c3dbe6633797d2a200ed7c2cb1cba" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xcc7c2f8a3070489cfca48f5fa0db9fa2d65e40e5" + } + }, + "e59b406835db0d4c63ae28072c64c664da637557" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa086d90b189bda22a2ebf3e9b7092f1782e4fe85" + } + }, + "e5baf7303b008f333c57491345e604d52fce0d63" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x87946e396d4fd04d02f117adf25ac427895878b4" + } + }, + "e5fa8de537f7665e2aed751b8ca7c6b5bf0cdca0" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0d1e5ab3b0c2d1ad5a562c123b7f01f4145074cf" + } + }, + "e635349c1e038d62f774f4201cbda082b8af403c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xabf67dec2d1ec31dd111c2f1135818b6af86c663" + } + }, + "e64dff0ba3f0eb9e054a638d4d5f6f0cb47e1e98" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0462dd089e0519c581654520d17763635011fe00" + } + }, + "e6df36db61ae2c46d2cda2f6c8d1856ac181e6cc" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x73f9912db6e86599f256f090dffd915a845a9632" + } + }, + "e6f12dc0baf6536aa75f226bfb0262d8266433d1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xdde0b1e9b9ecc980c5614012f9afae25cb1a1c17" + } + }, + "e703236fc6d1dcc955b9abf34f490e2bf5057fdd" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8719f47f3dd875955760868a4fb23f761cf7d4ae" + } + }, + "e71d6b1facc3de5c246f7d14e35a2b4a2d983c11" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4e76fc5e619a4200846eecdd5545b39499debb11" + } + }, + "e74299a026e8a481c1db07e6065ca30af9858cbc" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xbaf332c908b38d0c5e825b41a500525fa990b0cd" + } + }, + "e75900e645ce8d1abbb97d408989b159b2a50a1c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb0a9ac49b7fc9a45c9e7b358cc2e9e09dfe361d2" + } + }, + "e7b8aae66ff70d59fcc5a8b4de5a246081547146" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x08d19f247ca974ee89d4f988cac4becf7a177724" + } + }, + "e81f08cfb60f7c156cf7dcbee1b8790901a1eadc" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x298b8bde7997684bfe4434cf6d24d50ddabb69b3" + } + }, + "e8373e7e464120da8a84da82c8137872cda65780" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7e2bd10d506af5eaada030590c8073495230f37d" + } + }, + "e857a6c6f502dd2bd0ec341b2d4ed55f2e87e8e7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xab1b93b6a83c275972ec2a6b513c3106dda84f48" + } + }, + "e908278cc1515f214049c48c3a8908524f2cc407" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf12be871bc1a1f3ca254eb027786085dd79494c6" + } + }, + "e913f5b697154f99bfc159a132c6c253b457ef18" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5ff4d4daf0a832422c4675a77720abbfb5afbba9" + } + }, + "e93e7128f80bef53e3217782f21f4bd6a6d19c7c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x54819bf1efa86437d2f38b4211bdd5229247d9b6" + } + }, + "e9d157e81c306452f8494f681813037b146660eb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0e700a2aba22bd639abf05addbb24c53c3f0f3cc" + } + }, + "ea186a9a4815581b71403480abae5cc7c57c00be" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x09986b78d02ae7c8eaa8b62053a3ee78deba79ac" + } + }, + "ea216bc75a65a838ea3d63f7c05588c2840ec1ab" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x305773e25e157761c9d55cb7d9e24fc1b953a8ba" + } + }, + "ea2f1211c66cdabf2b618a4dd965ce133592763b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1872142d84f7023b181766b790a4487f4012527d" + } + }, + "eadf36b1baf942879b0b5c45469fa05add1d61b3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc30727a70f64c82d0d8837f1b45b931ebf80b107" + } + }, + "eb203eec55c1da2fd38977032c79ada414cc914c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc95ee3b530d4b057840c2d9cb542a51e4e3a00ce" + } + }, + "eb4e97f22f12995949c371f2df690f68f71070eb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfc55e6958f11444ae56c09af726f2ec57525db59" + } + }, + "eb5ad2481a57a6b7ede3a16ad8bfe2991eef3ad7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc3d96a0eaddf7975da5c8718c26d65de0de59c" + } + }, + "eb9414a32f85461cf4ac7c9c73761f3f1e5ab14e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x16cab73035afa73268745a3c2937b551813c4961" + } + }, + "ebff1a1539630b2f7b5260a93ea602372e539366" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x81d6578dc3e3c0fb07a8d62f66c1eaf3b97dc2af" + } + }, + "ec184f693f222b3e48622f5253c134339e7e2e7d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1f01dbf8bd02bed14cc0a21831e044faa3f66fcb" + } + }, + "ec318906ab052a41ef13ea33deee554704a307c1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x14a76e43bc292a0e69bace56681c4eb50d8e52d8" + } + }, + "ec45f260d4d758d6d23ae0297a9516190d935a5b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa1230890b4634e4461d6295fef3b4ca6d8899bd5" + } + }, + "ec5f2ac1947c51c5982eb0ab63d1e6439f45c2e3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6f257471f06ece199232aaaa082d2b1ae7ddb484" + } + }, + "eca2fc261f07a269c2487e6d1b0539d0950ff792" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa60724458ce6cca04016e99826fff8c99c32e3b4" + } + }, + "ecb643ddbca1cfa6dd22964c20ef57ab47c0fda9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe635349c1e038d62f774f4201cbda082b8af403d" + } + }, + "ecd38089d14a75b93afa634276bbe8965f5642dc" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf00d30ecf763691115d2314d14ea1e11f61ad875" + } + }, + "ece9d0b9393f64338ec6ca5b0efbcec2175f19ec" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd49825eca3314ad0c5918472615055010cf4a4fb" + } + }, + "ed1a5e97e3415b484e6bc8b84bd170dbdd879cb3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x059ec3d5a255df8a5b592659ea5fdd963e9bd0c3" + } + }, + "ee21d08004e0b6f2c1cd4bcb2a04ab74f7b7b708" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x511b33319d0f7df487e07c4f5d149b27cecace47" + } + }, + "ee439948c6dead863ab2ba9105b70916d45f9e79" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6bed38b822d8823a2cb71883522f932cdde95b0b" + } + }, + "ee6f3914a1e5d955fd62a29562ee0ab776235ff5" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x97316b1fd92c5e6611acffe79899064fd9274c8b" + } + }, + "ef36b064bb706bc0540e4ed2b341ae8a0b7756b7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xafbd8818fe046adfa468ea58a217b83f7d5e75a1" + } + }, + "efe2a6d8859b14ecc69baf66dcd47f4067df18e5" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xcd5fca46bbc468b84b493f7b52ff50386b174d41" + } + }, + "f00d30ecf763691115d2314d14ea1e11f61ad874" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x69fd2b9233b83e54861436496ad6b9fb28afaf41" + } + }, + "f026ce3f255ef9fc7b93719a3f6926ce4953bfe1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7fe4672c6fd2a05c7a91676e5ae2e75ea197567d" + } + }, + "f07ee5b0729c565f7b57995a108f94e4fcb81558" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xcd2910fb9ae3395ed149b28a1ce7c3cc58bc5482" + } + }, + "f0dc197380bc632e5078f75f5ef0b814b7eb2ec6" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x814a465f554f949e6e2a6878539c705f319c627e" + } + }, + "f12be871bc1a1f3ca254eb027786085dd79494c5" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3b7d7653d3a7c2712d08bd29668163cb775c74aa" + } + }, + "f134cf7fd6ed2e962db26c4b3d99ee5884102c85" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd269786262f853ed769ef3ea9a7e5b98db3bfb33" + } + }, + "f191a9c00fe780f63cf4f68a06e895bd53981254" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8a05aa8ab787526a0591016c2aee95037b8a478c" + } + }, + "f1970ea5af8456fee42cc087e79bd5c6a6efaa87" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9a0ca249b7e4f00f62ba5230a602c3233895cee3" + } + }, + "f1ba5e0a4a27d8dafcf87f049b178fe83574ac06" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4a466c64765157e1a9dee46e1a26d95ac2664c50" + } + }, + "f25da1517af0e2fce2b9d75fd964e8827cc0cb72" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa2442dd71a4e937fd73ff383067f97ad4c83b4a2" + } + }, + "f2866fb67103c69f10edaed228d2dd64b7e6df83" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2f8ac479ce5baade6a63ecadf9599bfb0ecdecdf" + } + }, + "f2d3cbe7357ee858c2b7f6ea28fc95c1af508ca8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfb5d7c75f272b07450867579978314661c3e1207" + } + }, + "f2d923a66a9684f2268530094ce8e3f8b8cae52e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf2866fb67103c69f10edaed228d2dd64b7e6df84" + } + }, + "f3b37fd9258f2c883c44e8ddaa90f91bfe9f5d51" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x38c622aecb7e84ad4fcfc327ae9a1a17e2dbc36f" + } + }, + "f3c5a341248911dda9d694ee74bf997365941dbf" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x82d03794122107972c0d075f16754791224b507d" + } + }, + "f4489af2af8424c6edf0d0adc525680dea208a31" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6d27b8cb6b9af8a56fca98f13033d15f10f66da5" + } + }, + "f475a28a9649aa00ab8a40af393f1961587c2275" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x702433f6bfbd76274ec1bb641c4a0428298487f2" + } + }, + "f48270bfa988db4518f9b1db9e78bb398c954550" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xcf3f58bfe41401084fd1e997e8e36dfb35e363cd" + } + }, + "f49ecf0e4378b1957686d8d0b227f83e48e5523c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6ac56f1ceee102b85819d789e6b29308eabc373d" + } + }, + "f4a32ec7fde64e7d3ceb53fcc00511ffe13ff5d4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfe8d768de7a723c23583162dbef207b6dcb4fb59" + } + }, + "f4d2d03bf70c2500fe431fdc8fbed2c13437bdc9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6b5ced188780878d8a72b3e6f02618db2bb97585" + } + }, + "f4e76b020a22e8c1929ba2163e413385fc0cf884" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf0dc197380bc632e5078f75f5ef0b814b7eb2ec7" + } + }, + "f53e504312e2ff787bbb9ba4ea921e9edb7b18ff" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x58cbb2379b1fdac0a036bf75bb598e7d4fa232bc" + } + }, + "f5472ede25cb83dc2fe392b01111133b777709b9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd3c1c3359ed1906851379272964b7d96e2977655" + } + }, + "f619381383c69659fe81a10d695b2663426624d4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x79225179187b35144fe9e8505cce2bcff3986ffa" + } + }, + "f62f676443b29c513964f01cbb356165ace54b78" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc608a6fa0f9f3a6af68270740ed6c998e145eedf" + } + }, + "f6ee7d8bf313f837bbfed7f10b16fb2f182fd416" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd2a0b130c0834eb0ad2717ad13233242280a6fd1" + } + }, + "f735071cbee190d76b704ce68384fc21e389fbe7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x31c640b92c21a1f1465c91070b4b3b4d68541960" + } + }, + "f74f956ea3d122e47f4aa0066b5e3605c80d0282" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x479544e8b67a7e82120d3c5d7869b4c55f4a0de4" + } + }, + "f783f583fc06d2c88e9e0d263a6ab66f8b8a0514" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xab118214a2227c79eab2680df0a96d0ad67dafd4" + } + }, + "f78b2d97c8af245b705c0a19601b95f983e9aaf6" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xccce4f34ac3a550c95747823a00fecce349734f8" + } + }, + "f78ff2d350615b858077a50ff85b3a9e2edcc995" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8f75ec2d8d77fd6a26f4c01f7b0384bd60418875" + } + }, + "f85aaa082ae886506141245ea3b43ee74babca65" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb39c43369a4ec5e4b2dfa8b3dbb3a12bad630b31" + } + }, + "f86c50909ddce25f4d4e71e16d78b2f6a244e8cb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x90344e80aead27d6b007ee73dd8fd8169f870f52" + } + }, + "f8e4de2f36fa5e9861fe3af86d05db4cae1bb1a4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4d7a1e5009218cf5176a313f6922c3ab01d4970e" + } + }, + "f8fc32491119dea2b7fda5080ef9cf0027590265" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe59b406835db0d4c63ae28072c64c664da637558" + } + }, + "f904cb6a599db50cc635bb70f3c23f056e39914e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa9ed1d8a969237243d26f8728287cb3eb8730663" + } + }, + "f94e8e9f1511f8cede3bfd8e1be0db35085e8e6d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x91aaa30b2bf342c6bb6a315251ffe5b7e123bfa4" + } + }, + "f9c7db4a48b918ad6e44d2b55e2339fdcde01d26" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x714213a080e1d2988acadbfc5e441df5173f81bb" + } + }, + "f9d417c0b18ff731a88a17f3b31d9d6ed1e288f1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x065c627bc67fca3636da49c34994b6efb2adaad1" + } + }, + "fa849bc1ece08222f4bf249ca06a6468b3de5b1a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb4c315d98fa6cbed10c6331e2a5e4688ed0b7f7e" + } + }, + "fa9c2ac45638e511b06ebe051411ebdc2c4c228a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x187dea0407359c9579adbdf1ba9fad4a92fb358c" + } + }, + "fabaccc45975d14c53b830fd4fa0576da541d22e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xae5837876e23fcefa0f204d7b6433966ebb854b4" + } + }, + "fac000880bdfdbd780ffa7c4a1d5d8b4a1d87b03" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7ab73fe69000d4087d0b9ceedfda0af8c4fe2d2b" + } + }, + "fafa31e9b477adf7a26b651aa9913f8664e536a4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2652f49b5ad98503231b3befe7587c231be8a5e9" + } + }, + "fb04fd4e715c760c91ddc0f30b000b52203f66a4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8692f270fea1b23b492dea1755f48cdd1dd78535" + } + }, + "fb5d7c75f272b07450867579978314661c3e1206" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd2e450aa145ce97dc054b1bcf391407fbf202bd6" + } + }, + "fbdc8132551b0ed5c50b6c0f279097592b5c87ef" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x95f36953203283bc9358f396b627dc79480a8ec9" + } + }, + "fc55e6958f11444ae56c09af726f2ec57525db58" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x692a1a4da0b418dd701f5133e2b3c5686015a3e0" + } + }, + "fc70ade160bd76694149f3f439f5d4f78bdc483e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x50dc3dab5836e25872ec87bb2bb30ab57a35fb0d" + } + }, + "fc86915f4e8884b49adeb6f23a8f69e643d9db7b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x93beac08e1b6f1ac32c5ee628bc4356feb5e54eb" + } + }, + "fcdb751de1dc7c5246ce698b4b104016d034cfdb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x769277251b9d3f0906a338f156238b159bc126de" + } + }, + "fcf47e5c1414303d55afc40c75c41cf42079d560" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2099c5bdda1d98ce3b99988d768fa9f812a21f25" + } + }, + "fd096ec4540dacfebbabf2dd6ffd3493a09cc38f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd577d44f2748e151afdb1ded254c942ca9933b0c" + } + }, + "fd09bf9b58980d6a5776bb391d8c6881bcca2ae9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x67df3bc5f86456f2bc57f75c99a0389bca7e5851" + } + }, + "fd0dea1a583400fc29051c8192b70022d8d92c48" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe64dff0ba3f0eb9e054a638d4d5f6f0cb47e1e99" + } + }, + "fd437bf9d51bac3a2757bf4b8bf38045e78d5ada" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8fb5af158980be77e5d137ab6f9500040704109a" + } + }, + "fd5b134edd8931ca2102693d88070dd49fc13350" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xddb6aeb5e1bb4cdb44ca3a9b979996c529d9fa3d" + } + }, + "fd91b246a065cde3fc10edd6457b9e6c10fb386f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb15c7770a476be2c77c3bd50d60ea6b2cde3186e" + } + }, + "fdc6c80a86ea555b5de26c3db49a779eea6beb0c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf3c5a341248911dda9d694ee74bf997365941dc0" + } + }, + "fe4f48d16a7ec27241b987f3545423291c7cce77" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc1ff6275aeeeacd2c79dc02f8cd5cdb44a81e6bf" + } + }, + "fe686acb3b7cc09ec6379af828b4b3b638898130" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x31a87a9e67b2728c14767de26753f205b793c5ad" + } + }, + "fe8d768de7a723c23583162dbef207b6dcb4fb58" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4582048e819b7d55b3c6f47e46ef8dd8fdd12039" + } + }, + "fed73d1755549bd523a775e81cf80a1a507eec50" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xda7555a43e7a3790290cd20a19ec19032e28a6de" + } + }, + "ffb9bfb24fb671413a3aae05e0f21b870eeb2ab9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3432c3f9f90cb61e79f39d310bdc6cb8dcb3a49b" + } + }, + "ffc4569dfb86db2e584a1138a75747dffb794466" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3d64e9c7cee7c3d41cfbeed851fff8642bd0200c" + } + }, + "fff1cd2c481ce0fba0c97ef77c79227d3b67832a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb96982fae6a70aff19c2d99c3b2adc57b151d785" + } + } + }, + "postStateRoot" : "5c22bc6ec2ea240c8170de424002a2b5c93bfd2b3ac1c2cf8cb92cb5f549b17d", + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "0x01312d00", + "code" : "0x602060006000396001602060006000f001600055", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x3b9aca00", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "0x0186a0" + } } } \ No newline at end of file diff --git a/tests/files/StateTests/stSolidityTest.json b/tests/files/StateTests/stSolidityTest.json index 8a2cb1bd55..c64073b5f4 100644 --- a/tests/files/StateTests/stSolidityTest.json +++ b/tests/files/StateTests/stSolidityTest.json @@ -268,42 +268,50 @@ }, "logs" : [ ], - "out" : "0x0000000000000000000000000000000000000000000000000000000000000000", + "out" : "0x0000000000000000000000000000000000000000000000000000000000000001", "post" : { - "0000000000000000000000000000000000000000" : { - "balance" : "0x00", - "code" : "0x", - "nonce" : "0x00", - "storage" : { - } - }, "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { "balance" : "0x0186a0", - "code" : "0x6000357c0100000000000000000000000000000000000000000000000000000000900480633e0bca3b1461003a578063c04062261461004c57005b610042610099565b8060005260206000f35b61005461005e565b8060005260206000f35b6000610068610099565b600060006101000a81548160ff02191690830217905550600060009054906101000a900460ff169050610096565b90565b60006000600060019250825060018273ffffffffffffffffffffffffffffffffffffffff166381bda09b60206000827c010000000000000000000000000000000000000000000000000000000002600052600460006000866161da5a03f16100fd57005b505060005163ffffffff1614156101135761011c565b60009250610194565b60028173ffffffffffffffffffffffffffffffffffffffff166381bda09b60206000827c010000000000000000000000000000000000000000000000000000000002600052600460006000866161da5a03f161017457005b505060005163ffffffff16141561018a57610193565b60009250610194565b5b50509056", - "nonce" : "0x00", + "code" : "0x7c010000000000000000000000000000000000000000000000000000000060003504633e0bca3b8114610039578063c0406226146100a857005b6100b55b600160008060456101ec8339604560006000f091508173ffffffffffffffffffffffffffffffffffffffff166381bda09b60206000827c010000000000000000000000000000000000000000000000000000000002600052600460006000866161da5a03f161011957005b6100bf60006100c961003d565b8060005260206000f35b8060005260206000f35b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016919091179081905560ff16919050565b505060005163ffffffff166002141561019d575b5b505090565b505060005163ffffffff1660011415610194575b60456101a7600039604560006000f090508073ffffffffffffffffffffffffffffffffffffffff166381bda09b60206000827c010000000000000000000000000000000000000000000000000000000002600052600460006000866161da5a03f16100ff57005b60009250610114565b600092506101145600603980600c6000396000f3007c0100000000000000000000000000000000000000000000000000000000600035046381bda09b8114602d57005b60026000818152602090f3603980600c6000396000f3007c0100000000000000000000000000000000000000000000000000000000600035046381bda09b8114602d57005b60016000818152602090f3", + "nonce" : "0x02", "storage" : { + "0x00" : "0x01" } }, "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { - "balance" : "0xca69", + "balance" : "0x01f758", "code" : "0x", "nonce" : "0x00", "storage" : { } }, "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { - "balance" : "0x02fa2617", + "balance" : "0x02f8f928", "code" : "0x", "nonce" : "0x01", "storage" : { } + }, + "b88de88b35ecbf3c141e3caae2baf35834d18f63" : { + "balance" : "0x00", + "code" : "0x7c0100000000000000000000000000000000000000000000000000000000600035046381bda09b8114602d57005b60026000818152602090f3", + "nonce" : "0x00", + "storage" : { + } + }, + "d2571607e241ecf590ed94b12d87c94babe36db6" : { + "balance" : "0x00", + "code" : "0x7c0100000000000000000000000000000000000000000000000000000000600035046381bda09b8114602d57005b60016000818152602090f3", + "nonce" : "0x00", + "storage" : { + } } }, - "postStateRoot" : "ed06b00015d227623175bd12a5d960281781493ea1d9fed79d6c40a20e2c6ef7", + "postStateRoot" : "e7f84d674881d1cfd115be59e3e390271435c0b3474a482f7add54c3fe429d85", "pre" : { "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { "balance" : "0x0186a0", - "code" : "0x6000357c0100000000000000000000000000000000000000000000000000000000900480633e0bca3b1461003a578063c04062261461004c57005b610042610099565b8060005260206000f35b61005461005e565b8060005260206000f35b6000610068610099565b600060006101000a81548160ff02191690830217905550600060009054906101000a900460ff169050610096565b90565b60006000600060019250825060018273ffffffffffffffffffffffffffffffffffffffff166381bda09b60206000827c010000000000000000000000000000000000000000000000000000000002600052600460006000866161da5a03f16100fd57005b505060005163ffffffff1614156101135761011c565b60009250610194565b60028173ffffffffffffffffffffffffffffffffffffffff166381bda09b60206000827c010000000000000000000000000000000000000000000000000000000002600052600460006000866161da5a03f161017457005b505060005163ffffffff16141561018a57610193565b60009250610194565b5b50509056", + "code" : "0x7c010000000000000000000000000000000000000000000000000000000060003504633e0bca3b8114610039578063c0406226146100a857005b6100b55b600160008060456101ec8339604560006000f091508173ffffffffffffffffffffffffffffffffffffffff166381bda09b60206000827c010000000000000000000000000000000000000000000000000000000002600052600460006000866161da5a03f161011957005b6100bf60006100c961003d565b8060005260206000f35b8060005260206000f35b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016919091179081905560ff16919050565b505060005163ffffffff166002141561019d575b5b505090565b505060005163ffffffff1660011415610194575b60456101a7600039604560006000f090508073ffffffffffffffffffffffffffffffffffffffff166381bda09b60206000827c010000000000000000000000000000000000000000000000000000000002600052600460006000866161da5a03f16100ff57005b60009250610114565b600092506101145600603980600c6000396000f3007c0100000000000000000000000000000000000000000000000000000000600035046381bda09b8114602d57005b60026000818152602090f3603980600c6000396000f3007c0100000000000000000000000000000000000000000000000000000000600035046381bda09b8114602d57005b60016000818152602090f3", "nonce" : "0x00", "storage" : { } diff --git a/tests/files/VMTests/vmArithmeticTest.json b/tests/files/VMTests/vmArithmeticTest.json index 7c82c9d4d4..88d3c1e5b2 100644 --- a/tests/files/VMTests/vmArithmeticTest.json +++ b/tests/files/VMTests/vmArithmeticTest.json @@ -356,6 +356,8 @@ } }, "addmod1_overflow3" : { + "callcreates" : [ + ], "env" : { "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", "currentDifficulty" : "0x0100", @@ -369,11 +371,25 @@ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "code" : "0x60056001600160000308600055", "data" : "0x", - "gas" : "0x2710", + "gas" : "0x0f4240", "gasPrice" : "0x5af3107a4000", "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "0x0de0b6b3a7640000" }, + "gas" : "0x0ef406", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60056001600160000308600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + } + }, "pre" : { "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { "balance" : "0x0de0b6b3a7640000", @@ -385,6 +401,8 @@ } }, "addmod1_overflow4" : { + "callcreates" : [ + ], "env" : { "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", "currentDifficulty" : "0x0100", @@ -398,11 +416,25 @@ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "code" : "0x60056002600160000308600055", "data" : "0x", - "gas" : "0x2710", + "gas" : "0x0f4240", "gasPrice" : "0x5af3107a4000", "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "0x0de0b6b3a7640000" }, + "gas" : "0x0ef406", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60056002600160000308600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x02" + } + } + }, "pre" : { "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { "balance" : "0x0de0b6b3a7640000", @@ -414,6 +446,8 @@ } }, "addmod1_overflowDiff" : { + "callcreates" : [ + ], "env" : { "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", "currentDifficulty" : "0x0100", @@ -427,11 +461,25 @@ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "code" : "0x60056002600003600160000308600055", "data" : "0x", - "gas" : "0x2710", + "gas" : "0x0f4240", "gasPrice" : "0x5af3107a4000", "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "0x0de0b6b3a7640000" }, + "gas" : "0x0ef400", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60056002600003600160000308600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x04" + } + } + }, "pre" : { "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { "balance" : "0x0de0b6b3a7640000", @@ -842,6 +890,51 @@ } } }, + "addmodDivByZero3" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x0f4240", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x60016000600060000803600055", + "data" : "0x", + "gas" : "0x0186a0", + "gasPrice" : "0x5af3107a4000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "0x0de0b6b3a7640000" + }, + "gas" : "0x013866", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60016000600060000803600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60016000600060000803600055", + "nonce" : "0x00", + "storage" : { + } + } + } + }, "arith1" : { "callcreates" : [ ], @@ -1152,6 +1245,51 @@ } } }, + "divByZero_2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x0f4240", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x60076000600d0401600055", + "data" : "0x", + "gas" : "0x0186a0", + "gasPrice" : "0x5af3107a4000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "0x0de0b6b3a7640000" + }, + "gas" : "0x01386c", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60076000600d0401600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x07" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60076000600d0401600055", + "nonce" : "0x00", + "storage" : { + } + } + } + }, "exp0" : { "callcreates" : [ ], @@ -5498,6 +5636,51 @@ } } }, + "modByZero" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x0f4240", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x6001600060030603600055", + "data" : "0x", + "gas" : "0x0186a0", + "gasPrice" : "0x5af3107a4000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "0x0de0b6b3a7640000" + }, + "gas" : "0x01386c", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x6001600060030603600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x6001600060030603600055", + "nonce" : "0x00", + "storage" : { + } + } + } + }, "mul0" : { "callcreates" : [ ], @@ -6017,6 +6200,8 @@ } }, "mulmod1_overflow2" : { + "callcreates" : [ + ], "env" : { "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", "currentDifficulty" : "0x0100", @@ -6030,11 +6215,25 @@ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "code" : "0x600560027f800000000000000000000000000000000000000000000000000000000000000009600055", "data" : "0x", - "gas" : "0x2710", + "gas" : "0x0f4240", "gasPrice" : "0x5af3107a4000", "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "0x0de0b6b3a7640000" }, + "gas" : "0x0ef40c", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x600560027f800000000000000000000000000000000000000000000000000000000000000009600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + } + }, "pre" : { "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { "balance" : "0x0de0b6b3a7640000", @@ -6046,6 +6245,8 @@ } }, "mulmod1_overflow3" : { + "callcreates" : [ + ], "env" : { "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", "currentDifficulty" : "0x0100", @@ -6059,11 +6260,25 @@ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "code" : "0x600560027f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff09600055", "data" : "0x", - "gas" : "0x2710", + "gas" : "0x0f4240", "gasPrice" : "0x5af3107a4000", "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "0x0de0b6b3a7640000" }, + "gas" : "0x0ef40c", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x600560027f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff09600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x04" + } + } + }, "pre" : { "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { "balance" : "0x0de0b6b3a7640000", @@ -6075,6 +6290,8 @@ } }, "mulmod1_overflow4" : { + "callcreates" : [ + ], "env" : { "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", "currentDifficulty" : "0x0100", @@ -6088,11 +6305,25 @@ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "code" : "0x600560027f800000000000000000000000000000000000000000000000000000000000000109600055", "data" : "0x", - "gas" : "0x2710", + "gas" : "0x0f4240", "gasPrice" : "0x5af3107a4000", "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "0x0de0b6b3a7640000" }, + "gas" : "0x0ef40c", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x600560027f800000000000000000000000000000000000000000000000000000000000000109600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x03" + } + } + }, "pre" : { "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { "balance" : "0x0de0b6b3a7640000", @@ -6502,6 +6733,51 @@ } } }, + "mulmoddivByZero3" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x0f4240", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x60006000600009600103600055", + "data" : "0x", + "gas" : "0x0186a0", + "gasPrice" : "0x5af3107a4000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "0x0de0b6b3a7640000" + }, + "gas" : "0x013866", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60006000600009600103600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60006000600009600103600055", + "nonce" : "0x00", + "storage" : { + } + } + } + }, "not1" : { "callcreates" : [ ], @@ -7081,6 +7357,51 @@ } } }, + "sdivByZero2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x0f4240", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x600160007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf923bdff6000030501600055", + "data" : "0x", + "gas" : "0x0186a0", + "gasPrice" : "0x5af3107a4000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "0x0de0b6b3a7640000" + }, + "gas" : "0x013866", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x600160007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf923bdff6000030501600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x600160007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf923bdff6000030501600055", + "nonce" : "0x00", + "storage" : { + } + } + } + }, "sdiv_dejavu" : { "callcreates" : [ ], @@ -8109,6 +8430,8 @@ } }, "smod6" : { + "callcreates" : [ + ], "env" : { "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", "currentDifficulty" : "0x0100", @@ -8122,11 +8445,25 @@ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "code" : "0x7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60000307600055", "data" : "0x", - "gas" : "0x2710", + "gas" : "0x0186a0", "gasPrice" : "0x5af3107a4000", "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "0x0de0b6b3a7640000" }, + "gas" : "0x01386c", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60000307600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + } + }, "pre" : { "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { "balance" : "0x0de0b6b3a7640000", @@ -8181,6 +8518,140 @@ } } }, + "smod8_byZero" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x0f4240", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x600d600060c86000030703600055", + "data" : "0x", + "gas" : "0x0186a0", + "gasPrice" : "0x5af3107a4000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "0x0de0b6b3a7640000" + }, + "gas" : "0x013866", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x600d600060c86000030703600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x600d600060c86000030703600055", + "nonce" : "0x00", + "storage" : { + } + } + } + }, + "smod_i256min1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x0f4240", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x60016000037f800000000000000000000000000000000000000000000000000000000000000060000307600055", + "data" : "0x", + "gas" : "0x0186a0", + "gasPrice" : "0x5af3107a4000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "0x0de0b6b3a7640000" + }, + "gas" : "0x0172fe", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60016000037f800000000000000000000000000000000000000000000000000000000000000060000307600055", + "nonce" : "0x00", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60016000037f800000000000000000000000000000000000000000000000000000000000000060000307600055", + "nonce" : "0x00", + "storage" : { + } + } + } + }, + "smod_i256min2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x0f4240", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x600160016000037f80000000000000000000000000000000000000000000000000000000000000006000030703600055", + "data" : "0x", + "gas" : "0x0186a0", + "gasPrice" : "0x5af3107a4000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "0x0de0b6b3a7640000" + }, + "gas" : "0x013860", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x600160016000037f80000000000000000000000000000000000000000000000000000000000000006000030703600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x600160016000037f80000000000000000000000000000000000000000000000000000000000000006000030703600055", + "nonce" : "0x00", + "storage" : { + } + } + } + }, "stop" : { "callcreates" : [ ], diff --git a/tests/vm/gh_test.go b/tests/vm/gh_test.go index 838050fa1e..2f76084d0f 100644 --- a/tests/vm/gh_test.go +++ b/tests/vm/gh_test.go @@ -2,8 +2,8 @@ package vm import ( "bytes" - "io/ioutil" "math/big" + "os" "path/filepath" "strconv" "testing" @@ -87,7 +87,7 @@ func RunVmTest(p string, t *testing.T) { vm.Debug = true glog.SetV(4) glog.SetToStderr(true) - if name != "stackLimitPush32_1024" { + if name != "Call50000_sha256" { continue } */ @@ -128,9 +128,15 @@ func RunVmTest(p string, t *testing.T) { ret, logs, gas, err = helper.RunState(statedb, env, test.Transaction) } - 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) + switch name { + // the memory required for these tests (4294967297 bytes) would take too much time. + // on 19 May 2015 decided to skip these tests their output. + case "mload32bitBound_return", "mload32bitBound_return2": + default: + 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 isVmTest { @@ -246,8 +252,7 @@ func TestLogTest(t *testing.T) { } func TestPerformance(t *testing.T) { - t.Skip() - const fn = "../files/VMTests/vmPerformance.json" + const fn = "../files/VMTests/vmPerformanceTest.json" RunVmTest(fn, t) } @@ -281,13 +286,13 @@ func TestInputLimitsLight(t *testing.T) { RunVmTest(fn, t) } -func TestStateExample(t *testing.T) { - const fn = "../files/StateTests/stExample.json" +func TestStateSystemOperations(t *testing.T) { + const fn = "../files/StateTests/stSystemOperationsTest.json" RunVmTest(fn, t) } -func TestStateSystemOperations(t *testing.T) { - const fn = "../files/StateTests/stSystemOperationsTest.json" +func TestStateExample(t *testing.T) { + const fn = "../files/StateTests/stExample.json" RunVmTest(fn, t) } @@ -342,13 +347,17 @@ func TestMemory(t *testing.T) { } func TestMemoryStress(t *testing.T) { - t.Skip("Skipped due to...consuming too much memory :D") + if os.Getenv("TEST_VM_COMPLEX") == "" { + t.Skip() + } const fn = "../files/StateTests/stMemoryStressTest.json" RunVmTest(fn, t) } func TestQuadraticComplexity(t *testing.T) { - t.Skip() // takes too long + if os.Getenv("TEST_VM_COMPLEX") == "" { + t.Skip() + } const fn = "../files/StateTests/stQuadraticComplexityTest.json" RunVmTest(fn, t) } @@ -363,21 +372,16 @@ func TestWallet(t *testing.T) { RunVmTest(fn, t) } -func TestRandom(t *testing.T) { - // TODO: fix JSON EOF bug and unskip - t.Skip() - fileNames := make([]string, 1024) - fileInfos, err := ioutil.ReadDir("../files/StateTests/RandomTests") - if err != nil { - t.Errorf("Could not read StateTests/RandomTests dir: %v", err) - return +func TestStateTestsRandom(t *testing.T) { + fns, _ := filepath.Glob("../files/StateTests/RandomTests/*") + for _, fn := range fns { + RunVmTest(fn, t) + } +} + +func TestVMRandom(t *testing.T) { + fns, _ := filepath.Glob("../files/VMTests/RandomTests/*") + for _, fn := range fns { + RunVmTest(fn, t) } - for _, fileInfo := range fileInfos { - fileNames = append(fileNames, fileInfo.Name()) - } - - //for _, f := range fileNames { - path := filepath.Join("../files/StateTests/RandomTests/", fileNames[0]) - RunVmTest(path, t) - //} } diff --git a/xeth/xeth.go b/xeth/xeth.go index 88cd30afce..157fe76c74 100644 --- a/xeth/xeth.go +++ b/xeth/xeth.go @@ -28,6 +28,7 @@ var ( filterTickerTime = 5 * time.Minute defaultGasPrice = big.NewInt(10000000000000) //150000000000 defaultGas = big.NewInt(90000) //500000 + dappStorePre = []byte("dapp-") ) // byte will be inferred @@ -66,12 +67,16 @@ type XEth struct { // regmut sync.Mutex // register map[string][]*interface{} // TODO improve return type - solcPath string - solc *compiler.Solidity - agent *miner.RemoteAgent } +func NewTest(eth *eth.Ethereum, frontend Frontend) *XEth { + return &XEth{ + backend: eth, + frontend: frontend, + } +} + // New creates an XEth that uses the given frontend. // If a nil Frontend is provided, a default frontend which // confirms all transactions will be used. @@ -304,6 +309,8 @@ func (self *XEth) EthBlockByHash(strHash string) *types.Block { } func (self *XEth) EthTransactionByHash(hash string) (tx *types.Transaction, blhash common.Hash, blnum *big.Int, txi uint64) { + // Due to increasing return params and need to determine if this is from transaction pool or + // some chain, this probably needs to be refactored for more expressiveness data, _ := self.backend.ExtraDb().Get(common.FromHex(hash)) if len(data) != 0 { tx = types.NewTransactionFromBytes(data) @@ -348,6 +355,24 @@ func (self *XEth) CurrentBlock() *types.Block { return self.backend.ChainManager().CurrentBlock() } +func (self *XEth) GetBlockReceipts(bhash common.Hash) (receipts types.Receipts, err error) { + return self.backend.BlockProcessor().GetBlockReceipts(bhash) +} + +func (self *XEth) GetTxReceipt(txhash common.Hash) (receipt *types.Receipt, err error) { + _, bhash, _, txi := self.EthTransactionByHash(common.ToHex(txhash[:])) + var receipts types.Receipts + receipts, err = self.backend.BlockProcessor().GetBlockReceipts(bhash) + if err == nil { + if txi < uint64(len(receipts)) { + receipt = receipts[txi] + } else { + err = fmt.Errorf("Invalid tx index") + } + } + return +} + func (self *XEth) GasLimit() *big.Int { return self.backend.ChainManager().GasLimit() } @@ -357,7 +382,7 @@ func (self *XEth) Block(v interface{}) *Block { return self.BlockByNumber(int64(n)) } else if str, ok := v.(string); ok { return self.BlockByHash(str) - } else if f, ok := v.(float64); ok { // Don't ask ... + } else if f, ok := v.(float64); ok { // JSON numbers are represented as float64 return self.BlockByNumber(int64(f)) } @@ -377,27 +402,24 @@ func (self *XEth) Accounts() []string { // accessor for solidity compiler. // memoized if available, retried on-demand if not func (self *XEth) Solc() (*compiler.Solidity, error) { - var err error - if self.solc == nil { - self.solc, err = compiler.New(self.solcPath) - } - return self.solc, err + return self.backend.Solc() } // set in js console via admin interface or wrapper from cli flags func (self *XEth) SetSolc(solcPath string) (*compiler.Solidity, error) { - self.solcPath = solcPath - self.solc = nil + self.backend.SetSolc(solcPath) return self.Solc() } +// store DApp value in extra database func (self *XEth) DbPut(key, val []byte) bool { - self.backend.ExtraDb().Put(key, val) + self.backend.ExtraDb().Put(append(dappStorePre, key...), val) return true } +// retrieve DApp value from extra database func (self *XEth) DbGet(key []byte) ([]byte, error) { - val, err := self.backend.ExtraDb().Get(key) + val, err := self.backend.ExtraDb().Get(append(dappStorePre, key...)) return val, err } @@ -778,7 +800,7 @@ func (self *XEth) PushTx(encodedTx string) (string, error) { } func (self *XEth) Call(fromStr, toStr, valueStr, gasStr, gasPriceStr, dataStr string) (string, string, error) { - statedb := self.State().State().Copy() //self.eth.ChainManager().TransState() + statedb := self.State().State().Copy() var from *state.StateObject if len(fromStr) == 0 { accounts, err := self.backend.AccountManager().Accounts() @@ -862,13 +884,14 @@ func (self *XEth) Transact(fromStr, toStr, nonceStr, valueStr, gasStr, gasPriceS var ( from = common.HexToAddress(fromStr) to = common.HexToAddress(toStr) - value = common.NewValue(valueStr) + value = common.Big(valueStr) gas = common.Big(gasStr) price = common.Big(gasPriceStr) data []byte contractCreation bool ) + // 2015-05-18 Is this still needed? // TODO if no_private_key then //if _, exists := p.register[args.From]; exists { // p.register[args.From] = append(p.register[args.From], args) @@ -908,9 +931,9 @@ func (self *XEth) Transact(fromStr, toStr, nonceStr, valueStr, gasStr, gasPriceS var tx *types.Transaction if contractCreation { - tx = types.NewContractCreationTx(value.BigInt(), gas, price, data) + tx = types.NewContractCreationTx(value, gas, price, data) } else { - tx = types.NewTransactionMessage(to, value.BigInt(), gas, price, data) + tx = types.NewTransactionMessage(to, value, gas, price, data) } state := self.backend.ChainManager().TxState() @@ -924,9 +947,11 @@ func (self *XEth) Transact(fromStr, toStr, nonceStr, valueStr, gasStr, gasPriceS tx.SetNonce(nonce) if err := self.sign(tx, from, false); err != nil { + state.RemoveNonce(from, tx.Nonce()) return "", err } if err := self.backend.TxPool().Add(tx); err != nil { + state.RemoveNonce(from, tx.Nonce()) return "", err }