diff --git a/celo_migration_test_datadir/celo/LOCK b/celo_migration_test_datadir/celo/LOCK new file mode 100644 index 0000000000..e69de29bb2 diff --git a/celo_migration_test_datadir/celo/chaindata/000001.log b/celo_migration_test_datadir/celo/chaindata/000001.log new file mode 100644 index 0000000000..8fb5d5443e Binary files /dev/null and b/celo_migration_test_datadir/celo/chaindata/000001.log differ diff --git a/celo_migration_test_datadir/celo/chaindata/CURRENT b/celo_migration_test_datadir/celo/chaindata/CURRENT new file mode 100644 index 0000000000..feda7d6b24 --- /dev/null +++ b/celo_migration_test_datadir/celo/chaindata/CURRENT @@ -0,0 +1 @@ +MANIFEST-000000 diff --git a/celo_migration_test_datadir/celo/chaindata/LOCK b/celo_migration_test_datadir/celo/chaindata/LOCK new file mode 100644 index 0000000000..e69de29bb2 diff --git a/celo_migration_test_datadir/celo/chaindata/LOG b/celo_migration_test_datadir/celo/chaindata/LOG new file mode 100644 index 0000000000..05510c20ab --- /dev/null +++ b/celo_migration_test_datadir/celo/chaindata/LOG @@ -0,0 +1,6 @@ +=============== Feb 21, 2024 (EST) =============== +00:35:42.679318 log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed +00:35:42.698146 db@open opening +00:35:42.699133 version@stat F·[] S·0B[] Sc·[] +00:35:42.702693 db@janitor F·2 G·0 +00:35:42.702728 db@open done T·4.557125ms diff --git a/celo_migration_test_datadir/celo/chaindata/MANIFEST-000000 b/celo_migration_test_datadir/celo/chaindata/MANIFEST-000000 new file mode 100644 index 0000000000..9d54f6733b Binary files /dev/null and b/celo_migration_test_datadir/celo/chaindata/MANIFEST-000000 differ diff --git a/celo_migration_test_datadir/celo/chaindata/ancient/FLOCK b/celo_migration_test_datadir/celo/chaindata/ancient/FLOCK new file mode 100644 index 0000000000..e69de29bb2 diff --git a/celo_migration_test_datadir/celo/chaindata/ancient/bodies.0000.cdat b/celo_migration_test_datadir/celo/chaindata/ancient/bodies.0000.cdat new file mode 100644 index 0000000000..e69de29bb2 diff --git a/celo_migration_test_datadir/celo/chaindata/ancient/bodies.cidx b/celo_migration_test_datadir/celo/chaindata/ancient/bodies.cidx new file mode 100644 index 0000000000..ab2c684678 Binary files /dev/null and b/celo_migration_test_datadir/celo/chaindata/ancient/bodies.cidx differ diff --git a/celo_migration_test_datadir/celo/chaindata/ancient/diffs.0000.rdat b/celo_migration_test_datadir/celo/chaindata/ancient/diffs.0000.rdat new file mode 100644 index 0000000000..e69de29bb2 diff --git a/celo_migration_test_datadir/celo/chaindata/ancient/diffs.ridx b/celo_migration_test_datadir/celo/chaindata/ancient/diffs.ridx new file mode 100644 index 0000000000..ab2c684678 Binary files /dev/null and b/celo_migration_test_datadir/celo/chaindata/ancient/diffs.ridx differ diff --git a/celo_migration_test_datadir/celo/chaindata/ancient/hashes.0000.rdat b/celo_migration_test_datadir/celo/chaindata/ancient/hashes.0000.rdat new file mode 100644 index 0000000000..e69de29bb2 diff --git a/celo_migration_test_datadir/celo/chaindata/ancient/hashes.ridx b/celo_migration_test_datadir/celo/chaindata/ancient/hashes.ridx new file mode 100644 index 0000000000..ab2c684678 Binary files /dev/null and b/celo_migration_test_datadir/celo/chaindata/ancient/hashes.ridx differ diff --git a/celo_migration_test_datadir/celo/chaindata/ancient/headers.0000.cdat b/celo_migration_test_datadir/celo/chaindata/ancient/headers.0000.cdat new file mode 100644 index 0000000000..e69de29bb2 diff --git a/celo_migration_test_datadir/celo/chaindata/ancient/headers.cidx b/celo_migration_test_datadir/celo/chaindata/ancient/headers.cidx new file mode 100644 index 0000000000..ab2c684678 Binary files /dev/null and b/celo_migration_test_datadir/celo/chaindata/ancient/headers.cidx differ diff --git a/celo_migration_test_datadir/celo/chaindata/ancient/receipts.0000.cdat b/celo_migration_test_datadir/celo/chaindata/ancient/receipts.0000.cdat new file mode 100644 index 0000000000..e69de29bb2 diff --git a/celo_migration_test_datadir/celo/chaindata/ancient/receipts.cidx b/celo_migration_test_datadir/celo/chaindata/ancient/receipts.cidx new file mode 100644 index 0000000000..ab2c684678 Binary files /dev/null and b/celo_migration_test_datadir/celo/chaindata/ancient/receipts.cidx differ diff --git a/celo_migration_test_datadir/celo/nodes/000001.log b/celo_migration_test_datadir/celo/nodes/000001.log new file mode 100644 index 0000000000..f65f9f0917 Binary files /dev/null and b/celo_migration_test_datadir/celo/nodes/000001.log differ diff --git a/celo_migration_test_datadir/celo/nodes/CURRENT b/celo_migration_test_datadir/celo/nodes/CURRENT new file mode 100644 index 0000000000..feda7d6b24 --- /dev/null +++ b/celo_migration_test_datadir/celo/nodes/CURRENT @@ -0,0 +1 @@ +MANIFEST-000000 diff --git a/celo_migration_test_datadir/celo/nodes/LOCK b/celo_migration_test_datadir/celo/nodes/LOCK new file mode 100644 index 0000000000..e69de29bb2 diff --git a/celo_migration_test_datadir/celo/nodes/LOG b/celo_migration_test_datadir/celo/nodes/LOG new file mode 100644 index 0000000000..d1a8942f4e --- /dev/null +++ b/celo_migration_test_datadir/celo/nodes/LOG @@ -0,0 +1,6 @@ +=============== Feb 21, 2024 (EST) =============== +00:35:42.742714 log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed +00:35:42.756416 db@open opening +00:35:42.756815 version@stat F·[] S·0B[] Sc·[] +00:35:42.763625 db@janitor F·2 G·0 +00:35:42.763648 db@open done T·7.208291ms diff --git a/celo_migration_test_datadir/celo/nodes/MANIFEST-000000 b/celo_migration_test_datadir/celo/nodes/MANIFEST-000000 new file mode 100644 index 0000000000..9d54f6733b Binary files /dev/null and b/celo_migration_test_datadir/celo/nodes/MANIFEST-000000 differ diff --git a/celo_migration_test_datadir/celo/transactions.rlp b/celo_migration_test_datadir/celo/transactions.rlp new file mode 100644 index 0000000000..a0c8e9a6d2 Binary files /dev/null and b/celo_migration_test_datadir/celo/transactions.rlp differ diff --git a/celo_migration_test_datadir/keystore/UTC--2024-02-21T05-35-42.765873000Z--dc1c520f9be93efadb20d7f6568238f90d41ce9f b/celo_migration_test_datadir/keystore/UTC--2024-02-21T05-35-42.765873000Z--dc1c520f9be93efadb20d7f6568238f90d41ce9f new file mode 100644 index 0000000000..9bade06d3b --- /dev/null +++ b/celo_migration_test_datadir/keystore/UTC--2024-02-21T05-35-42.765873000Z--dc1c520f9be93efadb20d7f6568238f90d41ce9f @@ -0,0 +1 @@ +{"address":"dc1c520f9be93efadb20d7f6568238f90d41ce9f","privatekey":"77b44b86363a599a06216b7c777b51e9becf1c9737d15c5b8e2c042351919724","id":"3603a13c-8ca7-4e9e-9a79-68333b6482e3","version":3} \ No newline at end of file diff --git a/e2e_test/e2e_test.go b/e2e_test/e2e_test.go index 4f8683ef9f..be5bf42cee 100644 --- a/e2e_test/e2e_test.go +++ b/e2e_test/e2e_test.go @@ -12,6 +12,7 @@ import ( "testing" "time" + "github.com/celo-org/celo-blockchain" "github.com/celo-org/celo-blockchain/common" "github.com/celo-org/celo-blockchain/common/hexutil" "github.com/celo-org/celo-blockchain/core/types" @@ -40,6 +41,102 @@ func init() { log.Root().SetHandler(log.DiscardHandler()) } +func TestSubscribeMergedLogs(t *testing.T) { + ac := test.AccountConfig(1, 2) + gingerbreadBlock := common.Big1 + gc, ec, err := test.BuildConfig(ac, gingerbreadBlock) + require.NoError(t, err) + network, shutdown, err := test.NewNetwork(ac, gc, ec) + require.NoError(t, err) + defer shutdown() + ctx, cancel := context.WithTimeout(context.Background(), time.Second*300) + defer cancel() + + accounts := test.Accounts(ac.DeveloperAccounts(), gc.ChainConfig()) + + // Send one celo from external account 0 to 1 via node 0. + tx, err := accounts[0].SendCeloViaGoldToken(ctx, accounts[1].Address, 1, network[0]) + require.NoError(t, err) + + ch := make(chan types.Log) + c, err := rpc.DialContext(ctx, network[0].WSEndpoint()) + require.NoError(t, err) + c.EthSubscribe(ctx, ch, "mergedLogs", map[string]interface{}{ + "fromBlock": hexutil.EncodeBig(big.NewInt(0)), + "toBlock": hexutil.EncodeBig(big.NewInt(1000)), + }) + + for len(ch) > 0 { + log := <-ch + fmt.Println(log) + } + + // Wait for the whole network to process the transaction. + err = network.AwaitTransactions(ctx, tx) + require.NoError(t, err) +} + +func TestSubscribeLogs(t *testing.T) { + ac := test.AccountConfig(3, 2) + gingerbreadBlock := common.Big1 + gc, ec, err := test.BuildConfig(ac, gingerbreadBlock) + require.NoError(t, err) + network, shutdown, err := test.NewNetwork(ac, gc, ec) + require.NoError(t, err) + defer shutdown() + ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) + defer cancel() + + accounts := test.Accounts(ac.DeveloperAccounts(), gc.ChainConfig()) + + // Send one celo from external account 0 to 1 via node 0. + tx, err := accounts[0].SendCelo(ctx, accounts[1].Address, 1, network[0]) + require.NoError(t, err) + + ch := make(chan types.Log) + network[0].WsClient.SubscribeFilterLogs(ctx, celo.FilterQuery{ + FromBlock: big.NewInt(0), + ToBlock: big.NewInt(1000), + }, ch) + for len(ch) > 0 { + <-ch + } + // Wait for the whole network to process the transaction. + err = network.AwaitTransactions(ctx, tx) + require.NoError(t, err) +} + +// TODO(Alec) +func TestMigrateDataDir(t *testing.T) { + ac := test.AccountConfig(1, 2) + gingerbreadBlock := big.NewInt(20) + gc, ec, err := test.BuildConfig(ac, gingerbreadBlock) + require.NoError(t, err) + // gc.Hardforks = genesis.HardforkConfig{ + // ChurritoBlock: big.NewInt(5), + // DonutBlock: big.NewInt(10), + // EspressoBlock: big.NewInt(15), + // GingerbreadBlock: gingerbreadBlock, + // GingerbreadP2Block: big.NewInt(25), + // } + network, _, err := test.NewNetwork(ac, gc, ec) + require.NoError(t, err) + // defer shutdown() + ctx, cancel := context.WithTimeout(context.Background(), time.Second*100) + defer cancel() + + accounts := test.Accounts(ac.DeveloperAccounts(), gc.ChainConfig()) + + // Send one celo from external account 0 to 1 via node 0. + tx, err := accounts[0].SendCelo(ctx, accounts[1].Address, 1, network[0]) + require.NoError(t, err) + + err = network.AwaitTransactions(ctx, tx) + require.NoError(t, err) + err = network.AwaitBlock(ctx, 30) + require.NoError(t, err) +} + // This test starts a network submits a transaction and waits for the whole // network to process the transaction. func TestSendCelo(t *testing.T) { diff --git a/eth/filters/api.go b/eth/filters/api.go index cd68c1b561..c19f516f47 100644 --- a/eth/filters/api.go +++ b/eth/filters/api.go @@ -249,6 +249,76 @@ func (api *PublicFilterAPI) NewHeads(ctx context.Context) (*rpc.Subscription, er return rpcSub, nil } +// TODO(Alec) +func (api *PublicFilterAPI) MergedLogs(ctx context.Context, crit FilterCriteria) (*rpc.Subscription, error) { + notifier, supported := rpc.NotifierFromContext(ctx) + if !supported { + return &rpc.Subscription{}, rpc.ErrNotificationsUnsupported + } + + var ( + rpcSub = notifier.CreateSubscription() + matchedLogs = make(chan []*types.Log) + ) + + migrationBlock := big.NewInt(500) // last block of cel1, migrationBlock + 1 is first block of cel2 + + // TODO(Alec) handle cases where FromBlock and ToBlock are negative or nil + // TODO(Alec) there seems to be a mismatch between the interpretation of nil From blocks in the + // FilterQuery type definition and how they're handled by SubscribeLogs. + // TODO(Alec) assuming FromBlock and ToBlock are inclusive + + queries := [2]ethereum.FilterQuery{ + ethereum.FilterQuery(crit), + } + if queries[0].FromBlock.Cmp(queries[0].ToBlock) > 0 { + return nil, fmt.Errorf("invalid from and to block combination: from > to") // Error copied from SubscribeLogs + } + if queries[0].FromBlock.Cmp(migrationBlock) <= 0 { + if queries[0].ToBlock.Cmp(migrationBlock) > 0 { + queries = [2]ethereum.FilterQuery{ + { + FromBlock: queries[0].FromBlock, + ToBlock: migrationBlock, + }, + { + FromBlock: migrationBlock.Add(migrationBlock, big.NewInt(1)), + ToBlock: queries[0].ToBlock, + }, + } + } + } + + go func() { + for _, query := range queries { + logsSub, err := api.events.SubscribeLogs(query, matchedLogs) + if err != nil { + log.Error("Error returned from SubscribeLogs", err) + // TODO(Alec) what else do we need to do here? + return + } + + for { + select { + case logs := <-matchedLogs: + for _, log := range logs { + notifier.Notify(rpcSub.ID, &log) // TODO(Alec) maybe you can send an error through here + } + // TODO(Alec) how can we break this loop when matchedLogs is empty to continue to next query? + case <-rpcSub.Err(): // client send an unsubscribe request + logsSub.Unsubscribe() + return + case <-notifier.Closed(): // connection dropped + logsSub.Unsubscribe() + return + } + } + } + }() + + return rpcSub, nil +} + // Logs creates a subscription that fires for all new log that match the given filter criteria. func (api *PublicFilterAPI) Logs(ctx context.Context, crit FilterCriteria) (*rpc.Subscription, error) { notifier, supported := rpc.NotifierFromContext(ctx) diff --git a/eth/filters/filter_system.go b/eth/filters/filter_system.go index 06bfdedaf0..fae133895e 100644 --- a/eth/filters/filter_system.go +++ b/eth/filters/filter_system.go @@ -184,6 +184,7 @@ func (es *EventSystem) subscribe(sub *subscription) *Subscription { return &Subscription{ID: sub.id, f: sub, es: es} } +// TODO(Alec) // SubscribeLogs creates a subscription that will write all logs matching the // given criteria to the given logs channel. Default value for the from and to // block is "latest". If the fromBlock > toBlock an error is returned. diff --git a/genesis.json b/genesis.json new file mode 100644 index 0000000000..3eed4f5bbb --- /dev/null +++ b/genesis.json @@ -0,0 +1,136 @@ +{ + "config": { + "chainId": 12345, + "homesteadBlock": 0, + "daoForkSupport": true, + "eip150Block": 0, + "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "eip155Block": 0, + "eip158Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 0, + "churritoBlock": 5, + "donutBlock": 10, + "espressoBlock": 15, + "gingerbreadBlock": 20, + "gingerbreadP2Block": 25, + "istanbul": { + "epoch": 17280, + "policy": 2, + "lookbackwindow": 12, + "blockperiod": 5, + "requesttimeout": 3000 + }, + "FullHeaderChainAvailable": false + }, + "timestamp": "0x5ea06a00", + "extraData": "0xecc833a7747eaa8327335e8e0c6b6d8aa3a38d0063591e43ce116ccf5c89753ef91f4df905559427f326ab753d62cdb55018c62e9ee7e671bbb121947eec94733d16b96c6fe877464630bb5be1e5c3f294f0d17b624521c0a599b063d73a73f9719307b48f94a7681958b7f07f4fb8bd5b0e075fb2aa2b021d5994ecc20b5f3d6cdf41fc12707ad7872ff64256e29794e5617da4dfa6ce4912f1d39889fe2dec2f7e66b39439ec4f2a82f9f0f39929415c65db9ea5df54e41d94341dec14b7a56c242ce9cf939815ec7bb11042449469901924e6c045a03cc163c6b8ae8af80fa1ee80940a6641d4736767d1f2bcf2450200ef384391b4419466bdb4d2ff2ee4c68517e6fcd25cc3034c86916094606311948f7426ddfd23c1521b15eddb52e83b29944cb90ebba92141ed3021f5dc4e6c8bb642095846948c6f9aad8281a21e7f6522602f2d6469c950e0bb942a1bff2452aca1ca5ffabbd34b2744109d11e4f594b4fa2d21b238e12ee4a863517cb5092f2330cb1b9442d441b6793e6162b979fbf6ad0af0063cbec96a94436d12f639a32509685080161ff0365fc15545f094e0c5f6172673ad70a76ff264cbc0df783930b47d9421245b0a2c3235f1108d1aa01ae376849d36e68494f27bb4eabc4400a1abe9d80d7537ab0ef1b058bf948440e805b89f48c932265e3c4ad033813669d87a942eb79345089ca6f703f3b3c4235315cbeaad6d3c943aa1fa695aa89958ebdb5346d6760b72250dc1d794173c75c8f1be201ce89cf426fe12c9997d7096269474288dbefa3a55986c039953b67139a466474fc49482f0e7879314516952f7961b15c63fc6b2734dfb9459f7b67e6beae0223ddc91eec010b670c553e8e094e10a8cc6c22cdc320c67bd600a1d8a0a46d7f40094e3020350aceea29b783e0c947ae001692b8f624894b952930a3656a9cbab21df5919f94c61a495bf79942289a63b4b4700eeeca35323ea51785f366dd705940223e40d1f93a6fe5bef63605992ada10740e13b940610b8b4e6f5c3241d53ed3374ddca8969cd053c9463b4b616c5345e3dcc9e21db69297e2129447f4e94c9a7781729f95b88239c3bfc91fb52f92b44a1169456259f876eb6a7264d9f1a59952baad599ff964094f139e74adec329e715ab49a68c5548a00e40cbc29433657019d60a0a41f1b9970bd4b28a3a83dbeafc940f5640bd556b0be19262d1817b213ddb3424d91d94ed8bf82d2e579ff6363aef139f8b147a0105f17e94d8c68ebecb6f074ac5c4fb66a690ac0ad38a5a3c94c6f916ad6e360651bb95f8e67c1c28805745d084943ed95d6d4ce36ea7b349cd401e324316d956331a944a03c4c2e101ac4612d89b79f61c9c5bdd51929d94dd0f3f7beb37fe9d4496f8098446b65ddfb1fa0294642cbe89a58909ba712dd11ed4c4b2359bd8c85d94ffbcf262c1d5c4392ef469ba79f2cd195d2affda9468e0104fd2b5a2c93e97c2ba172c4d2a4223f76f945cab520442de9babc290b25e5e2e6a1194ec670794bc6963fc0e2f5547ba949ed39e80b8388321104f9443882141555003b3e71110f567373b59ac4cb0bd9448cedc58b10af13d688631bc3cb78a05b8a6e56a9465698c9ec5af10345cd1e39472d60fb6133bad6f94d507309fd69635aa37810a65a4da27ec47a1ba0594c46dc0741ff61af883e284daea062ae7382e709194198958f0b860ab0e3937f468fe366aac9eebad2e940ec5a403212d732d8d7ced050e9510f6327453c694464cce7999b3d90a8f1ffaf94a71fbdea1e6543594097095b8cf5cabf0c39e548d8df55dd635d84d0794aa937da037e617e868795eac1dcd43c663014d3294f11073eb2d259b90a91954cae30d0e6e9ecc7f11945b55452bdba5971d606f47647bd383f3c3fa728594439d5e4d7578ecc9efa52a8cf1887b11fd0fb9009492f628b0157d47c992f5c69dbbd038b110e27826f918e2b86005f784c52234d0c40ab13b0636c5728217a8f3100046593c30271d39d59fcdb9a0053a874710e9c65e0d8a030c16a700b4ec430207cc5037c5e2698ef839fa0b7a4372f4b5217deda2a8df087e3b552f300016ce9147a2ff4db4c8a87d77b080b860d3f640c3da685893c41eb6301fdde2920c5a09296438abe5894074592f27547fb4ad02d222b1a330ff5aea065eff5200973d4fcb57808d8d9b09337e09aec279dc3337e758c51a3219596699006ee3683ff0c733f16eb917fad37f7f5d505201b86057b5158540d1672de49073e469e5426766094ce6514ac29580803ff9d22cdef3b6fed28a8ad9de63bf938c1c7b0e7a0156fb03f5363d09bf337713d8d45475df48ccea0fa793f591fbb62673545fc846c04e6aa9e2eaaab72c3b9ba4069ea280b860ca75a4c4e1f2898c0ae0ed53698b0271d1f8869ecd945891ae6a9b02682335af625c29f80572b440f91a3a343f3ea600a49a426960b6c1c5dd7b24540ecb745329312dfdd525fd173418c846f0096acba466a27446114f3a2b2a887986846b01b860b3dff5505fe9ec48fa11a67dbf166e7d5ab3473ff9f5fdc90c690eb1142ad687b17eb8ab0c08615c9397b351c53e79016d593d588f8c607b2d1136713d05066ffd8a30589357afa54a0a7ac8777372787261dde126c4f0c04bf741f809c3be80b860451da71ff5b1e9b4fd587fd76f53808191096cc5869596eda8f3ad697426a98a659f5f4818e57866d4b0dd90f0684900742a167b314f0276e5e6a8bc6f40ce1cd1d35c7f9be56f1240de596b30a4b40010dfd21b7fc9aef400faaa421e27a080b860277d5eedd8cf7d549296a6f8ad2869ec6e90183b9e8ebbf49a9d3ecd817757b50c6acc6cab9f0dbcf4b87251b6e82a0192a00c1e509225ec1ec08dcbeb04ba2808b16f72af90f33277e614dc19383256b3980421441ce3e75356ee35e5f62d80b86007431d3192f7a273382b645bc300cb0161c2395c005bf389698ce4a3ac56cffb9405456102f5b6e41b42bb28e7cb1f0141d3e1be1b066a94cc2befe88b0f5eef63c60a1ab8a1f0cc02e73c0ce5aac464332d3a2c1074a5126807a75323280301b8600d39e1cd00ff4ce5e41fa9ea90526f3e3540b64ba52954e5682f31ec20360b2995d5caac7cee778ff7c13aaca74b9b004032f87a331867e9ebc7ed06c5b77707c88614714f2e0ed30c85c519aa823aa9d1a7a56766a294c7802aad300b408280b860ce9efb226a3c085071c7aea84f66040dc16a1600893eb1e6ef507fa72c6684f24d2c3b4ffee9881142fc41cfbd6b3b01933838ed7bd05c16450cab703b12ee623f8745f7f618981601a9c4de1337fe881975bc8572536281b9dcc51400177680b860075724b0f2fa9ced3440a76107a53b02a0b8b5a5a510d94b02b5c0696db96910204d54ee3138b3e5949464585d98de00a2964d480ca31adf09c962802895ea160d195bce583e59094bf7c11d33eaffef12cb999284bcf842bbab2c87647d8801b8603b0ffa0a101f959879b7e14d830862981d6c311ffd440f214eee0a2891743a25355e9230266aeadbd20f3bde0ccb30008bf326df8fba9b701d4764ad49663da19417132edf4281df4560715649491d9794dc64e9540d16b51b362e139c3aa701b8601a65e75f0f47d7c92da92de15372a0052338b952cc1307d5ee1596a670fedeb3b5ac8bc690f3f5e5f34fb8d18a5441011d6023e3c2b343bffc655972102a7181dffcab47bd0a2d6d46eedc6f2b70cd64025715de2b8ae23c032e61b380663c80b86071ca0f2be942a733074e8e0d92ae0adc2617bcfe503b97f8339c8f1c498d85608fa5966da7abdd9651c9ce4e3411e900c4d65d5c7d858f1e5ee212c9e543d3727aeaa9abbdcb68848e7c990c06aa70a4bf2585959943935549e7a9e2c2ba0d80b8600122d3f6ae5e2bc6fdee3cd35a3522ea519bfa6f365451fa275c4688bcfb5cec418fa053a8859981e973ea273ca68f014e840d0ccf18cc7c498742103c3116732ef197a9f90f50bf64f83754a86ad441fe9691bfdf384a1aaacf38430a2b1001b8601135b86a2587c75c55db8274e498bd3f2887a1a455a665b8314655124c5e8197d3ef892f3dea2bd80b047530f837ae00dc263da929f0135a4f8ee73d47d5c2ffcaaa7b1e3a9cc59e496feeea2323e5eb16c9de2e3b973c35c0a82ca587477201b860e162bf706b79405326d52e29e2ea247a55ebf69ac34900e4e1249c3fe28fd3dabf40d7022f57bc7b16bedbc78bb49000ba7cd92e123b69309a0572cf49b1bdf4c5525ba656decffa5da91ed4fb565d384979e9a58f72986b654908bcc7308580b860e9dbc5c1d073954ad6ace9afb19d8679e8c87fd12cd1356999a8e167390f3de966f3485b500c40c61f829e12f56512001b4d4c4fcb19737735eba15d24d43231ce64cf348de3765fdbd01f4612af6ad7ebf9fafb594ade18a7717c189e9c2080b860bd8e3d6ad24e5a7e4f084b3142c6bebe26d248e09363a9bbfc9cd07ed59a65bc140a39564f6ecdf287c2ee1ed57a930035a92306b6d5925af8785c813bad6113ba42da88d3c0586e438df75bee506bdf9f10c927493524897ba485946f976f00b86030feb59a6804a2df697b3a40c691f176575ffb0d09fa167a59642d041dfec97e97414ea7abc8bc7bdad5f1a684e2bc00fb2c01bc03aa9e8caaaa82ca3210de31f9c7abff6baba5e08e2dbdfa85953ac39bf3b895627e7be493fbb6e346061400b860f24f6f1e6423fd83d1ef275484a5950fed90794d7bfb6224de768bf716646dee263de0d9ed4c681c0def78d16df0f000f1e17b8657f1d8e30dcb7e94cd1c79b9c82d8f04252b078ccf3719c7658dd82b9d93e02671925b5aeb4ae38163129100b860f6a586f1ceb85a23980bdfea738678f5906de5303a7ff6ceb3ad675f93a84fcc502275fd7bd8fde4de89fd381cb8eb000b3d496e248208d00eae4f421ce041d73789e794a372ca788655eb5413c3b7cab1c993e47ff6c568ca4da484bac88b80b86086ab977d6064531b136aba2fbcc50cfb332b939e0af22c7ff3800c804b33aad998ef69a97204076028a6946d627d2f0086992cba351fd538a91986253884325aba6d66ec1ac10eb8e18330180820cc388c22de7d64f9f0592b74ee5b35745a80b860fda02a60f25f87c0fc86be0bf52bf1d0be37db80661a2fa35c7f52a4c5f5edccca04768c762caaa2303f8cac2ba93e016dce7c8382e3d002e751e0bf33563eb8f6e7937ab2998300e96f5ed3d857d081ff389c495febaabe836a7cd06012ae80b8609271a103e5971edd694b3c6363a2517b0676849b05660094baf240ea9677e171169a8eebed5ad6000871b4f42d4ca701b74b10f91c0de059d225ced0222e391cf7bdb5934d1677193837d5a1f17bb710f4747956d819db51c817cbba53324b81b860719b2de30cbcdee6e62445b7c2eedb63520beb4cb6e4a55f7e121a5bc6a1143e1322d3ffea28ab624d30f6da8962b8003eeb056df8e46a49035c0aaf139a372e954d8ebc3cbd2d0b2e5727d54f3f4fcd0e95dc29bfa9f9ddcda98bbe8107ae00b860b054d545899f55cbb84853125d50ed06211ace3eeb6160a85583de508569e65592f5a221a000cb99997c0dd2738527010f2b1e83eeb7ca41c40ad9295b35f1172004a63567f140c1d2b0e04338161e8f1be88c1543ac75d587e42c3ed7dc1880b860e8de954d3100b125b2a3c1e4a81e3ac5f4b38f85c2ed91d752c507d4a37c338ca215e474a48511c599407b85c01d37012cd5012c74c5c0c3f88b4480a73bb52d1ff49848ca014f54cde1a891e6efa483b5f64016a9303515806c45d9f79a7e81b860bfce6153e2c2dabc724d9ccf5cad8916753dce1a495a29053ff7e5b74b0eace4889d5fd2d5859400d82b6bf29cecc9006b6e37152cb1f4f72e7d0c0897439f4ef886e26b4345d2f3e73bcf08d47f02c02976730620d7f844313c099894176980b860d56a6034613c0db14cad99e0d2dc3a2482ff8167a032218ac10508bb04fb8ef91d40a6ef0731f1e162761f09be237800363199f518a1bad98f9f2d179d2028137f9a86588c5cd91534a53d4edcc718b40aab61343571636d052eb7b288578c80b86025138a99de6619b2ad03707f847ac0f5d79b0fba2c67a02f5430a57c7a651d6cd63988cb91aa331acd8b7221a41fc4007be73ad86365de5029c22186d2c90a864fd3d386cc074b25f33b4e5f17839d2780b62390f1fe63ec690c1022c039f500b860c1e12e9c0b26d73c27dd5f60f08aa15c952afaa395dbc8b4cb99453bbf3f14ede8a9fc579f64500497344cb3637aa900ac8618d237580558d9ab5b042ac411fd121713744378c9f4d897907f09a71af9331bfecb3853e3f0577be558c9019881b860c8e6cf45b640fa91385b4f7e891fe68e5ef6847d032d6ee1b52eef0ff577ad796b881537f94adcbd1b52ba3e0e5d7e014e97406029095598a373fd6d9b6c7754aa87b87560e363faee89c11482cae4a063d7cbe65747f2b095cd2f6688a8bd00b86008fb22b9fe04caf62059216dfa1d2274ade1df9e8dc0b3c37c2f04a8b3d30a73f8b7ddd873d08c9b9302b936d303380147ce0e19c4600b780a1814730462147fb8280fbd7fe0aa7290d325a2b7b5092e05c037664a0aaea127b0d95fd13e3d81b86068dd5abe43baf4f4817a49b094c0bb19ed4971c49a6f91863163f655b6f312d80b7c7843b4cb7a27f7e54d48c41c7a01c5e22e1b0e38a5dbb03dfee76076a9af56146359add6003410005332417f6b65db718acce693cfa21a8fd92f6ad72800b86091785b64cfd3ac6025b6b536499ac63868344b8f86660ed73b574b000477807d53dacf1d9da258ee1b113485a01579001c5a510dd3b3c5ff1f417c4d97faf997aecedf7602bd96155f8396f5c9fa53d2c601b0de0241fff49939b8a97ce59f81b86000d869e78871139e8a5ff6d590593d94ea39ea73e87ac8d901f0f524372b93752a488b34e05afe05ab53b1c1b5b9a50040341dc01361110551358c9e982f30755e19ec2ad1c1a40afba9998f763599149b976caaded14c1793fe8c469b17c900b860e87f2bfc49c076239d7522280098c9c4808524c67f3891608c42a510340d64c7e3c1c074c34050007837c13536ee4001108efc87fb2eb8c3236a738122ec086a7b8e6857e82454ff6284a81bf0362424ba96be762d4c06e6aa1b59f20c870780b8608bd2cb218f465c82702aba73a061227cd83dd8e3115ae592811a4d9a8236e3cb99cfe81b2e22e3620635d42f63b7db00cd546bdf9fad7b49d0b4686962c8e0f4544c8df9f41d30d7d489c86745ef9b61a7dfb498f7554eeaf7e24654e5b2e080b8602a5d5145b7a8100575e96cadf2513e7e64dc1354bd891a24f985c2574c9f5f136c6837eab290543d769227785520970133022637837b6e711918f3d2e98291bf3b518247b54e925a0cd080d517731b2725be888fca298ae9ec6f5d2c19146b01b8609cedde7d49e2e115896b789ece09a4e8816fae153de891774f0f716a3088e01754498f8ab82d3a4ef5d53dbe17338f0089d1de1eb60bfe3ec2b9701cd882b1c174bdcfaac2225f57481676bd3ee845825be823b9f9317e407b015159b9ce7e80b8609124b91b223bf9bcb33f75ab8fad0180fdc57536d34349945b80458abc8e59cb06005fabea656b2cd0dc74c0d06160019706965ec3ee0d3b9dd76eb9d39158bd512fe7384bb9e139bc6391d5f7b969397bd85a91bb91670880d861e8fcbd0700b860338fa194daae9ba1245931653fa349ce85d37e2f42f871c6b67397401e190b497d15ff23e8f6e9d8637f84fc2dd4640066fee692f5d38208233e7570c3ed49a4ba032d79c7a974883fa5b5c2a113259b924a346bc4edaf717b3d272ceb152980b8606150a62f3bae3a35a639d66dc37ffbc979dda85d6f5c278a5e3a563ed865018c86563be9b878261ef8d34edd3c313500a4f170e22f386674d538b9e15930f39216a38c2a0b60380a140e5897f42d37077784cd0f1a93746e4da42a5da8de1081b8605fd1581e41fa22e7ea0d3ee0674e80e2168fdb42c1aaa3eb8aa395fdde11de5ca98ee71c50b365ef6ad9850bacf7ab011eb446da79efba3ae91fe1f7d9274dacda39b0b3bfaec7d7904eac59d72683c52b6ea091ca1374d8b744fd1d595c5700b860e04a671c7f9af919093a9c7aaf5c3d04eff31189d65f5a2aef8a08119ed1c150464c40085bfe2fc1b598fc2ebb095101d0103b995e3a762a9063d823ef6686422caa5a390f9cef5ee6c4b911fd2a818f43fa47ab4d21b01cc7b071b517438d81b86014cfe4d455820e0b9189ccb32b565b90d414ed7d315d3e61141f085b6aaea34b0c90d1f502f544408e7ed0573e1d1701d38063b239cf847018daa41b7ef75b4458d2fa23e459e9e8039668aca6bc70df1051a6466a5a5bc636e68bc8e2380a80b86045bab7cfb2814e1e3e1a40779219bb48c5d51419ce4c27359d0dfea9fbf1d193ca1cf07934ebf3d6699093387d0e0f000dc5fd2058e7ac50e67c26e5172567c2e7ba9fefa6376e44de800c8955cb330df27476d8ba9c8ec06bba46fddeb95e81b860a9fc64c64c039cbd8b23c10c706e51e0013289201111cf8c50e22781161df397fa9c1b91dbab44969aa4f8819f222e01bab90190bebfaecff7076de325dae8080bfe921fbb4ca474d45126fe5ae699dadea98a5255c048b955ab9ba1de8f4c01b860aa5729ac27a01f26924e863eea7d7b49e4f8ccb15c758ea5ac4d19691a8df31f70138e7f3011fc1e53d52d7063dd8d01a9b3800a66914956769a13ff8d7960725bf1b9073052f3ff85e57b34165702baede05d4e807bfb565a38c24e3542c780b86014dafe41c0d96b22188f0cf6cb99274e09d8ed0546bb57b28a3590449726aedf809c049663a2fe4e40b91830ac864d006a9c5b41cbddeabeef99cfddf6c298de0d482b6e945993241d8987f7fac004fe159f2206060b69d1f8f7f67f63f26280b860878790bb38b1d31707aa37b5af439d64d4a29ea64418b7c01139a26e4f297da6c61a806361e6fee8e40556500c8a6000183b2a42c54d714a143fe12492081f373e3e27e3921adeb276a8daac8b87a534c0fa1d45195d8a35cbda27f883128680b8607983d25868e1915ca8c20603bb70475b398acb04fef221106475f0fc25a3df25d181050214da347bfcd8f8292e5257014ba77cf67ee5f42202257317808f126930b4eaaf4bec801c4465ced54bd78331f8d3dadfdf2f91de294836c13e946001b860c700f20fab4ebb8ba2f47adf177e3a9dbbfb8d999acbaf0055cc540758f8c00c4564813d910e7be02e4ceaa97fb88000b3e8e6fb4308fb943fa0a3d8ee32c3a16e67eae0817370de54bec1e13193cc845cedb70e48171e097550475684cc6600b8603a3857a5e4a709e1891a13797d55c1698f931755492099926314feec955da31fcea8a8c8e52ce2efd74008f32dbc1c00c1b3d36c1f3097d806f1687eff4a979ff967a8233f923a1af6a3104c12d9d44388bece91a248bd86f253e709cea7a380b860d8704fbf6968ffd9f39f78173726dfebbaaffebd8a33dfe29a72b9a64204debf2016ca94cbecb1b84cab9d5cc168f70082530b8cfab0225a37c8cc3044c288ab0fea2f484b56a33fe6c92d6c50f254e6b1689ac6bb1429cc36a0a7dfa85cf880b86089bc906b5ea07752b1981558fd5d329f6d428bc14dfde022745303eae0077612b9c473cd66e4d91778282ec98bbd74001b61cd71448750df642fb580ce81a62ff2f5ab4378528ccd65acff67ac2175678f598529c768247c77938ca2d529aa01b860fb9de050c059a11175be23daeef1bfc374a688d8fd776e7d2dc81fe301068a3af03ad522bd915a154dc8b5b8e12d38003f17bf9f3001e8bc682e38cfc93c6901417afe1ddbfe11b04f42ca4f321f7ba73fa98f0e8c8d75781b14c0dea847a500b860bef17561ef747e0f11fd339987a9813fa8ac1cbbd6457ab8fae4841f2217de019de7caf421631372b7eec730d9210d0128e6c560948c19ab6141d6699e0283a5b98abb8266d731f2b6435a07b44360a3f5622cff59103ec95938ab74fe1d8f01b860a47fd022dda04d8dd36e0a8127be68736e47e490b946d2d88a9fdcca0a5114a930db2319e7e9f378d1b81da865d38b01a063e9994e620483b08047da39ee2fba35f66df5734e1545d297be0225ddfda34e494c1f09825eed303d166a8b702f01b8605966b41d69c0e94e202f65823338c3ee0357b024a6ef625765bcf3c20e1786258a18221e0b9a34b43380e06984d92f0183d0f86d0dfe0cac237ee38b28876dada3ae9d1a7c1e6627c3b524d0e5d4270bbe159661622821412b3c1162881ead80b8608fad3c2111494834f30e6d8a3368f2aa156c991fa4b9d55c31da88310a61248305697ad5e885404bc474419383de4f006c89c84955321716f6ceb4d5db433fcabe843d566a5e9526d29c58b38fda9ff2a13f7841f25cda8ff091c965bdf91780b8607f9df4fdb96e20e0a480a62c48896646d96982d7fccccdf70c61f2f52ab4ea2901b5ef468203f39d9d8325843ada0d00e9562c64f79ec16d69b5921ad36306ae9ae2ab97806b354af8cb63722a96aed5fa0542fff58d2e41f6aee3cb641f7781b8609cc39207797e5c37f6336c4444cf275d0afd43a9b257a08086f15867886833744c9b5753fcff76fce3790d7f25a45e004af9831464bf43e39634ecfce8da4641da78ad4ba20e540c007dbc19e391ae69cfb7809b2d20627d553a16d7d71b5a80b860e6631bd0b82c41327b582d7b239c9893cd1162cae05f360d8808700b38ee0ee965e9bd9246d79e00c234c87aa7699800c73428f7eccd77337bf79bf6b43f48345be265c38d128d2cd7f37167cadb3565d66e6a7f67b12f4bed63e5d50748010080b8410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f86480b86000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080f86480b86000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "000000000000000000000000000000000000ce10": { + "code": "0x60806040526004361061004a5760003560e01c806303386ba3146101e757806342404e0714610280578063bb913f41146102d7578063d29d44ee14610328578063f7e6af8014610379575b6000600160405180807f656970313936372e70726f78792e696d706c656d656e746174696f6e00000000815250601c019050604051809103902060001c0360001b9050600081549050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610136576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20496d706c656d656e746174696f6e20736574000000000000000000000081525060200191505060405180910390fd5b61013f816103d0565b6101b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f496e76616c696420636f6e74726163742061646472657373000000000000000081525060200191505060405180910390fd5b60405136810160405236600082376000803683855af43d604051818101604052816000823e82600081146101e3578282f35b8282fd5b61027e600480360360408110156101fd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561023a57600080fd5b82018360208201111561024c57600080fd5b8035906020019184600183028401116401000000008311171561026e57600080fd5b909192939192939050505061041b565b005b34801561028c57600080fd5b506102956105c1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156102e357600080fd5b50610326600480360360208110156102fa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061060d565b005b34801561033457600080fd5b506103776004803603602081101561034b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506107bd565b005b34801561038557600080fd5b5061038e610871565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f915080821415801561041257506000801b8214155b92505050919050565b610423610871565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f73656e64657220776173206e6f74206f776e657200000000000000000000000081525060200191505060405180910390fd5b6104cc8361060d565b600060608473ffffffffffffffffffffffffffffffffffffffff168484604051808383808284378083019250505092505050600060405180830381855af49150503d8060008114610539576040519150601f19603f3d011682016040523d82523d6000602084013e61053e565b606091505b508092508193505050816105ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f696e697469616c697a6174696f6e2063616c6c6261636b206661696c6564000081525060200191505060405180910390fd5b5050505050565b600080600160405180807f656970313936372e70726f78792e696d706c656d656e746174696f6e00000000815250601c019050604051809103902060001c0360001b9050805491505090565b610615610871565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f73656e64657220776173206e6f74206f776e657200000000000000000000000081525060200191505060405180910390fd5b6000600160405180807f656970313936372e70726f78792e696d706c656d656e746174696f6e00000000815250601c019050604051809103902060001c0360001b9050610701826103d0565b610773576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f496e76616c696420636f6e74726163742061646472657373000000000000000081525060200191505060405180910390fd5b8181558173ffffffffffffffffffffffffffffffffffffffff167fab64f92ab780ecbf4f3866f57cee465ff36c89450dcce20237ca7a8d81fb7d1360405160405180910390a25050565b6107c5610871565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610865576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f73656e64657220776173206e6f74206f776e657200000000000000000000000081525060200191505060405180910390fd5b61086e816108bd565b50565b600080600160405180807f656970313936372e70726f78792e61646d696e000000000000000000000000008152506013019050604051809103902060001c0360001b9050805491505090565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610960576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f6f776e65722063616e6e6f74206265203000000000000000000000000000000081525060200191505060405180910390fd5b6000600160405180807f656970313936372e70726f78792e61646d696e000000000000000000000000008152506013019050604051809103902060001c0360001b90508181558173ffffffffffffffffffffffffffffffffffffffff167f50146d0e3c60aa1d17a70635b05494f864e86144a2201275021014fbf08bafe260405160405180910390a2505056fea165627a7a723058206808dd43e7d765afca53fe439122bc5eac16d708ce7d463451be5042426f101f0029", + "storage": { + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000e23a4c6615669526ab58e9c37088bee4ed2b2dee" + }, + "balance": "0x0" + }, + "08960ce6b58be32fbc6ac1489d04364b4f7dc216": { + "balance": "0x108b2a2c28029094000000" + }, + "11901cf7eeae1e2644995fb2e47ce46bc7f33246": { + "balance": "0x6342fd08f00f6378000000" + }, + "19992ae48914a178bf138665cffdd8cd79b99513": { + "balance": "0x108b2a2c28029094000000" + }, + "1b6c64779f42ba6b54c853ab70171acd81b072f7": { + "balance": "0x1090756cd9fae351a00000" + }, + "3fa7c646599f3174380bd9a7b6efcde90b5d129d": { + "balance": "0xbe4064fbcc1d7ea600000" + }, + "417fe63186c388812e342c85ff87187dc584c630": { + "balance": "0x108b2d889442131e380000" + }, + "5f857c501b73ddfa804234f1f1418d6f75554076": { + "balance": "0x108b2a2c28029094000000" + }, + "743d80810fe10c5c3346d2940997cc9647035b13": { + "balance": "0x10f7dd69f30a0c3e680000" + }, + "75bb69c002c43f5a26a2a620518775795fd45ecf": { + "balance": "0x108b2a2c28029094000000" + }, + "77b68b2e7091d4f242a8af89f200af941433c6d8": { + "balance": "0x108b2a2c28029094000000" + }, + "7cf091c954ed7e9304452d31fd59999505ddcb7a": { + "balance": "0xbe4064fbcc1d7ea600000" + }, + "7fa26b50b3e9a2ec8ad1850a4c4fbbf94d806e95": { + "balance": "0x108b2a2c28029094000000" + }, + "8a07541c2ef161f4e3f8de7c7894718da26626b2": { + "balance": "0x947a63b5af6606e0b5555" + }, + "8d485780e84e23437f8f6938d96b964645529127": { + "balance": "0x108b2a2c28029094000000" + }, + "8e1c4355307f1a59e7ed4ae057c51368b9338c38": { + "balance": "0x60816047841bb53f00000" + }, + "9033ff75af27222c8f36a148800c7331581933f3": { + "balance": "0x947a63b5af6606e0b5555" + }, + "989e1a3b344a43911e02ccc609d469fbc15ab1f1": { + "balance": "0xbe4064fbcc1d7ea600000" + }, + "a5d2944c32a8d7b284ff0b84c20fdcc46937cf64": { + "balance": "0xbe4064fbcc1d7ea600000" + }, + "a5d40d93b01afbafec84e20018aff427628f645e": { + "balance": "0x108b2a2c28029094000000" + }, + "aa9064f57f8d7de4b3e08c35561e21afd6341390": { + "balance": "0x108b2a2c28029094000000" + }, + "ae1d640648009dbe0aa4485d3bfbb68c37710924": { + "balance": "0x1090756cd9fae351a00000" + }, + "b2fe7afe178335cec3564d7671eebd7634c626b0": { + "balance": "0x947a63b5af6606e0b5555" + }, + "b80d1e7f9cebe4b5e1b1acf037d3a44871105041": { + "balance": "0x7eceeefd263869beb5557" + }, + "c1cda18694f5b86cfb80c1b4f8cc046b0d7e6326": { + "balance": "0x108b2a2c28029094000000" + }, + "c471776ea02705004c451959129bf09423b56526": { + "balance": "0x947a63b5af6606e0b5555" + }, + "de22679dca843b424fd0bbd70a22d5f5a4b94fe4": { + "balance": "0x86fefddedc1b15e780000" + }, + "e23a4c6615669526ab58e9c37088bee4ed2b2dee": { + "balance": "0x43c33c1937564800000" + }, + "ef283eca68de87e051d427b4be152a7403110647": { + "balance": "0xbe4064fbcc1d7ea600000" + }, + "f5720c180a6fa14ecce82fb1bb060a39e93a263c": { + "balance": "0x18d0c290c78ca7c0d40000" + }, + "f8ed78a113cd2a34df451ba3d540ffae66829aa0": { + "balance": "0x947a63b5af6606e0b5555" + }, + "fc89c17525f08f2bc9ba8cb77bcf05055b1f7059": { + "balance": "0xbe4064fbcc1d7ea600000" + } + }, + "number": "0x0", + "gasUsed": "0x0", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000" + } \ No newline at end of file diff --git a/rpc/handler.go b/rpc/handler.go index 23bcb1a694..7d316c8b4d 100644 --- a/rpc/handler.go +++ b/rpc/handler.go @@ -316,6 +316,7 @@ func (h *handler) handleCallMsg(ctx *callProc, msg *jsonrpcMessage) *jsonrpcMess // handleCall processes method calls. func (h *handler) handleCall(cp *callProc, msg *jsonrpcMessage) *jsonrpcMessage { + // TODO(Alec) line between two wordls if msg.isSubscribe() { return h.handleSubscribe(cp, msg) } diff --git a/rpc/service.go b/rpc/service.go index c29b1dae55..bf51041b78 100644 --- a/rpc/service.go +++ b/rpc/service.go @@ -59,7 +59,7 @@ type callback struct { } func (r *serviceRegistry) registerName(name string, rcvr interface{}) error { - rcvrVal := reflect.ValueOf(rcvr) + rcvrVal := reflect.ValueOf(rcvr) // 1 if name == "" { return fmt.Errorf("no service name for type %s", rcvrVal.Type().String()) } @@ -180,6 +180,7 @@ func (c *callback) makeArgTypes() { } } +// TODO(Alec) This is where RPC method is actually called // call invokes the callback. func (c *callback) call(ctx context.Context, method string, args []reflect.Value) (res interface{}, errRes error) { // Create the argument slice.